Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e9827d9b
Commit
e9827d9b
authored
Dec 11, 2013
by
Stephen Warren
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag 'clk-tegra-for-3.14' into for-3.14/dmas-resets-rework
Tegra clk branch for 3.14
parents
f229a930
62ce7cd6
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
5091 additions
and
3013 deletions
+5091
-3013
Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt
...ntation/devicetree/bindings/clock/nvidia,tegra124-car.txt
+59
-0
drivers/clk/tegra/Makefile
drivers/clk/tegra/Makefile
+6
-1
drivers/clk/tegra/clk-id.h
drivers/clk/tegra/clk-id.h
+235
-0
drivers/clk/tegra/clk-periph-gate.c
drivers/clk/tegra/clk-periph-gate.c
+6
-2
drivers/clk/tegra/clk-periph.c
drivers/clk/tegra/clk-periph.c
+28
-4
drivers/clk/tegra/clk-pll.c
drivers/clk/tegra/clk-pll.c
+311
-96
drivers/clk/tegra/clk-tegra-audio.c
drivers/clk/tegra/clk-tegra-audio.c
+215
-0
drivers/clk/tegra/clk-tegra-fixed.c
drivers/clk/tegra/clk-tegra-fixed.c
+111
-0
drivers/clk/tegra/clk-tegra-periph.c
drivers/clk/tegra/clk-tegra-periph.c
+674
-0
drivers/clk/tegra/clk-tegra-pmc.c
drivers/clk/tegra/clk-tegra-pmc.c
+132
-0
drivers/clk/tegra/clk-tegra-super-gen4.c
drivers/clk/tegra/clk-tegra-super-gen4.c
+149
-0
drivers/clk/tegra/clk-tegra114.c
drivers/clk/tegra/clk-tegra114.c
+380
-1307
drivers/clk/tegra/clk-tegra124.c
drivers/clk/tegra/clk-tegra124.c
+1424
-0
drivers/clk/tegra/clk-tegra20.c
drivers/clk/tegra/clk-tegra20.c
+304
-514
drivers/clk/tegra/clk-tegra30.c
drivers/clk/tegra/clk-tegra30.c
+462
-1044
drivers/clk/tegra/clk.c
drivers/clk/tegra/clk.c
+166
-0
drivers/clk/tegra/clk.h
drivers/clk/tegra/clk.h
+75
-40
include/dt-bindings/clock/tegra114-car.h
include/dt-bindings/clock/tegra114-car.h
+4
-4
include/dt-bindings/clock/tegra124-car.h
include/dt-bindings/clock/tegra124-car.h
+341
-0
include/dt-bindings/clock/tegra30-car.h
include/dt-bindings/clock/tegra30-car.h
+9
-1
No files found.
Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt
0 → 100644
View file @
e9827d9b
NVIDIA Tegra124 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,tegra124-car"
- reg : Should contain CAR registers location and length
- clocks : Should contain phandle and clock specifiers for two clocks:
the 32 KHz "32k_in", and the board-specific oscillator "osc".
- #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/tegra124-car.h>.
Example SoC include file:
/ {
tegra_car: clock {
compatible = "nvidia,tegra124-car";
reg = <0x60006000 0x1000>;
#clock-cells = <1>;
};
usb@c5004000 {
clocks = <&tegra_car TEGRA124_CLK_USB2>;
};
};
Example board file:
/ {
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
osc: clock@0 {
compatible = "fixed-clock";
reg = <0>;
#clock-cells = <0>;
clock-frequency = <112400000>;
};
clk_32k: clock@1 {
compatible = "fixed-clock";
reg = <1>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
&tegra_car {
clocks = <&clk_32k> <&osc>;
};
};
drivers/clk/tegra/Makefile
View file @
e9827d9b
...
...
@@ -6,7 +6,12 @@ obj-y += clk-periph-gate.o
obj-y
+=
clk-pll.o
obj-y
+=
clk-pll-out.o
obj-y
+=
clk-super.o
obj-y
+=
clk-tegra-audio.o
obj-y
+=
clk-tegra-periph.o
obj-y
+=
clk-tegra-pmc.o
obj-y
+=
clk-tegra-fixed.o
obj-y
+=
clk-tegra-super-gen4.o
obj-$(CONFIG_ARCH_TEGRA_2x_SOC)
+=
clk-tegra20.o
obj-$(CONFIG_ARCH_TEGRA_3x_SOC)
+=
clk-tegra30.o
obj-$(CONFIG_ARCH_TEGRA_114_SOC)
+=
clk-tegra114.o
obj-$(CONFIG_ARCH_TEGRA_124_SOC)
+=
clk-tegra124.o
drivers/clk/tegra/clk-id.h
0 → 100644
View file @
e9827d9b
/*
* This header provides IDs for clocks common between several Tegra SoCs
*/
#ifndef _TEGRA_CLK_ID_H
#define _TEGRA_CLK_ID_H
enum
clk_id
{
tegra_clk_actmon
,
tegra_clk_adx
,
tegra_clk_adx1
,
tegra_clk_afi
,
tegra_clk_amx
,
tegra_clk_amx1
,
tegra_clk_apbdma
,
tegra_clk_apbif
,
tegra_clk_audio0
,
tegra_clk_audio0_2x
,
tegra_clk_audio0_mux
,
tegra_clk_audio1
,
tegra_clk_audio1_2x
,
tegra_clk_audio1_mux
,
tegra_clk_audio2
,
tegra_clk_audio2_2x
,
tegra_clk_audio2_mux
,
tegra_clk_audio3
,
tegra_clk_audio3_2x
,
tegra_clk_audio3_mux
,
tegra_clk_audio4
,
tegra_clk_audio4_2x
,
tegra_clk_audio4_mux
,
tegra_clk_blink
,
tegra_clk_bsea
,
tegra_clk_bsev
,
tegra_clk_cclk_g
,
tegra_clk_cclk_lp
,
tegra_clk_cilab
,
tegra_clk_cilcd
,
tegra_clk_cile
,
tegra_clk_clk_32k
,
tegra_clk_clk72Mhz
,
tegra_clk_clk_m
,
tegra_clk_clk_m_div2
,
tegra_clk_clk_m_div4
,
tegra_clk_clk_out_1
,
tegra_clk_clk_out_1_mux
,
tegra_clk_clk_out_2
,
tegra_clk_clk_out_2_mux
,
tegra_clk_clk_out_3
,
tegra_clk_clk_out_3_mux
,
tegra_clk_cml0
,
tegra_clk_cml1
,
tegra_clk_csi
,
tegra_clk_csite
,
tegra_clk_csus
,
tegra_clk_cve
,
tegra_clk_dam0
,
tegra_clk_dam1
,
tegra_clk_dam2
,
tegra_clk_d_audio
,
tegra_clk_dds
,
tegra_clk_dfll_ref
,
tegra_clk_dfll_soc
,
tegra_clk_disp1
,
tegra_clk_disp2
,
tegra_clk_dp2
,
tegra_clk_dpaux
,
tegra_clk_dsia
,
tegra_clk_dsialp
,
tegra_clk_dsia_mux
,
tegra_clk_dsib
,
tegra_clk_dsiblp
,
tegra_clk_dsib_mux
,
tegra_clk_dtv
,
tegra_clk_emc
,
tegra_clk_entropy
,
tegra_clk_epp
,
tegra_clk_epp_8
,
tegra_clk_extern1
,
tegra_clk_extern2
,
tegra_clk_extern3
,
tegra_clk_fuse
,
tegra_clk_fuse_burn
,
tegra_clk_gpu
,
tegra_clk_gr2d
,
tegra_clk_gr2d_8
,
tegra_clk_gr3d
,
tegra_clk_gr3d_8
,
tegra_clk_hclk
,
tegra_clk_hda
,
tegra_clk_hda2codec_2x
,
tegra_clk_hda2hdmi
,
tegra_clk_hdmi
,
tegra_clk_hdmi_audio
,
tegra_clk_host1x
,
tegra_clk_host1x_8
,
tegra_clk_i2c1
,
tegra_clk_i2c2
,
tegra_clk_i2c3
,
tegra_clk_i2c4
,
tegra_clk_i2c5
,
tegra_clk_i2c6
,
tegra_clk_i2cslow
,
tegra_clk_i2s0
,
tegra_clk_i2s0_sync
,
tegra_clk_i2s1
,
tegra_clk_i2s1_sync
,
tegra_clk_i2s2
,
tegra_clk_i2s2_sync
,
tegra_clk_i2s3
,
tegra_clk_i2s3_sync
,
tegra_clk_i2s4
,
tegra_clk_i2s4_sync
,
tegra_clk_isp
,
tegra_clk_isp_8
,
tegra_clk_ispb
,
tegra_clk_kbc
,
tegra_clk_kfuse
,
tegra_clk_la
,
tegra_clk_mipi
,
tegra_clk_mipi_cal
,
tegra_clk_mpe
,
tegra_clk_mselect
,
tegra_clk_msenc
,
tegra_clk_ndflash
,
tegra_clk_ndflash_8
,
tegra_clk_ndspeed
,
tegra_clk_ndspeed_8
,
tegra_clk_nor
,
tegra_clk_owr
,
tegra_clk_pcie
,
tegra_clk_pclk
,
tegra_clk_pll_a
,
tegra_clk_pll_a_out0
,
tegra_clk_pll_c
,
tegra_clk_pll_c2
,
tegra_clk_pll_c3
,
tegra_clk_pll_c4
,
tegra_clk_pll_c_out1
,
tegra_clk_pll_d
,
tegra_clk_pll_d2
,
tegra_clk_pll_d2_out0
,
tegra_clk_pll_d_out0
,
tegra_clk_pll_dp
,
tegra_clk_pll_e_out0
,
tegra_clk_pll_m
,
tegra_clk_pll_m_out1
,
tegra_clk_pll_p
,
tegra_clk_pll_p_out1
,
tegra_clk_pll_p_out2
,
tegra_clk_pll_p_out2_int
,
tegra_clk_pll_p_out3
,
tegra_clk_pll_p_out4
,
tegra_clk_pll_p_out5
,
tegra_clk_pll_ref
,
tegra_clk_pll_re_out
,
tegra_clk_pll_re_vco
,
tegra_clk_pll_u
,
tegra_clk_pll_u_12m
,
tegra_clk_pll_u_480m
,
tegra_clk_pll_u_48m
,
tegra_clk_pll_u_60m
,
tegra_clk_pll_x
,
tegra_clk_pll_x_out0
,
tegra_clk_pwm
,
tegra_clk_rtc
,
tegra_clk_sata
,
tegra_clk_sata_cold
,
tegra_clk_sata_oob
,
tegra_clk_sbc1
,
tegra_clk_sbc1_8
,
tegra_clk_sbc2
,
tegra_clk_sbc2_8
,
tegra_clk_sbc3
,
tegra_clk_sbc3_8
,
tegra_clk_sbc4
,
tegra_clk_sbc4_8
,
tegra_clk_sbc5
,
tegra_clk_sbc5_8
,
tegra_clk_sbc6
,
tegra_clk_sbc6_8
,
tegra_clk_sclk
,
tegra_clk_sdmmc1
,
tegra_clk_sdmmc2
,
tegra_clk_sdmmc3
,
tegra_clk_sdmmc4
,
tegra_clk_se
,
tegra_clk_soc_therm
,
tegra_clk_sor0
,
tegra_clk_sor0_lvds
,
tegra_clk_spdif
,
tegra_clk_spdif_2x
,
tegra_clk_spdif_in
,
tegra_clk_spdif_in_sync
,
tegra_clk_spdif_mux
,
tegra_clk_spdif_out
,
tegra_clk_timer
,
tegra_clk_trace
,
tegra_clk_tsec
,
tegra_clk_tsensor
,
tegra_clk_tvdac
,
tegra_clk_tvo
,
tegra_clk_uarta
,
tegra_clk_uartb
,
tegra_clk_uartc
,
tegra_clk_uartd
,
tegra_clk_uarte
,
tegra_clk_usb2
,
tegra_clk_usb3
,
tegra_clk_usbd
,
tegra_clk_vcp
,
tegra_clk_vde
,
tegra_clk_vde_8
,
tegra_clk_vfir
,
tegra_clk_vi
,
tegra_clk_vi_8
,
tegra_clk_vi_9
,
tegra_clk_vic03
,
tegra_clk_vim2_clk
,
tegra_clk_vimclk_sync
,
tegra_clk_vi_sensor
,
tegra_clk_vi_sensor2
,
tegra_clk_vi_sensor_8
,
tegra_clk_xusb_dev
,
tegra_clk_xusb_dev_src
,
tegra_clk_xusb_falcon_src
,
tegra_clk_xusb_fs_src
,
tegra_clk_xusb_host
,
tegra_clk_xusb_host_src
,
tegra_clk_xusb_hs_src
,
tegra_clk_xusb_ss
,
tegra_clk_xusb_ss_src
,
tegra_clk_max
,
};
#endif
/* _TEGRA_CLK_ID_H */
drivers/clk/tegra/clk-periph-gate.c
View file @
e9827d9b
...
...
@@ -151,12 +151,16 @@ const struct clk_ops tegra_clk_periph_gate_ops = {
struct
clk
*
tegra_clk_register_periph_gate
(
const
char
*
name
,
const
char
*
parent_name
,
u8
gate_flags
,
void
__iomem
*
clk_base
,
unsigned
long
flags
,
int
clk_num
,
struct
tegra_clk_periph_regs
*
pregs
,
int
*
enable_refcnt
)
unsigned
long
flags
,
int
clk_num
,
int
*
enable_refcnt
)
{
struct
tegra_clk_periph_gate
*
gate
;
struct
clk
*
clk
;
struct
clk_init_data
init
;
struct
tegra_clk_periph_regs
*
pregs
;
pregs
=
get_reg_bank
(
clk_num
);
if
(
!
pregs
)
return
ERR_PTR
(
-
EINVAL
);
gate
=
kzalloc
(
sizeof
(
*
gate
),
GFP_KERNEL
);
if
(
!
gate
)
{
...
...
drivers/clk/tegra/clk-periph.c
View file @
e9827d9b
...
...
@@ -170,27 +170,50 @@ const struct clk_ops tegra_clk_periph_nodiv_ops = {
.
disable
=
clk_periph_disable
,
};
const
struct
clk_ops
tegra_clk_periph_no_gate_ops
=
{
.
get_parent
=
clk_periph_get_parent
,
.
set_parent
=
clk_periph_set_parent
,
.
recalc_rate
=
clk_periph_recalc_rate
,
.
round_rate
=
clk_periph_round_rate
,
.
set_rate
=
clk_periph_set_rate
,
};
static
struct
clk
*
_tegra_clk_register_periph
(
const
char
*
name
,
const
char
**
parent_names
,
int
num_parents
,
struct
tegra_clk_periph
*
periph
,
void
__iomem
*
clk_base
,
u32
offset
,
bool
div
,
void
__iomem
*
clk_base
,
u32
offset
,
unsigned
long
flags
)
{
struct
clk
*
clk
;
struct
clk_init_data
init
;
struct
tegra_clk_periph_regs
*
bank
;
bool
div
=
!
(
periph
->
gate
.
flags
&
TEGRA_PERIPH_NO_DIV
);
if
(
periph
->
gate
.
flags
&
TEGRA_PERIPH_NO_DIV
)
{
flags
|=
CLK_SET_RATE_PARENT
;
init
.
ops
=
&
tegra_clk_periph_nodiv_ops
;
}
else
if
(
periph
->
gate
.
flags
&
TEGRA_PERIPH_NO_GATE
)
init
.
ops
=
&
tegra_clk_periph_no_gate_ops
;
else
init
.
ops
=
&
tegra_clk_periph_ops
;
init
.
name
=
name
;
init
.
ops
=
div
?
&
tegra_clk_periph_ops
:
&
tegra_clk_periph_nodiv_ops
;
init
.
flags
=
flags
;
init
.
parent_names
=
parent_names
;
init
.
num_parents
=
num_parents
;
bank
=
get_reg_bank
(
periph
->
gate
.
clk_num
);
if
(
!
bank
)
return
ERR_PTR
(
-
EINVAL
);
/* Data in .init is copied by clk_register(), so stack variable OK */
periph
->
hw
.
init
=
&
init
;
periph
->
magic
=
TEGRA_CLK_PERIPH_MAGIC
;
periph
->
mux
.
reg
=
clk_base
+
offset
;
periph
->
divider
.
reg
=
div
?
(
clk_base
+
offset
)
:
NULL
;
periph
->
gate
.
clk_base
=
clk_base
;
periph
->
gate
.
regs
=
bank
;
periph
->
gate
.
enable_refcnt
=
periph_clk_enb_refcnt
;
clk
=
clk_register
(
NULL
,
&
periph
->
hw
);
if
(
IS_ERR
(
clk
))
...
...
@@ -209,7 +232,7 @@ struct clk *tegra_clk_register_periph(const char *name,
u32
offset
,
unsigned
long
flags
)
{
return
_tegra_clk_register_periph
(
name
,
parent_names
,
num_parents
,
periph
,
clk_base
,
offset
,
true
,
flags
);
periph
,
clk_base
,
offset
,
flags
);
}
struct
clk
*
tegra_clk_register_periph_nodiv
(
const
char
*
name
,
...
...
@@ -217,6 +240,7 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
struct
tegra_clk_periph
*
periph
,
void
__iomem
*
clk_base
,
u32
offset
)
{
periph
->
gate
.
flags
|=
TEGRA_PERIPH_NO_DIV
;
return
_tegra_clk_register_periph
(
name
,
parent_names
,
num_parents
,
periph
,
clk_base
,
offset
,
false
,
CLK_SET_RATE_PARENT
);
periph
,
clk_base
,
offset
,
CLK_SET_RATE_PARENT
);
}
drivers/clk/tegra/clk-pll.c
View file @
e9827d9b
...
...
@@ -77,7 +77,23 @@
#define PLLE_MISC_SETUP_VALUE (7 << PLLE_MISC_SETUP_BASE_SHIFT)
#define PLLE_SS_CTRL 0x68
#define PLLE_SS_DISABLE (7 << 10)
#define PLLE_SS_CNTL_BYPASS_SS BIT(10)
#define PLLE_SS_CNTL_INTERP_RESET BIT(11)
#define PLLE_SS_CNTL_SSC_BYP BIT(12)
#define PLLE_SS_CNTL_CENTER BIT(14)
#define PLLE_SS_CNTL_INVERT BIT(15)
#define PLLE_SS_DISABLE (PLLE_SS_CNTL_BYPASS_SS | PLLE_SS_CNTL_INTERP_RESET |\
PLLE_SS_CNTL_SSC_BYP)
#define PLLE_SS_MAX_MASK 0x1ff
#define PLLE_SS_MAX_VAL 0x25
#define PLLE_SS_INC_MASK (0xff << 16)
#define PLLE_SS_INC_VAL (0x1 << 16)
#define PLLE_SS_INCINTRV_MASK (0x3f << 24)
#define PLLE_SS_INCINTRV_VAL (0x20 << 24)
#define PLLE_SS_COEFFICIENTS_MASK \
(PLLE_SS_MAX_MASK | PLLE_SS_INC_MASK | PLLE_SS_INCINTRV_MASK)
#define PLLE_SS_COEFFICIENTS_VAL \
(PLLE_SS_MAX_VAL | PLLE_SS_INC_VAL | PLLE_SS_INCINTRV_VAL)
#define PLLE_AUX_PLLP_SEL BIT(2)
#define PLLE_AUX_ENABLE_SWCTL BIT(4)
...
...
@@ -121,6 +137,36 @@
#define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE BIT(5)
#define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL BIT(4)
#define PLLSS_MISC_KCP 0
#define PLLSS_MISC_KVCO 0
#define PLLSS_MISC_SETUP 0
#define PLLSS_EN_SDM 0
#define PLLSS_EN_SSC 0
#define PLLSS_EN_DITHER2 0
#define PLLSS_EN_DITHER 1
#define PLLSS_SDM_RESET 0
#define PLLSS_CLAMP 0
#define PLLSS_SDM_SSC_MAX 0
#define PLLSS_SDM_SSC_MIN 0
#define PLLSS_SDM_SSC_STEP 0
#define PLLSS_SDM_DIN 0
#define PLLSS_MISC_DEFAULT ((PLLSS_MISC_KCP << 25) | \
(PLLSS_MISC_KVCO << 24) | \
PLLSS_MISC_SETUP)
#define PLLSS_CFG_DEFAULT ((PLLSS_EN_SDM << 31) | \
(PLLSS_EN_SSC << 30) | \
(PLLSS_EN_DITHER2 << 29) | \
(PLLSS_EN_DITHER << 28) | \
(PLLSS_SDM_RESET) << 27 | \
(PLLSS_CLAMP << 22))
#define PLLSS_CTRL1_DEFAULT \
((PLLSS_SDM_SSC_MAX << 16) | PLLSS_SDM_SSC_MIN)
#define PLLSS_CTRL2_DEFAULT \
((PLLSS_SDM_SSC_STEP << 16) | PLLSS_SDM_DIN)
#define PLLSS_LOCK_OVERRIDE BIT(24)
#define PLLSS_REF_SRC_SEL_SHIFT 25
#define PLLSS_REF_SRC_SEL_MASK (3 << PLLSS_REF_SRC_SEL_SHIFT)
#define pll_readl(offset, p) readl_relaxed(p->clk_base + offset)
#define pll_readl_base(p) pll_readl(p->params->base_reg, p)
#define pll_readl_misc(p) pll_readl(p->params->misc_reg, p)
...
...
@@ -134,7 +180,7 @@
#define mask(w) ((1 << (w)) - 1)
#define divm_mask(p) mask(p->params->div_nmp->divm_width)
#define divn_mask(p) mask(p->params->div_nmp->divn_width)
#define divp_mask(p) (p->
flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :
\
#define divp_mask(p) (p->
params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :
\
mask(p->params->div_nmp->divp_width))
#define divm_max(p) (divm_mask(p))
...
...
@@ -154,10 +200,10 @@ static void clk_pll_enable_lock(struct tegra_clk_pll *pll)
{
u32
val
;
if
(
!
(
pll
->
flags
&
TEGRA_PLL_USE_LOCK
))
if
(
!
(
pll
->
params
->
flags
&
TEGRA_PLL_USE_LOCK
))
return
;
if
(
!
(
pll
->
flags
&
TEGRA_PLL_HAS_LOCK_ENABLE
))
if
(
!
(
pll
->
params
->
flags
&
TEGRA_PLL_HAS_LOCK_ENABLE
))
return
;
val
=
pll_readl_misc
(
pll
);
...
...
@@ -171,13 +217,13 @@ static int clk_pll_wait_for_lock(struct tegra_clk_pll *pll)
u32
val
,
lock_mask
;
void
__iomem
*
lock_addr
;
if
(
!
(
pll
->
flags
&
TEGRA_PLL_USE_LOCK
))
{
if
(
!
(
pll
->
params
->
flags
&
TEGRA_PLL_USE_LOCK
))
{
udelay
(
pll
->
params
->
lock_delay
);
return
0
;
}
lock_addr
=
pll
->
clk_base
;
if
(
pll
->
flags
&
TEGRA_PLL_LOCK_MISC
)
if
(
pll
->
params
->
flags
&
TEGRA_PLL_LOCK_MISC
)
lock_addr
+=
pll
->
params
->
misc_reg
;
else
lock_addr
+=
pll
->
params
->
base_reg
;
...
...
@@ -204,7 +250,7 @@ static int clk_pll_is_enabled(struct clk_hw *hw)
struct
tegra_clk_pll
*
pll
=
to_clk_pll
(
hw
);
u32
val
;
if
(
pll
->
flags
&
TEGRA_PLLM
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLLM
)
{
val
=
readl_relaxed
(
pll
->
pmc
+
PMC_PLLP_WB0_OVERRIDE
);
if
(
val
&
PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE
)
return
val
&
PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE
?
1
:
0
;
...
...
@@ -223,12 +269,12 @@ static void _clk_pll_enable(struct clk_hw *hw)
clk_pll_enable_lock
(
pll
);
val
=
pll_readl_base
(
pll
);
if
(
pll
->
flags
&
TEGRA_PLL_BYPASS
)
if
(
pll
->
params
->
flags
&
TEGRA_PLL_BYPASS
)
val
&=
~
PLL_BASE_BYPASS
;
val
|=
PLL_BASE_ENABLE
;
pll_writel_base
(
val
,
pll
);
if
(
pll
->
flags
&
TEGRA_PLLM
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLLM
)
{
val
=
readl_relaxed
(
pll
->
pmc
+
PMC_PLLP_WB0_OVERRIDE
);
val
|=
PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE
;
writel_relaxed
(
val
,
pll
->
pmc
+
PMC_PLLP_WB0_OVERRIDE
);
...
...
@@ -241,12 +287,12 @@ static void _clk_pll_disable(struct clk_hw *hw)
u32
val
;
val
=
pll_readl_base
(
pll
);
if
(
pll
->
flags
&
TEGRA_PLL_BYPASS
)
if
(
pll
->
params
->
flags
&
TEGRA_PLL_BYPASS
)
val
&=
~
PLL_BASE_BYPASS
;
val
&=
~
PLL_BASE_ENABLE
;
pll_writel_base
(
val
,
pll
);
if
(
pll
->
flags
&
TEGRA_PLLM
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLLM
)
{
val
=
readl_relaxed
(
pll
->
pmc
+
PMC_PLLP_WB0_OVERRIDE
);
val
&=
~
PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE
;
writel_relaxed
(
val
,
pll
->
pmc
+
PMC_PLLP_WB0_OVERRIDE
);
...
...
@@ -326,7 +372,7 @@ static int _get_table_rate(struct clk_hw *hw,
struct
tegra_clk_pll
*
pll
=
to_clk_pll
(
hw
);
struct
tegra_clk_pll_freq_table
*
sel
;
for
(
sel
=
pll
->
freq_table
;
sel
->
input_rate
!=
0
;
sel
++
)
for
(
sel
=
pll
->
params
->
freq_table
;
sel
->
input_rate
!=
0
;
sel
++
)
if
(
sel
->
input_rate
==
parent_rate
&&
sel
->
output_rate
==
rate
)
break
;
...
...
@@ -389,12 +435,11 @@ static int _calc_rate(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
if
(
cfg
->
m
>
divm_max
(
pll
)
||
cfg
->
n
>
divn_max
(
pll
)
||
(
1
<<
p_div
)
>
divp_max
(
pll
)
||
cfg
->
output_rate
>
pll
->
params
->
vco_max
)
{
pr_err
(
"%s: Failed to set %s rate %lu
\n
"
,
__func__
,
__clk_get_name
(
hw
->
clk
),
rate
);
WARN_ON
(
1
);
return
-
EINVAL
;
}
cfg
->
output_rate
>>=
p_div
;
if
(
pll
->
params
->
pdiv_tohw
)
{
ret
=
_p_div_to_hw
(
hw
,
1
<<
p_div
);
if
(
ret
<
0
)
...
...
@@ -414,7 +459,7 @@ static void _update_pll_mnp(struct tegra_clk_pll *pll,
struct
tegra_clk_pll_params
*
params
=
pll
->
params
;
struct
div_nmp
*
div_nmp
=
params
->
div_nmp
;
if
((
p
ll
->
flags
&
TEGRA_PLLM
)
&&
if
((
p
arams
->
flags
&
TEGRA_PLLM
)
&&
(
pll_override_readl
(
PMC_PLLP_WB0_OVERRIDE
,
pll
)
&
PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE
))
{
val
=
pll_override_readl
(
params
->
pmc_divp_reg
,
pll
);
...
...
@@ -450,7 +495,7 @@ static void _get_pll_mnp(struct tegra_clk_pll *pll,
struct
tegra_clk_pll_params
*
params
=
pll
->
params
;
struct
div_nmp
*
div_nmp
=
params
->
div_nmp
;
if
((
p
ll
->
flags
&
TEGRA_PLLM
)
&&
if
((
p
arams
->
flags
&
TEGRA_PLLM
)
&&
(
pll_override_readl
(
PMC_PLLP_WB0_OVERRIDE
,
pll
)
&
PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE
))
{
val
=
pll_override_readl
(
params
->
pmc_divp_reg
,
pll
);
...
...
@@ -479,11 +524,11 @@ static void _update_pll_cpcon(struct tegra_clk_pll *pll,
val
&=
~
(
PLL_MISC_CPCON_MASK
<<
PLL_MISC_CPCON_SHIFT
);
val
|=
cfg
->
cpcon
<<
PLL_MISC_CPCON_SHIFT
;
if
(
pll
->
flags
&
TEGRA_PLL_SET_LFCON
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLL_SET_LFCON
)
{
val
&=
~
(
PLL_MISC_LFCON_MASK
<<
PLL_MISC_LFCON_SHIFT
);
if
(
cfg
->
n
>=
PLLDU_LFCON_SET_DIVN
)
val
|=
1
<<
PLL_MISC_LFCON_SHIFT
;
}
else
if
(
pll
->
flags
&
TEGRA_PLL_SET_DCCON
)
{
}
else
if
(
pll
->
params
->
flags
&
TEGRA_PLL_SET_DCCON
)
{
val
&=
~
(
1
<<
PLL_MISC_DCCON_SHIFT
);
if
(
rate
>=
(
pll
->
params
->
vco_max
>>
1
))
val
|=
1
<<
PLL_MISC_DCCON_SHIFT
;
...
...
@@ -505,7 +550,7 @@ static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
_update_pll_mnp
(
pll
,
cfg
);
if
(
pll
->
flags
&
TEGRA_PLL_HAS_CPCON
)
if
(
pll
->
params
->
flags
&
TEGRA_PLL_HAS_CPCON
)
_update_pll_cpcon
(
pll
,
cfg
,
rate
);
if
(
state
)
{
...
...
@@ -524,11 +569,11 @@ static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned
long
flags
=
0
;
int
ret
=
0
;
if
(
pll
->
flags
&
TEGRA_PLL_FIXED
)
{
if
(
rate
!=
pll
->
fixed_rate
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLL_FIXED
)
{
if
(
rate
!=
pll
->
params
->
fixed_rate
)
{
pr_err
(
"%s: Can not change %s fixed rate %lu to %lu
\n
"
,
__func__
,
__clk_get_name
(
hw
->
clk
),
pll
->
fixed_rate
,
rate
);
pll
->
params
->
fixed_rate
,
rate
);
return
-
EINVAL
;
}
return
0
;
...
...
@@ -536,6 +581,8 @@ static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
if
(
_get_table_rate
(
hw
,
&
cfg
,
rate
,
parent_rate
)
&&
_calc_rate
(
hw
,
&
cfg
,
rate
,
parent_rate
))
{
pr_err
(
"%s: Failed to set %s rate %lu
\n
"
,
__func__
,
__clk_get_name
(
hw
->
clk
),
rate
);
WARN_ON
(
1
);
return
-
EINVAL
;
}
...
...
@@ -559,18 +606,16 @@ static long clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
struct
tegra_clk_pll
*
pll
=
to_clk_pll
(
hw
);
struct
tegra_clk_pll_freq_table
cfg
;
if
(
pll
->
flags
&
TEGRA_PLL_FIXED
)
return
pll
->
fixed_rate
;
if
(
pll
->
params
->
flags
&
TEGRA_PLL_FIXED
)
return
pll
->
params
->
fixed_rate
;
/* PLLM is used for memory; we do not change rate */
if
(
pll
->
flags
&
TEGRA_PLLM
)
if
(
pll
->
params
->
flags
&
TEGRA_PLLM
)
return
__clk_get_rate
(
hw
->
clk
);
if
(
_get_table_rate
(
hw
,
&
cfg
,
rate
,
*
prate
)
&&
_calc_rate
(
hw
,
&
cfg
,
rate
,
*
prate
))
{
WARN_ON
(
1
);
_calc_rate
(
hw
,
&
cfg
,
rate
,
*
prate
))
return
-
EINVAL
;
}
return
cfg
.
output_rate
;
}
...
...
@@ -586,17 +631,19 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
val
=
pll_readl_base
(
pll
);
if
((
pll
->
flags
&
TEGRA_PLL_BYPASS
)
&&
(
val
&
PLL_BASE_BYPASS
))
if
((
pll
->
params
->
flags
&
TEGRA_PLL_BYPASS
)
&&
(
val
&
PLL_BASE_BYPASS
))
return
parent_rate
;
if
((
pll
->
flags
&
TEGRA_PLL_FIXED
)
&&
!
(
val
&
PLL_BASE_OVERRIDE
))
{
if
((
pll
->
params
->
flags
&
TEGRA_PLL_FIXED
)
&&
!
(
val
&
PLL_BASE_OVERRIDE
))
{
struct
tegra_clk_pll_freq_table
sel
;
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
fixed_rate
,
parent_rate
))
{
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
params
->
fixed_rate
,
parent_rate
))
{
pr_err
(
"Clock %s has unknown fixed frequency
\n
"
,
__clk_get_name
(
hw
->
clk
));
BUG
();
}
return
pll
->
fixed_rate
;
return
pll
->
params
->
fixed_rate
;
}
_get_pll_mnp
(
pll
,
&
cfg
);
...
...
@@ -664,7 +711,7 @@ static int clk_plle_enable(struct clk_hw *hw)
u32
val
;
int
err
;
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
fixed_rate
,
input_rate
))
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
params
->
fixed_rate
,
input_rate
))
return
-
EINVAL
;
clk_pll_disable
(
hw
);
...
...
@@ -680,7 +727,7 @@ static int clk_plle_enable(struct clk_hw *hw)
return
err
;
}
if
(
pll
->
flags
&
TEGRA_PLLE_CONFIGURE
)
{
if
(
pll
->
params
->
flags
&
TEGRA_PLLE_CONFIGURE
)
{
/* configure dividers */
val
=
pll_readl_base
(
pll
);
val
&=
~
(
divm_mask
(
pll
)
|
divn_mask
(
pll
)
|
divp_mask
(
pll
));
...
...
@@ -744,7 +791,7 @@ const struct clk_ops tegra_clk_plle_ops = {
.
enable
=
clk_plle_enable
,
};
#if
def CONFIG_ARCH_TEGRA_114_SOC
#if
defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC)
static
int
_pll_fixed_mdiv
(
struct
tegra_clk_pll_params
*
pll_params
,
unsigned
long
parent_rate
)
...
...
@@ -755,6 +802,48 @@ static int _pll_fixed_mdiv(struct tegra_clk_pll_params *pll_params,
return
1
;
}
static
unsigned
long
_clip_vco_min
(
unsigned
long
vco_min
,
unsigned
long
parent_rate
)
{
return
DIV_ROUND_UP
(
vco_min
,
parent_rate
)
*
parent_rate
;
}
static
int
_setup_dynamic_ramp
(
struct
tegra_clk_pll_params
*
pll_params
,
void
__iomem
*
clk_base
,
unsigned
long
parent_rate
)
{
u32
val
;
u32
step_a
,
step_b
;
switch
(
parent_rate
)
{
case
12000000
:
case
13000000
:
case
26000000
:
step_a
=
0x2B
;
step_b
=
0x0B
;
break
;
case
16800000
:
step_a
=
0x1A
;
step_b
=
0x09
;
break
;
case
19200000
:
step_a
=
0x12
;
step_b
=
0x08
;
break
;
default:
pr_err
(
"%s: Unexpected reference rate %lu
\n
"
,
__func__
,
parent_rate
);
WARN_ON
(
1
);
return
-
EINVAL
;
}
val
=
step_a
<<
pll_params
->
stepa_shift
;
val
|=
step_b
<<
pll_params
->
stepb_shift
;
writel_relaxed
(
val
,
clk_base
+
pll_params
->
dyn_ramp_reg
);
return
0
;
}
static
int
clk_pll_iddq_enable
(
struct
clk_hw
*
hw
)
{
struct
tegra_clk_pll
*
pll
=
to_clk_pll
(
hw
);
...
...
@@ -1173,7 +1262,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
unsigned
long
flags
=
0
;
unsigned
long
input_rate
=
clk_get_rate
(
clk_get_parent
(
hw
->
clk
));
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
fixed_rate
,
input_rate
))
if
(
_get_table_rate
(
hw
,
&
sel
,
pll
->
params
->
fixed_rate
,
input_rate
))
return
-
EINVAL
;
if
(
pll
->
lock
)
...
...
@@ -1217,6 +1306,18 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
if
(
ret
<
0
)
goto
out
;
val
=
pll_readl
(
PLLE_SS_CTRL
,
pll
);
val
&=
~
(
PLLE_SS_CNTL_CENTER
|
PLLE_SS_CNTL_INVERT
);
val
&=
~
PLLE_SS_COEFFICIENTS_MASK
;
val
|=
PLLE_SS_COEFFICIENTS_VAL
;
pll_writel
(
val
,
PLLE_SS_CTRL
,
pll
);
val
&=
~
(
PLLE_SS_CNTL_SSC_BYP
|
PLLE_SS_CNTL_BYPASS_SS
);
pll_writel
(
val
,
PLLE_SS_CTRL
,
pll
);
udelay
(
1
);
val
&=
~
PLLE_SS_CNTL_INTERP_RESET
;
pll_writel
(
val
,
PLLE_SS_CTRL
,
pll
);
udelay
(
1
);
/* TODO: enable hw control of xusb brick pll */
out:
...
...
@@ -1248,9 +1349,8 @@ static void clk_plle_tegra114_disable(struct clk_hw *hw)
#endif
static
struct
tegra_clk_pll
*
_tegra_init_pll
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
void
__iomem
*
pmc
,
struct
tegra_clk_pll_params
*
pll_params
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
...
...
@@ -1261,10 +1361,7 @@ static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base,
pll
->
clk_base
=
clk_base
;
pll
->
pmc
=
pmc
;
pll
->
freq_table
=
freq_table
;
pll
->
params
=
pll_params
;
pll
->
fixed_rate
=
fixed_rate
;
pll
->
flags
=
pll_flags
;
pll
->
lock
=
lock
;
if
(
!
pll_params
->
div_nmp
)
...
...
@@ -1293,17 +1390,15 @@ static struct clk *_tegra_clk_register_pll(struct tegra_clk_pll *pll,
struct
clk
*
tegra_clk_register_pll
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
pll_flags
|=
TEGRA_PLL_BYPASS
;
pll_flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
pll_params
->
flags
|=
TEGRA_PLL_BYPASS
;
pll_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1317,17 +1412,15 @@ struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
struct
clk
*
tegra_clk_register_plle
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
pll_flags
|=
TEGRA_PLL_LOCK_MISC
|
TEGRA_PLL_BYPASS
;
pll_flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
pll_params
->
flags
|=
TEGRA_PLL_LOCK_MISC
|
TEGRA_PLL_BYPASS
;
pll_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1339,7 +1432,7 @@ struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
return
clk
;
}
#if
def CONFIG_ARCH_TEGRA_114_SOC
#if
defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC)
const
struct
clk_ops
tegra_clk_pllxc_ops
=
{
.
is_enabled
=
clk_pll_is_enabled
,
.
enable
=
clk_pll_iddq_enable
,
...
...
@@ -1386,21 +1479,46 @@ const struct clk_ops tegra_clk_plle_tegra114_ops = {
struct
clk
*
tegra_clk_register_pllxc
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
struct
clk
*
clk
,
*
parent
;
unsigned
long
parent_rate
;
int
err
;
u32
val
,
val_iddq
;
parent
=
__clk_lookup
(
parent_name
);
if
(
!
parent
)
{
WARN
(
1
,
"parent clk %s of %s must be registered first
\n
"
,
name
,
parent_name
);
return
ERR_PTR
(
-
EINVAL
);
}
if
(
!
pll_params
->
pdiv_tohw
)
return
ERR_PTR
(
-
EINVAL
);
pll_flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
parent_rate
=
__clk_get_rate
(
parent
);
pll_params
->
vco_min
=
_clip_vco_min
(
pll_params
->
vco_min
,
parent_rate
);
err
=
_setup_dynamic_ramp
(
pll_params
,
clk_base
,
parent_rate
);
if
(
err
)
return
ERR_PTR
(
err
);
val
=
readl_relaxed
(
clk_base
+
pll_params
->
base_reg
);
val_iddq
=
readl_relaxed
(
clk_base
+
pll_params
->
iddq_reg
);
if
(
val
&
PLL_BASE_ENABLE
)
WARN_ON
(
val_iddq
&
BIT
(
pll_params
->
iddq_bit_idx
));
else
{
val_iddq
|=
BIT
(
pll_params
->
iddq_bit_idx
);
writel_relaxed
(
val_iddq
,
clk_base
+
pll_params
->
iddq_reg
);
}
pll_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1414,19 +1532,19 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name,
struct
clk
*
tegra_clk_register_pllre
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
,
unsigned
long
parent_rate
)
{
u32
val
;
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
pll_flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
|
TEGRA_PLL_LOCK_MISC
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
pll_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
|
TEGRA_PLL_LOCK_MISC
;
pll_params
->
vco_min
=
_clip_vco_min
(
pll_params
->
vco_min
,
parent_rate
);
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1461,23 +1579,32 @@ struct clk *tegra_clk_register_pllre(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
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
struct
clk
*
clk
,
*
parent
;
unsigned
long
parent_rate
;
if
(
!
pll_params
->
pdiv_tohw
)
return
ERR_PTR
(
-
EINVAL
);
pll_flags
|=
TEGRA_PLL_BYPASS
;
pll_flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll_flags
|=
TEGRA_PLLM
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
parent
=
__clk_lookup
(
parent_name
);
if
(
!
parent
)
{
WARN
(
1
,
"parent clk %s of %s must be registered first
\n
"
,
name
,
parent_name
);
return
ERR_PTR
(
-
EINVAL
);
}
parent_rate
=
__clk_get_rate
(
parent
);
pll_params
->
vco_min
=
_clip_vco_min
(
pll_params
->
vco_min
,
parent_rate
);
pll_params
->
flags
|=
TEGRA_PLL_BYPASS
;
pll_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll_params
->
flags
|=
TEGRA_PLLM
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1491,10 +1618,8 @@ struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name,
struct
clk
*
tegra_clk_register_pllc
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
{
struct
clk
*
parent
,
*
clk
;
...
...
@@ -1507,20 +1632,21 @@ struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name,
return
ERR_PTR
(
-
EINVAL
);
parent
=
__clk_lookup
(
parent_name
);
if
(
IS_ERR
(
parent
)
)
{
if
(
!
parent
)
{
WARN
(
1
,
"parent clk %s of %s must be registered first
\n
"
,
name
,
parent_name
);
return
ERR_PTR
(
-
EINVAL
);
}
pll_flags
|=
TEGRA_PLL_BYPASS
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
fixed_rate
,
pll_params
,
pll_flags
,
freq_table
,
lock
);
parent_rate
=
__clk_get_rate
(
parent
);
pll_params
->
vco_min
=
_clip_vco_min
(
pll_params
->
vco_min
,
parent_rate
);
pll_params
->
flags
|=
TEGRA_PLL_BYPASS
;
pll
=
_tegra_init_pll
(
clk_base
,
pmc
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
parent_rate
=
__clk_get_rate
(
parent
);
/*
* Most of PLLC register fields are shadowed, and can not be read
* directly from PLL h/w. Hence, actual PLLC boot state is unknown.
...
...
@@ -1567,17 +1693,15 @@ struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name,
struct
clk
*
tegra_clk_register_plle_tegra114
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
)
{
struct
tegra_clk_pll
*
pll
;
struct
clk
*
clk
;
u32
val
,
val_aux
;
pll
=
_tegra_init_pll
(
clk_base
,
NULL
,
fixed_rate
,
pll_params
,
TEGRA_PLL_HAS_LOCK_ENABLE
,
freq_table
,
lock
);
pll
_params
->
flags
|=
TEGRA_PLL_HAS_LOCK_ENABLE
;
pll
=
_tegra_init_pll
(
clk_base
,
NULL
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
...
...
@@ -1587,11 +1711,13 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name,
val_aux
=
pll_readl
(
pll_params
->
aux_reg
,
pll
);
if
(
val
&
PLL_BASE_ENABLE
)
{
if
(
!
(
val_aux
&
PLLE_AUX_PLLRE_SEL
))
if
((
val_aux
&
PLLE_AUX_PLLRE_SEL
)
||
(
val_aux
&
PLLE_AUX_PLLP_SEL
))
WARN
(
1
,
"pll_e enabled with unsupported parent %s
\n
"
,
(
val
&
PLLE_AUX_PLLP_SEL
)
?
"pllp_out0"
:
"pll_ref"
);
(
val_aux
&
PLLE_AUX_PLLP_SEL
)
?
"pllp_out0"
:
"pll_re_vco"
);
}
else
{
val_aux
|=
PLLE_AUX_PLLRE_SEL
;
val_aux
&=
~
(
PLLE_AUX_PLLRE_SEL
|
PLLE_AUX_PLLP_SEL
)
;
pll_writel
(
val
,
pll_params
->
aux_reg
,
pll
);
}
...
...
@@ -1603,3 +1729,92 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name,
return
clk
;
}
#endif
#ifdef CONFIG_ARCH_TEGRA_124_SOC
const
struct
clk_ops
tegra_clk_pllss_ops
=
{
.
is_enabled
=
clk_pll_is_enabled
,
.
enable
=
clk_pll_iddq_enable
,
.
disable
=
clk_pll_iddq_disable
,
.
recalc_rate
=
clk_pll_recalc_rate
,
.
round_rate
=
clk_pll_ramp_round_rate
,
.
set_rate
=
clk_pllxc_set_rate
,
};
struct
clk
*
tegra_clk_register_pllss
(
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
tegra_clk_pll
*
pll
;
struct
clk
*
clk
,
*
parent
;
struct
tegra_clk_pll_freq_table
cfg
;
unsigned
long
parent_rate
;
u32
val
;
int
i
;
if
(
!
pll_params
->
div_nmp
)
return
ERR_PTR
(
-
EINVAL
);
parent
=
__clk_lookup
(
parent_name
);
if
(
!
parent
)
{
WARN
(
1
,
"parent clk %s of %s must be registered first
\n
"
,
name
,
parent_name
);
return
ERR_PTR
(
-
EINVAL
);
}
pll_params
->
flags
=
TEGRA_PLL_HAS_LOCK_ENABLE
|
TEGRA_PLL_USE_LOCK
;
pll
=
_tegra_init_pll
(
clk_base
,
NULL
,
pll_params
,
lock
);
if
(
IS_ERR
(
pll
))
return
ERR_CAST
(
pll
);
val
=
pll_readl_base
(
pll
);
val
&=
~
PLLSS_REF_SRC_SEL_MASK
;
pll_writel_base
(
val
,
pll
);
parent_rate
=
__clk_get_rate
(
parent
);
pll_params
->
vco_min
=
_clip_vco_min
(
pll_params
->
vco_min
,
parent_rate
);
/* initialize PLL to minimum rate */
cfg
.
m
=
_pll_fixed_mdiv
(
pll_params
,
parent_rate
);
cfg
.
n
=
cfg
.
m
*
pll_params
->
vco_min
/
parent_rate
;
for
(
i
=
0
;
pll_params
->
pdiv_tohw
[
i
].
pdiv
;
i
++
)
;
if
(
!
i
)
{
kfree
(
pll
);
return
ERR_PTR
(
-
EINVAL
);
}
cfg
.
p
=
pll_params
->
pdiv_tohw
[
i
-
1
].
hw_val
;
_update_pll_mnp
(
pll
,
&
cfg
);
pll_writel_misc
(
PLLSS_MISC_DEFAULT
,
pll
);
pll_writel
(
PLLSS_CFG_DEFAULT
,
pll_params
->
ext_misc_reg
[
0
],
pll
);
pll_writel
(
PLLSS_CTRL1_DEFAULT
,
pll_params
->
ext_misc_reg
[
1
],
pll
);
pll_writel
(
PLLSS_CTRL1_DEFAULT
,
pll_params
->
ext_misc_reg
[
2
],
pll
);
val
=
pll_readl_base
(
pll
);
if
(
val
&
PLL_BASE_ENABLE
)
{
if
(
val
&
BIT
(
pll_params
->
iddq_bit_idx
))
{
WARN
(
1
,
"%s is on but IDDQ set
\n
"
,
name
);
kfree
(
pll
);
return
ERR_PTR
(
-
EINVAL
);
}
}
else
val
|=
BIT
(
pll_params
->
iddq_bit_idx
);
val
&=
~
PLLSS_LOCK_OVERRIDE
;
pll_writel_base
(
val
,
pll
);
clk
=
_tegra_clk_register_pll
(
pll
,
name
,
parent_name
,
flags
,
&
tegra_clk_pllss_ops
);
if
(
IS_ERR
(
clk
))
kfree
(
pll
);
return
clk
;
}
#endif
drivers/clk/tegra/clk-tegra-audio.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include "clk.h"
#include "clk-id.h"
#define AUDIO_SYNC_CLK_I2S0 0x4a0
#define AUDIO_SYNC_CLK_I2S1 0x4a4
#define AUDIO_SYNC_CLK_I2S2 0x4a8
#define AUDIO_SYNC_CLK_I2S3 0x4ac
#define AUDIO_SYNC_CLK_I2S4 0x4b0
#define AUDIO_SYNC_CLK_SPDIF 0x4b4
#define AUDIO_SYNC_DOUBLER 0x49c
#define PLLA_OUT 0xb4
struct
tegra_sync_source_initdata
{
char
*
name
;
unsigned
long
rate
;
unsigned
long
max_rate
;
int
clk_id
;
};
#define SYNC(_name) \
{\
.name = #_name,\
.rate = 24000000,\
.max_rate = 24000000,\
.clk_id = tegra_clk_ ## _name,\
}
struct
tegra_audio_clk_initdata
{
char
*
gate_name
;
char
*
mux_name
;
u32
offset
;
int
gate_clk_id
;
int
mux_clk_id
;
};
#define AUDIO(_name, _offset) \
{\
.gate_name = #_name,\
.mux_name = #_name"_mux",\
.offset = _offset,\
.gate_clk_id = tegra_clk_ ## _name,\
.mux_clk_id = tegra_clk_ ## _name ## _mux,\
}
struct
tegra_audio2x_clk_initdata
{
char
*
parent
;
char
*
gate_name
;
char
*
name_2x
;
char
*
div_name
;
int
clk_id
;
int
clk_num
;
u8
div_offset
;
};
#define AUDIO2X(_name, _num, _offset) \
{\
.parent = #_name,\
.gate_name = #_name"_2x",\
.name_2x = #_name"_doubler",\
.div_name = #_name"_div",\
.clk_id = tegra_clk_ ## _name ## _2x,\
.clk_num = _num,\
.div_offset = _offset,\
}
static
DEFINE_SPINLOCK
(
clk_doubler_lock
);
static
const
char
*
mux_audio_sync_clk
[]
=
{
"spdif_in_sync"
,
"i2s0_sync"
,
"i2s1_sync"
,
"i2s2_sync"
,
"i2s3_sync"
,
"i2s4_sync"
,
"vimclk_sync"
,
};
static
struct
tegra_sync_source_initdata
sync_source_clks
[]
__initdata
=
{
SYNC
(
spdif_in_sync
),
SYNC
(
i2s0_sync
),
SYNC
(
i2s1_sync
),
SYNC
(
i2s2_sync
),
SYNC
(
i2s3_sync
),
SYNC
(
i2s4_sync
),
SYNC
(
vimclk_sync
),
};
static
struct
tegra_audio_clk_initdata
audio_clks
[]
=
{
AUDIO
(
audio0
,
AUDIO_SYNC_CLK_I2S0
),
AUDIO
(
audio1
,
AUDIO_SYNC_CLK_I2S1
),
AUDIO
(
audio2
,
AUDIO_SYNC_CLK_I2S2
),
AUDIO
(
audio3
,
AUDIO_SYNC_CLK_I2S3
),
AUDIO
(
audio4
,
AUDIO_SYNC_CLK_I2S4
),
AUDIO
(
spdif
,
AUDIO_SYNC_CLK_SPDIF
),
};
static
struct
tegra_audio2x_clk_initdata
audio2x_clks
[]
=
{
AUDIO2X
(
audio0
,
113
,
24
),
AUDIO2X
(
audio1
,
114
,
25
),
AUDIO2X
(
audio2
,
115
,
26
),
AUDIO2X
(
audio3
,
116
,
27
),
AUDIO2X
(
audio4
,
117
,
28
),
AUDIO2X
(
spdif
,
118
,
29
),
};
void
__init
tegra_audio_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_a_params
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
int
i
;
/* PLLA */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_a
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
tegra_clk_register_pll
(
"pll_a"
,
"pll_p_out1"
,
clk_base
,
pmc_base
,
0
,
pll_a_params
,
NULL
);
*
dt_clk
=
clk
;
}
/* PLLA_OUT0 */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_a_out0
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
tegra_clk_register_divider
(
"pll_a_out0_div"
,
"pll_a"
,
clk_base
+
PLLA_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_a_out0"
,
"pll_a_out0_div"
,
clk_base
+
PLLA_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
*
dt_clk
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sync_source_clks
);
i
++
)
{
struct
tegra_sync_source_initdata
*
data
;
data
=
&
sync_source_clks
[
i
];
dt_clk
=
tegra_lookup_dt_id
(
data
->
clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
tegra_clk_register_sync_source
(
data
->
name
,
data
->
rate
,
data
->
max_rate
);
*
dt_clk
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
audio_clks
);
i
++
)
{
struct
tegra_audio_clk_initdata
*
data
;
data
=
&
audio_clks
[
i
];
dt_clk
=
tegra_lookup_dt_id
(
data
->
mux_clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
clk_register_mux
(
NULL
,
data
->
mux_name
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
data
->
offset
,
0
,
3
,
0
,
NULL
);
*
dt_clk
=
clk
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
gate_clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
clk_register_gate
(
NULL
,
data
->
gate_name
,
data
->
mux_name
,
0
,
clk_base
+
data
->
offset
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
*
dt_clk
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
audio2x_clks
);
i
++
)
{
struct
tegra_audio2x_clk_initdata
*
data
;
data
=
&
audio2x_clks
[
i
];
dt_clk
=
tegra_lookup_dt_id
(
data
->
clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
clk_register_fixed_factor
(
NULL
,
data
->
name_2x
,
data
->
parent
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
data
->
div_name
,
data
->
name_2x
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
data
->
div_offset
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
data
->
gate_name
,
data
->
div_name
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
data
->
clk_num
,
periph_clk_enb_refcnt
);
*
dt_clk
=
clk
;
}
}
drivers/clk/tegra/clk-tegra-fixed.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include "clk.h"
#include "clk-id.h"
#define OSC_CTRL 0x50
#define OSC_CTRL_OSC_FREQ_SHIFT 28
#define OSC_CTRL_PLL_REF_DIV_SHIFT 26
int
__init
tegra_osc_clk_init
(
void
__iomem
*
clk_base
,
struct
tegra_clk
*
tegra_clks
,
unsigned
long
*
input_freqs
,
int
num
,
unsigned
long
*
osc_freq
,
unsigned
long
*
pll_ref_freq
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
u32
val
,
pll_ref_div
;
unsigned
osc_idx
;
val
=
readl_relaxed
(
clk_base
+
OSC_CTRL
);
osc_idx
=
val
>>
OSC_CTRL_OSC_FREQ_SHIFT
;
if
(
osc_idx
<
num
)
*
osc_freq
=
input_freqs
[
osc_idx
];
else
*
osc_freq
=
0
;
if
(
!*
osc_freq
)
{
WARN_ON
(
1
);
return
-
EINVAL
;
}
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_clk_m
,
tegra_clks
);
if
(
!
dt_clk
)
return
0
;
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_m"
,
NULL
,
CLK_IS_ROOT
,
*
osc_freq
);
*
dt_clk
=
clk
;
/* pll_ref */
val
=
(
val
>>
OSC_CTRL_PLL_REF_DIV_SHIFT
)
&
3
;
pll_ref_div
=
1
<<
val
;
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_ref
,
tegra_clks
);
if
(
!
dt_clk
)
return
0
;
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_ref"
,
"clk_m"
,
0
,
1
,
pll_ref_div
);
*
dt_clk
=
clk
;
if
(
pll_ref_freq
)
*
pll_ref_freq
=
*
osc_freq
/
pll_ref_div
;
return
0
;
}
void
__init
tegra_fixed_clk_init
(
struct
tegra_clk
*
tegra_clks
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
/* clk_32k */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_clk_32k
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_32k"
,
NULL
,
CLK_IS_ROOT
,
32768
);
*
dt_clk
=
clk
;
}
/* clk_m_div2 */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_clk_m_div2
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div2"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
*
dt_clk
=
clk
;
}
/* clk_m_div4 */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_clk_m_div4
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div4"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
4
);
*
dt_clk
=
clk
;
}
}
drivers/clk/tegra/clk-tegra-periph.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include "clk.h"
#include "clk-id.h"
#define CLK_SOURCE_I2S0 0x1d8
#define CLK_SOURCE_I2S1 0x100
#define CLK_SOURCE_I2S2 0x104
#define CLK_SOURCE_NDFLASH 0x160
#define CLK_SOURCE_I2S3 0x3bc
#define CLK_SOURCE_I2S4 0x3c0
#define CLK_SOURCE_SPDIF_OUT 0x108
#define CLK_SOURCE_SPDIF_IN 0x10c
#define CLK_SOURCE_PWM 0x110
#define CLK_SOURCE_ADX 0x638
#define CLK_SOURCE_ADX1 0x670
#define CLK_SOURCE_AMX 0x63c
#define CLK_SOURCE_AMX1 0x674
#define CLK_SOURCE_HDA 0x428
#define CLK_SOURCE_HDA2CODEC_2X 0x3e4
#define CLK_SOURCE_SBC1 0x134
#define CLK_SOURCE_SBC2 0x118
#define CLK_SOURCE_SBC3 0x11c
#define CLK_SOURCE_SBC4 0x1b4
#define CLK_SOURCE_SBC5 0x3c8
#define CLK_SOURCE_SBC6 0x3cc
#define CLK_SOURCE_SATA_OOB 0x420
#define CLK_SOURCE_SATA 0x424
#define CLK_SOURCE_NDSPEED 0x3f8
#define CLK_SOURCE_VFIR 0x168
#define CLK_SOURCE_SDMMC1 0x150
#define CLK_SOURCE_SDMMC2 0x154
#define CLK_SOURCE_SDMMC3 0x1bc
#define CLK_SOURCE_SDMMC4 0x164
#define CLK_SOURCE_CVE 0x140
#define CLK_SOURCE_TVO 0x188
#define CLK_SOURCE_TVDAC 0x194
#define CLK_SOURCE_VDE 0x1c8
#define CLK_SOURCE_CSITE 0x1d4
#define CLK_SOURCE_LA 0x1f8
#define CLK_SOURCE_TRACE 0x634
#define CLK_SOURCE_OWR 0x1cc
#define CLK_SOURCE_NOR 0x1d0
#define CLK_SOURCE_MIPI 0x174
#define CLK_SOURCE_I2C1 0x124
#define CLK_SOURCE_I2C2 0x198
#define CLK_SOURCE_I2C3 0x1b8
#define CLK_SOURCE_I2C4 0x3c4
#define CLK_SOURCE_I2C5 0x128
#define CLK_SOURCE_I2C6 0x65c
#define CLK_SOURCE_UARTA 0x178
#define CLK_SOURCE_UARTB 0x17c
#define CLK_SOURCE_UARTC 0x1a0
#define CLK_SOURCE_UARTD 0x1c0
#define CLK_SOURCE_UARTE 0x1c4
#define CLK_SOURCE_3D 0x158
#define CLK_SOURCE_2D 0x15c
#define CLK_SOURCE_MPE 0x170
#define CLK_SOURCE_UARTE 0x1c4
#define CLK_SOURCE_VI_SENSOR 0x1a8
#define CLK_SOURCE_VI 0x148
#define CLK_SOURCE_EPP 0x16c
#define CLK_SOURCE_MSENC 0x1f0
#define CLK_SOURCE_TSEC 0x1f4
#define CLK_SOURCE_HOST1X 0x180
#define CLK_SOURCE_HDMI 0x18c
#define CLK_SOURCE_DISP1 0x138
#define CLK_SOURCE_DISP2 0x13c
#define CLK_SOURCE_CILAB 0x614
#define CLK_SOURCE_CILCD 0x618
#define CLK_SOURCE_CILE 0x61c
#define CLK_SOURCE_DSIALP 0x620
#define CLK_SOURCE_DSIBLP 0x624
#define CLK_SOURCE_TSENSOR 0x3b8
#define CLK_SOURCE_D_AUDIO 0x3d0
#define CLK_SOURCE_DAM0 0x3d8
#define CLK_SOURCE_DAM1 0x3dc
#define CLK_SOURCE_DAM2 0x3e0
#define CLK_SOURCE_ACTMON 0x3e8
#define CLK_SOURCE_EXTERN1 0x3ec
#define CLK_SOURCE_EXTERN2 0x3f0
#define CLK_SOURCE_EXTERN3 0x3f4
#define CLK_SOURCE_I2CSLOW 0x3fc
#define CLK_SOURCE_SE 0x42c
#define CLK_SOURCE_MSELECT 0x3b4
#define CLK_SOURCE_DFLL_REF 0x62c
#define CLK_SOURCE_DFLL_SOC 0x630
#define CLK_SOURCE_SOC_THERM 0x644
#define CLK_SOURCE_XUSB_HOST_SRC 0x600
#define CLK_SOURCE_XUSB_FALCON_SRC 0x604
#define CLK_SOURCE_XUSB_FS_SRC 0x608
#define CLK_SOURCE_XUSB_SS_SRC 0x610
#define CLK_SOURCE_XUSB_DEV_SRC 0x60c
#define CLK_SOURCE_ISP 0x144
#define CLK_SOURCE_SOR0 0x414
#define CLK_SOURCE_DPAUX 0x418
#define CLK_SOURCE_SATA_OOB 0x420
#define CLK_SOURCE_SATA 0x424
#define CLK_SOURCE_ENTROPY 0x628
#define CLK_SOURCE_VI_SENSOR2 0x658
#define CLK_SOURCE_HDMI_AUDIO 0x668
#define CLK_SOURCE_VIC03 0x678
#define CLK_SOURCE_CLK72MHZ 0x66c
#define MASK(x) (BIT(x) - 1)
#define MUX(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
_clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\
NULL)
#define MUX_FLAGS(_name, _parents, _offset,\
_clk_num, _gate_flags, _clk_id, flags)\
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
_clk_num, _gate_flags, _clk_id, _parents##_idx, flags,\
NULL)
#define MUX8(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
_clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\
NULL)
#define MUX8_NOGATE_LOCK(_name, _parents, _offset, _clk_id, _lock) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
0, TEGRA_PERIPH_NO_GATE, _clk_id,\
_parents##_idx, 0, _lock)
#define INT(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \
TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\
_clk_id, _parents##_idx, 0, NULL)
#define INT_FLAGS(_name, _parents, _offset,\
_clk_num, _gate_flags, _clk_id, flags)\
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \
TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\
_clk_id, _parents##_idx, flags, NULL)
#define INT8(_name, _parents, _offset,\
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \
TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\
_clk_id, _parents##_idx, 0, NULL)
#define UART(_name, _parents, _offset,\
_clk_num, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 16, 1, TEGRA_DIVIDER_UART| \
TEGRA_DIVIDER_ROUND_UP, _clk_num, 0, _clk_id,\
_parents##_idx, 0, NULL)
#define I2C(_name, _parents, _offset,\
_clk_num, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP,\
_clk_num, 0, _clk_id, _parents##_idx, 0, NULL)
#define XUSB(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \
TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\
_clk_id, _parents##_idx, 0, NULL)
#define AUDIO(_name, _offset, _clk_num,\
_gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, mux_d_audio_clk, \
_offset, 16, 0xE01F, 0, 0, 8, 1, \
TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags, \
_clk_id, mux_d_audio_clk_idx, 0, NULL)
#define NODIV(_name, _parents, _offset, \
_mux_shift, _mux_mask, _clk_num, \
_gate_flags, _clk_id, _lock) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
_mux_shift, _mux_mask, 0, 0, 0, 0, 0,\
_clk_num, (_gate_flags) | TEGRA_PERIPH_NO_DIV,\
_clk_id, _parents##_idx, 0, _lock)
#define GATE(_name, _parent_name, \
_clk_num, _gate_flags, _clk_id, _flags) \
{ \
.name = _name, \
.clk_id = _clk_id, \
.p.parent_name = _parent_name, \
.periph = TEGRA_CLK_PERIPH(0, 0, 0, 0, 0, 0, 0, \
_clk_num, _gate_flags, 0, NULL), \
.flags = _flags \
}
#define PLLP_BASE 0xa0
#define PLLP_MISC 0xac
#define PLLP_OUTA 0xa4
#define PLLP_OUTB 0xa8
#define PLLP_OUTC 0x67c
#define PLL_BASE_LOCK BIT(27)
#define PLL_MISC_LOCK_ENABLE 18
static
DEFINE_SPINLOCK
(
PLLP_OUTA_lock
);
static
DEFINE_SPINLOCK
(
PLLP_OUTB_lock
);
static
DEFINE_SPINLOCK
(
PLLP_OUTC_lock
);
static
DEFINE_SPINLOCK
(
sor0_lock
);
#define MUX_I2S_SPDIF(_id) \
static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \
#_id, "pll_p",\
"clk_m"};
MUX_I2S_SPDIF
(
audio0
)
MUX_I2S_SPDIF
(
audio1
)
MUX_I2S_SPDIF
(
audio2
)
MUX_I2S_SPDIF
(
audio3
)
MUX_I2S_SPDIF
(
audio4
)
MUX_I2S_SPDIF
(
audio
)
#define mux_pllaout0_audio0_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio1_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio2_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio3_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio4_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio_2x_pllp_clkm_idx NULL
static
const
char
*
mux_pllp_pllc_pllm_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
,
"clk_m"
};
#define mux_pllp_pllc_pllm_clkm_idx NULL
static
const
char
*
mux_pllp_pllc_pllm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
#define mux_pllp_pllc_pllm_idx NULL
static
const
char
*
mux_pllp_pllc_clk32_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_32k"
,
"clk_m"
};
#define mux_pllp_pllc_clk32_clkm_idx NULL
static
const
char
*
mux_plla_pllc_pllp_clkm
[]
=
{
"pll_a_out0"
,
"pll_c"
,
"pll_p"
,
"clk_m"
};
#define mux_plla_pllc_pllp_clkm_idx mux_pllp_pllc_pllm_clkm_idx
static
const
char
*
mux_pllp_pllc2_c_c3_pllm_clkm
[]
=
{
"pll_p"
,
"pll_c2"
,
"pll_c"
,
"pll_c3"
,
"pll_m"
,
"clk_m"
};
static
u32
mux_pllp_pllc2_c_c3_pllm_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
2
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
6
,
};
static
const
char
*
mux_pllp_clkm
[]
=
{
"pll_p"
,
"clk_m"
};
static
u32
mux_pllp_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
3
,
};
static
const
char
*
mux_pllm_pllc2_c_c3_pllp_plla
[]
=
{
"pll_m"
,
"pll_c2"
,
"pll_c"
,
"pll_c3"
,
"pll_p"
,
"pll_a_out0"
};
#define mux_pllm_pllc2_c_c3_pllp_plla_idx mux_pllp_pllc2_c_c3_pllm_clkm_idx
static
const
char
*
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
[]
=
{
"pll_p"
,
"pll_m"
,
"pll_d_out0"
,
"pll_a_out0"
,
"pll_c"
,
"pll_d2_out0"
,
"clk_m"
};
#define mux_pllp_pllm_plld_plla_pllc_plld2_clkm_idx NULL
static
const
char
*
mux_pllm_pllc_pllp_plla
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"pll_a_out0"
};
#define mux_pllm_pllc_pllp_plla_idx mux_pllp_pllc_pllm_clkm_idx
static
const
char
*
mux_pllp_pllc_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
static
u32
mux_pllp_pllc_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
};
static
const
char
*
mux_pllp_pllc_clkm_clk32
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_m"
,
"clk_32k"
};
#define mux_pllp_pllc_clkm_clk32_idx NULL
static
const
char
*
mux_plla_clk32_pllp_clkm_plle
[]
=
{
"pll_a_out0"
,
"clk_32k"
,
"pll_p"
,
"clk_m"
,
"pll_e_out0"
};
#define mux_plla_clk32_pllp_clkm_plle_idx NULL
static
const
char
*
mux_clkm_pllp_pllc_pllre
[]
=
{
"clk_m"
,
"pll_p"
,
"pll_c"
,
"pll_re_out"
};
static
u32
mux_clkm_pllp_pllc_pllre_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
[
3
]
=
5
,
};
static
const
char
*
mux_clkm_48M_pllp_480M
[]
=
{
"clk_m"
,
"pll_u_48M"
,
"pll_p"
,
"pll_u_480M"
};
#define mux_clkm_48M_pllp_480M_idx NULL
static
const
char
*
mux_clkm_pllre_clk32_480M_pllc_ref
[]
=
{
"clk_m"
,
"pll_re_out"
,
"clk_32k"
,
"pll_u_480M"
,
"pll_c"
,
"pll_ref"
};
static
u32
mux_clkm_pllre_clk32_480M_pllc_ref_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
7
,
};
static
const
char
*
mux_d_audio_clk
[]
=
{
"pll_a_out0"
,
"pll_p"
,
"clk_m"
,
"spdif_in_sync"
,
"i2s0_sync"
,
"i2s1_sync"
,
"i2s2_sync"
,
"i2s3_sync"
,
"i2s4_sync"
,
"vimclk_sync"
,
};
static
u32
mux_d_audio_clk_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
0x8000
,
[
2
]
=
0xc000
,
[
3
]
=
0xE000
,
[
4
]
=
0xE001
,
[
5
]
=
0xE002
,
[
6
]
=
0xE003
,
[
7
]
=
0xE004
,
[
8
]
=
0xE005
,
[
9
]
=
0xE007
,
};
static
const
char
*
mux_pllp_plld_pllc_clkm
[]
=
{
"pll_p"
,
"pll_d_out0"
,
"pll_c"
,
"clk_m"
};
#define mux_pllp_plld_pllc_clkm_idx NULL
static
const
char
*
mux_pllm_pllc_pllp_plla_clkm_pllc4
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"pll_a_out0"
,
"clk_m"
,
"pll_c4"
,
};
static
u32
mux_pllm_pllc_pllp_plla_clkm_pllc4_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
[
3
]
=
3
,
[
4
]
=
6
,
[
5
]
=
7
,
};
static
const
char
*
mux_pllp_clkm1
[]
=
{
"pll_p"
,
"clk_m"
,
};
#define mux_pllp_clkm1_idx NULL
static
const
char
*
mux_pllp3_pllc_clkm
[]
=
{
"pll_p_out3"
,
"pll_c"
,
"pll_c2"
,
"clk_m"
,
};
#define mux_pllp3_pllc_clkm_idx NULL
static
const
char
*
mux_pllm_pllc_pllp_plla_pllc2_c3_clkm
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"pll_a"
,
"pll_c2"
,
"pll_c3"
,
"clk_m"
};
static
u32
mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
2
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
6
,
};
static
const
char
*
mux_pllm_pllc2_c_c3_pllp_plla_pllc4
[]
=
{
"pll_m"
,
"pll_c2"
,
"pll_c"
,
"pll_c3"
,
"pll_p"
,
"pll_a_out0"
,
"pll_c4"
,
};
static
u32
mux_pllm_pllc2_c_c3_pllp_plla_pllc4_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
2
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
6
,
[
6
]
=
7
,
};
static
const
char
*
mux_clkm_plldp_sor0lvds
[]
=
{
"clk_m"
,
"pll_dp"
,
"sor0_lvds"
,
};
#define mux_clkm_plldp_sor0lvds_idx NULL
static
struct
tegra_periph_init_data
periph_clks
[]
=
{
AUDIO
(
"d_audio"
,
CLK_SOURCE_D_AUDIO
,
106
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_d_audio
),
AUDIO
(
"dam0"
,
CLK_SOURCE_DAM0
,
108
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dam0
),
AUDIO
(
"dam1"
,
CLK_SOURCE_DAM1
,
109
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dam1
),
AUDIO
(
"dam2"
,
CLK_SOURCE_DAM2
,
110
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dam2
),
I2C
(
"i2c1"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C1
,
12
,
tegra_clk_i2c1
),
I2C
(
"i2c2"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C2
,
54
,
tegra_clk_i2c2
),
I2C
(
"i2c3"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C3
,
67
,
tegra_clk_i2c3
),
I2C
(
"i2c4"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C4
,
103
,
tegra_clk_i2c4
),
I2C
(
"i2c5"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C5
,
47
,
tegra_clk_i2c5
),
INT
(
"vde"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_VDE
,
61
,
0
,
tegra_clk_vde
),
INT
(
"vi"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_VI
,
20
,
0
,
tegra_clk_vi
),
INT
(
"epp"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_EPP
,
19
,
0
,
tegra_clk_epp
),
INT
(
"host1x"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_HOST1X
,
28
,
0
,
tegra_clk_host1x
),
INT
(
"mpe"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_MPE
,
60
,
0
,
tegra_clk_mpe
),
INT
(
"2d"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_2D
,
21
,
0
,
tegra_clk_gr2d
),
INT
(
"3d"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_3D
,
24
,
0
,
tegra_clk_gr3d
),
INT8
(
"vde"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_VDE
,
61
,
0
,
tegra_clk_vde_8
),
INT8
(
"vi"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_VI
,
20
,
0
,
tegra_clk_vi_8
),
INT8
(
"vi"
,
mux_pllm_pllc2_c_c3_pllp_plla_pllc4
,
CLK_SOURCE_VI
,
20
,
0
,
tegra_clk_vi_9
),
INT8
(
"epp"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_EPP
,
19
,
0
,
tegra_clk_epp_8
),
INT8
(
"msenc"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_MSENC
,
91
,
TEGRA_PERIPH_WAR_1005168
,
tegra_clk_msenc
),
INT8
(
"tsec"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_TSEC
,
83
,
0
,
tegra_clk_tsec
),
INT8
(
"host1x"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_HOST1X
,
28
,
0
,
tegra_clk_host1x_8
),
INT8
(
"se"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SE
,
127
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_se
),
INT8
(
"2d"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_2D
,
21
,
0
,
tegra_clk_gr2d_8
),
INT8
(
"3d"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_3D
,
24
,
0
,
tegra_clk_gr3d_8
),
INT8
(
"vic03"
,
mux_pllm_pllc_pllp_plla_pllc2_c3_clkm
,
CLK_SOURCE_VIC03
,
178
,
0
,
tegra_clk_vic03
),
INT_FLAGS
(
"mselect"
,
mux_pllp_clkm
,
CLK_SOURCE_MSELECT
,
99
,
0
,
tegra_clk_mselect
,
CLK_IGNORE_UNUSED
),
MUX
(
"i2s0"
,
mux_pllaout0_audio0_2x_pllp_clkm
,
CLK_SOURCE_I2S0
,
30
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2s0
),
MUX
(
"i2s1"
,
mux_pllaout0_audio1_2x_pllp_clkm
,
CLK_SOURCE_I2S1
,
11
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2s1
),
MUX
(
"i2s2"
,
mux_pllaout0_audio2_2x_pllp_clkm
,
CLK_SOURCE_I2S2
,
18
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2s2
),
MUX
(
"i2s3"
,
mux_pllaout0_audio3_2x_pllp_clkm
,
CLK_SOURCE_I2S3
,
101
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2s3
),
MUX
(
"i2s4"
,
mux_pllaout0_audio4_2x_pllp_clkm
,
CLK_SOURCE_I2S4
,
102
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2s4
),
MUX
(
"spdif_out"
,
mux_pllaout0_audio_2x_pllp_clkm
,
CLK_SOURCE_SPDIF_OUT
,
10
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_spdif_out
),
MUX
(
"spdif_in"
,
mux_pllp_pllc_pllm
,
CLK_SOURCE_SPDIF_IN
,
10
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_spdif_in
),
MUX
(
"pwm"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_PWM
,
17
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_pwm
),
MUX
(
"adx"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_ADX
,
154
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_adx
),
MUX
(
"amx"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_AMX
,
153
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_amx
),
MUX
(
"hda"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_HDA
,
125
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_hda
),
MUX
(
"hda2codec_2x"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_HDA2CODEC_2X
,
111
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_hda2codec_2x
),
MUX
(
"vfir"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_VFIR
,
7
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_vfir
),
MUX
(
"sdmmc1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC1
,
14
,
0
,
tegra_clk_sdmmc1
),
MUX
(
"sdmmc2"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC2
,
9
,
0
,
tegra_clk_sdmmc2
),
MUX
(
"sdmmc3"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC3
,
69
,
0
,
tegra_clk_sdmmc3
),
MUX
(
"sdmmc4"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC4
,
15
,
0
,
tegra_clk_sdmmc4
),
MUX
(
"la"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_LA
,
76
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_la
),
MUX
(
"trace"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_TRACE
,
77
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_trace
),
MUX
(
"owr"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_OWR
,
71
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_owr
),
MUX
(
"nor"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_NOR
,
42
,
0
,
tegra_clk_nor
),
MUX
(
"mipi"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_MIPI
,
50
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_mipi
),
MUX
(
"vi_sensor"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_VI_SENSOR
,
20
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_vi_sensor
),
MUX
(
"cilab"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILAB
,
144
,
0
,
tegra_clk_cilab
),
MUX
(
"cilcd"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILCD
,
145
,
0
,
tegra_clk_cilcd
),
MUX
(
"cile"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILE
,
146
,
0
,
tegra_clk_cile
),
MUX
(
"dsialp"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_DSIALP
,
147
,
0
,
tegra_clk_dsialp
),
MUX
(
"dsiblp"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_DSIBLP
,
148
,
0
,
tegra_clk_dsiblp
),
MUX
(
"tsensor"
,
mux_pllp_pllc_clkm_clk32
,
CLK_SOURCE_TSENSOR
,
100
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_tsensor
),
MUX
(
"actmon"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_ACTMON
,
119
,
0
,
tegra_clk_actmon
),
MUX
(
"dfll_ref"
,
mux_pllp_clkm
,
CLK_SOURCE_DFLL_REF
,
155
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dfll_ref
),
MUX
(
"dfll_soc"
,
mux_pllp_clkm
,
CLK_SOURCE_DFLL_SOC
,
155
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dfll_soc
),
MUX
(
"i2cslow"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_I2CSLOW
,
81
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_i2cslow
),
MUX
(
"sbc1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC1
,
41
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc1
),
MUX
(
"sbc2"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC2
,
44
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc2
),
MUX
(
"sbc3"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC3
,
46
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc3
),
MUX
(
"sbc4"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC4
,
68
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc4
),
MUX
(
"sbc5"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC5
,
104
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc5
),
MUX
(
"sbc6"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC6
,
105
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc6
),
MUX
(
"cve"
,
mux_pllp_plld_pllc_clkm
,
CLK_SOURCE_CVE
,
49
,
0
,
tegra_clk_cve
),
MUX
(
"tvo"
,
mux_pllp_plld_pllc_clkm
,
CLK_SOURCE_TVO
,
49
,
0
,
tegra_clk_tvo
),
MUX
(
"tvdac"
,
mux_pllp_plld_pllc_clkm
,
CLK_SOURCE_TVDAC
,
53
,
0
,
tegra_clk_tvdac
),
MUX
(
"ndflash"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_NDFLASH
,
13
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_ndflash
),
MUX
(
"ndspeed"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_NDSPEED
,
80
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_ndspeed
),
MUX
(
"sata_oob"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SATA_OOB
,
123
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sata_oob
),
MUX
(
"sata"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SATA
,
124
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sata
),
MUX
(
"adx1"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_ADX1
,
180
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_adx1
),
MUX
(
"amx1"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_AMX1
,
185
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_amx1
),
MUX
(
"vi_sensor2"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_VI_SENSOR2
,
20
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_vi_sensor2
),
MUX8
(
"sbc1"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC1
,
41
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc1_8
),
MUX8
(
"sbc2"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC2
,
44
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc2_8
),
MUX8
(
"sbc3"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC3
,
46
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc3_8
),
MUX8
(
"sbc4"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC4
,
68
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc4_8
),
MUX8
(
"sbc5"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC5
,
104
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc5_8
),
MUX8
(
"sbc6"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SBC6
,
105
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sbc6_8
),
MUX8
(
"ndflash"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_NDFLASH
,
13
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_ndflash_8
),
MUX8
(
"ndspeed"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_NDSPEED
,
80
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_ndspeed_8
),
MUX8
(
"hdmi"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_HDMI
,
51
,
0
,
tegra_clk_hdmi
),
MUX8
(
"extern1"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN1
,
120
,
0
,
tegra_clk_extern1
),
MUX8
(
"extern2"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN2
,
121
,
0
,
tegra_clk_extern2
),
MUX8
(
"extern3"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN3
,
122
,
0
,
tegra_clk_extern3
),
MUX8
(
"soc_therm"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_SOC_THERM
,
78
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_soc_therm
),
MUX8
(
"vi_sensor"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_VI_SENSOR
,
20
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_vi_sensor_8
),
MUX8
(
"isp"
,
mux_pllm_pllc_pllp_plla_clkm_pllc4
,
CLK_SOURCE_ISP
,
23
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_isp_8
),
MUX8
(
"entropy"
,
mux_pllp_clkm1
,
CLK_SOURCE_ENTROPY
,
149
,
0
,
tegra_clk_entropy
),
MUX8
(
"hdmi_audio"
,
mux_pllp3_pllc_clkm
,
CLK_SOURCE_HDMI_AUDIO
,
176
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_hdmi_audio
),
MUX8
(
"clk72mhz"
,
mux_pllp3_pllc_clkm
,
CLK_SOURCE_CLK72MHZ
,
177
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_clk72Mhz
),
MUX8_NOGATE_LOCK
(
"sor0_lvds"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_SOR0
,
tegra_clk_sor0_lvds
,
&
sor0_lock
),
MUX_FLAGS
(
"csite"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_CSITE
,
73
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_csite
,
CLK_IGNORE_UNUSED
),
NODIV
(
"disp1"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_DISP1
,
29
,
7
,
27
,
0
,
tegra_clk_disp1
,
NULL
),
NODIV
(
"disp2"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_DISP2
,
29
,
7
,
26
,
0
,
tegra_clk_disp2
,
NULL
),
NODIV
(
"sor0"
,
mux_clkm_plldp_sor0lvds
,
CLK_SOURCE_SOR0
,
14
,
3
,
182
,
0
,
tegra_clk_sor0
,
&
sor0_lock
),
UART
(
"uarta"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTA
,
6
,
tegra_clk_uarta
),
UART
(
"uartb"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTB
,
7
,
tegra_clk_uartb
),
UART
(
"uartc"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTC
,
55
,
tegra_clk_uartc
),
UART
(
"uartd"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTD
,
65
,
tegra_clk_uartd
),
UART
(
"uarte"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTE
,
65
,
tegra_clk_uarte
),
XUSB
(
"xusb_host_src"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_HOST_SRC
,
143
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
tegra_clk_xusb_host_src
),
XUSB
(
"xusb_falcon_src"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_FALCON_SRC
,
143
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_xusb_falcon_src
),
XUSB
(
"xusb_fs_src"
,
mux_clkm_48M_pllp_480M
,
CLK_SOURCE_XUSB_FS_SRC
,
143
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_xusb_fs_src
),
XUSB
(
"xusb_ss_src"
,
mux_clkm_pllre_clk32_480M_pllc_ref
,
CLK_SOURCE_XUSB_SS_SRC
,
143
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_xusb_ss_src
),
XUSB
(
"xusb_dev_src"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_DEV_SRC
,
95
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
tegra_clk_xusb_dev_src
),
};
static
struct
tegra_periph_init_data
gate_clks
[]
=
{
GATE
(
"rtc"
,
"clk_32k"
,
4
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
tegra_clk_rtc
,
0
),
GATE
(
"timer"
,
"clk_m"
,
5
,
0
,
tegra_clk_timer
,
0
),
GATE
(
"isp"
,
"clk_m"
,
23
,
0
,
tegra_clk_isp
,
0
),
GATE
(
"vcp"
,
"clk_m"
,
29
,
0
,
tegra_clk_vcp
,
0
),
GATE
(
"apbdma"
,
"clk_m"
,
34
,
0
,
tegra_clk_apbdma
,
0
),
GATE
(
"kbc"
,
"clk_32k"
,
36
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
tegra_clk_kbc
,
0
),
GATE
(
"fuse"
,
"clk_m"
,
39
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_fuse
,
0
),
GATE
(
"fuse_burn"
,
"clk_m"
,
39
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_fuse_burn
,
0
),
GATE
(
"kfuse"
,
"clk_m"
,
40
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_kfuse
,
0
),
GATE
(
"apbif"
,
"clk_m"
,
107
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_apbif
,
0
),
GATE
(
"hda2hdmi"
,
"clk_m"
,
128
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_hda2hdmi
,
0
),
GATE
(
"bsea"
,
"clk_m"
,
62
,
0
,
tegra_clk_bsea
,
0
),
GATE
(
"bsev"
,
"clk_m"
,
63
,
0
,
tegra_clk_bsev
,
0
),
GATE
(
"mipi-cal"
,
"clk_m"
,
56
,
0
,
tegra_clk_mipi_cal
,
0
),
GATE
(
"usbd"
,
"clk_m"
,
22
,
0
,
tegra_clk_usbd
,
0
),
GATE
(
"usb2"
,
"clk_m"
,
58
,
0
,
tegra_clk_usb2
,
0
),
GATE
(
"usb3"
,
"clk_m"
,
59
,
0
,
tegra_clk_usb3
,
0
),
GATE
(
"csi"
,
"pll_p_out3"
,
52
,
0
,
tegra_clk_csi
,
0
),
GATE
(
"afi"
,
"clk_m"
,
72
,
0
,
tegra_clk_afi
,
0
),
GATE
(
"csus"
,
"clk_m"
,
92
,
TEGRA_PERIPH_NO_RESET
,
tegra_clk_csus
,
0
),
GATE
(
"dds"
,
"clk_m"
,
150
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dds
,
0
),
GATE
(
"dp2"
,
"clk_m"
,
152
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dp2
,
0
),
GATE
(
"dtv"
,
"clk_m"
,
79
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_dtv
,
0
),
GATE
(
"xusb_host"
,
"xusb_host_src"
,
89
,
0
,
tegra_clk_xusb_host
,
0
),
GATE
(
"xusb_ss"
,
"xusb_ss_src"
,
156
,
0
,
tegra_clk_xusb_ss
,
0
),
GATE
(
"xusb_dev"
,
"xusb_dev_src"
,
95
,
0
,
tegra_clk_xusb_dev
,
0
),
GATE
(
"dsia"
,
"dsia_mux"
,
48
,
0
,
tegra_clk_dsia
,
0
),
GATE
(
"dsib"
,
"dsib_mux"
,
82
,
0
,
tegra_clk_dsib
,
0
),
GATE
(
"emc"
,
"emc_mux"
,
57
,
0
,
tegra_clk_emc
,
CLK_IGNORE_UNUSED
),
GATE
(
"sata_cold"
,
"clk_m"
,
129
,
TEGRA_PERIPH_ON_APB
,
tegra_clk_sata_cold
,
0
),
GATE
(
"ispb"
,
"clk_m"
,
3
,
0
,
tegra_clk_ispb
,
0
),
GATE
(
"vim2_clk"
,
"clk_m"
,
11
,
0
,
tegra_clk_vim2_clk
,
0
),
GATE
(
"pcie"
,
"clk_m"
,
70
,
0
,
tegra_clk_pcie
,
0
),
GATE
(
"dpaux"
,
"clk_m"
,
181
,
0
,
tegra_clk_dpaux
,
0
),
GATE
(
"gpu"
,
"pll_ref"
,
184
,
0
,
tegra_clk_gpu
,
0
),
};
struct
pll_out_data
{
char
*
div_name
;
char
*
pll_out_name
;
u32
offset
;
int
clk_id
;
u8
div_shift
;
u8
div_flags
;
u8
rst_shift
;
spinlock_t
*
lock
;
};
#define PLL_OUT(_num, _offset, _div_shift, _div_flags, _rst_shift, _id) \
{\
.div_name = "pll_p_out" #_num "_div",\
.pll_out_name = "pll_p_out" #_num,\
.offset = _offset,\
.div_shift = _div_shift,\
.div_flags = _div_flags | TEGRA_DIVIDER_FIXED |\
TEGRA_DIVIDER_ROUND_UP,\
.rst_shift = _rst_shift,\
.clk_id = tegra_clk_ ## _id,\
.lock = &_offset ##_lock,\
}
static
struct
pll_out_data
pllp_out_clks
[]
=
{
PLL_OUT
(
1
,
PLLP_OUTA
,
8
,
0
,
0
,
pll_p_out1
),
PLL_OUT
(
2
,
PLLP_OUTA
,
24
,
0
,
16
,
pll_p_out2
),
PLL_OUT
(
2
,
PLLP_OUTA
,
24
,
TEGRA_DIVIDER_INT
,
16
,
pll_p_out2_int
),
PLL_OUT
(
3
,
PLLP_OUTB
,
8
,
0
,
0
,
pll_p_out3
),
PLL_OUT
(
4
,
PLLP_OUTB
,
24
,
0
,
16
,
pll_p_out4
),
PLL_OUT
(
5
,
PLLP_OUTC
,
24
,
0
,
16
,
pll_p_out5
),
};
static
void
__init
periph_clk_init
(
void
__iomem
*
clk_base
,
struct
tegra_clk
*
tegra_clks
)
{
int
i
;
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
periph_clks
);
i
++
)
{
struct
tegra_clk_periph_regs
*
bank
;
struct
tegra_periph_init_data
*
data
;
data
=
periph_clks
+
i
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
bank
=
get_reg_bank
(
data
->
periph
.
gate
.
clk_num
);
if
(
!
bank
)
continue
;
data
->
periph
.
gate
.
regs
=
bank
;
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
p
.
parent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
,
data
->
flags
);
*
dt_clk
=
clk
;
}
}
static
void
__init
gate_clk_init
(
void
__iomem
*
clk_base
,
struct
tegra_clk
*
tegra_clks
)
{
int
i
;
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
gate_clks
);
i
++
)
{
struct
tegra_periph_init_data
*
data
;
data
=
gate_clks
+
i
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
tegra_clk_register_periph_gate
(
data
->
name
,
data
->
p
.
parent_name
,
data
->
periph
.
gate
.
flags
,
clk_base
,
data
->
flags
,
data
->
periph
.
gate
.
clk_num
,
periph_clk_enb_refcnt
);
*
dt_clk
=
clk
;
}
}
static
void
__init
init_pllp
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_params
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
int
i
;
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_p
,
tegra_clks
);
if
(
dt_clk
)
{
/* PLLP */
clk
=
tegra_clk_register_pll
(
"pll_p"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
pll_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_p"
,
NULL
);
*
dt_clk
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pllp_out_clks
);
i
++
)
{
struct
pll_out_data
*
data
;
data
=
pllp_out_clks
+
i
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
clk_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
tegra_clk_register_divider
(
data
->
div_name
,
"pll_p"
,
clk_base
+
data
->
offset
,
0
,
data
->
div_flags
,
data
->
div_shift
,
8
,
1
,
data
->
lock
);
clk
=
tegra_clk_register_pll_out
(
data
->
pll_out_name
,
data
->
div_name
,
clk_base
+
data
->
offset
,
data
->
rst_shift
+
1
,
data
->
rst_shift
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
data
->
lock
);
*
dt_clk
=
clk
;
}
}
void
__init
tegra_periph_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_params
)
{
init_pllp
(
clk_base
,
pmc_base
,
tegra_clks
,
pll_params
);
periph_clk_init
(
clk_base
,
tegra_clks
);
gate_clk_init
(
clk_base
,
tegra_clks
);
}
drivers/clk/tegra/clk-tegra-pmc.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include "clk.h"
#include "clk-id.h"
#define PMC_CLK_OUT_CNTRL 0x1a8
#define PMC_DPD_PADS_ORIDE 0x1c
#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
#define PMC_CTRL 0
#define PMC_CTRL_BLINK_ENB 7
#define PMC_BLINK_TIMER 0x40
struct
pmc_clk_init_data
{
char
*
mux_name
;
char
*
gate_name
;
const
char
**
parents
;
int
num_parents
;
int
mux_id
;
int
gate_id
;
char
*
dev_name
;
u8
mux_shift
;
u8
gate_shift
;
};
#define PMC_CLK(_num, _mux_shift, _gate_shift)\
{\
.mux_name = "clk_out_" #_num "_mux",\
.gate_name = "clk_out_" #_num,\
.parents = clk_out ##_num ##_parents,\
.num_parents = ARRAY_SIZE(clk_out ##_num ##_parents),\
.mux_id = tegra_clk_clk_out_ ##_num ##_mux,\
.gate_id = tegra_clk_clk_out_ ##_num,\
.dev_name = "extern" #_num,\
.mux_shift = _mux_shift,\
.gate_shift = _gate_shift,\
}
static
DEFINE_SPINLOCK
(
clk_out_lock
);
static
const
char
*
clk_out1_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern1"
,
};
static
const
char
*
clk_out2_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern2"
,
};
static
const
char
*
clk_out3_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern3"
,
};
static
struct
pmc_clk_init_data
pmc_clks
[]
=
{
PMC_CLK
(
1
,
6
,
2
),
PMC_CLK
(
2
,
14
,
10
),
PMC_CLK
(
3
,
22
,
18
),
};
void
__init
tegra_pmc_clk_init
(
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pmc_clks
);
i
++
)
{
struct
pmc_clk_init_data
*
data
;
data
=
pmc_clks
+
i
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
mux_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
clk_register_mux
(
NULL
,
data
->
mux_name
,
data
->
parents
,
data
->
num_parents
,
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
data
->
mux_shift
,
3
,
0
,
&
clk_out_lock
);
*
dt_clk
=
clk
;
dt_clk
=
tegra_lookup_dt_id
(
data
->
gate_id
,
tegra_clks
);
if
(
!
dt_clk
)
continue
;
clk
=
clk_register_gate
(
NULL
,
data
->
gate_name
,
data
->
mux_name
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
data
->
gate_shift
,
0
,
&
clk_out_lock
);
*
dt_clk
=
clk
;
clk_register_clkdev
(
clk
,
data
->
dev_name
,
data
->
gate_name
);
}
/* blink */
writel_relaxed
(
0
,
pmc_base
+
PMC_BLINK_TIMER
);
clk
=
clk_register_gate
(
NULL
,
"blink_override"
,
"clk_32k"
,
0
,
pmc_base
+
PMC_DPD_PADS_ORIDE
,
PMC_DPD_PADS_ORIDE_BLINK_ENB
,
0
,
NULL
);
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_blink
,
tegra_clks
);
if
(
!
dt_clk
)
return
;
clk
=
clk_register_gate
(
NULL
,
"blink"
,
"blink_override"
,
0
,
pmc_base
+
PMC_CTRL
,
PMC_CTRL_BLINK_ENB
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"blink"
,
NULL
);
*
dt_clk
=
clk
;
}
drivers/clk/tegra/clk-tegra-super-gen4.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include "clk.h"
#include "clk-id.h"
#define PLLX_BASE 0xe0
#define PLLX_MISC 0xe4
#define PLLX_MISC2 0x514
#define PLLX_MISC3 0x518
#define CCLKG_BURST_POLICY 0x368
#define CCLKLP_BURST_POLICY 0x370
#define SCLK_BURST_POLICY 0x028
#define SYSTEM_CLK_RATE 0x030
static
DEFINE_SPINLOCK
(
sysrate_lock
);
static
const
char
*
sclk_parents
[]
=
{
"clk_m"
,
"pll_c_out1"
,
"pll_p_out4"
,
"pll_p"
,
"pll_p_out2"
,
"unused"
,
"clk_32k"
,
"pll_m_out1"
};
static
const
char
*
cclk_g_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
"pll_p"
,
"pll_p_out4"
,
"unused"
,
"unused"
,
"pll_x"
};
static
const
char
*
cclk_lp_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
"pll_p"
,
"pll_p_out4"
,
"unused"
,
"unused"
,
"pll_x"
,
"pll_x_out0"
};
static
void
__init
tegra_sclk_init
(
void
__iomem
*
clk_base
,
struct
tegra_clk
*
tegra_clks
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
/* SCLK */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_sclk
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
tegra_clk_register_super_mux
(
"sclk"
,
sclk_parents
,
ARRAY_SIZE
(
sclk_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
SCLK_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
*
dt_clk
=
clk
;
}
/* HCLK */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_hclk
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
clk_register_divider
(
NULL
,
"hclk_div"
,
"sclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
4
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"hclk"
,
"hclk_div"
,
CLK_SET_RATE_PARENT
|
CLK_IGNORE_UNUSED
,
clk_base
+
SYSTEM_CLK_RATE
,
7
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
*
dt_clk
=
clk
;
}
/* PCLK */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pclk
,
tegra_clks
);
if
(
!
dt_clk
)
return
;
clk
=
clk_register_divider
(
NULL
,
"pclk_div"
,
"hclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
0
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"pclk"
,
"pclk_div"
,
CLK_SET_RATE_PARENT
|
CLK_IGNORE_UNUSED
,
clk_base
+
SYSTEM_CLK_RATE
,
3
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
*
dt_clk
=
clk
;
}
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
)
{
struct
clk
*
clk
;
struct
clk
**
dt_clk
;
/* CCLKG */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_cclk_g
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
tegra_clk_register_super_mux
(
"cclk_g"
,
cclk_g_parents
,
ARRAY_SIZE
(
cclk_g_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
CCLKG_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
*
dt_clk
=
clk
;
}
/* CCLKLP */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_cclk_lp
,
tegra_clks
);
if
(
dt_clk
)
{
clk
=
tegra_clk_register_super_mux
(
"cclk_lp"
,
cclk_lp_parents
,
ARRAY_SIZE
(
cclk_lp_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
CCLKLP_BURST_POLICY
,
0
,
4
,
8
,
9
,
NULL
);
*
dt_clk
=
clk
;
}
tegra_sclk_init
(
clk_base
,
tegra_clks
);
#if defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC)
/* PLLX */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_x
,
tegra_clks
);
if
(
!
dt_clk
)
return
;
clk
=
tegra_clk_register_pllxc
(
"pll_x"
,
"pll_ref"
,
clk_base
,
pmc_base
,
CLK_IGNORE_UNUSED
,
params
,
NULL
);
*
dt_clk
=
clk
;
/* PLLX_OUT0 */
dt_clk
=
tegra_lookup_dt_id
(
tegra_clk_pll_x_out0
,
tegra_clks
);
if
(
!
dt_clk
)
return
;
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_x_out0"
,
"pll_x"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
*
dt_clk
=
clk
;
#endif
}
drivers/clk/tegra/clk-tegra114.c
View file @
e9827d9b
...
...
@@ -23,30 +23,15 @@
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include <dt-bindings/clock/tegra114-car.h>
#include "clk.h"
#include "clk-id.h"
#define RST_DEVICES_L 0x004
#define RST_DEVICES_H 0x008
#define RST_DEVICES_U 0x00C
#define RST_DFLL_DVCO 0x2F4
#define RST_DEVICES_V 0x358
#define RST_DEVICES_W 0x35C
#define RST_DEVICES_X 0x28C
#define RST_DEVICES_SET_L 0x300
#define RST_DEVICES_CLR_L 0x304
#define RST_DEVICES_SET_H 0x308
#define RST_DEVICES_CLR_H 0x30c
#define RST_DEVICES_SET_U 0x310
#define RST_DEVICES_CLR_U 0x314
#define RST_DEVICES_SET_V 0x430
#define RST_DEVICES_CLR_V 0x434
#define RST_DEVICES_SET_W 0x438
#define RST_DEVICES_CLR_W 0x43c
#define CPU_FINETRIM_SELECT 0x4d4
/* override default prop dlys */
#define CPU_FINETRIM_DR 0x4d8
/* rise->rise prop dly A */
#define CPU_FINETRIM_R 0x4e4
/* rise->rise prop dly inc A */
#define RST_DEVICES_NUM 5
/* RST_DFLL_DVCO bitfields */
#define DVFS_DFLL_RESET_SHIFT 0
...
...
@@ -73,25 +58,7 @@
#define CPU_FINETRIM_R_FCPU_6_SHIFT 10
/* ftop */
#define CPU_FINETRIM_R_FCPU_6_MASK (0x3 << CPU_FINETRIM_R_FCPU_6_SHIFT)
#define CLK_OUT_ENB_L 0x010
#define CLK_OUT_ENB_H 0x014
#define CLK_OUT_ENB_U 0x018
#define CLK_OUT_ENB_V 0x360
#define CLK_OUT_ENB_W 0x364
#define CLK_OUT_ENB_X 0x280
#define CLK_OUT_ENB_SET_L 0x320
#define CLK_OUT_ENB_CLR_L 0x324
#define CLK_OUT_ENB_SET_H 0x328
#define CLK_OUT_ENB_CLR_H 0x32c
#define CLK_OUT_ENB_SET_U 0x330
#define CLK_OUT_ENB_CLR_U 0x334
#define CLK_OUT_ENB_SET_V 0x440
#define CLK_OUT_ENB_CLR_V 0x444
#define CLK_OUT_ENB_SET_W 0x448
#define CLK_OUT_ENB_CLR_W 0x44c
#define CLK_OUT_ENB_SET_X 0x284
#define CLK_OUT_ENB_CLR_X 0x288
#define CLK_OUT_ENB_NUM 6
#define TEGRA114_CLK_PERIPH_BANKS 5
#define PLLC_BASE 0x80
#define PLLC_MISC2 0x88
...
...
@@ -139,25 +106,6 @@
#define PLLE_AUX 0x48c
#define PLLC_OUT 0x84
#define PLLM_OUT 0x94
#define PLLP_OUTA 0xa4
#define PLLP_OUTB 0xa8
#define PLLA_OUT 0xb4
#define AUDIO_SYNC_CLK_I2S0 0x4a0
#define AUDIO_SYNC_CLK_I2S1 0x4a4
#define AUDIO_SYNC_CLK_I2S2 0x4a8
#define AUDIO_SYNC_CLK_I2S3 0x4ac
#define AUDIO_SYNC_CLK_I2S4 0x4b0
#define AUDIO_SYNC_CLK_SPDIF 0x4b4
#define AUDIO_SYNC_DOUBLER 0x49c
#define PMC_CLK_OUT_CNTRL 0x1a8
#define PMC_DPD_PADS_ORIDE 0x1c
#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
#define PMC_CTRL 0
#define PMC_CTRL_BLINK_ENB 7
#define PMC_BLINK_TIMER 0x40
#define OSC_CTRL 0x50
#define OSC_CTRL_OSC_FREQ_SHIFT 28
...
...
@@ -166,9 +114,6 @@
#define PLLXC_SW_MAX_P 6
#define CCLKG_BURST_POLICY 0x368
#define CCLKLP_BURST_POLICY 0x370
#define SCLK_BURST_POLICY 0x028
#define SYSTEM_CLK_RATE 0x030
#define UTMIP_PLL_CFG2 0x488
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6)
...
...
@@ -196,91 +141,8 @@
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
#define CLK_SOURCE_I2S0 0x1d8
#define CLK_SOURCE_I2S1 0x100
#define CLK_SOURCE_I2S2 0x104
#define CLK_SOURCE_NDFLASH 0x160
#define CLK_SOURCE_I2S3 0x3bc
#define CLK_SOURCE_I2S4 0x3c0
#define CLK_SOURCE_SPDIF_OUT 0x108
#define CLK_SOURCE_SPDIF_IN 0x10c
#define CLK_SOURCE_PWM 0x110
#define CLK_SOURCE_ADX 0x638
#define CLK_SOURCE_AMX 0x63c
#define CLK_SOURCE_HDA 0x428
#define CLK_SOURCE_HDA2CODEC_2X 0x3e4
#define CLK_SOURCE_SBC1 0x134
#define CLK_SOURCE_SBC2 0x118
#define CLK_SOURCE_SBC3 0x11c
#define CLK_SOURCE_SBC4 0x1b4
#define CLK_SOURCE_SBC5 0x3c8
#define CLK_SOURCE_SBC6 0x3cc
#define CLK_SOURCE_SATA_OOB 0x420
#define CLK_SOURCE_SATA 0x424
#define CLK_SOURCE_NDSPEED 0x3f8
#define CLK_SOURCE_VFIR 0x168
#define CLK_SOURCE_SDMMC1 0x150
#define CLK_SOURCE_SDMMC2 0x154
#define CLK_SOURCE_SDMMC3 0x1bc
#define CLK_SOURCE_SDMMC4 0x164
#define CLK_SOURCE_VDE 0x1c8
#define CLK_SOURCE_CSITE 0x1d4
#define CLK_SOURCE_LA 0x1f8
#define CLK_SOURCE_TRACE 0x634
#define CLK_SOURCE_OWR 0x1cc
#define CLK_SOURCE_NOR 0x1d0
#define CLK_SOURCE_MIPI 0x174
#define CLK_SOURCE_I2C1 0x124
#define CLK_SOURCE_I2C2 0x198
#define CLK_SOURCE_I2C3 0x1b8
#define CLK_SOURCE_I2C4 0x3c4
#define CLK_SOURCE_I2C5 0x128
#define CLK_SOURCE_UARTA 0x178
#define CLK_SOURCE_UARTB 0x17c
#define CLK_SOURCE_UARTC 0x1a0
#define CLK_SOURCE_UARTD 0x1c0
#define CLK_SOURCE_UARTE 0x1c4
#define CLK_SOURCE_UARTA_DBG 0x178
#define CLK_SOURCE_UARTB_DBG 0x17c
#define CLK_SOURCE_UARTC_DBG 0x1a0
#define CLK_SOURCE_UARTD_DBG 0x1c0
#define CLK_SOURCE_UARTE_DBG 0x1c4
#define CLK_SOURCE_3D 0x158
#define CLK_SOURCE_2D 0x15c
#define CLK_SOURCE_VI_SENSOR 0x1a8
#define CLK_SOURCE_VI 0x148
#define CLK_SOURCE_EPP 0x16c
#define CLK_SOURCE_MSENC 0x1f0
#define CLK_SOURCE_TSEC 0x1f4
#define CLK_SOURCE_HOST1X 0x180
#define CLK_SOURCE_HDMI 0x18c
#define CLK_SOURCE_DISP1 0x138
#define CLK_SOURCE_DISP2 0x13c
#define CLK_SOURCE_CILAB 0x614
#define CLK_SOURCE_CILCD 0x618
#define CLK_SOURCE_CILE 0x61c
#define CLK_SOURCE_DSIALP 0x620
#define CLK_SOURCE_DSIBLP 0x624
#define CLK_SOURCE_TSENSOR 0x3b8
#define CLK_SOURCE_D_AUDIO 0x3d0
#define CLK_SOURCE_DAM0 0x3d8
#define CLK_SOURCE_DAM1 0x3dc
#define CLK_SOURCE_DAM2 0x3e0
#define CLK_SOURCE_ACTMON 0x3e8
#define CLK_SOURCE_EXTERN1 0x3ec
#define CLK_SOURCE_EXTERN2 0x3f0
#define CLK_SOURCE_EXTERN3 0x3f4
#define CLK_SOURCE_I2CSLOW 0x3fc
#define CLK_SOURCE_SE 0x42c
#define CLK_SOURCE_MSELECT 0x3b4
#define CLK_SOURCE_DFLL_REF 0x62c
#define CLK_SOURCE_DFLL_SOC 0x630
#define CLK_SOURCE_SOC_THERM 0x644
#define CLK_SOURCE_XUSB_HOST_SRC 0x600
#define CLK_SOURCE_XUSB_FALCON_SRC 0x604
#define CLK_SOURCE_XUSB_FS_SRC 0x608
#define CLK_SOURCE_XUSB_SS_SRC 0x610
#define CLK_SOURCE_XUSB_DEV_SRC 0x60c
#define CLK_SOURCE_EMC 0x19c
/* PLLM override registers */
...
...
@@ -298,19 +160,13 @@ static struct cpu_clk_suspend_context {
}
tegra114_cpu_clk_sctx
;
#endif
static
int
periph_clk_enb_refcnt
[
CLK_OUT_ENB_NUM
*
32
];
static
void
__iomem
*
clk_base
;
static
void
__iomem
*
pmc_base
;
static
DEFINE_SPINLOCK
(
pll_d_lock
);
static
DEFINE_SPINLOCK
(
pll_d2_lock
);
static
DEFINE_SPINLOCK
(
pll_u_lock
);
static
DEFINE_SPINLOCK
(
pll_div_lock
);
static
DEFINE_SPINLOCK
(
pll_re_lock
);
static
DEFINE_SPINLOCK
(
clk_doubler_lock
);
static
DEFINE_SPINLOCK
(
clk_out_lock
);
static
DEFINE_SPINLOCK
(
sysrate_lock
);
static
struct
div_nmp
pllxc_nmp
=
{
.
divm_shift
=
0
,
...
...
@@ -370,6 +226,8 @@ static struct tegra_clk_pll_params pll_c_params = {
.
stepb_shift
=
9
,
.
pdiv_tohw
=
pllxc_p
,
.
div_nmp
=
&
pllxc_nmp
,
.
freq_table
=
pll_c_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllcx_nmp
=
{
...
...
@@ -417,6 +275,8 @@ static struct tegra_clk_pll_params pll_c2_params = {
.
ext_misc_reg
[
0
]
=
0x4f0
,
.
ext_misc_reg
[
1
]
=
0x4f4
,
.
ext_misc_reg
[
2
]
=
0x4f8
,
.
freq_table
=
pll_cx_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_c3_params
=
{
...
...
@@ -437,6 +297,8 @@ static struct tegra_clk_pll_params pll_c3_params = {
.
ext_misc_reg
[
0
]
=
0x504
,
.
ext_misc_reg
[
1
]
=
0x508
,
.
ext_misc_reg
[
2
]
=
0x50c
,
.
freq_table
=
pll_cx_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllm_nmp
=
{
...
...
@@ -483,6 +345,8 @@ static struct tegra_clk_pll_params pll_m_params = {
.
div_nmp
=
&
pllm_nmp
,
.
pmc_divnm_reg
=
PMC_PLLM_WB0_OVERRIDE
,
.
pmc_divp_reg
=
PMC_PLLM_WB0_OVERRIDE_2
,
.
freq_table
=
pll_m_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllp_nmp
=
{
...
...
@@ -516,6 +380,9 @@ static struct tegra_clk_pll_params pll_p_params = {
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_p_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
|
TEGRA_PLL_USE_LOCK
,
.
fixed_rate
=
408000000
,
};
static
struct
tegra_clk_pll_freq_table
pll_a_freq_table
[]
=
{
...
...
@@ -543,6 +410,8 @@ static struct tegra_clk_pll_params pll_a_params = {
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_a_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_d_freq_table
[]
=
{
...
...
@@ -579,6 +448,9 @@ static struct tegra_clk_pll_params pll_d_params = {
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_d2_params
=
{
...
...
@@ -594,6 +466,9 @@ static struct tegra_clk_pll_params pll_d2_params = {
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
pdiv_map
pllu_p
[]
=
{
...
...
@@ -634,6 +509,9 @@ static struct tegra_clk_pll_params pll_u_params = {
.
lock_delay
=
1000
,
.
pdiv_tohw
=
pllu_p
,
.
div_nmp
=
&
pllu_nmp
,
.
freq_table
=
pll_u_freq_table
,
.
flags
=
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_x_freq_table
[]
=
{
...
...
@@ -667,12 +545,15 @@ static struct tegra_clk_pll_params pll_x_params = {
.
stepb_shift
=
24
,
.
pdiv_tohw
=
pllxc_p
,
.
div_nmp
=
&
pllxc_nmp
,
.
freq_table
=
pll_x_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_e_freq_table
[]
=
{
/* PLLE special case: use cpcon field to store cml divider value */
{
336000000
,
100000000
,
100
,
21
,
16
,
11
},
{
312000000
,
100000000
,
200
,
26
,
24
,
13
},
{
12000000
,
100000000
,
200
,
1
,
24
,
13
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
...
...
@@ -699,6 +580,9 @@ static struct tegra_clk_pll_params pll_e_params = {
.
lock_enable_bit_idx
=
PLLE_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
plle_nmp
,
.
freq_table
=
pll_e_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
,
.
fixed_rate
=
100000000
,
};
static
struct
div_nmp
pllre_nmp
=
{
...
...
@@ -725,53 +609,7 @@ static struct tegra_clk_pll_params pll_re_vco_params = {
.
iddq_reg
=
PLLRE_MISC
,
.
iddq_bit_idx
=
PLLRE_IDDQ_BIT
,
.
div_nmp
=
&
pllre_nmp
,
};
/* Peripheral clock registers */
static
struct
tegra_clk_periph_regs
periph_l_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_L
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_L
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_L
,
.
rst_reg
=
RST_DEVICES_L
,
.
rst_set_reg
=
RST_DEVICES_SET_L
,
.
rst_clr_reg
=
RST_DEVICES_CLR_L
,
};
static
struct
tegra_clk_periph_regs
periph_h_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_H
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_H
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_H
,
.
rst_reg
=
RST_DEVICES_H
,
.
rst_set_reg
=
RST_DEVICES_SET_H
,
.
rst_clr_reg
=
RST_DEVICES_CLR_H
,
};
static
struct
tegra_clk_periph_regs
periph_u_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_U
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_U
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_U
,
.
rst_reg
=
RST_DEVICES_U
,
.
rst_set_reg
=
RST_DEVICES_SET_U
,
.
rst_clr_reg
=
RST_DEVICES_CLR_U
,
};
static
struct
tegra_clk_periph_regs
periph_v_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_V
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_V
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_V
,
.
rst_reg
=
RST_DEVICES_V
,
.
rst_set_reg
=
RST_DEVICES_SET_V
,
.
rst_clr_reg
=
RST_DEVICES_CLR_V
,
};
static
struct
tegra_clk_periph_regs
periph_w_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_W
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_W
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_W
,
.
rst_reg
=
RST_DEVICES_W
,
.
rst_set_reg
=
RST_DEVICES_SET_W
,
.
rst_clr_reg
=
RST_DEVICES_CLR_W
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
/* possible OSC frequencies in Hz */
...
...
@@ -787,120 +625,6 @@ static unsigned long tegra114_input_freq[] = {
#define MASK(x) (BIT(x) - 1)
#define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags, _clk_id, \
_parents##_idx, 0)
#define TEGRA_INIT_DATA_MUX_FLAGS(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _gate_flags, _clk_id, flags)\
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags, _clk_id, \
_parents##_idx, flags)
#define TEGRA_INIT_DATA_MUX8(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
29, MASK(3), 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags, _clk_id, \
_parents##_idx, 0)
#define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id, _parents##_idx, 0)
#define TEGRA_INIT_DATA_INT_FLAGS(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _gate_flags, _clk_id, flags)\
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id, _parents##_idx, flags)
#define TEGRA_INIT_DATA_INT8(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id, _parents##_idx, 0)
#define TEGRA_INIT_DATA_UART(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 16, 1, TEGRA_DIVIDER_UART, _regs,\
_clk_num, periph_clk_enb_refcnt, 0, _clk_id, \
_parents##_idx, 0)
#define TEGRA_INIT_DATA_I2C(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
30, MASK(2), 0, 0, 16, 0, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, 0, _clk_id, _parents##_idx, 0)
#define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \
_mux_shift, _mux_mask, _clk_num, _regs, \
_gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\
_mux_shift, _mux_mask, 0, 0, 0, 0, 0, _regs, \
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id, _parents##_idx, 0)
#define TEGRA_INIT_DATA_XUSB(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset, \
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id, _parents##_idx, 0)
#define TEGRA_INIT_DATA_AUDIO(_name, _con_id, _dev_id, _offset, _clk_num,\
_regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, mux_d_audio_clk, \
_offset, 16, 0xE01F, 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags , _clk_id, \
mux_d_audio_clk_idx, 0)
enum
tegra114_clk
{
rtc
=
4
,
timer
=
5
,
uarta
=
6
,
sdmmc2
=
9
,
i2s1
=
11
,
i2c1
=
12
,
ndflash
=
13
,
sdmmc1
=
14
,
sdmmc4
=
15
,
pwm
=
17
,
i2s2
=
18
,
epp
=
19
,
gr_2d
=
21
,
usbd
=
22
,
isp
=
23
,
gr_3d
=
24
,
disp2
=
26
,
disp1
=
27
,
host1x
=
28
,
vcp
=
29
,
i2s0
=
30
,
apbdma
=
34
,
kbc
=
36
,
kfuse
=
40
,
sbc1
=
41
,
nor
=
42
,
sbc2
=
44
,
sbc3
=
46
,
i2c5
=
47
,
dsia
=
48
,
mipi
=
50
,
hdmi
=
51
,
csi
=
52
,
i2c2
=
54
,
uartc
=
55
,
mipi_cal
=
56
,
emc
,
usb2
,
usb3
,
vde
=
61
,
bsea
=
62
,
bsev
=
63
,
uartd
=
65
,
i2c3
=
67
,
sbc4
=
68
,
sdmmc3
=
69
,
owr
=
71
,
csite
=
73
,
la
=
76
,
trace
=
77
,
soc_therm
=
78
,
dtv
=
79
,
ndspeed
=
80
,
i2cslow
=
81
,
dsib
=
82
,
tsec
=
83
,
xusb_host
=
89
,
msenc
=
91
,
csus
=
92
,
mselect
=
99
,
tsensor
=
100
,
i2s3
=
101
,
i2s4
=
102
,
i2c4
=
103
,
sbc5
=
104
,
sbc6
=
105
,
d_audio
,
apbif
=
107
,
dam0
,
dam1
,
dam2
,
hda2codec_2x
=
111
,
audio0_2x
=
113
,
audio1_2x
,
audio2_2x
,
audio3_2x
,
audio4_2x
,
spdif_2x
,
actmon
=
119
,
extern1
=
120
,
extern2
=
121
,
extern3
=
122
,
hda
=
125
,
se
=
127
,
hda2hdmi
=
128
,
cilab
=
144
,
cilcd
=
145
,
cile
=
146
,
dsialp
=
147
,
dsiblp
=
148
,
dds
=
150
,
dp2
=
152
,
amx
=
153
,
adx
=
154
,
xusb_ss
=
156
,
uartb
=
192
,
vfir
,
spdif_in
,
spdif_out
,
vi
,
vi_sensor
,
fuse
,
fuse_burn
,
clk_32k
,
clk_m
,
clk_m_div2
,
clk_m_div4
,
pll_ref
,
pll_c
,
pll_c_out1
,
pll_c2
,
pll_c3
,
pll_m
,
pll_m_out1
,
pll_p
,
pll_p_out1
,
pll_p_out2
,
pll_p_out3
,
pll_p_out4
,
pll_a
,
pll_a_out0
,
pll_d
,
pll_d_out0
,
pll_d2
,
pll_d2_out0
,
pll_u
,
pll_u_480M
,
pll_u_60M
,
pll_u_48M
,
pll_u_12M
,
pll_x
,
pll_x_out0
,
pll_re_vco
,
pll_re_out
,
pll_e_out0
,
spdif_in_sync
,
i2s0_sync
,
i2s1_sync
,
i2s2_sync
,
i2s3_sync
,
i2s4_sync
,
vimclk_sync
,
audio0
,
audio1
,
audio2
,
audio3
,
audio4
,
spdif
,
clk_out_1
,
clk_out_2
,
clk_out_3
,
blink
,
xusb_host_src
=
252
,
xusb_falcon_src
,
xusb_fs_src
,
xusb_ss_src
,
xusb_dev_src
,
xusb_dev
,
xusb_hs_src
,
sclk
,
hclk
,
pclk
,
cclk_g
,
cclk_lp
,
dfll_ref
=
264
,
dfll_soc
,
/* Mux clocks */
audio0_mux
=
300
,
audio1_mux
,
audio2_mux
,
audio3_mux
,
audio4_mux
,
spdif_mux
,
clk_out_1_mux
,
clk_out_2_mux
,
clk_out_3_mux
,
dsia_mux
,
dsib_mux
,
clk_max
,
};
struct
utmi_clk_param
{
/* Oscillator Frequency in KHz */
u32
osc_frequency
;
...
...
@@ -934,122 +658,11 @@ static const struct utmi_clk_param utmi_parameters[] = {
/* peripheral mux definitions */
#define MUX_I2S_SPDIF(_id) \
static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \
#_id, "pll_p",\
"clk_m"};
MUX_I2S_SPDIF
(
audio0
)
MUX_I2S_SPDIF
(
audio1
)
MUX_I2S_SPDIF
(
audio2
)
MUX_I2S_SPDIF
(
audio3
)
MUX_I2S_SPDIF
(
audio4
)
MUX_I2S_SPDIF
(
audio
)
#define mux_pllaout0_audio0_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio1_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio2_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio3_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio4_2x_pllp_clkm_idx NULL
#define mux_pllaout0_audio_2x_pllp_clkm_idx NULL
static
const
char
*
mux_pllp_pllc_pllm_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
,
"clk_m"
};
#define mux_pllp_pllc_pllm_clkm_idx NULL
static
const
char
*
mux_pllp_pllc_pllm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
#define mux_pllp_pllc_pllm_idx NULL
static
const
char
*
mux_pllp_pllc_clk32_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_32k"
,
"clk_m"
};
#define mux_pllp_pllc_clk32_clkm_idx NULL
static
const
char
*
mux_plla_pllc_pllp_clkm
[]
=
{
"pll_a_out0"
,
"pll_c"
,
"pll_p"
,
"clk_m"
};
#define mux_plla_pllc_pllp_clkm_idx mux_pllp_pllc_pllm_clkm_idx
static
const
char
*
mux_pllp_pllc2_c_c3_pllm_clkm
[]
=
{
"pll_p"
,
"pll_c2"
,
"pll_c"
,
"pll_c3"
,
"pll_m"
,
"clk_m"
};
static
u32
mux_pllp_pllc2_c_c3_pllm_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
2
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
6
,
};
static
const
char
*
mux_pllp_clkm
[]
=
{
"pll_p"
,
"clk_m"
};
static
u32
mux_pllp_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
3
,
};
static
const
char
*
mux_pllm_pllc2_c_c3_pllp_plla
[]
=
{
"pll_m"
,
"pll_c2"
,
"pll_c"
,
"pll_c3"
,
"pll_p"
,
"pll_a_out0"
};
#define mux_pllm_pllc2_c_c3_pllp_plla_idx mux_pllp_pllc2_c_c3_pllm_clkm_idx
static
const
char
*
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
[]
=
{
"pll_p"
,
"pll_m"
,
"pll_d_out0"
,
"pll_a_out0"
,
"pll_c"
,
"pll_d2_out0"
,
"clk_m"
};
#define mux_pllp_pllm_plld_plla_pllc_plld2_clkm_idx NULL
static
const
char
*
mux_pllm_pllc_pllp_plla
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"pll_a_out0"
};
#define mux_pllm_pllc_pllp_plla_idx mux_pllp_pllc_pllm_clkm_idx
static
const
char
*
mux_pllp_pllc_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
static
u32
mux_pllp_pllc_clkm_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
};
static
const
char
*
mux_pllp_pllc_clkm_clk32
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_m"
,
"clk_32k"
};
#define mux_pllp_pllc_clkm_clk32_idx NULL
static
const
char
*
mux_plla_clk32_pllp_clkm_plle
[]
=
{
"pll_a_out0"
,
"clk_32k"
,
"pll_p"
,
"clk_m"
,
"pll_e_out0"
};
#define mux_plla_clk32_pllp_clkm_plle_idx NULL
static
const
char
*
mux_clkm_pllp_pllc_pllre
[]
=
{
"clk_m"
,
"pll_p"
,
"pll_c"
,
"pll_re_out"
};
static
u32
mux_clkm_pllp_pllc_pllre_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
[
3
]
=
5
,
};
static
const
char
*
mux_clkm_48M_pllp_480M
[]
=
{
"clk_m"
,
"pll_u_48M"
,
"pll_p"
,
"pll_u_480M"
};
#define mux_clkm_48M_pllp_480M_idx NULL
static
const
char
*
mux_clkm_pllre_clk32_480M_pllc_ref
[]
=
{
"clk_m"
,
"pll_re_out"
,
"clk_32k"
,
"pll_u_480M"
,
"pll_c"
,
"pll_ref"
};
static
u32
mux_clkm_pllre_clk32_480M_pllc_ref_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
1
,
[
2
]
=
3
,
[
3
]
=
3
,
[
4
]
=
4
,
[
5
]
=
7
,
};
static
const
char
*
mux_plld_out0_plld2_out0
[]
=
{
"pll_d_out0"
,
"pll_d2_out0"
,
};
#define mux_plld_out0_plld2_out0_idx NULL
static
const
char
*
mux_d_audio_clk
[]
=
{
"pll_a_out0"
,
"pll_p"
,
"clk_m"
,
"spdif_in_sync"
,
"i2s0_sync"
,
"i2s1_sync"
,
"i2s2_sync"
,
"i2s3_sync"
,
"i2s4_sync"
,
"vimclk_sync"
,
};
static
u32
mux_d_audio_clk_idx
[]
=
{
[
0
]
=
0
,
[
1
]
=
0x8000
,
[
2
]
=
0xc000
,
[
3
]
=
0xE000
,
[
4
]
=
0xE001
,
[
5
]
=
0xE002
,
[
6
]
=
0xE003
,
[
7
]
=
0xE004
,
[
8
]
=
0xE005
,
[
9
]
=
0xE007
,
};
static
const
char
*
mux_pllmcp_clkm
[]
=
{
"pll_m_out0"
,
"pll_c_out0"
,
"pll_p_out0"
,
"clk_m"
,
"pll_m_ud"
,
};
...
...
@@ -1064,8 +677,253 @@ static const struct clk_div_table pll_re_div_table[] = {
{
.
val
=
0
,
.
div
=
0
},
};
static
struct
clk
*
clks
[
clk_max
];
static
struct
clk_onecell_data
clk_data
;
static
struct
tegra_clk
tegra114_clks
[
tegra_clk_max
]
__initdata
=
{
[
tegra_clk_rtc
]
=
{
.
dt_id
=
TEGRA114_CLK_RTC
,
.
present
=
true
},
[
tegra_clk_timer
]
=
{
.
dt_id
=
TEGRA114_CLK_TIMER
,
.
present
=
true
},
[
tegra_clk_uarta
]
=
{
.
dt_id
=
TEGRA114_CLK_UARTA
,
.
present
=
true
},
[
tegra_clk_uartd
]
=
{
.
dt_id
=
TEGRA114_CLK_UARTD
,
.
present
=
true
},
[
tegra_clk_sdmmc2
]
=
{
.
dt_id
=
TEGRA114_CLK_SDMMC2
,
.
present
=
true
},
[
tegra_clk_i2s1
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S1
,
.
present
=
true
},
[
tegra_clk_i2c1
]
=
{
.
dt_id
=
TEGRA114_CLK_I2C1
,
.
present
=
true
},
[
tegra_clk_ndflash
]
=
{
.
dt_id
=
TEGRA114_CLK_NDFLASH
,
.
present
=
true
},
[
tegra_clk_sdmmc1
]
=
{
.
dt_id
=
TEGRA114_CLK_SDMMC1
,
.
present
=
true
},
[
tegra_clk_sdmmc4
]
=
{
.
dt_id
=
TEGRA114_CLK_SDMMC4
,
.
present
=
true
},
[
tegra_clk_pwm
]
=
{
.
dt_id
=
TEGRA114_CLK_PWM
,
.
present
=
true
},
[
tegra_clk_i2s0
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S0
,
.
present
=
true
},
[
tegra_clk_i2s2
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S2
,
.
present
=
true
},
[
tegra_clk_epp_8
]
=
{
.
dt_id
=
TEGRA114_CLK_EPP
,
.
present
=
true
},
[
tegra_clk_gr2d_8
]
=
{
.
dt_id
=
TEGRA114_CLK_GR2D
,
.
present
=
true
},
[
tegra_clk_usbd
]
=
{
.
dt_id
=
TEGRA114_CLK_USBD
,
.
present
=
true
},
[
tegra_clk_isp
]
=
{
.
dt_id
=
TEGRA114_CLK_ISP
,
.
present
=
true
},
[
tegra_clk_gr3d_8
]
=
{
.
dt_id
=
TEGRA114_CLK_GR3D
,
.
present
=
true
},
[
tegra_clk_disp2
]
=
{
.
dt_id
=
TEGRA114_CLK_DISP2
,
.
present
=
true
},
[
tegra_clk_disp1
]
=
{
.
dt_id
=
TEGRA114_CLK_DISP1
,
.
present
=
true
},
[
tegra_clk_host1x_8
]
=
{
.
dt_id
=
TEGRA114_CLK_HOST1X
,
.
present
=
true
},
[
tegra_clk_vcp
]
=
{
.
dt_id
=
TEGRA114_CLK_VCP
,
.
present
=
true
},
[
tegra_clk_apbdma
]
=
{
.
dt_id
=
TEGRA114_CLK_APBDMA
,
.
present
=
true
},
[
tegra_clk_kbc
]
=
{
.
dt_id
=
TEGRA114_CLK_KBC
,
.
present
=
true
},
[
tegra_clk_kfuse
]
=
{
.
dt_id
=
TEGRA114_CLK_KFUSE
,
.
present
=
true
},
[
tegra_clk_sbc1_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC1
,
.
present
=
true
},
[
tegra_clk_nor
]
=
{
.
dt_id
=
TEGRA114_CLK_NOR
,
.
present
=
true
},
[
tegra_clk_sbc2_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC2
,
.
present
=
true
},
[
tegra_clk_sbc3_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC3
,
.
present
=
true
},
[
tegra_clk_i2c5
]
=
{
.
dt_id
=
TEGRA114_CLK_I2C5
,
.
present
=
true
},
[
tegra_clk_dsia
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIA
,
.
present
=
true
},
[
tegra_clk_mipi
]
=
{
.
dt_id
=
TEGRA114_CLK_MIPI
,
.
present
=
true
},
[
tegra_clk_hdmi
]
=
{
.
dt_id
=
TEGRA114_CLK_HDMI
,
.
present
=
true
},
[
tegra_clk_csi
]
=
{
.
dt_id
=
TEGRA114_CLK_CSI
,
.
present
=
true
},
[
tegra_clk_i2c2
]
=
{
.
dt_id
=
TEGRA114_CLK_I2C2
,
.
present
=
true
},
[
tegra_clk_uartc
]
=
{
.
dt_id
=
TEGRA114_CLK_UARTC
,
.
present
=
true
},
[
tegra_clk_mipi_cal
]
=
{
.
dt_id
=
TEGRA114_CLK_MIPI_CAL
,
.
present
=
true
},
[
tegra_clk_emc
]
=
{
.
dt_id
=
TEGRA114_CLK_EMC
,
.
present
=
true
},
[
tegra_clk_usb2
]
=
{
.
dt_id
=
TEGRA114_CLK_USB2
,
.
present
=
true
},
[
tegra_clk_usb3
]
=
{
.
dt_id
=
TEGRA114_CLK_USB3
,
.
present
=
true
},
[
tegra_clk_vde_8
]
=
{
.
dt_id
=
TEGRA114_CLK_VDE
,
.
present
=
true
},
[
tegra_clk_bsea
]
=
{
.
dt_id
=
TEGRA114_CLK_BSEA
,
.
present
=
true
},
[
tegra_clk_bsev
]
=
{
.
dt_id
=
TEGRA114_CLK_BSEV
,
.
present
=
true
},
[
tegra_clk_i2c3
]
=
{
.
dt_id
=
TEGRA114_CLK_I2C3
,
.
present
=
true
},
[
tegra_clk_sbc4_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC4
,
.
present
=
true
},
[
tegra_clk_sdmmc3
]
=
{
.
dt_id
=
TEGRA114_CLK_SDMMC3
,
.
present
=
true
},
[
tegra_clk_owr
]
=
{
.
dt_id
=
TEGRA114_CLK_OWR
,
.
present
=
true
},
[
tegra_clk_csite
]
=
{
.
dt_id
=
TEGRA114_CLK_CSITE
,
.
present
=
true
},
[
tegra_clk_la
]
=
{
.
dt_id
=
TEGRA114_CLK_LA
,
.
present
=
true
},
[
tegra_clk_trace
]
=
{
.
dt_id
=
TEGRA114_CLK_TRACE
,
.
present
=
true
},
[
tegra_clk_soc_therm
]
=
{
.
dt_id
=
TEGRA114_CLK_SOC_THERM
,
.
present
=
true
},
[
tegra_clk_dtv
]
=
{
.
dt_id
=
TEGRA114_CLK_DTV
,
.
present
=
true
},
[
tegra_clk_ndspeed
]
=
{
.
dt_id
=
TEGRA114_CLK_NDSPEED
,
.
present
=
true
},
[
tegra_clk_i2cslow
]
=
{
.
dt_id
=
TEGRA114_CLK_I2CSLOW
,
.
present
=
true
},
[
tegra_clk_dsib
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIB
,
.
present
=
true
},
[
tegra_clk_tsec
]
=
{
.
dt_id
=
TEGRA114_CLK_TSEC
,
.
present
=
true
},
[
tegra_clk_xusb_host
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_HOST
,
.
present
=
true
},
[
tegra_clk_msenc
]
=
{
.
dt_id
=
TEGRA114_CLK_MSENC
,
.
present
=
true
},
[
tegra_clk_csus
]
=
{
.
dt_id
=
TEGRA114_CLK_CSUS
,
.
present
=
true
},
[
tegra_clk_mselect
]
=
{
.
dt_id
=
TEGRA114_CLK_MSELECT
,
.
present
=
true
},
[
tegra_clk_tsensor
]
=
{
.
dt_id
=
TEGRA114_CLK_TSENSOR
,
.
present
=
true
},
[
tegra_clk_i2s3
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S3
,
.
present
=
true
},
[
tegra_clk_i2s4
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S4
,
.
present
=
true
},
[
tegra_clk_i2c4
]
=
{
.
dt_id
=
TEGRA114_CLK_I2C4
,
.
present
=
true
},
[
tegra_clk_sbc5_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC5
,
.
present
=
true
},
[
tegra_clk_sbc6_8
]
=
{
.
dt_id
=
TEGRA114_CLK_SBC6
,
.
present
=
true
},
[
tegra_clk_d_audio
]
=
{
.
dt_id
=
TEGRA114_CLK_D_AUDIO
,
.
present
=
true
},
[
tegra_clk_apbif
]
=
{
.
dt_id
=
TEGRA114_CLK_APBIF
,
.
present
=
true
},
[
tegra_clk_dam0
]
=
{
.
dt_id
=
TEGRA114_CLK_DAM0
,
.
present
=
true
},
[
tegra_clk_dam1
]
=
{
.
dt_id
=
TEGRA114_CLK_DAM1
,
.
present
=
true
},
[
tegra_clk_dam2
]
=
{
.
dt_id
=
TEGRA114_CLK_DAM2
,
.
present
=
true
},
[
tegra_clk_hda2codec_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_HDA2CODEC_2X
,
.
present
=
true
},
[
tegra_clk_audio0_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO0_2X
,
.
present
=
true
},
[
tegra_clk_audio1_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO1_2X
,
.
present
=
true
},
[
tegra_clk_audio2_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO2_2X
,
.
present
=
true
},
[
tegra_clk_audio3_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO3_2X
,
.
present
=
true
},
[
tegra_clk_audio4_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO4_2X
,
.
present
=
true
},
[
tegra_clk_spdif_2x
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF_2X
,
.
present
=
true
},
[
tegra_clk_actmon
]
=
{
.
dt_id
=
TEGRA114_CLK_ACTMON
,
.
present
=
true
},
[
tegra_clk_extern1
]
=
{
.
dt_id
=
TEGRA114_CLK_EXTERN1
,
.
present
=
true
},
[
tegra_clk_extern2
]
=
{
.
dt_id
=
TEGRA114_CLK_EXTERN2
,
.
present
=
true
},
[
tegra_clk_extern3
]
=
{
.
dt_id
=
TEGRA114_CLK_EXTERN3
,
.
present
=
true
},
[
tegra_clk_hda
]
=
{
.
dt_id
=
TEGRA114_CLK_HDA
,
.
present
=
true
},
[
tegra_clk_se
]
=
{
.
dt_id
=
TEGRA114_CLK_SE
,
.
present
=
true
},
[
tegra_clk_hda2hdmi
]
=
{
.
dt_id
=
TEGRA114_CLK_HDA2HDMI
,
.
present
=
true
},
[
tegra_clk_cilab
]
=
{
.
dt_id
=
TEGRA114_CLK_CILAB
,
.
present
=
true
},
[
tegra_clk_cilcd
]
=
{
.
dt_id
=
TEGRA114_CLK_CILCD
,
.
present
=
true
},
[
tegra_clk_cile
]
=
{
.
dt_id
=
TEGRA114_CLK_CILE
,
.
present
=
true
},
[
tegra_clk_dsialp
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIALP
,
.
present
=
true
},
[
tegra_clk_dsiblp
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIBLP
,
.
present
=
true
},
[
tegra_clk_dds
]
=
{
.
dt_id
=
TEGRA114_CLK_DDS
,
.
present
=
true
},
[
tegra_clk_dp2
]
=
{
.
dt_id
=
TEGRA114_CLK_DP2
,
.
present
=
true
},
[
tegra_clk_amx
]
=
{
.
dt_id
=
TEGRA114_CLK_AMX
,
.
present
=
true
},
[
tegra_clk_adx
]
=
{
.
dt_id
=
TEGRA114_CLK_ADX
,
.
present
=
true
},
[
tegra_clk_xusb_ss
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_SS
,
.
present
=
true
},
[
tegra_clk_uartb
]
=
{
.
dt_id
=
TEGRA114_CLK_UARTB
,
.
present
=
true
},
[
tegra_clk_vfir
]
=
{
.
dt_id
=
TEGRA114_CLK_VFIR
,
.
present
=
true
},
[
tegra_clk_spdif_in
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF_IN
,
.
present
=
true
},
[
tegra_clk_spdif_out
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF_OUT
,
.
present
=
true
},
[
tegra_clk_vi_8
]
=
{
.
dt_id
=
TEGRA114_CLK_VI
,
.
present
=
true
},
[
tegra_clk_vi_sensor_8
]
=
{
.
dt_id
=
TEGRA114_CLK_VI_SENSOR
,
.
present
=
true
},
[
tegra_clk_fuse
]
=
{
.
dt_id
=
TEGRA114_CLK_FUSE
,
.
present
=
true
},
[
tegra_clk_fuse_burn
]
=
{
.
dt_id
=
TEGRA114_CLK_FUSE_BURN
,
.
present
=
true
},
[
tegra_clk_clk_32k
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_32K
,
.
present
=
true
},
[
tegra_clk_clk_m
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_M
,
.
present
=
true
},
[
tegra_clk_clk_m_div2
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_M_DIV2
,
.
present
=
true
},
[
tegra_clk_clk_m_div4
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_M_DIV4
,
.
present
=
true
},
[
tegra_clk_pll_ref
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_REF
,
.
present
=
true
},
[
tegra_clk_pll_c
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_C
,
.
present
=
true
},
[
tegra_clk_pll_c_out1
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_C_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_c2
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_C2
,
.
present
=
true
},
[
tegra_clk_pll_c3
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_C3
,
.
present
=
true
},
[
tegra_clk_pll_m
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_M
,
.
present
=
true
},
[
tegra_clk_pll_m_out1
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_M_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_P
,
.
present
=
true
},
[
tegra_clk_pll_p_out1
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p_out2_int
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT2
,
.
present
=
true
},
[
tegra_clk_pll_p_out3
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT3
,
.
present
=
true
},
[
tegra_clk_pll_p_out4
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT4
,
.
present
=
true
},
[
tegra_clk_pll_a
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_A
,
.
present
=
true
},
[
tegra_clk_pll_a_out0
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_A_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_d
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_D
,
.
present
=
true
},
[
tegra_clk_pll_d_out0
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_D_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_d2
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_D2
,
.
present
=
true
},
[
tegra_clk_pll_d2_out0
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_D2_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_u
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_U
,
.
present
=
true
},
[
tegra_clk_pll_u_480m
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_U_480M
,
.
present
=
true
},
[
tegra_clk_pll_u_60m
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_U_60M
,
.
present
=
true
},
[
tegra_clk_pll_u_48m
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_U_48M
,
.
present
=
true
},
[
tegra_clk_pll_u_12m
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_U_12M
,
.
present
=
true
},
[
tegra_clk_pll_x
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_X
,
.
present
=
true
},
[
tegra_clk_pll_x_out0
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_X_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_re_vco
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_RE_VCO
,
.
present
=
true
},
[
tegra_clk_pll_re_out
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_RE_OUT
,
.
present
=
true
},
[
tegra_clk_pll_e_out0
]
=
{
.
dt_id
=
TEGRA114_CLK_PLL_E_OUT0
,
.
present
=
true
},
[
tegra_clk_spdif_in_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF_IN_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s0_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S0_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s1_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S1_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s2_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S2_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s3_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S3_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s4_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_I2S4_SYNC
,
.
present
=
true
},
[
tegra_clk_vimclk_sync
]
=
{
.
dt_id
=
TEGRA114_CLK_VIMCLK_SYNC
,
.
present
=
true
},
[
tegra_clk_audio0
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO0
,
.
present
=
true
},
[
tegra_clk_audio1
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO1
,
.
present
=
true
},
[
tegra_clk_audio2
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO2
,
.
present
=
true
},
[
tegra_clk_audio3
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO3
,
.
present
=
true
},
[
tegra_clk_audio4
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO4
,
.
present
=
true
},
[
tegra_clk_spdif
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF
,
.
present
=
true
},
[
tegra_clk_clk_out_1
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_1
,
.
present
=
true
},
[
tegra_clk_clk_out_2
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_2
,
.
present
=
true
},
[
tegra_clk_clk_out_3
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_3
,
.
present
=
true
},
[
tegra_clk_blink
]
=
{
.
dt_id
=
TEGRA114_CLK_BLINK
,
.
present
=
true
},
[
tegra_clk_xusb_host_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_HOST_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_falcon_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_FALCON_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_fs_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_FS_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_ss_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_SS_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_dev_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_DEV_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_dev
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_DEV
,
.
present
=
true
},
[
tegra_clk_xusb_hs_src
]
=
{
.
dt_id
=
TEGRA114_CLK_XUSB_HS_SRC
,
.
present
=
true
},
[
tegra_clk_sclk
]
=
{
.
dt_id
=
TEGRA114_CLK_SCLK
,
.
present
=
true
},
[
tegra_clk_hclk
]
=
{
.
dt_id
=
TEGRA114_CLK_HCLK
,
.
present
=
true
},
[
tegra_clk_pclk
]
=
{
.
dt_id
=
TEGRA114_CLK_PCLK
,
.
present
=
true
},
[
tegra_clk_cclk_g
]
=
{
.
dt_id
=
TEGRA114_CLK_CCLK_G
,
.
present
=
true
},
[
tegra_clk_cclk_lp
]
=
{
.
dt_id
=
TEGRA114_CLK_CCLK_LP
,
.
present
=
true
},
[
tegra_clk_dfll_ref
]
=
{
.
dt_id
=
TEGRA114_CLK_DFLL_REF
,
.
present
=
true
},
[
tegra_clk_dfll_soc
]
=
{
.
dt_id
=
TEGRA114_CLK_DFLL_SOC
,
.
present
=
true
},
[
tegra_clk_audio0_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO0_MUX
,
.
present
=
true
},
[
tegra_clk_audio1_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO1_MUX
,
.
present
=
true
},
[
tegra_clk_audio2_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO2_MUX
,
.
present
=
true
},
[
tegra_clk_audio3_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO3_MUX
,
.
present
=
true
},
[
tegra_clk_audio4_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_AUDIO4_MUX
,
.
present
=
true
},
[
tegra_clk_spdif_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_SPDIF_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_1_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_1_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_2_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_2_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_3_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_CLK_OUT_3_MUX
,
.
present
=
true
},
[
tegra_clk_dsia_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIA_MUX
,
.
present
=
true
},
[
tegra_clk_dsib_mux
]
=
{
.
dt_id
=
TEGRA114_CLK_DSIB_MUX
,
.
present
=
true
},
};
static
struct
tegra_devclk
devclks
[]
__initdata
=
{
{
.
con_id
=
"clk_m"
,
.
dt_id
=
TEGRA114_CLK_CLK_M
},
{
.
con_id
=
"pll_ref"
,
.
dt_id
=
TEGRA114_CLK_PLL_REF
},
{
.
con_id
=
"clk_32k"
,
.
dt_id
=
TEGRA114_CLK_CLK_32K
},
{
.
con_id
=
"clk_m_div2"
,
.
dt_id
=
TEGRA114_CLK_CLK_M_DIV2
},
{
.
con_id
=
"clk_m_div4"
,
.
dt_id
=
TEGRA114_CLK_CLK_M_DIV4
},
{
.
con_id
=
"pll_c"
,
.
dt_id
=
TEGRA114_CLK_PLL_C
},
{
.
con_id
=
"pll_c_out1"
,
.
dt_id
=
TEGRA114_CLK_PLL_C_OUT1
},
{
.
con_id
=
"pll_c2"
,
.
dt_id
=
TEGRA114_CLK_PLL_C2
},
{
.
con_id
=
"pll_c3"
,
.
dt_id
=
TEGRA114_CLK_PLL_C3
},
{
.
con_id
=
"pll_p"
,
.
dt_id
=
TEGRA114_CLK_PLL_P
},
{
.
con_id
=
"pll_p_out1"
,
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT1
},
{
.
con_id
=
"pll_p_out2"
,
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT2
},
{
.
con_id
=
"pll_p_out3"
,
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT3
},
{
.
con_id
=
"pll_p_out4"
,
.
dt_id
=
TEGRA114_CLK_PLL_P_OUT4
},
{
.
con_id
=
"pll_m"
,
.
dt_id
=
TEGRA114_CLK_PLL_M
},
{
.
con_id
=
"pll_m_out1"
,
.
dt_id
=
TEGRA114_CLK_PLL_M_OUT1
},
{
.
con_id
=
"pll_x"
,
.
dt_id
=
TEGRA114_CLK_PLL_X
},
{
.
con_id
=
"pll_x_out0"
,
.
dt_id
=
TEGRA114_CLK_PLL_X_OUT0
},
{
.
con_id
=
"pll_u"
,
.
dt_id
=
TEGRA114_CLK_PLL_U
},
{
.
con_id
=
"pll_u_480M"
,
.
dt_id
=
TEGRA114_CLK_PLL_U_480M
},
{
.
con_id
=
"pll_u_60M"
,
.
dt_id
=
TEGRA114_CLK_PLL_U_60M
},
{
.
con_id
=
"pll_u_48M"
,
.
dt_id
=
TEGRA114_CLK_PLL_U_48M
},
{
.
con_id
=
"pll_u_12M"
,
.
dt_id
=
TEGRA114_CLK_PLL_U_12M
},
{
.
con_id
=
"pll_d"
,
.
dt_id
=
TEGRA114_CLK_PLL_D
},
{
.
con_id
=
"pll_d_out0"
,
.
dt_id
=
TEGRA114_CLK_PLL_D_OUT0
},
{
.
con_id
=
"pll_d2"
,
.
dt_id
=
TEGRA114_CLK_PLL_D2
},
{
.
con_id
=
"pll_d2_out0"
,
.
dt_id
=
TEGRA114_CLK_PLL_D2_OUT0
},
{
.
con_id
=
"pll_a"
,
.
dt_id
=
TEGRA114_CLK_PLL_A
},
{
.
con_id
=
"pll_a_out0"
,
.
dt_id
=
TEGRA114_CLK_PLL_A_OUT0
},
{
.
con_id
=
"pll_re_vco"
,
.
dt_id
=
TEGRA114_CLK_PLL_RE_VCO
},
{
.
con_id
=
"pll_re_out"
,
.
dt_id
=
TEGRA114_CLK_PLL_RE_OUT
},
{
.
con_id
=
"pll_e_out0"
,
.
dt_id
=
TEGRA114_CLK_PLL_E_OUT0
},
{
.
con_id
=
"spdif_in_sync"
,
.
dt_id
=
TEGRA114_CLK_SPDIF_IN_SYNC
},
{
.
con_id
=
"i2s0_sync"
,
.
dt_id
=
TEGRA114_CLK_I2S0_SYNC
},
{
.
con_id
=
"i2s1_sync"
,
.
dt_id
=
TEGRA114_CLK_I2S1_SYNC
},
{
.
con_id
=
"i2s2_sync"
,
.
dt_id
=
TEGRA114_CLK_I2S2_SYNC
},
{
.
con_id
=
"i2s3_sync"
,
.
dt_id
=
TEGRA114_CLK_I2S3_SYNC
},
{
.
con_id
=
"i2s4_sync"
,
.
dt_id
=
TEGRA114_CLK_I2S4_SYNC
},
{
.
con_id
=
"vimclk_sync"
,
.
dt_id
=
TEGRA114_CLK_VIMCLK_SYNC
},
{
.
con_id
=
"audio0"
,
.
dt_id
=
TEGRA114_CLK_AUDIO0
},
{
.
con_id
=
"audio1"
,
.
dt_id
=
TEGRA114_CLK_AUDIO1
},
{
.
con_id
=
"audio2"
,
.
dt_id
=
TEGRA114_CLK_AUDIO2
},
{
.
con_id
=
"audio3"
,
.
dt_id
=
TEGRA114_CLK_AUDIO3
},
{
.
con_id
=
"audio4"
,
.
dt_id
=
TEGRA114_CLK_AUDIO4
},
{
.
con_id
=
"spdif"
,
.
dt_id
=
TEGRA114_CLK_SPDIF
},
{
.
con_id
=
"audio0_2x"
,
.
dt_id
=
TEGRA114_CLK_AUDIO0_2X
},
{
.
con_id
=
"audio1_2x"
,
.
dt_id
=
TEGRA114_CLK_AUDIO1_2X
},
{
.
con_id
=
"audio2_2x"
,
.
dt_id
=
TEGRA114_CLK_AUDIO2_2X
},
{
.
con_id
=
"audio3_2x"
,
.
dt_id
=
TEGRA114_CLK_AUDIO3_2X
},
{
.
con_id
=
"audio4_2x"
,
.
dt_id
=
TEGRA114_CLK_AUDIO4_2X
},
{
.
con_id
=
"spdif_2x"
,
.
dt_id
=
TEGRA114_CLK_SPDIF_2X
},
{
.
con_id
=
"extern1"
,
.
dev_id
=
"clk_out_1"
,
.
dt_id
=
TEGRA114_CLK_EXTERN1
},
{
.
con_id
=
"extern2"
,
.
dev_id
=
"clk_out_2"
,
.
dt_id
=
TEGRA114_CLK_EXTERN2
},
{
.
con_id
=
"extern3"
,
.
dev_id
=
"clk_out_3"
,
.
dt_id
=
TEGRA114_CLK_EXTERN3
},
{
.
con_id
=
"blink"
,
.
dt_id
=
TEGRA114_CLK_BLINK
},
{
.
con_id
=
"cclk_g"
,
.
dt_id
=
TEGRA114_CLK_CCLK_G
},
{
.
con_id
=
"cclk_lp"
,
.
dt_id
=
TEGRA114_CLK_CCLK_LP
},
{
.
con_id
=
"sclk"
,
.
dt_id
=
TEGRA114_CLK_SCLK
},
{
.
con_id
=
"hclk"
,
.
dt_id
=
TEGRA114_CLK_HCLK
},
{
.
con_id
=
"pclk"
,
.
dt_id
=
TEGRA114_CLK_PCLK
},
{
.
con_id
=
"fuse"
,
.
dt_id
=
TEGRA114_CLK_FUSE
},
{
.
dev_id
=
"rtc-tegra"
,
.
dt_id
=
TEGRA114_CLK_RTC
},
{
.
dev_id
=
"timer"
,
.
dt_id
=
TEGRA114_CLK_TIMER
},
};
static
struct
clk
**
clks
;
static
unsigned
long
osc_freq
;
static
unsigned
long
pll_ref_freq
;
...
...
@@ -1086,16 +944,14 @@ static int __init tegra114_osc_clk_init(void __iomem *clk_base)
/* clk_m */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_m"
,
NULL
,
CLK_IS_ROOT
,
osc_freq
);
clk_register_clkdev
(
clk
,
"clk_m"
,
NULL
);
clks
[
clk_m
]
=
clk
;
clks
[
TEGRA114_CLK_CLK_M
]
=
clk
;
/* pll_ref */
val
=
(
val
>>
OSC_CTRL_PLL_REF_DIV_SHIFT
)
&
3
;
pll_ref_div
=
1
<<
val
;
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_ref"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
pll_ref_div
);
clk_register_clkdev
(
clk
,
"pll_ref"
,
NULL
);
clks
[
pll_ref
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_REF
]
=
clk
;
pll_ref_freq
=
osc_freq
/
pll_ref_div
;
...
...
@@ -1109,20 +965,17 @@ static void __init tegra114_fixed_clk_init(void __iomem *clk_base)
/* clk_32k */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_32k"
,
NULL
,
CLK_IS_ROOT
,
32768
);
clk_register_clkdev
(
clk
,
"clk_32k"
,
NULL
);
clks
[
clk_32k
]
=
clk
;
clks
[
TEGRA114_CLK_CLK_32K
]
=
clk
;
/* clk_m_div2 */
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div2"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"clk_m_div2"
,
NULL
);
clks
[
clk_m_div2
]
=
clk
;
clks
[
TEGRA114_CLK_CLK_M_DIV2
]
=
clk
;
/* clk_m_div4 */
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div4"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
4
);
clk_register_clkdev
(
clk
,
"clk_m_div4"
,
NULL
);
clks
[
clk_m_div4
]
=
clk
;
clks
[
TEGRA114_CLK_CLK_M_DIV4
]
=
clk
;
}
...
...
@@ -1208,63 +1061,6 @@ static __init void tegra114_utmi_param_configure(void __iomem *clk_base)
writel_relaxed
(
reg
,
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
}
static
void
__init
_clip_vco_min
(
struct
tegra_clk_pll_params
*
pll_params
)
{
pll_params
->
vco_min
=
DIV_ROUND_UP
(
pll_params
->
vco_min
,
pll_ref_freq
)
*
pll_ref_freq
;
}
static
int
__init
_setup_dynamic_ramp
(
struct
tegra_clk_pll_params
*
pll_params
,
void
__iomem
*
clk_base
)
{
u32
val
;
u32
step_a
,
step_b
;
switch
(
pll_ref_freq
)
{
case
12000000
:
case
13000000
:
case
26000000
:
step_a
=
0x2B
;
step_b
=
0x0B
;
break
;
case
16800000
:
step_a
=
0x1A
;
step_b
=
0x09
;
break
;
case
19200000
:
step_a
=
0x12
;
step_b
=
0x08
;
break
;
default:
pr_err
(
"%s: Unexpected reference rate %lu
\n
"
,
__func__
,
pll_ref_freq
);
WARN_ON
(
1
);
return
-
EINVAL
;
}
val
=
step_a
<<
pll_params
->
stepa_shift
;
val
|=
step_b
<<
pll_params
->
stepb_shift
;
writel_relaxed
(
val
,
clk_base
+
pll_params
->
dyn_ramp_reg
);
return
0
;
}
static
void
__init
_init_iddq
(
struct
tegra_clk_pll_params
*
pll_params
,
void
__iomem
*
clk_base
)
{
u32
val
,
val_iddq
;
val
=
readl_relaxed
(
clk_base
+
pll_params
->
base_reg
);
val_iddq
=
readl_relaxed
(
clk_base
+
pll_params
->
iddq_reg
);
if
(
val
&
BIT
(
30
))
WARN_ON
(
val_iddq
&
BIT
(
pll_params
->
iddq_bit_idx
));
else
{
val_iddq
|=
BIT
(
pll_params
->
iddq_bit_idx
);
writel_relaxed
(
val_iddq
,
clk_base
+
pll_params
->
iddq_reg
);
}
}
static
void
__init
tegra114_pll_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
)
{
...
...
@@ -1272,104 +1068,34 @@ static void __init tegra114_pll_init(void __iomem *clk_base,
struct
clk
*
clk
;
/* PLLC */
_clip_vco_min
(
&
pll_c_params
);
if
(
_setup_dynamic_ramp
(
&
pll_c_params
,
clk_base
)
>=
0
)
{
_init_iddq
(
&
pll_c_params
,
clk_base
);
clk
=
tegra_clk_register_pllxc
(
"pll_c"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_c_params
,
TEGRA_PLL_USE_LOCK
,
pll_c_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c"
,
NULL
);
clks
[
pll_c
]
=
clk
;
/* PLLC_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_c_out1_div"
,
"pll_c"
,
clk_base
+
PLLC_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_c_out1"
,
"pll_c_out1_div"
,
clk_base
+
PLLC_OUT
,
1
,
0
,
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c_out1"
,
NULL
);
clks
[
pll_c_out1
]
=
clk
;
}
clk
=
tegra_clk_register_pllxc
(
"pll_c"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c_params
,
NULL
);
clks
[
TEGRA114_CLK_PLL_C
]
=
clk
;
/* PLLC_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_c_out1_div"
,
"pll_c"
,
clk_base
+
PLLC_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_c_out1"
,
"pll_c_out1_div"
,
clk_base
+
PLLC_OUT
,
1
,
0
,
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clks
[
TEGRA114_CLK_PLL_C_OUT1
]
=
clk
;
/* PLLC2 */
_clip_vco_min
(
&
pll_c2_params
);
clk
=
tegra_clk_register_pllc
(
"pll_c2"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_c2_params
,
TEGRA_PLL_USE_LOCK
,
pll_cx_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c2"
,
NULL
);
clks
[
pll_c2
]
=
clk
;
clk
=
tegra_clk_register_pllc
(
"pll_c2"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c2_params
,
NULL
);
clks
[
TEGRA114_CLK_PLL_C2
]
=
clk
;
/* PLLC3 */
_clip_vco_min
(
&
pll_c3_params
);
clk
=
tegra_clk_register_pllc
(
"pll_c3"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_c3_params
,
TEGRA_PLL_USE_LOCK
,
pll_cx_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c3"
,
NULL
);
clks
[
pll_c3
]
=
clk
;
/* PLLP */
clk
=
tegra_clk_register_pll
(
"pll_p"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
408000000
,
&
pll_p_params
,
TEGRA_PLL_FIXED
|
TEGRA_PLL_USE_LOCK
,
pll_p_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_p"
,
NULL
);
clks
[
pll_p
]
=
clk
;
/* PLLP_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_p_out1_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out1"
,
"pll_p_out1_div"
,
clk_base
+
PLLP_OUTA
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out1"
,
NULL
);
clks
[
pll_p_out1
]
=
clk
;
/* PLLP_OUT2 */
clk
=
tegra_clk_register_divider
(
"pll_p_out2_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
|
TEGRA_DIVIDER_INT
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out2"
,
"pll_p_out2_div"
,
clk_base
+
PLLP_OUTA
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out2"
,
NULL
);
clks
[
pll_p_out2
]
=
clk
;
/* PLLP_OUT3 */
clk
=
tegra_clk_register_divider
(
"pll_p_out3_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out3"
,
"pll_p_out3_div"
,
clk_base
+
PLLP_OUTB
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out3"
,
NULL
);
clks
[
pll_p_out3
]
=
clk
;
/* PLLP_OUT4 */
clk
=
tegra_clk_register_divider
(
"pll_p_out4_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out4"
,
"pll_p_out4_div"
,
clk_base
+
PLLP_OUTB
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out4"
,
NULL
);
clks
[
pll_p_out4
]
=
clk
;
clk
=
tegra_clk_register_pllc
(
"pll_c3"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c3_params
,
NULL
);
clks
[
TEGRA114_CLK_PLL_C3
]
=
clk
;
/* PLLM */
_clip_vco_min
(
&
pll_m_params
);
clk
=
tegra_clk_register_pllm
(
"pll_m"
,
"pll_ref"
,
clk_base
,
pmc
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
0
,
&
pll_m_params
,
TEGRA_PLL_USE_LOCK
,
pll_m_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m"
,
NULL
);
clks
[
pll_m
]
=
clk
;
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
&
pll_m_params
,
NULL
);
clks
[
TEGRA114_CLK_PLL_M
]
=
clk
;
/* PLLM_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_m_out1_div"
,
"pll_m"
,
...
...
@@ -1378,41 +1104,20 @@ static void __init tegra114_pll_init(void __iomem *clk_base,
clk
=
tegra_clk_register_pll_out
(
"pll_m_out1"
,
"pll_m_out1_div"
,
clk_base
+
PLLM_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m_out1"
,
NULL
);
clks
[
pll_m_out1
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_M_OUT1
]
=
clk
;
/* PLLM_UD */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_m_ud"
,
"pll_m"
,
CLK_SET_RATE_PARENT
,
1
,
1
);
/* PLLX */
_clip_vco_min
(
&
pll_x_params
);
if
(
_setup_dynamic_ramp
(
&
pll_x_params
,
clk_base
)
>=
0
)
{
_init_iddq
(
&
pll_x_params
,
clk_base
);
clk
=
tegra_clk_register_pllxc
(
"pll_x"
,
"pll_ref"
,
clk_base
,
pmc
,
CLK_IGNORE_UNUSED
,
0
,
&
pll_x_params
,
TEGRA_PLL_USE_LOCK
,
pll_x_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_x"
,
NULL
);
clks
[
pll_x
]
=
clk
;
}
/* PLLX_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_x_out0"
,
"pll_x"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_x_out0"
,
NULL
);
clks
[
pll_x_out0
]
=
clk
;
/* PLLU */
val
=
readl
(
clk_base
+
pll_u_params
.
base_reg
);
val
&=
~
BIT
(
24
);
/* disable PLLU_OVERRIDE */
writel
(
val
,
clk_base
+
pll_u_params
.
base_reg
);
clk
=
tegra_clk_register_pll
(
"pll_u"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_u_params
,
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
pll_u_freq_table
,
&
pll_u_lock
);
clk_register_clkdev
(
clk
,
"pll_u"
,
NULL
);
clks
[
pll_u
]
=
clk
;
&
pll_u_params
,
&
pll_u_lock
);
clks
[
TEGRA114_CLK_PLL_U
]
=
clk
;
tegra114_utmi_param_configure
(
clk_base
);
...
...
@@ -1420,731 +1125,97 @@ static void __init tegra114_pll_init(void __iomem *clk_base,
clk
=
clk_register_gate
(
NULL
,
"pll_u_480M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
clk_base
+
PLLU_BASE
,
22
,
0
,
&
pll_u_lock
);
clk_register_clkdev
(
clk
,
"pll_u_480M"
,
NULL
);
clks
[
pll_u_480M
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_U_480M
]
=
clk
;
/* PLLU_60M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_60M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
8
);
clk_register_clkdev
(
clk
,
"pll_u_60M"
,
NULL
);
clks
[
pll_u_60M
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_U_60M
]
=
clk
;
/* PLLU_48M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_48M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
10
);
clk_register_clkdev
(
clk
,
"pll_u_48M"
,
NULL
);
clks
[
pll_u_48M
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_U_48M
]
=
clk
;
/* PLLU_12M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_12M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
40
);
clk_register_clkdev
(
clk
,
"pll_u_12M"
,
NULL
);
clks
[
pll_u_12M
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_U_12M
]
=
clk
;
/* PLLD */
clk
=
tegra_clk_register_pll
(
"pll_d"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_d_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
pll_d_freq_table
,
&
pll_d_lock
);
clk_register_clkdev
(
clk
,
"pll_d"
,
NULL
);
clks
[
pll_d
]
=
clk
;
&
pll_d_params
,
&
pll_d_lock
);
clks
[
TEGRA114_CLK_PLL_D
]
=
clk
;
/* PLLD_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d_out0"
,
"pll_d"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d_out0"
,
NULL
);
clks
[
pll_d_out0
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_D_OUT0
]
=
clk
;
/* PLLD2 */
clk
=
tegra_clk_register_pll
(
"pll_d2"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_d2_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
pll_d_freq_table
,
&
pll_d2_lock
);
clk_register_clkdev
(
clk
,
"pll_d2"
,
NULL
);
clks
[
pll_d2
]
=
clk
;
&
pll_d2_params
,
&
pll_d2_lock
);
clks
[
TEGRA114_CLK_PLL_D2
]
=
clk
;
/* PLLD2_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d2_out0"
,
"pll_d2"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d2_out0"
,
NULL
);
clks
[
pll_d2_out0
]
=
clk
;
/* PLLA */
clk
=
tegra_clk_register_pll
(
"pll_a"
,
"pll_p_out1"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_a_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
pll_a_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a"
,
NULL
);
clks
[
pll_a
]
=
clk
;
/* PLLA_OUT0 */
clk
=
tegra_clk_register_divider
(
"pll_a_out0_div"
,
"pll_a"
,
clk_base
+
PLLA_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_a_out0"
,
"pll_a_out0_div"
,
clk_base
+
PLLA_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a_out0"
,
NULL
);
clks
[
pll_a_out0
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_D2_OUT0
]
=
clk
;
/* PLLRE */
_clip_vco_min
(
&
pll_re_vco_params
);
clk
=
tegra_clk_register_pllre
(
"pll_re_vco"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
0
,
&
pll_re_vco_params
,
TEGRA_PLL_USE_LOCK
,
NULL
,
&
pll_re_lock
,
pll_ref_freq
);
clk_register_clkdev
(
clk
,
"pll_re_vco"
,
NULL
);
clks
[
pll_re_vco
]
=
clk
;
0
,
&
pll_re_vco_params
,
&
pll_re_lock
,
pll_ref_freq
);
clks
[
TEGRA114_CLK_PLL_RE_VCO
]
=
clk
;
clk
=
clk_register_divider_table
(
NULL
,
"pll_re_out"
,
"pll_re_vco"
,
0
,
clk_base
+
PLLRE_BASE
,
16
,
4
,
0
,
pll_re_div_table
,
&
pll_re_lock
);
clk_register_clkdev
(
clk
,
"pll_re_out"
,
NULL
);
clks
[
pll_re_out
]
=
clk
;
clks
[
TEGRA114_CLK_PLL_RE_OUT
]
=
clk
;
/* PLLE */
clk
=
tegra_clk_register_plle_tegra114
(
"pll_e_out0"
,
"pll_re_vco"
,
clk_base
,
0
,
100000000
,
&
pll_e_params
,
pll_e_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_e_out0"
,
NULL
);
clks
[
pll_e_out0
]
=
clk
;
}
static
const
char
*
mux_audio_sync_clk
[]
=
{
"spdif_in_sync"
,
"i2s0_sync"
,
"i2s1_sync"
,
"i2s2_sync"
,
"i2s3_sync"
,
"i2s4_sync"
,
"vimclk_sync"
,
};
static
const
char
*
clk_out1_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern1"
,
};
static
const
char
*
clk_out2_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern2"
,
};
static
const
char
*
clk_out3_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern3"
,
};
static
void
__init
tegra114_audio_clk_init
(
void
__iomem
*
clk_base
)
{
struct
clk
*
clk
;
/* spdif_in_sync */
clk
=
tegra_clk_register_sync_source
(
"spdif_in_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"spdif_in_sync"
,
NULL
);
clks
[
spdif_in_sync
]
=
clk
;
/* i2s0_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s0_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s0_sync"
,
NULL
);
clks
[
i2s0_sync
]
=
clk
;
/* i2s1_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s1_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s1_sync"
,
NULL
);
clks
[
i2s1_sync
]
=
clk
;
/* i2s2_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s2_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s2_sync"
,
NULL
);
clks
[
i2s2_sync
]
=
clk
;
/* i2s3_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s3_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s3_sync"
,
NULL
);
clks
[
i2s3_sync
]
=
clk
;
/* i2s4_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s4_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s4_sync"
,
NULL
);
clks
[
i2s4_sync
]
=
clk
;
/* vimclk_sync */
clk
=
tegra_clk_register_sync_source
(
"vimclk_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"vimclk_sync"
,
NULL
);
clks
[
vimclk_sync
]
=
clk
;
/* audio0 */
clk
=
clk_register_mux
(
NULL
,
"audio0_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S0
,
0
,
3
,
0
,
NULL
);
clks
[
audio0_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"audio0"
,
"audio0_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S0
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio0"
,
NULL
);
clks
[
audio0
]
=
clk
;
/* audio1 */
clk
=
clk_register_mux
(
NULL
,
"audio1_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S1
,
0
,
3
,
0
,
NULL
);
clks
[
audio1_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"audio1"
,
"audio1_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S1
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio1"
,
NULL
);
clks
[
audio1
]
=
clk
;
/* audio2 */
clk
=
clk_register_mux
(
NULL
,
"audio2_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S2
,
0
,
3
,
0
,
NULL
);
clks
[
audio2_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"audio2"
,
"audio2_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S2
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio2"
,
NULL
);
clks
[
audio2
]
=
clk
;
/* audio3 */
clk
=
clk_register_mux
(
NULL
,
"audio3_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S3
,
0
,
3
,
0
,
NULL
);
clks
[
audio3_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"audio3"
,
"audio3_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S3
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio3"
,
NULL
);
clks
[
audio3
]
=
clk
;
/* audio4 */
clk
=
clk_register_mux
(
NULL
,
"audio4_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S4
,
0
,
3
,
0
,
NULL
);
clks
[
audio4_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"audio4"
,
"audio4_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S4
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio4"
,
NULL
);
clks
[
audio4
]
=
clk
;
/* spdif */
clk
=
clk_register_mux
(
NULL
,
"spdif_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_SPDIF
,
0
,
3
,
0
,
NULL
);
clks
[
spdif_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"spdif"
,
"spdif_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_SPDIF
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"spdif"
,
NULL
);
clks
[
spdif
]
=
clk
;
/* audio0_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio0_doubler"
,
"audio0"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio0_div"
,
"audio0_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
24
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio0_2x"
,
"audio0_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
113
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio0_2x"
,
NULL
);
clks
[
audio0_2x
]
=
clk
;
/* audio1_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio1_doubler"
,
"audio1"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio1_div"
,
"audio1_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
25
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio1_2x"
,
"audio1_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
114
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio1_2x"
,
NULL
);
clks
[
audio1_2x
]
=
clk
;
/* audio2_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio2_doubler"
,
"audio2"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio2_div"
,
"audio2_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
26
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio2_2x"
,
"audio2_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
115
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio2_2x"
,
NULL
);
clks
[
audio2_2x
]
=
clk
;
/* audio3_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio3_doubler"
,
"audio3"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio3_div"
,
"audio3_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
27
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio3_2x"
,
"audio3_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
116
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio3_2x"
,
NULL
);
clks
[
audio3_2x
]
=
clk
;
/* audio4_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio4_doubler"
,
"audio4"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio4_div"
,
"audio4_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
28
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio4_2x"
,
"audio4_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
117
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio4_2x"
,
NULL
);
clks
[
audio4_2x
]
=
clk
;
/* spdif_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"spdif_doubler"
,
"spdif"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"spdif_div"
,
"spdif_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
29
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"spdif_2x"
,
"spdif_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
118
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"spdif_2x"
,
NULL
);
clks
[
spdif_2x
]
=
clk
;
}
static
void
__init
tegra114_pmc_clk_init
(
void
__iomem
*
pmc_base
)
{
struct
clk
*
clk
;
/* clk_out_1 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_1_mux"
,
clk_out1_parents
,
ARRAY_SIZE
(
clk_out1_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
6
,
3
,
0
,
&
clk_out_lock
);
clks
[
clk_out_1_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"clk_out_1"
,
"clk_out_1_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
2
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern1"
,
"clk_out_1"
);
clks
[
clk_out_1
]
=
clk
;
/* clk_out_2 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_2_mux"
,
clk_out2_parents
,
ARRAY_SIZE
(
clk_out2_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
14
,
3
,
0
,
&
clk_out_lock
);
clks
[
clk_out_2_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"clk_out_2"
,
"clk_out_2_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
10
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern2"
,
"clk_out_2"
);
clks
[
clk_out_2
]
=
clk
;
/* clk_out_3 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_3_mux"
,
clk_out3_parents
,
ARRAY_SIZE
(
clk_out3_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
22
,
3
,
0
,
&
clk_out_lock
);
clks
[
clk_out_3_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"clk_out_3"
,
"clk_out_3_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
18
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern3"
,
"clk_out_3"
);
clks
[
clk_out_3
]
=
clk
;
/* blink */
/* clear the blink timer register to directly output clk_32k */
writel_relaxed
(
0
,
pmc_base
+
PMC_BLINK_TIMER
);
clk
=
clk_register_gate
(
NULL
,
"blink_override"
,
"clk_32k"
,
0
,
pmc_base
+
PMC_DPD_PADS_ORIDE
,
PMC_DPD_PADS_ORIDE_BLINK_ENB
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"blink"
,
"blink_override"
,
0
,
pmc_base
+
PMC_CTRL
,
PMC_CTRL_BLINK_ENB
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"blink"
,
NULL
);
clks
[
blink
]
=
clk
;
clk
=
tegra_clk_register_plle_tegra114
(
"pll_e_out0"
,
"pll_ref"
,
clk_base
,
0
,
&
pll_e_params
,
NULL
);
clks
[
TEGRA114_CLK_PLL_E_OUT0
]
=
clk
;
}
static
const
char
*
sclk_parents
[]
=
{
"clk_m"
,
"pll_c_out1"
,
"pll_p_out4"
,
"pll_p"
,
"pll_p_out2"
,
"unused"
,
"clk_32k"
,
"pll_m_out1"
};
static
const
char
*
cclk_g_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
"pll_p"
,
"pll_p_out4"
,
"unused"
,
"unused"
,
"pll_x"
};
static
const
char
*
cclk_lp_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
"pll_p"
,
"pll_p_out4"
,
"unused"
,
"unused"
,
"pll_x"
,
"pll_x_out0"
};
static
void
__init
tegra114_super_clk_init
(
void
__iomem
*
clk_base
)
static
__init
void
tegra114_periph_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
)
{
struct
clk
*
clk
;
u32
val
;
/* CCLKG */
clk
=
tegra_clk_register_super_mux
(
"cclk_g"
,
cclk_g_parents
,
ARRAY_SIZE
(
cclk_g_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
CCLKG_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"cclk_g"
,
NULL
);
clks
[
cclk_g
]
=
clk
;
/* CCLKLP */
clk
=
tegra_clk_register_super_mux
(
"cclk_lp"
,
cclk_lp_parents
,
ARRAY_SIZE
(
cclk_lp_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
CCLKLP_BURST_POLICY
,
0
,
4
,
8
,
9
,
NULL
);
clk_register_clkdev
(
clk
,
"cclk_lp"
,
NULL
);
clks
[
cclk_lp
]
=
clk
;
/* SCLK */
clk
=
tegra_clk_register_super_mux
(
"sclk"
,
sclk_parents
,
ARRAY_SIZE
(
sclk_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
SCLK_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"sclk"
,
NULL
);
clks
[
sclk
]
=
clk
;
/* HCLK */
clk
=
clk_register_divider
(
NULL
,
"hclk_div"
,
"sclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
4
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"hclk"
,
"hclk_div"
,
CLK_SET_RATE_PARENT
|
CLK_IGNORE_UNUSED
,
clk_base
+
SYSTEM_CLK_RATE
,
7
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"hclk"
,
NULL
);
clks
[
hclk
]
=
clk
;
/* PCLK */
clk
=
clk_register_divider
(
NULL
,
"pclk_div"
,
"hclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
0
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"pclk"
,
"pclk_div"
,
CLK_SET_RATE_PARENT
|
CLK_IGNORE_UNUSED
,
clk_base
+
SYSTEM_CLK_RATE
,
3
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"pclk"
,
NULL
);
clks
[
pclk
]
=
clk
;
}
static
struct
tegra_periph_init_data
tegra_periph_clk_list
[]
=
{
TEGRA_INIT_DATA_MUX
(
"i2s0"
,
NULL
,
"tegra30-i2s.0"
,
mux_pllaout0_audio0_2x_pllp_clkm
,
CLK_SOURCE_I2S0
,
30
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s0
),
TEGRA_INIT_DATA_MUX
(
"i2s1"
,
NULL
,
"tegra30-i2s.1"
,
mux_pllaout0_audio1_2x_pllp_clkm
,
CLK_SOURCE_I2S1
,
11
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s1
),
TEGRA_INIT_DATA_MUX
(
"i2s2"
,
NULL
,
"tegra30-i2s.2"
,
mux_pllaout0_audio2_2x_pllp_clkm
,
CLK_SOURCE_I2S2
,
18
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s2
),
TEGRA_INIT_DATA_MUX
(
"i2s3"
,
NULL
,
"tegra30-i2s.3"
,
mux_pllaout0_audio3_2x_pllp_clkm
,
CLK_SOURCE_I2S3
,
101
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
i2s3
),
TEGRA_INIT_DATA_MUX
(
"i2s4"
,
NULL
,
"tegra30-i2s.4"
,
mux_pllaout0_audio4_2x_pllp_clkm
,
CLK_SOURCE_I2S4
,
102
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
i2s4
),
TEGRA_INIT_DATA_MUX
(
"spdif_out"
,
"spdif_out"
,
"tegra30-spdif"
,
mux_pllaout0_audio_2x_pllp_clkm
,
CLK_SOURCE_SPDIF_OUT
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_out
),
TEGRA_INIT_DATA_MUX
(
"spdif_in"
,
"spdif_in"
,
"tegra30-spdif"
,
mux_pllp_pllc_pllm
,
CLK_SOURCE_SPDIF_IN
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_in
),
TEGRA_INIT_DATA_MUX
(
"pwm"
,
NULL
,
"pwm"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_PWM
,
17
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
pwm
),
TEGRA_INIT_DATA_MUX
(
"adx"
,
NULL
,
"adx"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_ADX
,
154
,
&
periph_w_regs
,
TEGRA_PERIPH_ON_APB
,
adx
),
TEGRA_INIT_DATA_MUX
(
"amx"
,
NULL
,
"amx"
,
mux_plla_pllc_pllp_clkm
,
CLK_SOURCE_AMX
,
153
,
&
periph_w_regs
,
TEGRA_PERIPH_ON_APB
,
amx
),
TEGRA_INIT_DATA_MUX
(
"hda"
,
"hda"
,
"tegra30-hda"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_HDA
,
125
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
hda
),
TEGRA_INIT_DATA_MUX
(
"hda2codec_2x"
,
"hda2codec"
,
"tegra30-hda"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_HDA2CODEC_2X
,
111
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
hda2codec_2x
),
TEGRA_INIT_DATA_MUX
(
"sbc1"
,
NULL
,
"tegra11-spi.0"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC1
,
41
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc1
),
TEGRA_INIT_DATA_MUX
(
"sbc2"
,
NULL
,
"tegra11-spi.1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC2
,
44
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc2
),
TEGRA_INIT_DATA_MUX
(
"sbc3"
,
NULL
,
"tegra11-spi.2"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC3
,
46
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc3
),
TEGRA_INIT_DATA_MUX
(
"sbc4"
,
NULL
,
"tegra11-spi.3"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC4
,
68
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
sbc4
),
TEGRA_INIT_DATA_MUX
(
"sbc5"
,
NULL
,
"tegra11-spi.4"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC5
,
104
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sbc5
),
TEGRA_INIT_DATA_MUX
(
"sbc6"
,
NULL
,
"tegra11-spi.5"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SBC6
,
105
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sbc6
),
TEGRA_INIT_DATA_MUX8
(
"ndflash"
,
NULL
,
"tegra_nand"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_NDFLASH
,
13
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
ndspeed
),
TEGRA_INIT_DATA_MUX8
(
"ndspeed"
,
NULL
,
"tegra_nand_speed"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_NDSPEED
,
80
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
ndspeed
),
TEGRA_INIT_DATA_MUX
(
"vfir"
,
NULL
,
"vfir"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_VFIR
,
7
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
vfir
),
TEGRA_INIT_DATA_MUX
(
"sdmmc1"
,
NULL
,
"sdhci-tegra.0"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC1
,
14
,
&
periph_l_regs
,
0
,
sdmmc1
),
TEGRA_INIT_DATA_MUX
(
"sdmmc2"
,
NULL
,
"sdhci-tegra.1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC2
,
9
,
&
periph_l_regs
,
0
,
sdmmc2
),
TEGRA_INIT_DATA_MUX
(
"sdmmc3"
,
NULL
,
"sdhci-tegra.2"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC3
,
69
,
&
periph_u_regs
,
0
,
sdmmc3
),
TEGRA_INIT_DATA_MUX
(
"sdmmc4"
,
NULL
,
"sdhci-tegra.3"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_SDMMC4
,
15
,
&
periph_l_regs
,
0
,
sdmmc4
),
TEGRA_INIT_DATA_INT
(
"vde"
,
NULL
,
"vde"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_VDE
,
61
,
&
periph_h_regs
,
0
,
vde
),
TEGRA_INIT_DATA_MUX_FLAGS
(
"csite"
,
NULL
,
"csite"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_CSITE
,
73
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
csite
,
CLK_IGNORE_UNUSED
),
TEGRA_INIT_DATA_MUX
(
"la"
,
NULL
,
"la"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_LA
,
76
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
la
),
TEGRA_INIT_DATA_MUX
(
"trace"
,
NULL
,
"trace"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_TRACE
,
77
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
trace
),
TEGRA_INIT_DATA_MUX
(
"owr"
,
NULL
,
"tegra_w1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_OWR
,
71
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
owr
),
TEGRA_INIT_DATA_MUX
(
"nor"
,
NULL
,
"tegra-nor"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_NOR
,
42
,
&
periph_h_regs
,
0
,
nor
),
TEGRA_INIT_DATA_MUX
(
"mipi"
,
NULL
,
"mipi"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_MIPI
,
50
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
mipi
),
TEGRA_INIT_DATA_I2C
(
"i2c1"
,
"div-clk"
,
"tegra11-i2c.0"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C1
,
12
,
&
periph_l_regs
,
i2c1
),
TEGRA_INIT_DATA_I2C
(
"i2c2"
,
"div-clk"
,
"tegra11-i2c.1"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C2
,
54
,
&
periph_h_regs
,
i2c2
),
TEGRA_INIT_DATA_I2C
(
"i2c3"
,
"div-clk"
,
"tegra11-i2c.2"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C3
,
67
,
&
periph_u_regs
,
i2c3
),
TEGRA_INIT_DATA_I2C
(
"i2c4"
,
"div-clk"
,
"tegra11-i2c.3"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C4
,
103
,
&
periph_v_regs
,
i2c4
),
TEGRA_INIT_DATA_I2C
(
"i2c5"
,
"div-clk"
,
"tegra11-i2c.4"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C5
,
47
,
&
periph_h_regs
,
i2c5
),
TEGRA_INIT_DATA_UART
(
"uarta"
,
NULL
,
"tegra_uart.0"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTA
,
6
,
&
periph_l_regs
,
uarta
),
TEGRA_INIT_DATA_UART
(
"uartb"
,
NULL
,
"tegra_uart.1"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTB
,
7
,
&
periph_l_regs
,
uartb
),
TEGRA_INIT_DATA_UART
(
"uartc"
,
NULL
,
"tegra_uart.2"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTC
,
55
,
&
periph_h_regs
,
uartc
),
TEGRA_INIT_DATA_UART
(
"uartd"
,
NULL
,
"tegra_uart.3"
,
mux_pllp_pllc_pllm_clkm
,
CLK_SOURCE_UARTD
,
65
,
&
periph_u_regs
,
uartd
),
TEGRA_INIT_DATA_INT
(
"3d"
,
NULL
,
"3d"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_3D
,
24
,
&
periph_l_regs
,
0
,
gr_3d
),
TEGRA_INIT_DATA_INT
(
"2d"
,
NULL
,
"2d"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_2D
,
21
,
&
periph_l_regs
,
0
,
gr_2d
),
TEGRA_INIT_DATA_MUX
(
"vi_sensor"
,
"vi_sensor"
,
"tegra_camera"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_VI_SENSOR
,
20
,
&
periph_l_regs
,
TEGRA_PERIPH_NO_RESET
,
vi_sensor
),
TEGRA_INIT_DATA_INT8
(
"vi"
,
"vi"
,
"tegra_camera"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_VI
,
20
,
&
periph_l_regs
,
0
,
vi
),
TEGRA_INIT_DATA_INT8
(
"epp"
,
NULL
,
"epp"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_EPP
,
19
,
&
periph_l_regs
,
0
,
epp
),
TEGRA_INIT_DATA_INT8
(
"msenc"
,
NULL
,
"msenc"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_MSENC
,
91
,
&
periph_u_regs
,
TEGRA_PERIPH_WAR_1005168
,
msenc
),
TEGRA_INIT_DATA_INT8
(
"tsec"
,
NULL
,
"tsec"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_TSEC
,
83
,
&
periph_u_regs
,
0
,
tsec
),
TEGRA_INIT_DATA_INT8
(
"host1x"
,
NULL
,
"host1x"
,
mux_pllm_pllc2_c_c3_pllp_plla
,
CLK_SOURCE_HOST1X
,
28
,
&
periph_l_regs
,
0
,
host1x
),
TEGRA_INIT_DATA_MUX8
(
"hdmi"
,
NULL
,
"hdmi"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_HDMI
,
51
,
&
periph_h_regs
,
0
,
hdmi
),
TEGRA_INIT_DATA_MUX
(
"cilab"
,
"cilab"
,
"tegra_camera"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILAB
,
144
,
&
periph_w_regs
,
0
,
cilab
),
TEGRA_INIT_DATA_MUX
(
"cilcd"
,
"cilcd"
,
"tegra_camera"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILCD
,
145
,
&
periph_w_regs
,
0
,
cilcd
),
TEGRA_INIT_DATA_MUX
(
"cile"
,
"cile"
,
"tegra_camera"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_CILE
,
146
,
&
periph_w_regs
,
0
,
cile
),
TEGRA_INIT_DATA_MUX
(
"dsialp"
,
"dsialp"
,
"tegradc.0"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_DSIALP
,
147
,
&
periph_w_regs
,
0
,
dsialp
),
TEGRA_INIT_DATA_MUX
(
"dsiblp"
,
"dsiblp"
,
"tegradc.1"
,
mux_pllp_pllc_clkm
,
CLK_SOURCE_DSIBLP
,
148
,
&
periph_w_regs
,
0
,
dsiblp
),
TEGRA_INIT_DATA_MUX
(
"tsensor"
,
NULL
,
"tegra-tsensor"
,
mux_pllp_pllc_clkm_clk32
,
CLK_SOURCE_TSENSOR
,
100
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
tsensor
),
TEGRA_INIT_DATA_MUX
(
"actmon"
,
NULL
,
"actmon"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_ACTMON
,
119
,
&
periph_v_regs
,
0
,
actmon
),
TEGRA_INIT_DATA_MUX8
(
"extern1"
,
NULL
,
"extern1"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN1
,
120
,
&
periph_v_regs
,
0
,
extern1
),
TEGRA_INIT_DATA_MUX8
(
"extern2"
,
NULL
,
"extern2"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN2
,
121
,
&
periph_v_regs
,
0
,
extern2
),
TEGRA_INIT_DATA_MUX8
(
"extern3"
,
NULL
,
"extern3"
,
mux_plla_clk32_pllp_clkm_plle
,
CLK_SOURCE_EXTERN3
,
122
,
&
periph_v_regs
,
0
,
extern3
),
TEGRA_INIT_DATA_MUX
(
"i2cslow"
,
NULL
,
"i2cslow"
,
mux_pllp_pllc_clk32_clkm
,
CLK_SOURCE_I2CSLOW
,
81
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
i2cslow
),
TEGRA_INIT_DATA_INT8
(
"se"
,
NULL
,
"se"
,
mux_pllp_pllc2_c_c3_pllm_clkm
,
CLK_SOURCE_SE
,
127
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
se
),
TEGRA_INIT_DATA_INT_FLAGS
(
"mselect"
,
NULL
,
"mselect"
,
mux_pllp_clkm
,
CLK_SOURCE_MSELECT
,
99
,
&
periph_v_regs
,
0
,
mselect
,
CLK_IGNORE_UNUSED
),
TEGRA_INIT_DATA_MUX
(
"dfll_ref"
,
"ref"
,
"t114_dfll"
,
mux_pllp_clkm
,
CLK_SOURCE_DFLL_REF
,
155
,
&
periph_w_regs
,
TEGRA_PERIPH_ON_APB
,
dfll_ref
),
TEGRA_INIT_DATA_MUX
(
"dfll_soc"
,
"soc"
,
"t114_dfll"
,
mux_pllp_clkm
,
CLK_SOURCE_DFLL_SOC
,
155
,
&
periph_w_regs
,
TEGRA_PERIPH_ON_APB
,
dfll_soc
),
TEGRA_INIT_DATA_MUX8
(
"soc_therm"
,
NULL
,
"soc_therm"
,
mux_pllm_pllc_pllp_plla
,
CLK_SOURCE_SOC_THERM
,
78
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
soc_therm
),
TEGRA_INIT_DATA_XUSB
(
"xusb_host_src"
,
"host_src"
,
"tegra_xhci"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_HOST_SRC
,
143
,
&
periph_w_regs
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
xusb_host_src
),
TEGRA_INIT_DATA_XUSB
(
"xusb_falcon_src"
,
"falcon_src"
,
"tegra_xhci"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_FALCON_SRC
,
143
,
&
periph_w_regs
,
TEGRA_PERIPH_NO_RESET
,
xusb_falcon_src
),
TEGRA_INIT_DATA_XUSB
(
"xusb_fs_src"
,
"fs_src"
,
"tegra_xhci"
,
mux_clkm_48M_pllp_480M
,
CLK_SOURCE_XUSB_FS_SRC
,
143
,
&
periph_w_regs
,
TEGRA_PERIPH_NO_RESET
,
xusb_fs_src
),
TEGRA_INIT_DATA_XUSB
(
"xusb_ss_src"
,
"ss_src"
,
"tegra_xhci"
,
mux_clkm_pllre_clk32_480M_pllc_ref
,
CLK_SOURCE_XUSB_SS_SRC
,
143
,
&
periph_w_regs
,
TEGRA_PERIPH_NO_RESET
,
xusb_ss_src
),
TEGRA_INIT_DATA_XUSB
(
"xusb_dev_src"
,
"dev_src"
,
"tegra_xhci"
,
mux_clkm_pllp_pllc_pllre
,
CLK_SOURCE_XUSB_DEV_SRC
,
95
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
xusb_dev_src
),
TEGRA_INIT_DATA_AUDIO
(
"d_audio"
,
"d_audio"
,
"tegra30-ahub"
,
CLK_SOURCE_D_AUDIO
,
106
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
d_audio
),
TEGRA_INIT_DATA_AUDIO
(
"dam0"
,
NULL
,
"tegra30-dam.0"
,
CLK_SOURCE_DAM0
,
108
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
dam0
),
TEGRA_INIT_DATA_AUDIO
(
"dam1"
,
NULL
,
"tegra30-dam.1"
,
CLK_SOURCE_DAM1
,
109
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
dam1
),
TEGRA_INIT_DATA_AUDIO
(
"dam2"
,
NULL
,
"tegra30-dam.2"
,
CLK_SOURCE_DAM2
,
110
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
dam2
),
};
static
struct
tegra_periph_init_data
tegra_periph_nodiv_clk_list
[]
=
{
TEGRA_INIT_DATA_NODIV
(
"disp1"
,
NULL
,
"tegradc.0"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_DISP1
,
29
,
7
,
27
,
&
periph_l_regs
,
0
,
disp1
),
TEGRA_INIT_DATA_NODIV
(
"disp2"
,
NULL
,
"tegradc.1"
,
mux_pllp_pllm_plld_plla_pllc_plld2_clkm
,
CLK_SOURCE_DISP2
,
29
,
7
,
26
,
&
periph_l_regs
,
0
,
disp2
),
};
/* xusb_hs_src */
val
=
readl
(
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
val
|=
BIT
(
25
);
/* always select PLLU_60M */
writel
(
val
,
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
static
__init
void
tegra114_periph_clk_init
(
void
__iomem
*
clk_base
)
{
struct
tegra_periph_init_data
*
data
;
struct
clk
*
clk
;
int
i
;
u32
val
;
clk
=
clk_register_fixed_factor
(
NULL
,
"xusb_hs_src"
,
"pll_u_60M"
,
0
,
1
,
1
);
clks
[
TEGRA114_CLK_XUSB_HS_SRC
]
=
clk
;
/* apbdma */
clk
=
tegra_clk_register_periph_gate
(
"apbdma"
,
"clk_m"
,
0
,
clk_base
,
0
,
34
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
apbdma
]
=
clk
;
/* rtc */
clk
=
tegra_clk_register_periph_gate
(
"rtc"
,
"clk_32k"
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
clk_base
,
0
,
4
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"rtc-tegra"
);
clks
[
rtc
]
=
clk
;
/* kbc */
clk
=
tegra_clk_register_periph_gate
(
"kbc"
,
"clk_32k"
,
TEGRA_PERIPH_ON_APB
|
TEGRA_PERIPH_NO_RESET
,
clk_base
,
0
,
36
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
kbc
]
=
clk
;
/* timer */
clk
=
tegra_clk_register_periph_gate
(
"timer"
,
"clk_m"
,
0
,
clk_base
,
0
,
5
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"timer"
);
clks
[
timer
]
=
clk
;
/* kfuse */
clk
=
tegra_clk_register_periph_gate
(
"kfuse"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
40
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
kfuse
]
=
clk
;
/* fuse */
clk
=
tegra_clk_register_periph_gate
(
"fuse"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
39
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
fuse
]
=
clk
;
/* fuse_burn */
clk
=
tegra_clk_register_periph_gate
(
"fuse_burn"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
39
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
fuse_burn
]
=
clk
;
/* apbif */
clk
=
tegra_clk_register_periph_gate
(
"apbif"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
107
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clks
[
apbif
]
=
clk
;
/* hda2hdmi */
clk
=
tegra_clk_register_periph_gate
(
"hda2hdmi"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
128
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clks
[
hda2hdmi
]
=
clk
;
/* vcp */
clk
=
tegra_clk_register_periph_gate
(
"vcp"
,
"clk_m"
,
0
,
clk_base
,
0
,
29
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clks
[
vcp
]
=
clk
;
/* bsea */
clk
=
tegra_clk_register_periph_gate
(
"bsea"
,
"clk_m"
,
0
,
clk_base
,
0
,
62
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
bsea
]
=
clk
;
/* bsev */
clk
=
tegra_clk_register_periph_gate
(
"bsev"
,
"clk_m"
,
0
,
clk_base
,
0
,
63
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
bsev
]
=
clk
;
/* mipi-cal */
clk
=
tegra_clk_register_periph_gate
(
"mipi-cal"
,
"clk_m"
,
0
,
clk_base
,
0
,
56
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
mipi_cal
]
=
clk
;
/* usbd */
clk
=
tegra_clk_register_periph_gate
(
"usbd"
,
"clk_m"
,
0
,
clk_base
,
0
,
22
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clks
[
usbd
]
=
clk
;
/* usb2 */
clk
=
tegra_clk_register_periph_gate
(
"usb2"
,
"clk_m"
,
0
,
clk_base
,
0
,
58
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
usb2
]
=
clk
;
/* usb3 */
clk
=
tegra_clk_register_periph_gate
(
"usb3"
,
"clk_m"
,
0
,
clk_base
,
0
,
59
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
usb3
]
=
clk
;
/* csi */
clk
=
tegra_clk_register_periph_gate
(
"csi"
,
"pll_p_out3"
,
0
,
clk_base
,
0
,
52
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
csi
]
=
clk
;
/* isp */
clk
=
tegra_clk_register_periph_gate
(
"isp"
,
"clk_m"
,
0
,
clk_base
,
0
,
23
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clks
[
isp
]
=
clk
;
/* csus */
clk
=
tegra_clk_register_periph_gate
(
"csus"
,
"clk_m"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
0
,
92
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clks
[
csus
]
=
clk
;
/* dds */
clk
=
tegra_clk_register_periph_gate
(
"dds"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
150
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clks
[
dds
]
=
clk
;
/* dp2 */
clk
=
tegra_clk_register_periph_gate
(
"dp2"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
152
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clks
[
dp2
]
=
clk
;
/* dtv */
clk
=
tegra_clk_register_periph_gate
(
"dtv"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
79
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clks
[
dtv
]
=
clk
;
/* dsia */
/* dsia mux */
clk
=
clk_register_mux
(
NULL
,
"dsia_mux"
,
mux_plld_out0_plld2_out0
,
ARRAY_SIZE
(
mux_plld_out0_plld2_out0
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
PLLD_BASE
,
25
,
1
,
0
,
&
pll_d_lock
);
clks
[
dsia_mux
]
=
clk
;
clk
=
tegra_clk_register_periph_gate
(
"dsia"
,
"dsia_mux"
,
0
,
clk_base
,
0
,
48
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
dsia
]
=
clk
;
clks
[
TEGRA114_CLK_DSIA_MUX
]
=
clk
;
/* dsib */
/* dsib
mux
*/
clk
=
clk_register_mux
(
NULL
,
"dsib_mux"
,
mux_plld_out0_plld2_out0
,
ARRAY_SIZE
(
mux_plld_out0_plld2_out0
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
PLLD2_BASE
,
25
,
1
,
0
,
&
pll_d2_lock
);
clks
[
dsib_mux
]
=
clk
;
clk
=
tegra_clk_register_periph_gate
(
"dsib"
,
"dsib_mux"
,
0
,
clk_base
,
0
,
82
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clks
[
dsib
]
=
clk
;
clks
[
TEGRA114_CLK_DSIB_MUX
]
=
clk
;
/* xusb_hs_src */
val
=
readl
(
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
val
|=
BIT
(
25
);
/* always select PLLU_60M */
writel
(
val
,
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
clk
=
clk_register_fixed_factor
(
NULL
,
"xusb_hs_src"
,
"pll_u_60M"
,
0
,
1
,
1
);
clks
[
xusb_hs_src
]
=
clk
;
/* xusb_host */
clk
=
tegra_clk_register_periph_gate
(
"xusb_host"
,
"xusb_host_src"
,
0
,
clk_base
,
0
,
89
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clks
[
xusb_host
]
=
clk
;
/* xusb_ss */
clk
=
tegra_clk_register_periph_gate
(
"xusb_ss"
,
"xusb_ss_src"
,
0
,
clk_base
,
0
,
156
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clks
[
xusb_host
]
=
clk
;
/* xusb_dev */
clk
=
tegra_clk_register_periph_gate
(
"xusb_dev"
,
"xusb_dev_src"
,
0
,
clk_base
,
0
,
95
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clks
[
xusb_dev
]
=
clk
;
/* emc */
/* emc mux */
clk
=
clk_register_mux
(
NULL
,
"emc_mux"
,
mux_pllmcp_clkm
,
ARRAY_SIZE
(
mux_pllmcp_clkm
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
CLK_SOURCE_EMC
,
29
,
3
,
0
,
NULL
);
clk
=
tegra_clk_register_periph_gate
(
"emc"
,
"emc_mux"
,
0
,
clk_base
,
CLK_IGNORE_UNUSED
,
57
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clks
[
emc
]
=
clk
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_clk_list
);
i
++
)
{
data
=
&
tegra_periph_clk_list
[
i
];
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
parent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
,
data
->
flags
);
clks
[
data
->
clk_id
]
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_nodiv_clk_list
);
i
++
)
{
data
=
&
tegra_periph_nodiv_clk_list
[
i
];
clk
=
tegra_clk_register_periph_nodiv
(
data
->
name
,
data
->
parent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
);
clks
[
data
->
clk_id
]
=
clk
;
}
tegra_periph_clk_init
(
clk_base
,
pmc_base
,
tegra114_clks
,
&
pll_p_params
);
}
/* Tegra114 CPU clock and reset control functions */
...
...
@@ -2207,28 +1278,37 @@ static const struct of_device_id pmc_match[] __initconst = {
* breaks
*/
static
struct
tegra_clk_init_table
init_table
[]
__initdata
=
{
{
uarta
,
pll_p
,
408000000
,
0
},
{
uartb
,
pll_p
,
408000000
,
0
},
{
uartc
,
pll_p
,
408000000
,
0
},
{
uartd
,
pll_p
,
408000000
,
0
},
{
pll_a
,
clk_max
,
564480000
,
1
},
{
pll_a_out0
,
clk_max
,
11289600
,
1
},
{
extern1
,
pll_a_out0
,
0
,
1
},
{
clk_out_1_mux
,
extern1
,
0
,
1
},
{
clk_out_1
,
clk_max
,
0
,
1
},
{
i2s0
,
pll_a_out0
,
11289600
,
0
},
{
i2s1
,
pll_a_out0
,
11289600
,
0
},
{
i2s2
,
pll_a_out0
,
11289600
,
0
},
{
i2s3
,
pll_a_out0
,
11289600
,
0
},
{
i2s4
,
pll_a_out0
,
11289600
,
0
},
{
dfll_soc
,
pll_p
,
51000000
,
1
},
{
dfll_ref
,
pll_p
,
51000000
,
1
},
{
clk_max
,
clk_max
,
0
,
0
},
/* This MUST be the last entry. */
{
TEGRA114_CLK_UARTA
,
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_UARTD
,
TEGRA114_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA114_CLK_PLL_A
,
TEGRA114_CLK_CLK_MAX
,
564480000
,
1
},
{
TEGRA114_CLK_PLL_A_OUT0
,
TEGRA114_CLK_CLK_MAX
,
11289600
,
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
,
TEGRA114_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA114_CLK_I2S0
,
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_I2S3
,
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_DFLL_SOC
,
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_DISP2
,
TEGRA114_CLK_PLL_P
,
0
,
0
},
{
TEGRA114_CLK_GR2D
,
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_DSIBLP
,
TEGRA114_CLK_PLL_P
,
68000000
,
0
},
/* This MUST be the last entry. */
{
TEGRA114_CLK_CLK_MAX
,
TEGRA114_CLK_CLK_MAX
,
0
,
0
},
};
static
void
__init
tegra114_clock_apply_init_table
(
void
)
{
tegra_init_from_table
(
init_table
,
clks
,
clk_max
);
tegra_init_from_table
(
init_table
,
clks
,
TEGRA114_CLK_CLK_MAX
);
}
...
...
@@ -2359,7 +1439,6 @@ EXPORT_SYMBOL(tegra114_clock_deassert_dfll_dvco_reset);
static
void
__init
tegra114_clock_init
(
struct
device_node
*
np
)
{
struct
device_node
*
node
;
int
i
;
clk_base
=
of_iomap
(
np
,
0
);
if
(
!
clk_base
)
{
...
...
@@ -2381,29 +1460,23 @@ static void __init tegra114_clock_init(struct device_node *np)
return
;
}
clks
=
tegra_clk_init
(
TEGRA114_CLK_CLK_MAX
,
TEGRA114_CLK_PERIPH_BANKS
);
if
(
!
clks
)
return
;
if
(
tegra114_osc_clk_init
(
clk_base
)
<
0
)
return
;
tegra114_fixed_clk_init
(
clk_base
);
tegra114_pll_init
(
clk_base
,
pmc_base
);
tegra114_periph_clk_init
(
clk_base
);
tegra114_audio_clk_init
(
clk_base
);
tegra114_pmc_clk_init
(
pmc_base
);
tegra114_super_clk_init
(
clk_base
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
clks
);
i
++
)
{
if
(
IS_ERR
(
clks
[
i
]))
{
pr_err
(
"Tegra114 clk %d: register failed with %ld
\n
"
,
i
,
PTR_ERR
(
clks
[
i
]));
}
if
(
!
clks
[
i
])
clks
[
i
]
=
ERR_PTR
(
-
EINVAL
);
}
clk_data
.
clks
=
clks
;
clk_data
.
clk_num
=
ARRAY_SIZE
(
clks
);
of_clk_add_provider
(
np
,
of_clk_src_onecell_get
,
&
clk_data
);
tegra114_periph_clk_init
(
clk_base
,
pmc_base
);
tegra_audio_clk_init
(
clk_base
,
pmc_base
,
tegra114_clks
,
&
pll_a_params
);
tegra_pmc_clk_init
(
pmc_base
,
tegra114_clks
);
tegra_super_clk_gen4_init
(
clk_base
,
pmc_base
,
tegra114_clks
,
&
pll_x_params
);
tegra_add_of_provider
(
np
);
tegra_register_devclks
(
devclks
,
ARRAY_SIZE
(
devclks
));
tegra_clk_apply_init_table
=
tegra114_clock_apply_init_table
;
...
...
drivers/clk/tegra/clk-tegra124.c
0 → 100644
View file @
e9827d9b
/*
* Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/clk/tegra.h>
#include <dt-bindings/clock/tegra124-car.h>
#include "clk.h"
#include "clk-id.h"
#define CLK_SOURCE_CSITE 0x1d4
#define CLK_SOURCE_EMC 0x19c
#define CLK_SOURCE_XUSB_SS_SRC 0x610
#define PLLC_BASE 0x80
#define PLLC_OUT 0x84
#define PLLC_MISC2 0x88
#define PLLC_MISC 0x8c
#define PLLC2_BASE 0x4e8
#define PLLC2_MISC 0x4ec
#define PLLC3_BASE 0x4fc
#define PLLC3_MISC 0x500
#define PLLM_BASE 0x90
#define PLLM_OUT 0x94
#define PLLM_MISC 0x9c
#define PLLP_BASE 0xa0
#define PLLP_MISC 0xac
#define PLLA_BASE 0xb0
#define PLLA_MISC 0xbc
#define PLLD_BASE 0xd0
#define PLLD_MISC 0xdc
#define PLLU_BASE 0xc0
#define PLLU_MISC 0xcc
#define PLLX_BASE 0xe0
#define PLLX_MISC 0xe4
#define PLLX_MISC2 0x514
#define PLLX_MISC3 0x518
#define PLLE_BASE 0xe8
#define PLLE_MISC 0xec
#define PLLD2_BASE 0x4b8
#define PLLD2_MISC 0x4bc
#define PLLE_AUX 0x48c
#define PLLRE_BASE 0x4c4
#define PLLRE_MISC 0x4c8
#define PLLDP_BASE 0x590
#define PLLDP_MISC 0x594
#define PLLC4_BASE 0x5a4
#define PLLC4_MISC 0x5a8
#define PLLC_IDDQ_BIT 26
#define PLLRE_IDDQ_BIT 16
#define PLLSS_IDDQ_BIT 19
#define PLL_BASE_LOCK BIT(27)
#define PLLE_MISC_LOCK BIT(11)
#define PLLRE_MISC_LOCK BIT(24)
#define PLL_MISC_LOCK_ENABLE 18
#define PLLC_MISC_LOCK_ENABLE 24
#define PLLDU_MISC_LOCK_ENABLE 22
#define PLLE_MISC_LOCK_ENABLE 9
#define PLLRE_MISC_LOCK_ENABLE 30
#define PLLSS_MISC_LOCK_ENABLE 30
#define PLLXC_SW_MAX_P 6
#define PMC_PLLM_WB0_OVERRIDE 0x1dc
#define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
#define UTMIP_PLL_CFG2 0x488
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6)
#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
#define UTMIP_PLL_CFG1 0x484
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
#define UTMIPLL_HW_PWRDN_CFG0 0x52c
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
/* Tegra CPU clock and reset control regs */
#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
#ifdef CONFIG_PM_SLEEP
static
struct
cpu_clk_suspend_context
{
u32
clk_csite_src
;
}
tegra124_cpu_clk_sctx
;
#endif
static
void
__iomem
*
clk_base
;
static
void
__iomem
*
pmc_base
;
static
unsigned
long
osc_freq
;
static
unsigned
long
pll_ref_freq
;
static
DEFINE_SPINLOCK
(
pll_d_lock
);
static
DEFINE_SPINLOCK
(
pll_d2_lock
);
static
DEFINE_SPINLOCK
(
pll_e_lock
);
static
DEFINE_SPINLOCK
(
pll_re_lock
);
static
DEFINE_SPINLOCK
(
pll_u_lock
);
/* possible OSC frequencies in Hz */
static
unsigned
long
tegra124_input_freq
[]
=
{
[
0
]
=
13000000
,
[
1
]
=
16800000
,
[
4
]
=
19200000
,
[
5
]
=
38400000
,
[
8
]
=
12000000
,
[
9
]
=
48000000
,
[
12
]
=
260000000
,
};
static
const
char
*
mux_plld_out0_plld2_out0
[]
=
{
"pll_d_out0"
,
"pll_d2_out0"
,
};
#define mux_plld_out0_plld2_out0_idx NULL
static
const
char
*
mux_pllmcp_clkm
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"clk_m"
,
"pll_m_ud"
,
"pll_c2"
,
"pll_c3"
,
};
#define mux_pllmcp_clkm_idx NULL
static
struct
div_nmp
pllxc_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
8
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
divp_shift
=
20
,
.
divp_width
=
4
,
};
static
struct
pdiv_map
pllxc_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
tegra_clk_pll_freq_table
pll_x_freq_table
[]
=
{
/* 1 GHz */
{
12000000
,
1000000000
,
83
,
0
,
1
},
/* actual: 996.0 MHz */
{
13000000
,
1000000000
,
76
,
0
,
1
},
/* actual: 988.0 MHz */
{
16800000
,
1000000000
,
59
,
0
,
1
},
/* actual: 991.2 MHz */
{
19200000
,
1000000000
,
52
,
0
,
1
},
/* actual: 998.4 MHz */
{
26000000
,
1000000000
,
76
,
1
,
1
},
/* actual: 988.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_x_params
=
{
.
input_min
=
12000000
,
.
input_max
=
800000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 50 MHz */
.
vco_min
=
700000000
,
.
vco_max
=
3000000000UL
,
.
base_reg
=
PLLX_BASE
,
.
misc_reg
=
PLLX_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLX_MISC3
,
.
iddq_bit_idx
=
3
,
.
max_p
=
6
,
.
dyn_ramp_reg
=
PLLX_MISC2
,
.
stepa_shift
=
16
,
.
stepb_shift
=
24
,
.
pdiv_tohw
=
pllxc_p
,
.
div_nmp
=
&
pllxc_nmp
,
.
freq_table
=
pll_x_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_c_freq_table
[]
=
{
{
12000000
,
624000000
,
104
,
1
,
2
},
{
12000000
,
600000000
,
100
,
1
,
2
},
{
13000000
,
600000000
,
92
,
1
,
2
},
/* actual: 598.0 MHz */
{
16800000
,
600000000
,
71
,
1
,
2
},
/* actual: 596.4 MHz */
{
19200000
,
600000000
,
62
,
1
,
2
},
/* actual: 595.2 MHz */
{
26000000
,
600000000
,
92
,
2
,
2
},
/* actual: 598.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_c_params
=
{
.
input_min
=
12000000
,
.
input_max
=
800000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 50 MHz */
.
vco_min
=
600000000
,
.
vco_max
=
1400000000
,
.
base_reg
=
PLLC_BASE
,
.
misc_reg
=
PLLC_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLC_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLC_MISC
,
.
iddq_bit_idx
=
PLLC_IDDQ_BIT
,
.
max_p
=
PLLXC_SW_MAX_P
,
.
dyn_ramp_reg
=
PLLC_MISC2
,
.
stepa_shift
=
17
,
.
stepb_shift
=
9
,
.
pdiv_tohw
=
pllxc_p
,
.
div_nmp
=
&
pllxc_nmp
,
.
freq_table
=
pll_c_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllcx_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
2
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
divp_shift
=
20
,
.
divp_width
=
3
,
};
static
struct
pdiv_map
pllc_p
[]
=
{
{
.
pdiv
=
1
,
.
hw_val
=
0
},
{
.
pdiv
=
2
,
.
hw_val
=
1
},
{
.
pdiv
=
3
,
.
hw_val
=
2
},
{
.
pdiv
=
4
,
.
hw_val
=
3
},
{
.
pdiv
=
6
,
.
hw_val
=
4
},
{
.
pdiv
=
8
,
.
hw_val
=
5
},
{
.
pdiv
=
12
,
.
hw_val
=
6
},
{
.
pdiv
=
16
,
.
hw_val
=
7
},
{
.
pdiv
=
0
,
.
hw_val
=
0
},
};
static
struct
tegra_clk_pll_freq_table
pll_cx_freq_table
[]
=
{
{
12000000
,
600000000
,
100
,
1
,
2
},
{
13000000
,
600000000
,
92
,
1
,
2
},
/* actual: 598.0 MHz */
{
16800000
,
600000000
,
71
,
1
,
2
},
/* actual: 596.4 MHz */
{
19200000
,
600000000
,
62
,
1
,
2
},
/* actual: 595.2 MHz */
{
26000000
,
600000000
,
92
,
2
,
2
},
/* actual: 598.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_c2_params
=
{
.
input_min
=
12000000
,
.
input_max
=
48000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
.
vco_min
=
600000000
,
.
vco_max
=
1200000000
,
.
base_reg
=
PLLC2_BASE
,
.
misc_reg
=
PLLC2_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
pdiv_tohw
=
pllc_p
,
.
div_nmp
=
&
pllcx_nmp
,
.
max_p
=
7
,
.
ext_misc_reg
[
0
]
=
0x4f0
,
.
ext_misc_reg
[
1
]
=
0x4f4
,
.
ext_misc_reg
[
2
]
=
0x4f8
,
.
freq_table
=
pll_cx_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_c3_params
=
{
.
input_min
=
12000000
,
.
input_max
=
48000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
.
vco_min
=
600000000
,
.
vco_max
=
1200000000
,
.
base_reg
=
PLLC3_BASE
,
.
misc_reg
=
PLLC3_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
pdiv_tohw
=
pllc_p
,
.
div_nmp
=
&
pllcx_nmp
,
.
max_p
=
7
,
.
ext_misc_reg
[
0
]
=
0x504
,
.
ext_misc_reg
[
1
]
=
0x508
,
.
ext_misc_reg
[
2
]
=
0x50c
,
.
freq_table
=
pll_cx_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllss_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
8
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
divp_shift
=
20
,
.
divp_width
=
4
,
};
static
struct
pdiv_map
pll12g_ssd_esd_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
tegra_clk_pll_freq_table
pll_c4_freq_table
[]
=
{
{
12000000
,
600000000
,
100
,
1
,
1
},
{
13000000
,
600000000
,
92
,
1
,
1
},
/* actual: 598.0 MHz */
{
16800000
,
600000000
,
71
,
1
,
1
},
/* actual: 596.4 MHz */
{
19200000
,
600000000
,
62
,
1
,
1
},
/* actual: 595.2 MHz */
{
26000000
,
600000000
,
92
,
2
,
1
},
/* actual: 598.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_c4_params
=
{
.
input_min
=
12000000
,
.
input_max
=
1000000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 38 MHz */
.
vco_min
=
600000000
,
.
vco_max
=
1200000000
,
.
base_reg
=
PLLC4_BASE
,
.
misc_reg
=
PLLC4_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLSS_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLC4_BASE
,
.
iddq_bit_idx
=
PLLSS_IDDQ_BIT
,
.
pdiv_tohw
=
pll12g_ssd_esd_p
,
.
div_nmp
=
&
pllss_nmp
,
.
ext_misc_reg
[
0
]
=
0x5ac
,
.
ext_misc_reg
[
1
]
=
0x5b0
,
.
ext_misc_reg
[
2
]
=
0x5b4
,
.
freq_table
=
pll_c4_freq_table
,
};
static
struct
pdiv_map
pllm_p
[]
=
{
{
.
pdiv
=
1
,
.
hw_val
=
0
},
{
.
pdiv
=
2
,
.
hw_val
=
1
},
{
.
pdiv
=
0
,
.
hw_val
=
0
},
};
static
struct
tegra_clk_pll_freq_table
pll_m_freq_table
[]
=
{
{
12000000
,
800000000
,
66
,
1
,
1
},
/* actual: 792.0 MHz */
{
13000000
,
800000000
,
61
,
1
,
1
},
/* actual: 793.0 MHz */
{
16800000
,
800000000
,
47
,
1
,
1
},
/* actual: 789.6 MHz */
{
19200000
,
800000000
,
41
,
1
,
1
},
/* actual: 787.2 MHz */
{
26000000
,
800000000
,
61
,
2
,
1
},
/* actual: 793.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
div_nmp
pllm_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
8
,
.
override_divm_shift
=
0
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
override_divn_shift
=
8
,
.
divp_shift
=
20
,
.
divp_width
=
1
,
.
override_divp_shift
=
27
,
};
static
struct
tegra_clk_pll_params
pll_m_params
=
{
.
input_min
=
12000000
,
.
input_max
=
500000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 50 MHz */
.
vco_min
=
400000000
,
.
vco_max
=
1066000000
,
.
base_reg
=
PLLM_BASE
,
.
misc_reg
=
PLLM_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
max_p
=
2
,
.
pdiv_tohw
=
pllm_p
,
.
div_nmp
=
&
pllm_nmp
,
.
pmc_divnm_reg
=
PMC_PLLM_WB0_OVERRIDE
,
.
pmc_divp_reg
=
PMC_PLLM_WB0_OVERRIDE_2
,
.
freq_table
=
pll_m_freq_table
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_e_freq_table
[]
=
{
/* PLLE special case: use cpcon field to store cml divider value */
{
336000000
,
100000000
,
100
,
21
,
16
,
11
},
{
312000000
,
100000000
,
200
,
26
,
24
,
13
},
{
13000000
,
100000000
,
200
,
1
,
26
,
13
},
{
12000000
,
100000000
,
200
,
1
,
24
,
13
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
div_nmp
plle_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
8
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
divp_shift
=
24
,
.
divp_width
=
4
,
};
static
struct
tegra_clk_pll_params
pll_e_params
=
{
.
input_min
=
12000000
,
.
input_max
=
1000000000
,
.
cf_min
=
12000000
,
.
cf_max
=
75000000
,
.
vco_min
=
1600000000
,
.
vco_max
=
2400000000U
,
.
base_reg
=
PLLE_BASE
,
.
misc_reg
=
PLLE_MISC
,
.
aux_reg
=
PLLE_AUX
,
.
lock_mask
=
PLLE_MISC_LOCK
,
.
lock_enable_bit_idx
=
PLLE_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
plle_nmp
,
.
freq_table
=
pll_e_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
,
.
fixed_rate
=
100000000
,
};
static
const
struct
clk_div_table
pll_re_div_table
[]
=
{
{
.
val
=
0
,
.
div
=
1
},
{
.
val
=
1
,
.
div
=
2
},
{
.
val
=
2
,
.
div
=
3
},
{
.
val
=
3
,
.
div
=
4
},
{
.
val
=
4
,
.
div
=
5
},
{
.
val
=
5
,
.
div
=
6
},
{
.
val
=
0
,
.
div
=
0
},
};
static
struct
div_nmp
pllre_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
8
,
.
divn_shift
=
8
,
.
divn_width
=
8
,
.
divp_shift
=
16
,
.
divp_width
=
4
,
};
static
struct
tegra_clk_pll_params
pll_re_vco_params
=
{
.
input_min
=
12000000
,
.
input_max
=
1000000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 38 MHz */
.
vco_min
=
300000000
,
.
vco_max
=
600000000
,
.
base_reg
=
PLLRE_BASE
,
.
misc_reg
=
PLLRE_MISC
,
.
lock_mask
=
PLLRE_MISC_LOCK
,
.
lock_enable_bit_idx
=
PLLRE_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLRE_MISC
,
.
iddq_bit_idx
=
PLLRE_IDDQ_BIT
,
.
div_nmp
=
&
pllre_nmp
,
.
flags
=
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllp_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
5
,
.
divn_shift
=
8
,
.
divn_width
=
10
,
.
divp_shift
=
20
,
.
divp_width
=
3
,
};
static
struct
tegra_clk_pll_freq_table
pll_p_freq_table
[]
=
{
{
12000000
,
216000000
,
432
,
12
,
1
,
8
},
{
13000000
,
216000000
,
432
,
13
,
1
,
8
},
{
16800000
,
216000000
,
360
,
14
,
1
,
8
},
{
19200000
,
216000000
,
360
,
16
,
1
,
8
},
{
26000000
,
216000000
,
432
,
26
,
1
,
8
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_p_params
=
{
.
input_min
=
2000000
,
.
input_max
=
31000000
,
.
cf_min
=
1000000
,
.
cf_max
=
6000000
,
.
vco_min
=
200000000
,
.
vco_max
=
700000000
,
.
base_reg
=
PLLP_BASE
,
.
misc_reg
=
PLLP_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_p_freq_table
,
.
fixed_rate
=
408000000
,
.
flags
=
TEGRA_PLL_FIXED
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_a_freq_table
[]
=
{
{
9600000
,
282240000
,
147
,
5
,
0
,
4
},
{
9600000
,
368640000
,
192
,
5
,
0
,
4
},
{
9600000
,
240000000
,
200
,
8
,
0
,
8
},
{
28800000
,
282240000
,
245
,
25
,
0
,
8
},
{
28800000
,
368640000
,
320
,
25
,
0
,
8
},
{
28800000
,
240000000
,
200
,
24
,
0
,
8
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_a_params
=
{
.
input_min
=
2000000
,
.
input_max
=
31000000
,
.
cf_min
=
1000000
,
.
cf_max
=
6000000
,
.
vco_min
=
200000000
,
.
vco_max
=
700000000
,
.
base_reg
=
PLLA_BASE
,
.
misc_reg
=
PLLA_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_a_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
pll_d_freq_table
[]
=
{
{
12000000
,
216000000
,
864
,
12
,
4
,
12
},
{
13000000
,
216000000
,
864
,
13
,
4
,
12
},
{
16800000
,
216000000
,
720
,
14
,
4
,
12
},
{
19200000
,
216000000
,
720
,
16
,
4
,
12
},
{
26000000
,
216000000
,
864
,
26
,
4
,
12
},
{
12000000
,
594000000
,
594
,
12
,
1
,
12
},
{
13000000
,
594000000
,
594
,
13
,
1
,
12
},
{
16800000
,
594000000
,
495
,
14
,
1
,
12
},
{
19200000
,
594000000
,
495
,
16
,
1
,
12
},
{
26000000
,
594000000
,
594
,
26
,
1
,
12
},
{
12000000
,
1000000000
,
1000
,
12
,
1
,
12
},
{
13000000
,
1000000000
,
1000
,
13
,
1
,
12
},
{
19200000
,
1000000000
,
625
,
12
,
1
,
12
},
{
26000000
,
1000000000
,
1000
,
26
,
1
,
12
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_d_params
=
{
.
input_min
=
2000000
,
.
input_max
=
40000000
,
.
cf_min
=
1000000
,
.
cf_max
=
6000000
,
.
vco_min
=
500000000
,
.
vco_max
=
1000000000
,
.
base_reg
=
PLLD_BASE
,
.
misc_reg
=
PLLD_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
div_nmp
=
&
pllp_nmp
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_freq_table
tegra124_pll_d2_freq_table
[]
=
{
{
12000000
,
148500000
,
99
,
1
,
8
},
{
12000000
,
594000000
,
99
,
1
,
1
},
{
13000000
,
594000000
,
91
,
1
,
1
},
/* actual: 591.5 MHz */
{
16800000
,
594000000
,
71
,
1
,
1
},
/* actual: 596.4 MHz */
{
19200000
,
594000000
,
62
,
1
,
1
},
/* actual: 595.2 MHz */
{
26000000
,
594000000
,
91
,
2
,
1
},
/* actual: 591.5 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
tegra124_pll_d2_params
=
{
.
input_min
=
12000000
,
.
input_max
=
1000000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 38 MHz */
.
vco_min
=
600000000
,
.
vco_max
=
1200000000
,
.
base_reg
=
PLLD2_BASE
,
.
misc_reg
=
PLLD2_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLSS_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLD2_BASE
,
.
iddq_bit_idx
=
PLLSS_IDDQ_BIT
,
.
pdiv_tohw
=
pll12g_ssd_esd_p
,
.
div_nmp
=
&
pllss_nmp
,
.
ext_misc_reg
[
0
]
=
0x570
,
.
ext_misc_reg
[
1
]
=
0x574
,
.
ext_misc_reg
[
2
]
=
0x578
,
.
max_p
=
15
,
.
freq_table
=
tegra124_pll_d2_freq_table
,
};
static
struct
tegra_clk_pll_freq_table
pll_dp_freq_table
[]
=
{
{
12000000
,
600000000
,
100
,
1
,
1
},
{
13000000
,
600000000
,
92
,
1
,
1
},
/* actual: 598.0 MHz */
{
16800000
,
600000000
,
71
,
1
,
1
},
/* actual: 596.4 MHz */
{
19200000
,
600000000
,
62
,
1
,
1
},
/* actual: 595.2 MHz */
{
26000000
,
600000000
,
92
,
2
,
1
},
/* actual: 598.0 MHz */
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_dp_params
=
{
.
input_min
=
12000000
,
.
input_max
=
1000000000
,
.
cf_min
=
12000000
,
.
cf_max
=
19200000
,
/* s/w policy, h/w capability 38 MHz */
.
vco_min
=
600000000
,
.
vco_max
=
1200000000
,
.
base_reg
=
PLLDP_BASE
,
.
misc_reg
=
PLLDP_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLSS_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
iddq_reg
=
PLLDP_BASE
,
.
iddq_bit_idx
=
PLLSS_IDDQ_BIT
,
.
pdiv_tohw
=
pll12g_ssd_esd_p
,
.
div_nmp
=
&
pllss_nmp
,
.
ext_misc_reg
[
0
]
=
0x598
,
.
ext_misc_reg
[
1
]
=
0x59c
,
.
ext_misc_reg
[
2
]
=
0x5a0
,
.
max_p
=
5
,
.
freq_table
=
pll_dp_freq_table
,
};
static
struct
pdiv_map
pllu_p
[]
=
{
{
.
pdiv
=
1
,
.
hw_val
=
1
},
{
.
pdiv
=
2
,
.
hw_val
=
0
},
{
.
pdiv
=
0
,
.
hw_val
=
0
},
};
static
struct
div_nmp
pllu_nmp
=
{
.
divm_shift
=
0
,
.
divm_width
=
5
,
.
divn_shift
=
8
,
.
divn_width
=
10
,
.
divp_shift
=
20
,
.
divp_width
=
1
,
};
static
struct
tegra_clk_pll_freq_table
pll_u_freq_table
[]
=
{
{
12000000
,
480000000
,
960
,
12
,
2
,
12
},
{
13000000
,
480000000
,
960
,
13
,
2
,
12
},
{
16800000
,
480000000
,
400
,
7
,
2
,
5
},
{
19200000
,
480000000
,
200
,
4
,
2
,
3
},
{
26000000
,
480000000
,
960
,
26
,
2
,
12
},
{
0
,
0
,
0
,
0
,
0
,
0
},
};
static
struct
tegra_clk_pll_params
pll_u_params
=
{
.
input_min
=
2000000
,
.
input_max
=
40000000
,
.
cf_min
=
1000000
,
.
cf_max
=
6000000
,
.
vco_min
=
480000000
,
.
vco_max
=
960000000
,
.
base_reg
=
PLLU_BASE
,
.
misc_reg
=
PLLU_MISC
,
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
pdiv_tohw
=
pllu_p
,
.
div_nmp
=
&
pllu_nmp
,
.
freq_table
=
pll_u_freq_table
,
.
flags
=
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
struct
utmi_clk_param
{
/* Oscillator Frequency in KHz */
u32
osc_frequency
;
/* UTMIP PLL Enable Delay Count */
u8
enable_delay_count
;
/* UTMIP PLL Stable count */
u8
stable_count
;
/* UTMIP PLL Active delay count */
u8
active_delay_count
;
/* UTMIP PLL Xtal frequency count */
u8
xtal_freq_count
;
};
static
const
struct
utmi_clk_param
utmi_parameters
[]
=
{
{.
osc_frequency
=
13000000
,
.
enable_delay_count
=
0x02
,
.
stable_count
=
0x33
,
.
active_delay_count
=
0x05
,
.
xtal_freq_count
=
0x7F
},
{.
osc_frequency
=
19200000
,
.
enable_delay_count
=
0x03
,
.
stable_count
=
0x4B
,
.
active_delay_count
=
0x06
,
.
xtal_freq_count
=
0xBB
},
{.
osc_frequency
=
12000000
,
.
enable_delay_count
=
0x02
,
.
stable_count
=
0x2F
,
.
active_delay_count
=
0x04
,
.
xtal_freq_count
=
0x76
},
{.
osc_frequency
=
26000000
,
.
enable_delay_count
=
0x04
,
.
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
},
};
static
struct
tegra_clk
tegra124_clks
[
tegra_clk_max
]
__initdata
=
{
[
tegra_clk_ispb
]
=
{
.
dt_id
=
TEGRA124_CLK_ISPB
,
.
present
=
true
},
[
tegra_clk_rtc
]
=
{
.
dt_id
=
TEGRA124_CLK_RTC
,
.
present
=
true
},
[
tegra_clk_timer
]
=
{
.
dt_id
=
TEGRA124_CLK_TIMER
,
.
present
=
true
},
[
tegra_clk_uarta
]
=
{
.
dt_id
=
TEGRA124_CLK_UARTA
,
.
present
=
true
},
[
tegra_clk_sdmmc2
]
=
{
.
dt_id
=
TEGRA124_CLK_SDMMC2
,
.
present
=
true
},
[
tegra_clk_i2s1
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S1
,
.
present
=
true
},
[
tegra_clk_i2c1
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C1
,
.
present
=
true
},
[
tegra_clk_ndflash
]
=
{
.
dt_id
=
TEGRA124_CLK_NDFLASH
,
.
present
=
true
},
[
tegra_clk_sdmmc1
]
=
{
.
dt_id
=
TEGRA124_CLK_SDMMC1
,
.
present
=
true
},
[
tegra_clk_sdmmc4
]
=
{
.
dt_id
=
TEGRA124_CLK_SDMMC4
,
.
present
=
true
},
[
tegra_clk_pwm
]
=
{
.
dt_id
=
TEGRA124_CLK_PWM
,
.
present
=
true
},
[
tegra_clk_i2s2
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S2
,
.
present
=
true
},
[
tegra_clk_gr2d
]
=
{
.
dt_id
=
TEGRA124_CLK_GR_2D
,
.
present
=
true
},
[
tegra_clk_usbd
]
=
{
.
dt_id
=
TEGRA124_CLK_USBD
,
.
present
=
true
},
[
tegra_clk_isp_8
]
=
{
.
dt_id
=
TEGRA124_CLK_ISP
,
.
present
=
true
},
[
tegra_clk_gr3d
]
=
{
.
dt_id
=
TEGRA124_CLK_GR_3D
,
.
present
=
true
},
[
tegra_clk_disp2
]
=
{
.
dt_id
=
TEGRA124_CLK_DISP2
,
.
present
=
true
},
[
tegra_clk_disp1
]
=
{
.
dt_id
=
TEGRA124_CLK_DISP1
,
.
present
=
true
},
[
tegra_clk_host1x
]
=
{
.
dt_id
=
TEGRA124_CLK_HOST1X
,
.
present
=
true
},
[
tegra_clk_vcp
]
=
{
.
dt_id
=
TEGRA124_CLK_VCP
,
.
present
=
true
},
[
tegra_clk_i2s0
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S0
,
.
present
=
true
},
[
tegra_clk_apbdma
]
=
{
.
dt_id
=
TEGRA124_CLK_APBDMA
,
.
present
=
true
},
[
tegra_clk_kbc
]
=
{
.
dt_id
=
TEGRA124_CLK_KBC
,
.
present
=
true
},
[
tegra_clk_kfuse
]
=
{
.
dt_id
=
TEGRA124_CLK_KFUSE
,
.
present
=
true
},
[
tegra_clk_sbc1
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC1
,
.
present
=
true
},
[
tegra_clk_nor
]
=
{
.
dt_id
=
TEGRA124_CLK_NOR
,
.
present
=
true
},
[
tegra_clk_sbc2
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC2
,
.
present
=
true
},
[
tegra_clk_sbc3
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC3
,
.
present
=
true
},
[
tegra_clk_i2c5
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C5
,
.
present
=
true
},
[
tegra_clk_dsia
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIA
,
.
present
=
true
},
[
tegra_clk_mipi
]
=
{
.
dt_id
=
TEGRA124_CLK_MIPI
,
.
present
=
true
},
[
tegra_clk_hdmi
]
=
{
.
dt_id
=
TEGRA124_CLK_HDMI
,
.
present
=
true
},
[
tegra_clk_csi
]
=
{
.
dt_id
=
TEGRA124_CLK_CSI
,
.
present
=
true
},
[
tegra_clk_i2c2
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C2
,
.
present
=
true
},
[
tegra_clk_uartc
]
=
{
.
dt_id
=
TEGRA124_CLK_UARTC
,
.
present
=
true
},
[
tegra_clk_mipi_cal
]
=
{
.
dt_id
=
TEGRA124_CLK_MIPI_CAL
,
.
present
=
true
},
[
tegra_clk_emc
]
=
{
.
dt_id
=
TEGRA124_CLK_EMC
,
.
present
=
true
},
[
tegra_clk_usb2
]
=
{
.
dt_id
=
TEGRA124_CLK_USB2
,
.
present
=
true
},
[
tegra_clk_usb3
]
=
{
.
dt_id
=
TEGRA124_CLK_USB3
,
.
present
=
true
},
[
tegra_clk_vde_8
]
=
{
.
dt_id
=
TEGRA124_CLK_VDE
,
.
present
=
true
},
[
tegra_clk_bsea
]
=
{
.
dt_id
=
TEGRA124_CLK_BSEA
,
.
present
=
true
},
[
tegra_clk_bsev
]
=
{
.
dt_id
=
TEGRA124_CLK_BSEV
,
.
present
=
true
},
[
tegra_clk_uartd
]
=
{
.
dt_id
=
TEGRA124_CLK_UARTD
,
.
present
=
true
},
[
tegra_clk_i2c3
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C3
,
.
present
=
true
},
[
tegra_clk_sbc4
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC4
,
.
present
=
true
},
[
tegra_clk_sdmmc3
]
=
{
.
dt_id
=
TEGRA124_CLK_SDMMC3
,
.
present
=
true
},
[
tegra_clk_pcie
]
=
{
.
dt_id
=
TEGRA124_CLK_PCIE
,
.
present
=
true
},
[
tegra_clk_owr
]
=
{
.
dt_id
=
TEGRA124_CLK_OWR
,
.
present
=
true
},
[
tegra_clk_afi
]
=
{
.
dt_id
=
TEGRA124_CLK_AFI
,
.
present
=
true
},
[
tegra_clk_csite
]
=
{
.
dt_id
=
TEGRA124_CLK_CSITE
,
.
present
=
true
},
[
tegra_clk_la
]
=
{
.
dt_id
=
TEGRA124_CLK_LA
,
.
present
=
true
},
[
tegra_clk_trace
]
=
{
.
dt_id
=
TEGRA124_CLK_TRACE
,
.
present
=
true
},
[
tegra_clk_soc_therm
]
=
{
.
dt_id
=
TEGRA124_CLK_SOC_THERM
,
.
present
=
true
},
[
tegra_clk_dtv
]
=
{
.
dt_id
=
TEGRA124_CLK_DTV
,
.
present
=
true
},
[
tegra_clk_ndspeed
]
=
{
.
dt_id
=
TEGRA124_CLK_NDSPEED
,
.
present
=
true
},
[
tegra_clk_i2cslow
]
=
{
.
dt_id
=
TEGRA124_CLK_I2CSLOW
,
.
present
=
true
},
[
tegra_clk_dsib
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIB
,
.
present
=
true
},
[
tegra_clk_tsec
]
=
{
.
dt_id
=
TEGRA124_CLK_TSEC
,
.
present
=
true
},
[
tegra_clk_xusb_host
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_HOST
,
.
present
=
true
},
[
tegra_clk_msenc
]
=
{
.
dt_id
=
TEGRA124_CLK_MSENC
,
.
present
=
true
},
[
tegra_clk_csus
]
=
{
.
dt_id
=
TEGRA124_CLK_CSUS
,
.
present
=
true
},
[
tegra_clk_mselect
]
=
{
.
dt_id
=
TEGRA124_CLK_MSELECT
,
.
present
=
true
},
[
tegra_clk_tsensor
]
=
{
.
dt_id
=
TEGRA124_CLK_TSENSOR
,
.
present
=
true
},
[
tegra_clk_i2s3
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S3
,
.
present
=
true
},
[
tegra_clk_i2s4
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S4
,
.
present
=
true
},
[
tegra_clk_i2c4
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C4
,
.
present
=
true
},
[
tegra_clk_sbc5
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC5
,
.
present
=
true
},
[
tegra_clk_sbc6
]
=
{
.
dt_id
=
TEGRA124_CLK_SBC6
,
.
present
=
true
},
[
tegra_clk_d_audio
]
=
{
.
dt_id
=
TEGRA124_CLK_D_AUDIO
,
.
present
=
true
},
[
tegra_clk_apbif
]
=
{
.
dt_id
=
TEGRA124_CLK_APBIF
,
.
present
=
true
},
[
tegra_clk_dam0
]
=
{
.
dt_id
=
TEGRA124_CLK_DAM0
,
.
present
=
true
},
[
tegra_clk_dam1
]
=
{
.
dt_id
=
TEGRA124_CLK_DAM1
,
.
present
=
true
},
[
tegra_clk_dam2
]
=
{
.
dt_id
=
TEGRA124_CLK_DAM2
,
.
present
=
true
},
[
tegra_clk_hda2codec_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_HDA2CODEC_2X
,
.
present
=
true
},
[
tegra_clk_audio0_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO0_2X
,
.
present
=
true
},
[
tegra_clk_audio1_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO1_2X
,
.
present
=
true
},
[
tegra_clk_audio2_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO2_2X
,
.
present
=
true
},
[
tegra_clk_audio3_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO3_2X
,
.
present
=
true
},
[
tegra_clk_audio4_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO4_2X
,
.
present
=
true
},
[
tegra_clk_spdif_2x
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF_2X
,
.
present
=
true
},
[
tegra_clk_actmon
]
=
{
.
dt_id
=
TEGRA124_CLK_ACTMON
,
.
present
=
true
},
[
tegra_clk_extern1
]
=
{
.
dt_id
=
TEGRA124_CLK_EXTERN1
,
.
present
=
true
},
[
tegra_clk_extern2
]
=
{
.
dt_id
=
TEGRA124_CLK_EXTERN2
,
.
present
=
true
},
[
tegra_clk_extern3
]
=
{
.
dt_id
=
TEGRA124_CLK_EXTERN3
,
.
present
=
true
},
[
tegra_clk_sata_oob
]
=
{
.
dt_id
=
TEGRA124_CLK_SATA_OOB
,
.
present
=
true
},
[
tegra_clk_sata
]
=
{
.
dt_id
=
TEGRA124_CLK_SATA
,
.
present
=
true
},
[
tegra_clk_hda
]
=
{
.
dt_id
=
TEGRA124_CLK_HDA
,
.
present
=
true
},
[
tegra_clk_se
]
=
{
.
dt_id
=
TEGRA124_CLK_SE
,
.
present
=
true
},
[
tegra_clk_hda2hdmi
]
=
{
.
dt_id
=
TEGRA124_CLK_HDA2HDMI
,
.
present
=
true
},
[
tegra_clk_sata_cold
]
=
{
.
dt_id
=
TEGRA124_CLK_SATA_COLD
,
.
present
=
true
},
[
tegra_clk_cilab
]
=
{
.
dt_id
=
TEGRA124_CLK_CILAB
,
.
present
=
true
},
[
tegra_clk_cilcd
]
=
{
.
dt_id
=
TEGRA124_CLK_CILCD
,
.
present
=
true
},
[
tegra_clk_cile
]
=
{
.
dt_id
=
TEGRA124_CLK_CILE
,
.
present
=
true
},
[
tegra_clk_dsialp
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIALP
,
.
present
=
true
},
[
tegra_clk_dsiblp
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIBLP
,
.
present
=
true
},
[
tegra_clk_entropy
]
=
{
.
dt_id
=
TEGRA124_CLK_ENTROPY
,
.
present
=
true
},
[
tegra_clk_dds
]
=
{
.
dt_id
=
TEGRA124_CLK_DDS
,
.
present
=
true
},
[
tegra_clk_dp2
]
=
{
.
dt_id
=
TEGRA124_CLK_DP2
,
.
present
=
true
},
[
tegra_clk_amx
]
=
{
.
dt_id
=
TEGRA124_CLK_AMX
,
.
present
=
true
},
[
tegra_clk_adx
]
=
{
.
dt_id
=
TEGRA124_CLK_ADX
,
.
present
=
true
},
[
tegra_clk_xusb_ss
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_SS
,
.
present
=
true
},
[
tegra_clk_i2c6
]
=
{
.
dt_id
=
TEGRA124_CLK_I2C6
,
.
present
=
true
},
[
tegra_clk_vim2_clk
]
=
{
.
dt_id
=
TEGRA124_CLK_VIM2_CLK
,
.
present
=
true
},
[
tegra_clk_hdmi_audio
]
=
{
.
dt_id
=
TEGRA124_CLK_HDMI_AUDIO
,
.
present
=
true
},
[
tegra_clk_clk72Mhz
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK72MHZ
,
.
present
=
true
},
[
tegra_clk_vic03
]
=
{
.
dt_id
=
TEGRA124_CLK_VIC03
,
.
present
=
true
},
[
tegra_clk_adx1
]
=
{
.
dt_id
=
TEGRA124_CLK_ADX1
,
.
present
=
true
},
[
tegra_clk_dpaux
]
=
{
.
dt_id
=
TEGRA124_CLK_DPAUX
,
.
present
=
true
},
[
tegra_clk_sor0
]
=
{
.
dt_id
=
TEGRA124_CLK_SOR0
,
.
present
=
true
},
[
tegra_clk_sor0_lvds
]
=
{
.
dt_id
=
TEGRA124_CLK_SOR0_LVDS
,
.
present
=
true
},
[
tegra_clk_gpu
]
=
{
.
dt_id
=
TEGRA124_CLK_GPU
,
.
present
=
true
},
[
tegra_clk_amx1
]
=
{
.
dt_id
=
TEGRA124_CLK_AMX1
,
.
present
=
true
},
[
tegra_clk_uartb
]
=
{
.
dt_id
=
TEGRA124_CLK_UARTB
,
.
present
=
true
},
[
tegra_clk_vfir
]
=
{
.
dt_id
=
TEGRA124_CLK_VFIR
,
.
present
=
true
},
[
tegra_clk_spdif_in
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF_IN
,
.
present
=
true
},
[
tegra_clk_spdif_out
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF_OUT
,
.
present
=
true
},
[
tegra_clk_vi_9
]
=
{
.
dt_id
=
TEGRA124_CLK_VI
,
.
present
=
true
},
[
tegra_clk_vi_sensor
]
=
{
.
dt_id
=
TEGRA124_CLK_VI_SENSOR
,
.
present
=
true
},
[
tegra_clk_fuse
]
=
{
.
dt_id
=
TEGRA124_CLK_FUSE
,
.
present
=
true
},
[
tegra_clk_fuse_burn
]
=
{
.
dt_id
=
TEGRA124_CLK_FUSE_BURN
,
.
present
=
true
},
[
tegra_clk_clk_32k
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_32K
,
.
present
=
true
},
[
tegra_clk_clk_m
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_M
,
.
present
=
true
},
[
tegra_clk_clk_m_div2
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_M_DIV2
,
.
present
=
true
},
[
tegra_clk_clk_m_div4
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_M_DIV4
,
.
present
=
true
},
[
tegra_clk_pll_ref
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_REF
,
.
present
=
true
},
[
tegra_clk_pll_c
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_C
,
.
present
=
true
},
[
tegra_clk_pll_c_out1
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_C_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_c2
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_C2
,
.
present
=
true
},
[
tegra_clk_pll_c3
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_C3
,
.
present
=
true
},
[
tegra_clk_pll_m
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_M
,
.
present
=
true
},
[
tegra_clk_pll_m_out1
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_M_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P
,
.
present
=
true
},
[
tegra_clk_pll_p_out1
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p_out2
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT2
,
.
present
=
true
},
[
tegra_clk_pll_p_out3
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT3
,
.
present
=
true
},
[
tegra_clk_pll_p_out4
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT4
,
.
present
=
true
},
[
tegra_clk_pll_a
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_A
,
.
present
=
true
},
[
tegra_clk_pll_a_out0
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_A_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_d
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_D
,
.
present
=
true
},
[
tegra_clk_pll_d_out0
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_D_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_d2
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_D2
,
.
present
=
true
},
[
tegra_clk_pll_d2_out0
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_D2_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_u
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_U
,
.
present
=
true
},
[
tegra_clk_pll_u_480m
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_U_480M
,
.
present
=
true
},
[
tegra_clk_pll_u_60m
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_U_60M
,
.
present
=
true
},
[
tegra_clk_pll_u_48m
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_U_48M
,
.
present
=
true
},
[
tegra_clk_pll_u_12m
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_U_12M
,
.
present
=
true
},
[
tegra_clk_pll_x
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_X
,
.
present
=
true
},
[
tegra_clk_pll_x_out0
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_X_OUT0
,
.
present
=
true
},
[
tegra_clk_pll_re_vco
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_RE_VCO
,
.
present
=
true
},
[
tegra_clk_pll_re_out
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_RE_OUT
,
.
present
=
true
},
[
tegra_clk_spdif_in_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF_IN_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s0_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S0_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s1_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S1_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s2_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S2_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s3_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S3_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s4_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_I2S4_SYNC
,
.
present
=
true
},
[
tegra_clk_vimclk_sync
]
=
{
.
dt_id
=
TEGRA124_CLK_VIMCLK_SYNC
,
.
present
=
true
},
[
tegra_clk_audio0
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO0
,
.
present
=
true
},
[
tegra_clk_audio1
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO1
,
.
present
=
true
},
[
tegra_clk_audio2
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO2
,
.
present
=
true
},
[
tegra_clk_audio3
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO3
,
.
present
=
true
},
[
tegra_clk_audio4
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO4
,
.
present
=
true
},
[
tegra_clk_spdif
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF
,
.
present
=
true
},
[
tegra_clk_clk_out_1
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_1
,
.
present
=
true
},
[
tegra_clk_clk_out_2
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_2
,
.
present
=
true
},
[
tegra_clk_clk_out_3
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_3
,
.
present
=
true
},
[
tegra_clk_blink
]
=
{
.
dt_id
=
TEGRA124_CLK_BLINK
,
.
present
=
true
},
[
tegra_clk_xusb_host_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_HOST_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_falcon_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_FALCON_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_fs_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_FS_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_ss_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_SS_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_dev_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_DEV_SRC
,
.
present
=
true
},
[
tegra_clk_xusb_dev
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_DEV
,
.
present
=
true
},
[
tegra_clk_xusb_hs_src
]
=
{
.
dt_id
=
TEGRA124_CLK_XUSB_HS_SRC
,
.
present
=
true
},
[
tegra_clk_sclk
]
=
{
.
dt_id
=
TEGRA124_CLK_SCLK
,
.
present
=
true
},
[
tegra_clk_hclk
]
=
{
.
dt_id
=
TEGRA124_CLK_HCLK
,
.
present
=
true
},
[
tegra_clk_pclk
]
=
{
.
dt_id
=
TEGRA124_CLK_PCLK
,
.
present
=
true
},
[
tegra_clk_cclk_g
]
=
{
.
dt_id
=
TEGRA124_CLK_CCLK_G
,
.
present
=
true
},
[
tegra_clk_cclk_lp
]
=
{
.
dt_id
=
TEGRA124_CLK_CCLK_LP
,
.
present
=
true
},
[
tegra_clk_dfll_ref
]
=
{
.
dt_id
=
TEGRA124_CLK_DFLL_REF
,
.
present
=
true
},
[
tegra_clk_dfll_soc
]
=
{
.
dt_id
=
TEGRA124_CLK_DFLL_SOC
,
.
present
=
true
},
[
tegra_clk_vi_sensor2
]
=
{
.
dt_id
=
TEGRA124_CLK_VI_SENSOR2
,
.
present
=
true
},
[
tegra_clk_pll_p_out5
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT5
,
.
present
=
true
},
[
tegra_clk_pll_c4
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_C4
,
.
present
=
true
},
[
tegra_clk_pll_dp
]
=
{
.
dt_id
=
TEGRA124_CLK_PLL_DP
,
.
present
=
true
},
[
tegra_clk_audio0_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO0_MUX
,
.
present
=
true
},
[
tegra_clk_audio1_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO1_MUX
,
.
present
=
true
},
[
tegra_clk_audio2_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO2_MUX
,
.
present
=
true
},
[
tegra_clk_audio3_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO3_MUX
,
.
present
=
true
},
[
tegra_clk_audio4_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_AUDIO4_MUX
,
.
present
=
true
},
[
tegra_clk_spdif_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_SPDIF_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_1_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_1_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_2_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_2_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_3_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_CLK_OUT_3_MUX
,
.
present
=
true
},
[
tegra_clk_dsia_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIA_MUX
,
.
present
=
true
},
[
tegra_clk_dsib_mux
]
=
{
.
dt_id
=
TEGRA124_CLK_DSIB_MUX
,
.
present
=
true
},
[
tegra_clk_uarte
]
=
{
.
dt_id
=
TEGRA124_CLK_UARTE
,
.
present
=
true
},
};
static
struct
tegra_devclk
devclks
[]
__initdata
=
{
{
.
con_id
=
"clk_m"
,
.
dt_id
=
TEGRA124_CLK_CLK_M
},
{
.
con_id
=
"pll_ref"
,
.
dt_id
=
TEGRA124_CLK_PLL_REF
},
{
.
con_id
=
"clk_32k"
,
.
dt_id
=
TEGRA124_CLK_CLK_32K
},
{
.
con_id
=
"clk_m_div2"
,
.
dt_id
=
TEGRA124_CLK_CLK_M_DIV2
},
{
.
con_id
=
"clk_m_div4"
,
.
dt_id
=
TEGRA124_CLK_CLK_M_DIV4
},
{
.
con_id
=
"pll_c"
,
.
dt_id
=
TEGRA124_CLK_PLL_C
},
{
.
con_id
=
"pll_c_out1"
,
.
dt_id
=
TEGRA124_CLK_PLL_C_OUT1
},
{
.
con_id
=
"pll_c2"
,
.
dt_id
=
TEGRA124_CLK_PLL_C2
},
{
.
con_id
=
"pll_c3"
,
.
dt_id
=
TEGRA124_CLK_PLL_C3
},
{
.
con_id
=
"pll_p"
,
.
dt_id
=
TEGRA124_CLK_PLL_P
},
{
.
con_id
=
"pll_p_out1"
,
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT1
},
{
.
con_id
=
"pll_p_out2"
,
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT2
},
{
.
con_id
=
"pll_p_out3"
,
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT3
},
{
.
con_id
=
"pll_p_out4"
,
.
dt_id
=
TEGRA124_CLK_PLL_P_OUT4
},
{
.
con_id
=
"pll_m"
,
.
dt_id
=
TEGRA124_CLK_PLL_M
},
{
.
con_id
=
"pll_m_out1"
,
.
dt_id
=
TEGRA124_CLK_PLL_M_OUT1
},
{
.
con_id
=
"pll_x"
,
.
dt_id
=
TEGRA124_CLK_PLL_X
},
{
.
con_id
=
"pll_x_out0"
,
.
dt_id
=
TEGRA124_CLK_PLL_X_OUT0
},
{
.
con_id
=
"pll_u"
,
.
dt_id
=
TEGRA124_CLK_PLL_U
},
{
.
con_id
=
"pll_u_480M"
,
.
dt_id
=
TEGRA124_CLK_PLL_U_480M
},
{
.
con_id
=
"pll_u_60M"
,
.
dt_id
=
TEGRA124_CLK_PLL_U_60M
},
{
.
con_id
=
"pll_u_48M"
,
.
dt_id
=
TEGRA124_CLK_PLL_U_48M
},
{
.
con_id
=
"pll_u_12M"
,
.
dt_id
=
TEGRA124_CLK_PLL_U_12M
},
{
.
con_id
=
"pll_d"
,
.
dt_id
=
TEGRA124_CLK_PLL_D
},
{
.
con_id
=
"pll_d_out0"
,
.
dt_id
=
TEGRA124_CLK_PLL_D_OUT0
},
{
.
con_id
=
"pll_d2"
,
.
dt_id
=
TEGRA124_CLK_PLL_D2
},
{
.
con_id
=
"pll_d2_out0"
,
.
dt_id
=
TEGRA124_CLK_PLL_D2_OUT0
},
{
.
con_id
=
"pll_a"
,
.
dt_id
=
TEGRA124_CLK_PLL_A
},
{
.
con_id
=
"pll_a_out0"
,
.
dt_id
=
TEGRA124_CLK_PLL_A_OUT0
},
{
.
con_id
=
"pll_re_vco"
,
.
dt_id
=
TEGRA124_CLK_PLL_RE_VCO
},
{
.
con_id
=
"pll_re_out"
,
.
dt_id
=
TEGRA124_CLK_PLL_RE_OUT
},
{
.
con_id
=
"spdif_in_sync"
,
.
dt_id
=
TEGRA124_CLK_SPDIF_IN_SYNC
},
{
.
con_id
=
"i2s0_sync"
,
.
dt_id
=
TEGRA124_CLK_I2S0_SYNC
},
{
.
con_id
=
"i2s1_sync"
,
.
dt_id
=
TEGRA124_CLK_I2S1_SYNC
},
{
.
con_id
=
"i2s2_sync"
,
.
dt_id
=
TEGRA124_CLK_I2S2_SYNC
},
{
.
con_id
=
"i2s3_sync"
,
.
dt_id
=
TEGRA124_CLK_I2S3_SYNC
},
{
.
con_id
=
"i2s4_sync"
,
.
dt_id
=
TEGRA124_CLK_I2S4_SYNC
},
{
.
con_id
=
"vimclk_sync"
,
.
dt_id
=
TEGRA124_CLK_VIMCLK_SYNC
},
{
.
con_id
=
"audio0"
,
.
dt_id
=
TEGRA124_CLK_AUDIO0
},
{
.
con_id
=
"audio1"
,
.
dt_id
=
TEGRA124_CLK_AUDIO1
},
{
.
con_id
=
"audio2"
,
.
dt_id
=
TEGRA124_CLK_AUDIO2
},
{
.
con_id
=
"audio3"
,
.
dt_id
=
TEGRA124_CLK_AUDIO3
},
{
.
con_id
=
"audio4"
,
.
dt_id
=
TEGRA124_CLK_AUDIO4
},
{
.
con_id
=
"spdif"
,
.
dt_id
=
TEGRA124_CLK_SPDIF
},
{
.
con_id
=
"audio0_2x"
,
.
dt_id
=
TEGRA124_CLK_AUDIO0_2X
},
{
.
con_id
=
"audio1_2x"
,
.
dt_id
=
TEGRA124_CLK_AUDIO1_2X
},
{
.
con_id
=
"audio2_2x"
,
.
dt_id
=
TEGRA124_CLK_AUDIO2_2X
},
{
.
con_id
=
"audio3_2x"
,
.
dt_id
=
TEGRA124_CLK_AUDIO3_2X
},
{
.
con_id
=
"audio4_2x"
,
.
dt_id
=
TEGRA124_CLK_AUDIO4_2X
},
{
.
con_id
=
"spdif_2x"
,
.
dt_id
=
TEGRA124_CLK_SPDIF_2X
},
{
.
con_id
=
"extern1"
,
.
dev_id
=
"clk_out_1"
,
.
dt_id
=
TEGRA124_CLK_EXTERN1
},
{
.
con_id
=
"extern2"
,
.
dev_id
=
"clk_out_2"
,
.
dt_id
=
TEGRA124_CLK_EXTERN2
},
{
.
con_id
=
"extern3"
,
.
dev_id
=
"clk_out_3"
,
.
dt_id
=
TEGRA124_CLK_EXTERN3
},
{
.
con_id
=
"blink"
,
.
dt_id
=
TEGRA124_CLK_BLINK
},
{
.
con_id
=
"cclk_g"
,
.
dt_id
=
TEGRA124_CLK_CCLK_G
},
{
.
con_id
=
"cclk_lp"
,
.
dt_id
=
TEGRA124_CLK_CCLK_LP
},
{
.
con_id
=
"sclk"
,
.
dt_id
=
TEGRA124_CLK_SCLK
},
{
.
con_id
=
"hclk"
,
.
dt_id
=
TEGRA124_CLK_HCLK
},
{
.
con_id
=
"pclk"
,
.
dt_id
=
TEGRA124_CLK_PCLK
},
{
.
con_id
=
"fuse"
,
.
dt_id
=
TEGRA124_CLK_FUSE
},
{
.
dev_id
=
"rtc-tegra"
,
.
dt_id
=
TEGRA124_CLK_RTC
},
{
.
dev_id
=
"timer"
,
.
dt_id
=
TEGRA124_CLK_TIMER
},
};
static
struct
clk
**
clks
;
static
void
tegra124_utmi_param_configure
(
void
__iomem
*
clk_base
)
{
u32
reg
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
utmi_parameters
);
i
++
)
{
if
(
osc_freq
==
utmi_parameters
[
i
].
osc_frequency
)
break
;
}
if
(
i
>=
ARRAY_SIZE
(
utmi_parameters
))
{
pr_err
(
"%s: Unexpected oscillator freq %lu
\n
"
,
__func__
,
osc_freq
);
return
;
}
reg
=
readl_relaxed
(
clk_base
+
UTMIP_PLL_CFG2
);
/* Program UTMIP PLL stable and active counts */
/* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */
reg
&=
~
UTMIP_PLL_CFG2_STABLE_COUNT
(
~
0
);
reg
|=
UTMIP_PLL_CFG2_STABLE_COUNT
(
utmi_parameters
[
i
].
stable_count
);
reg
&=
~
UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT
(
~
0
);
reg
|=
UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT
(
utmi_parameters
[
i
].
active_delay_count
);
/* Remove power downs from UTMIP PLL control bits */
reg
&=
~
UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN
;
reg
&=
~
UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN
;
reg
&=
~
UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN
;
writel_relaxed
(
reg
,
clk_base
+
UTMIP_PLL_CFG2
);
/* Program UTMIP PLL delay and oscillator frequency counts */
reg
=
readl_relaxed
(
clk_base
+
UTMIP_PLL_CFG1
);
reg
&=
~
UTMIP_PLL_CFG1_ENABLE_DLY_COUNT
(
~
0
);
reg
|=
UTMIP_PLL_CFG1_ENABLE_DLY_COUNT
(
utmi_parameters
[
i
].
enable_delay_count
);
reg
&=
~
UTMIP_PLL_CFG1_XTAL_FREQ_COUNT
(
~
0
);
reg
|=
UTMIP_PLL_CFG1_XTAL_FREQ_COUNT
(
utmi_parameters
[
i
].
xtal_freq_count
);
/* Remove power downs from UTMIP PLL control bits */
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN
;
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN
;
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP
;
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN
;
writel_relaxed
(
reg
,
clk_base
+
UTMIP_PLL_CFG1
);
/* Setup HW control of UTMIPLL */
reg
=
readl_relaxed
(
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
reg
|=
UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET
;
reg
&=
~
UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL
;
reg
|=
UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE
;
writel_relaxed
(
reg
,
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
reg
=
readl_relaxed
(
clk_base
+
UTMIP_PLL_CFG1
);
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP
;
reg
&=
~
UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN
;
writel_relaxed
(
reg
,
clk_base
+
UTMIP_PLL_CFG1
);
udelay
(
1
);
/* Setup SW override of UTMIPLL assuming USB2.0
ports are assigned to USB2 */
reg
=
readl_relaxed
(
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
reg
|=
UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL
;
reg
&=
~
UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE
;
writel_relaxed
(
reg
,
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
udelay
(
1
);
/* Enable HW control UTMIPLL */
reg
=
readl_relaxed
(
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
reg
|=
UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE
;
writel_relaxed
(
reg
,
clk_base
+
UTMIPLL_HW_PWRDN_CFG0
);
}
static
__init
void
tegra124_periph_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
)
{
struct
clk
*
clk
;
u32
val
;
/* xusb_hs_src */
val
=
readl
(
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
val
|=
BIT
(
25
);
/* always select PLLU_60M */
writel
(
val
,
clk_base
+
CLK_SOURCE_XUSB_SS_SRC
);
clk
=
clk_register_fixed_factor
(
NULL
,
"xusb_hs_src"
,
"pll_u_60M"
,
0
,
1
,
1
);
clks
[
TEGRA124_CLK_XUSB_HS_SRC
]
=
clk
;
/* dsia mux */
clk
=
clk_register_mux
(
NULL
,
"dsia_mux"
,
mux_plld_out0_plld2_out0
,
ARRAY_SIZE
(
mux_plld_out0_plld2_out0
),
0
,
clk_base
+
PLLD_BASE
,
25
,
1
,
0
,
&
pll_d_lock
);
clks
[
TEGRA124_CLK_DSIA_MUX
]
=
clk
;
/* dsib mux */
clk
=
clk_register_mux
(
NULL
,
"dsib_mux"
,
mux_plld_out0_plld2_out0
,
ARRAY_SIZE
(
mux_plld_out0_plld2_out0
),
0
,
clk_base
+
PLLD2_BASE
,
25
,
1
,
0
,
&
pll_d2_lock
);
clks
[
TEGRA124_CLK_DSIB_MUX
]
=
clk
;
/* emc mux */
clk
=
clk_register_mux
(
NULL
,
"emc_mux"
,
mux_pllmcp_clkm
,
ARRAY_SIZE
(
mux_pllmcp_clkm
),
0
,
clk_base
+
CLK_SOURCE_EMC
,
29
,
3
,
0
,
NULL
);
/* cml0 */
clk
=
clk_register_gate
(
NULL
,
"cml0"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
0
,
0
,
&
pll_e_lock
);
clk_register_clkdev
(
clk
,
"cml0"
,
NULL
);
clks
[
TEGRA124_CLK_CML0
]
=
clk
;
/* cml1 */
clk
=
clk_register_gate
(
NULL
,
"cml1"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
1
,
0
,
&
pll_e_lock
);
clk_register_clkdev
(
clk
,
"cml1"
,
NULL
);
clks
[
TEGRA124_CLK_CML1
]
=
clk
;
tegra_periph_clk_init
(
clk_base
,
pmc_base
,
tegra124_clks
,
&
pll_p_params
);
}
static
void
__init
tegra124_pll_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
)
{
u32
val
;
struct
clk
*
clk
;
/* PLLC */
clk
=
tegra_clk_register_pllxc
(
"pll_c"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_C
]
=
clk
;
/* PLLC_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_c_out1_div"
,
"pll_c"
,
clk_base
+
PLLC_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_c_out1"
,
"pll_c_out1_div"
,
clk_base
+
PLLC_OUT
,
1
,
0
,
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c_out1"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_C_OUT1
]
=
clk
;
/* PLLC2 */
clk
=
tegra_clk_register_pllc
(
"pll_c2"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c2_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c2"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_C2
]
=
clk
;
/* PLLC3 */
clk
=
tegra_clk_register_pllc
(
"pll_c3"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_c3_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c3"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_C3
]
=
clk
;
/* PLLM */
clk
=
tegra_clk_register_pllm
(
"pll_m"
,
"pll_ref"
,
clk_base
,
pmc
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
&
pll_m_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_M
]
=
clk
;
/* PLLM_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_m_out1_div"
,
"pll_m"
,
clk_base
+
PLLM_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_m_out1"
,
"pll_m_out1_div"
,
clk_base
+
PLLM_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m_out1"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_M_OUT1
]
=
clk
;
/* PLLM_UD */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_m_ud"
,
"pll_m"
,
CLK_SET_RATE_PARENT
,
1
,
1
);
/* PLLU */
val
=
readl
(
clk_base
+
pll_u_params
.
base_reg
);
val
&=
~
BIT
(
24
);
/* disable PLLU_OVERRIDE */
writel
(
val
,
clk_base
+
pll_u_params
.
base_reg
);
clk
=
tegra_clk_register_pll
(
"pll_u"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_u_params
,
&
pll_u_lock
);
clk_register_clkdev
(
clk
,
"pll_u"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_U
]
=
clk
;
tegra124_utmi_param_configure
(
clk_base
);
/* PLLU_480M */
clk
=
clk_register_gate
(
NULL
,
"pll_u_480M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
clk_base
+
PLLU_BASE
,
22
,
0
,
&
pll_u_lock
);
clk_register_clkdev
(
clk
,
"pll_u_480M"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_U_480M
]
=
clk
;
/* PLLU_60M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_60M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
8
);
clk_register_clkdev
(
clk
,
"pll_u_60M"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_U_60M
]
=
clk
;
/* PLLU_48M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_48M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
10
);
clk_register_clkdev
(
clk
,
"pll_u_48M"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_U_48M
]
=
clk
;
/* PLLU_12M */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_u_12M"
,
"pll_u"
,
CLK_SET_RATE_PARENT
,
1
,
40
);
clk_register_clkdev
(
clk
,
"pll_u_12M"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_U_12M
]
=
clk
;
/* PLLD */
clk
=
tegra_clk_register_pll
(
"pll_d"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_d_params
,
&
pll_d_lock
);
clk_register_clkdev
(
clk
,
"pll_d"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_D
]
=
clk
;
/* PLLD_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d_out0"
,
"pll_d"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d_out0"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_D_OUT0
]
=
clk
;
/* PLLRE */
clk
=
tegra_clk_register_pllre
(
"pll_re_vco"
,
"pll_ref"
,
clk_base
,
pmc
,
0
,
&
pll_re_vco_params
,
&
pll_re_lock
,
pll_ref_freq
);
clk_register_clkdev
(
clk
,
"pll_re_vco"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_RE_VCO
]
=
clk
;
clk
=
clk_register_divider_table
(
NULL
,
"pll_re_out"
,
"pll_re_vco"
,
0
,
clk_base
+
PLLRE_BASE
,
16
,
4
,
0
,
pll_re_div_table
,
&
pll_re_lock
);
clk_register_clkdev
(
clk
,
"pll_re_out"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_RE_OUT
]
=
clk
;
/* PLLE */
clk
=
tegra_clk_register_plle_tegra114
(
"pll_e"
,
"pll_ref"
,
clk_base
,
0
,
&
pll_e_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_e"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_E
]
=
clk
;
/* PLLC4 */
clk
=
tegra_clk_register_pllss
(
"pll_c4"
,
"pll_ref"
,
clk_base
,
0
,
&
pll_c4_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c4"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_C4
]
=
clk
;
/* PLLDP */
clk
=
tegra_clk_register_pllss
(
"pll_dp"
,
"pll_ref"
,
clk_base
,
0
,
&
pll_dp_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_dp"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_DP
]
=
clk
;
/* PLLD2 */
clk
=
tegra_clk_register_pllss
(
"pll_d2"
,
"pll_ref"
,
clk_base
,
0
,
&
tegra124_pll_d2_params
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_d2"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_D2
]
=
clk
;
/* PLLD2_OUT0 ?? */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d2_out0"
,
"pll_d2"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d2_out0"
,
NULL
);
clks
[
TEGRA124_CLK_PLL_D2_OUT0
]
=
clk
;
}
/* Tegra124 CPU clock and reset control functions */
static
void
tegra124_wait_cpu_in_reset
(
u32
cpu
)
{
unsigned
int
reg
;
do
{
reg
=
readl
(
clk_base
+
CLK_RST_CONTROLLER_CPU_CMPLX_STATUS
);
cpu_relax
();
}
while
(
!
(
reg
&
(
1
<<
cpu
)));
/* check CPU been reset or not */
}
static
void
tegra124_disable_cpu_clock
(
u32
cpu
)
{
/* flow controller would take care in the power sequence. */
}
#ifdef CONFIG_PM_SLEEP
static
void
tegra124_cpu_clock_suspend
(
void
)
{
/* switch coresite to clk_m, save off original source */
tegra124_cpu_clk_sctx
.
clk_csite_src
=
readl
(
clk_base
+
CLK_SOURCE_CSITE
);
writel
(
3
<<
30
,
clk_base
+
CLK_SOURCE_CSITE
);
}
static
void
tegra124_cpu_clock_resume
(
void
)
{
writel
(
tegra124_cpu_clk_sctx
.
clk_csite_src
,
clk_base
+
CLK_SOURCE_CSITE
);
}
#endif
static
struct
tegra_cpu_car_ops
tegra124_cpu_car_ops
=
{
.
wait_for_reset
=
tegra124_wait_cpu_in_reset
,
.
disable_clock
=
tegra124_disable_cpu_clock
,
#ifdef CONFIG_PM_SLEEP
.
suspend
=
tegra124_cpu_clock_suspend
,
.
resume
=
tegra124_cpu_clock_resume
,
#endif
};
static
const
struct
of_device_id
pmc_match
[]
__initconst
=
{
{
.
compatible
=
"nvidia,tegra124-pmc"
},
{},
};
static
struct
tegra_clk_init_table
init_table
[]
__initdata
=
{
{
TEGRA124_CLK_UARTA
,
TEGRA124_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA124_CLK_UARTB
,
TEGRA124_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA124_CLK_UARTC
,
TEGRA124_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA124_CLK_UARTD
,
TEGRA124_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA124_CLK_PLL_A
,
TEGRA124_CLK_CLK_MAX
,
564480000
,
1
},
{
TEGRA124_CLK_PLL_A_OUT0
,
TEGRA124_CLK_CLK_MAX
,
11289600
,
1
},
{
TEGRA124_CLK_EXTERN1
,
TEGRA124_CLK_PLL_A_OUT0
,
0
,
1
},
{
TEGRA124_CLK_CLK_OUT_1_MUX
,
TEGRA124_CLK_EXTERN1
,
0
,
1
},
{
TEGRA124_CLK_CLK_OUT_1
,
TEGRA124_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA124_CLK_I2S0
,
TEGRA124_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA124_CLK_I2S1
,
TEGRA124_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA124_CLK_I2S2
,
TEGRA124_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA124_CLK_I2S3
,
TEGRA124_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA124_CLK_I2S4
,
TEGRA124_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA124_CLK_VDE
,
TEGRA124_CLK_PLL_P
,
0
,
0
},
{
TEGRA124_CLK_HOST1X
,
TEGRA124_CLK_PLL_P
,
136000000
,
1
},
{
TEGRA124_CLK_SCLK
,
TEGRA124_CLK_PLL_P_OUT2
,
102000000
,
1
},
{
TEGRA124_CLK_DFLL_SOC
,
TEGRA124_CLK_PLL_P
,
51000000
,
1
},
{
TEGRA124_CLK_DFLL_REF
,
TEGRA124_CLK_PLL_P
,
51000000
,
1
},
{
TEGRA124_CLK_PLL_C
,
TEGRA124_CLK_CLK_MAX
,
768000000
,
0
},
{
TEGRA124_CLK_PLL_C_OUT1
,
TEGRA124_CLK_CLK_MAX
,
100000000
,
0
},
{
TEGRA124_CLK_SBC4
,
TEGRA124_CLK_PLL_P
,
12000000
,
1
},
{
TEGRA124_CLK_TSEC
,
TEGRA124_CLK_PLL_C3
,
0
,
0
},
{
TEGRA124_CLK_MSENC
,
TEGRA124_CLK_PLL_C3
,
0
,
0
},
/* This MUST be the last entry. */
{
TEGRA124_CLK_CLK_MAX
,
TEGRA124_CLK_CLK_MAX
,
0
,
0
},
};
static
void
__init
tegra124_clock_apply_init_table
(
void
)
{
tegra_init_from_table
(
init_table
,
clks
,
TEGRA124_CLK_CLK_MAX
);
}
static
void
__init
tegra124_clock_init
(
struct
device_node
*
np
)
{
struct
device_node
*
node
;
clk_base
=
of_iomap
(
np
,
0
);
if
(
!
clk_base
)
{
pr_err
(
"ioremap tegra124 CAR failed
\n
"
);
return
;
}
node
=
of_find_matching_node
(
NULL
,
pmc_match
);
if
(
!
node
)
{
pr_err
(
"Failed to find pmc node
\n
"
);
WARN_ON
(
1
);
return
;
}
pmc_base
=
of_iomap
(
node
,
0
);
if
(
!
pmc_base
)
{
pr_err
(
"Can't map pmc registers
\n
"
);
WARN_ON
(
1
);
return
;
}
clks
=
tegra_clk_init
(
TEGRA124_CLK_CLK_MAX
,
6
);
if
(
!
clks
)
return
;
if
(
tegra_osc_clk_init
(
clk_base
,
tegra124_clks
,
tegra124_input_freq
,
ARRAY_SIZE
(
tegra124_input_freq
),
&
osc_freq
,
&
pll_ref_freq
)
<
0
)
return
;
tegra_fixed_clk_init
(
tegra124_clks
);
tegra124_pll_init
(
clk_base
,
pmc_base
);
tegra124_periph_clk_init
(
clk_base
,
pmc_base
);
tegra_audio_clk_init
(
clk_base
,
pmc_base
,
tegra124_clks
,
&
pll_a_params
);
tegra_pmc_clk_init
(
pmc_base
,
tegra124_clks
);
tegra_super_clk_gen4_init
(
clk_base
,
pmc_base
,
tegra124_clks
,
&
pll_x_params
);
tegra_add_of_provider
(
np
);
tegra_register_devclks
(
devclks
,
ARRAY_SIZE
(
devclks
));
tegra_clk_apply_init_table
=
tegra124_clock_apply_init_table
;
tegra_cpu_car_ops
=
&
tegra124_cpu_car_ops
;
}
CLK_OF_DECLARE
(
tegra124
,
"nvidia,tegra124-car"
,
tegra124_clock_init
);
drivers/clk/tegra/clk-tegra20.c
View file @
e9827d9b
...
...
@@ -22,30 +22,10 @@
#include <linux/of_address.h>
#include <linux/clk/tegra.h>
#include <linux/delay.h>
#include <dt-bindings/clock/tegra20-car.h>
#include "clk.h"
#define RST_DEVICES_L 0x004
#define RST_DEVICES_H 0x008
#define RST_DEVICES_U 0x00c
#define RST_DEVICES_SET_L 0x300
#define RST_DEVICES_CLR_L 0x304
#define RST_DEVICES_SET_H 0x308
#define RST_DEVICES_CLR_H 0x30c
#define RST_DEVICES_SET_U 0x310
#define RST_DEVICES_CLR_U 0x314
#define RST_DEVICES_NUM 3
#define CLK_OUT_ENB_L 0x010
#define CLK_OUT_ENB_H 0x014
#define CLK_OUT_ENB_U 0x018
#define CLK_OUT_ENB_SET_L 0x320
#define CLK_OUT_ENB_CLR_L 0x324
#define CLK_OUT_ENB_SET_H 0x328
#define CLK_OUT_ENB_CLR_H 0x32c
#define CLK_OUT_ENB_SET_U 0x330
#define CLK_OUT_ENB_CLR_U 0x334
#define CLK_OUT_ENB_NUM 3
#include "clk-id.h"
#define OSC_CTRL 0x50
#define OSC_CTRL_OSC_FREQ_MASK (3<<30)
...
...
@@ -67,6 +47,8 @@
#define OSC_FREQ_DET_BUSY (1<<31)
#define OSC_FREQ_DET_CNT_MASK 0xFFFF
#define TEGRA20_CLK_PERIPH_BANKS 3
#define PLLS_BASE 0xf0
#define PLLS_MISC 0xf4
#define PLLC_BASE 0x80
...
...
@@ -114,34 +96,15 @@
#define CLK_SOURCE_I2S1 0x100
#define CLK_SOURCE_I2S2 0x104
#define CLK_SOURCE_SPDIF_OUT 0x108
#define CLK_SOURCE_SPDIF_IN 0x10c
#define CLK_SOURCE_PWM 0x110
#define CLK_SOURCE_SPI 0x114
#define CLK_SOURCE_SBC1 0x134
#define CLK_SOURCE_SBC2 0x118
#define CLK_SOURCE_SBC3 0x11c
#define CLK_SOURCE_SBC4 0x1b4
#define CLK_SOURCE_XIO 0x120
#define CLK_SOURCE_TWC 0x12c
#define CLK_SOURCE_IDE 0x144
#define CLK_SOURCE_NDFLASH 0x160
#define CLK_SOURCE_VFIR 0x168
#define CLK_SOURCE_SDMMC1 0x150
#define CLK_SOURCE_SDMMC2 0x154
#define CLK_SOURCE_SDMMC3 0x1bc
#define CLK_SOURCE_SDMMC4 0x164
#define CLK_SOURCE_CVE 0x140
#define CLK_SOURCE_TVO 0x188
#define CLK_SOURCE_TVDAC 0x194
#define CLK_SOURCE_HDMI 0x18c
#define CLK_SOURCE_DISP1 0x138
#define CLK_SOURCE_DISP2 0x13c
#define CLK_SOURCE_CSITE 0x1d4
#define CLK_SOURCE_LA 0x1f8
#define CLK_SOURCE_OWR 0x1cc
#define CLK_SOURCE_NOR 0x1d0
#define CLK_SOURCE_MIPI 0x174
#define CLK_SOURCE_I2C1 0x124
#define CLK_SOURCE_I2C2 0x198
#define CLK_SOURCE_I2C3 0x1b8
...
...
@@ -151,24 +114,10 @@
#define CLK_SOURCE_UARTC 0x1a0
#define CLK_SOURCE_UARTD 0x1c0
#define CLK_SOURCE_UARTE 0x1c4
#define CLK_SOURCE_3D 0x158
#define CLK_SOURCE_2D 0x15c
#define CLK_SOURCE_MPE 0x170
#define CLK_SOURCE_EPP 0x16c
#define CLK_SOURCE_HOST1X 0x180
#define CLK_SOURCE_VDE 0x1c8
#define CLK_SOURCE_VI 0x148
#define CLK_SOURCE_VI_SENSOR 0x1a8
#define CLK_SOURCE_EMC 0x19c
#define AUDIO_SYNC_CLK 0x38
#define PMC_CTRL 0x0
#define PMC_CTRL_BLINK_ENB 7
#define PMC_DPD_PADS_ORIDE 0x1c
#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
#define PMC_BLINK_TIMER 0x40
/* Tegra CPU clock and reset control regs */
#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX 0x4c
#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET 0x340
...
...
@@ -188,64 +137,32 @@ static struct cpu_clk_suspend_context {
}
tegra20_cpu_clk_sctx
;
#endif
static
int
periph_clk_enb_refcnt
[
CLK_OUT_ENB_NUM
*
32
];
static
void
__iomem
*
clk_base
;
static
void
__iomem
*
pmc_base
;
static
DEFINE_SPINLOCK
(
pll_div_lock
);
static
DEFINE_SPINLOCK
(
sysrate_lock
);
#define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
#define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \
30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
_
regs, _clk_num, periph_clk_enb_refcnt,
\
_
clk_num,
\
_gate_flags, _clk_id)
#define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id)
#define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, _regs, \
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
#define TEGRA_INIT_DATA_DIV16(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \
30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, \
_clk_num, _gate_flags, \
_clk_id)
#define TEGRA_INIT_DATA_NODIV(_name, _
con_id, _dev_id, _
parents, _offset, \
_mux_shift, _mux_width, _clk_num,
_regs,
\
#define TEGRA_INIT_DATA_NODIV(_name, _parents, _offset, \
_mux_shift, _mux_width, _clk_num, \
_gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name,
_con_id, _dev_id
, _parents, _offset, \
_mux_shift, _mux_width, 0, 0, 0, 0, 0,
_regs,
\
_clk_num,
periph_clk_enb_refcnt,
_gate_flags, \
TEGRA_INIT_DATA(_name,
NULL, NULL
, _parents, _offset, \
_mux_shift, _mux_width, 0, 0, 0, 0, 0, \
_clk_num, _gate_flags, \
_clk_id)
/* IDs assigned here must be in sync with DT bindings definition
* for Tegra20 clocks .
*/
enum
tegra20_clk
{
cpu
,
ac97
=
3
,
rtc
,
timer
,
uarta
,
gpio
=
8
,
sdmmc2
,
i2s1
=
11
,
i2c1
,
ndflash
,
sdmmc1
,
sdmmc4
,
twc
,
pwm
,
i2s2
,
epp
,
gr2d
=
21
,
usbd
,
isp
,
gr3d
,
ide
,
disp2
,
disp1
,
host1x
,
vcp
,
cache2
=
31
,
mem
,
ahbdma
,
apbdma
,
kbc
=
36
,
stat_mon
,
pmc
,
fuse
,
kfuse
,
sbc1
,
nor
,
spi
,
sbc2
,
xio
,
sbc3
,
dvc
,
dsi
,
mipi
=
50
,
hdmi
,
csi
,
tvdac
,
i2c2
,
uartc
,
emc
=
57
,
usb2
,
usb3
,
mpe
,
vde
,
bsea
,
bsev
,
speedo
,
uartd
,
uarte
,
i2c3
,
sbc4
,
sdmmc3
,
pex
,
owr
,
afi
,
csite
,
pcie_xclk
,
avpucq
=
75
,
la
,
irama
=
84
,
iramb
,
iramc
,
iramd
,
cram2
,
audio_2x
,
clk_d
,
csus
=
92
,
cdev2
,
cdev1
,
uartb
=
96
,
vfir
,
spdif_in
,
spdif_out
,
vi
,
vi_sensor
,
tvo
,
cve
,
osc
,
clk_32k
,
clk_m
,
sclk
,
cclk
,
hclk
,
pclk
,
blink
,
pll_a
,
pll_a_out0
,
pll_c
,
pll_c_out1
,
pll_d
,
pll_d_out0
,
pll_e
,
pll_m
,
pll_m_out1
,
pll_p
,
pll_p_out1
,
pll_p_out2
,
pll_p_out3
,
pll_p_out4
,
pll_s
,
pll_u
,
pll_x
,
cop
,
audio
,
pll_ref
,
twd
,
clk_max
,
};
static
struct
clk
*
clks
[
clk_max
];
static
struct
clk_onecell_data
clk_data
;
static
struct
clk
**
clks
;
static
struct
tegra_clk_pll_freq_table
pll_c_freq_table
[]
=
{
{
12000000
,
600000000
,
600
,
12
,
0
,
8
},
...
...
@@ -383,6 +300,8 @@ static struct tegra_clk_pll_params pll_c_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_c_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
,
};
static
struct
tegra_clk_pll_params
pll_m_params
=
{
...
...
@@ -397,6 +316,8 @@ static struct tegra_clk_pll_params pll_m_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_m_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
,
};
static
struct
tegra_clk_pll_params
pll_p_params
=
{
...
...
@@ -411,6 +332,9 @@ static struct tegra_clk_pll_params pll_p_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_p_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
|
TEGRA_PLL_HAS_CPCON
,
.
fixed_rate
=
216000000
,
};
static
struct
tegra_clk_pll_params
pll_a_params
=
{
...
...
@@ -425,6 +349,8 @@ static struct tegra_clk_pll_params pll_a_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_a_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
,
};
static
struct
tegra_clk_pll_params
pll_d_params
=
{
...
...
@@ -439,6 +365,8 @@ static struct tegra_clk_pll_params pll_d_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
,
};
static
struct
pdiv_map
pllu_p
[]
=
{
...
...
@@ -460,6 +388,8 @@ static struct tegra_clk_pll_params pll_u_params = {
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
pdiv_tohw
=
pllu_p
,
.
freq_table
=
pll_u_freq_table
,
.
flags
=
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
,
};
static
struct
tegra_clk_pll_params
pll_x_params
=
{
...
...
@@ -474,6 +404,8 @@ static struct tegra_clk_pll_params pll_x_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_x_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
,
};
static
struct
tegra_clk_pll_params
pll_e_params
=
{
...
...
@@ -488,34 +420,161 @@ static struct tegra_clk_pll_params pll_e_params = {
.
lock_mask
=
PLLE_MISC_LOCK
,
.
lock_enable_bit_idx
=
PLLE_MISC_LOCK_ENABLE
,
.
lock_delay
=
0
,
.
freq_table
=
pll_e_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
,
.
fixed_rate
=
100000000
,
};
/* Peripheral clock registers */
static
struct
tegra_clk_periph_regs
periph_l_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_L
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_L
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_L
,
.
rst_reg
=
RST_DEVICES_L
,
.
rst_set_reg
=
RST_DEVICES_SET_L
,
.
rst_clr_reg
=
RST_DEVICES_CLR_L
,
static
struct
tegra_devclk
devclks
[]
__initdata
=
{
{
.
con_id
=
"pll_c"
,
.
dt_id
=
TEGRA20_CLK_PLL_C
},
{
.
con_id
=
"pll_c_out1"
,
.
dt_id
=
TEGRA20_CLK_PLL_C_OUT1
},
{
.
con_id
=
"pll_p"
,
.
dt_id
=
TEGRA20_CLK_PLL_P
},
{
.
con_id
=
"pll_p_out1"
,
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT1
},
{
.
con_id
=
"pll_p_out2"
,
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT2
},
{
.
con_id
=
"pll_p_out3"
,
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT3
},
{
.
con_id
=
"pll_p_out4"
,
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT4
},
{
.
con_id
=
"pll_m"
,
.
dt_id
=
TEGRA20_CLK_PLL_M
},
{
.
con_id
=
"pll_m_out1"
,
.
dt_id
=
TEGRA20_CLK_PLL_M_OUT1
},
{
.
con_id
=
"pll_x"
,
.
dt_id
=
TEGRA20_CLK_PLL_X
},
{
.
con_id
=
"pll_u"
,
.
dt_id
=
TEGRA20_CLK_PLL_U
},
{
.
con_id
=
"pll_d"
,
.
dt_id
=
TEGRA20_CLK_PLL_D
},
{
.
con_id
=
"pll_d_out0"
,
.
dt_id
=
TEGRA20_CLK_PLL_D_OUT0
},
{
.
con_id
=
"pll_a"
,
.
dt_id
=
TEGRA20_CLK_PLL_A
},
{
.
con_id
=
"pll_a_out0"
,
.
dt_id
=
TEGRA20_CLK_PLL_A_OUT0
},
{
.
con_id
=
"pll_e"
,
.
dt_id
=
TEGRA20_CLK_PLL_E
},
{
.
con_id
=
"cclk"
,
.
dt_id
=
TEGRA20_CLK_CCLK
},
{
.
con_id
=
"sclk"
,
.
dt_id
=
TEGRA20_CLK_SCLK
},
{
.
con_id
=
"hclk"
,
.
dt_id
=
TEGRA20_CLK_HCLK
},
{
.
con_id
=
"pclk"
,
.
dt_id
=
TEGRA20_CLK_PCLK
},
{
.
con_id
=
"fuse"
,
.
dt_id
=
TEGRA20_CLK_FUSE
},
{
.
con_id
=
"twd"
,
.
dt_id
=
TEGRA20_CLK_TWD
},
{
.
con_id
=
"audio"
,
.
dt_id
=
TEGRA20_CLK_AUDIO
},
{
.
con_id
=
"audio_2x"
,
.
dt_id
=
TEGRA20_CLK_AUDIO_2X
},
{
.
dev_id
=
"tegra20-ac97"
,
.
dt_id
=
TEGRA20_CLK_AC97
},
{
.
dev_id
=
"tegra-apbdma"
,
.
dt_id
=
TEGRA20_CLK_APBDMA
},
{
.
dev_id
=
"rtc-tegra"
,
.
dt_id
=
TEGRA20_CLK_RTC
},
{
.
dev_id
=
"timer"
,
.
dt_id
=
TEGRA20_CLK_TIMER
},
{
.
dev_id
=
"tegra-kbc"
,
.
dt_id
=
TEGRA20_CLK_KBC
},
{
.
con_id
=
"csus"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA20_CLK_CSUS
},
{
.
con_id
=
"vcp"
,
.
dev_id
=
"tegra-avp"
,
.
dt_id
=
TEGRA20_CLK_VCP
},
{
.
con_id
=
"bsea"
,
.
dev_id
=
"tegra-avp"
,
.
dt_id
=
TEGRA20_CLK_BSEA
},
{
.
con_id
=
"bsev"
,
.
dev_id
=
"tegra-aes"
,
.
dt_id
=
TEGRA20_CLK_BSEV
},
{
.
con_id
=
"emc"
,
.
dt_id
=
TEGRA20_CLK_EMC
},
{
.
dev_id
=
"fsl-tegra-udc"
,
.
dt_id
=
TEGRA20_CLK_USBD
},
{
.
dev_id
=
"tegra-ehci.1"
,
.
dt_id
=
TEGRA20_CLK_USB2
},
{
.
dev_id
=
"tegra-ehci.2"
,
.
dt_id
=
TEGRA20_CLK_USB3
},
{
.
dev_id
=
"dsi"
,
.
dt_id
=
TEGRA20_CLK_DSI
},
{
.
con_id
=
"csi"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA20_CLK_CSI
},
{
.
con_id
=
"isp"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA20_CLK_ISP
},
{
.
con_id
=
"pex"
,
.
dt_id
=
TEGRA20_CLK_PEX
},
{
.
con_id
=
"afi"
,
.
dt_id
=
TEGRA20_CLK_AFI
},
{
.
con_id
=
"pcie_xclk"
,
.
dt_id
=
TEGRA20_CLK_PCIE_XCLK
},
{
.
con_id
=
"cdev1"
,
.
dt_id
=
TEGRA20_CLK_CDEV1
},
{
.
con_id
=
"cdev2"
,
.
dt_id
=
TEGRA20_CLK_CDEV2
},
{
.
con_id
=
"clk_32k"
,
.
dt_id
=
TEGRA20_CLK_CLK_32K
},
{
.
con_id
=
"blink"
,
.
dt_id
=
TEGRA20_CLK_BLINK
},
{
.
con_id
=
"clk_m"
,
.
dt_id
=
TEGRA20_CLK_CLK_M
},
{
.
con_id
=
"pll_ref"
,
.
dt_id
=
TEGRA20_CLK_PLL_REF
},
{
.
dev_id
=
"tegra20-i2s.0"
,
.
dt_id
=
TEGRA20_CLK_I2S1
},
{
.
dev_id
=
"tegra20-i2s.1"
,
.
dt_id
=
TEGRA20_CLK_I2S2
},
{
.
con_id
=
"spdif_out"
,
.
dev_id
=
"tegra20-spdif"
,
.
dt_id
=
TEGRA20_CLK_SPDIF_OUT
},
{
.
con_id
=
"spdif_in"
,
.
dev_id
=
"tegra20-spdif"
,
.
dt_id
=
TEGRA20_CLK_SPDIF_IN
},
{
.
dev_id
=
"spi_tegra.0"
,
.
dt_id
=
TEGRA20_CLK_SBC1
},
{
.
dev_id
=
"spi_tegra.1"
,
.
dt_id
=
TEGRA20_CLK_SBC2
},
{
.
dev_id
=
"spi_tegra.2"
,
.
dt_id
=
TEGRA20_CLK_SBC3
},
{
.
dev_id
=
"spi_tegra.3"
,
.
dt_id
=
TEGRA20_CLK_SBC4
},
{
.
dev_id
=
"spi"
,
.
dt_id
=
TEGRA20_CLK_SPI
},
{
.
dev_id
=
"xio"
,
.
dt_id
=
TEGRA20_CLK_XIO
},
{
.
dev_id
=
"twc"
,
.
dt_id
=
TEGRA20_CLK_TWC
},
{
.
dev_id
=
"ide"
,
.
dt_id
=
TEGRA20_CLK_IDE
},
{
.
dev_id
=
"tegra_nand"
,
.
dt_id
=
TEGRA20_CLK_NDFLASH
},
{
.
dev_id
=
"vfir"
,
.
dt_id
=
TEGRA20_CLK_VFIR
},
{
.
dev_id
=
"csite"
,
.
dt_id
=
TEGRA20_CLK_CSITE
},
{
.
dev_id
=
"la"
,
.
dt_id
=
TEGRA20_CLK_LA
},
{
.
dev_id
=
"tegra_w1"
,
.
dt_id
=
TEGRA20_CLK_OWR
},
{
.
dev_id
=
"mipi"
,
.
dt_id
=
TEGRA20_CLK_MIPI
},
{
.
dev_id
=
"vde"
,
.
dt_id
=
TEGRA20_CLK_VDE
},
{
.
con_id
=
"vi"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA20_CLK_VI
},
{
.
dev_id
=
"epp"
,
.
dt_id
=
TEGRA20_CLK_EPP
},
{
.
dev_id
=
"mpe"
,
.
dt_id
=
TEGRA20_CLK_MPE
},
{
.
dev_id
=
"host1x"
,
.
dt_id
=
TEGRA20_CLK_HOST1X
},
{
.
dev_id
=
"3d"
,
.
dt_id
=
TEGRA20_CLK_GR3D
},
{
.
dev_id
=
"2d"
,
.
dt_id
=
TEGRA20_CLK_GR2D
},
{
.
dev_id
=
"tegra-nor"
,
.
dt_id
=
TEGRA20_CLK_NOR
},
{
.
dev_id
=
"sdhci-tegra.0"
,
.
dt_id
=
TEGRA20_CLK_SDMMC1
},
{
.
dev_id
=
"sdhci-tegra.1"
,
.
dt_id
=
TEGRA20_CLK_SDMMC2
},
{
.
dev_id
=
"sdhci-tegra.2"
,
.
dt_id
=
TEGRA20_CLK_SDMMC3
},
{
.
dev_id
=
"sdhci-tegra.3"
,
.
dt_id
=
TEGRA20_CLK_SDMMC4
},
{
.
dev_id
=
"cve"
,
.
dt_id
=
TEGRA20_CLK_CVE
},
{
.
dev_id
=
"tvo"
,
.
dt_id
=
TEGRA20_CLK_TVO
},
{
.
dev_id
=
"tvdac"
,
.
dt_id
=
TEGRA20_CLK_TVDAC
},
{
.
con_id
=
"vi_sensor"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA20_CLK_VI_SENSOR
},
{
.
dev_id
=
"hdmi"
,
.
dt_id
=
TEGRA20_CLK_HDMI
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.0"
,
.
dt_id
=
TEGRA20_CLK_I2C1
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.1"
,
.
dt_id
=
TEGRA20_CLK_I2C2
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.2"
,
.
dt_id
=
TEGRA20_CLK_I2C3
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.3"
,
.
dt_id
=
TEGRA20_CLK_DVC
},
{
.
dev_id
=
"tegra-pwm"
,
.
dt_id
=
TEGRA20_CLK_PWM
},
{
.
dev_id
=
"tegra_uart.0"
,
.
dt_id
=
TEGRA20_CLK_UARTA
},
{
.
dev_id
=
"tegra_uart.1"
,
.
dt_id
=
TEGRA20_CLK_UARTB
},
{
.
dev_id
=
"tegra_uart.2"
,
.
dt_id
=
TEGRA20_CLK_UARTC
},
{
.
dev_id
=
"tegra_uart.3"
,
.
dt_id
=
TEGRA20_CLK_UARTD
},
{
.
dev_id
=
"tegra_uart.4"
,
.
dt_id
=
TEGRA20_CLK_UARTE
},
{
.
dev_id
=
"tegradc.0"
,
.
dt_id
=
TEGRA20_CLK_DISP1
},
{
.
dev_id
=
"tegradc.1"
,
.
dt_id
=
TEGRA20_CLK_DISP2
},
};
static
struct
tegra_clk_periph_regs
periph_h_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_H
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_H
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_H
,
.
rst_reg
=
RST_DEVICES_H
,
.
rst_set_reg
=
RST_DEVICES_SET_H
,
.
rst_clr_reg
=
RST_DEVICES_CLR_H
,
};
static
struct
tegra_clk_periph_regs
periph_u_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_U
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_U
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_U
,
.
rst_reg
=
RST_DEVICES_U
,
.
rst_set_reg
=
RST_DEVICES_SET_U
,
.
rst_clr_reg
=
RST_DEVICES_CLR_U
,
static
struct
tegra_clk
tegra20_clks
[
tegra_clk_max
]
__initdata
=
{
[
tegra_clk_spdif_out
]
=
{
.
dt_id
=
TEGRA20_CLK_SPDIF_OUT
,
.
present
=
true
},
[
tegra_clk_spdif_in
]
=
{
.
dt_id
=
TEGRA20_CLK_SPDIF_IN
,
.
present
=
true
},
[
tegra_clk_sdmmc1
]
=
{
.
dt_id
=
TEGRA20_CLK_SDMMC1
,
.
present
=
true
},
[
tegra_clk_sdmmc2
]
=
{
.
dt_id
=
TEGRA20_CLK_SDMMC2
,
.
present
=
true
},
[
tegra_clk_sdmmc3
]
=
{
.
dt_id
=
TEGRA20_CLK_SDMMC3
,
.
present
=
true
},
[
tegra_clk_sdmmc4
]
=
{
.
dt_id
=
TEGRA20_CLK_SDMMC4
,
.
present
=
true
},
[
tegra_clk_la
]
=
{
.
dt_id
=
TEGRA20_CLK_LA
,
.
present
=
true
},
[
tegra_clk_csite
]
=
{
.
dt_id
=
TEGRA20_CLK_CSITE
,
.
present
=
true
},
[
tegra_clk_vfir
]
=
{
.
dt_id
=
TEGRA20_CLK_VFIR
,
.
present
=
true
},
[
tegra_clk_mipi
]
=
{
.
dt_id
=
TEGRA20_CLK_MIPI
,
.
present
=
true
},
[
tegra_clk_nor
]
=
{
.
dt_id
=
TEGRA20_CLK_NOR
,
.
present
=
true
},
[
tegra_clk_rtc
]
=
{
.
dt_id
=
TEGRA20_CLK_RTC
,
.
present
=
true
},
[
tegra_clk_timer
]
=
{
.
dt_id
=
TEGRA20_CLK_TIMER
,
.
present
=
true
},
[
tegra_clk_kbc
]
=
{
.
dt_id
=
TEGRA20_CLK_KBC
,
.
present
=
true
},
[
tegra_clk_csus
]
=
{
.
dt_id
=
TEGRA20_CLK_CSUS
,
.
present
=
true
},
[
tegra_clk_vcp
]
=
{
.
dt_id
=
TEGRA20_CLK_VCP
,
.
present
=
true
},
[
tegra_clk_bsea
]
=
{
.
dt_id
=
TEGRA20_CLK_BSEA
,
.
present
=
true
},
[
tegra_clk_bsev
]
=
{
.
dt_id
=
TEGRA20_CLK_BSEV
,
.
present
=
true
},
[
tegra_clk_usbd
]
=
{
.
dt_id
=
TEGRA20_CLK_USBD
,
.
present
=
true
},
[
tegra_clk_usb2
]
=
{
.
dt_id
=
TEGRA20_CLK_USB2
,
.
present
=
true
},
[
tegra_clk_usb3
]
=
{
.
dt_id
=
TEGRA20_CLK_USB3
,
.
present
=
true
},
[
tegra_clk_csi
]
=
{
.
dt_id
=
TEGRA20_CLK_CSI
,
.
present
=
true
},
[
tegra_clk_isp
]
=
{
.
dt_id
=
TEGRA20_CLK_ISP
,
.
present
=
true
},
[
tegra_clk_clk_32k
]
=
{
.
dt_id
=
TEGRA20_CLK_CLK_32K
,
.
present
=
true
},
[
tegra_clk_blink
]
=
{
.
dt_id
=
TEGRA20_CLK_BLINK
,
.
present
=
true
},
[
tegra_clk_hclk
]
=
{
.
dt_id
=
TEGRA20_CLK_HCLK
,
.
present
=
true
},
[
tegra_clk_pclk
]
=
{
.
dt_id
=
TEGRA20_CLK_PCLK
,
.
present
=
true
},
[
tegra_clk_pll_p_out1
]
=
{
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p_out2
]
=
{
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT2
,
.
present
=
true
},
[
tegra_clk_pll_p_out3
]
=
{
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT3
,
.
present
=
true
},
[
tegra_clk_pll_p_out4
]
=
{
.
dt_id
=
TEGRA20_CLK_PLL_P_OUT4
,
.
present
=
true
},
[
tegra_clk_pll_p
]
=
{
.
dt_id
=
TEGRA20_CLK_PLL_P
,
.
present
=
true
},
[
tegra_clk_owr
]
=
{
.
dt_id
=
TEGRA20_CLK_OWR
,
.
present
=
true
},
[
tegra_clk_sbc1
]
=
{
.
dt_id
=
TEGRA20_CLK_SBC1
,
.
present
=
true
},
[
tegra_clk_sbc2
]
=
{
.
dt_id
=
TEGRA20_CLK_SBC2
,
.
present
=
true
},
[
tegra_clk_sbc3
]
=
{
.
dt_id
=
TEGRA20_CLK_SBC3
,
.
present
=
true
},
[
tegra_clk_sbc4
]
=
{
.
dt_id
=
TEGRA20_CLK_SBC4
,
.
present
=
true
},
[
tegra_clk_vde
]
=
{
.
dt_id
=
TEGRA20_CLK_VDE
,
.
present
=
true
},
[
tegra_clk_vi
]
=
{
.
dt_id
=
TEGRA20_CLK_VI
,
.
present
=
true
},
[
tegra_clk_epp
]
=
{
.
dt_id
=
TEGRA20_CLK_EPP
,
.
present
=
true
},
[
tegra_clk_mpe
]
=
{
.
dt_id
=
TEGRA20_CLK_MPE
,
.
present
=
true
},
[
tegra_clk_host1x
]
=
{
.
dt_id
=
TEGRA20_CLK_HOST1X
,
.
present
=
true
},
[
tegra_clk_gr2d
]
=
{
.
dt_id
=
TEGRA20_CLK_GR2D
,
.
present
=
true
},
[
tegra_clk_gr3d
]
=
{
.
dt_id
=
TEGRA20_CLK_GR3D
,
.
present
=
true
},
[
tegra_clk_ndflash
]
=
{
.
dt_id
=
TEGRA20_CLK_NDFLASH
,
.
present
=
true
},
[
tegra_clk_cve
]
=
{
.
dt_id
=
TEGRA20_CLK_CVE
,
.
present
=
true
},
[
tegra_clk_tvo
]
=
{
.
dt_id
=
TEGRA20_CLK_TVO
,
.
present
=
true
},
[
tegra_clk_tvdac
]
=
{
.
dt_id
=
TEGRA20_CLK_TVDAC
,
.
present
=
true
},
[
tegra_clk_vi_sensor
]
=
{
.
dt_id
=
TEGRA20_CLK_VI_SENSOR
,
.
present
=
true
},
[
tegra_clk_afi
]
=
{
.
dt_id
=
TEGRA20_CLK_AFI
,
.
present
=
true
},
};
static
unsigned
long
tegra20_clk_measure_input_freq
(
void
)
...
...
@@ -577,10 +636,8 @@ static void tegra20_pll_init(void)
/* PLLC */
clk
=
tegra_clk_register_pll
(
"pll_c"
,
"pll_ref"
,
clk_base
,
NULL
,
0
,
0
,
&
pll_c_params
,
TEGRA_PLL_HAS_CPCON
,
pll_c_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c"
,
NULL
);
clks
[
pll_c
]
=
clk
;
&
pll_c_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_C
]
=
clk
;
/* PLLC_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_c_out1_div"
,
"pll_c"
,
...
...
@@ -589,71 +646,13 @@ static void tegra20_pll_init(void)
clk
=
tegra_clk_register_pll_out
(
"pll_c_out1"
,
"pll_c_out1_div"
,
clk_base
+
PLLC_OUT
,
1
,
0
,
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c_out1"
,
NULL
);
clks
[
pll_c_out1
]
=
clk
;
/* PLLP */
clk
=
tegra_clk_register_pll
(
"pll_p"
,
"pll_ref"
,
clk_base
,
NULL
,
0
,
216000000
,
&
pll_p_params
,
TEGRA_PLL_FIXED
|
TEGRA_PLL_HAS_CPCON
,
pll_p_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_p"
,
NULL
);
clks
[
pll_p
]
=
clk
;
/* PLLP_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_p_out1_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out1"
,
"pll_p_out1_div"
,
clk_base
+
PLLP_OUTA
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out1"
,
NULL
);
clks
[
pll_p_out1
]
=
clk
;
/* PLLP_OUT2 */
clk
=
tegra_clk_register_divider
(
"pll_p_out2_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out2"
,
"pll_p_out2_div"
,
clk_base
+
PLLP_OUTA
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out2"
,
NULL
);
clks
[
pll_p_out2
]
=
clk
;
/* PLLP_OUT3 */
clk
=
tegra_clk_register_divider
(
"pll_p_out3_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out3"
,
"pll_p_out3_div"
,
clk_base
+
PLLP_OUTB
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out3"
,
NULL
);
clks
[
pll_p_out3
]
=
clk
;
/* PLLP_OUT4 */
clk
=
tegra_clk_register_divider
(
"pll_p_out4_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out4"
,
"pll_p_out4_div"
,
clk_base
+
PLLP_OUTB
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out4"
,
NULL
);
clks
[
pll_p_out4
]
=
clk
;
clks
[
TEGRA20_CLK_PLL_C_OUT1
]
=
clk
;
/* PLLM */
clk
=
tegra_clk_register_pll
(
"pll_m"
,
"pll_ref"
,
clk_base
,
NULL
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
0
,
&
pll_m_params
,
TEGRA_PLL_HAS_CPCON
,
pll_m_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m"
,
NULL
);
clks
[
pll_m
]
=
clk
;
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
&
pll_m_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_M
]
=
clk
;
/* PLLM_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_m_out1_div"
,
"pll_m"
,
...
...
@@ -662,42 +661,32 @@ static void tegra20_pll_init(void)
clk
=
tegra_clk_register_pll_out
(
"pll_m_out1"
,
"pll_m_out1_div"
,
clk_base
+
PLLM_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m_out1"
,
NULL
);
clks
[
pll_m_out1
]
=
clk
;
clks
[
TEGRA20_CLK_PLL_M_OUT1
]
=
clk
;
/* PLLX */
clk
=
tegra_clk_register_pll
(
"pll_x"
,
"pll_ref"
,
clk_base
,
NULL
,
0
,
0
,
&
pll_x_params
,
TEGRA_PLL_HAS_CPCON
,
pll_x_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_x"
,
NULL
);
clks
[
pll_x
]
=
clk
;
&
pll_x_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_X
]
=
clk
;
/* PLLU */
clk
=
tegra_clk_register_pll
(
"pll_u"
,
"pll_ref"
,
clk_base
,
NULL
,
0
,
0
,
&
pll_u_params
,
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
,
pll_u_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_u"
,
NULL
);
clks
[
pll_u
]
=
clk
;
&
pll_u_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_U
]
=
clk
;
/* PLLD */
clk
=
tegra_clk_register_pll
(
"pll_d"
,
"pll_ref"
,
clk_base
,
NULL
,
0
,
0
,
&
pll_d_params
,
TEGRA_PLL_HAS_CPCON
,
pll_d_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_d"
,
NULL
);
clks
[
pll_d
]
=
clk
;
&
pll_d_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_D
]
=
clk
;
/* PLLD_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d_out0"
,
"pll_d"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d_out0"
,
NULL
);
clks
[
pll_d_out0
]
=
clk
;
clks
[
TEGRA20_CLK_PLL_D_OUT0
]
=
clk
;
/* PLLA */
clk
=
tegra_clk_register_pll
(
"pll_a"
,
"pll_p_out1"
,
clk_base
,
NULL
,
0
,
0
,
&
pll_a_params
,
TEGRA_PLL_HAS_CPCON
,
pll_a_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a"
,
NULL
);
clks
[
pll_a
]
=
clk
;
&
pll_a_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_A
]
=
clk
;
/* PLLA_OUT0 */
clk
=
tegra_clk_register_divider
(
"pll_a_out0_div"
,
"pll_a"
,
...
...
@@ -706,15 +695,12 @@ static void tegra20_pll_init(void)
clk
=
tegra_clk_register_pll_out
(
"pll_a_out0"
,
"pll_a_out0_div"
,
clk_base
+
PLLA_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a_out0"
,
NULL
);
clks
[
pll_a_out0
]
=
clk
;
clks
[
TEGRA20_CLK_PLL_A_OUT0
]
=
clk
;
/* PLLE */
clk
=
tegra_clk_register_plle
(
"pll_e"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
100000000
,
&
pll_e_params
,
0
,
pll_e_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_e"
,
NULL
);
clks
[
pll_e
]
=
clk
;
0
,
&
pll_e_params
,
NULL
);
clks
[
TEGRA20_CLK_PLL_E
]
=
clk
;
}
static
const
char
*
cclk_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
...
...
@@ -732,40 +718,17 @@ static void tegra20_super_clk_init(void)
clk
=
tegra_clk_register_super_mux
(
"cclk"
,
cclk_parents
,
ARRAY_SIZE
(
cclk_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
CCLK_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"cclk"
,
NULL
);
clks
[
cclk
]
=
clk
;
clks
[
TEGRA20_CLK_CCLK
]
=
clk
;
/* SCLK */
clk
=
tegra_clk_register_super_mux
(
"sclk"
,
sclk_parents
,
ARRAY_SIZE
(
sclk_parents
),
CLK_SET_RATE_PARENT
,
clk_base
+
SCLK_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"sclk"
,
NULL
);
clks
[
sclk
]
=
clk
;
/* HCLK */
clk
=
clk_register_divider
(
NULL
,
"hclk_div"
,
"sclk"
,
0
,
clk_base
+
CLK_SYSTEM_RATE
,
4
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"hclk"
,
"hclk_div"
,
CLK_SET_RATE_PARENT
,
clk_base
+
CLK_SYSTEM_RATE
,
7
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"hclk"
,
NULL
);
clks
[
hclk
]
=
clk
;
/* PCLK */
clk
=
clk_register_divider
(
NULL
,
"pclk_div"
,
"hclk"
,
0
,
clk_base
+
CLK_SYSTEM_RATE
,
0
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"pclk"
,
"pclk_div"
,
CLK_SET_RATE_PARENT
,
clk_base
+
CLK_SYSTEM_RATE
,
3
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"pclk"
,
NULL
);
clks
[
pclk
]
=
clk
;
clks
[
TEGRA20_CLK_SCLK
]
=
clk
;
/* twd */
clk
=
clk_register_fixed_factor
(
NULL
,
"twd"
,
"cclk"
,
0
,
1
,
4
);
clk_register_clkdev
(
clk
,
"twd"
,
NULL
);
clks
[
twd
]
=
clk
;
clks
[
TEGRA20_CLK_TWD
]
=
clk
;
}
static
const
char
*
audio_parents
[]
=
{
"spdif_in"
,
"i2s1"
,
"i2s2"
,
"unused"
,
...
...
@@ -784,18 +747,16 @@ static void __init tegra20_audio_clk_init(void)
clk
=
clk_register_gate
(
NULL
,
"audio"
,
"audio_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio"
,
NULL
);
clks
[
audio
]
=
clk
;
clks
[
TEGRA20_CLK_AUDIO
]
=
clk
;
/* audio_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio_doubler"
,
"audio"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_periph_gate
(
"audio_2x"
,
"audio_doubler"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
89
,
&
periph_u_regs
,
CLK_SET_RATE_PARENT
,
89
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio_2x"
,
NULL
);
clks
[
audio_2x
]
=
clk
;
clks
[
TEGRA20_CLK_AUDIO_2X
]
=
clk
;
}
...
...
@@ -803,68 +764,36 @@ static const char *i2s1_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
"clk_m"
};
static
const
char
*
i2s2_parents
[]
=
{
"pll_a_out0"
,
"audio_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
spdif_out_parents
[]
=
{
"pll_a_out0"
,
"audio_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
spdif_in_parents
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
static
const
char
*
pwm_parents
[]
=
{
"pll_p"
,
"pll_c"
,
"audio"
,
"clk_m"
,
"clk_32k"
};
static
const
char
*
mux_pllpcm_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
,
"clk_m"
};
static
const
char
*
mux_pllmcpa
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_c"
,
"pll_a"
};
static
const
char
*
mux_pllpdc_clkm
[]
=
{
"pll_p"
,
"pll_d_out0"
,
"pll_c"
,
"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
[]
=
{
TEGRA_INIT_DATA_MUX
(
"i2s1"
,
NULL
,
"tegra20-i2s.0"
,
i2s1_parents
,
CLK_SOURCE_I2S1
,
11
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s1
),
TEGRA_INIT_DATA_MUX
(
"i2s2"
,
NULL
,
"tegra20-i2s.1"
,
i2s2_parents
,
CLK_SOURCE_I2S2
,
18
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s2
),
TEGRA_INIT_DATA_MUX
(
"spdif_out"
,
"spdif_out"
,
"tegra20-spdif"
,
spdif_out_parents
,
CLK_SOURCE_SPDIF_OUT
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_out
),
TEGRA_INIT_DATA_MUX
(
"spdif_in"
,
"spdif_in"
,
"tegra20-spdif"
,
spdif_in_parents
,
CLK_SOURCE_SPDIF_IN
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_in
),
TEGRA_INIT_DATA_MUX
(
"sbc1"
,
NULL
,
"spi_tegra.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC1
,
41
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc1
),
TEGRA_INIT_DATA_MUX
(
"sbc2"
,
NULL
,
"spi_tegra.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC2
,
44
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc2
),
TEGRA_INIT_DATA_MUX
(
"sbc3"
,
NULL
,
"spi_tegra.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC3
,
46
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc3
),
TEGRA_INIT_DATA_MUX
(
"sbc4"
,
NULL
,
"spi_tegra.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC4
,
68
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
sbc4
),
TEGRA_INIT_DATA_MUX
(
"spi"
,
NULL
,
"spi"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SPI
,
43
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
spi
),
TEGRA_INIT_DATA_MUX
(
"xio"
,
NULL
,
"xio"
,
mux_pllpcm_clkm
,
CLK_SOURCE_XIO
,
45
,
&
periph_h_regs
,
0
,
xio
),
TEGRA_INIT_DATA_MUX
(
"twc"
,
NULL
,
"twc"
,
mux_pllpcm_clkm
,
CLK_SOURCE_TWC
,
16
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
twc
),
TEGRA_INIT_DATA_MUX
(
"ide"
,
NULL
,
"ide"
,
mux_pllpcm_clkm
,
CLK_SOURCE_XIO
,
25
,
&
periph_l_regs
,
0
,
ide
),
TEGRA_INIT_DATA_MUX
(
"ndflash"
,
NULL
,
"tegra_nand"
,
mux_pllpcm_clkm
,
CLK_SOURCE_NDFLASH
,
13
,
&
periph_l_regs
,
0
,
ndflash
),
TEGRA_INIT_DATA_MUX
(
"vfir"
,
NULL
,
"vfir"
,
mux_pllpcm_clkm
,
CLK_SOURCE_VFIR
,
7
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
vfir
),
TEGRA_INIT_DATA_MUX
(
"csite"
,
NULL
,
"csite"
,
mux_pllpcm_clkm
,
CLK_SOURCE_CSITE
,
73
,
&
periph_u_regs
,
0
,
csite
),
TEGRA_INIT_DATA_MUX
(
"la"
,
NULL
,
"la"
,
mux_pllpcm_clkm
,
CLK_SOURCE_LA
,
76
,
&
periph_u_regs
,
0
,
la
),
TEGRA_INIT_DATA_MUX
(
"owr"
,
NULL
,
"tegra_w1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_OWR
,
71
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
owr
),
TEGRA_INIT_DATA_MUX
(
"mipi"
,
NULL
,
"mipi"
,
mux_pllpcm_clkm
,
CLK_SOURCE_MIPI
,
50
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
mipi
),
TEGRA_INIT_DATA_MUX
(
"vde"
,
NULL
,
"vde"
,
mux_pllpcm_clkm
,
CLK_SOURCE_VDE
,
61
,
&
periph_h_regs
,
0
,
vde
),
TEGRA_INIT_DATA_MUX
(
"vi"
,
"vi"
,
"tegra_camera"
,
mux_pllmcpa
,
CLK_SOURCE_VI
,
20
,
&
periph_l_regs
,
0
,
vi
),
TEGRA_INIT_DATA_MUX
(
"epp"
,
NULL
,
"epp"
,
mux_pllmcpa
,
CLK_SOURCE_EPP
,
19
,
&
periph_l_regs
,
0
,
epp
),
TEGRA_INIT_DATA_MUX
(
"mpe"
,
NULL
,
"mpe"
,
mux_pllmcpa
,
CLK_SOURCE_MPE
,
60
,
&
periph_h_regs
,
0
,
mpe
),
TEGRA_INIT_DATA_MUX
(
"host1x"
,
NULL
,
"host1x"
,
mux_pllmcpa
,
CLK_SOURCE_HOST1X
,
28
,
&
periph_l_regs
,
0
,
host1x
),
TEGRA_INIT_DATA_MUX
(
"3d"
,
NULL
,
"3d"
,
mux_pllmcpa
,
CLK_SOURCE_3D
,
24
,
&
periph_l_regs
,
TEGRA_PERIPH_MANUAL_RESET
,
gr3d
),
TEGRA_INIT_DATA_MUX
(
"2d"
,
NULL
,
"2d"
,
mux_pllmcpa
,
CLK_SOURCE_2D
,
21
,
&
periph_l_regs
,
0
,
gr2d
),
TEGRA_INIT_DATA_MUX
(
"nor"
,
NULL
,
"tegra-nor"
,
mux_pllpcm_clkm
,
CLK_SOURCE_NOR
,
42
,
&
periph_h_regs
,
0
,
nor
),
TEGRA_INIT_DATA_MUX
(
"sdmmc1"
,
NULL
,
"sdhci-tegra.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC1
,
14
,
&
periph_l_regs
,
0
,
sdmmc1
),
TEGRA_INIT_DATA_MUX
(
"sdmmc2"
,
NULL
,
"sdhci-tegra.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC2
,
9
,
&
periph_l_regs
,
0
,
sdmmc2
),
TEGRA_INIT_DATA_MUX
(
"sdmmc3"
,
NULL
,
"sdhci-tegra.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC3
,
69
,
&
periph_u_regs
,
0
,
sdmmc3
),
TEGRA_INIT_DATA_MUX
(
"sdmmc4"
,
NULL
,
"sdhci-tegra.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC4
,
15
,
&
periph_l_regs
,
0
,
sdmmc4
),
TEGRA_INIT_DATA_MUX
(
"cve"
,
NULL
,
"cve"
,
mux_pllpdc_clkm
,
CLK_SOURCE_CVE
,
49
,
&
periph_h_regs
,
0
,
cve
),
TEGRA_INIT_DATA_MUX
(
"tvo"
,
NULL
,
"tvo"
,
mux_pllpdc_clkm
,
CLK_SOURCE_TVO
,
49
,
&
periph_h_regs
,
0
,
tvo
),
TEGRA_INIT_DATA_MUX
(
"tvdac"
,
NULL
,
"tvdac"
,
mux_pllpdc_clkm
,
CLK_SOURCE_TVDAC
,
53
,
&
periph_h_regs
,
0
,
tvdac
),
TEGRA_INIT_DATA_MUX
(
"vi_sensor"
,
"vi_sensor"
,
"tegra_camera"
,
mux_pllmcpa
,
CLK_SOURCE_VI_SENSOR
,
20
,
&
periph_l_regs
,
TEGRA_PERIPH_NO_RESET
,
vi_sensor
),
TEGRA_INIT_DATA_DIV16
(
"i2c1"
,
"div-clk"
,
"tegra-i2c.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C1
,
12
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2c1
),
TEGRA_INIT_DATA_DIV16
(
"i2c2"
,
"div-clk"
,
"tegra-i2c.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C2
,
54
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
i2c2
),
TEGRA_INIT_DATA_DIV16
(
"i2c3"
,
"div-clk"
,
"tegra-i2c.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C3
,
67
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
i2c3
),
TEGRA_INIT_DATA_DIV16
(
"dvc"
,
"div-clk"
,
"tegra-i2c.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_DVC
,
47
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
dvc
),
TEGRA_INIT_DATA_MUX
(
"hdmi"
,
NULL
,
"hdmi"
,
mux_pllpdc_clkm
,
CLK_SOURCE_HDMI
,
51
,
&
periph_h_regs
,
0
,
hdmi
),
TEGRA_INIT_DATA
(
"pwm"
,
NULL
,
"tegra-pwm"
,
pwm_parents
,
CLK_SOURCE_PWM
,
28
,
3
,
0
,
0
,
8
,
1
,
0
,
&
periph_l_regs
,
17
,
periph_clk_enb_refcnt
,
TEGRA_PERIPH_ON_APB
,
pwm
),
TEGRA_INIT_DATA_MUX
(
"i2s1"
,
i2s1_parents
,
CLK_SOURCE_I2S1
,
11
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_I2S1
),
TEGRA_INIT_DATA_MUX
(
"i2s2"
,
i2s2_parents
,
CLK_SOURCE_I2S2
,
18
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_I2S2
),
TEGRA_INIT_DATA_MUX
(
"spi"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SPI
,
43
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_SPI
),
TEGRA_INIT_DATA_MUX
(
"xio"
,
mux_pllpcm_clkm
,
CLK_SOURCE_XIO
,
45
,
0
,
TEGRA20_CLK_XIO
),
TEGRA_INIT_DATA_MUX
(
"twc"
,
mux_pllpcm_clkm
,
CLK_SOURCE_TWC
,
16
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_TWC
),
TEGRA_INIT_DATA_MUX
(
"ide"
,
mux_pllpcm_clkm
,
CLK_SOURCE_XIO
,
25
,
0
,
TEGRA20_CLK_IDE
),
TEGRA_INIT_DATA_DIV16
(
"dvc"
,
mux_pllpcm_clkm
,
CLK_SOURCE_DVC
,
47
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_DVC
),
TEGRA_INIT_DATA_DIV16
(
"i2c1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C1
,
12
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_I2C1
),
TEGRA_INIT_DATA_DIV16
(
"i2c2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C2
,
54
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_I2C2
),
TEGRA_INIT_DATA_DIV16
(
"i2c3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_I2C3
,
67
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_I2C3
),
TEGRA_INIT_DATA_MUX
(
"hdmi"
,
mux_pllpdc_clkm
,
CLK_SOURCE_HDMI
,
51
,
0
,
TEGRA20_CLK_HDMI
),
TEGRA_INIT_DATA
(
"pwm"
,
NULL
,
NULL
,
pwm_parents
,
CLK_SOURCE_PWM
,
28
,
3
,
0
,
0
,
8
,
1
,
0
,
17
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_PWM
),
};
static
struct
tegra_periph_init_data
tegra_periph_nodiv_clk_list
[]
=
{
TEGRA_INIT_DATA_NODIV
(
"uarta"
,
NULL
,
"tegra_uart.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTA
,
30
,
2
,
6
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
uarta
),
TEGRA_INIT_DATA_NODIV
(
"uartb"
,
NULL
,
"tegra_uart.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTB
,
30
,
2
,
7
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
uartb
),
TEGRA_INIT_DATA_NODIV
(
"uartc"
,
NULL
,
"tegra_uart.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTC
,
30
,
2
,
55
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
uartc
),
TEGRA_INIT_DATA_NODIV
(
"uartd"
,
NULL
,
"tegra_uart.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTD
,
30
,
2
,
65
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
uartd
),
TEGRA_INIT_DATA_NODIV
(
"uarte"
,
NULL
,
"tegra_uart.4"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTE
,
30
,
2
,
66
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
uarte
),
TEGRA_INIT_DATA_NODIV
(
"disp1"
,
NULL
,
"tegradc.0"
,
mux_pllpdc_clkm
,
CLK_SOURCE_DISP1
,
30
,
2
,
27
,
&
periph_l_regs
,
0
,
disp
1
),
TEGRA_INIT_DATA_NODIV
(
"disp2"
,
NULL
,
"tegradc.1"
,
mux_pllpdc_clkm
,
CLK_SOURCE_DISP2
,
30
,
2
,
26
,
&
periph_l_regs
,
0
,
disp
2
),
TEGRA_INIT_DATA_NODIV
(
"uarta"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTA
,
30
,
2
,
6
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_UARTA
),
TEGRA_INIT_DATA_NODIV
(
"uartb"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTB
,
30
,
2
,
7
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_UARTB
),
TEGRA_INIT_DATA_NODIV
(
"uartc"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTC
,
30
,
2
,
55
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_UARTC
),
TEGRA_INIT_DATA_NODIV
(
"uartd"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTD
,
30
,
2
,
65
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_UARTD
),
TEGRA_INIT_DATA_NODIV
(
"uarte"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTE
,
30
,
2
,
66
,
TEGRA_PERIPH_ON_APB
,
TEGRA20_CLK_UARTE
),
TEGRA_INIT_DATA_NODIV
(
"disp1"
,
mux_pllpdc_clkm
,
CLK_SOURCE_DISP1
,
30
,
2
,
27
,
0
,
TEGRA20_CLK_DISP
1
),
TEGRA_INIT_DATA_NODIV
(
"disp2"
,
mux_pllpdc_clkm
,
CLK_SOURCE_DISP2
,
30
,
2
,
26
,
0
,
TEGRA20_CLK_DISP
2
),
};
static
void
__init
tegra20_periph_clk_init
(
void
)
...
...
@@ -876,69 +805,13 @@ static void __init tegra20_periph_clk_init(void)
/* ac97 */
clk
=
tegra_clk_register_periph_gate
(
"ac97"
,
"pll_a_out0"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
3
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra20-ac97"
);
clks
[
ac97
]
=
clk
;
clk_base
,
0
,
3
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_AC97
]
=
clk
;
/* apbdma */
clk
=
tegra_clk_register_periph_gate
(
"apbdma"
,
"pclk"
,
0
,
clk_base
,
0
,
34
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-apbdma"
);
clks
[
apbdma
]
=
clk
;
/* rtc */
clk
=
tegra_clk_register_periph_gate
(
"rtc"
,
"clk_32k"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
0
,
4
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"rtc-tegra"
);
clks
[
rtc
]
=
clk
;
/* timer */
clk
=
tegra_clk_register_periph_gate
(
"timer"
,
"clk_m"
,
0
,
clk_base
,
0
,
5
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"timer"
);
clks
[
timer
]
=
clk
;
/* kbc */
clk
=
tegra_clk_register_periph_gate
(
"kbc"
,
"clk_32k"
,
TEGRA_PERIPH_NO_RESET
|
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
36
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-kbc"
);
clks
[
kbc
]
=
clk
;
/* csus */
clk
=
tegra_clk_register_periph_gate
(
"csus"
,
"clk_m"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
0
,
92
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"csus"
,
"tengra_camera"
);
clks
[
csus
]
=
clk
;
/* vcp */
clk
=
tegra_clk_register_periph_gate
(
"vcp"
,
"clk_m"
,
0
,
clk_base
,
0
,
29
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"vcp"
,
"tegra-avp"
);
clks
[
vcp
]
=
clk
;
/* bsea */
clk
=
tegra_clk_register_periph_gate
(
"bsea"
,
"clk_m"
,
0
,
clk_base
,
0
,
62
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"bsea"
,
"tegra-avp"
);
clks
[
bsea
]
=
clk
;
/* bsev */
clk
=
tegra_clk_register_periph_gate
(
"bsev"
,
"clk_m"
,
0
,
clk_base
,
0
,
63
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"bsev"
,
"tegra-aes"
);
clks
[
bsev
]
=
clk
;
0
,
34
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_APBDMA
]
=
clk
;
/* emc */
clk
=
clk_register_mux
(
NULL
,
"emc_mux"
,
mux_pllmcp_clkm
,
...
...
@@ -947,130 +820,57 @@ static void __init tegra20_periph_clk_init(void)
clk_base
+
CLK_SOURCE_EMC
,
30
,
2
,
0
,
NULL
);
clk
=
tegra_clk_register_periph_gate
(
"emc"
,
"emc_mux"
,
0
,
clk_base
,
0
,
57
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"emc"
,
NULL
);
clks
[
emc
]
=
clk
;
/* usbd */
clk
=
tegra_clk_register_periph_gate
(
"usbd"
,
"clk_m"
,
0
,
clk_base
,
0
,
22
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"fsl-tegra-udc"
);
clks
[
usbd
]
=
clk
;
/* usb2 */
clk
=
tegra_clk_register_periph_gate
(
"usb2"
,
"clk_m"
,
0
,
clk_base
,
0
,
58
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-ehci.1"
);
clks
[
usb2
]
=
clk
;
/* usb3 */
clk
=
tegra_clk_register_periph_gate
(
"usb3"
,
"clk_m"
,
0
,
clk_base
,
0
,
59
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-ehci.2"
);
clks
[
usb3
]
=
clk
;
57
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_EMC
]
=
clk
;
/* dsi */
clk
=
tegra_clk_register_periph_gate
(
"dsi"
,
"pll_d"
,
0
,
clk_base
,
0
,
48
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
48
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"dsi"
);
clks
[
dsi
]
=
clk
;
/* csi */
clk
=
tegra_clk_register_periph_gate
(
"csi"
,
"pll_p_out3"
,
0
,
clk_base
,
0
,
52
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"csi"
,
"tegra_camera"
);
clks
[
csi
]
=
clk
;
/* isp */
clk
=
tegra_clk_register_periph_gate
(
"isp"
,
"clk_m"
,
0
,
clk_base
,
0
,
23
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"isp"
,
"tegra_camera"
);
clks
[
isp
]
=
clk
;
clks
[
TEGRA20_CLK_DSI
]
=
clk
;
/* pex */
clk
=
tegra_clk_register_periph_gate
(
"pex"
,
"clk_m"
,
0
,
clk_base
,
0
,
70
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"pex"
,
NULL
);
clks
[
pex
]
=
clk
;
/* afi */
clk
=
tegra_clk_register_periph_gate
(
"afi"
,
"clk_m"
,
0
,
clk_base
,
0
,
72
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"afi"
,
NULL
);
clks
[
afi
]
=
clk
;
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_PEX
]
=
clk
;
/* pcie_xclk */
clk
=
tegra_clk_register_periph_gate
(
"pcie_xclk"
,
"clk_m"
,
0
,
clk_base
,
0
,
74
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"pcie_xclk"
,
NULL
);
clks
[
pcie_xclk
]
=
clk
;
0
,
74
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_PCIE_XCLK
]
=
clk
;
/* cdev1 */
clk
=
clk_register_fixed_rate
(
NULL
,
"cdev1_fixed"
,
NULL
,
CLK_IS_ROOT
,
26000000
);
clk
=
tegra_clk_register_periph_gate
(
"cdev1"
,
"cdev1_fixed"
,
0
,
clk_base
,
0
,
94
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"cdev1"
,
NULL
);
clks
[
cdev1
]
=
clk
;
clk_base
,
0
,
94
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_CDEV1
]
=
clk
;
/* cdev2 */
clk
=
clk_register_fixed_rate
(
NULL
,
"cdev2_fixed"
,
NULL
,
CLK_IS_ROOT
,
26000000
);
clk
=
tegra_clk_register_periph_gate
(
"cdev2"
,
"cdev2_fixed"
,
0
,
clk_base
,
0
,
93
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"cdev2"
,
NULL
);
clks
[
cdev2
]
=
clk
;
clk_base
,
0
,
93
,
periph_clk_enb_refcnt
);
clks
[
TEGRA20_CLK_CDEV2
]
=
clk
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_clk_list
);
i
++
)
{
data
=
&
tegra_periph_clk_list
[
i
];
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
parent_names
,
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
p
.
p
arent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
,
data
->
flags
);
clk_register_clkdev
(
clk
,
data
->
con_id
,
data
->
dev_id
);
clks
[
data
->
clk_id
]
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_nodiv_clk_list
);
i
++
)
{
data
=
&
tegra_periph_nodiv_clk_list
[
i
];
clk
=
tegra_clk_register_periph_nodiv
(
data
->
name
,
data
->
parent_names
,
data
->
p
.
p
arent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
);
clk_register_clkdev
(
clk
,
data
->
con_id
,
data
->
dev_id
);
clks
[
data
->
clk_id
]
=
clk
;
}
}
static
void
__init
tegra20_fixed_clk_init
(
void
)
{
struct
clk
*
clk
;
/* clk_32k */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_32k"
,
NULL
,
CLK_IS_ROOT
,
32768
);
clk_register_clkdev
(
clk
,
"clk_32k"
,
NULL
);
clks
[
clk_32k
]
=
clk
;
}
static
void
__init
tegra20_pmc_clk_init
(
void
)
{
struct
clk
*
clk
;
/* blink */
writel_relaxed
(
0
,
pmc_base
+
PMC_BLINK_TIMER
);
clk
=
clk_register_gate
(
NULL
,
"blink_override"
,
"clk_32k"
,
0
,
pmc_base
+
PMC_DPD_PADS_ORIDE
,
PMC_DPD_PADS_ORIDE_BLINK_ENB
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"blink"
,
"blink_override"
,
0
,
pmc_base
+
PMC_CTRL
,
PMC_CTRL_BLINK_ENB
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"blink"
,
NULL
);
clks
[
blink
]
=
clk
;
tegra_periph_clk_init
(
clk_base
,
pmc_base
,
tegra20_clks
,
&
pll_p_params
);
}
static
void
__init
tegra20_osc_clk_init
(
void
)
...
...
@@ -1084,15 +884,13 @@ static void __init tegra20_osc_clk_init(void)
/* clk_m */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_m"
,
NULL
,
CLK_IS_ROOT
|
CLK_IGNORE_UNUSED
,
input_freq
);
clk_register_clkdev
(
clk
,
"clk_m"
,
NULL
);
clks
[
clk_m
]
=
clk
;
clks
[
TEGRA20_CLK_CLK_M
]
=
clk
;
/* pll_ref */
pll_ref_div
=
tegra20_get_pll_ref_div
();
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_ref"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
pll_ref_div
);
clk_register_clkdev
(
clk
,
"pll_ref"
,
NULL
);
clks
[
pll_ref
]
=
clk
;
clks
[
TEGRA20_CLK_PLL_REF
]
=
clk
;
}
/* Tegra20 CPU clock and reset control functions */
...
...
@@ -1226,49 +1024,49 @@ static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
};
static
struct
tegra_clk_init_table
init_table
[]
__initdata
=
{
{
pll_p
,
clk_max
,
216000000
,
1
},
{
pll_p_out1
,
clk_max
,
28800000
,
1
},
{
pll_p_out2
,
clk_max
,
48000000
,
1
},
{
pll_p_out3
,
clk_max
,
72000000
,
1
},
{
pll_p_out4
,
clk_max
,
24000000
,
1
},
{
pll_c
,
clk_max
,
600000000
,
1
},
{
pll_c_out1
,
clk_max
,
120000000
,
1
},
{
sclk
,
pll_c_out
1
,
0
,
1
},
{
hclk
,
clk_max
,
0
,
1
},
{
pclk
,
clk_max
,
60000000
,
1
},
{
csite
,
clk_max
,
0
,
1
},
{
emc
,
clk_max
,
0
,
1
},
{
cclk
,
clk_max
,
0
,
1
},
{
uarta
,
pll_p
,
0
,
0
},
{
uartb
,
pll_p
,
0
,
0
},
{
uartc
,
pll_p
,
0
,
0
},
{
uartd
,
pll_p
,
0
,
0
},
{
uarte
,
pll_p
,
0
,
0
},
{
pll_a
,
clk_max
,
56448000
,
1
},
{
pll_a_out0
,
clk_max
,
11289600
,
1
},
{
cdev1
,
clk_max
,
0
,
1
},
{
blink
,
clk_max
,
32768
,
1
},
{
i2s1
,
pll_a_out
0
,
11289600
,
0
},
{
i2s2
,
pll_a_out
0
,
11289600
,
0
},
{
sdmmc1
,
pll_p
,
48000000
,
0
},
{
sdmmc3
,
pll_p
,
48000000
,
0
},
{
sdmmc4
,
pll_p
,
48000000
,
0
},
{
spi
,
pll_p
,
20000000
,
0
},
{
sbc1
,
pll_p
,
100000000
,
0
},
{
sbc2
,
pll_p
,
100000000
,
0
},
{
sbc3
,
pll_p
,
100000000
,
0
},
{
sbc4
,
pll_p
,
100000000
,
0
},
{
host1x
,
pll_c
,
150000000
,
0
},
{
disp1
,
pll_p
,
600000000
,
0
},
{
disp2
,
pll_p
,
600000000
,
0
},
{
gr2d
,
pll_c
,
300000000
,
0
},
{
gr3d
,
pll_c
,
300000000
,
0
},
{
clk_max
,
clk_max
,
0
,
0
},
/* This MUST be the last entry */
{
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_OUT2
,
TEGRA20_CLK_CLK_MAX
,
48000000
,
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_C
,
TEGRA20_CLK_CLK_MAX
,
600000000
,
1
},
{
TEGRA20_CLK_PLL_C_OUT1
,
TEGRA20_CLK_CLK_MAX
,
120000000
,
1
},
{
TEGRA20_CLK_SCLK
,
TEGRA20_CLK_PLL_C_OUT
1
,
0
,
1
},
{
TEGRA20_CLK_HCLK
,
TEGRA20_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA20_CLK_PCLK
,
TEGRA20_CLK_CLK_MAX
,
60000000
,
1
},
{
TEGRA20_CLK_CSITE
,
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_UARTA
,
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_UARTD
,
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_OUT0
,
TEGRA20_CLK_CLK_MAX
,
11289600
,
1
},
{
TEGRA20_CLK_CDEV1
,
TEGRA20_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA20_CLK_BLINK
,
TEGRA20_CLK_CLK_MAX
,
32768
,
1
},
{
TEGRA20_CLK_I2S1
,
TEGRA20_CLK_PLL_A_OUT
0
,
11289600
,
0
},
{
TEGRA20_CLK_I2S2
,
TEGRA20_CLK_PLL_A_OUT
0
,
11289600
,
0
},
{
TEGRA20_CLK_SDMMC1
,
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_SPI
,
TEGRA20_CLK_PLL_P
,
20000000
,
0
},
{
TEGRA20_CLK_SBC1
,
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_SBC4
,
TEGRA20_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA20_CLK_HOST1X
,
TEGRA20_CLK_PLL_C
,
150000000
,
0
},
{
TEGRA20_CLK_DISP1
,
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_GR3D
,
TEGRA20_CLK_PLL_C
,
300000000
,
0
},
{
TEGRA20_CLK_CLK_MAX
,
TEGRA20_CLK_CLK_MAX
,
0
,
0
},
/* This MUST be the last entry */
};
static
void
__init
tegra20_clock_apply_init_table
(
void
)
{
tegra_init_from_table
(
init_table
,
clks
,
clk_max
);
tegra_init_from_table
(
init_table
,
clks
,
TEGRA20_CLK_CLK_MAX
);
}
/*
...
...
@@ -1277,11 +1075,11 @@ static void __init tegra20_clock_apply_init_table(void)
* table under two names.
*/
static
struct
tegra_clk_duplicate
tegra_clk_duplicates
[]
=
{
TEGRA_CLK_DUPLICATE
(
usbd
,
"utmip-pad"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
usbd
,
"tegra-ehci.0"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
usbd
,
"tegra-otg"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
cclk
,
NULL
,
"cpu"
),
TEGRA_CLK_DUPLICATE
(
clk_max
,
NULL
,
NULL
),
/* Must be the last entry */
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-otg"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
TEGRA20_CLK_CCLK
,
NULL
,
"cpu"
),
TEGRA_CLK_DUPLICATE
(
TEGRA20_CLK_CLK_MAX
,
NULL
,
NULL
),
/* Must be the last entry */
};
static
const
struct
of_device_id
pmc_match
[]
__initconst
=
{
...
...
@@ -1291,7 +1089,6 @@ static const struct of_device_id pmc_match[] __initconst = {
static
void
__init
tegra20_clock_init
(
struct
device_node
*
np
)
{
int
i
;
struct
device_node
*
node
;
clk_base
=
of_iomap
(
np
,
0
);
...
...
@@ -1312,30 +1109,23 @@ static void __init tegra20_clock_init(struct device_node *np)
BUG
();
}
clks
=
tegra_clk_init
(
TEGRA20_CLK_CLK_MAX
,
TEGRA20_CLK_PERIPH_BANKS
);
if
(
!
clks
)
return
;
tegra20_osc_clk_init
();
tegra20_pmc_clk_init
();
tegra20_fixed_clk_init
();
tegra_fixed_clk_init
(
tegra20_clks
);
tegra20_pll_init
();
tegra20_super_clk_init
();
tegra_super_clk_gen4_init
(
clk_base
,
pmc_base
,
tegra20_clks
,
NULL
);
tegra20_periph_clk_init
();
tegra20_audio_clk_init
();
tegra_pmc_clk_init
(
pmc_base
,
tegra20_clks
);
tegra_init_dup_clks
(
tegra_clk_duplicates
,
clks
,
TEGRA20_CLK_CLK_MAX
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
clks
);
i
++
)
{
if
(
IS_ERR
(
clks
[
i
]))
{
pr_err
(
"Tegra20 clk %d: register failed with %ld
\n
"
,
i
,
PTR_ERR
(
clks
[
i
]));
BUG
();
}
if
(
!
clks
[
i
])
clks
[
i
]
=
ERR_PTR
(
-
EINVAL
);
}
tegra_init_dup_clks
(
tegra_clk_duplicates
,
clks
,
clk_max
);
clk_data
.
clks
=
clks
;
clk_data
.
clk_num
=
ARRAY_SIZE
(
clks
);
of_clk_add_provider
(
np
,
of_clk_src_onecell_get
,
&
clk_data
);
tegra_add_of_provider
(
np
);
tegra_register_devclks
(
devclks
,
ARRAY_SIZE
(
devclks
));
tegra_clk_apply_init_table
=
tegra20_clock_apply_init_table
;
...
...
drivers/clk/tegra/clk-tegra30.c
View file @
e9827d9b
...
...
@@ -23,42 +23,9 @@
#include <linux/of_address.h>
#include <linux/clk/tegra.h>
#include <linux/tegra-powergate.h>
#include <dt-bindings/clock/tegra30-car.h>
#include "clk.h"
#define RST_DEVICES_L 0x004
#define RST_DEVICES_H 0x008
#define RST_DEVICES_U 0x00c
#define RST_DEVICES_V 0x358
#define RST_DEVICES_W 0x35c
#define RST_DEVICES_SET_L 0x300
#define RST_DEVICES_CLR_L 0x304
#define RST_DEVICES_SET_H 0x308
#define RST_DEVICES_CLR_H 0x30c
#define RST_DEVICES_SET_U 0x310
#define RST_DEVICES_CLR_U 0x314
#define RST_DEVICES_SET_V 0x430
#define RST_DEVICES_CLR_V 0x434
#define RST_DEVICES_SET_W 0x438
#define RST_DEVICES_CLR_W 0x43c
#define RST_DEVICES_NUM 5
#define CLK_OUT_ENB_L 0x010
#define CLK_OUT_ENB_H 0x014
#define CLK_OUT_ENB_U 0x018
#define CLK_OUT_ENB_V 0x360
#define CLK_OUT_ENB_W 0x364
#define CLK_OUT_ENB_SET_L 0x320
#define CLK_OUT_ENB_CLR_L 0x324
#define CLK_OUT_ENB_SET_H 0x328
#define CLK_OUT_ENB_CLR_H 0x32c
#define CLK_OUT_ENB_SET_U 0x330
#define CLK_OUT_ENB_CLR_U 0x334
#define CLK_OUT_ENB_SET_V 0x440
#define CLK_OUT_ENB_CLR_V 0x444
#define CLK_OUT_ENB_SET_W 0x448
#define CLK_OUT_ENB_CLR_W 0x44c
#define CLK_OUT_ENB_NUM 5
#include "clk-id.h"
#define OSC_CTRL 0x50
#define OSC_CTRL_OSC_FREQ_MASK (0xF<<28)
...
...
@@ -92,6 +59,8 @@
#define SYSTEM_CLK_RATE 0x030
#define TEGRA30_CLK_PERIPH_BANKS 5
#define PLLC_BASE 0x80
#define PLLC_MISC 0x8c
#define PLLM_BASE 0x90
...
...
@@ -132,88 +101,21 @@
#define AUDIO_SYNC_CLK_I2S4 0x4b0
#define AUDIO_SYNC_CLK_SPDIF 0x4b4
#define PMC_CLK_OUT_CNTRL 0x1a8
#define CLK_SOURCE_I2S0 0x1d8
#define CLK_SOURCE_I2S1 0x100
#define CLK_SOURCE_I2S2 0x104
#define CLK_SOURCE_I2S3 0x3bc
#define CLK_SOURCE_I2S4 0x3c0
#define CLK_SOURCE_SPDIF_OUT 0x108
#define CLK_SOURCE_SPDIF_IN 0x10c
#define CLK_SOURCE_PWM 0x110
#define CLK_SOURCE_D_AUDIO 0x3d0
#define CLK_SOURCE_DAM0 0x3d8
#define CLK_SOURCE_DAM1 0x3dc
#define CLK_SOURCE_DAM2 0x3e0
#define CLK_SOURCE_HDA 0x428
#define CLK_SOURCE_HDA2CODEC_2X 0x3e4
#define CLK_SOURCE_SBC1 0x134
#define CLK_SOURCE_SBC2 0x118
#define CLK_SOURCE_SBC3 0x11c
#define CLK_SOURCE_SBC4 0x1b4
#define CLK_SOURCE_SBC5 0x3c8
#define CLK_SOURCE_SBC6 0x3cc
#define CLK_SOURCE_SATA_OOB 0x420
#define CLK_SOURCE_SATA 0x424
#define CLK_SOURCE_NDFLASH 0x160
#define CLK_SOURCE_NDSPEED 0x3f8
#define CLK_SOURCE_VFIR 0x168
#define CLK_SOURCE_SDMMC1 0x150
#define CLK_SOURCE_SDMMC2 0x154
#define CLK_SOURCE_SDMMC3 0x1bc
#define CLK_SOURCE_SDMMC4 0x164
#define CLK_SOURCE_VDE 0x1c8
#define CLK_SOURCE_CSITE 0x1d4
#define CLK_SOURCE_LA 0x1f8
#define CLK_SOURCE_OWR 0x1cc
#define CLK_SOURCE_NOR 0x1d0
#define CLK_SOURCE_MIPI 0x174
#define CLK_SOURCE_I2C1 0x124
#define CLK_SOURCE_I2C2 0x198
#define CLK_SOURCE_I2C3 0x1b8
#define CLK_SOURCE_I2C4 0x3c4
#define CLK_SOURCE_I2C5 0x128
#define CLK_SOURCE_UARTA 0x178
#define CLK_SOURCE_UARTB 0x17c
#define CLK_SOURCE_UARTC 0x1a0
#define CLK_SOURCE_UARTD 0x1c0
#define CLK_SOURCE_UARTE 0x1c4
#define CLK_SOURCE_VI 0x148
#define CLK_SOURCE_VI_SENSOR 0x1a8
#define CLK_SOURCE_3D 0x158
#define CLK_SOURCE_3D2 0x3b0
#define CLK_SOURCE_2D 0x15c
#define CLK_SOURCE_EPP 0x16c
#define CLK_SOURCE_MPE 0x170
#define CLK_SOURCE_HOST1X 0x180
#define CLK_SOURCE_CVE 0x140
#define CLK_SOURCE_TVO 0x188
#define CLK_SOURCE_DTV 0x1dc
#define CLK_SOURCE_HDMI 0x18c
#define CLK_SOURCE_TVDAC 0x194
#define CLK_SOURCE_DISP1 0x138
#define CLK_SOURCE_DISP2 0x13c
#define CLK_SOURCE_DSIB 0xd0
#define CLK_SOURCE_TSENSOR 0x3b8
#define CLK_SOURCE_ACTMON 0x3e8
#define CLK_SOURCE_EXTERN1 0x3ec
#define CLK_SOURCE_EXTERN2 0x3f0
#define CLK_SOURCE_EXTERN3 0x3f4
#define CLK_SOURCE_I2CSLOW 0x3fc
#define CLK_SOURCE_SE 0x42c
#define CLK_SOURCE_MSELECT 0x3b4
#define CLK_SOURCE_EMC 0x19c
#define AUDIO_SYNC_DOUBLER 0x49c
#define PMC_CTRL 0
#define PMC_CTRL_BLINK_ENB 7
#define PMC_DPD_PADS_ORIDE 0x1c
#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
#define PMC_BLINK_TIMER 0x40
#define UTMIP_PLL_CFG2 0x488
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6)
#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
...
...
@@ -266,89 +168,41 @@ static struct cpu_clk_suspend_context {
}
tegra30_cpu_clk_sctx
;
#endif
static
int
periph_clk_enb_refcnt
[
CLK_OUT_ENB_NUM
*
32
];
static
void
__iomem
*
clk_base
;
static
void
__iomem
*
pmc_base
;
static
unsigned
long
input_freq
;
static
DEFINE_SPINLOCK
(
clk_doubler_lock
);
static
DEFINE_SPINLOCK
(
clk_out_lock
);
static
DEFINE_SPINLOCK
(
pll_div_lock
);
static
DEFINE_SPINLOCK
(
cml_lock
);
static
DEFINE_SPINLOCK
(
pll_d_lock
);
static
DEFINE_SPINLOCK
(
sysrate_lock
);
#define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags, _clk_id)
#define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, \
_regs, _clk_num, periph_clk_enb_refcnt, \
_gate_flags, _clk_id)
#define TEGRA_INIT_DATA_MUX8(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
29, 3, 0, 0, 8, 1, 0, _regs, _clk_num, \
periph_clk_enb_refcnt, _gate_flags, _clk_id)
#define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \
_clk_num, _regs, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \
_clk_num, periph_clk_enb_refcnt, _gate_flags, \
_clk_id)
#define TEGRA_INIT_DATA_UART(_name, _con_id, _dev_id, _parents, _offset,\
_clk_num, _regs, _clk_id) \
TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
30, 2, 0, 0, 16, 1, TEGRA_DIVIDER_UART, _regs, \
_clk_num, periph_clk_enb_refcnt, 0, _clk_id)
#define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \
30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
_clk_num, _gate_flags, _clk_id)
#define TEGRA_INIT_DATA_MUX8(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \
29, 3, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
_clk_num, _gate_flags, _clk_id)
#define TEGRA_INIT_DATA_INT(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \
30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT | \
TEGRA_DIVIDER_ROUND_UP, _clk_num, \
_gate_flags, _clk_id)
#define TEGRA_INIT_DATA_NODIV(_name, _
con_id, _dev_id, _
parents, _offset, \
_mux_shift, _mux_width, _clk_num,
_regs,
\
#define TEGRA_INIT_DATA_NODIV(_name, _parents, _offset, \
_mux_shift, _mux_width, _clk_num, \
_gate_flags, _clk_id) \
TEGRA_INIT_DATA(_name,
_con_id, _dev_id
, _parents, _offset, \
_mux_shift, _mux_width, 0, 0, 0, 0, 0,
_regs,
\
_clk_num,
periph_clk_enb_refcnt,
_gate_flags, \
TEGRA_INIT_DATA(_name,
NULL, NULL
, _parents, _offset, \
_mux_shift, _mux_width, 0, 0, 0, 0, 0,\
_clk_num, _gate_flags, \
_clk_id)
/*
* IDs assigned here must be in sync with DT bindings definition
* for Tegra30 clocks.
*/
enum
tegra30_clk
{
cpu
,
rtc
=
4
,
timer
,
uarta
,
gpio
=
8
,
sdmmc2
,
i2s1
=
11
,
i2c1
,
ndflash
,
sdmmc1
,
sdmmc4
,
pwm
=
17
,
i2s2
,
epp
,
gr2d
=
21
,
usbd
,
isp
,
gr3d
,
disp2
=
26
,
disp1
,
host1x
,
vcp
,
i2s0
,
cop_cache
,
mc
,
ahbdma
,
apbdma
,
kbc
=
36
,
statmon
,
pmc
,
kfuse
=
40
,
sbc1
,
nor
,
sbc2
=
44
,
sbc3
=
46
,
i2c5
,
dsia
,
mipi
=
50
,
hdmi
,
csi
,
tvdac
,
i2c2
,
uartc
,
emc
=
57
,
usb2
,
usb3
,
mpe
,
vde
,
bsea
,
bsev
,
speedo
,
uartd
,
uarte
,
i2c3
,
sbc4
,
sdmmc3
,
pcie
,
owr
,
afi
,
csite
,
pciex
,
avpucq
,
la
,
dtv
=
79
,
ndspeed
,
i2cslow
,
dsib
,
irama
=
84
,
iramb
,
iramc
,
iramd
,
cram2
,
audio_2x
=
90
,
csus
=
92
,
cdev2
,
cdev1
,
cpu_g
=
96
,
cpu_lp
,
gr3d2
,
mselect
,
tsensor
,
i2s3
,
i2s4
,
i2c4
,
sbc5
,
sbc6
,
d_audio
,
apbif
,
dam0
,
dam1
,
dam2
,
hda2codec_2x
,
atomics
,
audio0_2x
,
audio1_2x
,
audio2_2x
,
audio3_2x
,
audio4_2x
,
spdif_2x
,
actmon
,
extern1
,
extern2
,
extern3
,
sata_oob
,
sata
,
hda
,
se
=
127
,
hda2hdmi
,
sata_cold
,
uartb
=
160
,
vfir
,
spdif_in
,
spdif_out
,
vi
,
vi_sensor
,
fuse
,
fuse_burn
,
cve
,
tvo
,
clk_32k
,
clk_m
,
clk_m_div2
,
clk_m_div4
,
pll_ref
,
pll_c
,
pll_c_out1
,
pll_m
,
pll_m_out1
,
pll_p
,
pll_p_out1
,
pll_p_out2
,
pll_p_out3
,
pll_p_out4
,
pll_a
,
pll_a_out0
,
pll_d
,
pll_d_out0
,
pll_d2
,
pll_d2_out0
,
pll_u
,
pll_x
,
pll_x_out0
,
pll_e
,
spdif_in_sync
,
i2s0_sync
,
i2s1_sync
,
i2s2_sync
,
i2s3_sync
,
i2s4_sync
,
vimclk_sync
,
audio0
,
audio1
,
audio2
,
audio3
,
audio4
,
spdif
,
clk_out_1
,
clk_out_2
,
clk_out_3
,
sclk
,
blink
,
cclk_g
,
cclk_lp
,
twd
,
cml0
,
cml1
,
hclk
,
pclk
,
clk_out_1_mux
=
300
,
clk_max
};
static
struct
clk
*
clks
[
clk_max
];
static
struct
clk_onecell_data
clk_data
;
static
struct
clk
**
clks
;
/*
* Structure defining the fields for USB UTMI clocks Parameters.
...
...
@@ -564,6 +418,8 @@ static struct tegra_clk_pll_params pll_c_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_c_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
div_nmp
pllm_nmp
=
{
...
...
@@ -593,6 +449,9 @@ static struct tegra_clk_pll_params pll_m_params = {
.
div_nmp
=
&
pllm_nmp
,
.
pmc_divnm_reg
=
PMC_PLLM_WB0_OVERRIDE
,
.
pmc_divp_reg
=
PMC_PLLM_WB0_OVERRIDE
,
.
freq_table
=
pll_m_freq_table
,
.
flags
=
TEGRA_PLLM
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_DCCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_p_params
=
{
...
...
@@ -607,6 +466,9 @@ static struct tegra_clk_pll_params pll_p_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_p_freq_table
,
.
flags
=
TEGRA_PLL_FIXED
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
.
fixed_rate
=
408000000
,
};
static
struct
tegra_clk_pll_params
pll_a_params
=
{
...
...
@@ -621,6 +483,8 @@ static struct tegra_clk_pll_params pll_a_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_a_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_d_params
=
{
...
...
@@ -635,6 +499,10 @@ static struct tegra_clk_pll_params pll_d_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_d2_params
=
{
...
...
@@ -649,6 +517,9 @@ static struct tegra_clk_pll_params pll_d2_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
freq_table
=
pll_d_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_u_params
=
{
...
...
@@ -664,6 +535,8 @@ static struct tegra_clk_pll_params pll_u_params = {
.
lock_enable_bit_idx
=
PLLDU_MISC_LOCK_ENABLE
,
.
lock_delay
=
1000
,
.
pdiv_tohw
=
pllu_p
,
.
freq_table
=
pll_u_freq_table
,
.
flags
=
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
,
};
static
struct
tegra_clk_pll_params
pll_x_params
=
{
...
...
@@ -678,6 +551,9 @@ static struct tegra_clk_pll_params pll_x_params = {
.
lock_mask
=
PLL_BASE_LOCK
,
.
lock_enable_bit_idx
=
PLL_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_x_freq_table
,
.
flags
=
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_DCCON
|
TEGRA_PLL_USE_LOCK
,
};
static
struct
tegra_clk_pll_params
pll_e_params
=
{
...
...
@@ -692,116 +568,300 @@ static struct tegra_clk_pll_params pll_e_params = {
.
lock_mask
=
PLLE_MISC_LOCK
,
.
lock_enable_bit_idx
=
PLLE_MISC_LOCK_ENABLE
,
.
lock_delay
=
300
,
.
freq_table
=
pll_e_freq_table
,
.
flags
=
TEGRA_PLLE_CONFIGURE
|
TEGRA_PLL_FIXED
,
.
fixed_rate
=
100000000
,
};
/* Peripheral clock registers */
static
struct
tegra_clk_periph_regs
periph_l_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_L
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_L
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_L
,
.
rst_reg
=
RST_DEVICES_L
,
.
rst_set_reg
=
RST_DEVICES_SET_L
,
.
rst_clr_reg
=
RST_DEVICES_CLR_L
,
static
unsigned
long
tegra30_input_freq
[]
=
{
[
0
]
=
13000000
,
[
1
]
=
16800000
,
[
4
]
=
19200000
,
[
5
]
=
38400000
,
[
8
]
=
12000000
,
[
9
]
=
48000000
,
[
12
]
=
260000000
,
};
static
struct
tegra_clk_periph_regs
periph_h_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_H
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_H
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_H
,
.
rst_reg
=
RST_DEVICES_H
,
.
rst_set_reg
=
RST_DEVICES_SET_H
,
.
rst_clr_reg
=
RST_DEVICES_CLR_H
,
static
struct
tegra_devclk
devclks
[]
__initdata
=
{
{
.
con_id
=
"pll_c"
,
.
dt_id
=
TEGRA30_CLK_PLL_C
},
{
.
con_id
=
"pll_c_out1"
,
.
dt_id
=
TEGRA30_CLK_PLL_C_OUT1
},
{
.
con_id
=
"pll_p"
,
.
dt_id
=
TEGRA30_CLK_PLL_P
},
{
.
con_id
=
"pll_p_out1"
,
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT1
},
{
.
con_id
=
"pll_p_out2"
,
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT2
},
{
.
con_id
=
"pll_p_out3"
,
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT3
},
{
.
con_id
=
"pll_p_out4"
,
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT4
},
{
.
con_id
=
"pll_m"
,
.
dt_id
=
TEGRA30_CLK_PLL_M
},
{
.
con_id
=
"pll_m_out1"
,
.
dt_id
=
TEGRA30_CLK_PLL_M_OUT1
},
{
.
con_id
=
"pll_x"
,
.
dt_id
=
TEGRA30_CLK_PLL_X
},
{
.
con_id
=
"pll_x_out0"
,
.
dt_id
=
TEGRA30_CLK_PLL_X_OUT0
},
{
.
con_id
=
"pll_u"
,
.
dt_id
=
TEGRA30_CLK_PLL_U
},
{
.
con_id
=
"pll_d"
,
.
dt_id
=
TEGRA30_CLK_PLL_D
},
{
.
con_id
=
"pll_d_out0"
,
.
dt_id
=
TEGRA30_CLK_PLL_D_OUT0
},
{
.
con_id
=
"pll_d2"
,
.
dt_id
=
TEGRA30_CLK_PLL_D2
},
{
.
con_id
=
"pll_d2_out0"
,
.
dt_id
=
TEGRA30_CLK_PLL_D2_OUT0
},
{
.
con_id
=
"pll_a"
,
.
dt_id
=
TEGRA30_CLK_PLL_A
},
{
.
con_id
=
"pll_a_out0"
,
.
dt_id
=
TEGRA30_CLK_PLL_A_OUT0
},
{
.
con_id
=
"pll_e"
,
.
dt_id
=
TEGRA30_CLK_PLL_E
},
{
.
con_id
=
"spdif_in_sync"
,
.
dt_id
=
TEGRA30_CLK_SPDIF_IN_SYNC
},
{
.
con_id
=
"i2s0_sync"
,
.
dt_id
=
TEGRA30_CLK_I2S0_SYNC
},
{
.
con_id
=
"i2s1_sync"
,
.
dt_id
=
TEGRA30_CLK_I2S1_SYNC
},
{
.
con_id
=
"i2s2_sync"
,
.
dt_id
=
TEGRA30_CLK_I2S2_SYNC
},
{
.
con_id
=
"i2s3_sync"
,
.
dt_id
=
TEGRA30_CLK_I2S3_SYNC
},
{
.
con_id
=
"i2s4_sync"
,
.
dt_id
=
TEGRA30_CLK_I2S4_SYNC
},
{
.
con_id
=
"vimclk_sync"
,
.
dt_id
=
TEGRA30_CLK_VIMCLK_SYNC
},
{
.
con_id
=
"audio0"
,
.
dt_id
=
TEGRA30_CLK_AUDIO0
},
{
.
con_id
=
"audio1"
,
.
dt_id
=
TEGRA30_CLK_AUDIO1
},
{
.
con_id
=
"audio2"
,
.
dt_id
=
TEGRA30_CLK_AUDIO2
},
{
.
con_id
=
"audio3"
,
.
dt_id
=
TEGRA30_CLK_AUDIO3
},
{
.
con_id
=
"audio4"
,
.
dt_id
=
TEGRA30_CLK_AUDIO4
},
{
.
con_id
=
"spdif"
,
.
dt_id
=
TEGRA30_CLK_SPDIF
},
{
.
con_id
=
"audio0_2x"
,
.
dt_id
=
TEGRA30_CLK_AUDIO0_2X
},
{
.
con_id
=
"audio1_2x"
,
.
dt_id
=
TEGRA30_CLK_AUDIO1_2X
},
{
.
con_id
=
"audio2_2x"
,
.
dt_id
=
TEGRA30_CLK_AUDIO2_2X
},
{
.
con_id
=
"audio3_2x"
,
.
dt_id
=
TEGRA30_CLK_AUDIO3_2X
},
{
.
con_id
=
"audio4_2x"
,
.
dt_id
=
TEGRA30_CLK_AUDIO4_2X
},
{
.
con_id
=
"spdif_2x"
,
.
dt_id
=
TEGRA30_CLK_SPDIF_2X
},
{
.
con_id
=
"extern1"
,
.
dev_id
=
"clk_out_1"
,
.
dt_id
=
TEGRA30_CLK_EXTERN1
},
{
.
con_id
=
"extern2"
,
.
dev_id
=
"clk_out_2"
,
.
dt_id
=
TEGRA30_CLK_EXTERN2
},
{
.
con_id
=
"extern3"
,
.
dev_id
=
"clk_out_3"
,
.
dt_id
=
TEGRA30_CLK_EXTERN3
},
{
.
con_id
=
"blink"
,
.
dt_id
=
TEGRA30_CLK_BLINK
},
{
.
con_id
=
"cclk_g"
,
.
dt_id
=
TEGRA30_CLK_CCLK_G
},
{
.
con_id
=
"cclk_lp"
,
.
dt_id
=
TEGRA30_CLK_CCLK_LP
},
{
.
con_id
=
"sclk"
,
.
dt_id
=
TEGRA30_CLK_SCLK
},
{
.
con_id
=
"hclk"
,
.
dt_id
=
TEGRA30_CLK_HCLK
},
{
.
con_id
=
"pclk"
,
.
dt_id
=
TEGRA30_CLK_PCLK
},
{
.
con_id
=
"twd"
,
.
dt_id
=
TEGRA30_CLK_TWD
},
{
.
con_id
=
"emc"
,
.
dt_id
=
TEGRA30_CLK_EMC
},
{
.
con_id
=
"clk_32k"
,
.
dt_id
=
TEGRA30_CLK_CLK_32K
},
{
.
con_id
=
"clk_m_div2"
,
.
dt_id
=
TEGRA30_CLK_CLK_M_DIV2
},
{
.
con_id
=
"clk_m_div4"
,
.
dt_id
=
TEGRA30_CLK_CLK_M_DIV4
},
{
.
con_id
=
"cml0"
,
.
dt_id
=
TEGRA30_CLK_CML0
},
{
.
con_id
=
"cml1"
,
.
dt_id
=
TEGRA30_CLK_CML1
},
{
.
con_id
=
"clk_m"
,
.
dt_id
=
TEGRA30_CLK_CLK_M
},
{
.
con_id
=
"pll_ref"
,
.
dt_id
=
TEGRA30_CLK_PLL_REF
},
{
.
con_id
=
"csus"
,
.
dev_id
=
"tengra_camera"
,
.
dt_id
=
TEGRA30_CLK_CSUS
},
{
.
con_id
=
"vcp"
,
.
dev_id
=
"tegra-avp"
,
.
dt_id
=
TEGRA30_CLK_VCP
},
{
.
con_id
=
"bsea"
,
.
dev_id
=
"tegra-avp"
,
.
dt_id
=
TEGRA30_CLK_BSEA
},
{
.
con_id
=
"bsev"
,
.
dev_id
=
"tegra-aes"
,
.
dt_id
=
TEGRA30_CLK_BSEV
},
{
.
con_id
=
"dsia"
,
.
dev_id
=
"tegradc.0"
,
.
dt_id
=
TEGRA30_CLK_DSIA
},
{
.
con_id
=
"csi"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA30_CLK_CSI
},
{
.
con_id
=
"isp"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA30_CLK_ISP
},
{
.
con_id
=
"pcie"
,
.
dev_id
=
"tegra-pcie"
,
.
dt_id
=
TEGRA30_CLK_PCIE
},
{
.
con_id
=
"afi"
,
.
dev_id
=
"tegra-pcie"
,
.
dt_id
=
TEGRA30_CLK_AFI
},
{
.
con_id
=
"pciex"
,
.
dev_id
=
"tegra-pcie"
,
.
dt_id
=
TEGRA30_CLK_PCIEX
},
{
.
con_id
=
"fuse"
,
.
dt_id
=
TEGRA30_CLK_FUSE
},
{
.
con_id
=
"fuse_burn"
,
.
dev_id
=
"fuse-tegra"
,
.
dt_id
=
TEGRA30_CLK_FUSE_BURN
},
{
.
con_id
=
"apbif"
,
.
dev_id
=
"tegra30-ahub"
,
.
dt_id
=
TEGRA30_CLK_APBIF
},
{
.
con_id
=
"hda2hdmi"
,
.
dev_id
=
"tegra30-hda"
,
.
dt_id
=
TEGRA30_CLK_HDA2HDMI
},
{
.
dev_id
=
"tegra-apbdma"
,
.
dt_id
=
TEGRA30_CLK_APBDMA
},
{
.
dev_id
=
"rtc-tegra"
,
.
dt_id
=
TEGRA30_CLK_RTC
},
{
.
dev_id
=
"timer"
,
.
dt_id
=
TEGRA30_CLK_TIMER
},
{
.
dev_id
=
"tegra-kbc"
,
.
dt_id
=
TEGRA30_CLK_KBC
},
{
.
dev_id
=
"fsl-tegra-udc"
,
.
dt_id
=
TEGRA30_CLK_USBD
},
{
.
dev_id
=
"tegra-ehci.1"
,
.
dt_id
=
TEGRA30_CLK_USB2
},
{
.
dev_id
=
"tegra-ehci.2"
,
.
dt_id
=
TEGRA30_CLK_USB2
},
{
.
dev_id
=
"kfuse-tegra"
,
.
dt_id
=
TEGRA30_CLK_KFUSE
},
{
.
dev_id
=
"tegra_sata_cold"
,
.
dt_id
=
TEGRA30_CLK_SATA_COLD
},
{
.
dev_id
=
"dtv"
,
.
dt_id
=
TEGRA30_CLK_DTV
},
{
.
dev_id
=
"tegra30-i2s.0"
,
.
dt_id
=
TEGRA30_CLK_I2S0
},
{
.
dev_id
=
"tegra30-i2s.1"
,
.
dt_id
=
TEGRA30_CLK_I2S1
},
{
.
dev_id
=
"tegra30-i2s.2"
,
.
dt_id
=
TEGRA30_CLK_I2S2
},
{
.
dev_id
=
"tegra30-i2s.3"
,
.
dt_id
=
TEGRA30_CLK_I2S3
},
{
.
dev_id
=
"tegra30-i2s.4"
,
.
dt_id
=
TEGRA30_CLK_I2S4
},
{
.
con_id
=
"spdif_out"
,
.
dev_id
=
"tegra30-spdif"
,
.
dt_id
=
TEGRA30_CLK_SPDIF_OUT
},
{
.
con_id
=
"spdif_in"
,
.
dev_id
=
"tegra30-spdif"
,
.
dt_id
=
TEGRA30_CLK_SPDIF_IN
},
{
.
con_id
=
"d_audio"
,
.
dev_id
=
"tegra30-ahub"
,
.
dt_id
=
TEGRA30_CLK_D_AUDIO
},
{
.
dev_id
=
"tegra30-dam.0"
,
.
dt_id
=
TEGRA30_CLK_DAM0
},
{
.
dev_id
=
"tegra30-dam.1"
,
.
dt_id
=
TEGRA30_CLK_DAM1
},
{
.
dev_id
=
"tegra30-dam.2"
,
.
dt_id
=
TEGRA30_CLK_DAM2
},
{
.
con_id
=
"hda"
,
.
dev_id
=
"tegra30-hda"
,
.
dt_id
=
TEGRA30_CLK_HDA
},
{
.
con_id
=
"hda2codec"
,
.
dev_id
=
"tegra30-hda"
,
.
dt_id
=
TEGRA30_CLK_HDA2CODEC_2X
},
{
.
dev_id
=
"spi_tegra.0"
,
.
dt_id
=
TEGRA30_CLK_SBC1
},
{
.
dev_id
=
"spi_tegra.1"
,
.
dt_id
=
TEGRA30_CLK_SBC2
},
{
.
dev_id
=
"spi_tegra.2"
,
.
dt_id
=
TEGRA30_CLK_SBC3
},
{
.
dev_id
=
"spi_tegra.3"
,
.
dt_id
=
TEGRA30_CLK_SBC4
},
{
.
dev_id
=
"spi_tegra.4"
,
.
dt_id
=
TEGRA30_CLK_SBC5
},
{
.
dev_id
=
"spi_tegra.5"
,
.
dt_id
=
TEGRA30_CLK_SBC6
},
{
.
dev_id
=
"tegra_sata_oob"
,
.
dt_id
=
TEGRA30_CLK_SATA_OOB
},
{
.
dev_id
=
"tegra_sata"
,
.
dt_id
=
TEGRA30_CLK_SATA
},
{
.
dev_id
=
"tegra_nand"
,
.
dt_id
=
TEGRA30_CLK_NDFLASH
},
{
.
dev_id
=
"tegra_nand_speed"
,
.
dt_id
=
TEGRA30_CLK_NDSPEED
},
{
.
dev_id
=
"vfir"
,
.
dt_id
=
TEGRA30_CLK_VFIR
},
{
.
dev_id
=
"csite"
,
.
dt_id
=
TEGRA30_CLK_CSITE
},
{
.
dev_id
=
"la"
,
.
dt_id
=
TEGRA30_CLK_LA
},
{
.
dev_id
=
"tegra_w1"
,
.
dt_id
=
TEGRA30_CLK_OWR
},
{
.
dev_id
=
"mipi"
,
.
dt_id
=
TEGRA30_CLK_MIPI
},
{
.
dev_id
=
"tegra-tsensor"
,
.
dt_id
=
TEGRA30_CLK_TSENSOR
},
{
.
dev_id
=
"i2cslow"
,
.
dt_id
=
TEGRA30_CLK_I2CSLOW
},
{
.
dev_id
=
"vde"
,
.
dt_id
=
TEGRA30_CLK_VDE
},
{
.
con_id
=
"vi"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA30_CLK_VI
},
{
.
dev_id
=
"epp"
,
.
dt_id
=
TEGRA30_CLK_EPP
},
{
.
dev_id
=
"mpe"
,
.
dt_id
=
TEGRA30_CLK_MPE
},
{
.
dev_id
=
"host1x"
,
.
dt_id
=
TEGRA30_CLK_HOST1X
},
{
.
dev_id
=
"3d"
,
.
dt_id
=
TEGRA30_CLK_GR3D
},
{
.
dev_id
=
"3d2"
,
.
dt_id
=
TEGRA30_CLK_GR3D2
},
{
.
dev_id
=
"2d"
,
.
dt_id
=
TEGRA30_CLK_GR2D
},
{
.
dev_id
=
"se"
,
.
dt_id
=
TEGRA30_CLK_SE
},
{
.
dev_id
=
"mselect"
,
.
dt_id
=
TEGRA30_CLK_MSELECT
},
{
.
dev_id
=
"tegra-nor"
,
.
dt_id
=
TEGRA30_CLK_NOR
},
{
.
dev_id
=
"sdhci-tegra.0"
,
.
dt_id
=
TEGRA30_CLK_SDMMC1
},
{
.
dev_id
=
"sdhci-tegra.1"
,
.
dt_id
=
TEGRA30_CLK_SDMMC2
},
{
.
dev_id
=
"sdhci-tegra.2"
,
.
dt_id
=
TEGRA30_CLK_SDMMC3
},
{
.
dev_id
=
"sdhci-tegra.3"
,
.
dt_id
=
TEGRA30_CLK_SDMMC4
},
{
.
dev_id
=
"cve"
,
.
dt_id
=
TEGRA30_CLK_CVE
},
{
.
dev_id
=
"tvo"
,
.
dt_id
=
TEGRA30_CLK_TVO
},
{
.
dev_id
=
"tvdac"
,
.
dt_id
=
TEGRA30_CLK_TVDAC
},
{
.
dev_id
=
"actmon"
,
.
dt_id
=
TEGRA30_CLK_ACTMON
},
{
.
con_id
=
"vi_sensor"
,
.
dev_id
=
"tegra_camera"
,
.
dt_id
=
TEGRA30_CLK_VI_SENSOR
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.0"
,
.
dt_id
=
TEGRA30_CLK_I2C1
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.1"
,
.
dt_id
=
TEGRA30_CLK_I2C2
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.2"
,
.
dt_id
=
TEGRA30_CLK_I2C3
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.3"
,
.
dt_id
=
TEGRA30_CLK_I2C4
},
{
.
con_id
=
"div-clk"
,
.
dev_id
=
"tegra-i2c.4"
,
.
dt_id
=
TEGRA30_CLK_I2C5
},
{
.
dev_id
=
"tegra_uart.0"
,
.
dt_id
=
TEGRA30_CLK_UARTA
},
{
.
dev_id
=
"tegra_uart.1"
,
.
dt_id
=
TEGRA30_CLK_UARTB
},
{
.
dev_id
=
"tegra_uart.2"
,
.
dt_id
=
TEGRA30_CLK_UARTC
},
{
.
dev_id
=
"tegra_uart.3"
,
.
dt_id
=
TEGRA30_CLK_UARTD
},
{
.
dev_id
=
"tegra_uart.4"
,
.
dt_id
=
TEGRA30_CLK_UARTE
},
{
.
dev_id
=
"hdmi"
,
.
dt_id
=
TEGRA30_CLK_HDMI
},
{
.
dev_id
=
"extern1"
,
.
dt_id
=
TEGRA30_CLK_EXTERN1
},
{
.
dev_id
=
"extern2"
,
.
dt_id
=
TEGRA30_CLK_EXTERN2
},
{
.
dev_id
=
"extern3"
,
.
dt_id
=
TEGRA30_CLK_EXTERN3
},
{
.
dev_id
=
"pwm"
,
.
dt_id
=
TEGRA30_CLK_PWM
},
{
.
dev_id
=
"tegradc.0"
,
.
dt_id
=
TEGRA30_CLK_DISP1
},
{
.
dev_id
=
"tegradc.1"
,
.
dt_id
=
TEGRA30_CLK_DISP2
},
{
.
dev_id
=
"tegradc.1"
,
.
dt_id
=
TEGRA30_CLK_DSIB
},
};
static
struct
tegra_clk_periph_regs
periph_u_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_U
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_U
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_U
,
.
rst_reg
=
RST_DEVICES_U
,
.
rst_set_reg
=
RST_DEVICES_SET_U
,
.
rst_clr_reg
=
RST_DEVICES_CLR_U
,
};
static
struct
tegra_clk
tegra30_clks
[
tegra_clk_max
]
__initdata
=
{
[
tegra_clk_clk_32k
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_32K
,
.
present
=
true
},
[
tegra_clk_clk_m
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_M
,
.
present
=
true
},
[
tegra_clk_clk_m_div2
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_M_DIV2
,
.
present
=
true
},
[
tegra_clk_clk_m_div4
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_M_DIV4
,
.
present
=
true
},
[
tegra_clk_pll_ref
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_REF
,
.
present
=
true
},
[
tegra_clk_spdif_in_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_SPDIF_IN_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s0_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S0_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s1_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S1_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s2_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S2_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s3_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S3_SYNC
,
.
present
=
true
},
[
tegra_clk_i2s4_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S4_SYNC
,
.
present
=
true
},
[
tegra_clk_vimclk_sync
]
=
{
.
dt_id
=
TEGRA30_CLK_VIMCLK_SYNC
,
.
present
=
true
},
[
tegra_clk_audio0
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO0
,
.
present
=
true
},
[
tegra_clk_audio1
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO1
,
.
present
=
true
},
[
tegra_clk_audio2
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO2
,
.
present
=
true
},
[
tegra_clk_audio3
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO3
,
.
present
=
true
},
[
tegra_clk_audio4
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO4
,
.
present
=
true
},
[
tegra_clk_spdif
]
=
{
.
dt_id
=
TEGRA30_CLK_SPDIF
,
.
present
=
true
},
[
tegra_clk_audio0_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO0_MUX
,
.
present
=
true
},
[
tegra_clk_audio1_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO1_MUX
,
.
present
=
true
},
[
tegra_clk_audio2_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO2_MUX
,
.
present
=
true
},
[
tegra_clk_audio3_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO3_MUX
,
.
present
=
true
},
[
tegra_clk_audio4_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO4_MUX
,
.
present
=
true
},
[
tegra_clk_spdif_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_SPDIF_MUX
,
.
present
=
true
},
[
tegra_clk_audio0_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO0_2X
,
.
present
=
true
},
[
tegra_clk_audio1_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO1_2X
,
.
present
=
true
},
[
tegra_clk_audio2_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO2_2X
,
.
present
=
true
},
[
tegra_clk_audio3_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO3_2X
,
.
present
=
true
},
[
tegra_clk_audio4_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_AUDIO4_2X
,
.
present
=
true
},
[
tegra_clk_spdif_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_SPDIF_2X
,
.
present
=
true
},
[
tegra_clk_clk_out_1
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_1
,
.
present
=
true
},
[
tegra_clk_clk_out_2
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_2
,
.
present
=
true
},
[
tegra_clk_clk_out_3
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_3
,
.
present
=
true
},
[
tegra_clk_blink
]
=
{
.
dt_id
=
TEGRA30_CLK_BLINK
,
.
present
=
true
},
[
tegra_clk_clk_out_1_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_1_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_2_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_2_MUX
,
.
present
=
true
},
[
tegra_clk_clk_out_3_mux
]
=
{
.
dt_id
=
TEGRA30_CLK_CLK_OUT_3_MUX
,
.
present
=
true
},
[
tegra_clk_hclk
]
=
{
.
dt_id
=
TEGRA30_CLK_HCLK
,
.
present
=
true
},
[
tegra_clk_pclk
]
=
{
.
dt_id
=
TEGRA30_CLK_PCLK
,
.
present
=
true
},
[
tegra_clk_i2s0
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S0
,
.
present
=
true
},
[
tegra_clk_i2s1
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S1
,
.
present
=
true
},
[
tegra_clk_i2s2
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S2
,
.
present
=
true
},
[
tegra_clk_i2s3
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S3
,
.
present
=
true
},
[
tegra_clk_i2s4
]
=
{
.
dt_id
=
TEGRA30_CLK_I2S4
,
.
present
=
true
},
[
tegra_clk_spdif_in
]
=
{
.
dt_id
=
TEGRA30_CLK_SPDIF_IN
,
.
present
=
true
},
[
tegra_clk_hda
]
=
{
.
dt_id
=
TEGRA30_CLK_HDA
,
.
present
=
true
},
[
tegra_clk_hda2codec_2x
]
=
{
.
dt_id
=
TEGRA30_CLK_HDA2CODEC_2X
,
.
present
=
true
},
[
tegra_clk_sbc1
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC1
,
.
present
=
true
},
[
tegra_clk_sbc2
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC2
,
.
present
=
true
},
[
tegra_clk_sbc3
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC3
,
.
present
=
true
},
[
tegra_clk_sbc4
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC4
,
.
present
=
true
},
[
tegra_clk_sbc5
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC5
,
.
present
=
true
},
[
tegra_clk_sbc6
]
=
{
.
dt_id
=
TEGRA30_CLK_SBC6
,
.
present
=
true
},
[
tegra_clk_ndflash
]
=
{
.
dt_id
=
TEGRA30_CLK_NDFLASH
,
.
present
=
true
},
[
tegra_clk_ndspeed
]
=
{
.
dt_id
=
TEGRA30_CLK_NDSPEED
,
.
present
=
true
},
[
tegra_clk_vfir
]
=
{
.
dt_id
=
TEGRA30_CLK_VFIR
,
.
present
=
true
},
[
tegra_clk_la
]
=
{
.
dt_id
=
TEGRA30_CLK_LA
,
.
present
=
true
},
[
tegra_clk_csite
]
=
{
.
dt_id
=
TEGRA30_CLK_CSITE
,
.
present
=
true
},
[
tegra_clk_owr
]
=
{
.
dt_id
=
TEGRA30_CLK_OWR
,
.
present
=
true
},
[
tegra_clk_mipi
]
=
{
.
dt_id
=
TEGRA30_CLK_MIPI
,
.
present
=
true
},
[
tegra_clk_tsensor
]
=
{
.
dt_id
=
TEGRA30_CLK_TSENSOR
,
.
present
=
true
},
[
tegra_clk_i2cslow
]
=
{
.
dt_id
=
TEGRA30_CLK_I2CSLOW
,
.
present
=
true
},
[
tegra_clk_vde
]
=
{
.
dt_id
=
TEGRA30_CLK_VDE
,
.
present
=
true
},
[
tegra_clk_vi
]
=
{
.
dt_id
=
TEGRA30_CLK_VI
,
.
present
=
true
},
[
tegra_clk_epp
]
=
{
.
dt_id
=
TEGRA30_CLK_EPP
,
.
present
=
true
},
[
tegra_clk_mpe
]
=
{
.
dt_id
=
TEGRA30_CLK_MPE
,
.
present
=
true
},
[
tegra_clk_host1x
]
=
{
.
dt_id
=
TEGRA30_CLK_HOST1X
,
.
present
=
true
},
[
tegra_clk_gr2d
]
=
{
.
dt_id
=
TEGRA30_CLK_GR2D
,
.
present
=
true
},
[
tegra_clk_gr3d
]
=
{
.
dt_id
=
TEGRA30_CLK_GR3D
,
.
present
=
true
},
[
tegra_clk_mselect
]
=
{
.
dt_id
=
TEGRA30_CLK_MSELECT
,
.
present
=
true
},
[
tegra_clk_nor
]
=
{
.
dt_id
=
TEGRA30_CLK_NOR
,
.
present
=
true
},
[
tegra_clk_sdmmc1
]
=
{
.
dt_id
=
TEGRA30_CLK_SDMMC1
,
.
present
=
true
},
[
tegra_clk_sdmmc2
]
=
{
.
dt_id
=
TEGRA30_CLK_SDMMC2
,
.
present
=
true
},
[
tegra_clk_sdmmc3
]
=
{
.
dt_id
=
TEGRA30_CLK_SDMMC3
,
.
present
=
true
},
[
tegra_clk_sdmmc4
]
=
{
.
dt_id
=
TEGRA30_CLK_SDMMC4
,
.
present
=
true
},
[
tegra_clk_cve
]
=
{
.
dt_id
=
TEGRA30_CLK_CVE
,
.
present
=
true
},
[
tegra_clk_tvo
]
=
{
.
dt_id
=
TEGRA30_CLK_TVO
,
.
present
=
true
},
[
tegra_clk_tvdac
]
=
{
.
dt_id
=
TEGRA30_CLK_TVDAC
,
.
present
=
true
},
[
tegra_clk_actmon
]
=
{
.
dt_id
=
TEGRA30_CLK_ACTMON
,
.
present
=
true
},
[
tegra_clk_vi_sensor
]
=
{
.
dt_id
=
TEGRA30_CLK_VI_SENSOR
,
.
present
=
true
},
[
tegra_clk_i2c1
]
=
{
.
dt_id
=
TEGRA30_CLK_I2C1
,
.
present
=
true
},
[
tegra_clk_i2c2
]
=
{
.
dt_id
=
TEGRA30_CLK_I2C2
,
.
present
=
true
},
[
tegra_clk_i2c3
]
=
{
.
dt_id
=
TEGRA30_CLK_I2C3
,
.
present
=
true
},
[
tegra_clk_i2c4
]
=
{
.
dt_id
=
TEGRA30_CLK_I2C4
,
.
present
=
true
},
[
tegra_clk_i2c5
]
=
{
.
dt_id
=
TEGRA30_CLK_I2C5
,
.
present
=
true
},
[
tegra_clk_uarta
]
=
{
.
dt_id
=
TEGRA30_CLK_UARTA
,
.
present
=
true
},
[
tegra_clk_uartb
]
=
{
.
dt_id
=
TEGRA30_CLK_UARTB
,
.
present
=
true
},
[
tegra_clk_uartc
]
=
{
.
dt_id
=
TEGRA30_CLK_UARTC
,
.
present
=
true
},
[
tegra_clk_uartd
]
=
{
.
dt_id
=
TEGRA30_CLK_UARTD
,
.
present
=
true
},
[
tegra_clk_uarte
]
=
{
.
dt_id
=
TEGRA30_CLK_UARTE
,
.
present
=
true
},
[
tegra_clk_extern1
]
=
{
.
dt_id
=
TEGRA30_CLK_EXTERN1
,
.
present
=
true
},
[
tegra_clk_extern2
]
=
{
.
dt_id
=
TEGRA30_CLK_EXTERN2
,
.
present
=
true
},
[
tegra_clk_extern3
]
=
{
.
dt_id
=
TEGRA30_CLK_EXTERN3
,
.
present
=
true
},
[
tegra_clk_disp1
]
=
{
.
dt_id
=
TEGRA30_CLK_DISP1
,
.
present
=
true
},
[
tegra_clk_disp2
]
=
{
.
dt_id
=
TEGRA30_CLK_DISP2
,
.
present
=
true
},
[
tegra_clk_apbdma
]
=
{
.
dt_id
=
TEGRA30_CLK_APBDMA
,
.
present
=
true
},
[
tegra_clk_rtc
]
=
{
.
dt_id
=
TEGRA30_CLK_RTC
,
.
present
=
true
},
[
tegra_clk_timer
]
=
{
.
dt_id
=
TEGRA30_CLK_TIMER
,
.
present
=
true
},
[
tegra_clk_kbc
]
=
{
.
dt_id
=
TEGRA30_CLK_KBC
,
.
present
=
true
},
[
tegra_clk_csus
]
=
{
.
dt_id
=
TEGRA30_CLK_CSUS
,
.
present
=
true
},
[
tegra_clk_vcp
]
=
{
.
dt_id
=
TEGRA30_CLK_VCP
,
.
present
=
true
},
[
tegra_clk_bsea
]
=
{
.
dt_id
=
TEGRA30_CLK_BSEA
,
.
present
=
true
},
[
tegra_clk_bsev
]
=
{
.
dt_id
=
TEGRA30_CLK_BSEV
,
.
present
=
true
},
[
tegra_clk_usbd
]
=
{
.
dt_id
=
TEGRA30_CLK_USBD
,
.
present
=
true
},
[
tegra_clk_usb2
]
=
{
.
dt_id
=
TEGRA30_CLK_USB2
,
.
present
=
true
},
[
tegra_clk_usb3
]
=
{
.
dt_id
=
TEGRA30_CLK_USB3
,
.
present
=
true
},
[
tegra_clk_csi
]
=
{
.
dt_id
=
TEGRA30_CLK_CSI
,
.
present
=
true
},
[
tegra_clk_isp
]
=
{
.
dt_id
=
TEGRA30_CLK_ISP
,
.
present
=
true
},
[
tegra_clk_kfuse
]
=
{
.
dt_id
=
TEGRA30_CLK_KFUSE
,
.
present
=
true
},
[
tegra_clk_fuse
]
=
{
.
dt_id
=
TEGRA30_CLK_FUSE
,
.
present
=
true
},
[
tegra_clk_fuse_burn
]
=
{
.
dt_id
=
TEGRA30_CLK_FUSE_BURN
,
.
present
=
true
},
[
tegra_clk_apbif
]
=
{
.
dt_id
=
TEGRA30_CLK_APBIF
,
.
present
=
true
},
[
tegra_clk_hda2hdmi
]
=
{
.
dt_id
=
TEGRA30_CLK_HDA2HDMI
,
.
present
=
true
},
[
tegra_clk_sata_cold
]
=
{
.
dt_id
=
TEGRA30_CLK_SATA_COLD
,
.
present
=
true
},
[
tegra_clk_sata_oob
]
=
{
.
dt_id
=
TEGRA30_CLK_SATA_OOB
,
.
present
=
true
},
[
tegra_clk_sata
]
=
{
.
dt_id
=
TEGRA30_CLK_SATA
,
.
present
=
true
},
[
tegra_clk_dtv
]
=
{
.
dt_id
=
TEGRA30_CLK_DTV
,
.
present
=
true
},
[
tegra_clk_pll_p
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_P
,
.
present
=
true
},
[
tegra_clk_pll_p_out1
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT1
,
.
present
=
true
},
[
tegra_clk_pll_p_out2
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT2
,
.
present
=
true
},
[
tegra_clk_pll_p_out3
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT3
,
.
present
=
true
},
[
tegra_clk_pll_p_out4
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_P_OUT4
,
.
present
=
true
},
[
tegra_clk_pll_a
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_A
,
.
present
=
true
},
[
tegra_clk_pll_a_out0
]
=
{
.
dt_id
=
TEGRA30_CLK_PLL_A_OUT0
,
.
present
=
true
},
static
struct
tegra_clk_periph_regs
periph_v_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_V
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_V
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_V
,
.
rst_reg
=
RST_DEVICES_V
,
.
rst_set_reg
=
RST_DEVICES_SET_V
,
.
rst_clr_reg
=
RST_DEVICES_CLR_V
,
};
static
struct
tegra_clk_periph_regs
periph_w_regs
=
{
.
enb_reg
=
CLK_OUT_ENB_W
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_W
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_W
,
.
rst_reg
=
RST_DEVICES_W
,
.
rst_set_reg
=
RST_DEVICES_SET_W
,
.
rst_clr_reg
=
RST_DEVICES_CLR_W
,
};
static
void
tegra30_clk_measure_input_freq
(
void
)
{
u32
osc_ctrl
=
readl_relaxed
(
clk_base
+
OSC_CTRL
);
u32
auto_clk_control
=
osc_ctrl
&
OSC_CTRL_OSC_FREQ_MASK
;
u32
pll_ref_div
=
osc_ctrl
&
OSC_CTRL_PLL_REF_DIV_MASK
;
switch
(
auto_clk_control
)
{
case
OSC_CTRL_OSC_FREQ_12MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_1
);
input_freq
=
12000000
;
break
;
case
OSC_CTRL_OSC_FREQ_13MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_1
);
input_freq
=
13000000
;
break
;
case
OSC_CTRL_OSC_FREQ_19_2MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_1
);
input_freq
=
19200000
;
break
;
case
OSC_CTRL_OSC_FREQ_26MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_1
);
input_freq
=
26000000
;
break
;
case
OSC_CTRL_OSC_FREQ_16_8MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_1
);
input_freq
=
16800000
;
break
;
case
OSC_CTRL_OSC_FREQ_38_4MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_2
);
input_freq
=
38400000
;
break
;
case
OSC_CTRL_OSC_FREQ_48MHZ
:
BUG_ON
(
pll_ref_div
!=
OSC_CTRL_PLL_REF_DIV_4
);
input_freq
=
48000000
;
break
;
default:
pr_err
(
"Unexpected auto clock control value %d"
,
auto_clk_control
);
BUG
();
return
;
}
}
static
unsigned
int
tegra30_get_pll_ref_div
(
void
)
{
u32
pll_ref_div
=
readl_relaxed
(
clk_base
+
OSC_CTRL
)
&
OSC_CTRL_PLL_REF_DIV_MASK
;
switch
(
pll_ref_div
)
{
case
OSC_CTRL_PLL_REF_DIV_1
:
return
1
;
case
OSC_CTRL_PLL_REF_DIV_2
:
return
2
;
case
OSC_CTRL_PLL_REF_DIV_4
:
return
4
;
default:
pr_err
(
"Invalid pll ref divider %d"
,
pll_ref_div
);
BUG
();
}
return
0
;
}
static
void
tegra30_utmi_param_configure
(
void
)
{
u32
reg
;
...
...
@@ -863,11 +923,8 @@ static void __init tegra30_pll_init(void)
/* PLLC */
clk
=
tegra_clk_register_pll
(
"pll_c"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_c_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
pll_c_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c"
,
NULL
);
clks
[
pll_c
]
=
clk
;
&
pll_c_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_C
]
=
clk
;
/* PLLC_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_c_out1_div"
,
"pll_c"
,
...
...
@@ -876,73 +933,13 @@ static void __init tegra30_pll_init(void)
clk
=
tegra_clk_register_pll_out
(
"pll_c_out1"
,
"pll_c_out1_div"
,
clk_base
+
PLLC_OUT
,
1
,
0
,
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_c_out1"
,
NULL
);
clks
[
pll_c_out1
]
=
clk
;
/* PLLP */
clk
=
tegra_clk_register_pll
(
"pll_p"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
408000000
,
&
pll_p_params
,
TEGRA_PLL_FIXED
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
pll_p_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_p"
,
NULL
);
clks
[
pll_p
]
=
clk
;
/* PLLP_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_p_out1_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out1"
,
"pll_p_out1_div"
,
clk_base
+
PLLP_OUTA
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out1"
,
NULL
);
clks
[
pll_p_out1
]
=
clk
;
/* PLLP_OUT2 */
clk
=
tegra_clk_register_divider
(
"pll_p_out2_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTA
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out2"
,
"pll_p_out2_div"
,
clk_base
+
PLLP_OUTA
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out2"
,
NULL
);
clks
[
pll_p_out2
]
=
clk
;
/* PLLP_OUT3 */
clk
=
tegra_clk_register_divider
(
"pll_p_out3_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out3"
,
"pll_p_out3_div"
,
clk_base
+
PLLP_OUTB
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out3"
,
NULL
);
clks
[
pll_p_out3
]
=
clk
;
/* PLLP_OUT4 */
clk
=
tegra_clk_register_divider
(
"pll_p_out4_div"
,
"pll_p"
,
clk_base
+
PLLP_OUTB
,
0
,
TEGRA_DIVIDER_FIXED
|
TEGRA_DIVIDER_ROUND_UP
,
24
,
8
,
1
,
&
pll_div_lock
);
clk
=
tegra_clk_register_pll_out
(
"pll_p_out4"
,
"pll_p_out4_div"
,
clk_base
+
PLLP_OUTB
,
17
,
16
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
&
pll_div_lock
);
clk_register_clkdev
(
clk
,
"pll_p_out4"
,
NULL
);
clks
[
pll_p_out4
]
=
clk
;
clks
[
TEGRA30_CLK_PLL_C_OUT1
]
=
clk
;
/* PLLM */
clk
=
tegra_clk_register_pll
(
"pll_m"
,
"pll_ref"
,
clk_base
,
pmc_base
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
0
,
&
pll_m_params
,
TEGRA_PLLM
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_DCCON
|
TEGRA_PLL_USE_LOCK
,
pll_m_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m"
,
NULL
);
clks
[
pll_m
]
=
clk
;
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_GATE
,
&
pll_m_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_M
]
=
clk
;
/* PLLM_OUT1 */
clk
=
tegra_clk_register_divider
(
"pll_m_out1_div"
,
"pll_m"
,
...
...
@@ -951,78 +948,44 @@ static void __init tegra30_pll_init(void)
clk
=
tegra_clk_register_pll_out
(
"pll_m_out1"
,
"pll_m_out1_div"
,
clk_base
+
PLLM_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_m_out1"
,
NULL
);
clks
[
pll_m_out1
]
=
clk
;
clks
[
TEGRA30_CLK_PLL_M_OUT1
]
=
clk
;
/* PLLX */
clk
=
tegra_clk_register_pll
(
"pll_x"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_x_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_DCCON
|
TEGRA_PLL_USE_LOCK
,
pll_x_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_x"
,
NULL
);
clks
[
pll_x
]
=
clk
;
&
pll_x_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_X
]
=
clk
;
/* PLLX_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_x_out0"
,
"pll_x"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_x_out0"
,
NULL
);
clks
[
pll_x_out0
]
=
clk
;
clks
[
TEGRA30_CLK_PLL_X_OUT0
]
=
clk
;
/* PLLU */
clk
=
tegra_clk_register_pll
(
"pll_u"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_u_params
,
TEGRA_PLLU
|
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
,
pll_u_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_u"
,
NULL
);
clks
[
pll_u
]
=
clk
;
&
pll_u_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_U
]
=
clk
;
tegra30_utmi_param_configure
();
/* PLLD */
clk
=
tegra_clk_register_pll
(
"pll_d"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_d_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
pll_d_freq_table
,
&
pll_d_lock
);
clk_register_clkdev
(
clk
,
"pll_d"
,
NULL
);
clks
[
pll_d
]
=
clk
;
&
pll_d_params
,
&
pll_d_lock
);
clks
[
TEGRA30_CLK_PLL_D
]
=
clk
;
/* PLLD_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d_out0"
,
"pll_d"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d_out0"
,
NULL
);
clks
[
pll_d_out0
]
=
clk
;
clks
[
TEGRA30_CLK_PLL_D_OUT0
]
=
clk
;
/* PLLD2 */
clk
=
tegra_clk_register_pll
(
"pll_d2"
,
"pll_ref"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_d2_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_SET_LFCON
|
TEGRA_PLL_USE_LOCK
,
pll_d_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_d2"
,
NULL
);
clks
[
pll_d2
]
=
clk
;
&
pll_d2_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_D2
]
=
clk
;
/* PLLD2_OUT0 */
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_d2_out0"
,
"pll_d2"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"pll_d2_out0"
,
NULL
);
clks
[
pll_d2_out0
]
=
clk
;
/* PLLA */
clk
=
tegra_clk_register_pll
(
"pll_a"
,
"pll_p_out1"
,
clk_base
,
pmc_base
,
0
,
0
,
&
pll_a_params
,
TEGRA_PLL_HAS_CPCON
|
TEGRA_PLL_USE_LOCK
,
pll_a_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a"
,
NULL
);
clks
[
pll_a
]
=
clk
;
/* PLLA_OUT0 */
clk
=
tegra_clk_register_divider
(
"pll_a_out0_div"
,
"pll_a"
,
clk_base
+
PLLA_OUT
,
0
,
TEGRA_DIVIDER_ROUND_UP
,
8
,
8
,
1
,
NULL
);
clk
=
tegra_clk_register_pll_out
(
"pll_a_out0"
,
"pll_a_out0_div"
,
clk_base
+
PLLA_OUT
,
1
,
0
,
CLK_IGNORE_UNUSED
|
CLK_SET_RATE_PARENT
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_a_out0"
,
NULL
);
clks
[
pll_a_out0
]
=
clk
;
clks
[
TEGRA30_CLK_PLL_D2_OUT0
]
=
clk
;
/* PLLE */
clk
=
clk_register_mux
(
NULL
,
"pll_e_mux"
,
pll_e_parents
,
...
...
@@ -1030,258 +993,8 @@ static void __init tegra30_pll_init(void)
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
PLLE_AUX
,
2
,
1
,
0
,
NULL
);
clk
=
tegra_clk_register_plle
(
"pll_e"
,
"pll_e_mux"
,
clk_base
,
pmc_base
,
CLK_GET_RATE_NOCACHE
,
100000000
,
&
pll_e_params
,
TEGRA_PLLE_CONFIGURE
,
pll_e_freq_table
,
NULL
);
clk_register_clkdev
(
clk
,
"pll_e"
,
NULL
);
clks
[
pll_e
]
=
clk
;
}
static
const
char
*
mux_audio_sync_clk
[]
=
{
"spdif_in_sync"
,
"i2s0_sync"
,
"i2s1_sync"
,
"i2s2_sync"
,
"i2s3_sync"
,
"i2s4_sync"
,
"vimclk_sync"
,};
static
const
char
*
clk_out1_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern1"
,
};
static
const
char
*
clk_out2_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern2"
,
};
static
const
char
*
clk_out3_parents
[]
=
{
"clk_m"
,
"clk_m_div2"
,
"clk_m_div4"
,
"extern3"
,
};
static
void
__init
tegra30_audio_clk_init
(
void
)
{
struct
clk
*
clk
;
/* spdif_in_sync */
clk
=
tegra_clk_register_sync_source
(
"spdif_in_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"spdif_in_sync"
,
NULL
);
clks
[
spdif_in_sync
]
=
clk
;
/* i2s0_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s0_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s0_sync"
,
NULL
);
clks
[
i2s0_sync
]
=
clk
;
/* i2s1_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s1_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s1_sync"
,
NULL
);
clks
[
i2s1_sync
]
=
clk
;
/* i2s2_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s2_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s2_sync"
,
NULL
);
clks
[
i2s2_sync
]
=
clk
;
/* i2s3_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s3_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s3_sync"
,
NULL
);
clks
[
i2s3_sync
]
=
clk
;
/* i2s4_sync */
clk
=
tegra_clk_register_sync_source
(
"i2s4_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"i2s4_sync"
,
NULL
);
clks
[
i2s4_sync
]
=
clk
;
/* vimclk_sync */
clk
=
tegra_clk_register_sync_source
(
"vimclk_sync"
,
24000000
,
24000000
);
clk_register_clkdev
(
clk
,
"vimclk_sync"
,
NULL
);
clks
[
vimclk_sync
]
=
clk
;
/* audio0 */
clk
=
clk_register_mux
(
NULL
,
"audio0_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S0
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"audio0"
,
"audio0_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S0
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio0"
,
NULL
);
clks
[
audio0
]
=
clk
;
/* audio1 */
clk
=
clk_register_mux
(
NULL
,
"audio1_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S1
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"audio1"
,
"audio1_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S1
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio1"
,
NULL
);
clks
[
audio1
]
=
clk
;
/* audio2 */
clk
=
clk_register_mux
(
NULL
,
"audio2_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S2
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"audio2"
,
"audio2_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S2
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio2"
,
NULL
);
clks
[
audio2
]
=
clk
;
/* audio3 */
clk
=
clk_register_mux
(
NULL
,
"audio3_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S3
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"audio3"
,
"audio3_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S3
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio3"
,
NULL
);
clks
[
audio3
]
=
clk
;
/* audio4 */
clk
=
clk_register_mux
(
NULL
,
"audio4_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_I2S4
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"audio4"
,
"audio4_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_I2S4
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"audio4"
,
NULL
);
clks
[
audio4
]
=
clk
;
/* spdif */
clk
=
clk_register_mux
(
NULL
,
"spdif_mux"
,
mux_audio_sync_clk
,
ARRAY_SIZE
(
mux_audio_sync_clk
),
CLK_SET_RATE_NO_REPARENT
,
clk_base
+
AUDIO_SYNC_CLK_SPDIF
,
0
,
3
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"spdif"
,
"spdif_mux"
,
0
,
clk_base
+
AUDIO_SYNC_CLK_SPDIF
,
4
,
CLK_GATE_SET_TO_DISABLE
,
NULL
);
clk_register_clkdev
(
clk
,
"spdif"
,
NULL
);
clks
[
spdif
]
=
clk
;
/* audio0_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio0_doubler"
,
"audio0"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio0_div"
,
"audio0_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
24
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio0_2x"
,
"audio0_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
113
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio0_2x"
,
NULL
);
clks
[
audio0_2x
]
=
clk
;
/* audio1_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio1_doubler"
,
"audio1"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio1_div"
,
"audio1_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
25
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio1_2x"
,
"audio1_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
114
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio1_2x"
,
NULL
);
clks
[
audio1_2x
]
=
clk
;
/* audio2_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio2_doubler"
,
"audio2"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio2_div"
,
"audio2_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
26
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio2_2x"
,
"audio2_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
115
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio2_2x"
,
NULL
);
clks
[
audio2_2x
]
=
clk
;
/* audio3_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio3_doubler"
,
"audio3"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio3_div"
,
"audio3_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
27
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio3_2x"
,
"audio3_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
116
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio3_2x"
,
NULL
);
clks
[
audio3_2x
]
=
clk
;
/* audio4_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"audio4_doubler"
,
"audio4"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"audio4_div"
,
"audio4_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
28
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"audio4_2x"
,
"audio4_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
117
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"audio4_2x"
,
NULL
);
clks
[
audio4_2x
]
=
clk
;
/* spdif_2x */
clk
=
clk_register_fixed_factor
(
NULL
,
"spdif_doubler"
,
"spdif"
,
CLK_SET_RATE_PARENT
,
2
,
1
);
clk
=
tegra_clk_register_divider
(
"spdif_div"
,
"spdif_doubler"
,
clk_base
+
AUDIO_SYNC_DOUBLER
,
0
,
0
,
29
,
1
,
0
,
&
clk_doubler_lock
);
clk
=
tegra_clk_register_periph_gate
(
"spdif_2x"
,
"spdif_div"
,
TEGRA_PERIPH_NO_RESET
,
clk_base
,
CLK_SET_RATE_PARENT
,
118
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"spdif_2x"
,
NULL
);
clks
[
spdif_2x
]
=
clk
;
}
static
void
__init
tegra30_pmc_clk_init
(
void
)
{
struct
clk
*
clk
;
/* clk_out_1 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_1_mux"
,
clk_out1_parents
,
ARRAY_SIZE
(
clk_out1_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
6
,
3
,
0
,
&
clk_out_lock
);
clks
[
clk_out_1_mux
]
=
clk
;
clk
=
clk_register_gate
(
NULL
,
"clk_out_1"
,
"clk_out_1_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
2
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern1"
,
"clk_out_1"
);
clks
[
clk_out_1
]
=
clk
;
/* clk_out_2 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_2_mux"
,
clk_out2_parents
,
ARRAY_SIZE
(
clk_out2_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
14
,
3
,
0
,
&
clk_out_lock
);
clk
=
clk_register_gate
(
NULL
,
"clk_out_2"
,
"clk_out_2_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
10
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern2"
,
"clk_out_2"
);
clks
[
clk_out_2
]
=
clk
;
/* clk_out_3 */
clk
=
clk_register_mux
(
NULL
,
"clk_out_3_mux"
,
clk_out3_parents
,
ARRAY_SIZE
(
clk_out3_parents
),
CLK_SET_RATE_NO_REPARENT
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
22
,
3
,
0
,
&
clk_out_lock
);
clk
=
clk_register_gate
(
NULL
,
"clk_out_3"
,
"clk_out_3_mux"
,
0
,
pmc_base
+
PMC_CLK_OUT_CNTRL
,
18
,
0
,
&
clk_out_lock
);
clk_register_clkdev
(
clk
,
"extern3"
,
"clk_out_3"
);
clks
[
clk_out_3
]
=
clk
;
/* blink */
writel_relaxed
(
0
,
pmc_base
+
PMC_BLINK_TIMER
);
clk
=
clk_register_gate
(
NULL
,
"blink_override"
,
"clk_32k"
,
0
,
pmc_base
+
PMC_DPD_PADS_ORIDE
,
PMC_DPD_PADS_ORIDE_BLINK_ENB
,
0
,
NULL
);
clk
=
clk_register_gate
(
NULL
,
"blink"
,
"blink_override"
,
0
,
pmc_base
+
PMC_CTRL
,
PMC_CTRL_BLINK_ENB
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"blink"
,
NULL
);
clks
[
blink
]
=
clk
;
CLK_GET_RATE_NOCACHE
,
&
pll_e_params
,
NULL
);
clks
[
TEGRA30_CLK_PLL_E
]
=
clk
;
}
static
const
char
*
cclk_g_parents
[]
=
{
"clk_m"
,
"pll_c"
,
"clk_32k"
,
"pll_m"
,
...
...
@@ -1332,8 +1045,7 @@ static void __init tegra30_super_clk_init(void)
CLK_SET_RATE_PARENT
,
clk_base
+
CCLKG_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"cclk_g"
,
NULL
);
clks
[
cclk_g
]
=
clk
;
clks
[
TEGRA30_CLK_CCLK_G
]
=
clk
;
/*
* Clock input to cclk_lp divided from pll_p using
...
...
@@ -1369,8 +1081,7 @@ static void __init tegra30_super_clk_init(void)
clk_base
+
CCLKLP_BURST_POLICY
,
TEGRA_DIVIDER_2
,
4
,
8
,
9
,
NULL
);
clk_register_clkdev
(
clk
,
"cclk_lp"
,
NULL
);
clks
[
cclk_lp
]
=
clk
;
clks
[
TEGRA30_CLK_CCLK_LP
]
=
clk
;
/* SCLK */
clk
=
tegra_clk_register_super_mux
(
"sclk"
,
sclk_parents
,
...
...
@@ -1378,142 +1089,44 @@ static void __init tegra30_super_clk_init(void)
CLK_SET_RATE_PARENT
,
clk_base
+
SCLK_BURST_POLICY
,
0
,
4
,
0
,
0
,
NULL
);
clk_register_clkdev
(
clk
,
"sclk"
,
NULL
);
clks
[
sclk
]
=
clk
;
/* HCLK */
clk
=
clk_register_divider
(
NULL
,
"hclk_div"
,
"sclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
4
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"hclk"
,
"hclk_div"
,
CLK_SET_RATE_PARENT
,
clk_base
+
SYSTEM_CLK_RATE
,
7
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"hclk"
,
NULL
);
clks
[
hclk
]
=
clk
;
/* PCLK */
clk
=
clk_register_divider
(
NULL
,
"pclk_div"
,
"hclk"
,
0
,
clk_base
+
SYSTEM_CLK_RATE
,
0
,
2
,
0
,
&
sysrate_lock
);
clk
=
clk_register_gate
(
NULL
,
"pclk"
,
"pclk_div"
,
CLK_SET_RATE_PARENT
,
clk_base
+
SYSTEM_CLK_RATE
,
3
,
CLK_GATE_SET_TO_DISABLE
,
&
sysrate_lock
);
clk_register_clkdev
(
clk
,
"pclk"
,
NULL
);
clks
[
pclk
]
=
clk
;
clks
[
TEGRA30_CLK_SCLK
]
=
clk
;
/* twd */
clk
=
clk_register_fixed_factor
(
NULL
,
"twd"
,
"cclk_g"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"twd"
,
NULL
);
clks
[
twd
]
=
clk
;
clks
[
TEGRA30_CLK_TWD
]
=
clk
;
tegra_super_clk_gen4_init
(
clk_base
,
pmc_base
,
tegra30_clks
,
NULL
);
}
static
const
char
*
mux_pllacp_clkm
[]
=
{
"pll_a_out0"
,
"unused"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
mux_pllpcm_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
,
"clk_m"
};
static
const
char
*
mux_pllmcp_clkm
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
i2s0_parents
[]
=
{
"pll_a_out0"
,
"audio0_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
i2s1_parents
[]
=
{
"pll_a_out0"
,
"audio1_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
i2s2_parents
[]
=
{
"pll_a_out0"
,
"audio2_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
i2s3_parents
[]
=
{
"pll_a_out0"
,
"audio3_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
i2s4_parents
[]
=
{
"pll_a_out0"
,
"audio4_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
spdif_out_parents
[]
=
{
"pll_a_out0"
,
"spdif_2x"
,
"pll_p"
,
"clk_m"
};
static
const
char
*
spdif_in_parents
[]
=
{
"pll_p"
,
"pll_c"
,
"pll_m"
};
static
const
char
*
mux_pllpc_clk32k_clkm
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_32k"
,
"clk_m"
};
static
const
char
*
mux_pllpc_clkm_clk32k
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_m"
,
"clk_32k"
};
static
const
char
*
mux_pllmcpa
[]
=
{
"pll_m"
,
"pll_c"
,
"pll_p"
,
"pll_a_out0"
};
static
const
char
*
mux_pllpdc_clkm
[]
=
{
"pll_p"
,
"pll_d_out0"
,
"pll_c"
,
"clk_m"
};
static
const
char
*
mux_pllp_clkm
[]
=
{
"pll_p"
,
"unused"
,
"unused"
,
"clk_m"
};
static
const
char
*
mux_pllpmdacd2_clkm
[]
=
{
"pll_p"
,
"pll_m"
,
"pll_d_out0"
,
"pll_a_out0"
,
"pll_c"
,
"pll_d2_out0"
,
"clk_m"
};
static
const
char
*
mux_plla_clk32k_pllp_clkm_plle
[]
=
{
"pll_a_out0"
,
"clk_32k"
,
"pll_p"
,
"clk_m"
,
"pll_e"
};
static
const
char
*
mux_plld_out0_plld2_out0
[]
=
{
"pll_d_out0"
,
"pll_d2_out0"
};
static
const
char
*
pwm_parents
[]
=
{
"pll_p"
,
"pll_c"
,
"clk_32k"
,
"clk_m"
};
static
struct
tegra_periph_init_data
tegra_periph_clk_list
[]
=
{
TEGRA_INIT_DATA_MUX
(
"i2s0"
,
NULL
,
"tegra30-i2s.0"
,
i2s0_parents
,
CLK_SOURCE_I2S0
,
30
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s0
),
TEGRA_INIT_DATA_MUX
(
"i2s1"
,
NULL
,
"tegra30-i2s.1"
,
i2s1_parents
,
CLK_SOURCE_I2S1
,
11
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s1
),
TEGRA_INIT_DATA_MUX
(
"i2s2"
,
NULL
,
"tegra30-i2s.2"
,
i2s2_parents
,
CLK_SOURCE_I2S2
,
18
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2s2
),
TEGRA_INIT_DATA_MUX
(
"i2s3"
,
NULL
,
"tegra30-i2s.3"
,
i2s3_parents
,
CLK_SOURCE_I2S3
,
101
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
i2s3
),
TEGRA_INIT_DATA_MUX
(
"i2s4"
,
NULL
,
"tegra30-i2s.4"
,
i2s4_parents
,
CLK_SOURCE_I2S4
,
102
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
i2s4
),
TEGRA_INIT_DATA_MUX
(
"spdif_out"
,
"spdif_out"
,
"tegra30-spdif"
,
spdif_out_parents
,
CLK_SOURCE_SPDIF_OUT
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_out
),
TEGRA_INIT_DATA_MUX
(
"spdif_in"
,
"spdif_in"
,
"tegra30-spdif"
,
spdif_in_parents
,
CLK_SOURCE_SPDIF_IN
,
10
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
spdif_in
),
TEGRA_INIT_DATA_MUX
(
"d_audio"
,
"d_audio"
,
"tegra30-ahub"
,
mux_pllacp_clkm
,
CLK_SOURCE_D_AUDIO
,
106
,
&
periph_v_regs
,
0
,
d_audio
),
TEGRA_INIT_DATA_MUX
(
"dam0"
,
NULL
,
"tegra30-dam.0"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM0
,
108
,
&
periph_v_regs
,
0
,
dam0
),
TEGRA_INIT_DATA_MUX
(
"dam1"
,
NULL
,
"tegra30-dam.1"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM1
,
109
,
&
periph_v_regs
,
0
,
dam1
),
TEGRA_INIT_DATA_MUX
(
"dam2"
,
NULL
,
"tegra30-dam.2"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM2
,
110
,
&
periph_v_regs
,
0
,
dam2
),
TEGRA_INIT_DATA_MUX
(
"hda"
,
"hda"
,
"tegra30-hda"
,
mux_pllpcm_clkm
,
CLK_SOURCE_HDA
,
125
,
&
periph_v_regs
,
0
,
hda
),
TEGRA_INIT_DATA_MUX
(
"hda2codec_2x"
,
"hda2codec"
,
"tegra30-hda"
,
mux_pllpcm_clkm
,
CLK_SOURCE_HDA2CODEC_2X
,
111
,
&
periph_v_regs
,
0
,
hda2codec_2x
),
TEGRA_INIT_DATA_MUX
(
"sbc1"
,
NULL
,
"spi_tegra.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC1
,
41
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc1
),
TEGRA_INIT_DATA_MUX
(
"sbc2"
,
NULL
,
"spi_tegra.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC2
,
44
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc2
),
TEGRA_INIT_DATA_MUX
(
"sbc3"
,
NULL
,
"spi_tegra.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC3
,
46
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
sbc3
),
TEGRA_INIT_DATA_MUX
(
"sbc4"
,
NULL
,
"spi_tegra.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC4
,
68
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
sbc4
),
TEGRA_INIT_DATA_MUX
(
"sbc5"
,
NULL
,
"spi_tegra.4"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC5
,
104
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sbc5
),
TEGRA_INIT_DATA_MUX
(
"sbc6"
,
NULL
,
"spi_tegra.5"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SBC6
,
105
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sbc6
),
TEGRA_INIT_DATA_MUX
(
"sata_oob"
,
NULL
,
"tegra_sata_oob"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SATA_OOB
,
123
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sata_oob
),
TEGRA_INIT_DATA_MUX
(
"sata"
,
NULL
,
"tegra_sata"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SATA
,
124
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
sata
),
TEGRA_INIT_DATA_MUX
(
"ndflash"
,
NULL
,
"tegra_nand"
,
mux_pllpcm_clkm
,
CLK_SOURCE_NDFLASH
,
13
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
ndflash
),
TEGRA_INIT_DATA_MUX
(
"ndspeed"
,
NULL
,
"tegra_nand_speed"
,
mux_pllpcm_clkm
,
CLK_SOURCE_NDSPEED
,
80
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
ndspeed
),
TEGRA_INIT_DATA_MUX
(
"vfir"
,
NULL
,
"vfir"
,
mux_pllpcm_clkm
,
CLK_SOURCE_VFIR
,
7
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
vfir
),
TEGRA_INIT_DATA_MUX
(
"csite"
,
NULL
,
"csite"
,
mux_pllpcm_clkm
,
CLK_SOURCE_CSITE
,
73
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
csite
),
TEGRA_INIT_DATA_MUX
(
"la"
,
NULL
,
"la"
,
mux_pllpcm_clkm
,
CLK_SOURCE_LA
,
76
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
la
),
TEGRA_INIT_DATA_MUX
(
"owr"
,
NULL
,
"tegra_w1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_OWR
,
71
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
owr
),
TEGRA_INIT_DATA_MUX
(
"mipi"
,
NULL
,
"mipi"
,
mux_pllpcm_clkm
,
CLK_SOURCE_MIPI
,
50
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
mipi
),
TEGRA_INIT_DATA_MUX
(
"tsensor"
,
NULL
,
"tegra-tsensor"
,
mux_pllpc_clkm_clk32k
,
CLK_SOURCE_TSENSOR
,
100
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
tsensor
),
TEGRA_INIT_DATA_MUX
(
"i2cslow"
,
NULL
,
"i2cslow"
,
mux_pllpc_clk32k_clkm
,
CLK_SOURCE_I2CSLOW
,
81
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
i2cslow
),
TEGRA_INIT_DATA_INT
(
"vde"
,
NULL
,
"vde"
,
mux_pllpcm_clkm
,
CLK_SOURCE_VDE
,
61
,
&
periph_h_regs
,
0
,
vde
),
TEGRA_INIT_DATA_INT
(
"vi"
,
"vi"
,
"tegra_camera"
,
mux_pllmcpa
,
CLK_SOURCE_VI
,
20
,
&
periph_l_regs
,
0
,
vi
),
TEGRA_INIT_DATA_INT
(
"epp"
,
NULL
,
"epp"
,
mux_pllmcpa
,
CLK_SOURCE_EPP
,
19
,
&
periph_l_regs
,
0
,
epp
),
TEGRA_INIT_DATA_INT
(
"mpe"
,
NULL
,
"mpe"
,
mux_pllmcpa
,
CLK_SOURCE_MPE
,
60
,
&
periph_h_regs
,
0
,
mpe
),
TEGRA_INIT_DATA_INT
(
"host1x"
,
NULL
,
"host1x"
,
mux_pllmcpa
,
CLK_SOURCE_HOST1X
,
28
,
&
periph_l_regs
,
0
,
host1x
),
TEGRA_INIT_DATA_INT
(
"3d"
,
NULL
,
"3d"
,
mux_pllmcpa
,
CLK_SOURCE_3D
,
24
,
&
periph_l_regs
,
TEGRA_PERIPH_MANUAL_RESET
,
gr3d
),
TEGRA_INIT_DATA_INT
(
"3d2"
,
NULL
,
"3d2"
,
mux_pllmcpa
,
CLK_SOURCE_3D2
,
98
,
&
periph_v_regs
,
TEGRA_PERIPH_MANUAL_RESET
,
gr3d2
),
TEGRA_INIT_DATA_INT
(
"2d"
,
NULL
,
"2d"
,
mux_pllmcpa
,
CLK_SOURCE_2D
,
21
,
&
periph_l_regs
,
0
,
gr2d
),
TEGRA_INIT_DATA_INT
(
"se"
,
NULL
,
"se"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SE
,
127
,
&
periph_v_regs
,
0
,
se
),
TEGRA_INIT_DATA_MUX
(
"mselect"
,
NULL
,
"mselect"
,
mux_pllp_clkm
,
CLK_SOURCE_MSELECT
,
99
,
&
periph_v_regs
,
0
,
mselect
),
TEGRA_INIT_DATA_MUX
(
"nor"
,
NULL
,
"tegra-nor"
,
mux_pllpcm_clkm
,
CLK_SOURCE_NOR
,
42
,
&
periph_h_regs
,
0
,
nor
),
TEGRA_INIT_DATA_MUX
(
"sdmmc1"
,
NULL
,
"sdhci-tegra.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC1
,
14
,
&
periph_l_regs
,
0
,
sdmmc1
),
TEGRA_INIT_DATA_MUX
(
"sdmmc2"
,
NULL
,
"sdhci-tegra.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC2
,
9
,
&
periph_l_regs
,
0
,
sdmmc2
),
TEGRA_INIT_DATA_MUX
(
"sdmmc3"
,
NULL
,
"sdhci-tegra.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC3
,
69
,
&
periph_u_regs
,
0
,
sdmmc3
),
TEGRA_INIT_DATA_MUX
(
"sdmmc4"
,
NULL
,
"sdhci-tegra.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SDMMC4
,
15
,
&
periph_l_regs
,
0
,
sdmmc4
),
TEGRA_INIT_DATA_MUX
(
"cve"
,
NULL
,
"cve"
,
mux_pllpdc_clkm
,
CLK_SOURCE_CVE
,
49
,
&
periph_h_regs
,
0
,
cve
),
TEGRA_INIT_DATA_MUX
(
"tvo"
,
NULL
,
"tvo"
,
mux_pllpdc_clkm
,
CLK_SOURCE_TVO
,
49
,
&
periph_h_regs
,
0
,
tvo
),
TEGRA_INIT_DATA_MUX
(
"tvdac"
,
NULL
,
"tvdac"
,
mux_pllpdc_clkm
,
CLK_SOURCE_TVDAC
,
53
,
&
periph_h_regs
,
0
,
tvdac
),
TEGRA_INIT_DATA_MUX
(
"actmon"
,
NULL
,
"actmon"
,
mux_pllpc_clk32k_clkm
,
CLK_SOURCE_ACTMON
,
119
,
&
periph_v_regs
,
0
,
actmon
),
TEGRA_INIT_DATA_MUX
(
"vi_sensor"
,
"vi_sensor"
,
"tegra_camera"
,
mux_pllmcpa
,
CLK_SOURCE_VI_SENSOR
,
20
,
&
periph_l_regs
,
TEGRA_PERIPH_NO_RESET
,
vi_sensor
),
TEGRA_INIT_DATA_DIV16
(
"i2c1"
,
"div-clk"
,
"tegra-i2c.0"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C1
,
12
,
&
periph_l_regs
,
TEGRA_PERIPH_ON_APB
,
i2c1
),
TEGRA_INIT_DATA_DIV16
(
"i2c2"
,
"div-clk"
,
"tegra-i2c.1"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C2
,
54
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
i2c2
),
TEGRA_INIT_DATA_DIV16
(
"i2c3"
,
"div-clk"
,
"tegra-i2c.2"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C3
,
67
,
&
periph_u_regs
,
TEGRA_PERIPH_ON_APB
,
i2c3
),
TEGRA_INIT_DATA_DIV16
(
"i2c4"
,
"div-clk"
,
"tegra-i2c.3"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C4
,
103
,
&
periph_v_regs
,
TEGRA_PERIPH_ON_APB
,
i2c4
),
TEGRA_INIT_DATA_DIV16
(
"i2c5"
,
"div-clk"
,
"tegra-i2c.4"
,
mux_pllp_clkm
,
CLK_SOURCE_I2C5
,
47
,
&
periph_h_regs
,
TEGRA_PERIPH_ON_APB
,
i2c5
),
TEGRA_INIT_DATA_UART
(
"uarta"
,
NULL
,
"tegra_uart.0"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTA
,
6
,
&
periph_l_regs
,
uarta
),
TEGRA_INIT_DATA_UART
(
"uartb"
,
NULL
,
"tegra_uart.1"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTB
,
7
,
&
periph_l_regs
,
uartb
),
TEGRA_INIT_DATA_UART
(
"uartc"
,
NULL
,
"tegra_uart.2"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTC
,
55
,
&
periph_h_regs
,
uartc
),
TEGRA_INIT_DATA_UART
(
"uartd"
,
NULL
,
"tegra_uart.3"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTD
,
65
,
&
periph_u_regs
,
uartd
),
TEGRA_INIT_DATA_UART
(
"uarte"
,
NULL
,
"tegra_uart.4"
,
mux_pllpcm_clkm
,
CLK_SOURCE_UARTE
,
66
,
&
periph_u_regs
,
uarte
),
TEGRA_INIT_DATA_MUX8
(
"hdmi"
,
NULL
,
"hdmi"
,
mux_pllpmdacd2_clkm
,
CLK_SOURCE_HDMI
,
51
,
&
periph_h_regs
,
0
,
hdmi
),
TEGRA_INIT_DATA_MUX8
(
"extern1"
,
NULL
,
"extern1"
,
mux_plla_clk32k_pllp_clkm_plle
,
CLK_SOURCE_EXTERN1
,
120
,
&
periph_v_regs
,
0
,
extern1
),
TEGRA_INIT_DATA_MUX8
(
"extern2"
,
NULL
,
"extern2"
,
mux_plla_clk32k_pllp_clkm_plle
,
CLK_SOURCE_EXTERN2
,
121
,
&
periph_v_regs
,
0
,
extern2
),
TEGRA_INIT_DATA_MUX8
(
"extern3"
,
NULL
,
"extern3"
,
mux_plla_clk32k_pllp_clkm_plle
,
CLK_SOURCE_EXTERN3
,
122
,
&
periph_v_regs
,
0
,
extern3
),
TEGRA_INIT_DATA
(
"pwm"
,
NULL
,
"pwm"
,
mux_pllpc_clk32k_clkm
,
CLK_SOURCE_PWM
,
28
,
2
,
0
,
0
,
8
,
1
,
0
,
&
periph_l_regs
,
17
,
periph_clk_enb_refcnt
,
0
,
pwm
),
TEGRA_INIT_DATA_MUX
(
"spdif_out"
,
spdif_out_parents
,
CLK_SOURCE_SPDIF_OUT
,
10
,
TEGRA_PERIPH_ON_APB
,
TEGRA30_CLK_SPDIF_OUT
),
TEGRA_INIT_DATA_MUX
(
"d_audio"
,
mux_pllacp_clkm
,
CLK_SOURCE_D_AUDIO
,
106
,
0
,
TEGRA30_CLK_D_AUDIO
),
TEGRA_INIT_DATA_MUX
(
"dam0"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM0
,
108
,
0
,
TEGRA30_CLK_DAM0
),
TEGRA_INIT_DATA_MUX
(
"dam1"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM1
,
109
,
0
,
TEGRA30_CLK_DAM1
),
TEGRA_INIT_DATA_MUX
(
"dam2"
,
mux_pllacp_clkm
,
CLK_SOURCE_DAM2
,
110
,
0
,
TEGRA30_CLK_DAM2
),
TEGRA_INIT_DATA_INT
(
"3d2"
,
mux_pllmcpa
,
CLK_SOURCE_3D2
,
98
,
TEGRA_PERIPH_MANUAL_RESET
,
TEGRA30_CLK_GR3D2
),
TEGRA_INIT_DATA_INT
(
"se"
,
mux_pllpcm_clkm
,
CLK_SOURCE_SE
,
127
,
0
,
TEGRA30_CLK_SE
),
TEGRA_INIT_DATA_MUX8
(
"hdmi"
,
mux_pllpmdacd2_clkm
,
CLK_SOURCE_HDMI
,
51
,
0
,
TEGRA30_CLK_HDMI
),
TEGRA_INIT_DATA
(
"pwm"
,
NULL
,
NULL
,
pwm_parents
,
CLK_SOURCE_PWM
,
28
,
2
,
0
,
0
,
8
,
1
,
0
,
17
,
TEGRA_PERIPH_ON_APB
,
TEGRA30_CLK_PWM
),
};
static
struct
tegra_periph_init_data
tegra_periph_nodiv_clk_list
[]
=
{
TEGRA_INIT_DATA_NODIV
(
"disp1"
,
NULL
,
"tegradc.0"
,
mux_pllpmdacd2_clkm
,
CLK_SOURCE_DISP1
,
29
,
3
,
27
,
&
periph_l_regs
,
0
,
disp1
),
TEGRA_INIT_DATA_NODIV
(
"disp2"
,
NULL
,
"tegradc.1"
,
mux_pllpmdacd2_clkm
,
CLK_SOURCE_DISP2
,
29
,
3
,
26
,
&
periph_l_regs
,
0
,
disp2
),
TEGRA_INIT_DATA_NODIV
(
"dsib"
,
NULL
,
"tegradc.1"
,
mux_plld_out0_plld2_out0
,
CLK_SOURCE_DSIB
,
25
,
1
,
82
,
&
periph_u_regs
,
0
,
dsib
),
TEGRA_INIT_DATA_NODIV
(
"dsib"
,
mux_plld_out0_plld2_out0
,
CLK_SOURCE_DSIB
,
25
,
1
,
82
,
0
,
TEGRA30_CLK_DSIB
),
};
static
void
__init
tegra30_periph_clk_init
(
void
)
...
...
@@ -1522,170 +1135,25 @@ static void __init tegra30_periph_clk_init(void)
struct
clk
*
clk
;
int
i
;
/* apbdma */
clk
=
tegra_clk_register_periph_gate
(
"apbdma"
,
"clk_m"
,
0
,
clk_base
,
0
,
34
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-apbdma"
);
clks
[
apbdma
]
=
clk
;
/* rtc */
clk
=
tegra_clk_register_periph_gate
(
"rtc"
,
"clk_32k"
,
TEGRA_PERIPH_NO_RESET
|
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
4
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"rtc-tegra"
);
clks
[
rtc
]
=
clk
;
/* timer */
clk
=
tegra_clk_register_periph_gate
(
"timer"
,
"clk_m"
,
0
,
clk_base
,
0
,
5
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"timer"
);
clks
[
timer
]
=
clk
;
/* kbc */
clk
=
tegra_clk_register_periph_gate
(
"kbc"
,
"clk_32k"
,
TEGRA_PERIPH_NO_RESET
|
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
36
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-kbc"
);
clks
[
kbc
]
=
clk
;
/* csus */
clk
=
tegra_clk_register_periph_gate
(
"csus"
,
"clk_m"
,
TEGRA_PERIPH_NO_RESET
|
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
92
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"csus"
,
"tengra_camera"
);
clks
[
csus
]
=
clk
;
/* vcp */
clk
=
tegra_clk_register_periph_gate
(
"vcp"
,
"clk_m"
,
0
,
clk_base
,
0
,
29
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"vcp"
,
"tegra-avp"
);
clks
[
vcp
]
=
clk
;
/* bsea */
clk
=
tegra_clk_register_periph_gate
(
"bsea"
,
"clk_m"
,
0
,
clk_base
,
0
,
62
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"bsea"
,
"tegra-avp"
);
clks
[
bsea
]
=
clk
;
/* bsev */
clk
=
tegra_clk_register_periph_gate
(
"bsev"
,
"clk_m"
,
0
,
clk_base
,
0
,
63
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"bsev"
,
"tegra-aes"
);
clks
[
bsev
]
=
clk
;
/* usbd */
clk
=
tegra_clk_register_periph_gate
(
"usbd"
,
"clk_m"
,
0
,
clk_base
,
0
,
22
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"fsl-tegra-udc"
);
clks
[
usbd
]
=
clk
;
/* usb2 */
clk
=
tegra_clk_register_periph_gate
(
"usb2"
,
"clk_m"
,
0
,
clk_base
,
0
,
58
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-ehci.1"
);
clks
[
usb2
]
=
clk
;
/* usb3 */
clk
=
tegra_clk_register_periph_gate
(
"usb3"
,
"clk_m"
,
0
,
clk_base
,
0
,
59
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra-ehci.2"
);
clks
[
usb3
]
=
clk
;
/* dsia */
clk
=
tegra_clk_register_periph_gate
(
"dsia"
,
"pll_d_out0"
,
0
,
clk_base
,
0
,
48
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"dsia"
,
"tegradc.0"
);
clks
[
dsia
]
=
clk
;
/* csi */
clk
=
tegra_clk_register_periph_gate
(
"csi"
,
"pll_p_out3"
,
0
,
clk_base
,
0
,
52
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"csi"
,
"tegra_camera"
);
clks
[
csi
]
=
clk
;
/* isp */
clk
=
tegra_clk_register_periph_gate
(
"isp"
,
"clk_m"
,
0
,
clk_base
,
0
,
23
,
&
periph_l_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"isp"
,
"tegra_camera"
);
clks
[
isp
]
=
clk
;
0
,
48
,
periph_clk_enb_refcnt
);
clks
[
TEGRA30_CLK_DSIA
]
=
clk
;
/* pcie */
clk
=
tegra_clk_register_periph_gate
(
"pcie"
,
"clk_m"
,
0
,
clk_base
,
0
,
70
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"pcie"
,
"tegra-pcie"
);
clks
[
pcie
]
=
clk
;
70
,
periph_clk_enb_refcnt
);
clks
[
TEGRA30_CLK_PCIE
]
=
clk
;
/* afi */
clk
=
tegra_clk_register_periph_gate
(
"afi"
,
"clk_m"
,
0
,
clk_base
,
0
,
72
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"afi"
,
"tegra-pcie"
);
clks
[
afi
]
=
clk
;
periph_clk_enb_refcnt
);
clks
[
TEGRA30_CLK_AFI
]
=
clk
;
/* pciex */
clk
=
tegra_clk_register_periph_gate
(
"pciex"
,
"pll_e"
,
0
,
clk_base
,
0
,
74
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"pciex"
,
"tegra-pcie"
);
clks
[
pciex
]
=
clk
;
/* kfuse */
clk
=
tegra_clk_register_periph_gate
(
"kfuse"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
40
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"kfuse-tegra"
);
clks
[
kfuse
]
=
clk
;
/* fuse */
clk
=
tegra_clk_register_periph_gate
(
"fuse"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
39
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"fuse"
,
"fuse-tegra"
);
clks
[
fuse
]
=
clk
;
/* fuse_burn */
clk
=
tegra_clk_register_periph_gate
(
"fuse_burn"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
39
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"fuse_burn"
,
"fuse-tegra"
);
clks
[
fuse_burn
]
=
clk
;
/* apbif */
clk
=
tegra_clk_register_periph_gate
(
"apbif"
,
"clk_m"
,
0
,
clk_base
,
0
,
107
,
&
periph_v_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"apbif"
,
"tegra30-ahub"
);
clks
[
apbif
]
=
clk
;
/* hda2hdmi */
clk
=
tegra_clk_register_periph_gate
(
"hda2hdmi"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
128
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"hda2hdmi"
,
"tegra30-hda"
);
clks
[
hda2hdmi
]
=
clk
;
/* sata_cold */
clk
=
tegra_clk_register_periph_gate
(
"sata_cold"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
129
,
&
periph_w_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"tegra_sata_cold"
);
clks
[
sata_cold
]
=
clk
;
/* dtv */
clk
=
tegra_clk_register_periph_gate
(
"dtv"
,
"clk_m"
,
TEGRA_PERIPH_ON_APB
,
clk_base
,
0
,
79
,
&
periph_u_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
NULL
,
"dtv"
);
clks
[
dtv
]
=
clk
;
74
,
periph_clk_enb_refcnt
);
clks
[
TEGRA30_CLK_PCIEX
]
=
clk
;
/* emc */
clk
=
clk_register_mux
(
NULL
,
"emc_mux"
,
mux_pllmcp_clkm
,
...
...
@@ -1694,84 +1162,37 @@ static void __init tegra30_periph_clk_init(void)
clk_base
+
CLK_SOURCE_EMC
,
30
,
2
,
0
,
NULL
);
clk
=
tegra_clk_register_periph_gate
(
"emc"
,
"emc_mux"
,
0
,
clk_base
,
0
,
57
,
&
periph_h_regs
,
periph_clk_enb_refcnt
);
clk_register_clkdev
(
clk
,
"emc"
,
NULL
);
clks
[
emc
]
=
clk
;
57
,
periph_clk_enb_refcnt
);
clks
[
TEGRA30_CLK_EMC
]
=
clk
;
/* cml0 */
clk
=
clk_register_gate
(
NULL
,
"cml0"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
0
,
0
,
&
cml_lock
);
clks
[
TEGRA30_CLK_CML0
]
=
clk
;
/* cml1 */
clk
=
clk_register_gate
(
NULL
,
"cml1"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
1
,
0
,
&
cml_lock
);
clks
[
TEGRA30_CLK_CML1
]
=
clk
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_clk_list
);
i
++
)
{
data
=
&
tegra_periph_clk_list
[
i
];
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
parent_names
,
clk
=
tegra_clk_register_periph
(
data
->
name
,
data
->
p
.
p
arent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
,
data
->
flags
);
clk_register_clkdev
(
clk
,
data
->
con_id
,
data
->
dev_id
);
clks
[
data
->
clk_id
]
=
clk
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tegra_periph_nodiv_clk_list
);
i
++
)
{
data
=
&
tegra_periph_nodiv_clk_list
[
i
];
clk
=
tegra_clk_register_periph_nodiv
(
data
->
name
,
data
->
parent_names
,
data
->
p
.
p
arent_names
,
data
->
num_parents
,
&
data
->
periph
,
clk_base
,
data
->
offset
);
clk_register_clkdev
(
clk
,
data
->
con_id
,
data
->
dev_id
);
clks
[
data
->
clk_id
]
=
clk
;
}
}
static
void
__init
tegra30_fixed_clk_init
(
void
)
{
struct
clk
*
clk
;
/* clk_32k */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_32k"
,
NULL
,
CLK_IS_ROOT
,
32768
);
clk_register_clkdev
(
clk
,
"clk_32k"
,
NULL
);
clks
[
clk_32k
]
=
clk
;
/* clk_m_div2 */
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div2"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
2
);
clk_register_clkdev
(
clk
,
"clk_m_div2"
,
NULL
);
clks
[
clk_m_div2
]
=
clk
;
/* clk_m_div4 */
clk
=
clk_register_fixed_factor
(
NULL
,
"clk_m_div4"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
4
);
clk_register_clkdev
(
clk
,
"clk_m_div4"
,
NULL
);
clks
[
clk_m_div4
]
=
clk
;
/* cml0 */
clk
=
clk_register_gate
(
NULL
,
"cml0"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
0
,
0
,
&
cml_lock
);
clk_register_clkdev
(
clk
,
"cml0"
,
NULL
);
clks
[
cml0
]
=
clk
;
/* cml1 */
clk
=
clk_register_gate
(
NULL
,
"cml1"
,
"pll_e"
,
0
,
clk_base
+
PLLE_AUX
,
1
,
0
,
&
cml_lock
);
clk_register_clkdev
(
clk
,
"cml1"
,
NULL
);
clks
[
cml1
]
=
clk
;
}
static
void
__init
tegra30_osc_clk_init
(
void
)
{
struct
clk
*
clk
;
unsigned
int
pll_ref_div
;
tegra30_clk_measure_input_freq
();
/* clk_m */
clk
=
clk_register_fixed_rate
(
NULL
,
"clk_m"
,
NULL
,
CLK_IS_ROOT
,
input_freq
);
clk_register_clkdev
(
clk
,
"clk_m"
,
NULL
);
clks
[
clk_m
]
=
clk
;
/* pll_ref */
pll_ref_div
=
tegra30_get_pll_ref_div
();
clk
=
clk_register_fixed_factor
(
NULL
,
"pll_ref"
,
"clk_m"
,
CLK_SET_RATE_PARENT
,
1
,
pll_ref_div
);
clk_register_clkdev
(
clk
,
"pll_ref"
,
NULL
);
clks
[
pll_ref
]
=
clk
;
tegra_periph_clk_init
(
clk_base
,
pmc_base
,
tegra30_clks
,
&
pll_p_params
);
}
/* Tegra30 CPU clock and reset control functions */
...
...
@@ -1913,48 +1334,49 @@ static struct tegra_cpu_car_ops tegra30_cpu_car_ops = {
};
static
struct
tegra_clk_init_table
init_table
[]
__initdata
=
{
{
uarta
,
pll_p
,
408000000
,
0
},
{
uartb
,
pll_p
,
408000000
,
0
},
{
uartc
,
pll_p
,
408000000
,
0
},
{
uartd
,
pll_p
,
408000000
,
0
},
{
uarte
,
pll_p
,
408000000
,
0
},
{
pll_a
,
clk_max
,
564480000
,
1
},
{
pll_a_out0
,
clk_max
,
11289600
,
1
},
{
extern1
,
pll_a_out0
,
0
,
1
},
{
clk_out_1_mux
,
extern1
,
0
,
0
},
{
clk_out_1
,
clk_max
,
0
,
1
},
{
blink
,
clk_max
,
0
,
1
},
{
i2s0
,
pll_a_out0
,
11289600
,
0
},
{
i2s1
,
pll_a_out0
,
11289600
,
0
},
{
i2s2
,
pll_a_out0
,
11289600
,
0
},
{
i2s3
,
pll_a_out0
,
11289600
,
0
},
{
i2s4
,
pll_a_out0
,
11289600
,
0
},
{
sdmmc1
,
pll_p
,
48000000
,
0
},
{
sdmmc2
,
pll_p
,
48000000
,
0
},
{
sdmmc3
,
pll_p
,
48000000
,
0
},
{
pll_m
,
clk_max
,
0
,
1
},
{
pclk
,
clk_max
,
0
,
1
},
{
csite
,
clk_max
,
0
,
1
},
{
emc
,
clk_max
,
0
,
1
},
{
mselect
,
clk_max
,
0
,
1
},
{
sbc1
,
pll_p
,
100000000
,
0
},
{
sbc2
,
pll_p
,
100000000
,
0
},
{
sbc3
,
pll_p
,
100000000
,
0
},
{
sbc4
,
pll_p
,
100000000
,
0
},
{
sbc5
,
pll_p
,
100000000
,
0
},
{
sbc6
,
pll_p
,
100000000
,
0
},
{
host1x
,
pll_c
,
150000000
,
0
},
{
disp1
,
pll_p
,
600000000
,
0
},
{
disp2
,
pll_p
,
600000000
,
0
},
{
twd
,
clk_max
,
0
,
1
},
{
gr2d
,
pll_c
,
300000000
,
0
},
{
gr3d
,
pll_c
,
300000000
,
0
},
{
clk_max
,
clk_max
,
0
,
0
},
/* This MUST be the last entry. */
{
TEGRA30_CLK_UARTA
,
TEGRA30_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA30_CLK_UARTB
,
TEGRA30_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA30_CLK_UARTC
,
TEGRA30_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA30_CLK_UARTD
,
TEGRA30_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA30_CLK_UARTE
,
TEGRA30_CLK_PLL_P
,
408000000
,
0
},
{
TEGRA30_CLK_PLL_A
,
TEGRA30_CLK_CLK_MAX
,
564480000
,
1
},
{
TEGRA30_CLK_PLL_A_OUT0
,
TEGRA30_CLK_CLK_MAX
,
11289600
,
1
},
{
TEGRA30_CLK_EXTERN1
,
TEGRA30_CLK_PLL_A_OUT0
,
0
,
1
},
{
TEGRA30_CLK_CLK_OUT_1_MUX
,
TEGRA30_CLK_EXTERN1
,
0
,
0
},
{
TEGRA30_CLK_CLK_OUT_1
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_BLINK
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_I2S0
,
TEGRA30_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA30_CLK_I2S1
,
TEGRA30_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA30_CLK_I2S2
,
TEGRA30_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA30_CLK_I2S3
,
TEGRA30_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA30_CLK_I2S4
,
TEGRA30_CLK_PLL_A_OUT0
,
11289600
,
0
},
{
TEGRA30_CLK_SDMMC1
,
TEGRA30_CLK_PLL_P
,
48000000
,
0
},
{
TEGRA30_CLK_SDMMC2
,
TEGRA30_CLK_PLL_P
,
48000000
,
0
},
{
TEGRA30_CLK_SDMMC3
,
TEGRA30_CLK_PLL_P
,
48000000
,
0
},
{
TEGRA30_CLK_PLL_M
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_PCLK
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_CSITE
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_EMC
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_MSELECT
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_SBC1
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_SBC2
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_SBC3
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_SBC4
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_SBC5
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_SBC6
,
TEGRA30_CLK_PLL_P
,
100000000
,
0
},
{
TEGRA30_CLK_HOST1X
,
TEGRA30_CLK_PLL_C
,
150000000
,
0
},
{
TEGRA30_CLK_DISP1
,
TEGRA30_CLK_PLL_P
,
600000000
,
0
},
{
TEGRA30_CLK_DISP2
,
TEGRA30_CLK_PLL_P
,
600000000
,
0
},
{
TEGRA30_CLK_TWD
,
TEGRA30_CLK_CLK_MAX
,
0
,
1
},
{
TEGRA30_CLK_GR2D
,
TEGRA30_CLK_PLL_C
,
300000000
,
0
},
{
TEGRA30_CLK_GR3D
,
TEGRA30_CLK_PLL_C
,
300000000
,
0
},
{
TEGRA30_CLK_GR3D2
,
TEGRA30_CLK_PLL_C
,
300000000
,
0
},
{
TEGRA30_CLK_CLK_MAX
,
TEGRA30_CLK_CLK_MAX
,
0
,
0
},
/* This MUST be the last entry. */
};
static
void
__init
tegra30_clock_apply_init_table
(
void
)
{
tegra_init_from_table
(
init_table
,
clks
,
clk_max
);
tegra_init_from_table
(
init_table
,
clks
,
TEGRA30_CLK_CLK_MAX
);
}
/*
...
...
@@ -1963,19 +1385,19 @@ static void __init tegra30_clock_apply_init_table(void)
* table under two names.
*/
static
struct
tegra_clk_duplicate
tegra_clk_duplicates
[]
=
{
TEGRA_CLK_DUPLICATE
(
usbd
,
"utmip-pad"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
usbd
,
"tegra-ehci.0"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
usbd
,
"tegra-otg"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
bsev
,
"tegra-avp"
,
"bsev"
),
TEGRA_CLK_DUPLICATE
(
bsev
,
"nvavp"
,
"bsev"
),
TEGRA_CLK_DUPLICATE
(
vde
,
"tegra-aes"
,
"vde"
),
TEGRA_CLK_DUPLICATE
(
bsea
,
"tegra-aes"
,
"bsea"
),
TEGRA_CLK_DUPLICATE
(
bsea
,
"nvavp"
,
"bsea"
),
TEGRA_CLK_DUPLICATE
(
cml
1
,
"tegra_sata_cml"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
cml
0
,
"tegra_pcie"
,
"cml"
),
TEGRA_CLK_DUPLICATE
(
pciex
,
"tegra_pcie"
,
"pciex"
),
TEGRA_CLK_DUPLICATE
(
vcp
,
"nvavp"
,
"vcp"
),
TEGRA_CLK_DUPLICATE
(
clk_max
,
NULL
,
NULL
),
/* MUST be the last entry */
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_USBD
,
"utmip-pad"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_USBD
,
"tegra-ehci.0"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_USBD
,
"tegra-otg"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_BSEV
,
"tegra-avp"
,
"bsev"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_BSEV
,
"nvavp"
,
"bsev"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_VDE
,
"tegra-aes"
,
"vde"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_BSEA
,
"tegra-aes"
,
"bsea"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_BSEA
,
"nvavp"
,
"bsea"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_CML
1
,
"tegra_sata_cml"
,
NULL
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_CML
0
,
"tegra_pcie"
,
"cml"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_PCIEX
,
"tegra_pcie"
,
"pciex"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_VCP
,
"nvavp"
,
"vcp"
),
TEGRA_CLK_DUPLICATE
(
TEGRA30_CLK_CLK_MAX
,
NULL
,
NULL
),
/* MUST be the last entry */
};
static
const
struct
of_device_id
pmc_match
[]
__initconst
=
{
...
...
@@ -1986,7 +1408,6 @@ static const struct of_device_id pmc_match[] __initconst = {
static
void
__init
tegra30_clock_init
(
struct
device_node
*
np
)
{
struct
device_node
*
node
;
int
i
;
clk_base
=
of_iomap
(
np
,
0
);
if
(
!
clk_base
)
{
...
...
@@ -2006,29 +1427,26 @@ static void __init tegra30_clock_init(struct device_node *np)
BUG
();
}
tegra30_osc_clk_init
();
tegra30_fixed_clk_init
();
clks
=
tegra_clk_init
(
TEGRA30_CLK_CLK_MAX
,
TEGRA30_CLK_PERIPH_BANKS
);
if
(
!
clks
)
return
;
if
(
tegra_osc_clk_init
(
clk_base
,
tegra30_clks
,
tegra30_input_freq
,
ARRAY_SIZE
(
tegra30_input_freq
),
&
input_freq
,
NULL
)
<
0
)
return
;
tegra_fixed_clk_init
(
tegra30_clks
);
tegra30_pll_init
();
tegra30_super_clk_init
();
tegra30_periph_clk_init
();
tegra30_audio_clk_init
();
tegra30_pmc_clk_init
();
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
clks
);
i
++
)
{
if
(
IS_ERR
(
clks
[
i
]))
{
pr_err
(
"Tegra30 clk %d: register failed with %ld
\n
"
,
i
,
PTR_ERR
(
clks
[
i
]));
BUG
();
}
if
(
!
clks
[
i
])
clks
[
i
]
=
ERR_PTR
(
-
EINVAL
);
}
tegra_audio_clk_init
(
clk_base
,
pmc_base
,
tegra30_clks
,
&
pll_a_params
);
tegra_pmc_clk_init
(
pmc_base
,
tegra30_clks
);
tegra_init_dup_clks
(
tegra_clk_duplicates
,
clks
,
clk_max
);
tegra_init_dup_clks
(
tegra_clk_duplicates
,
clks
,
TEGRA30_CLK_CLK_MAX
);
clk_data
.
clks
=
clks
;
clk_data
.
clk_num
=
ARRAY_SIZE
(
clks
);
of_clk_add_provider
(
np
,
of_clk_src_onecell_get
,
&
clk_data
);
tegra_add_of_provider
(
np
);
tegra_register_devclks
(
devclks
,
ARRAY_SIZE
(
devclks
));
tegra_clk_apply_init_table
=
tegra30_clock_apply_init_table
;
...
...
drivers/clk/tegra/clk.c
View file @
e9827d9b
...
...
@@ -21,10 +21,139 @@
#include "clk.h"
#define CLK_OUT_ENB_L 0x010
#define CLK_OUT_ENB_H 0x014
#define CLK_OUT_ENB_U 0x018
#define CLK_OUT_ENB_V 0x360
#define CLK_OUT_ENB_W 0x364
#define CLK_OUT_ENB_X 0x280
#define CLK_OUT_ENB_SET_L 0x320
#define CLK_OUT_ENB_CLR_L 0x324
#define CLK_OUT_ENB_SET_H 0x328
#define CLK_OUT_ENB_CLR_H 0x32c
#define CLK_OUT_ENB_SET_U 0x330
#define CLK_OUT_ENB_CLR_U 0x334
#define CLK_OUT_ENB_SET_V 0x440
#define CLK_OUT_ENB_CLR_V 0x444
#define CLK_OUT_ENB_SET_W 0x448
#define CLK_OUT_ENB_CLR_W 0x44c
#define CLK_OUT_ENB_SET_X 0x284
#define CLK_OUT_ENB_CLR_X 0x288
#define RST_DEVICES_L 0x004
#define RST_DEVICES_H 0x008
#define RST_DEVICES_U 0x00C
#define RST_DFLL_DVCO 0x2F4
#define RST_DEVICES_V 0x358
#define RST_DEVICES_W 0x35C
#define RST_DEVICES_X 0x28C
#define RST_DEVICES_SET_L 0x300
#define RST_DEVICES_CLR_L 0x304
#define RST_DEVICES_SET_H 0x308
#define RST_DEVICES_CLR_H 0x30c
#define RST_DEVICES_SET_U 0x310
#define RST_DEVICES_CLR_U 0x314
#define RST_DEVICES_SET_V 0x430
#define RST_DEVICES_CLR_V 0x434
#define RST_DEVICES_SET_W 0x438
#define RST_DEVICES_CLR_W 0x43c
#define RST_DEVICES_SET_X 0x290
#define RST_DEVICES_CLR_X 0x294
/* Global data of Tegra CPU CAR ops */
static
struct
tegra_cpu_car_ops
dummy_car_ops
;
struct
tegra_cpu_car_ops
*
tegra_cpu_car_ops
=
&
dummy_car_ops
;
int
*
periph_clk_enb_refcnt
;
static
int
periph_banks
;
static
struct
clk
**
clks
;
static
int
clk_num
;
static
struct
clk_onecell_data
clk_data
;
static
struct
tegra_clk_periph_regs
periph_regs
[]
=
{
[
0
]
=
{
.
enb_reg
=
CLK_OUT_ENB_L
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_L
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_L
,
.
rst_reg
=
RST_DEVICES_L
,
.
rst_set_reg
=
RST_DEVICES_SET_L
,
.
rst_clr_reg
=
RST_DEVICES_CLR_L
,
},
[
1
]
=
{
.
enb_reg
=
CLK_OUT_ENB_H
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_H
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_H
,
.
rst_reg
=
RST_DEVICES_H
,
.
rst_set_reg
=
RST_DEVICES_SET_H
,
.
rst_clr_reg
=
RST_DEVICES_CLR_H
,
},
[
2
]
=
{
.
enb_reg
=
CLK_OUT_ENB_U
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_U
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_U
,
.
rst_reg
=
RST_DEVICES_U
,
.
rst_set_reg
=
RST_DEVICES_SET_U
,
.
rst_clr_reg
=
RST_DEVICES_CLR_U
,
},
[
3
]
=
{
.
enb_reg
=
CLK_OUT_ENB_V
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_V
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_V
,
.
rst_reg
=
RST_DEVICES_V
,
.
rst_set_reg
=
RST_DEVICES_SET_V
,
.
rst_clr_reg
=
RST_DEVICES_CLR_V
,
},
[
4
]
=
{
.
enb_reg
=
CLK_OUT_ENB_W
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_W
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_W
,
.
rst_reg
=
RST_DEVICES_W
,
.
rst_set_reg
=
RST_DEVICES_SET_W
,
.
rst_clr_reg
=
RST_DEVICES_CLR_W
,
},
[
5
]
=
{
.
enb_reg
=
CLK_OUT_ENB_X
,
.
enb_set_reg
=
CLK_OUT_ENB_SET_X
,
.
enb_clr_reg
=
CLK_OUT_ENB_CLR_X
,
.
rst_reg
=
RST_DEVICES_X
,
.
rst_set_reg
=
RST_DEVICES_SET_X
,
.
rst_clr_reg
=
RST_DEVICES_CLR_X
,
},
};
struct
tegra_clk_periph_regs
*
get_reg_bank
(
int
clkid
)
{
int
reg_bank
=
clkid
/
32
;
if
(
reg_bank
<
periph_banks
)
return
&
periph_regs
[
reg_bank
];
else
{
WARN_ON
(
1
);
return
NULL
;
}
}
struct
clk
**
__init
tegra_clk_init
(
int
num
,
int
banks
)
{
if
(
WARN_ON
(
banks
>
ARRAY_SIZE
(
periph_regs
)))
return
NULL
;
periph_clk_enb_refcnt
=
kzalloc
(
32
*
banks
*
sizeof
(
*
periph_clk_enb_refcnt
),
GFP_KERNEL
);
if
(
!
periph_clk_enb_refcnt
)
return
NULL
;
periph_banks
=
banks
;
clks
=
kzalloc
(
num
*
sizeof
(
struct
clk
*
),
GFP_KERNEL
);
if
(
!
clks
)
kfree
(
periph_clk_enb_refcnt
);
clk_num
=
num
;
return
clks
;
}
void
__init
tegra_init_dup_clks
(
struct
tegra_clk_duplicate
*
dup_list
,
struct
clk
*
clks
[],
int
clk_max
)
{
...
...
@@ -74,6 +203,43 @@ void __init tegra_init_from_table(struct tegra_clk_init_table *tbl,
}
}
void
__init
tegra_add_of_provider
(
struct
device_node
*
np
)
{
int
i
;
for
(
i
=
0
;
i
<
clk_num
;
i
++
)
{
if
(
IS_ERR
(
clks
[
i
]))
{
pr_err
(
"Tegra clk %d: register failed with %ld
\n
"
,
i
,
PTR_ERR
(
clks
[
i
]));
}
if
(
!
clks
[
i
])
clks
[
i
]
=
ERR_PTR
(
-
EINVAL
);
}
clk_data
.
clks
=
clks
;
clk_data
.
clk_num
=
clk_num
;
of_clk_add_provider
(
np
,
of_clk_src_onecell_get
,
&
clk_data
);
}
void
__init
tegra_register_devclks
(
struct
tegra_devclk
*
dev_clks
,
int
num
)
{
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
,
dev_clks
++
)
clk_register_clkdev
(
clks
[
dev_clks
->
dt_id
],
dev_clks
->
con_id
,
dev_clks
->
dev_id
);
}
struct
clk
**
__init
tegra_lookup_dt_id
(
int
clk_id
,
struct
tegra_clk
*
tegra_clk
)
{
if
(
tegra_clk
[
clk_id
].
present
)
return
&
clks
[
tegra_clk
[
clk_id
].
dt_id
];
else
return
NULL
;
}
tegra_clk_apply_init_table_func
tegra_clk_apply_init_table
;
void
__init
tegra_clocks_apply_init_table
(
void
)
...
...
drivers/clk/tegra/clk.h
View file @
e9827d9b
...
...
@@ -37,6 +37,8 @@ struct tegra_clk_sync_source {
container_of(_hw, struct tegra_clk_sync_source, hw)
extern
const
struct
clk_ops
tegra_clk_sync_source_ops
;
extern
int
*
periph_clk_enb_refcnt
;
struct
clk
*
tegra_clk_register_sync_source
(
const
char
*
name
,
unsigned
long
fixed_rate
,
unsigned
long
max_rate
);
...
...
@@ -188,12 +190,15 @@ struct tegra_clk_pll_params {
u32
ext_misc_reg
[
3
];
u32
pmc_divnm_reg
;
u32
pmc_divp_reg
;
u32
flags
;
int
stepa_shift
;
int
stepb_shift
;
int
lock_delay
;
int
max_p
;
struct
pdiv_map
*
pdiv_tohw
;
struct
div_nmp
*
div_nmp
;
struct
tegra_clk_pll_freq_table
*
freq_table
;
unsigned
long
fixed_rate
;
};
/**
...
...
@@ -233,10 +238,7 @@ struct tegra_clk_pll {
struct
clk_hw
hw
;
void
__iomem
*
clk_base
;
void
__iomem
*
pmc
;
u32
flags
;
unsigned
long
fixed_rate
;
spinlock_t
*
lock
;
struct
tegra_clk_pll_freq_table
*
freq_table
;
struct
tegra_clk_pll_params
*
params
;
};
...
...
@@ -258,56 +260,49 @@ extern const struct clk_ops tegra_clk_pll_ops;
extern
const
struct
clk_ops
tegra_clk_plle_ops
;
struct
clk
*
tegra_clk_register_pll
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_plle
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_pllxc
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_pllm
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_pllc
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_pllre
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
void
__iomem
*
pmc
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
unsigned
long
flags
,
struct
tegra_clk_pll_params
*
pll_params
,
u32
pll_flags
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
,
unsigned
long
parent_rate
);
struct
clk
*
tegra_clk_register_plle_tegra114
(
const
char
*
name
,
const
char
*
parent_name
,
void
__iomem
*
clk_base
,
unsigned
long
flags
,
unsigned
long
fixed_rate
,
struct
tegra_clk_pll_params
*
pll_params
,
struct
tegra_clk_pll_freq_table
*
freq_table
,
spinlock_t
*
lock
);
struct
clk
*
tegra_clk_register_pllss
(
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 tegra_clk_pll_out - PLL divider down clock
*
...
...
@@ -395,13 +390,14 @@ struct tegra_clk_periph_gate {
#define TEGRA_PERIPH_MANUAL_RESET BIT(1)
#define TEGRA_PERIPH_ON_APB BIT(2)
#define TEGRA_PERIPH_WAR_1005168 BIT(3)
#define TEGRA_PERIPH_NO_DIV BIT(4)
#define TEGRA_PERIPH_NO_GATE BIT(5)
void
tegra_periph_reset
(
struct
tegra_clk_periph_gate
*
gate
,
bool
assert
);
extern
const
struct
clk_ops
tegra_clk_periph_gate_ops
;
struct
clk
*
tegra_clk_register_periph_gate
(
const
char
*
name
,
const
char
*
parent_name
,
u8
gate_flags
,
void
__iomem
*
clk_base
,
unsigned
long
flags
,
int
clk_num
,
struct
tegra_clk_periph_regs
*
pregs
,
int
*
enable_refcnt
);
unsigned
long
flags
,
int
clk_num
,
int
*
enable_refcnt
);
/**
* struct clk-periph - peripheral clock
...
...
@@ -443,26 +439,26 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
#define TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, _mux_flags, \
_div_shift, _div_width, _div_frac_width, \
_div_flags, _clk_num,
_enb_refcnt, _regs,
\
_gate_flags, _table
)
\
_div_flags, _clk_num,\
_gate_flags, _table
, _lock)
\
{ \
.mux = { \
.flags = _mux_flags, \
.shift = _mux_shift, \
.mask = _mux_mask, \
.table = _table, \
.lock = _lock, \
}, \
.divider = { \
.flags = _div_flags, \
.shift = _div_shift, \
.width = _div_width, \
.frac_width = _div_frac_width, \
.lock = _lock, \
}, \
.gate = { \
.flags = _gate_flags, \
.clk_num = _clk_num, \
.enable_refcnt = _enb_refcnt, \
.regs = _regs, \
}, \
.mux_ops = &clk_mux_ops, \
.div_ops = &tegra_clk_frac_div_ops, \
...
...
@@ -472,7 +468,10 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
struct
tegra_periph_init_data
{
const
char
*
name
;
int
clk_id
;
const
char
**
parent_names
;
union
{
const
char
**
parent_names
;
const
char
*
parent_name
;
}
p
;
int
num_parents
;
struct
tegra_clk_periph
periph
;
u32
offset
;
...
...
@@ -483,20 +482,19 @@ struct tegra_periph_init_data {
#define TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, _mux_mask, _mux_flags, _div_shift, \
_div_width, _div_frac_width, _div_flags,
_regs,
\
_clk_num, _
enb_refcnt, _gate_flags, _clk_id, _table,
\
_flags) \
_div_width, _div_frac_width, _div_flags, \
_clk_num, _
gate_flags, _clk_id, _table,
\
_flags
, _lock
) \
{ \
.name = _name, \
.clk_id = _clk_id, \
.p
arent_names = _parent_names,
\
.p
.parent_names = _parent_names,
\
.num_parents = ARRAY_SIZE(_parent_names), \
.periph = TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, \
_mux_flags, _div_shift, \
_div_width, _div_frac_width, \
_div_flags, _clk_num, \
_enb_refcnt, _regs, \
_gate_flags, _table), \
_gate_flags, _table, _lock), \
.offset = _offset, \
.con_id = _con_id, \
.dev_id = _dev_id, \
...
...
@@ -505,13 +503,13 @@ struct tegra_periph_init_data {
#define TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, _mux_width, _mux_flags, _div_shift, \
_div_width, _div_frac_width, _div_flags,
_regs,
\
_clk_num, _
enb_refcnt, _
gate_flags, _clk_id) \
_div_width, _div_frac_width, _div_flags, \
_clk_num, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, BIT(_mux_width) - 1, _mux_flags, \
_div_shift, _div_width, _div_frac_width, _div_flags, \
_
regs, _clk_num, _enb_refcnt
, _gate_flags, _clk_id,\
NULL, 0)
_
clk_num
, _gate_flags, _clk_id,\
NULL, 0
, NULL
)
/**
* struct clk_super_mux - super clock
...
...
@@ -581,12 +579,49 @@ struct tegra_clk_duplicate {
}, \
}
struct
tegra_clk
{
int
dt_id
;
bool
present
;
};
struct
tegra_devclk
{
int
dt_id
;
char
*
dev_id
;
char
*
con_id
;
};
void
tegra_init_from_table
(
struct
tegra_clk_init_table
*
tbl
,
struct
clk
*
clks
[],
int
clk_max
);
void
tegra_init_dup_clks
(
struct
tegra_clk_duplicate
*
dup_list
,
struct
clk
*
clks
[],
int
clk_max
);
struct
tegra_clk_periph_regs
*
get_reg_bank
(
int
clkid
);
struct
clk
**
tegra_clk_init
(
int
num
,
int
periph_banks
);
struct
clk
**
tegra_lookup_dt_id
(
int
clk_id
,
struct
tegra_clk
*
tegra_clk
);
void
tegra_add_of_provider
(
struct
device_node
*
np
);
void
tegra_register_devclks
(
struct
tegra_devclk
*
dev_clks
,
int
num
);
void
tegra_audio_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_params
);
void
tegra_periph_clk_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_params
);
void
tegra_pmc_clk_init
(
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
);
void
tegra_fixed_clk_init
(
struct
tegra_clk
*
tegra_clks
);
int
tegra_osc_clk_init
(
void
__iomem
*
clk_base
,
struct
tegra_clk
*
tegra_clks
,
unsigned
long
*
input_freqs
,
int
num
,
unsigned
long
*
osc_freq
,
unsigned
long
*
pll_ref_freq
);
void
tegra_super_clk_gen4_init
(
void
__iomem
*
clk_base
,
void
__iomem
*
pmc_base
,
struct
tegra_clk
*
tegra_clks
,
struct
tegra_clk_pll_params
*
pll_params
);
void
tegra114_clock_tune_cpu_trimmers_high
(
void
);
void
tegra114_clock_tune_cpu_trimmers_low
(
void
);
void
tegra114_clock_tune_cpu_trimmers_init
(
void
);
...
...
include/dt-bindings/clock/tegra114-car.h
View file @
e9827d9b
...
...
@@ -37,10 +37,10 @@
#define TEGRA114_CLK_I2S2 18
#define TEGRA114_CLK_EPP 19
/* 20 (register bit affects vi and vi_sensor) */
#define TEGRA114_CLK_GR
_
2D 21
#define TEGRA114_CLK_GR2D 21
#define TEGRA114_CLK_USBD 22
#define TEGRA114_CLK_ISP 23
#define TEGRA114_CLK_GR
_
3D 24
#define TEGRA114_CLK_GR3D 24
/* 25 */
#define TEGRA114_CLK_DISP2 26
#define TEGRA114_CLK_DISP1 27
...
...
@@ -289,8 +289,8 @@
#define TEGRA114_CLK_PCLK 261
#define TEGRA114_CLK_CCLK_G 262
#define TEGRA114_CLK_CCLK_LP 263
/* 264 */
/* 265 */
#define TEGRA114_CLK_DFLL_REF 264
#define TEGRA114_CLK_DFLL_SOC 265
/* 266 */
/* 267 */
/* 268 */
...
...
include/dt-bindings/clock/tegra124-car.h
0 → 100644
View file @
e9827d9b
/*
* This header provides constants for binding nvidia,tegra124-car.
*
* The first 192 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB
* registers. These IDs often match those in the CAR's RST_DEVICES registers,
* but not in all cases. Some bits in CLK_OUT_ENB affect multiple clocks. In
* this case, those clocks are assigned IDs above 185 in order to highlight
* this issue. Implementations that interpret these clock IDs as bit values
* within the CLK_OUT_ENB or RST_DEVICES registers should be careful to
* explicitly handle these special cases.
*
* The balance of the clocks controlled by the CAR are assigned IDs of 185 and
* above.
*/
#ifndef _DT_BINDINGS_CLOCK_TEGRA124_CAR_H
#define _DT_BINDINGS_CLOCK_TEGRA124_CAR_H
/* 0 */
/* 1 */
/* 2 */
#define TEGRA124_CLK_ISPB 3
#define TEGRA124_CLK_RTC 4
#define TEGRA124_CLK_TIMER 5
#define TEGRA124_CLK_UARTA 6
/* 7 (register bit affects uartb and vfir) */
/* 8 */
#define TEGRA124_CLK_SDMMC2 9
/* 10 (register bit affects spdif_in and spdif_out) */
#define TEGRA124_CLK_I2S1 11
#define TEGRA124_CLK_I2C1 12
#define TEGRA124_CLK_NDFLASH 13
#define TEGRA124_CLK_SDMMC1 14
#define TEGRA124_CLK_SDMMC4 15
/* 16 */
#define TEGRA124_CLK_PWM 17
#define TEGRA124_CLK_I2S2 18
/* 20 (register bit affects vi and vi_sensor) */
#define TEGRA124_CLK_GR_2D 21
#define TEGRA124_CLK_USBD 22
#define TEGRA124_CLK_ISP 23
#define TEGRA124_CLK_GR_3D 24
/* 25 */
#define TEGRA124_CLK_DISP2 26
#define TEGRA124_CLK_DISP1 27
#define TEGRA124_CLK_HOST1X 28
#define TEGRA124_CLK_VCP 29
#define TEGRA124_CLK_I2S0 30
/* 31 */
/* 32 */
/* 33 */
#define TEGRA124_CLK_APBDMA 34
/* 35 */
#define TEGRA124_CLK_KBC 36
/* 37 */
/* 38 */
/* 39 (register bit affects fuse and fuse_burn) */
#define TEGRA124_CLK_KFUSE 40
#define TEGRA124_CLK_SBC1 41
#define TEGRA124_CLK_NOR 42
/* 43 */
#define TEGRA124_CLK_SBC2 44
/* 45 */
#define TEGRA124_CLK_SBC3 46
#define TEGRA124_CLK_I2C5 47
#define TEGRA124_CLK_DSIA 48
/* 49 */
#define TEGRA124_CLK_MIPI 50
#define TEGRA124_CLK_HDMI 51
#define TEGRA124_CLK_CSI 52
/* 53 */
#define TEGRA124_CLK_I2C2 54
#define TEGRA124_CLK_UARTC 55
#define TEGRA124_CLK_MIPI_CAL 56
#define TEGRA124_CLK_EMC 57
#define TEGRA124_CLK_USB2 58
#define TEGRA124_CLK_USB3 59
/* 60 */
#define TEGRA124_CLK_VDE 61
#define TEGRA124_CLK_BSEA 62
#define TEGRA124_CLK_BSEV 63
/* 64 */
#define TEGRA124_CLK_UARTD 65
#define TEGRA124_CLK_UARTE 66
#define TEGRA124_CLK_I2C3 67
#define TEGRA124_CLK_SBC4 68
#define TEGRA124_CLK_SDMMC3 69
#define TEGRA124_CLK_PCIE 70
#define TEGRA124_CLK_OWR 71
#define TEGRA124_CLK_AFI 72
#define TEGRA124_CLK_CSITE 73
/* 74 */
/* 75 */
#define TEGRA124_CLK_LA 76
#define TEGRA124_CLK_TRACE 77
#define TEGRA124_CLK_SOC_THERM 78
#define TEGRA124_CLK_DTV 79
#define TEGRA124_CLK_NDSPEED 80
#define TEGRA124_CLK_I2CSLOW 81
#define TEGRA124_CLK_DSIB 82
#define TEGRA124_CLK_TSEC 83
/* 84 */
/* 85 */
/* 86 */
/* 87 */
/* 88 */
#define TEGRA124_CLK_XUSB_HOST 89
/* 90 */
#define TEGRA124_CLK_MSENC 91
#define TEGRA124_CLK_CSUS 92
/* 93 */
/* 94 */
/* 95 (bit affects xusb_dev and xusb_dev_src) */
/* 96 */
/* 97 */
/* 98 */
#define TEGRA124_CLK_MSELECT 99
#define TEGRA124_CLK_TSENSOR 100
#define TEGRA124_CLK_I2S3 101
#define TEGRA124_CLK_I2S4 102
#define TEGRA124_CLK_I2C4 103
#define TEGRA124_CLK_SBC5 104
#define TEGRA124_CLK_SBC6 105
#define TEGRA124_CLK_D_AUDIO 106
#define TEGRA124_CLK_APBIF 107
#define TEGRA124_CLK_DAM0 108
#define TEGRA124_CLK_DAM1 109
#define TEGRA124_CLK_DAM2 110
#define TEGRA124_CLK_HDA2CODEC_2X 111
/* 112 */
#define TEGRA124_CLK_AUDIO0_2X 113
#define TEGRA124_CLK_AUDIO1_2X 114
#define TEGRA124_CLK_AUDIO2_2X 115
#define TEGRA124_CLK_AUDIO3_2X 116
#define TEGRA124_CLK_AUDIO4_2X 117
#define TEGRA124_CLK_SPDIF_2X 118
#define TEGRA124_CLK_ACTMON 119
#define TEGRA124_CLK_EXTERN1 120
#define TEGRA124_CLK_EXTERN2 121
#define TEGRA124_CLK_EXTERN3 122
#define TEGRA124_CLK_SATA_OOB 123
#define TEGRA124_CLK_SATA 124
#define TEGRA124_CLK_HDA 125
/* 126 */
#define TEGRA124_CLK_SE 127
#define TEGRA124_CLK_HDA2HDMI 128
#define TEGRA124_CLK_SATA_COLD 129
/* 130 */
/* 131 */
/* 132 */
/* 133 */
/* 134 */
/* 135 */
/* 136 */
/* 137 */
/* 138 */
/* 139 */
/* 140 */
/* 141 */
/* 142 */
/* 143 (bit affects xusb_falcon_src, xusb_fs_src, */
/* xusb_host_src and xusb_ss_src) */
#define TEGRA124_CLK_CILAB 144
#define TEGRA124_CLK_CILCD 145
#define TEGRA124_CLK_CILE 146
#define TEGRA124_CLK_DSIALP 147
#define TEGRA124_CLK_DSIBLP 148
#define TEGRA124_CLK_ENTROPY 149
#define TEGRA124_CLK_DDS 150
/* 151 */
#define TEGRA124_CLK_DP2 152
#define TEGRA124_CLK_AMX 153
#define TEGRA124_CLK_ADX 154
/* 155 (bit affects dfll_ref and dfll_soc) */
#define TEGRA124_CLK_XUSB_SS 156
/* 157 */
/* 158 */
/* 159 */
/* 160 */
/* 161 */
/* 162 */
/* 163 */
/* 164 */
/* 165 */
#define TEGRA124_CLK_I2C6 166
/* 167 */
/* 168 */
/* 169 */
/* 170 */
#define TEGRA124_CLK_VIM2_CLK 171
/* 172 */
/* 173 */
/* 174 */
/* 175 */
#define TEGRA124_CLK_HDMI_AUDIO 176
#define TEGRA124_CLK_CLK72MHZ 177
#define TEGRA124_CLK_VIC03 178
/* 179 */
#define TEGRA124_CLK_ADX1 180
#define TEGRA124_CLK_DPAUX 181
#define TEGRA124_CLK_SOR0 182
/* 183 */
#define TEGRA124_CLK_GPU 184
#define TEGRA124_CLK_AMX1 185
/* 186 */
/* 187 */
/* 188 */
/* 189 */
/* 190 */
/* 191 */
#define TEGRA124_CLK_UARTB 192
#define TEGRA124_CLK_VFIR 193
#define TEGRA124_CLK_SPDIF_IN 194
#define TEGRA124_CLK_SPDIF_OUT 195
#define TEGRA124_CLK_VI 196
#define TEGRA124_CLK_VI_SENSOR 197
#define TEGRA124_CLK_FUSE 198
#define TEGRA124_CLK_FUSE_BURN 199
#define TEGRA124_CLK_CLK_32K 200
#define TEGRA124_CLK_CLK_M 201
#define TEGRA124_CLK_CLK_M_DIV2 202
#define TEGRA124_CLK_CLK_M_DIV4 203
#define TEGRA124_CLK_PLL_REF 204
#define TEGRA124_CLK_PLL_C 205
#define TEGRA124_CLK_PLL_C_OUT1 206
#define TEGRA124_CLK_PLL_C2 207
#define TEGRA124_CLK_PLL_C3 208
#define TEGRA124_CLK_PLL_M 209
#define TEGRA124_CLK_PLL_M_OUT1 210
#define TEGRA124_CLK_PLL_P 211
#define TEGRA124_CLK_PLL_P_OUT1 212
#define TEGRA124_CLK_PLL_P_OUT2 213
#define TEGRA124_CLK_PLL_P_OUT3 214
#define TEGRA124_CLK_PLL_P_OUT4 215
#define TEGRA124_CLK_PLL_A 216
#define TEGRA124_CLK_PLL_A_OUT0 217
#define TEGRA124_CLK_PLL_D 218
#define TEGRA124_CLK_PLL_D_OUT0 219
#define TEGRA124_CLK_PLL_D2 220
#define TEGRA124_CLK_PLL_D2_OUT0 221
#define TEGRA124_CLK_PLL_U 222
#define TEGRA124_CLK_PLL_U_480M 223
#define TEGRA124_CLK_PLL_U_60M 224
#define TEGRA124_CLK_PLL_U_48M 225
#define TEGRA124_CLK_PLL_U_12M 226
#define TEGRA124_CLK_PLL_X 227
#define TEGRA124_CLK_PLL_X_OUT0 228
#define TEGRA124_CLK_PLL_RE_VCO 229
#define TEGRA124_CLK_PLL_RE_OUT 230
#define TEGRA124_CLK_PLL_E 231
#define TEGRA124_CLK_SPDIF_IN_SYNC 232
#define TEGRA124_CLK_I2S0_SYNC 233
#define TEGRA124_CLK_I2S1_SYNC 234
#define TEGRA124_CLK_I2S2_SYNC 235
#define TEGRA124_CLK_I2S3_SYNC 236
#define TEGRA124_CLK_I2S4_SYNC 237
#define TEGRA124_CLK_VIMCLK_SYNC 238
#define TEGRA124_CLK_AUDIO0 239
#define TEGRA124_CLK_AUDIO1 240
#define TEGRA124_CLK_AUDIO2 241
#define TEGRA124_CLK_AUDIO3 242
#define TEGRA124_CLK_AUDIO4 243
#define TEGRA124_CLK_SPDIF 244
#define TEGRA124_CLK_CLK_OUT_1 245
#define TEGRA124_CLK_CLK_OUT_2 246
#define TEGRA124_CLK_CLK_OUT_3 247
#define TEGRA124_CLK_BLINK 248
/* 249 */
/* 250 */
/* 251 */
#define TEGRA124_CLK_XUSB_HOST_SRC 252
#define TEGRA124_CLK_XUSB_FALCON_SRC 253
#define TEGRA124_CLK_XUSB_FS_SRC 254
#define TEGRA124_CLK_XUSB_SS_SRC 255
#define TEGRA124_CLK_XUSB_DEV_SRC 256
#define TEGRA124_CLK_XUSB_DEV 257
#define TEGRA124_CLK_XUSB_HS_SRC 258
#define TEGRA124_CLK_SCLK 259
#define TEGRA124_CLK_HCLK 260
#define TEGRA124_CLK_PCLK 261
#define TEGRA124_CLK_CCLK_G 262
#define TEGRA124_CLK_CCLK_LP 263
#define TEGRA124_CLK_DFLL_REF 264
#define TEGRA124_CLK_DFLL_SOC 265
#define TEGRA124_CLK_VI_SENSOR2 266
#define TEGRA124_CLK_PLL_P_OUT5 267
#define TEGRA124_CLK_CML0 268
#define TEGRA124_CLK_CML1 269
#define TEGRA124_CLK_PLL_C4 270
#define TEGRA124_CLK_PLL_DP 271
#define TEGRA124_CLK_PLL_E_MUX 272
/* 273 */
/* 274 */
/* 275 */
/* 276 */
/* 277 */
/* 278 */
/* 279 */
/* 280 */
/* 281 */
/* 282 */
/* 283 */
/* 284 */
/* 285 */
/* 286 */
/* 287 */
/* 288 */
/* 289 */
/* 290 */
/* 291 */
/* 292 */
/* 293 */
/* 294 */
/* 295 */
/* 296 */
/* 297 */
/* 298 */
/* 299 */
#define TEGRA124_CLK_AUDIO0_MUX 300
#define TEGRA124_CLK_AUDIO1_MUX 301
#define TEGRA124_CLK_AUDIO2_MUX 302
#define TEGRA124_CLK_AUDIO3_MUX 303
#define TEGRA124_CLK_AUDIO4_MUX 304
#define TEGRA124_CLK_SPDIF_MUX 305
#define TEGRA124_CLK_CLK_OUT_1_MUX 306
#define TEGRA124_CLK_CLK_OUT_2_MUX 307
#define TEGRA124_CLK_CLK_OUT_3_MUX 308
#define TEGRA124_CLK_DSIA_MUX 309
#define TEGRA124_CLK_DSIB_MUX 310
#define TEGRA124_CLK_SOR0_LVDS 311
#define TEGRA124_CLK_CLK_MAX 312
#endif
/* _DT_BINDINGS_CLOCK_TEGRA124_CAR_H */
include/dt-bindings/clock/tegra30-car.h
View file @
e9827d9b
...
...
@@ -260,6 +260,14 @@
/* 298 */
/* 299 */
#define TEGRA30_CLK_CLK_OUT_1_MUX 300
#define TEGRA30_CLK_CLK_MAX 301
#define TEGRA30_CLK_CLK_OUT_2_MUX 301
#define TEGRA30_CLK_CLK_OUT_3_MUX 302
#define TEGRA30_CLK_AUDIO0_MUX 303
#define TEGRA30_CLK_AUDIO1_MUX 304
#define TEGRA30_CLK_AUDIO2_MUX 305
#define TEGRA30_CLK_AUDIO3_MUX 306
#define TEGRA30_CLK_AUDIO4_MUX 307
#define TEGRA30_CLK_SPDIF_MUX 308
#define TEGRA30_CLK_CLK_MAX 309
#endif
/* _DT_BINDINGS_CLOCK_TEGRA30_CAR_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment