Merge branch 'for_3.16/exynos5260' of git://git.kernel.org/pub/scm/linux/kernel/git/tfiga/samsung-clk into v3.16-next/clk-samsung
Pull Samsung clock exynos5260 from Tomasz Figa: "This pull request contains patches preparing Samsung Common Clock Framework helpers to support Exynos5260 by adding support for multiple clock providers and then adding clock driver for Exynos5260." Acked-by: Mike Turquette <mturquette@linaro.org> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
This commit is contained in:
commit
4b2f5cd0ec
17 changed files with 3589 additions and 205 deletions
190
Documentation/devicetree/bindings/clock/exynos5260-clock.txt
Normal file
190
Documentation/devicetree/bindings/clock/exynos5260-clock.txt
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
* Samsung Exynos5260 Clock Controller
|
||||
|
||||
Exynos5260 has 13 clock controllers which are instantiated
|
||||
independently from the device-tree. These clock controllers
|
||||
generate and supply clocks to various hardware blocks within
|
||||
the SoC.
|
||||
|
||||
Each clock is assigned an identifier and client nodes can use
|
||||
this identifier to specify the clock which they consume. All
|
||||
available clocks are defined as preprocessor macros in
|
||||
dt-bindings/clock/exynos5260-clk.h header and can be used in
|
||||
device tree sources.
|
||||
|
||||
External clocks:
|
||||
|
||||
There are several clocks that are generated outside the SoC. It
|
||||
is expected that they are defined using standard clock bindings
|
||||
with following clock-output-names:
|
||||
|
||||
- "fin_pll" - PLL input clock from XXTI
|
||||
- "xrtcxti" - input clock from XRTCXTI
|
||||
- "ioclk_pcm_extclk" - pcm external operation clock
|
||||
- "ioclk_spdif_extclk" - spdif external operation clock
|
||||
- "ioclk_i2s_cdclk" - i2s0 codec clock
|
||||
|
||||
Phy clocks:
|
||||
|
||||
There are several clocks which are generated by specific PHYs.
|
||||
These clocks are fed into the clock controller and then routed to
|
||||
the hardware blocks. These clocks are defined as fixed clocks in the
|
||||
driver with following names:
|
||||
|
||||
- "phyclk_dptx_phy_ch3_txd_clk" - dp phy clock for channel 3
|
||||
- "phyclk_dptx_phy_ch2_txd_clk" - dp phy clock for channel 2
|
||||
- "phyclk_dptx_phy_ch1_txd_clk" - dp phy clock for channel 1
|
||||
- "phyclk_dptx_phy_ch0_txd_clk" - dp phy clock for channel 0
|
||||
- "phyclk_hdmi_phy_tmds_clko" - hdmi phy tmds clock
|
||||
- "phyclk_hdmi_phy_pixel_clko" - hdmi phy pixel clock
|
||||
- "phyclk_hdmi_link_o_tmds_clkhi" - hdmi phy for hdmi link
|
||||
- "phyclk_dptx_phy_o_ref_clk_24m" - dp phy reference clock
|
||||
- "phyclk_dptx_phy_clk_div2"
|
||||
- "phyclk_mipi_dphy_4l_m_rxclkesc0"
|
||||
- "phyclk_usbhost20_phy_phyclock" - usb 2.0 phy clock
|
||||
- "phyclk_usbhost20_phy_freeclk"
|
||||
- "phyclk_usbhost20_phy_clk48mohci"
|
||||
- "phyclk_usbdrd30_udrd30_pipe_pclk"
|
||||
- "phyclk_usbdrd30_udrd30_phyclock" - usb 3.0 phy clock
|
||||
|
||||
Required Properties for Clock Controller:
|
||||
|
||||
- compatible: should be one of the following.
|
||||
1) "samsung,exynos5260-clock-top"
|
||||
2) "samsung,exynos5260-clock-peri"
|
||||
3) "samsung,exynos5260-clock-egl"
|
||||
4) "samsung,exynos5260-clock-kfc"
|
||||
5) "samsung,exynos5260-clock-g2d"
|
||||
6) "samsung,exynos5260-clock-mif"
|
||||
7) "samsung,exynos5260-clock-mfc"
|
||||
8) "samsung,exynos5260-clock-g3d"
|
||||
9) "samsung,exynos5260-clock-fsys"
|
||||
10) "samsung,exynos5260-clock-aud"
|
||||
11) "samsung,exynos5260-clock-isp"
|
||||
12) "samsung,exynos5260-clock-gscl"
|
||||
13) "samsung,exynos5260-clock-disp"
|
||||
|
||||
- reg: physical base address of the controller and the length of
|
||||
memory mapped region.
|
||||
|
||||
- #clock-cells: should be 1.
|
||||
|
||||
- clocks: list of clock identifiers which are fed as the input to
|
||||
the given clock controller. Please refer the next section to find
|
||||
the input clocks for a given controller.
|
||||
|
||||
- clock-names: list of names of clocks which are fed as the input
|
||||
to the given clock controller.
|
||||
|
||||
Input clocks for top clock controller:
|
||||
- fin_pll
|
||||
- dout_mem_pll
|
||||
- dout_bus_pll
|
||||
- dout_media_pll
|
||||
|
||||
Input clocks for peri clock controller:
|
||||
- fin_pll
|
||||
- ioclk_pcm_extclk
|
||||
- ioclk_i2s_cdclk
|
||||
- ioclk_spdif_extclk
|
||||
- phyclk_hdmi_phy_ref_cko
|
||||
- dout_aclk_peri_66
|
||||
- dout_sclk_peri_uart0
|
||||
- dout_sclk_peri_uart1
|
||||
- dout_sclk_peri_uart2
|
||||
- dout_sclk_peri_spi0_b
|
||||
- dout_sclk_peri_spi1_b
|
||||
- dout_sclk_peri_spi2_b
|
||||
- dout_aclk_peri_aud
|
||||
- dout_sclk_peri_spi0_b
|
||||
|
||||
Input clocks for egl clock controller:
|
||||
- fin_pll
|
||||
- dout_bus_pll
|
||||
|
||||
Input clocks for kfc clock controller:
|
||||
- fin_pll
|
||||
- dout_media_pll
|
||||
|
||||
Input clocks for g2d clock controller:
|
||||
- fin_pll
|
||||
- dout_aclk_g2d_333
|
||||
|
||||
Input clocks for mif clock controller:
|
||||
- fin_pll
|
||||
|
||||
Input clocks for mfc clock controller:
|
||||
- fin_pll
|
||||
- dout_aclk_mfc_333
|
||||
|
||||
Input clocks for g3d clock controller:
|
||||
- fin_pll
|
||||
|
||||
Input clocks for fsys clock controller:
|
||||
- fin_pll
|
||||
- phyclk_usbhost20_phy_phyclock
|
||||
- phyclk_usbhost20_phy_freeclk
|
||||
- phyclk_usbhost20_phy_clk48mohci
|
||||
- phyclk_usbdrd30_udrd30_pipe_pclk
|
||||
- phyclk_usbdrd30_udrd30_phyclock
|
||||
- dout_aclk_fsys_200
|
||||
|
||||
Input clocks for aud clock controller:
|
||||
- fin_pll
|
||||
- fout_aud_pll
|
||||
- ioclk_i2s_cdclk
|
||||
- ioclk_pcm_extclk
|
||||
|
||||
Input clocks for isp clock controller:
|
||||
- fin_pll
|
||||
- dout_aclk_isp1_266
|
||||
- dout_aclk_isp1_400
|
||||
- mout_aclk_isp1_266
|
||||
|
||||
Input clocks for gscl clock controller:
|
||||
- fin_pll
|
||||
- dout_aclk_gscl_400
|
||||
- dout_aclk_gscl_333
|
||||
|
||||
Input clocks for disp clock controller:
|
||||
- fin_pll
|
||||
- phyclk_dptx_phy_ch3_txd_clk
|
||||
- phyclk_dptx_phy_ch2_txd_clk
|
||||
- phyclk_dptx_phy_ch1_txd_clk
|
||||
- phyclk_dptx_phy_ch0_txd_clk
|
||||
- phyclk_hdmi_phy_tmds_clko
|
||||
- phyclk_hdmi_phy_ref_clko
|
||||
- phyclk_hdmi_phy_pixel_clko
|
||||
- phyclk_hdmi_link_o_tmds_clkhi
|
||||
- phyclk_mipi_dphy_4l_m_txbyte_clkhs
|
||||
- phyclk_dptx_phy_o_ref_clk_24m
|
||||
- phyclk_dptx_phy_clk_div2
|
||||
- phyclk_mipi_dphy_4l_m_rxclkesc0
|
||||
- phyclk_hdmi_phy_ref_cko
|
||||
- ioclk_spdif_extclk
|
||||
- dout_aclk_peri_aud
|
||||
- dout_aclk_disp_222
|
||||
- dout_sclk_disp_pixel
|
||||
- dout_aclk_disp_333
|
||||
|
||||
Example 1: An example of a clock controller node is listed below.
|
||||
|
||||
clock_mfc: clock-controller@11090000 {
|
||||
compatible = "samsung,exynos5260-clock-mfc";
|
||||
clock = <&fin_pll>, <&clock_top TOP_DOUT_ACLK_MFC_333>;
|
||||
clock-names = "fin_pll", "dout_aclk_mfc_333";
|
||||
reg = <0x11090000 0x10000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
Example 2: UART controller node that consumes the clock generated by the
|
||||
peri clock controller. Refer to the standard clock bindings for
|
||||
information about 'clocks' and 'clock-names' property.
|
||||
|
||||
serial@12C00000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x12C00000 0x100>;
|
||||
interrupts = <0 146 0>;
|
||||
clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri PERI_SCLK_UART0>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
};
|
||||
|
||||
|
|
@ -5,6 +5,7 @@
|
|||
obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o
|
||||
obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o
|
||||
obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o
|
||||
obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o
|
||||
obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o
|
||||
obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o
|
||||
obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o
|
||||
|
|
|
|||
|
|
@ -1043,7 +1043,7 @@ static unsigned long exynos4_get_xom(void)
|
|||
return xom;
|
||||
}
|
||||
|
||||
static void __init exynos4_clk_register_finpll(void)
|
||||
static void __init exynos4_clk_register_finpll(struct samsung_clk_provider *ctx)
|
||||
{
|
||||
struct samsung_fixed_rate_clock fclk;
|
||||
struct clk *clk;
|
||||
|
|
@ -1066,7 +1066,7 @@ static void __init exynos4_clk_register_finpll(void)
|
|||
fclk.parent_name = NULL;
|
||||
fclk.flags = CLK_IS_ROOT;
|
||||
fclk.fixed_rate = finpll_f;
|
||||
samsung_clk_register_fixed_rate(&fclk, 1);
|
||||
samsung_clk_register_fixed_rate(ctx, &fclk, 1);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1176,22 +1176,25 @@ static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = {
|
|||
static void __init exynos4_clk_init(struct device_node *np,
|
||||
enum exynos4_soc soc)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
exynos4_soc = soc;
|
||||
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base)
|
||||
panic("%s: failed to map registers\n", __func__);
|
||||
|
||||
samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks,
|
||||
samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks,
|
||||
ARRAY_SIZE(exynos4_fixed_rate_ext_clks),
|
||||
ext_clk_match);
|
||||
|
||||
exynos4_clk_register_finpll();
|
||||
exynos4_clk_register_finpll(ctx);
|
||||
|
||||
if (exynos4_soc == EXYNOS4210) {
|
||||
samsung_clk_register_mux(exynos4210_mux_early,
|
||||
samsung_clk_register_mux(ctx, exynos4210_mux_early,
|
||||
ARRAY_SIZE(exynos4210_mux_early));
|
||||
|
||||
if (_get_rate("fin_pll") == 24000000) {
|
||||
|
|
@ -1205,7 +1208,7 @@ static void __init exynos4_clk_init(struct device_node *np,
|
|||
exynos4210_plls[vpll].rate_table =
|
||||
exynos4210_vpll_rates;
|
||||
|
||||
samsung_clk_register_pll(exynos4210_plls,
|
||||
samsung_clk_register_pll(ctx, exynos4210_plls,
|
||||
ARRAY_SIZE(exynos4210_plls), reg_base);
|
||||
} else {
|
||||
if (_get_rate("fin_pll") == 24000000) {
|
||||
|
|
@ -1217,42 +1220,42 @@ static void __init exynos4_clk_init(struct device_node *np,
|
|||
exynos4x12_vpll_rates;
|
||||
}
|
||||
|
||||
samsung_clk_register_pll(exynos4x12_plls,
|
||||
samsung_clk_register_pll(ctx, exynos4x12_plls,
|
||||
ARRAY_SIZE(exynos4x12_plls), reg_base);
|
||||
}
|
||||
|
||||
samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, exynos4_fixed_rate_clks,
|
||||
ARRAY_SIZE(exynos4_fixed_rate_clks));
|
||||
samsung_clk_register_mux(exynos4_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos4_mux_clks,
|
||||
ARRAY_SIZE(exynos4_mux_clks));
|
||||
samsung_clk_register_div(exynos4_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos4_div_clks,
|
||||
ARRAY_SIZE(exynos4_div_clks));
|
||||
samsung_clk_register_gate(exynos4_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos4_gate_clks,
|
||||
ARRAY_SIZE(exynos4_gate_clks));
|
||||
|
||||
if (exynos4_soc == EXYNOS4210) {
|
||||
samsung_clk_register_fixed_rate(exynos4210_fixed_rate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks,
|
||||
ARRAY_SIZE(exynos4210_fixed_rate_clks));
|
||||
samsung_clk_register_mux(exynos4210_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos4210_mux_clks,
|
||||
ARRAY_SIZE(exynos4210_mux_clks));
|
||||
samsung_clk_register_div(exynos4210_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos4210_div_clks,
|
||||
ARRAY_SIZE(exynos4210_div_clks));
|
||||
samsung_clk_register_gate(exynos4210_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos4210_gate_clks,
|
||||
ARRAY_SIZE(exynos4210_gate_clks));
|
||||
samsung_clk_register_alias(exynos4210_aliases,
|
||||
samsung_clk_register_alias(ctx, exynos4210_aliases,
|
||||
ARRAY_SIZE(exynos4210_aliases));
|
||||
} else {
|
||||
samsung_clk_register_mux(exynos4x12_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
|
||||
ARRAY_SIZE(exynos4x12_mux_clks));
|
||||
samsung_clk_register_div(exynos4x12_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos4x12_div_clks,
|
||||
ARRAY_SIZE(exynos4x12_div_clks));
|
||||
samsung_clk_register_gate(exynos4x12_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos4x12_gate_clks,
|
||||
ARRAY_SIZE(exynos4x12_gate_clks));
|
||||
samsung_clk_register_alias(exynos4x12_aliases,
|
||||
samsung_clk_register_alias(ctx, exynos4x12_aliases,
|
||||
ARRAY_SIZE(exynos4x12_aliases));
|
||||
}
|
||||
|
||||
samsung_clk_register_alias(exynos4_aliases,
|
||||
samsung_clk_register_alias(ctx, exynos4_aliases,
|
||||
ARRAY_SIZE(exynos4_aliases));
|
||||
|
||||
exynos4_clk_sleep_init();
|
||||
|
|
|
|||
|
|
@ -686,6 +686,8 @@ static struct of_device_id ext_clk_match[] __initdata = {
|
|||
/* register exynox5250 clocks */
|
||||
static void __init exynos5250_clk_init(struct device_node *np)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
|
||||
if (np) {
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base)
|
||||
|
|
@ -694,11 +696,13 @@ static void __init exynos5250_clk_init(struct device_node *np)
|
|||
panic("%s: unable to determine soc\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks,
|
||||
ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks,
|
||||
ARRAY_SIZE(exynos5250_fixed_rate_ext_clks),
|
||||
ext_clk_match);
|
||||
samsung_clk_register_mux(exynos5250_pll_pmux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos5250_pll_pmux_clks,
|
||||
ARRAY_SIZE(exynos5250_pll_pmux_clks));
|
||||
|
||||
if (_get_rate("fin_pll") == 24 * MHZ) {
|
||||
|
|
@ -709,17 +713,18 @@ static void __init exynos5250_clk_init(struct device_node *np)
|
|||
if (_get_rate("mout_vpllsrc") == 24 * MHZ)
|
||||
exynos5250_plls[vpll].rate_table = vpll_24mhz_tbl;
|
||||
|
||||
samsung_clk_register_pll(exynos5250_plls, ARRAY_SIZE(exynos5250_plls),
|
||||
reg_base);
|
||||
samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks,
|
||||
samsung_clk_register_pll(ctx, exynos5250_plls,
|
||||
ARRAY_SIZE(exynos5250_plls),
|
||||
reg_base);
|
||||
samsung_clk_register_fixed_rate(ctx, exynos5250_fixed_rate_clks,
|
||||
ARRAY_SIZE(exynos5250_fixed_rate_clks));
|
||||
samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks,
|
||||
samsung_clk_register_fixed_factor(ctx, exynos5250_fixed_factor_clks,
|
||||
ARRAY_SIZE(exynos5250_fixed_factor_clks));
|
||||
samsung_clk_register_mux(exynos5250_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos5250_mux_clks,
|
||||
ARRAY_SIZE(exynos5250_mux_clks));
|
||||
samsung_clk_register_div(exynos5250_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos5250_div_clks,
|
||||
ARRAY_SIZE(exynos5250_div_clks));
|
||||
samsung_clk_register_gate(exynos5250_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos5250_gate_clks,
|
||||
ARRAY_SIZE(exynos5250_gate_clks));
|
||||
|
||||
exynos5250_clk_sleep_init();
|
||||
|
|
|
|||
1980
drivers/clk/samsung/clk-exynos5260.c
Normal file
1980
drivers/clk/samsung/clk-exynos5260.c
Normal file
File diff suppressed because it is too large
Load diff
459
drivers/clk/samsung/clk-exynos5260.h
Normal file
459
drivers/clk/samsung/clk-exynos5260.h
Normal file
|
|
@ -0,0 +1,459 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd.
|
||||
* Author: Rahul Sharma <rahul.sharma@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Common Clock Framework support for Exynos5260 SoC.
|
||||
*/
|
||||
|
||||
#ifndef __CLK_EXYNOS5260_H
|
||||
#define __CLK_EXYNOS5260_H
|
||||
|
||||
/*
|
||||
*Registers for CMU_AUD
|
||||
*/
|
||||
#define MUX_SEL_AUD 0x0200
|
||||
#define MUX_ENABLE_AUD 0x0300
|
||||
#define MUX_STAT_AUD 0x0400
|
||||
#define MUX_IGNORE_AUD 0x0500
|
||||
#define DIV_AUD0 0x0600
|
||||
#define DIV_AUD1 0x0604
|
||||
#define DIV_STAT_AUD0 0x0700
|
||||
#define DIV_STAT_AUD1 0x0704
|
||||
#define EN_ACLK_AUD 0x0800
|
||||
#define EN_PCLK_AUD 0x0900
|
||||
#define EN_SCLK_AUD 0x0a00
|
||||
#define EN_IP_AUD 0x0b00
|
||||
|
||||
/*
|
||||
*Registers for CMU_DISP
|
||||
*/
|
||||
#define MUX_SEL_DISP0 0x0200
|
||||
#define MUX_SEL_DISP1 0x0204
|
||||
#define MUX_SEL_DISP2 0x0208
|
||||
#define MUX_SEL_DISP3 0x020C
|
||||
#define MUX_SEL_DISP4 0x0210
|
||||
#define MUX_ENABLE_DISP0 0x0300
|
||||
#define MUX_ENABLE_DISP1 0x0304
|
||||
#define MUX_ENABLE_DISP2 0x0308
|
||||
#define MUX_ENABLE_DISP3 0x030c
|
||||
#define MUX_ENABLE_DISP4 0x0310
|
||||
#define MUX_STAT_DISP0 0x0400
|
||||
#define MUX_STAT_DISP1 0x0404
|
||||
#define MUX_STAT_DISP2 0x0408
|
||||
#define MUX_STAT_DISP3 0x040c
|
||||
#define MUX_STAT_DISP4 0x0410
|
||||
#define MUX_IGNORE_DISP0 0x0500
|
||||
#define MUX_IGNORE_DISP1 0x0504
|
||||
#define MUX_IGNORE_DISP2 0x0508
|
||||
#define MUX_IGNORE_DISP3 0x050c
|
||||
#define MUX_IGNORE_DISP4 0x0510
|
||||
#define DIV_DISP 0x0600
|
||||
#define DIV_STAT_DISP 0x0700
|
||||
#define EN_ACLK_DISP 0x0800
|
||||
#define EN_PCLK_DISP 0x0900
|
||||
#define EN_SCLK_DISP0 0x0a00
|
||||
#define EN_SCLK_DISP1 0x0a04
|
||||
#define EN_IP_DISP 0x0b00
|
||||
#define EN_IP_DISP_BUS 0x0b04
|
||||
|
||||
|
||||
/*
|
||||
*Registers for CMU_EGL
|
||||
*/
|
||||
#define EGL_PLL_LOCK 0x0000
|
||||
#define EGL_DPLL_LOCK 0x0004
|
||||
#define EGL_PLL_CON0 0x0100
|
||||
#define EGL_PLL_CON1 0x0104
|
||||
#define EGL_PLL_FREQ_DET 0x010c
|
||||
#define EGL_DPLL_CON0 0x0110
|
||||
#define EGL_DPLL_CON1 0x0114
|
||||
#define EGL_DPLL_FREQ_DET 0x011c
|
||||
#define MUX_SEL_EGL 0x0200
|
||||
#define MUX_ENABLE_EGL 0x0300
|
||||
#define MUX_STAT_EGL 0x0400
|
||||
#define DIV_EGL 0x0600
|
||||
#define DIV_EGL_PLL_FDET 0x0604
|
||||
#define DIV_STAT_EGL 0x0700
|
||||
#define DIV_STAT_EGL_PLL_FDET 0x0704
|
||||
#define EN_ACLK_EGL 0x0800
|
||||
#define EN_PCLK_EGL 0x0900
|
||||
#define EN_SCLK_EGL 0x0a00
|
||||
#define EN_IP_EGL 0x0b00
|
||||
#define CLKOUT_CMU_EGL 0x0c00
|
||||
#define CLKOUT_CMU_EGL_DIV_STAT 0x0c04
|
||||
#define ARMCLK_STOPCTRL 0x1000
|
||||
#define EAGLE_EMA_CTRL 0x1008
|
||||
#define EAGLE_EMA_STATUS 0x100c
|
||||
#define PWR_CTRL 0x1020
|
||||
#define PWR_CTRL2 0x1024
|
||||
#define CLKSTOP_CTRL 0x1028
|
||||
#define INTR_SPREAD_EN 0x1080
|
||||
#define INTR_SPREAD_USE_STANDBYWFI 0x1084
|
||||
#define INTR_SPREAD_BLOCKING_DURATION 0x1088
|
||||
#define CMU_EGL_SPARE0 0x2000
|
||||
#define CMU_EGL_SPARE1 0x2004
|
||||
#define CMU_EGL_SPARE2 0x2008
|
||||
#define CMU_EGL_SPARE3 0x200c
|
||||
#define CMU_EGL_SPARE4 0x2010
|
||||
|
||||
/*
|
||||
*Registers for CMU_FSYS
|
||||
*/
|
||||
|
||||
#define MUX_SEL_FSYS0 0x0200
|
||||
#define MUX_SEL_FSYS1 0x0204
|
||||
#define MUX_ENABLE_FSYS0 0x0300
|
||||
#define MUX_ENABLE_FSYS1 0x0304
|
||||
#define MUX_STAT_FSYS0 0x0400
|
||||
#define MUX_STAT_FSYS1 0x0404
|
||||
#define MUX_IGNORE_FSYS0 0x0500
|
||||
#define MUX_IGNORE_FSYS1 0x0504
|
||||
#define EN_ACLK_FSYS 0x0800
|
||||
#define EN_ACLK_FSYS_SECURE_RTIC 0x0804
|
||||
#define EN_ACLK_FSYS_SECURE_SMMU_RTIC 0x0808
|
||||
#define EN_PCLK_FSYS 0x0900
|
||||
#define EN_SCLK_FSYS 0x0a00
|
||||
#define EN_IP_FSYS 0x0b00
|
||||
#define EN_IP_FSYS_SECURE_RTIC 0x0b04
|
||||
#define EN_IP_FSYS_SECURE_SMMU_RTIC 0x0b08
|
||||
|
||||
/*
|
||||
*Registers for CMU_G2D
|
||||
*/
|
||||
|
||||
#define MUX_SEL_G2D 0x0200
|
||||
#define MUX_ENABLE_G2D 0x0300
|
||||
#define MUX_STAT_G2D 0x0400
|
||||
#define DIV_G2D 0x0600
|
||||
#define DIV_STAT_G2D 0x0700
|
||||
#define EN_ACLK_G2D 0x0800
|
||||
#define EN_ACLK_G2D_SECURE_SSS 0x0804
|
||||
#define EN_ACLK_G2D_SECURE_SLIM_SSS 0x0808
|
||||
#define EN_ACLK_G2D_SECURE_SMMU_SLIM_SSS 0x080c
|
||||
#define EN_ACLK_G2D_SECURE_SMMU_SSS 0x0810
|
||||
#define EN_ACLK_G2D_SECURE_SMMU_MDMA 0x0814
|
||||
#define EN_ACLK_G2D_SECURE_SMMU_G2D 0x0818
|
||||
#define EN_PCLK_G2D 0x0900
|
||||
#define EN_PCLK_G2D_SECURE_SMMU_SLIM_SSS 0x0904
|
||||
#define EN_PCLK_G2D_SECURE_SMMU_SSS 0x0908
|
||||
#define EN_PCLK_G2D_SECURE_SMMU_MDMA 0x090c
|
||||
#define EN_PCLK_G2D_SECURE_SMMU_G2D 0x0910
|
||||
#define EN_IP_G2D 0x0b00
|
||||
#define EN_IP_G2D_SECURE_SSS 0x0b04
|
||||
#define EN_IP_G2D_SECURE_SLIM_SSS 0x0b08
|
||||
#define EN_IP_G2D_SECURE_SMMU_SLIM_SSS 0x0b0c
|
||||
#define EN_IP_G2D_SECURE_SMMU_SSS 0x0b10
|
||||
#define EN_IP_G2D_SECURE_SMMU_MDMA 0x0b14
|
||||
#define EN_IP_G2D_SECURE_SMMU_G2D 0x0b18
|
||||
|
||||
/*
|
||||
*Registers for CMU_G3D
|
||||
*/
|
||||
|
||||
#define G3D_PLL_LOCK 0x0000
|
||||
#define G3D_PLL_CON0 0x0100
|
||||
#define G3D_PLL_CON1 0x0104
|
||||
#define G3D_PLL_FDET 0x010c
|
||||
#define MUX_SEL_G3D 0x0200
|
||||
#define MUX_EN_G3D 0x0300
|
||||
#define MUX_STAT_G3D 0x0400
|
||||
#define MUX_IGNORE_G3D 0x0500
|
||||
#define DIV_G3D 0x0600
|
||||
#define DIV_G3D_PLL_FDET 0x0604
|
||||
#define DIV_STAT_G3D 0x0700
|
||||
#define DIV_STAT_G3D_PLL_FDET 0x0704
|
||||
#define EN_ACLK_G3D 0x0800
|
||||
#define EN_PCLK_G3D 0x0900
|
||||
#define EN_SCLK_G3D 0x0a00
|
||||
#define EN_IP_G3D 0x0b00
|
||||
#define CLKOUT_CMU_G3D 0x0c00
|
||||
#define CLKOUT_CMU_G3D_DIV_STAT 0x0c04
|
||||
#define G3DCLK_STOPCTRL 0x1000
|
||||
#define G3D_EMA_CTRL 0x1008
|
||||
#define G3D_EMA_STATUS 0x100c
|
||||
|
||||
/*
|
||||
*Registers for CMU_GSCL
|
||||
*/
|
||||
|
||||
#define MUX_SEL_GSCL 0x0200
|
||||
#define MUX_EN_GSCL 0x0300
|
||||
#define MUX_STAT_GSCL 0x0400
|
||||
#define MUX_IGNORE_GSCL 0x0500
|
||||
#define DIV_GSCL 0x0600
|
||||
#define DIV_STAT_GSCL 0x0700
|
||||
#define EN_ACLK_GSCL 0x0800
|
||||
#define EN_ACLK_GSCL_FIMC 0x0804
|
||||
#define EN_ACLK_GSCL_SECURE_SMMU_GSCL0 0x0808
|
||||
#define EN_ACLK_GSCL_SECURE_SMMU_GSCL1 0x080c
|
||||
#define EN_ACLK_GSCL_SECURE_SMMU_MSCL0 0x0810
|
||||
#define EN_ACLK_GSCL_SECURE_SMMU_MSCL1 0x0814
|
||||
#define EN_PCLK_GSCL 0x0900
|
||||
#define EN_PCLK_GSCL_FIMC 0x0904
|
||||
#define EN_PCLK_GSCL_SECURE_SMMU_GSCL0 0x0908
|
||||
#define EN_PCLK_GSCL_SECURE_SMMU_GSCL1 0x090c
|
||||
#define EN_PCLK_GSCL_SECURE_SMMU_MSCL0 0x0910
|
||||
#define EN_PCLK_GSCL_SECURE_SMMU_MSCL1 0x0914
|
||||
#define EN_SCLK_GSCL 0x0a00
|
||||
#define EN_SCLK_GSCL_FIMC 0x0a04
|
||||
#define EN_IP_GSCL 0x0b00
|
||||
#define EN_IP_GSCL_FIMC 0x0b04
|
||||
#define EN_IP_GSCL_SECURE_SMMU_GSCL0 0x0b08
|
||||
#define EN_IP_GSCL_SECURE_SMMU_GSCL1 0x0b0c
|
||||
#define EN_IP_GSCL_SECURE_SMMU_MSCL0 0x0b10
|
||||
#define EN_IP_GSCL_SECURE_SMMU_MSCL1 0x0b14
|
||||
|
||||
/*
|
||||
*Registers for CMU_ISP
|
||||
*/
|
||||
#define MUX_SEL_ISP0 0x0200
|
||||
#define MUX_SEL_ISP1 0x0204
|
||||
#define MUX_ENABLE_ISP0 0x0300
|
||||
#define MUX_ENABLE_ISP1 0x0304
|
||||
#define MUX_STAT_ISP0 0x0400
|
||||
#define MUX_STAT_ISP1 0x0404
|
||||
#define MUX_IGNORE_ISP0 0x0500
|
||||
#define MUX_IGNORE_ISP1 0x0504
|
||||
#define DIV_ISP 0x0600
|
||||
#define DIV_STAT_ISP 0x0700
|
||||
#define EN_ACLK_ISP0 0x0800
|
||||
#define EN_ACLK_ISP1 0x0804
|
||||
#define EN_PCLK_ISP0 0x0900
|
||||
#define EN_PCLK_ISP1 0x0904
|
||||
#define EN_SCLK_ISP 0x0a00
|
||||
#define EN_IP_ISP0 0x0b00
|
||||
#define EN_IP_ISP1 0x0b04
|
||||
|
||||
/*
|
||||
*Registers for CMU_KFC
|
||||
*/
|
||||
#define KFC_PLL_LOCK 0x0000
|
||||
#define KFC_PLL_CON0 0x0100
|
||||
#define KFC_PLL_CON1 0x0104
|
||||
#define KFC_PLL_FDET 0x010c
|
||||
#define MUX_SEL_KFC0 0x0200
|
||||
#define MUX_SEL_KFC2 0x0208
|
||||
#define MUX_ENABLE_KFC0 0x0300
|
||||
#define MUX_ENABLE_KFC2 0x0308
|
||||
#define MUX_STAT_KFC0 0x0400
|
||||
#define MUX_STAT_KFC2 0x0408
|
||||
#define DIV_KFC 0x0600
|
||||
#define DIV_KFC_PLL_FDET 0x0604
|
||||
#define DIV_STAT_KFC 0x0700
|
||||
#define DIV_STAT_KFC_PLL_FDET 0x0704
|
||||
#define EN_ACLK_KFC 0x0800
|
||||
#define EN_PCLK_KFC 0x0900
|
||||
#define EN_SCLK_KFC 0x0a00
|
||||
#define EN_IP_KFC 0x0b00
|
||||
#define CLKOUT_CMU_KFC 0x0c00
|
||||
#define CLKOUT_CMU_KFC_DIV_STAT 0x0c04
|
||||
#define ARMCLK_STOPCTRL_KFC 0x1000
|
||||
#define ARM_EMA_CTRL 0x1008
|
||||
#define ARM_EMA_STATUS 0x100c
|
||||
#define PWR_CTRL_KFC 0x1020
|
||||
#define PWR_CTRL2_KFC 0x1024
|
||||
#define CLKSTOP_CTRL_KFC 0x1028
|
||||
#define INTR_SPREAD_ENABLE_KFC 0x1080
|
||||
#define INTR_SPREAD_USE_STANDBYWFI_KFC 0x1084
|
||||
#define INTR_SPREAD_BLOCKING_DURATION_KFC 0x1088
|
||||
#define CMU_KFC_SPARE0 0x2000
|
||||
#define CMU_KFC_SPARE1 0x2004
|
||||
#define CMU_KFC_SPARE2 0x2008
|
||||
#define CMU_KFC_SPARE3 0x200c
|
||||
#define CMU_KFC_SPARE4 0x2010
|
||||
|
||||
/*
|
||||
*Registers for CMU_MFC
|
||||
*/
|
||||
#define MUX_SEL_MFC 0x0200
|
||||
#define MUX_ENABLE_MFC 0x0300
|
||||
#define MUX_STAT_MFC 0x0400
|
||||
#define DIV_MFC 0x0600
|
||||
#define DIV_STAT_MFC 0x0700
|
||||
#define EN_ACLK_MFC 0x0800
|
||||
#define EN_ACLK_SECURE_SMMU2_MFC 0x0804
|
||||
#define EN_PCLK_MFC 0x0900
|
||||
#define EN_PCLK_SECURE_SMMU2_MFC 0x0904
|
||||
#define EN_IP_MFC 0x0b00
|
||||
#define EN_IP_MFC_SECURE_SMMU2_MFC 0x0b04
|
||||
|
||||
/*
|
||||
*Registers for CMU_MIF
|
||||
*/
|
||||
#define MEM_PLL_LOCK 0x0000
|
||||
#define BUS_PLL_LOCK 0x0004
|
||||
#define MEDIA_PLL_LOCK 0x0008
|
||||
#define MEM_PLL_CON0 0x0100
|
||||
#define MEM_PLL_CON1 0x0104
|
||||
#define MEM_PLL_FDET 0x010c
|
||||
#define BUS_PLL_CON0 0x0110
|
||||
#define BUS_PLL_CON1 0x0114
|
||||
#define BUS_PLL_FDET 0x011c
|
||||
#define MEDIA_PLL_CON0 0x0120
|
||||
#define MEDIA_PLL_CON1 0x0124
|
||||
#define MEDIA_PLL_FDET 0x012c
|
||||
#define MUX_SEL_MIF 0x0200
|
||||
#define MUX_ENABLE_MIF 0x0300
|
||||
#define MUX_STAT_MIF 0x0400
|
||||
#define MUX_IGNORE_MIF 0x0500
|
||||
#define DIV_MIF 0x0600
|
||||
#define DIV_MIF_PLL_FDET 0x0604
|
||||
#define DIV_STAT_MIF 0x0700
|
||||
#define DIV_STAT_MIF_PLL_FDET 0x0704
|
||||
#define EN_ACLK_MIF 0x0800
|
||||
#define EN_ACLK_MIF_SECURE_DREX1_TZ 0x0804
|
||||
#define EN_ACLK_MIF_SECURE_DREX0_TZ 0x0808
|
||||
#define EN_ACLK_MIF_SECURE_INTMEM 0x080c
|
||||
#define EN_PCLK_MIF 0x0900
|
||||
#define EN_PCLK_MIF_SECURE_MONOCNT 0x0904
|
||||
#define EN_PCLK_MIF_SECURE_RTC_APBIF 0x0908
|
||||
#define EN_PCLK_MIF_SECURE_DREX1_TZ 0x090c
|
||||
#define EN_PCLK_MIF_SECURE_DREX0_TZ 0x0910
|
||||
#define EN_SCLK_MIF 0x0a00
|
||||
#define EN_IP_MIF 0x0b00
|
||||
#define EN_IP_MIF_SECURE_MONOCNT 0x0b04
|
||||
#define EN_IP_MIF_SECURE_RTC_APBIF 0x0b08
|
||||
#define EN_IP_MIF_SECURE_DREX1_TZ 0x0b0c
|
||||
#define EN_IP_MIF_SECURE_DREX0_TZ 0x0b10
|
||||
#define EN_IP_MIF_SECURE_INTEMEM 0x0b14
|
||||
#define CLKOUT_CMU_MIF_DIV_STAT 0x0c04
|
||||
#define DREX_FREQ_CTRL 0x1000
|
||||
#define PAUSE 0x1004
|
||||
#define DDRPHY_LOCK_CTRL 0x1008
|
||||
#define CLKOUT_CMU_MIF 0xcb00
|
||||
|
||||
/*
|
||||
*Registers for CMU_PERI
|
||||
*/
|
||||
#define MUX_SEL_PERI 0x0200
|
||||
#define MUX_SEL_PERI1 0x0204
|
||||
#define MUX_ENABLE_PERI 0x0300
|
||||
#define MUX_ENABLE_PERI1 0x0304
|
||||
#define MUX_STAT_PERI 0x0400
|
||||
#define MUX_STAT_PERI1 0x0404
|
||||
#define MUX_IGNORE_PERI 0x0500
|
||||
#define MUX_IGNORE_PERI1 0x0504
|
||||
#define DIV_PERI 0x0600
|
||||
#define DIV_STAT_PERI 0x0700
|
||||
#define EN_PCLK_PERI0 0x0800
|
||||
#define EN_PCLK_PERI1 0x0804
|
||||
#define EN_PCLK_PERI2 0x0808
|
||||
#define EN_PCLK_PERI3 0x080c
|
||||
#define EN_PCLK_PERI_SECURE_CHIPID 0x0810
|
||||
#define EN_PCLK_PERI_SECURE_PROVKEY0 0x0814
|
||||
#define EN_PCLK_PERI_SECURE_PROVKEY1 0x0818
|
||||
#define EN_PCLK_PERI_SECURE_SECKEY 0x081c
|
||||
#define EN_PCLK_PERI_SECURE_ANTIRBKCNT 0x0820
|
||||
#define EN_PCLK_PERI_SECURE_TOP_RTC 0x0824
|
||||
#define EN_PCLK_PERI_SECURE_TZPC 0x0828
|
||||
#define EN_SCLK_PERI 0x0a00
|
||||
#define EN_SCLK_PERI_SECURE_TOP_RTC 0x0a04
|
||||
#define EN_IP_PERI0 0x0b00
|
||||
#define EN_IP_PERI1 0x0b04
|
||||
#define EN_IP_PERI2 0x0b08
|
||||
#define EN_IP_PERI_SECURE_CHIPID 0x0b0c
|
||||
#define EN_IP_PERI_SECURE_PROVKEY0 0x0b10
|
||||
#define EN_IP_PERI_SECURE_PROVKEY1 0x0b14
|
||||
#define EN_IP_PERI_SECURE_SECKEY 0x0b18
|
||||
#define EN_IP_PERI_SECURE_ANTIRBKCNT 0x0b1c
|
||||
#define EN_IP_PERI_SECURE_TOP_RTC 0x0b20
|
||||
#define EN_IP_PERI_SECURE_TZPC 0x0b24
|
||||
|
||||
/*
|
||||
*Registers for CMU_TOP
|
||||
*/
|
||||
#define DISP_PLL_LOCK 0x0000
|
||||
#define AUD_PLL_LOCK 0x0004
|
||||
#define DISP_PLL_CON0 0x0100
|
||||
#define DISP_PLL_CON1 0x0104
|
||||
#define DISP_PLL_FDET 0x0108
|
||||
#define AUD_PLL_CON0 0x0110
|
||||
#define AUD_PLL_CON1 0x0114
|
||||
#define AUD_PLL_CON2 0x0118
|
||||
#define AUD_PLL_FDET 0x011c
|
||||
#define MUX_SEL_TOP_PLL0 0x0200
|
||||
#define MUX_SEL_TOP_MFC 0x0204
|
||||
#define MUX_SEL_TOP_G2D 0x0208
|
||||
#define MUX_SEL_TOP_GSCL 0x020c
|
||||
#define MUX_SEL_TOP_ISP10 0x0214
|
||||
#define MUX_SEL_TOP_ISP11 0x0218
|
||||
#define MUX_SEL_TOP_DISP0 0x021c
|
||||
#define MUX_SEL_TOP_DISP1 0x0220
|
||||
#define MUX_SEL_TOP_BUS 0x0224
|
||||
#define MUX_SEL_TOP_PERI0 0x0228
|
||||
#define MUX_SEL_TOP_PERI1 0x022c
|
||||
#define MUX_SEL_TOP_FSYS 0x0230
|
||||
#define MUX_ENABLE_TOP_PLL0 0x0300
|
||||
#define MUX_ENABLE_TOP_MFC 0x0304
|
||||
#define MUX_ENABLE_TOP_G2D 0x0308
|
||||
#define MUX_ENABLE_TOP_GSCL 0x030c
|
||||
#define MUX_ENABLE_TOP_ISP10 0x0314
|
||||
#define MUX_ENABLE_TOP_ISP11 0x0318
|
||||
#define MUX_ENABLE_TOP_DISP0 0x031c
|
||||
#define MUX_ENABLE_TOP_DISP1 0x0320
|
||||
#define MUX_ENABLE_TOP_BUS 0x0324
|
||||
#define MUX_ENABLE_TOP_PERI0 0x0328
|
||||
#define MUX_ENABLE_TOP_PERI1 0x032c
|
||||
#define MUX_ENABLE_TOP_FSYS 0x0330
|
||||
#define MUX_STAT_TOP_PLL0 0x0400
|
||||
#define MUX_STAT_TOP_MFC 0x0404
|
||||
#define MUX_STAT_TOP_G2D 0x0408
|
||||
#define MUX_STAT_TOP_GSCL 0x040c
|
||||
#define MUX_STAT_TOP_ISP10 0x0414
|
||||
#define MUX_STAT_TOP_ISP11 0x0418
|
||||
#define MUX_STAT_TOP_DISP0 0x041c
|
||||
#define MUX_STAT_TOP_DISP1 0x0420
|
||||
#define MUX_STAT_TOP_BUS 0x0424
|
||||
#define MUX_STAT_TOP_PERI0 0x0428
|
||||
#define MUX_STAT_TOP_PERI1 0x042c
|
||||
#define MUX_STAT_TOP_FSYS 0x0430
|
||||
#define MUX_IGNORE_TOP_PLL0 0x0500
|
||||
#define MUX_IGNORE_TOP_MFC 0x0504
|
||||
#define MUX_IGNORE_TOP_G2D 0x0508
|
||||
#define MUX_IGNORE_TOP_GSCL 0x050c
|
||||
#define MUX_IGNORE_TOP_ISP10 0x0514
|
||||
#define MUX_IGNORE_TOP_ISP11 0x0518
|
||||
#define MUX_IGNORE_TOP_DISP0 0x051c
|
||||
#define MUX_IGNORE_TOP_DISP1 0x0520
|
||||
#define MUX_IGNORE_TOP_BUS 0x0524
|
||||
#define MUX_IGNORE_TOP_PERI0 0x0528
|
||||
#define MUX_IGNORE_TOP_PERI1 0x052c
|
||||
#define MUX_IGNORE_TOP_FSYS 0x0530
|
||||
#define DIV_TOP_G2D_MFC 0x0600
|
||||
#define DIV_TOP_GSCL_ISP0 0x0604
|
||||
#define DIV_TOP_ISP10 0x0608
|
||||
#define DIV_TOP_ISP11 0x060c
|
||||
#define DIV_TOP_DISP 0x0610
|
||||
#define DIV_TOP_BUS 0x0614
|
||||
#define DIV_TOP_PERI0 0x0618
|
||||
#define DIV_TOP_PERI1 0x061c
|
||||
#define DIV_TOP_PERI2 0x0620
|
||||
#define DIV_TOP_FSYS0 0x0624
|
||||
#define DIV_TOP_FSYS1 0x0628
|
||||
#define DIV_TOP_HPM 0x062c
|
||||
#define DIV_TOP_PLL_FDET 0x0630
|
||||
#define DIV_STAT_TOP_G2D_MFC 0x0700
|
||||
#define DIV_STAT_TOP_GSCL_ISP0 0x0704
|
||||
#define DIV_STAT_TOP_ISP10 0x0708
|
||||
#define DIV_STAT_TOP_ISP11 0x070c
|
||||
#define DIV_STAT_TOP_DISP 0x0710
|
||||
#define DIV_STAT_TOP_BUS 0x0714
|
||||
#define DIV_STAT_TOP_PERI0 0x0718
|
||||
#define DIV_STAT_TOP_PERI1 0x071c
|
||||
#define DIV_STAT_TOP_PERI2 0x0720
|
||||
#define DIV_STAT_TOP_FSYS0 0x0724
|
||||
#define DIV_STAT_TOP_FSYS1 0x0728
|
||||
#define DIV_STAT_TOP_HPM 0x072c
|
||||
#define DIV_STAT_TOP_PLL_FDET 0x0730
|
||||
#define EN_ACLK_TOP 0x0800
|
||||
#define EN_SCLK_TOP 0x0a00
|
||||
#define EN_IP_TOP 0x0b00
|
||||
#define CLKOUT_CMU_TOP 0x0c00
|
||||
#define CLKOUT_CMU_TOP_DIV_STAT 0x0c04
|
||||
|
||||
#endif /*__CLK_EXYNOS5260_H */
|
||||
|
||||
|
|
@ -778,6 +778,8 @@ static struct of_device_id ext_clk_match[] __initdata = {
|
|||
/* register exynos5420 clocks */
|
||||
static void __init exynos5420_clk_init(struct device_node *np)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
|
||||
if (np) {
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base)
|
||||
|
|
@ -786,21 +788,25 @@ static void __init exynos5420_clk_init(struct device_node *np)
|
|||
panic("%s: unable to determine soc\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks,
|
||||
ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
samsung_clk_of_register_fixed_ext(ctx, exynos5420_fixed_rate_ext_clks,
|
||||
ARRAY_SIZE(exynos5420_fixed_rate_ext_clks),
|
||||
ext_clk_match);
|
||||
samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls),
|
||||
reg_base);
|
||||
samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks,
|
||||
samsung_clk_register_pll(ctx, exynos5420_plls,
|
||||
ARRAY_SIZE(exynos5420_plls),
|
||||
reg_base);
|
||||
samsung_clk_register_fixed_rate(ctx, exynos5420_fixed_rate_clks,
|
||||
ARRAY_SIZE(exynos5420_fixed_rate_clks));
|
||||
samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks,
|
||||
samsung_clk_register_fixed_factor(ctx, exynos5420_fixed_factor_clks,
|
||||
ARRAY_SIZE(exynos5420_fixed_factor_clks));
|
||||
samsung_clk_register_mux(exynos5420_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos5420_mux_clks,
|
||||
ARRAY_SIZE(exynos5420_mux_clks));
|
||||
samsung_clk_register_div(exynos5420_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos5420_div_clks,
|
||||
ARRAY_SIZE(exynos5420_div_clks));
|
||||
samsung_clk_register_gate(exynos5420_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos5420_gate_clks,
|
||||
ARRAY_SIZE(exynos5420_gate_clks));
|
||||
|
||||
exynos5420_clk_sleep_init();
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ static struct of_device_id ext_clk_match[] __initdata = {
|
|||
static void __init exynos5440_clk_init(struct device_node *np)
|
||||
{
|
||||
void __iomem *reg_base;
|
||||
struct samsung_clk_provider *ctx;
|
||||
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base) {
|
||||
|
|
@ -101,22 +102,25 @@ static void __init exynos5440_clk_init(struct device_node *np)
|
|||
return;
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
samsung_clk_of_register_fixed_ext(exynos5440_fixed_rate_ext_clks,
|
||||
ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks,
|
||||
ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match);
|
||||
|
||||
samsung_clk_register_pll2550x("cplla", "xtal", reg_base + 0x1c, 0x10);
|
||||
samsung_clk_register_pll2550x("cpllb", "xtal", reg_base + 0x20, 0x10);
|
||||
|
||||
samsung_clk_register_fixed_rate(exynos5440_fixed_rate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, exynos5440_fixed_rate_clks,
|
||||
ARRAY_SIZE(exynos5440_fixed_rate_clks));
|
||||
samsung_clk_register_fixed_factor(exynos5440_fixed_factor_clks,
|
||||
samsung_clk_register_fixed_factor(ctx, exynos5440_fixed_factor_clks,
|
||||
ARRAY_SIZE(exynos5440_fixed_factor_clks));
|
||||
samsung_clk_register_mux(exynos5440_mux_clks,
|
||||
samsung_clk_register_mux(ctx, exynos5440_mux_clks,
|
||||
ARRAY_SIZE(exynos5440_mux_clks));
|
||||
samsung_clk_register_div(exynos5440_div_clks,
|
||||
samsung_clk_register_div(ctx, exynos5440_div_clks,
|
||||
ARRAY_SIZE(exynos5440_div_clks));
|
||||
samsung_clk_register_gate(exynos5440_gate_clks,
|
||||
samsung_clk_register_gate(ctx, exynos5440_gate_clks,
|
||||
ARRAY_SIZE(exynos5440_gate_clks));
|
||||
|
||||
pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk"));
|
||||
|
|
|
|||
|
|
@ -947,8 +947,206 @@ struct clk * __init samsung_clk_register_pll2550x(const char *name,
|
|||
return clk;
|
||||
}
|
||||
|
||||
static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
|
||||
void __iomem *base)
|
||||
/*
|
||||
* PLL2550xx Clock Type
|
||||
*/
|
||||
|
||||
/* Maximum lock time can be 270 * PDIV cycles */
|
||||
#define PLL2550XX_LOCK_FACTOR 270
|
||||
|
||||
#define PLL2550XX_M_MASK 0x3FF
|
||||
#define PLL2550XX_P_MASK 0x3F
|
||||
#define PLL2550XX_S_MASK 0x7
|
||||
#define PLL2550XX_LOCK_STAT_MASK 0x1
|
||||
#define PLL2550XX_M_SHIFT 9
|
||||
#define PLL2550XX_P_SHIFT 3
|
||||
#define PLL2550XX_S_SHIFT 0
|
||||
#define PLL2550XX_LOCK_STAT_SHIFT 21
|
||||
|
||||
static unsigned long samsung_pll2550xx_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct samsung_clk_pll *pll = to_clk_pll(hw);
|
||||
u32 mdiv, pdiv, sdiv, pll_con;
|
||||
u64 fvco = parent_rate;
|
||||
|
||||
pll_con = __raw_readl(pll->con_reg);
|
||||
mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK;
|
||||
pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK;
|
||||
sdiv = (pll_con >> PLL2550XX_S_SHIFT) & PLL2550XX_S_MASK;
|
||||
|
||||
fvco *= mdiv;
|
||||
do_div(fvco, (pdiv << sdiv));
|
||||
|
||||
return (unsigned long)fvco;
|
||||
}
|
||||
|
||||
static inline bool samsung_pll2550xx_mp_change(u32 mdiv, u32 pdiv, u32 pll_con)
|
||||
{
|
||||
u32 old_mdiv, old_pdiv;
|
||||
|
||||
old_mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK;
|
||||
old_pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK;
|
||||
|
||||
return mdiv != old_mdiv || pdiv != old_pdiv;
|
||||
}
|
||||
|
||||
static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate,
|
||||
unsigned long prate)
|
||||
{
|
||||
struct samsung_clk_pll *pll = to_clk_pll(hw);
|
||||
const struct samsung_pll_rate_table *rate;
|
||||
u32 tmp;
|
||||
|
||||
/* Get required rate settings from table */
|
||||
rate = samsung_get_pll_settings(pll, drate);
|
||||
if (!rate) {
|
||||
pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
|
||||
drate, __clk_get_name(hw->clk));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
tmp = __raw_readl(pll->con_reg);
|
||||
|
||||
if (!(samsung_pll2550xx_mp_change(rate->mdiv, rate->pdiv, tmp))) {
|
||||
/* If only s change, change just s value only*/
|
||||
tmp &= ~(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT);
|
||||
tmp |= rate->sdiv << PLL2550XX_S_SHIFT;
|
||||
__raw_writel(tmp, pll->con_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set PLL lock time. */
|
||||
__raw_writel(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg);
|
||||
|
||||
/* Change PLL PMS values */
|
||||
tmp &= ~((PLL2550XX_M_MASK << PLL2550XX_M_SHIFT) |
|
||||
(PLL2550XX_P_MASK << PLL2550XX_P_SHIFT) |
|
||||
(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT));
|
||||
tmp |= (rate->mdiv << PLL2550XX_M_SHIFT) |
|
||||
(rate->pdiv << PLL2550XX_P_SHIFT) |
|
||||
(rate->sdiv << PLL2550XX_S_SHIFT);
|
||||
__raw_writel(tmp, pll->con_reg);
|
||||
|
||||
/* wait_lock_time */
|
||||
do {
|
||||
cpu_relax();
|
||||
tmp = __raw_readl(pll->con_reg);
|
||||
} while (!(tmp & (PLL2550XX_LOCK_STAT_MASK
|
||||
<< PLL2550XX_LOCK_STAT_SHIFT)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct clk_ops samsung_pll2550xx_clk_ops = {
|
||||
.recalc_rate = samsung_pll2550xx_recalc_rate,
|
||||
.round_rate = samsung_pll_round_rate,
|
||||
.set_rate = samsung_pll2550xx_set_rate,
|
||||
};
|
||||
|
||||
static const struct clk_ops samsung_pll2550xx_clk_min_ops = {
|
||||
.recalc_rate = samsung_pll2550xx_recalc_rate,
|
||||
};
|
||||
|
||||
/*
|
||||
* PLL2650XX Clock Type
|
||||
*/
|
||||
|
||||
/* Maximum lock time can be 3000 * PDIV cycles */
|
||||
#define PLL2650XX_LOCK_FACTOR 3000
|
||||
|
||||
#define PLL2650XX_MDIV_SHIFT 9
|
||||
#define PLL2650XX_PDIV_SHIFT 3
|
||||
#define PLL2650XX_SDIV_SHIFT 0
|
||||
#define PLL2650XX_KDIV_SHIFT 0
|
||||
#define PLL2650XX_MDIV_MASK 0x1ff
|
||||
#define PLL2650XX_PDIV_MASK 0x3f
|
||||
#define PLL2650XX_SDIV_MASK 0x7
|
||||
#define PLL2650XX_KDIV_MASK 0xffff
|
||||
#define PLL2650XX_PLL_ENABLE_SHIFT 23
|
||||
#define PLL2650XX_PLL_LOCKTIME_SHIFT 21
|
||||
#define PLL2650XX_PLL_FOUTMASK_SHIFT 31
|
||||
|
||||
static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct samsung_clk_pll *pll = to_clk_pll(hw);
|
||||
u32 mdiv, pdiv, sdiv, pll_con0, pll_con2;
|
||||
s16 kdiv;
|
||||
u64 fvco = parent_rate;
|
||||
|
||||
pll_con0 = __raw_readl(pll->con_reg);
|
||||
pll_con2 = __raw_readl(pll->con_reg + 8);
|
||||
mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK;
|
||||
pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK;
|
||||
sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK;
|
||||
kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK);
|
||||
|
||||
fvco *= (mdiv << 16) + kdiv;
|
||||
do_div(fvco, (pdiv << sdiv));
|
||||
fvco >>= 16;
|
||||
|
||||
return (unsigned long)fvco;
|
||||
}
|
||||
|
||||
static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct samsung_clk_pll *pll = to_clk_pll(hw);
|
||||
u32 tmp, pll_con0, pll_con2;
|
||||
const struct samsung_pll_rate_table *rate;
|
||||
|
||||
rate = samsung_get_pll_settings(pll, drate);
|
||||
if (!rate) {
|
||||
pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
|
||||
drate, __clk_get_name(hw->clk));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pll_con0 = __raw_readl(pll->con_reg);
|
||||
pll_con2 = __raw_readl(pll->con_reg + 8);
|
||||
|
||||
/* Change PLL PMS values */
|
||||
pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT |
|
||||
PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT |
|
||||
PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT);
|
||||
pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT;
|
||||
pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT;
|
||||
pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT;
|
||||
pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT;
|
||||
pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT;
|
||||
|
||||
pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT);
|
||||
pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK)
|
||||
<< PLL2650XX_KDIV_SHIFT;
|
||||
|
||||
/* Set PLL lock time. */
|
||||
__raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
|
||||
|
||||
__raw_writel(pll_con0, pll->con_reg);
|
||||
__raw_writel(pll_con2, pll->con_reg + 8);
|
||||
|
||||
do {
|
||||
tmp = __raw_readl(pll->con_reg);
|
||||
} while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct clk_ops samsung_pll2650xx_clk_ops = {
|
||||
.recalc_rate = samsung_pll2650xx_recalc_rate,
|
||||
.set_rate = samsung_pll2650xx_set_rate,
|
||||
.round_rate = samsung_pll_round_rate,
|
||||
};
|
||||
|
||||
static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
|
||||
.recalc_rate = samsung_pll2650xx_recalc_rate,
|
||||
};
|
||||
|
||||
static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
|
||||
struct samsung_pll_clock *pll_clk,
|
||||
void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_pll *pll;
|
||||
struct clk *clk;
|
||||
|
|
@ -1048,6 +1246,18 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
|
|||
else
|
||||
init.ops = &samsung_s3c2440_mpll_clk_ops;
|
||||
break;
|
||||
case pll_2550xx:
|
||||
if (!pll->rate_table)
|
||||
init.ops = &samsung_pll2550xx_clk_min_ops;
|
||||
else
|
||||
init.ops = &samsung_pll2550xx_clk_ops;
|
||||
break;
|
||||
case pll_2650xx:
|
||||
if (!pll->rate_table)
|
||||
init.ops = &samsung_pll2650xx_clk_min_ops;
|
||||
else
|
||||
init.ops = &samsung_pll2650xx_clk_ops;
|
||||
break;
|
||||
default:
|
||||
pr_warn("%s: Unknown pll type for pll clk %s\n",
|
||||
__func__, pll_clk->name);
|
||||
|
|
@ -1066,7 +1276,7 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
|
|||
return;
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, pll_clk->id);
|
||||
samsung_clk_add_lookup(ctx, clk, pll_clk->id);
|
||||
|
||||
if (!pll_clk->alias)
|
||||
return;
|
||||
|
|
@ -1077,11 +1287,12 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
|
|||
__func__, pll_clk->name, ret);
|
||||
}
|
||||
|
||||
void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list,
|
||||
unsigned int nr_pll, void __iomem *base)
|
||||
void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
|
||||
struct samsung_pll_clock *pll_list,
|
||||
unsigned int nr_pll, void __iomem *base)
|
||||
{
|
||||
int cnt;
|
||||
|
||||
for (cnt = 0; cnt < nr_pll; cnt++)
|
||||
_samsung_clk_register_pll(&pll_list[cnt], base);
|
||||
_samsung_clk_register_pll(ctx, &pll_list[cnt], base);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ enum samsung_pll_type {
|
|||
pll_s3c2410_mpll,
|
||||
pll_s3c2410_upll,
|
||||
pll_s3c2440_mpll,
|
||||
pll_2550xx,
|
||||
pll_2650xx,
|
||||
};
|
||||
|
||||
#define PLL_35XX_RATE(_rate, _m, _p, _s) \
|
||||
|
|
|
|||
|
|
@ -344,21 +344,24 @@ struct samsung_fixed_rate_clock s3c2410_common_frate_clks[] __initdata = {
|
|||
FRATE(XTI, "xti", NULL, CLK_IS_ROOT, 0),
|
||||
};
|
||||
|
||||
static void __init s3c2410_common_clk_register_fixed_ext(unsigned long xti_f)
|
||||
static void __init s3c2410_common_clk_register_fixed_ext(
|
||||
struct samsung_clk_provider *ctx,
|
||||
unsigned long xti_f)
|
||||
{
|
||||
struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal");
|
||||
|
||||
s3c2410_common_frate_clks[0].fixed_rate = xti_f;
|
||||
samsung_clk_register_fixed_rate(s3c2410_common_frate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, s3c2410_common_frate_clks,
|
||||
ARRAY_SIZE(s3c2410_common_frate_clks));
|
||||
|
||||
samsung_clk_register_alias(&xti_alias, 1);
|
||||
samsung_clk_register_alias(ctx, &xti_alias, 1);
|
||||
}
|
||||
|
||||
void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
|
||||
int current_soc,
|
||||
void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
reg_base = base;
|
||||
|
||||
if (np) {
|
||||
|
|
@ -367,11 +370,13 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
panic("%s: failed to map registers\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
ctx = samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
/* Register external clocks only in non-dt cases */
|
||||
if (!np)
|
||||
s3c2410_common_clk_register_fixed_ext(xti_f);
|
||||
s3c2410_common_clk_register_fixed_ext(ctx, xti_f);
|
||||
|
||||
if (current_soc == 2410) {
|
||||
if (_get_rate("xti") == 12 * MHZ) {
|
||||
|
|
@ -380,7 +385,7 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
}
|
||||
|
||||
/* Register PLLs. */
|
||||
samsung_clk_register_pll(s3c2410_plls,
|
||||
samsung_clk_register_pll(ctx, s3c2410_plls,
|
||||
ARRAY_SIZE(s3c2410_plls), reg_base);
|
||||
|
||||
} else { /* S3C2440, S3C2442 */
|
||||
|
|
@ -396,49 +401,49 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
}
|
||||
|
||||
/* Register PLLs. */
|
||||
samsung_clk_register_pll(s3c244x_common_plls,
|
||||
samsung_clk_register_pll(ctx, s3c244x_common_plls,
|
||||
ARRAY_SIZE(s3c244x_common_plls), reg_base);
|
||||
}
|
||||
|
||||
/* Register common internal clocks. */
|
||||
samsung_clk_register_mux(s3c2410_common_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2410_common_muxes,
|
||||
ARRAY_SIZE(s3c2410_common_muxes));
|
||||
samsung_clk_register_div(s3c2410_common_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2410_common_dividers,
|
||||
ARRAY_SIZE(s3c2410_common_dividers));
|
||||
samsung_clk_register_gate(s3c2410_common_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2410_common_gates,
|
||||
ARRAY_SIZE(s3c2410_common_gates));
|
||||
|
||||
if (current_soc == S3C2440 || current_soc == S3C2442) {
|
||||
samsung_clk_register_div(s3c244x_common_dividers,
|
||||
samsung_clk_register_div(ctx, s3c244x_common_dividers,
|
||||
ARRAY_SIZE(s3c244x_common_dividers));
|
||||
samsung_clk_register_gate(s3c244x_common_gates,
|
||||
samsung_clk_register_gate(ctx, s3c244x_common_gates,
|
||||
ARRAY_SIZE(s3c244x_common_gates));
|
||||
samsung_clk_register_mux(s3c244x_common_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c244x_common_muxes,
|
||||
ARRAY_SIZE(s3c244x_common_muxes));
|
||||
samsung_clk_register_fixed_factor(s3c244x_common_ffactor,
|
||||
samsung_clk_register_fixed_factor(ctx, s3c244x_common_ffactor,
|
||||
ARRAY_SIZE(s3c244x_common_ffactor));
|
||||
}
|
||||
|
||||
/* Register SoC-specific clocks. */
|
||||
switch (current_soc) {
|
||||
case S3C2410:
|
||||
samsung_clk_register_div(s3c2410_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2410_dividers,
|
||||
ARRAY_SIZE(s3c2410_dividers));
|
||||
samsung_clk_register_fixed_factor(s3c2410_ffactor,
|
||||
samsung_clk_register_fixed_factor(ctx, s3c2410_ffactor,
|
||||
ARRAY_SIZE(s3c2410_ffactor));
|
||||
samsung_clk_register_alias(s3c2410_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2410_aliases,
|
||||
ARRAY_SIZE(s3c2410_common_aliases));
|
||||
break;
|
||||
case S3C2440:
|
||||
samsung_clk_register_mux(s3c2440_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2440_muxes,
|
||||
ARRAY_SIZE(s3c2440_muxes));
|
||||
samsung_clk_register_gate(s3c2440_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2440_gates,
|
||||
ARRAY_SIZE(s3c2440_gates));
|
||||
break;
|
||||
case S3C2442:
|
||||
samsung_clk_register_mux(s3c2442_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2442_muxes,
|
||||
ARRAY_SIZE(s3c2442_muxes));
|
||||
samsung_clk_register_fixed_factor(s3c2442_ffactor,
|
||||
samsung_clk_register_fixed_factor(ctx, s3c2442_ffactor,
|
||||
ARRAY_SIZE(s3c2442_ffactor));
|
||||
break;
|
||||
}
|
||||
|
|
@ -447,11 +452,11 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
* Register common aliases at the end, as some of the aliased clocks
|
||||
* are SoC specific.
|
||||
*/
|
||||
samsung_clk_register_alias(s3c2410_common_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2410_common_aliases,
|
||||
ARRAY_SIZE(s3c2410_common_aliases));
|
||||
|
||||
if (current_soc == S3C2440 || current_soc == S3C2442) {
|
||||
samsung_clk_register_alias(s3c244x_common_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c244x_common_aliases,
|
||||
ARRAY_SIZE(s3c244x_common_aliases));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -214,23 +214,25 @@ struct samsung_fixed_rate_clock s3c2412_common_frate_clks[] __initdata = {
|
|||
FRATE(0, "ext", NULL, CLK_IS_ROOT, 0),
|
||||
};
|
||||
|
||||
static void __init s3c2412_common_clk_register_fixed_ext(unsigned long xti_f,
|
||||
unsigned long ext_f)
|
||||
static void __init s3c2412_common_clk_register_fixed_ext(
|
||||
struct samsung_clk_provider *ctx,
|
||||
unsigned long xti_f, unsigned long ext_f)
|
||||
{
|
||||
/* xtal alias is necessary for the current cpufreq driver */
|
||||
struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal");
|
||||
|
||||
s3c2412_common_frate_clks[0].fixed_rate = xti_f;
|
||||
s3c2412_common_frate_clks[1].fixed_rate = ext_f;
|
||||
samsung_clk_register_fixed_rate(s3c2412_common_frate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, s3c2412_common_frate_clks,
|
||||
ARRAY_SIZE(s3c2412_common_frate_clks));
|
||||
|
||||
samsung_clk_register_alias(&xti_alias, 1);
|
||||
samsung_clk_register_alias(ctx, &xti_alias, 1);
|
||||
}
|
||||
|
||||
void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
|
||||
unsigned long ext_f, void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
reg_base = base;
|
||||
|
||||
if (np) {
|
||||
|
|
@ -239,24 +241,27 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
panic("%s: failed to map registers\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
ctx = samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
/* Register external clocks only in non-dt cases */
|
||||
if (!np)
|
||||
s3c2412_common_clk_register_fixed_ext(xti_f, ext_f);
|
||||
s3c2412_common_clk_register_fixed_ext(ctx, xti_f, ext_f);
|
||||
|
||||
/* Register PLLs. */
|
||||
samsung_clk_register_pll(s3c2412_plls, ARRAY_SIZE(s3c2412_plls),
|
||||
samsung_clk_register_pll(ctx, s3c2412_plls, ARRAY_SIZE(s3c2412_plls),
|
||||
reg_base);
|
||||
|
||||
/* Register common internal clocks. */
|
||||
samsung_clk_register_mux(s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes));
|
||||
samsung_clk_register_div(s3c2412_dividers,
|
||||
samsung_clk_register_mux(ctx, s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes));
|
||||
samsung_clk_register_div(ctx, s3c2412_dividers,
|
||||
ARRAY_SIZE(s3c2412_dividers));
|
||||
samsung_clk_register_gate(s3c2412_gates, ARRAY_SIZE(s3c2412_gates));
|
||||
samsung_clk_register_fixed_factor(s3c2412_ffactor,
|
||||
samsung_clk_register_gate(ctx, s3c2412_gates,
|
||||
ARRAY_SIZE(s3c2412_gates));
|
||||
samsung_clk_register_fixed_factor(ctx, s3c2412_ffactor,
|
||||
ARRAY_SIZE(s3c2412_ffactor));
|
||||
samsung_clk_register_alias(s3c2412_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2412_aliases,
|
||||
ARRAY_SIZE(s3c2412_aliases));
|
||||
|
||||
s3c2412_clk_sleep_init();
|
||||
|
|
|
|||
|
|
@ -365,10 +365,11 @@ struct samsung_fixed_rate_clock s3c2443_common_frate_clks[] __initdata = {
|
|||
FRATE(0, "ext_uart", NULL, CLK_IS_ROOT, 0),
|
||||
};
|
||||
|
||||
static void __init s3c2443_common_clk_register_fixed_ext(unsigned long xti_f)
|
||||
static void __init s3c2443_common_clk_register_fixed_ext(
|
||||
struct samsung_clk_provider *ctx, unsigned long xti_f)
|
||||
{
|
||||
s3c2443_common_frate_clks[0].fixed_rate = xti_f;
|
||||
samsung_clk_register_fixed_rate(s3c2443_common_frate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, s3c2443_common_frate_clks,
|
||||
ARRAY_SIZE(s3c2443_common_frate_clks));
|
||||
}
|
||||
|
||||
|
|
@ -376,6 +377,7 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
int current_soc,
|
||||
void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
reg_base = base;
|
||||
|
||||
if (np) {
|
||||
|
|
@ -384,58 +386,60 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
panic("%s: failed to map registers\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
ctx = samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
/* Register external clocks only in non-dt cases */
|
||||
if (!np)
|
||||
s3c2443_common_clk_register_fixed_ext(xti_f);
|
||||
s3c2443_common_clk_register_fixed_ext(ctx, xti_f);
|
||||
|
||||
/* Register PLLs. */
|
||||
if (current_soc == S3C2416 || current_soc == S3C2450)
|
||||
samsung_clk_register_pll(s3c2416_pll_clks,
|
||||
samsung_clk_register_pll(ctx, s3c2416_pll_clks,
|
||||
ARRAY_SIZE(s3c2416_pll_clks), reg_base);
|
||||
else
|
||||
samsung_clk_register_pll(s3c2443_pll_clks,
|
||||
samsung_clk_register_pll(ctx, s3c2443_pll_clks,
|
||||
ARRAY_SIZE(s3c2443_pll_clks), reg_base);
|
||||
|
||||
/* Register common internal clocks. */
|
||||
samsung_clk_register_mux(s3c2443_common_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2443_common_muxes,
|
||||
ARRAY_SIZE(s3c2443_common_muxes));
|
||||
samsung_clk_register_div(s3c2443_common_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2443_common_dividers,
|
||||
ARRAY_SIZE(s3c2443_common_dividers));
|
||||
samsung_clk_register_gate(s3c2443_common_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2443_common_gates,
|
||||
ARRAY_SIZE(s3c2443_common_gates));
|
||||
samsung_clk_register_alias(s3c2443_common_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2443_common_aliases,
|
||||
ARRAY_SIZE(s3c2443_common_aliases));
|
||||
|
||||
/* Register SoC-specific clocks. */
|
||||
switch (current_soc) {
|
||||
case S3C2450:
|
||||
samsung_clk_register_div(s3c2450_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2450_dividers,
|
||||
ARRAY_SIZE(s3c2450_dividers));
|
||||
samsung_clk_register_mux(s3c2450_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2450_muxes,
|
||||
ARRAY_SIZE(s3c2450_muxes));
|
||||
samsung_clk_register_gate(s3c2450_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2450_gates,
|
||||
ARRAY_SIZE(s3c2450_gates));
|
||||
samsung_clk_register_alias(s3c2450_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2450_aliases,
|
||||
ARRAY_SIZE(s3c2450_aliases));
|
||||
/* fall through, as s3c2450 extends the s3c2416 clocks */
|
||||
case S3C2416:
|
||||
samsung_clk_register_div(s3c2416_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2416_dividers,
|
||||
ARRAY_SIZE(s3c2416_dividers));
|
||||
samsung_clk_register_mux(s3c2416_muxes,
|
||||
samsung_clk_register_mux(ctx, s3c2416_muxes,
|
||||
ARRAY_SIZE(s3c2416_muxes));
|
||||
samsung_clk_register_gate(s3c2416_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2416_gates,
|
||||
ARRAY_SIZE(s3c2416_gates));
|
||||
samsung_clk_register_alias(s3c2416_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2416_aliases,
|
||||
ARRAY_SIZE(s3c2416_aliases));
|
||||
break;
|
||||
case S3C2443:
|
||||
samsung_clk_register_div(s3c2443_dividers,
|
||||
samsung_clk_register_div(ctx, s3c2443_dividers,
|
||||
ARRAY_SIZE(s3c2443_dividers));
|
||||
samsung_clk_register_gate(s3c2443_gates,
|
||||
samsung_clk_register_gate(ctx, s3c2443_gates,
|
||||
ARRAY_SIZE(s3c2443_gates));
|
||||
samsung_clk_register_alias(s3c2443_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c2443_aliases,
|
||||
ARRAY_SIZE(s3c2443_aliases));
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -442,12 +442,14 @@ static struct samsung_clock_alias s3c6410_clock_aliases[] = {
|
|||
ALIAS(MEM0_SROM, NULL, "srom"),
|
||||
};
|
||||
|
||||
static void __init s3c64xx_clk_register_fixed_ext(unsigned long fin_pll_f,
|
||||
unsigned long xusbxti_f)
|
||||
static void __init s3c64xx_clk_register_fixed_ext(
|
||||
struct samsung_clk_provider *ctx,
|
||||
unsigned long fin_pll_f,
|
||||
unsigned long xusbxti_f)
|
||||
{
|
||||
s3c64xx_fixed_rate_ext_clks[0].fixed_rate = fin_pll_f;
|
||||
s3c64xx_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f;
|
||||
samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_ext_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_ext_clks,
|
||||
ARRAY_SIZE(s3c64xx_fixed_rate_ext_clks));
|
||||
}
|
||||
|
||||
|
|
@ -456,6 +458,8 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
|
|||
unsigned long xusbxti_f, bool s3c6400,
|
||||
void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
|
||||
reg_base = base;
|
||||
is_s3c6400 = s3c6400;
|
||||
|
||||
|
|
@ -465,48 +469,50 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
|
|||
panic("%s: failed to map registers\n", __func__);
|
||||
}
|
||||
|
||||
samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
ctx = samsung_clk_init(np, reg_base, NR_CLKS);
|
||||
if (!ctx)
|
||||
panic("%s: unable to allocate context.\n", __func__);
|
||||
|
||||
/* Register external clocks. */
|
||||
if (!np)
|
||||
s3c64xx_clk_register_fixed_ext(xtal_f, xusbxti_f);
|
||||
s3c64xx_clk_register_fixed_ext(ctx, xtal_f, xusbxti_f);
|
||||
|
||||
/* Register PLLs. */
|
||||
samsung_clk_register_pll(s3c64xx_pll_clks,
|
||||
samsung_clk_register_pll(ctx, s3c64xx_pll_clks,
|
||||
ARRAY_SIZE(s3c64xx_pll_clks), reg_base);
|
||||
|
||||
/* Register common internal clocks. */
|
||||
samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_clks,
|
||||
samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_clks,
|
||||
ARRAY_SIZE(s3c64xx_fixed_rate_clks));
|
||||
samsung_clk_register_mux(s3c64xx_mux_clks,
|
||||
samsung_clk_register_mux(ctx, s3c64xx_mux_clks,
|
||||
ARRAY_SIZE(s3c64xx_mux_clks));
|
||||
samsung_clk_register_div(s3c64xx_div_clks,
|
||||
samsung_clk_register_div(ctx, s3c64xx_div_clks,
|
||||
ARRAY_SIZE(s3c64xx_div_clks));
|
||||
samsung_clk_register_gate(s3c64xx_gate_clks,
|
||||
samsung_clk_register_gate(ctx, s3c64xx_gate_clks,
|
||||
ARRAY_SIZE(s3c64xx_gate_clks));
|
||||
|
||||
/* Register SoC-specific clocks. */
|
||||
if (is_s3c6400) {
|
||||
samsung_clk_register_mux(s3c6400_mux_clks,
|
||||
samsung_clk_register_mux(ctx, s3c6400_mux_clks,
|
||||
ARRAY_SIZE(s3c6400_mux_clks));
|
||||
samsung_clk_register_div(s3c6400_div_clks,
|
||||
samsung_clk_register_div(ctx, s3c6400_div_clks,
|
||||
ARRAY_SIZE(s3c6400_div_clks));
|
||||
samsung_clk_register_gate(s3c6400_gate_clks,
|
||||
samsung_clk_register_gate(ctx, s3c6400_gate_clks,
|
||||
ARRAY_SIZE(s3c6400_gate_clks));
|
||||
samsung_clk_register_alias(s3c6400_clock_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c6400_clock_aliases,
|
||||
ARRAY_SIZE(s3c6400_clock_aliases));
|
||||
} else {
|
||||
samsung_clk_register_mux(s3c6410_mux_clks,
|
||||
samsung_clk_register_mux(ctx, s3c6410_mux_clks,
|
||||
ARRAY_SIZE(s3c6410_mux_clks));
|
||||
samsung_clk_register_div(s3c6410_div_clks,
|
||||
samsung_clk_register_div(ctx, s3c6410_div_clks,
|
||||
ARRAY_SIZE(s3c6410_div_clks));
|
||||
samsung_clk_register_gate(s3c6410_gate_clks,
|
||||
samsung_clk_register_gate(ctx, s3c6410_gate_clks,
|
||||
ARRAY_SIZE(s3c6410_gate_clks));
|
||||
samsung_clk_register_alias(s3c6410_clock_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c6410_clock_aliases,
|
||||
ARRAY_SIZE(s3c6410_clock_aliases));
|
||||
}
|
||||
|
||||
samsung_clk_register_alias(s3c64xx_clock_aliases,
|
||||
samsung_clk_register_alias(ctx, s3c64xx_clock_aliases,
|
||||
ARRAY_SIZE(s3c64xx_clock_aliases));
|
||||
s3c64xx_clk_sleep_init();
|
||||
|
||||
|
|
|
|||
|
|
@ -14,13 +14,6 @@
|
|||
#include <linux/syscore_ops.h>
|
||||
#include "clk.h"
|
||||
|
||||
static DEFINE_SPINLOCK(lock);
|
||||
static struct clk **clk_table;
|
||||
static void __iomem *reg_base;
|
||||
#ifdef CONFIG_OF
|
||||
static struct clk_onecell_data clk_data;
|
||||
#endif
|
||||
|
||||
void samsung_clk_save(void __iomem *base,
|
||||
struct samsung_clk_reg_dump *rd,
|
||||
unsigned int num_regs)
|
||||
|
|
@ -55,40 +48,53 @@ struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(
|
|||
}
|
||||
|
||||
/* setup the essentials required to support clock lookup using ccf */
|
||||
void __init samsung_clk_init(struct device_node *np, void __iomem *base,
|
||||
unsigned long nr_clks)
|
||||
struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np,
|
||||
void __iomem *base, unsigned long nr_clks)
|
||||
{
|
||||
reg_base = base;
|
||||
struct samsung_clk_provider *ctx;
|
||||
struct clk **clk_table;
|
||||
int ret;
|
||||
ctx = kzalloc(sizeof(struct samsung_clk_provider), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
panic("could not allocate clock provider context.\n");
|
||||
|
||||
clk_table = kzalloc(sizeof(struct clk *) * nr_clks, GFP_KERNEL);
|
||||
if (!clk_table)
|
||||
panic("could not allocate clock lookup table\n");
|
||||
|
||||
if (!np)
|
||||
return;
|
||||
ctx->reg_base = base;
|
||||
ctx->clk_data.clks = clk_table;
|
||||
ctx->clk_data.clk_num = nr_clks;
|
||||
spin_lock_init(&ctx->lock);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
clk_data.clks = clk_table;
|
||||
clk_data.clk_num = nr_clks;
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
|
||||
#endif
|
||||
if (!np)
|
||||
return ctx;
|
||||
|
||||
ret = of_clk_add_provider(np, of_clk_src_onecell_get,
|
||||
&ctx->clk_data);
|
||||
if (ret)
|
||||
panic("could not register clock provide\n");
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/* add a clock instance to the clock lookup table used for dt based lookup */
|
||||
void samsung_clk_add_lookup(struct clk *clk, unsigned int id)
|
||||
void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, struct clk *clk,
|
||||
unsigned int id)
|
||||
{
|
||||
if (clk_table && id)
|
||||
clk_table[id] = clk;
|
||||
if (ctx->clk_data.clks && id)
|
||||
ctx->clk_data.clks[id] = clk;
|
||||
}
|
||||
|
||||
/* register a list of aliases */
|
||||
void __init samsung_clk_register_alias(struct samsung_clock_alias *list,
|
||||
unsigned int nr_clk)
|
||||
void __init samsung_clk_register_alias(struct samsung_clk_provider *ctx,
|
||||
struct samsung_clock_alias *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
unsigned int idx, ret;
|
||||
|
||||
if (!clk_table) {
|
||||
if (!ctx->clk_data.clks) {
|
||||
pr_err("%s: clock table missing\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
|
@ -100,7 +106,7 @@ void __init samsung_clk_register_alias(struct samsung_clock_alias *list,
|
|||
continue;
|
||||
}
|
||||
|
||||
clk = clk_table[list->id];
|
||||
clk = ctx->clk_data.clks[list->id];
|
||||
if (!clk) {
|
||||
pr_err("%s: failed to find clock %d\n", __func__,
|
||||
list->id);
|
||||
|
|
@ -115,7 +121,7 @@ void __init samsung_clk_register_alias(struct samsung_clock_alias *list,
|
|||
}
|
||||
|
||||
/* register a list of fixed clocks */
|
||||
void __init samsung_clk_register_fixed_rate(
|
||||
void __init samsung_clk_register_fixed_rate(struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_rate_clock *list, unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
|
@ -130,7 +136,7 @@ void __init samsung_clk_register_fixed_rate(
|
|||
continue;
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, list->id);
|
||||
samsung_clk_add_lookup(ctx, clk, list->id);
|
||||
|
||||
/*
|
||||
* Unconditionally add a clock lookup for the fixed rate clocks.
|
||||
|
|
@ -144,7 +150,7 @@ void __init samsung_clk_register_fixed_rate(
|
|||
}
|
||||
|
||||
/* register a list of fixed factor clocks */
|
||||
void __init samsung_clk_register_fixed_factor(
|
||||
void __init samsung_clk_register_fixed_factor(struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_factor_clock *list, unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
|
@ -159,28 +165,30 @@ void __init samsung_clk_register_fixed_factor(
|
|||
continue;
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, list->id);
|
||||
samsung_clk_add_lookup(ctx, clk, list->id);
|
||||
}
|
||||
}
|
||||
|
||||
/* register a list of mux clocks */
|
||||
void __init samsung_clk_register_mux(struct samsung_mux_clock *list,
|
||||
unsigned int nr_clk)
|
||||
void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx,
|
||||
struct samsung_mux_clock *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
unsigned int idx, ret;
|
||||
|
||||
for (idx = 0; idx < nr_clk; idx++, list++) {
|
||||
clk = clk_register_mux(NULL, list->name, list->parent_names,
|
||||
list->num_parents, list->flags, reg_base + list->offset,
|
||||
list->shift, list->width, list->mux_flags, &lock);
|
||||
list->num_parents, list->flags,
|
||||
ctx->reg_base + list->offset,
|
||||
list->shift, list->width, list->mux_flags, &ctx->lock);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: failed to register clock %s\n", __func__,
|
||||
list->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, list->id);
|
||||
samsung_clk_add_lookup(ctx, clk, list->id);
|
||||
|
||||
/* register a clock lookup only if a clock alias is specified */
|
||||
if (list->alias) {
|
||||
|
|
@ -194,8 +202,9 @@ void __init samsung_clk_register_mux(struct samsung_mux_clock *list,
|
|||
}
|
||||
|
||||
/* register a list of div clocks */
|
||||
void __init samsung_clk_register_div(struct samsung_div_clock *list,
|
||||
unsigned int nr_clk)
|
||||
void __init samsung_clk_register_div(struct samsung_clk_provider *ctx,
|
||||
struct samsung_div_clock *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
unsigned int idx, ret;
|
||||
|
|
@ -203,22 +212,22 @@ void __init samsung_clk_register_div(struct samsung_div_clock *list,
|
|||
for (idx = 0; idx < nr_clk; idx++, list++) {
|
||||
if (list->table)
|
||||
clk = clk_register_divider_table(NULL, list->name,
|
||||
list->parent_name, list->flags,
|
||||
reg_base + list->offset, list->shift,
|
||||
list->width, list->div_flags,
|
||||
list->table, &lock);
|
||||
list->parent_name, list->flags,
|
||||
ctx->reg_base + list->offset,
|
||||
list->shift, list->width, list->div_flags,
|
||||
list->table, &ctx->lock);
|
||||
else
|
||||
clk = clk_register_divider(NULL, list->name,
|
||||
list->parent_name, list->flags,
|
||||
reg_base + list->offset, list->shift,
|
||||
list->width, list->div_flags, &lock);
|
||||
list->parent_name, list->flags,
|
||||
ctx->reg_base + list->offset, list->shift,
|
||||
list->width, list->div_flags, &ctx->lock);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: failed to register clock %s\n", __func__,
|
||||
list->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, list->id);
|
||||
samsung_clk_add_lookup(ctx, clk, list->id);
|
||||
|
||||
/* register a clock lookup only if a clock alias is specified */
|
||||
if (list->alias) {
|
||||
|
|
@ -232,16 +241,17 @@ void __init samsung_clk_register_div(struct samsung_div_clock *list,
|
|||
}
|
||||
|
||||
/* register a list of gate clocks */
|
||||
void __init samsung_clk_register_gate(struct samsung_gate_clock *list,
|
||||
unsigned int nr_clk)
|
||||
void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx,
|
||||
struct samsung_gate_clock *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk;
|
||||
unsigned int idx, ret;
|
||||
|
||||
for (idx = 0; idx < nr_clk; idx++, list++) {
|
||||
clk = clk_register_gate(NULL, list->name, list->parent_name,
|
||||
list->flags, reg_base + list->offset,
|
||||
list->bit_idx, list->gate_flags, &lock);
|
||||
list->flags, ctx->reg_base + list->offset,
|
||||
list->bit_idx, list->gate_flags, &ctx->lock);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: failed to register clock %s\n", __func__,
|
||||
list->name);
|
||||
|
|
@ -257,7 +267,7 @@ void __init samsung_clk_register_gate(struct samsung_gate_clock *list,
|
|||
__func__, list->alias);
|
||||
}
|
||||
|
||||
samsung_clk_add_lookup(clk, list->id);
|
||||
samsung_clk_add_lookup(ctx, clk, list->id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -266,21 +276,21 @@ void __init samsung_clk_register_gate(struct samsung_gate_clock *list,
|
|||
* tree and register it
|
||||
*/
|
||||
#ifdef CONFIG_OF
|
||||
void __init samsung_clk_of_register_fixed_ext(
|
||||
void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_rate_clock *fixed_rate_clk,
|
||||
unsigned int nr_fixed_rate_clk,
|
||||
struct of_device_id *clk_matches)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct device_node *np;
|
||||
struct device_node *clk_np;
|
||||
u32 freq;
|
||||
|
||||
for_each_matching_node_and_match(np, clk_matches, &match) {
|
||||
if (of_property_read_u32(np, "clock-frequency", &freq))
|
||||
for_each_matching_node_and_match(clk_np, clk_matches, &match) {
|
||||
if (of_property_read_u32(clk_np, "clock-frequency", &freq))
|
||||
continue;
|
||||
fixed_rate_clk[(u32)match->data].fixed_rate = freq;
|
||||
}
|
||||
samsung_clk_register_fixed_rate(fixed_rate_clk, nr_fixed_rate_clk);
|
||||
samsung_clk_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,18 @@
|
|||
#include <linux/of_address.h>
|
||||
#include "clk-pll.h"
|
||||
|
||||
/**
|
||||
* struct samsung_clk_provider: information about clock provider
|
||||
* @reg_base: virtual address for the register base.
|
||||
* @clk_data: holds clock related data like clk* and number of clocks.
|
||||
* @lock: maintains exclusion bwtween callbacks for a given clock-provider.
|
||||
*/
|
||||
struct samsung_clk_provider {
|
||||
void __iomem *reg_base;
|
||||
struct clk_onecell_data clk_data;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct samsung_clock_alias: information about mux clock
|
||||
* @id: platform specific id of the clock.
|
||||
|
|
@ -312,40 +324,52 @@ struct samsung_pll_clock {
|
|||
__PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \
|
||||
_lock, _con, _rtable, _alias)
|
||||
|
||||
extern void __init samsung_clk_init(struct device_node *np, void __iomem *base,
|
||||
unsigned long nr_clks);
|
||||
extern struct samsung_clk_provider *__init samsung_clk_init(
|
||||
struct device_node *np, void __iomem *base,
|
||||
unsigned long nr_clks);
|
||||
extern void __init samsung_clk_of_register_fixed_ext(
|
||||
struct samsung_fixed_rate_clock *fixed_rate_clk,
|
||||
unsigned int nr_fixed_rate_clk,
|
||||
struct of_device_id *clk_matches);
|
||||
struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_rate_clock *fixed_rate_clk,
|
||||
unsigned int nr_fixed_rate_clk,
|
||||
struct of_device_id *clk_matches);
|
||||
|
||||
extern void samsung_clk_add_lookup(struct clk *clk, unsigned int id);
|
||||
extern void samsung_clk_add_lookup(struct samsung_clk_provider *ctx,
|
||||
struct clk *clk, unsigned int id);
|
||||
|
||||
extern void samsung_clk_register_alias(struct samsung_clock_alias *list,
|
||||
unsigned int nr_clk);
|
||||
extern void samsung_clk_register_alias(struct samsung_clk_provider *ctx,
|
||||
struct samsung_clock_alias *list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_fixed_rate(
|
||||
struct samsung_fixed_rate_clock *clk_list, unsigned int nr_clk);
|
||||
struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_rate_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_fixed_factor(
|
||||
struct samsung_fixed_factor_clock *list, unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_mux(struct samsung_mux_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_div(struct samsung_div_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_gate(
|
||||
struct samsung_gate_clock *clk_list, unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list,
|
||||
unsigned int nr_clk, void __iomem *base);
|
||||
struct samsung_clk_provider *ctx,
|
||||
struct samsung_fixed_factor_clock *list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx,
|
||||
struct samsung_mux_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_div(struct samsung_clk_provider *ctx,
|
||||
struct samsung_div_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx,
|
||||
struct samsung_gate_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
|
||||
struct samsung_pll_clock *pll_list,
|
||||
unsigned int nr_clk, void __iomem *base);
|
||||
|
||||
extern unsigned long _get_rate(const char *clk_name);
|
||||
|
||||
extern void samsung_clk_save(void __iomem *base,
|
||||
struct samsung_clk_reg_dump *rd,
|
||||
unsigned int num_regs);
|
||||
struct samsung_clk_reg_dump *rd,
|
||||
unsigned int num_regs);
|
||||
extern void samsung_clk_restore(void __iomem *base,
|
||||
const struct samsung_clk_reg_dump *rd,
|
||||
unsigned int num_regs);
|
||||
const struct samsung_clk_reg_dump *rd,
|
||||
unsigned int num_regs);
|
||||
extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(
|
||||
const unsigned long *rdump,
|
||||
unsigned long nr_rdump);
|
||||
const unsigned long *rdump,
|
||||
unsigned long nr_rdump);
|
||||
|
||||
#endif /* __SAMSUNG_CLK_H */
|
||||
|
|
|
|||
469
include/dt-bindings/clock/exynos5260-clk.h
Normal file
469
include/dt-bindings/clock/exynos5260-clk.h
Normal file
|
|
@ -0,0 +1,469 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd.
|
||||
* Author: Rahul Sharma <rahul.sharma@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Provides Constants for Exynos5260 clocks.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H
|
||||
#define _DT_BINDINGS_CLK_EXYNOS5260_H
|
||||
|
||||
/* Clock names: <cmu><type><IP> */
|
||||
|
||||
/* List Of Clocks For CMU_TOP */
|
||||
|
||||
#define TOP_FOUT_DISP_PLL 1
|
||||
#define TOP_FOUT_AUD_PLL 2
|
||||
#define TOP_MOUT_AUDTOP_PLL_USER 3
|
||||
#define TOP_MOUT_AUD_PLL 4
|
||||
#define TOP_MOUT_DISP_PLL 5
|
||||
#define TOP_MOUT_BUSTOP_PLL_USER 6
|
||||
#define TOP_MOUT_MEMTOP_PLL_USER 7
|
||||
#define TOP_MOUT_MEDIATOP_PLL_USER 8
|
||||
#define TOP_MOUT_DISP_DISP_333 9
|
||||
#define TOP_MOUT_ACLK_DISP_333 10
|
||||
#define TOP_MOUT_DISP_DISP_222 11
|
||||
#define TOP_MOUT_ACLK_DISP_222 12
|
||||
#define TOP_MOUT_DISP_MEDIA_PIXEL 13
|
||||
#define TOP_MOUT_FIMD1 14
|
||||
#define TOP_MOUT_SCLK_PERI_SPI0_CLK 15
|
||||
#define TOP_MOUT_SCLK_PERI_SPI1_CLK 16
|
||||
#define TOP_MOUT_SCLK_PERI_SPI2_CLK 17
|
||||
#define TOP_MOUT_SCLK_PERI_UART0_UCLK 18
|
||||
#define TOP_MOUT_SCLK_PERI_UART2_UCLK 19
|
||||
#define TOP_MOUT_SCLK_PERI_UART1_UCLK 20
|
||||
#define TOP_MOUT_BUS4_BUSTOP_100 21
|
||||
#define TOP_MOUT_BUS4_BUSTOP_400 22
|
||||
#define TOP_MOUT_BUS3_BUSTOP_100 23
|
||||
#define TOP_MOUT_BUS3_BUSTOP_400 24
|
||||
#define TOP_MOUT_BUS2_BUSTOP_400 25
|
||||
#define TOP_MOUT_BUS2_BUSTOP_100 26
|
||||
#define TOP_MOUT_BUS1_BUSTOP_100 27
|
||||
#define TOP_MOUT_BUS1_BUSTOP_400 28
|
||||
#define TOP_MOUT_SCLK_FSYS_USB 29
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_A 30
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_A 31
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_A 32
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_B 33
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_B 34
|
||||
#define TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_B 35
|
||||
#define TOP_MOUT_ACLK_ISP1_266 36
|
||||
#define TOP_MOUT_ISP1_MEDIA_266 37
|
||||
#define TOP_MOUT_ACLK_ISP1_400 38
|
||||
#define TOP_MOUT_ISP1_MEDIA_400 39
|
||||
#define TOP_MOUT_SCLK_ISP1_SPI0 40
|
||||
#define TOP_MOUT_SCLK_ISP1_SPI1 41
|
||||
#define TOP_MOUT_SCLK_ISP1_UART 42
|
||||
#define TOP_MOUT_SCLK_ISP1_SENSOR2 43
|
||||
#define TOP_MOUT_SCLK_ISP1_SENSOR1 44
|
||||
#define TOP_MOUT_SCLK_ISP1_SENSOR0 45
|
||||
#define TOP_MOUT_ACLK_MFC_333 46
|
||||
#define TOP_MOUT_MFC_BUSTOP_333 47
|
||||
#define TOP_MOUT_ACLK_G2D_333 48
|
||||
#define TOP_MOUT_G2D_BUSTOP_333 49
|
||||
#define TOP_MOUT_ACLK_GSCL_FIMC 50
|
||||
#define TOP_MOUT_GSCL_BUSTOP_FIMC 51
|
||||
#define TOP_MOUT_ACLK_GSCL_333 52
|
||||
#define TOP_MOUT_GSCL_BUSTOP_333 53
|
||||
#define TOP_MOUT_ACLK_GSCL_400 54
|
||||
#define TOP_MOUT_M2M_MEDIATOP_400 55
|
||||
#define TOP_DOUT_ACLK_MFC_333 56
|
||||
#define TOP_DOUT_ACLK_G2D_333 57
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR2_A 58
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR1_A 59
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR0_A 60
|
||||
#define TOP_DOUT_ACLK_GSCL_FIMC 61
|
||||
#define TOP_DOUT_ACLK_GSCL_400 62
|
||||
#define TOP_DOUT_ACLK_GSCL_333 63
|
||||
#define TOP_DOUT_SCLK_ISP1_SPI0_B 64
|
||||
#define TOP_DOUT_SCLK_ISP1_SPI0_A 65
|
||||
#define TOP_DOUT_ACLK_ISP1_400 66
|
||||
#define TOP_DOUT_ACLK_ISP1_266 67
|
||||
#define TOP_DOUT_SCLK_ISP1_UART 68
|
||||
#define TOP_DOUT_SCLK_ISP1_SPI1_B 69
|
||||
#define TOP_DOUT_SCLK_ISP1_SPI1_A 70
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR2_B 71
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR1_B 72
|
||||
#define TOP_DOUT_SCLK_ISP1_SENSOR0_B 73
|
||||
#define TOP_DOUTTOP__SCLK_HPM_TARGETCLK 74
|
||||
#define TOP_DOUT_SCLK_DISP_PIXEL 75
|
||||
#define TOP_DOUT_ACLK_DISP_222 76
|
||||
#define TOP_DOUT_ACLK_DISP_333 77
|
||||
#define TOP_DOUT_ACLK_BUS4_100 78
|
||||
#define TOP_DOUT_ACLK_BUS4_400 79
|
||||
#define TOP_DOUT_ACLK_BUS3_100 80
|
||||
#define TOP_DOUT_ACLK_BUS3_400 81
|
||||
#define TOP_DOUT_ACLK_BUS2_100 82
|
||||
#define TOP_DOUT_ACLK_BUS2_400 83
|
||||
#define TOP_DOUT_ACLK_BUS1_100 84
|
||||
#define TOP_DOUT_ACLK_BUS1_400 85
|
||||
#define TOP_DOUT_SCLK_PERI_SPI1_B 86
|
||||
#define TOP_DOUT_SCLK_PERI_SPI1_A 87
|
||||
#define TOP_DOUT_SCLK_PERI_SPI0_B 88
|
||||
#define TOP_DOUT_SCLK_PERI_SPI0_A 89
|
||||
#define TOP_DOUT_SCLK_PERI_UART0 90
|
||||
#define TOP_DOUT_SCLK_PERI_UART2 91
|
||||
#define TOP_DOUT_SCLK_PERI_UART1 92
|
||||
#define TOP_DOUT_SCLK_PERI_SPI2_B 93
|
||||
#define TOP_DOUT_SCLK_PERI_SPI2_A 94
|
||||
#define TOP_DOUT_ACLK_PERI_AUD 95
|
||||
#define TOP_DOUT_ACLK_PERI_66 96
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_B 97
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_A 98
|
||||
#define TOP_DOUT_SCLK_FSYS_USBDRD30_SUSPEND_CLK 99
|
||||
#define TOP_DOUT_ACLK_FSYS_200 100
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_B 101
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_A 102
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_B 103
|
||||
#define TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_A 104
|
||||
#define TOP_SCLK_FIMD1 105
|
||||
#define TOP_SCLK_MMC2 106
|
||||
#define TOP_SCLK_MMC1 107
|
||||
#define TOP_SCLK_MMC0 108
|
||||
#define PHYCLK_DPTX_PHY_CH3_TXD_CLK 109
|
||||
#define PHYCLK_DPTX_PHY_CH2_TXD_CLK 110
|
||||
#define PHYCLK_DPTX_PHY_CH1_TXD_CLK 111
|
||||
#define PHYCLK_DPTX_PHY_CH0_TXD_CLK 112
|
||||
#define phyclk_hdmi_phy_tmds_clko 113
|
||||
#define PHYCLK_HDMI_PHY_PIXEL_CLKO 114
|
||||
#define PHYCLK_HDMI_LINK_O_TMDS_CLKHI 115
|
||||
#define PHYCLK_MIPI_DPHY_4L_M_TXBYTECLKHS 116
|
||||
#define PHYCLK_DPTX_PHY_O_REF_CLK_24M 117
|
||||
#define PHYCLK_DPTX_PHY_CLK_DIV2 118
|
||||
#define PHYCLK_MIPI_DPHY_4L_M_RXCLKESC0 119
|
||||
#define PHYCLK_USBHOST20_PHY_PHYCLOCK 120
|
||||
#define PHYCLK_USBHOST20_PHY_FREECLK 121
|
||||
#define PHYCLK_USBHOST20_PHY_CLK48MOHCI 122
|
||||
#define PHYCLK_USBDRD30_UDRD30_PIPE_PCLK 123
|
||||
#define PHYCLK_USBDRD30_UDRD30_PHYCLOCK 124
|
||||
#define TOP_NR_CLK 125
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_EGL */
|
||||
|
||||
#define EGL_FOUT_EGL_PLL 1
|
||||
#define EGL_FOUT_EGL_DPLL 2
|
||||
#define EGL_MOUT_EGL_B 3
|
||||
#define EGL_MOUT_EGL_PLL 4
|
||||
#define EGL_DOUT_EGL_PLL 5
|
||||
#define EGL_DOUT_EGL_PCLK_DBG 6
|
||||
#define EGL_DOUT_EGL_ATCLK 7
|
||||
#define EGL_DOUT_PCLK_EGL 8
|
||||
#define EGL_DOUT_ACLK_EGL 9
|
||||
#define EGL_DOUT_EGL2 10
|
||||
#define EGL_DOUT_EGL1 11
|
||||
#define EGL_NR_CLK 12
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_KFC */
|
||||
|
||||
#define KFC_FOUT_KFC_PLL 1
|
||||
#define KFC_MOUT_KFC_PLL 2
|
||||
#define KFC_MOUT_KFC 3
|
||||
#define KFC_DOUT_KFC_PLL 4
|
||||
#define KFC_DOUT_PCLK_KFC 5
|
||||
#define KFC_DOUT_ACLK_KFC 6
|
||||
#define KFC_DOUT_KFC_PCLK_DBG 7
|
||||
#define KFC_DOUT_KFC_ATCLK 8
|
||||
#define KFC_DOUT_KFC2 9
|
||||
#define KFC_DOUT_KFC1 10
|
||||
#define KFC_NR_CLK 11
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_MIF */
|
||||
|
||||
#define MIF_FOUT_MEM_PLL 1
|
||||
#define MIF_FOUT_MEDIA_PLL 2
|
||||
#define MIF_FOUT_BUS_PLL 3
|
||||
#define MIF_MOUT_CLK2X_PHY 4
|
||||
#define MIF_MOUT_MIF_DREX2X 5
|
||||
#define MIF_MOUT_CLKM_PHY 6
|
||||
#define MIF_MOUT_MIF_DREX 7
|
||||
#define MIF_MOUT_MEDIA_PLL 8
|
||||
#define MIF_MOUT_BUS_PLL 9
|
||||
#define MIF_MOUT_MEM_PLL 10
|
||||
#define MIF_DOUT_ACLK_BUS_100 11
|
||||
#define MIF_DOUT_ACLK_BUS_200 12
|
||||
#define MIF_DOUT_ACLK_MIF_466 13
|
||||
#define MIF_DOUT_CLK2X_PHY 14
|
||||
#define MIF_DOUT_CLKM_PHY 15
|
||||
#define MIF_DOUT_BUS_PLL 16
|
||||
#define MIF_DOUT_MEM_PLL 17
|
||||
#define MIF_DOUT_MEDIA_PLL 18
|
||||
#define MIF_CLK_LPDDR3PHY_WRAP1 19
|
||||
#define MIF_CLK_LPDDR3PHY_WRAP0 20
|
||||
#define MIF_CLK_MONOCNT 21
|
||||
#define MIF_CLK_MIF_RTC 22
|
||||
#define MIF_CLK_DREX1 23
|
||||
#define MIF_CLK_DREX0 24
|
||||
#define MIF_CLK_INTMEM 25
|
||||
#define MIF_SCLK_LPDDR3PHY_WRAP_U1 26
|
||||
#define MIF_SCLK_LPDDR3PHY_WRAP_U0 27
|
||||
#define MIF_NR_CLK 28
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_G3D */
|
||||
|
||||
#define G3D_FOUT_G3D_PLL 1
|
||||
#define G3D_MOUT_G3D_PLL 2
|
||||
#define G3D_DOUT_PCLK_G3D 3
|
||||
#define G3D_DOUT_ACLK_G3D 4
|
||||
#define G3D_CLK_G3D_HPM 5
|
||||
#define G3D_CLK_G3D 6
|
||||
#define G3D_NR_CLK 7
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_AUD */
|
||||
|
||||
#define AUD_MOUT_SCLK_AUD_PCM 1
|
||||
#define AUD_MOUT_SCLK_AUD_I2S 2
|
||||
#define AUD_MOUT_AUD_PLL_USER 3
|
||||
#define AUD_DOUT_ACLK_AUD_131 4
|
||||
#define AUD_DOUT_SCLK_AUD_UART 5
|
||||
#define AUD_DOUT_SCLK_AUD_PCM 6
|
||||
#define AUD_DOUT_SCLK_AUD_I2S 7
|
||||
#define AUD_CLK_AUD_UART 8
|
||||
#define AUD_CLK_PCM 9
|
||||
#define AUD_CLK_I2S 10
|
||||
#define AUD_CLK_DMAC 11
|
||||
#define AUD_CLK_SRAMC 12
|
||||
#define AUD_SCLK_AUD_UART 13
|
||||
#define AUD_SCLK_PCM 14
|
||||
#define AUD_SCLK_I2S 15
|
||||
#define AUD_NR_CLK 16
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_MFC */
|
||||
|
||||
#define MFC_MOUT_ACLK_MFC_333_USER 1
|
||||
#define MFC_DOUT_PCLK_MFC_83 2
|
||||
#define MFC_CLK_MFC 3
|
||||
#define MFC_CLK_SMMU2_MFCM1 4
|
||||
#define MFC_CLK_SMMU2_MFCM0 5
|
||||
#define MFC_NR_CLK 6
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_GSCL */
|
||||
|
||||
#define GSCL_MOUT_ACLK_CSIS 1
|
||||
#define GSCL_MOUT_ACLK_GSCL_FIMC_USER 2
|
||||
#define GSCL_MOUT_ACLK_M2M_400_USER 3
|
||||
#define GSCL_MOUT_ACLK_GSCL_333_USER 4
|
||||
#define GSCL_DOUT_ACLK_CSIS_200 5
|
||||
#define GSCL_DOUT_PCLK_M2M_100 6
|
||||
#define GSCL_CLK_PIXEL_GSCL1 7
|
||||
#define GSCL_CLK_PIXEL_GSCL0 8
|
||||
#define GSCL_CLK_MSCL1 9
|
||||
#define GSCL_CLK_MSCL0 10
|
||||
#define GSCL_CLK_GSCL1 11
|
||||
#define GSCL_CLK_GSCL0 12
|
||||
#define GSCL_CLK_FIMC_LITE_D 13
|
||||
#define GSCL_CLK_FIMC_LITE_B 14
|
||||
#define GSCL_CLK_FIMC_LITE_A 15
|
||||
#define GSCL_CLK_CSIS1 16
|
||||
#define GSCL_CLK_CSIS0 17
|
||||
#define GSCL_CLK_SMMU3_LITE_D 18
|
||||
#define GSCL_CLK_SMMU3_LITE_B 19
|
||||
#define GSCL_CLK_SMMU3_LITE_A 20
|
||||
#define GSCL_CLK_SMMU3_GSCL0 21
|
||||
#define GSCL_CLK_SMMU3_GSCL1 22
|
||||
#define GSCL_CLK_SMMU3_MSCL0 23
|
||||
#define GSCL_CLK_SMMU3_MSCL1 24
|
||||
#define GSCL_SCLK_CSIS1_WRAP 25
|
||||
#define GSCL_SCLK_CSIS0_WRAP 26
|
||||
#define GSCL_NR_CLK 27
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_FSYS */
|
||||
|
||||
#define FSYS_MOUT_PHYCLK_USBHOST20_PHYCLK_USER 1
|
||||
#define FSYS_MOUT_PHYCLK_USBHOST20_FREECLK_USER 2
|
||||
#define FSYS_MOUT_PHYCLK_USBHOST20_CLK48MOHCI_USER 3
|
||||
#define FSYS_MOUT_PHYCLK_USBDRD30_PIPE_PCLK_USER 4
|
||||
#define FSYS_MOUT_PHYCLK_USBDRD30_PHYCLOCK_USER 5
|
||||
#define FSYS_CLK_TSI 6
|
||||
#define FSYS_CLK_USBLINK 7
|
||||
#define FSYS_CLK_USBHOST20 8
|
||||
#define FSYS_CLK_USBDRD30 9
|
||||
#define FSYS_CLK_SROMC 10
|
||||
#define FSYS_CLK_PDMA 11
|
||||
#define FSYS_CLK_MMC2 12
|
||||
#define FSYS_CLK_MMC1 13
|
||||
#define FSYS_CLK_MMC0 14
|
||||
#define FSYS_CLK_RTIC 15
|
||||
#define FSYS_CLK_SMMU_RTIC 16
|
||||
#define FSYS_PHYCLK_USBDRD30 17
|
||||
#define FSYS_PHYCLK_USBHOST20 18
|
||||
#define FSYS_NR_CLK 19
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_PERI */
|
||||
|
||||
#define PERI_MOUT_SCLK_SPDIF 1
|
||||
#define PERI_MOUT_SCLK_I2SCOD 2
|
||||
#define PERI_MOUT_SCLK_PCM 3
|
||||
#define PERI_DOUT_I2S 4
|
||||
#define PERI_DOUT_PCM 5
|
||||
#define PERI_CLK_WDT_KFC 6
|
||||
#define PERI_CLK_WDT_EGL 7
|
||||
#define PERI_CLK_HSIC3 8
|
||||
#define PERI_CLK_HSIC2 9
|
||||
#define PERI_CLK_HSIC1 10
|
||||
#define PERI_CLK_HSIC0 11
|
||||
#define PERI_CLK_PCM 12
|
||||
#define PERI_CLK_MCT 13
|
||||
#define PERI_CLK_I2S 14
|
||||
#define PERI_CLK_I2CHDMI 15
|
||||
#define PERI_CLK_I2C7 16
|
||||
#define PERI_CLK_I2C6 17
|
||||
#define PERI_CLK_I2C5 18
|
||||
#define PERI_CLK_I2C4 19
|
||||
#define PERI_CLK_I2C9 20
|
||||
#define PERI_CLK_I2C8 21
|
||||
#define PERI_CLK_I2C11 22
|
||||
#define PERI_CLK_I2C10 23
|
||||
#define PERI_CLK_HDMICEC 24
|
||||
#define PERI_CLK_EFUSE_WRITER 25
|
||||
#define PERI_CLK_ABB 26
|
||||
#define PERI_CLK_UART2 27
|
||||
#define PERI_CLK_UART1 28
|
||||
#define PERI_CLK_UART0 29
|
||||
#define PERI_CLK_ADC 30
|
||||
#define PERI_CLK_TMU4 31
|
||||
#define PERI_CLK_TMU3 32
|
||||
#define PERI_CLK_TMU2 33
|
||||
#define PERI_CLK_TMU1 34
|
||||
#define PERI_CLK_TMU0 35
|
||||
#define PERI_CLK_SPI2 36
|
||||
#define PERI_CLK_SPI1 37
|
||||
#define PERI_CLK_SPI0 38
|
||||
#define PERI_CLK_SPDIF 39
|
||||
#define PERI_CLK_PWM 40
|
||||
#define PERI_CLK_UART4 41
|
||||
#define PERI_CLK_CHIPID 42
|
||||
#define PERI_CLK_PROVKEY0 43
|
||||
#define PERI_CLK_PROVKEY1 44
|
||||
#define PERI_CLK_SECKEY 45
|
||||
#define PERI_CLK_TOP_RTC 46
|
||||
#define PERI_CLK_TZPC10 47
|
||||
#define PERI_CLK_TZPC9 48
|
||||
#define PERI_CLK_TZPC8 49
|
||||
#define PERI_CLK_TZPC7 50
|
||||
#define PERI_CLK_TZPC6 51
|
||||
#define PERI_CLK_TZPC5 52
|
||||
#define PERI_CLK_TZPC4 53
|
||||
#define PERI_CLK_TZPC3 54
|
||||
#define PERI_CLK_TZPC2 55
|
||||
#define PERI_CLK_TZPC1 56
|
||||
#define PERI_CLK_TZPC0 57
|
||||
#define PERI_SCLK_UART2 58
|
||||
#define PERI_SCLK_UART1 59
|
||||
#define PERI_SCLK_UART0 60
|
||||
#define PERI_SCLK_SPI2 61
|
||||
#define PERI_SCLK_SPI1 62
|
||||
#define PERI_SCLK_SPI0 63
|
||||
#define PERI_SCLK_SPDIF 64
|
||||
#define PERI_SCLK_I2S 65
|
||||
#define PERI_SCLK_PCM1 66
|
||||
#define PERI_NR_CLK 67
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_DISP */
|
||||
|
||||
#define DISP_MOUT_SCLK_HDMI_SPDIF 1
|
||||
#define DISP_MOUT_SCLK_HDMI_PIXEL 2
|
||||
#define DISP_MOUT_PHYCLK_MIPI_DPHY_4LMRXCLK_ESC0_USER 3
|
||||
#define DISP_MOUT_PHYCLK_HDMI_PHY_TMDS_CLKO_USER 4
|
||||
#define DISP_MOUT_PHYCLK_HDMI_PHY_REF_CLKO_USER 5
|
||||
#define DISP_MOUT_HDMI_PHY_PIXEL 6
|
||||
#define DISP_MOUT_PHYCLK_HDMI_LINK_O_TMDS_CLKHI_USER 7
|
||||
#define DISP_MOUT_PHYCLK_MIPI_DPHY_4L_M_TXBYTE_CLKHS 8
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_O_REF_CLK_24M_USER 9
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_CLK_DIV2_USER 10
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_CH3_TXD_CLK_USER 11
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_CH2_TXD_CLK_USER 12
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_CH1_TXD_CLK_USER 13
|
||||
#define DISP_MOUT_PHYCLK_DPTX_PHY_CH0_TXD_CLK_USER 14
|
||||
#define DISP_MOUT_ACLK_DISP_222_USER 15
|
||||
#define DISP_MOUT_SCLK_DISP_PIXEL_USER 16
|
||||
#define DISP_MOUT_ACLK_DISP_333_USER 17
|
||||
#define DISP_DOUT_SCLK_HDMI_PHY_PIXEL_CLKI 18
|
||||
#define DISP_DOUT_SCLK_FIMD1_EXTCLKPLL 19
|
||||
#define DISP_DOUT_PCLK_DISP_111 20
|
||||
#define DISP_CLK_SMMU_TV 21
|
||||
#define DISP_CLK_SMMU_FIMD1M1 22
|
||||
#define DISP_CLK_SMMU_FIMD1M0 23
|
||||
#define DISP_CLK_PIXEL_MIXER 24
|
||||
#define DISP_CLK_PIXEL_DISP 25
|
||||
#define DISP_CLK_MIXER 26
|
||||
#define DISP_CLK_MIPIPHY 27
|
||||
#define DISP_CLK_HDMIPHY 28
|
||||
#define DISP_CLK_HDMI 29
|
||||
#define DISP_CLK_FIMD1 30
|
||||
#define DISP_CLK_DSIM1 31
|
||||
#define DISP_CLK_DPPHY 32
|
||||
#define DISP_CLK_DP 33
|
||||
#define DISP_SCLK_PIXEL 34
|
||||
#define DISP_MOUT_HDMI_PHY_PIXEL_USER 35
|
||||
#define DISP_NR_CLK 36
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_G2D */
|
||||
|
||||
#define G2D_MOUT_ACLK_G2D_333_USER 1
|
||||
#define G2D_DOUT_PCLK_G2D_83 2
|
||||
#define G2D_CLK_SMMU3_JPEG 3
|
||||
#define G2D_CLK_MDMA 4
|
||||
#define G2D_CLK_JPEG 5
|
||||
#define G2D_CLK_G2D 6
|
||||
#define G2D_CLK_SSS 7
|
||||
#define G2D_CLK_SLIM_SSS 8
|
||||
#define G2D_CLK_SMMU_SLIM_SSS 9
|
||||
#define G2D_CLK_SMMU_SSS 10
|
||||
#define G2D_CLK_SMMU_MDMA 11
|
||||
#define G2D_CLK_SMMU3_G2D 12
|
||||
#define G2D_NR_CLK 13
|
||||
|
||||
|
||||
/* List Of Clocks For CMU_ISP */
|
||||
|
||||
#define ISP_MOUT_ISP_400_USER 1
|
||||
#define ISP_MOUT_ISP_266_USER 2
|
||||
#define ISP_DOUT_SCLK_MPWM 3
|
||||
#define ISP_DOUT_CA5_PCLKDBG 4
|
||||
#define ISP_DOUT_CA5_ATCLKIN 5
|
||||
#define ISP_DOUT_PCLK_ISP_133 6
|
||||
#define ISP_DOUT_PCLK_ISP_66 7
|
||||
#define ISP_CLK_GIC 8
|
||||
#define ISP_CLK_WDT 9
|
||||
#define ISP_CLK_UART 10
|
||||
#define ISP_CLK_SPI1 11
|
||||
#define ISP_CLK_SPI0 12
|
||||
#define ISP_CLK_SMMU_SCALERP 13
|
||||
#define ISP_CLK_SMMU_SCALERC 14
|
||||
#define ISP_CLK_SMMU_ISPCX 15
|
||||
#define ISP_CLK_SMMU_ISP 16
|
||||
#define ISP_CLK_SMMU_FD 17
|
||||
#define ISP_CLK_SMMU_DRC 18
|
||||
#define ISP_CLK_PWM 19
|
||||
#define ISP_CLK_MTCADC 20
|
||||
#define ISP_CLK_MPWM 21
|
||||
#define ISP_CLK_MCUCTL 22
|
||||
#define ISP_CLK_I2C1 23
|
||||
#define ISP_CLK_I2C0 24
|
||||
#define ISP_CLK_FIMC_SCALERP 25
|
||||
#define ISP_CLK_FIMC_SCALERC 26
|
||||
#define ISP_CLK_FIMC 27
|
||||
#define ISP_CLK_FIMC_FD 28
|
||||
#define ISP_CLK_FIMC_DRC 29
|
||||
#define ISP_CLK_CA5 30
|
||||
#define ISP_SCLK_SPI0_EXT 31
|
||||
#define ISP_SCLK_SPI1_EXT 32
|
||||
#define ISP_SCLK_UART_EXT 33
|
||||
#define ISP_NR_CLK 34
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue