From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <5603683F.4020302@rock-chips.com> Date: Thu, 24 Sep 2015 11:04:31 +0800 From: Xing Zheng MIME-Version: 1.0 To: =?UTF-8?B?SGVpa28gU3TDvGJuZXI=?= CC: linux-rockchip@lists.infradead.org, Michael Turquette , Stephen Boyd , linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 3/9] clk: rockchip: add clock controller for rk3036 References: <1442478540-15068-1-git-send-email-zhengxing@rock-chips.com> <1442478540-15068-4-git-send-email-zhengxing@rock-chips.com> <1775899.zcIuq65f1o@diego> In-Reply-To: <1775899.zcIuq65f1o@diego> Content-Type: text/plain; charset=UTF-8; format=flowed List-ID: On 2015年09月17日 17:47, Heiko Stübner wrote: > Hi, > > Am Donnerstag, 17. September 2015, 16:28:54 schrieb Xing Zheng: >> Add the clock tree definition for the new rk3036 SoC. >> >> Signed-off-by: Xing Zheng > missing a dt-bindings document in a separate patch. See "dt-bindings: add > documentation of rk3668 clock controller" > (http://lists.infradead.org/pipermail/linux-rockchip/2015-July/003396.html) > for comparison. Yes, I sent a dt-bindings document in patch 5: "dt-bindings: add documentation of rk3036 clock controller", and I think I will adjust the order of document before "Add the clock tree..." for rk3036. >> --- >> >> Changes in v2: None >> >> drivers/clk/rockchip/Makefile | 1 + >> drivers/clk/rockchip/clk-rk3036.c | 504 >> +++++++++++++++++++++++++++++++++++++ drivers/clk/rockchip/clk.h | >> 30 +++ >> 3 files changed, 535 insertions(+) >> create mode 100644 drivers/clk/rockchip/clk-rk3036.c >> >> diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile >> index b27edd6..d599829 100644 >> --- a/drivers/clk/rockchip/Makefile >> +++ b/drivers/clk/rockchip/Makefile >> @@ -10,6 +10,7 @@ obj-y += clk-inverter.o >> obj-y += clk-mmc-phase.o >> obj-$(CONFIG_RESET_CONTROLLER) += softrst.o >> >> +obj-y += clk-rk3036.o >> obj-y += clk-rk3188.o >> obj-y += clk-rk3288.o >> obj-y += clk-rk3368.o >> diff --git a/drivers/clk/rockchip/clk-rk3036.c >> b/drivers/clk/rockchip/clk-rk3036.c new file mode 100644 >> index 0000000..724d467 >> --- /dev/null >> +++ b/drivers/clk/rockchip/clk-rk3036.c >> @@ -0,0 +1,504 @@ >> +/* >> + * Copyright (c) 2014 MundoReader S.L. >> + * Author: Heiko Stuebner >> + * >> + * Copyright (c) 2015 Rockchip Electronics Co. Ltd. >> + * Author: Xing Zheng >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include "clk.h" >> + >> +enum rk3036_plls { >> + apll, dpll, gpll, >> +}; >> + >> +static struct rockchip_pll_rate_table rk3036_pll_rates[] = { >> + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ >> + RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0), >> + RK3036_PLL_RATE(1000000000, 6, 500, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 984000000, 1, 82, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 960000000, 1, 80, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 936000000, 1, 78, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 912000000, 1, 76, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 900000000, 4, 300, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 888000000, 1, 74, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 864000000, 1, 72, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 840000000, 1, 70, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 816000000, 1, 68, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 800000000, 6, 400, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 700000000, 6, 350, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 696000000, 1, 58, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 600000000, 1, 75, 3, 1, 1, 0), >> + RK3036_PLL_RATE( 594000000, 2, 99, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 504000000, 1, 63, 3, 1, 1, 0), >> + RK3036_PLL_RATE( 500000000, 6, 250, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 408000000, 1, 68, 2, 2, 1, 0), >> + RK3036_PLL_RATE( 312000000, 1, 52, 2, 2, 1, 0), >> + RK3036_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), >> + RK3036_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), >> + RK3036_PLL_RATE(0, 1, 0, 1, 1, 1, 0), > you shouldn't need a "0" rate entry I guess Done. >> + { /* sentinel */ }, >> +}; >> + >> +#define RK3036_DIV_CPU_MASK 0x1f >> +#define RK3036_DIV_CPU_SHIFT 8 >> + >> +#define RK3036_DIV_PERI_MASK 0xf >> +#define RK3036_DIV_PERI_SHIFT 0 >> +#define RK3036_DIV_ACLK_MASK 0x7 >> +#define RK3036_DIV_ACLK_SHIFT 4 >> +#define RK3036_DIV_HCLK_MASK 0x3 >> +#define RK3036_DIV_HCLK_SHIFT 8 >> +#define RK3036_DIV_PCLK_MASK 0x7 >> +#define RK3036_DIV_PCLK_SHIFT 12 >> + >> +#define RK3036_CLKSEL1(_core_periph_div) \ >> + { \ >> + .reg = RK2928_CLKSEL_CON(1), \ >> + .val = HIWORD_UPDATE(_core_periph_div, RK3036_DIV_PERI_MASK, \ >> + RK3036_DIV_PERI_SHIFT) \ >> + } >> + >> +#define RK3036_CPUCLK_RATE(_prate, _core_periph_div) \ >> + { \ >> + .prate = _prate, \ >> + .divs = { \ >> + RK3036_CLKSEL1(_core_periph_div), \ >> + }, \ >> + } >> + >> +static struct rockchip_cpuclk_rate_table rk3036_cpuclk_rates[] __initdata = >> { + RK3036_CPUCLK_RATE(816000000, 4), >> + RK3036_CPUCLK_RATE(600000000, 4), >> + RK3036_CPUCLK_RATE(312000000, 4), >> +}; >> + >> +static const struct rockchip_cpuclk_reg_data rk3036_cpuclk_data = { >> + .core_reg = RK2928_CLKSEL_CON(0), >> + .div_core_shift = 0, >> + .div_core_mask = 0x1f, >> + .mux_core_shift = 7, >> +}; >> + >> +PNAME(mux_pll_p) = { "xin24m", "xin24m" }; > looks like you overlooked the divider? Like > > DIV(0, "xin24m_plldiv", "xin24m", 0, > RK2928_CLKSEL_CON(4), 8, 5, DFLAGS), > > PNAME(mux_pll_p) = { "xin24m_plldiv", "xin24m" }; Did I? There are not xin24m_plldiv and CRU_CLKSEL_CON4 register in my rk3036 TRM... >> + >> +PNAME(mux_armclk_p) = { "apll", "gpll_armclk" }; >> +PNAME(mux_busclk_p) = { "apll", "dpll_cpu", "gpll_cpu" }; > [...] > >> + /* >> + * Clock-Architecture Diagram 3 >> + */ >> + >> + /* aclk_cpu gates */ >> + GATE(0, "sclk_intmem", "aclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 12, GFLAGS), + GATE(0, "aclk_strc_sys", "aclk_cpu", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 10, GFLAGS), + >> + /* hclk_cpu gates */ >> + GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 6, GFLAGS), + >> + /* pclk_cpu gates */ >> + GATE(PCLK_GRF, "pclk_grf", "pclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 4, GFLAGS), + GATE(PCLK_DDRUPCTL, "pclk_ddrupctl", >> "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 7, GFLAGS), + GATE(ACLK_VCODEC, >> "pclk_acodec", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 14, GFLAGS), >> + GATE(PCLK_HDMI, "pclk_hdmi", "pclk_cpu", 0, RK2928_CLKGATE_CON(3), 8, >> GFLAGS), + >> + /* aclk_vio gates */ >> + GATE(ACLK_VIO, "aclk_vio", "aclk_disp1_pre", 0, >> + RK2928_CLKGATE_CON(6), 13, GFLAGS), >> + GATE(ACLK_LCDC, "aclk_lcdc", "aclk_disp1_pre", 0, >> + RK2928_CLKGATE_CON(9), 6, GFLAGS), >> + >> + GATE(HCLK_VIO_BUS, "hclk_vio_bus", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(6), 12, GFLAGS), >> + GATE(HCLK_LCDC, "hclk_lcdc", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(9), 5, GFLAGS), >> + >> + /* aclk_video gates */ >> + GATE(HCLK_LCDC, "hclk_vcodec", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(3), 12, GFLAGS), > in big gate-block from diagram 3, please stick to the one-line format, like > the rest of the gates here (diagram3 only) Done. >> + >> + /* xin24m gates */ >> + GATE(SCLK_PVTM_CORE, "sclk_pvtm_core", "xin24m", 0, >> RK2928_CLKGATE_CON(10), 0, GFLAGS), + GATE(SCLK_PVTM_GPU, "sclk_pvtm_gpu", >> "xin24m", 0, RK2928_CLKGATE_CON(10), 1, GFLAGS), + >> + /* aclk_peri gates */ >> + GATE(0, "aclk_peri_axi_matrix", "aclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 3, GFLAGS), + GATE(0, "aclk_cpu_peri", "aclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 2, GFLAGS), + GATE(ACLK_DMAC2, >> "aclk_dmac2", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 1, GFLAGS), + GATE(0, >> "aclk_peri_niu", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 15, >> GFLAGS), + >> + /* hclk_peri gates */ >> + GATE(0, "hclk_peri_matrix", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 0, GFLAGS), + GATE(0, "hclk_usb_peri", "hclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 13, GFLAGS), + GATE(0, >> "hclk_peri_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), >> 14, GFLAGS), + GATE(HCLK_NANDC, "hclk_nandc", "hclk_peri", 0, >> RK2928_CLKGATE_CON(5), 9, GFLAGS), + GATE(HCLK_SDMMC, "hclk_sdmmc", >> "hclk_peri", 0, RK2928_CLKGATE_CON(5), 10, GFLAGS), + GATE(HCLK_SDIO, >> "hclk_sdio", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 11, GFLAGS), >> + GATE(HCLK_EMMC, "hclk_emmc", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, >> GFLAGS), + GATE(HCLK_OTG0, "hclk_otg0", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 13, GFLAGS), + GATE(HCLK_OTG1, "hclk_otg1", >> "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(7), 13, GFLAGS), >> + GATE(HCLK_I2S, "hclk_i2s", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(7), 2, GFLAGS), + GATE(0, "hclk_sfc", "hclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 14, GFLAGS), + GATE(0, >> "hclk_mac", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 15, >> GFLAGS), + >> + /* pclk_peri gates */ >> + GATE(0, "pclk_peri_matrix", "pclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 1, GFLAGS), + GATE(0, "pclk_efuse", "pclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 2, GFLAGS), + GATE(PCLK_TIMER, >> "pclk_timer0", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 7, GFLAGS), >> + GATE(PCLK_PWM, "pclk_pwm", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 10, >> GFLAGS), + GATE(PCLK_SPI, "pclk_spi", "pclk_peri", 0, >> RK2928_CLKGATE_CON(7), 12, GFLAGS), + GATE(PCLK_WDT, "pclk_wdt", >> "pclk_peri", 0, RK2928_CLKGATE_CON(7), 15, GFLAGS), + GATE(PCLK_UART0, >> "pclk_uart0", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 0, GFLAGS), >> + GATE(PCLK_UART1, "pclk_uart1", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 1, >> GFLAGS), + GATE(PCLK_UART2, "pclk_uart2", "pclk_peri", 0, >> RK2928_CLKGATE_CON(8), 2, GFLAGS), + GATE(PCLK_I2C0, "pclk_i2c0", >> "pclk_peri", 0, RK2928_CLKGATE_CON(8), 4, GFLAGS), + GATE(PCLK_I2C1, >> "pclk_i2c1", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 5, GFLAGS), >> + GATE(PCLK_I2C2, "pclk_i2c2", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 6, >> GFLAGS), + GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_peri", 0, >> RK2928_CLKGATE_CON(8), 9, GFLAGS), + GATE(PCLK_GPIO1, "pclk_gpio1", >> "pclk_peri", 0, RK2928_CLKGATE_CON(8), 10, GFLAGS), + GATE(PCLK_GPIO2, >> "pclk_gpio2", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 11, GFLAGS), +}; >> + >> +static const char *const rk3036_critical_clocks[] __initconst = { >> + "aclk_cpu", >> + "aclk_peri", >> + "hclk_peri", >> + "pclk_peri", >> +}; >> + >> +static void __init rk3036_clk_init(struct device_node *np) >> +{ >> + void __iomem *reg_base; >> + struct clk *clk; >> + >> + reg_base = of_iomap(np, 0); >> + if (!reg_base) { >> + pr_err("%s: could not map cru region\n", __func__); >> + return; >> + } >> + >> + rockchip_clk_init(np, reg_base, CLK_NR_CLKS); >> + >> + /* xin12m is created by an cru-internal divider */ >> + clk = clk_register_fixed_factor(NULL, "xin12m", "xin24m", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock xin12m: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "usb480m", "xin24m", 0, 20, 1); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock usb480m: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "ddrphy", "ddrphy2x", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock ddrphy: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "hclk_vcodec_pre", >> + "aclk_vcodec", 0, 1, 4); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock hclk_vcodec_pre: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "sclk_macref_out", >> + "hclk_peri_src", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock sclk_macref_out: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + rockchip_clk_register_plls(rk3036_pll_clks, >> + ARRAY_SIZE(rk3036_pll_clks), >> + -1); >> + rockchip_clk_register_branches(rk3036_clk_branches, >> + ARRAY_SIZE(rk3036_clk_branches)); >> + rockchip_clk_protect_critical(rk3036_critical_clocks, >> + ARRAY_SIZE(rk3036_critical_clocks)); >> + >> + rockchip_clk_register_armclk(ARMCLK, "armclk", >> + mux_armclk_p, ARRAY_SIZE(mux_armclk_p), >> + &rk3036_cpuclk_data, rk3036_cpuclk_rates, >> + ARRAY_SIZE(rk3036_cpuclk_rates)); >> + >> + rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), >> + ROCKCHIP_SOFTRST_HIWORD_MASK); >> + >> + rockchip_register_restart_notifier(RK2928_GLB_SRST_FST); >> +} >> +CLK_OF_DECLARE(rk3036_cru, "rockchip,rk3036-cru", rk3036_clk_init); >> diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h >> index dc8ecb2..6603c07 100644 >> --- a/drivers/clk/rockchip/clk.h >> +++ b/drivers/clk/rockchip/clk.h >> @@ -2,6 +2,9 @@ >> * Copyright (c) 2014 MundoReader S.L. >> * Author: Heiko Stuebner >> * >> + * Copyright (c) 2015 Rockchip Electronics Co. Ltd. >> + * Author: Xing Zheng >> + * >> * based on >> * >> * samsung/clk.h >> @@ -40,6 +43,13 @@ struct clk; >> #define RK2928_SOFTRST_CON(x) ((x) * 0x4 + 0x110) >> #define RK2928_MISC_CON 0x134 >> >> +#define RK3036_SDMMC_CON0 0x144 >> +#define RK3036_SDMMC_CON1 0x148 >> +#define RK3036_SDIO_CON0 0x14c >> +#define RK3036_SDIO_CON1 0x150 >> +#define RK3036_EMMC_CON0 0x154 >> +#define RK3036_EMMC_CON1 0x158 >> + >> #define RK3288_PLL_CON(x) RK2928_PLL_CON(x) >> #define RK3288_MODE_CON 0x50 >> #define RK3288_CLKSEL_CON(x) ((x) * 0x4 + 0x60) >> @@ -75,6 +85,7 @@ struct clk; >> >> enum rockchip_pll_type { >> pll_rk3066, >> + pll_rk3036, > this should be part of the addition of the pll type (your patch4, and should > be reordered accordingly) > > Also please all 3036 before the 3066 entry OK, done. >> }; >> >> #define RK3066_PLL_RATE(_rate, _nr, _nf, _no) \ >> @@ -95,12 +106,31 @@ enum rockchip_pll_type { >> .nb = _nb, \ >> } >> >> +#define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, \ >> + _postdiv2, _dsmpd, _frac) \ >> +{ \ >> + .rate = _rate##U, \ >> + .fbdiv = _fbdiv, \ >> + .postdiv1 = _postdiv1, \ >> + .refdiv = _refdiv, \ >> + .postdiv2 = _postdiv2, \ >> + .dsmpd = _dsmpd, \ >> + .frac = _frac, \ >> +} >> + >> struct rockchip_pll_rate_table { >> unsigned long rate; >> unsigned int nr; >> unsigned int nf; >> unsigned int no; >> unsigned int nb; >> + /* for RK3036 */ >> + unsigned int fbdiv; >> + unsigned int postdiv1; >> + unsigned int refdiv; >> + unsigned int postdiv2; >> + unsigned int dsmpd; >> + unsigned int frac; > same for these 2 ... should be part of the pll addition itself Done. > >> }; >> >> /** Thanks. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xing Zheng Subject: Re: [PATCH v2 3/9] clk: rockchip: add clock controller for rk3036 Date: Thu, 24 Sep 2015 11:04:31 +0800 Message-ID: <5603683F.4020302@rock-chips.com> References: <1442478540-15068-1-git-send-email-zhengxing@rock-chips.com> <1442478540-15068-4-git-send-email-zhengxing@rock-chips.com> <1775899.zcIuq65f1o@diego> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1775899.zcIuq65f1o@diego> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+glpar-linux-rockchip=m.gmane.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: =?UTF-8?B?SGVpa28gU3TDvGJuZXI=?= Cc: Michael Turquette , Stephen Boyd , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org List-Id: linux-rockchip.vger.kernel.org T24gMjAxNeW5tDA55pyIMTfml6UgMTc6NDcsIEhlaWtvIFN0w7xibmVyIHdyb3RlOgo+IEhpLAo+ Cj4gQW0gRG9ubmVyc3RhZywgMTcuIFNlcHRlbWJlciAyMDE1LCAxNjoyODo1NCBzY2hyaWViIFhp bmcgWmhlbmc6Cj4+IEFkZCB0aGUgY2xvY2sgdHJlZSBkZWZpbml0aW9uIGZvciB0aGUgbmV3IHJr MzAzNiBTb0MuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFhpbmcgWmhlbmc8emhlbmd4aW5nQHJvY2st Y2hpcHMuY29tPgo+IG1pc3NpbmcgYSBkdC1iaW5kaW5ncyBkb2N1bWVudCBpbiBhIHNlcGFyYXRl IHBhdGNoLiBTZWUgImR0LWJpbmRpbmdzOiBhZGQKPiBkb2N1bWVudGF0aW9uIG9mIHJrMzY2OCBj bG9jayBjb250cm9sbGVyIgo+IChodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9waXBlcm1haWwv bGludXgtcm9ja2NoaXAvMjAxNS1KdWx5LzAwMzM5Ni5odG1sKQo+IGZvciBjb21wYXJpc29uLgpZ ZXMsIEkgc2VudCBhIGR0LWJpbmRpbmdzIGRvY3VtZW50IGluIHBhdGNoIDU6CiJkdC1iaW5kaW5n czogYWRkIGRvY3VtZW50YXRpb24gb2YgcmszMDM2IGNsb2NrIGNvbnRyb2xsZXIiLAphbmQgSSB0 aGluayBJIHdpbGwgYWRqdXN0IHRoZSBvcmRlciBvZiBkb2N1bWVudCBiZWZvcmUgIkFkZCB0aGUg Y2xvY2sgCnRyZWUuLi4iCmZvciByazMwMzYuCgo+PiAtLS0KPj4KPj4gQ2hhbmdlcyBpbiB2Mjog Tm9uZQo+Pgo+PiAgIGRyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlICAgICB8ICAgIDEgKwo+ PiAgIGRyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yazMwMzYuYyB8ICA1MDQKPj4gKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKyBkcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuaCAg ICAgICAgfAo+PiAzMCArKysKPj4gICAzIGZpbGVzIGNoYW5nZWQsIDUzNSBpbnNlcnRpb25zKCsp Cj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yazMwMzYu Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvTWFrZWZpbGUgYi9kcml2 ZXJzL2Nsay9yb2NrY2hpcC9NYWtlZmlsZQo+PiBpbmRleCBiMjdlZGQ2Li5kNTk5ODI5IDEwMDY0 NAo+PiAtLS0gYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9NYWtlZmlsZQo+PiArKysgYi9kcml2ZXJz L2Nsay9yb2NrY2hpcC9NYWtlZmlsZQo+PiBAQCAtMTAsNiArMTAsNyBAQCBvYmoteQkrPSBjbGst aW52ZXJ0ZXIubwo+PiAgIG9iai15CSs9IGNsay1tbWMtcGhhc2Uubwo+PiAgIG9iai0kKENPTkZJ R19SRVNFVF9DT05UUk9MTEVSKQkrPSBzb2Z0cnN0Lm8KPj4KPj4gK29iai15CSs9IGNsay1yazMw MzYubwo+PiAgIG9iai15CSs9IGNsay1yazMxODgubwo+PiAgIG9iai15CSs9IGNsay1yazMyODgu bwo+PiAgIG9iai15CSs9IGNsay1yazMzNjgubwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsv cm9ja2NoaXAvY2xrLXJrMzAzNi5jCj4+IGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJrMzAz Ni5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAuLjcyNGQ0NjcKPj4gLS0t IC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcmszMDM2LmMKPj4g QEAgLTAsMCArMSw1MDQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTXVuZG9S ZWFkZXIgUy5MLgo+PiArICogQXV0aG9yOiBIZWlrbyBTdHVlYm5lcjxoZWlrb0BzbnRlY2guZGU+ Cj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE1IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENv LiBMdGQuCj4+ICsgKiBBdXRob3I6IFhpbmcgWmhlbmc8emhlbmd4aW5nQHJvY2stY2hpcHMuY29t Pgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+PiArICogdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z ZSwgb3IKPj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4+ICsgKgo+ PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICogR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVk ZTxsaW51eC9jbGstcHJvdmlkZXIuaD4KPj4gKyNpbmNsdWRlPGxpbnV4L29mLmg+Cj4+ICsjaW5j bHVkZTxsaW51eC9vZl9hZGRyZXNzLmg+Cj4+ICsjaW5jbHVkZTxsaW51eC9zeXNjb3JlX29wcy5o Pgo+PiArI2luY2x1ZGU8ZHQtYmluZGluZ3MvY2xvY2svcmszMDM2LWNydS5oPgo+PiArI2luY2x1 ZGUgImNsay5oIgo+PiArCj4+ICtlbnVtIHJrMzAzNl9wbGxzIHsKPj4gKwlhcGxsLCBkcGxsLCBn cGxsLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCByb2NrY2hpcF9wbGxfcmF0ZV90YWJs ZSByazMwMzZfcGxsX3JhdGVzW10gPSB7Cj4+ICsJLyogX21oeiwgX3JlZmRpdiwgX2ZiZGl2LCBf cG9zdGRpdjEsIF9wb3N0ZGl2MiwgX2RzbXBkLCBfZnJhYyAqLwo+PiArCVJLMzAzNl9QTExfUkFU RSgxNjA4MDAwMDAwLCAxLCA2NywgMSwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDE1 ODQwMDAwMDAsIDEsIDY2LCAxLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoMTU2MDAw MDAwMCwgMSwgNjUsIDEsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSgxNTM2MDAwMDAw LCAxLCA2NCwgMSwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDE1MTIwMDAwMDAsIDEs IDYzLCAxLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoMTQ4ODAwMDAwMCwgMSwgNjIs IDEsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSgxNDY0MDAwMDAwLCAxLCA2MSwgMSwg MSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDE0NDAwMDAwMDAsIDEsIDYwLCAxLCAxLCAx LCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoMTQxNjAwMDAwMCwgMSwgNTksIDEsIDEsIDEsIDAp LAo+PiArCVJLMzAzNl9QTExfUkFURSgxMzkyMDAwMDAwLCAxLCA1OCwgMSwgMSwgMSwgMCksCj4+ ICsJUkszMDM2X1BMTF9SQVRFKDEzNjgwMDAwMDAsIDEsIDU3LCAxLCAxLCAxLCAwKSwKPj4gKwlS SzMwMzZfUExMX1JBVEUoMTM0NDAwMDAwMCwgMSwgNTYsIDEsIDEsIDEsIDApLAo+PiArCVJLMzAz Nl9QTExfUkFURSgxMzIwMDAwMDAwLCAxLCA1NSwgMSwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BM TF9SQVRFKDEyOTYwMDAwMDAsIDEsIDU0LCAxLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JB VEUoMTI3MjAwMDAwMCwgMSwgNTMsIDEsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSgx MjQ4MDAwMDAwLCAxLCA1MiwgMSwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDEyMDAw MDAwMDAsIDEsIDUwLCAxLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoMTE4ODAwMDAw MCwgMiwgOTksIDEsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSgxMTA0MDAwMDAwLCAx LCA0NiwgMSwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDExMDAwMDAwMDAsIDEyLCA1 NTAsIDEsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSgxMDA4MDAwMDAwLCAxLCA4NCwg MiwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKDEwMDAwMDAwMDAsIDYsIDUwMCwgMiwg MSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKCA5ODQwMDAwMDAsIDEsIDgyLCAyLCAxLCAx LCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoIDk2MDAwMDAwMCwgMSwgODAsIDIsIDEsIDEsIDAp LAo+PiArCVJLMzAzNl9QTExfUkFURSggOTM2MDAwMDAwLCAxLCA3OCwgMiwgMSwgMSwgMCksCj4+ ICsJUkszMDM2X1BMTF9SQVRFKCA5MTIwMDAwMDAsIDEsIDc2LCAyLCAxLCAxLCAwKSwKPj4gKwlS SzMwMzZfUExMX1JBVEUoIDkwMDAwMDAwMCwgNCwgMzAwLCAyLCAxLCAxLCAwKSwKPj4gKwlSSzMw MzZfUExMX1JBVEUoIDg4ODAwMDAwMCwgMSwgNzQsIDIsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9Q TExfUkFURSggODY0MDAwMDAwLCAxLCA3MiwgMiwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9S QVRFKCA4NDAwMDAwMDAsIDEsIDcwLCAyLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUo IDgxNjAwMDAwMCwgMSwgNjgsIDIsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSggODAw MDAwMDAwLCA2LCA0MDAsIDIsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSggNzAwMDAw MDAwLCA2LCAzNTAsIDIsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSggNjk2MDAwMDAw LCAxLCA1OCwgMiwgMSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKCA2MDAwMDAwMDAsIDEs IDc1LCAzLCAxLCAxLCAwKSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoIDU5NDAwMDAwMCwgMiwgOTks IDIsIDEsIDEsIDApLAo+PiArCVJLMzAzNl9QTExfUkFURSggNTA0MDAwMDAwLCAxLCA2MywgMywg MSwgMSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKCA1MDAwMDAwMDAsIDYsIDI1MCwgMiwgMSwg MSwgMCksCj4+ICsJUkszMDM2X1BMTF9SQVRFKCA0MDgwMDAwMDAsIDEsIDY4LCAyLCAyLCAxLCAw KSwKPj4gKwlSSzMwMzZfUExMX1JBVEUoIDMxMjAwMDAwMCwgMSwgNTIsIDIsIDIsIDEsIDApLAo+ PiArCVJLMzAzNl9QTExfUkFURSggMjE2MDAwMDAwLCAxLCA3MiwgNCwgMiwgMSwgMCksCj4+ICsJ UkszMDM2X1BMTF9SQVRFKCAgOTYwMDAwMDAsIDEsIDY0LCA0LCA0LCAxLCAwKSwKPj4gKwlSSzMw MzZfUExMX1JBVEUoMCwgMSwgMCwgMSwgMSwgMSwgMCksCj4geW91IHNob3VsZG4ndCBuZWVkIGEg IjAiIHJhdGUgZW50cnkgSSBndWVzcwpEb25lLgo+PiArCXsgLyogc2VudGluZWwgKi8gfSwKPj4g K307Cj4+ICsKPj4gKyNkZWZpbmUgUkszMDM2X0RJVl9DUFVfTUFTSwkJMHgxZgo+PiArI2RlZmlu ZSBSSzMwMzZfRElWX0NQVV9TSElGVAkJOAo+PiArCj4+ICsjZGVmaW5lIFJLMzAzNl9ESVZfUEVS SV9NQVNLCQkweGYKPj4gKyNkZWZpbmUgUkszMDM2X0RJVl9QRVJJX1NISUZUCQkwCj4+ICsjZGVm aW5lIFJLMzAzNl9ESVZfQUNMS19NQVNLCQkweDcKPj4gKyNkZWZpbmUgUkszMDM2X0RJVl9BQ0xL X1NISUZUCQk0Cj4+ICsjZGVmaW5lIFJLMzAzNl9ESVZfSENMS19NQVNLCQkweDMKPj4gKyNkZWZp bmUgUkszMDM2X0RJVl9IQ0xLX1NISUZUCQk4Cj4+ICsjZGVmaW5lIFJLMzAzNl9ESVZfUENMS19N QVNLCQkweDcKPj4gKyNkZWZpbmUgUkszMDM2X0RJVl9QQ0xLX1NISUZUCQkxMgo+PiArCj4+ICsj ZGVmaW5lIFJLMzAzNl9DTEtTRUwxKF9jb3JlX3BlcmlwaF9kaXYpCQkJCQlcCj4+ICsJewkJCQkJ CQkJCVwKPj4gKwkJLnJlZyA9IFJLMjkyOF9DTEtTRUxfQ09OKDEpLAkJCQkJXAo+PiArCQkudmFs ID0gSElXT1JEX1VQREFURShfY29yZV9wZXJpcGhfZGl2LCBSSzMwMzZfRElWX1BFUklfTUFTSywJ XAo+PiArCQkJCVJLMzAzNl9ESVZfUEVSSV9TSElGVCkJCQkJXAo+PiArCX0KPj4gKwo+PiArI2Rl ZmluZSBSSzMwMzZfQ1BVQ0xLX1JBVEUoX3ByYXRlLCBfY29yZV9wZXJpcGhfZGl2KQkJCVwKPj4g Kwl7CQkJCQkJCQlcCj4+ICsJCS5wcmF0ZSA9IF9wcmF0ZSwJCQkJCVwKPj4gKwkJLmRpdnMgPSB7 CQkJCQkJXAo+PiArCQkJUkszMDM2X0NMS1NFTDEoX2NvcmVfcGVyaXBoX2RpdiksCQlcCj4+ICsJ CX0sCQkJCQkJCVwKPj4gKwl9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3Qgcm9ja2NoaXBfY3B1Y2xr X3JhdGVfdGFibGUgcmszMDM2X2NwdWNsa19yYXRlc1tdIF9faW5pdGRhdGEgPQo+PiB7ICsJUksz MDM2X0NQVUNMS19SQVRFKDgxNjAwMDAwMCwgNCksCj4+ICsJUkszMDM2X0NQVUNMS19SQVRFKDYw MDAwMDAwMCwgNCksCj4+ICsJUkszMDM2X0NQVUNMS19SQVRFKDMxMjAwMDAwMCwgNCksCj4+ICt9 Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX2NwdWNsa19yZWdfZGF0YSBy azMwMzZfY3B1Y2xrX2RhdGEgPSB7Cj4+ICsJLmNvcmVfcmVnID0gUksyOTI4X0NMS1NFTF9DT04o MCksCj4+ICsJLmRpdl9jb3JlX3NoaWZ0ID0gMCwKPj4gKwkuZGl2X2NvcmVfbWFzayA9IDB4MWYs Cj4+ICsJLm11eF9jb3JlX3NoaWZ0ID0gNywKPj4gK307Cj4+ICsKPj4gK1BOQU1FKG11eF9wbGxf cCkJCT0geyAieGluMjRtIiwgInhpbjI0bSIgfTsKPiBsb29rcyBsaWtlIHlvdSBvdmVybG9va2Vk IHRoZSBkaXZpZGVyPyBMaWtlCj4KPiBESVYoMCwgInhpbjI0bV9wbGxkaXYiLCAieGluMjRtIiwg MCwKPiAJCVJLMjkyOF9DTEtTRUxfQ09OKDQpLCA4LCA1LCBERkxBR1MpLAo+Cj4gUE5BTUUobXV4 X3BsbF9wKQkJPSB7ICJ4aW4yNG1fcGxsZGl2IiwgInhpbjI0bSIgfTsKRGlkIEk/IFRoZXJlIGFy ZSBub3QgeGluMjRtX3BsbGRpdiBhbmQgQ1JVX0NMS1NFTF9DT040IHJlZ2lzdGVyIGluIG15IApy azMwMzYgVFJNLi4uCj4+ICsKPj4gK1BOQU1FKG11eF9hcm1jbGtfcCkJCT0geyAiYXBsbCIsICJn cGxsX2FybWNsayIgfTsKPj4gK1BOQU1FKG11eF9idXNjbGtfcCkJCT0geyAiYXBsbCIsICJkcGxs X2NwdSIsICJncGxsX2NwdSIgfTsKPiBbLi4uXQo+Cj4+ICsJLyoKPj4gKwkgKiBDbG9jay1BcmNo aXRlY3R1cmUgRGlhZ3JhbSAzCj4+ICsJICovCj4+ICsKPj4gKwkvKiBhY2xrX2NwdSBnYXRlcyAq Lwo+PiArCUdBVEUoMCwgInNjbGtfaW50bWVtIiwgImFjbGtfY3B1IiwgQ0xLX0lHTk9SRV9VTlVT RUQsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTig0KSwgMTIsIEdGTEFHUyksICsJR0FURSgwLCAiYWNs a19zdHJjX3N5cyIsICJhY2xrX2NwdSIsCj4+IENMS19JR05PUkVfVU5VU0VELCBSSzI5MjhfQ0xL R0FURV9DT04oNCksIDEwLCBHRkxBR1MpLCArCj4+ICsJLyogaGNsa19jcHUgZ2F0ZXMgKi8KPj4g KwlHQVRFKEhDTEtfUk9NLCAiaGNsa19yb20iLCAiaGNsa19jcHUiLCBDTEtfSUdOT1JFX1VOVVNF RCwKPj4gUksyOTI4X0NMS0dBVEVfQ09OKDUpLCA2LCBHRkxBR1MpLCArCj4+ICsJLyogcGNsa19j cHUgZ2F0ZXMgKi8KPj4gKwlHQVRFKFBDTEtfR1JGLCAicGNsa19ncmYiLCAicGNsa19jcHUiLCBD TEtfSUdOT1JFX1VOVVNFRCwKPj4gUksyOTI4X0NMS0dBVEVfQ09OKDUpLCA0LCBHRkxBR1MpLCAr CUdBVEUoUENMS19ERFJVUENUTCwgInBjbGtfZGRydXBjdGwiLAo+PiAicGNsa19jcHUiLCAwLCBS SzI5MjhfQ0xLR0FURV9DT04oNSksIDcsIEdGTEFHUyksICsJR0FURShBQ0xLX1ZDT0RFQywKPj4g InBjbGtfYWNvZGVjIiwgInBjbGtfY3B1IiwgMCwgUksyOTI4X0NMS0dBVEVfQ09OKDUpLCAxNCwg R0ZMQUdTKSwKPj4gKwlHQVRFKFBDTEtfSERNSSwgInBjbGtfaGRtaSIsICJwY2xrX2NwdSIsIDAs IFJLMjkyOF9DTEtHQVRFX0NPTigzKSwgOCwKPj4gR0ZMQUdTKSwgKwo+PiArCS8qIGFjbGtfdmlv IGdhdGVzICovCj4+ICsJR0FURShBQ0xLX1ZJTywgImFjbGtfdmlvIiwgImFjbGtfZGlzcDFfcHJl IiwgMCwKPj4gKwkJCVJLMjkyOF9DTEtHQVRFX0NPTig2KSwgMTMsIEdGTEFHUyksCj4+ICsJR0FU RShBQ0xLX0xDREMsICJhY2xrX2xjZGMiLCAiYWNsa19kaXNwMV9wcmUiLCAwLAo+PiArCQkJUksy OTI4X0NMS0dBVEVfQ09OKDkpLCA2LCBHRkxBR1MpLAo+PiArCj4+ICsJR0FURShIQ0xLX1ZJT19C VVMsICJoY2xrX3Zpb19idXMiLCAiaGNsa19kaXNwX3ByZSIsIDAsCj4+ICsJCQlSSzI5MjhfQ0xL R0FURV9DT04oNiksIDEyLCBHRkxBR1MpLAo+PiArCUdBVEUoSENMS19MQ0RDLCAiaGNsa19sY2Rj IiwgImhjbGtfZGlzcF9wcmUiLCAwLAo+PiArCQkJUksyOTI4X0NMS0dBVEVfQ09OKDkpLCA1LCBH RkxBR1MpLAo+PiArCj4+ICsJLyogYWNsa192aWRlbyBnYXRlcyAqLwo+PiArCUdBVEUoSENMS19M Q0RDLCAiaGNsa192Y29kZWMiLCAiaGNsa19kaXNwX3ByZSIsIDAsCj4+ICsJCQlSSzI5MjhfQ0xL R0FURV9DT04oMyksIDEyLCBHRkxBR1MpLAo+IGluIGJpZyBnYXRlLWJsb2NrIGZyb20gZGlhZ3Jh bSAzLCBwbGVhc2Ugc3RpY2sgdG8gdGhlIG9uZS1saW5lIGZvcm1hdCwgbGlrZQo+IHRoZSByZXN0 IG9mIHRoZSBnYXRlcyBoZXJlIChkaWFncmFtMyBvbmx5KQpEb25lLgo+PiArCj4+ICsJLyogeGlu MjRtIGdhdGVzICovCj4+ICsJR0FURShTQ0xLX1BWVE1fQ09SRSwgInNjbGtfcHZ0bV9jb3JlIiwg InhpbjI0bSIsIDAsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTigxMCksIDAsIEdGTEFHUyksICsJR0FU RShTQ0xLX1BWVE1fR1BVLCAic2Nsa19wdnRtX2dwdSIsCj4+ICJ4aW4yNG0iLCAwLCBSSzI5Mjhf Q0xLR0FURV9DT04oMTApLCAxLCBHRkxBR1MpLCArCj4+ICsJLyogYWNsa19wZXJpIGdhdGVzICov Cj4+ICsJR0FURSgwLCAiYWNsa19wZXJpX2F4aV9tYXRyaXgiLCAiYWNsa19wZXJpIiwgQ0xLX0lH Tk9SRV9VTlVTRUQsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTig0KSwgMywgR0ZMQUdTKSwgKwlHQVRF KDAsICJhY2xrX2NwdV9wZXJpIiwgImFjbGtfcGVyaSIsCj4+IENMS19JR05PUkVfVU5VU0VELCBS SzI5MjhfQ0xLR0FURV9DT04oNCksIDIsIEdGTEFHUyksICsJR0FURShBQ0xLX0RNQUMyLAo+PiAi YWNsa19kbWFjMiIsICJhY2xrX3BlcmkiLCAwLCBSSzI5MjhfQ0xLR0FURV9DT04oNSksIDEsIEdG TEFHUyksICsJR0FURSgwLAo+PiAiYWNsa19wZXJpX25pdSIsICJhY2xrX3BlcmkiLCBDTEtfSUdO T1JFX1VOVVNFRCwgUksyOTI4X0NMS0dBVEVfQ09OKDkpLCAxNSwKPj4gR0ZMQUdTKSwgKwo+PiAr CS8qIGhjbGtfcGVyaSBnYXRlcyAqLwo+PiArCUdBVEUoMCwgImhjbGtfcGVyaV9tYXRyaXgiLCAi aGNsa19wZXJpIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTig0KSwg MCwgR0ZMQUdTKSwgKwlHQVRFKDAsICJoY2xrX3VzYl9wZXJpIiwgImhjbGtfcGVyaSIsCj4+IENM S19JR05PUkVfVU5VU0VELCBSSzI5MjhfQ0xLR0FURV9DT04oOSksIDEzLCBHRkxBR1MpLCArCUdB VEUoMCwKPj4gImhjbGtfcGVyaV9hcmJpIiwgImhjbGtfcGVyaSIsIENMS19JR05PUkVfVU5VU0VE LCBSSzI5MjhfQ0xLR0FURV9DT04oOSksCj4+IDE0LCBHRkxBR1MpLCArCUdBVEUoSENMS19OQU5E QywgImhjbGtfbmFuZGMiLCAiaGNsa19wZXJpIiwgMCwKPj4gUksyOTI4X0NMS0dBVEVfQ09OKDUp LCA5LCBHRkxBR1MpLCArCUdBVEUoSENMS19TRE1NQywgImhjbGtfc2RtbWMiLAo+PiAiaGNsa19w ZXJpIiwgMCwgUksyOTI4X0NMS0dBVEVfQ09OKDUpLCAxMCwgR0ZMQUdTKSwgKwlHQVRFKEhDTEtf U0RJTywKPj4gImhjbGtfc2RpbyIsICJoY2xrX3BlcmkiLCAwLCBSSzI5MjhfQ0xLR0FURV9DT04o NSksIDExLCBHRkxBR1MpLAo+PiArCUdBVEUoSENMS19FTU1DLCAiaGNsa19lbW1jIiwgImhjbGtf cGVyaSIsIDAsIFJLMjkyOF9DTEtHQVRFX0NPTig3KSwgMCwKPj4gR0ZMQUdTKSwgKwlHQVRFKEhD TEtfT1RHMCwgImhjbGtfb3RnMCIsICJoY2xrX3BlcmkiLCBDTEtfSUdOT1JFX1VOVVNFRCwKPj4g UksyOTI4X0NMS0dBVEVfQ09OKDUpLCAxMywgR0ZMQUdTKSwgKwlHQVRFKEhDTEtfT1RHMSwgImhj bGtfb3RnMSIsCj4+ICJoY2xrX3BlcmkiLCBDTEtfSUdOT1JFX1VOVVNFRCwgUksyOTI4X0NMS0dB VEVfQ09OKDcpLCAxMywgR0ZMQUdTKSwKPj4gKwlHQVRFKEhDTEtfSTJTLCAiaGNsa19pMnMiLCAi aGNsa19wZXJpIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTig3KSwg MiwgR0ZMQUdTKSwgKwlHQVRFKDAsICJoY2xrX3NmYyIsICJoY2xrX3BlcmkiLAo+PiBDTEtfSUdO T1JFX1VOVVNFRCwgUksyOTI4X0NMS0dBVEVfQ09OKDMpLCAxNCwgR0ZMQUdTKSwgKwlHQVRFKDAs Cj4+ICJoY2xrX21hYyIsICJoY2xrX3BlcmkiLCBDTEtfSUdOT1JFX1VOVVNFRCwgUksyOTI4X0NM S0dBVEVfQ09OKDMpLCAxNSwKPj4gR0ZMQUdTKSwgKwo+PiArCS8qIHBjbGtfcGVyaSBnYXRlcyAq Lwo+PiArCUdBVEUoMCwgInBjbGtfcGVyaV9tYXRyaXgiLCAicGNsa19wZXJpIiwgQ0xLX0lHTk9S RV9VTlVTRUQsCj4+IFJLMjkyOF9DTEtHQVRFX0NPTig0KSwgMSwgR0ZMQUdTKSwgKwlHQVRFKDAs ICJwY2xrX2VmdXNlIiwgInBjbGtfcGVyaSIsCj4+IENMS19JR05PUkVfVU5VU0VELCBSSzI5Mjhf Q0xLR0FURV9DT04oNSksIDIsIEdGTEFHUyksICsJR0FURShQQ0xLX1RJTUVSLAo+PiAicGNsa190 aW1lcjAiLCAicGNsa19wZXJpIiwgMCwgUksyOTI4X0NMS0dBVEVfQ09OKDcpLCA3LCBHRkxBR1Mp LAo+PiArCUdBVEUoUENMS19QV00sICJwY2xrX3B3bSIsICJwY2xrX3BlcmkiLCAwLCBSSzI5Mjhf Q0xLR0FURV9DT04oNyksIDEwLAo+PiBHRkxBR1MpLCArCUdBVEUoUENMS19TUEksICJwY2xrX3Nw aSIsICJwY2xrX3BlcmkiLCAwLAo+PiBSSzI5MjhfQ0xLR0FURV9DT04oNyksIDEyLCBHRkxBR1Mp LCArCUdBVEUoUENMS19XRFQsICJwY2xrX3dkdCIsCj4+ICJwY2xrX3BlcmkiLCAwLCBSSzI5Mjhf Q0xLR0FURV9DT04oNyksIDE1LCBHRkxBR1MpLCArCUdBVEUoUENMS19VQVJUMCwKPj4gInBjbGtf dWFydDAiLCAicGNsa19wZXJpIiwgMCwgUksyOTI4X0NMS0dBVEVfQ09OKDgpLCAwLCBHRkxBR1Mp LAo+PiArCUdBVEUoUENMS19VQVJUMSwgInBjbGtfdWFydDEiLCAicGNsa19wZXJpIiwgMCwgUksy OTI4X0NMS0dBVEVfQ09OKDgpLCAxLAo+PiBHRkxBR1MpLCArCUdBVEUoUENMS19VQVJUMiwgInBj bGtfdWFydDIiLCAicGNsa19wZXJpIiwgMCwKPj4gUksyOTI4X0NMS0dBVEVfQ09OKDgpLCAyLCBH RkxBR1MpLCArCUdBVEUoUENMS19JMkMwLCAicGNsa19pMmMwIiwKPj4gInBjbGtfcGVyaSIsIDAs IFJLMjkyOF9DTEtHQVRFX0NPTig4KSwgNCwgR0ZMQUdTKSwgKwlHQVRFKFBDTEtfSTJDMSwKPj4g InBjbGtfaTJjMSIsICJwY2xrX3BlcmkiLCAwLCBSSzI5MjhfQ0xLR0FURV9DT04oOCksIDUsIEdG TEFHUyksCj4+ICsJR0FURShQQ0xLX0kyQzIsICJwY2xrX2kyYzIiLCAicGNsa19wZXJpIiwgMCwg UksyOTI4X0NMS0dBVEVfQ09OKDgpLCA2LAo+PiBHRkxBR1MpLCArCUdBVEUoUENMS19HUElPMCwg InBjbGtfZ3BpbzAiLCAicGNsa19wZXJpIiwgMCwKPj4gUksyOTI4X0NMS0dBVEVfQ09OKDgpLCA5 LCBHRkxBR1MpLCArCUdBVEUoUENMS19HUElPMSwgInBjbGtfZ3BpbzEiLAo+PiAicGNsa19wZXJp IiwgMCwgUksyOTI4X0NMS0dBVEVfQ09OKDgpLCAxMCwgR0ZMQUdTKSwgKwlHQVRFKFBDTEtfR1BJ TzIsCj4+ICJwY2xrX2dwaW8yIiwgInBjbGtfcGVyaSIsIDAsIFJLMjkyOF9DTEtHQVRFX0NPTig4 KSwgMTEsIEdGTEFHUyksICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgcmsz MDM2X2NyaXRpY2FsX2Nsb2Nrc1tdIF9faW5pdGNvbnN0ID0gewo+PiArCSJhY2xrX2NwdSIsCj4+ ICsJImFjbGtfcGVyaSIsCj4+ICsJImhjbGtfcGVyaSIsCj4+ICsJInBjbGtfcGVyaSIsCj4+ICt9 Owo+PiArCj4+ICtzdGF0aWMgdm9pZCBfX2luaXQgcmszMDM2X2Nsa19pbml0KHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnApCj4+ICt7Cj4+ICsJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKPj4gKwlzdHJ1 Y3QgY2xrICpjbGs7Cj4+ICsKPj4gKwlyZWdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKPj4gKwlp ZiAoIXJlZ19iYXNlKSB7Cj4+ICsJCXByX2VycigiJXM6IGNvdWxkIG5vdCBtYXAgY3J1IHJlZ2lv blxuIiwgX19mdW5jX18pOwo+PiArCQlyZXR1cm47Cj4+ICsJfQo+PiArCj4+ICsJcm9ja2NoaXBf Y2xrX2luaXQobnAsIHJlZ19iYXNlLCBDTEtfTlJfQ0xLUyk7Cj4+ICsKPj4gKwkvKiB4aW4xMm0g aXMgY3JlYXRlZCBieSBhbiBjcnUtaW50ZXJuYWwgZGl2aWRlciAqLwo+PiArCWNsayA9IGNsa19y ZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInhpbjEybSIsICJ4aW4yNG0iLCAwLCAxLCAyKTsK Pj4gKwlpZiAoSVNfRVJSKGNsaykpCj4+ICsJCXByX3dhcm4oIiVzOiBjb3VsZCBub3QgcmVnaXN0 ZXIgY2xvY2sgeGluMTJtOiAlbGRcbiIsCj4+ICsJCQlfX2Z1bmNfXywgUFRSX0VSUihjbGspKTsK Pj4gKwo+PiArCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInVzYjQ4MG0i LCAieGluMjRtIiwgMCwgMjAsIDEpOwo+PiArCWlmIChJU19FUlIoY2xrKSkKPj4gKwkJcHJfd2Fy bigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBjbG9jayB1c2I0ODBtOiAlbGRcbiIsCj4+ICsJCQlf X2Z1bmNfXywgUFRSX0VSUihjbGspKTsKPj4gKwo+PiArCWNsayA9IGNsa19yZWdpc3Rlcl9maXhl ZF9mYWN0b3IoTlVMTCwgImRkcnBoeSIsICJkZHJwaHkyeCIsIDAsIDEsIDIpOwo+PiArCWlmIChJ U19FUlIoY2xrKSkKPj4gKwkJcHJfd2FybigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBjbG9jayBk ZHJwaHk6ICVsZFxuIiwKPj4gKwkJCV9fZnVuY19fLCBQVFJfRVJSKGNsaykpOwo+PiArCj4+ICsJ Y2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiaGNsa192Y29kZWNfcHJlIiwK Pj4gKwkJCQkJImFjbGtfdmNvZGVjIiwgMCwgMSwgNCk7Cj4+ICsJaWYgKElTX0VSUihjbGspKQo+ PiArCQlwcl93YXJuKCIlczogY291bGQgbm90IHJlZ2lzdGVyIGNsb2NrIGhjbGtfdmNvZGVjX3By ZTogJWxkXG4iLAo+PiArCQkJX19mdW5jX18sIFBUUl9FUlIoY2xrKSk7Cj4+ICsKPj4gKwljbGsg PSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJzY2xrX21hY3JlZl9vdXQiLAo+PiAr CQkJCQkiaGNsa19wZXJpX3NyYyIsIDAsIDEsIDIpOwo+PiArCWlmIChJU19FUlIoY2xrKSkKPj4g KwkJcHJfd2FybigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBjbG9jayBzY2xrX21hY3JlZl9vdXQ6 ICVsZFxuIiwKPj4gKwkJCV9fZnVuY19fLCBQVFJfRVJSKGNsaykpOwo+PiArCj4+ICsJcm9ja2No aXBfY2xrX3JlZ2lzdGVyX3BsbHMocmszMDM2X3BsbF9jbGtzLAo+PiArCQkJCSAgIEFSUkFZX1NJ WkUocmszMDM2X3BsbF9jbGtzKSwKPj4gKwkJCQkgICAtMSk7Cj4+ICsJcm9ja2NoaXBfY2xrX3Jl Z2lzdGVyX2JyYW5jaGVzKHJrMzAzNl9jbGtfYnJhbmNoZXMsCj4+ICsJCQkJICBBUlJBWV9TSVpF KHJrMzAzNl9jbGtfYnJhbmNoZXMpKTsKPj4gKwlyb2NrY2hpcF9jbGtfcHJvdGVjdF9jcml0aWNh bChyazMwMzZfY3JpdGljYWxfY2xvY2tzLAo+PiArCQkJCSAgICAgIEFSUkFZX1NJWkUocmszMDM2 X2NyaXRpY2FsX2Nsb2NrcykpOwo+PiArCj4+ICsJcm9ja2NoaXBfY2xrX3JlZ2lzdGVyX2FybWNs ayhBUk1DTEssICJhcm1jbGsiLAo+PiArCQkJbXV4X2FybWNsa19wLCBBUlJBWV9TSVpFKG11eF9h cm1jbGtfcCksCj4+ICsJCQkmcmszMDM2X2NwdWNsa19kYXRhLCByazMwMzZfY3B1Y2xrX3JhdGVz LAo+PiArCQkJQVJSQVlfU0laRShyazMwMzZfY3B1Y2xrX3JhdGVzKSk7Cj4+ICsKPj4gKwlyb2Nr Y2hpcF9yZWdpc3Rlcl9zb2Z0cnN0KG5wLCA5LCByZWdfYmFzZSArIFJLMjkyOF9TT0ZUUlNUX0NP TigwKSwKPj4gKwkJCQkgIFJPQ0tDSElQX1NPRlRSU1RfSElXT1JEX01BU0spOwo+PiArCj4+ICsJ cm9ja2NoaXBfcmVnaXN0ZXJfcmVzdGFydF9ub3RpZmllcihSSzI5MjhfR0xCX1NSU1RfRlNUKTsK Pj4gK30KPj4gK0NMS19PRl9ERUNMQVJFKHJrMzAzNl9jcnUsICJyb2NrY2hpcCxyazMwMzYtY3J1 IiwgcmszMDM2X2Nsa19pbml0KTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JvY2tjaGlw L2Nsay5oIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKPj4gaW5kZXggZGM4ZWNiMi4uNjYw M2MwNyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKPj4gKysrIGIv ZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKPj4gQEAgLTIsNiArMiw5IEBACj4+ICAgICogQ29w eXJpZ2h0IChjKSAyMDE0IE11bmRvUmVhZGVyIFMuTC4KPj4gICAgKiBBdXRob3I6IEhlaWtvIFN0 dWVibmVyPGhlaWtvQHNudGVjaC5kZT4KPj4gICAgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE1 IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiBMdGQuCj4+ICsgKiBBdXRob3I6IFhpbmcgWmhlbmc8 emhlbmd4aW5nQHJvY2stY2hpcHMuY29tPgo+PiArICoKPj4gICAgKiBiYXNlZCBvbgo+PiAgICAq Cj4+ICAgICogc2Ftc3VuZy9jbGsuaAo+PiBAQCAtNDAsNiArNDMsMTMgQEAgc3RydWN0IGNsazsK Pj4gICAjZGVmaW5lIFJLMjkyOF9TT0ZUUlNUX0NPTih4KQkoKHgpICogMHg0ICsgMHgxMTApCj4+ ICAgI2RlZmluZSBSSzI5MjhfTUlTQ19DT04JCTB4MTM0Cj4+Cj4+ICsjZGVmaW5lIFJLMzAzNl9T RE1NQ19DT04wCQkweDE0NAo+PiArI2RlZmluZSBSSzMwMzZfU0RNTUNfQ09OMQkJMHgxNDgKPj4g KyNkZWZpbmUgUkszMDM2X1NESU9fQ09OMAkJMHgxNGMKPj4gKyNkZWZpbmUgUkszMDM2X1NESU9f Q09OMQkJMHgxNTAKPj4gKyNkZWZpbmUgUkszMDM2X0VNTUNfQ09OMAkJMHgxNTQKPj4gKyNkZWZp bmUgUkszMDM2X0VNTUNfQ09OMQkJMHgxNTgKPj4gKwo+PiAgICNkZWZpbmUgUkszMjg4X1BMTF9D T04oeCkJCVJLMjkyOF9QTExfQ09OKHgpCj4+ICAgI2RlZmluZSBSSzMyODhfTU9ERV9DT04JCQkw eDUwCj4+ICAgI2RlZmluZSBSSzMyODhfQ0xLU0VMX0NPTih4KQkJKCh4KSAqIDB4NCArIDB4NjAp Cj4+IEBAIC03NSw2ICs4NSw3IEBAIHN0cnVjdCBjbGs7Cj4+Cj4+ICAgZW51bSByb2NrY2hpcF9w bGxfdHlwZSB7Cj4+ICAgCXBsbF9yazMwNjYsCj4+ICsJcGxsX3JrMzAzNiwKPiB0aGlzIHNob3Vs ZCBiZSBwYXJ0IG9mIHRoZSBhZGRpdGlvbiBvZiB0aGUgcGxsIHR5cGUgKHlvdXIgcGF0Y2g0LCBh bmQgc2hvdWxkCj4gYmUgcmVvcmRlcmVkIGFjY29yZGluZ2x5KQo+Cj4gQWxzbyBwbGVhc2UgYWxs IDMwMzYgYmVmb3JlIHRoZSAzMDY2IGVudHJ5Ck9LLCBkb25lLgo+PiAgIH07Cj4+Cj4+ICAgI2Rl ZmluZSBSSzMwNjZfUExMX1JBVEUoX3JhdGUsIF9uciwgX25mLCBfbm8pCVwKPj4gQEAgLTk1LDEy ICsxMDYsMzEgQEAgZW51bSByb2NrY2hpcF9wbGxfdHlwZSB7Cj4+ICAgCS5uYiA9IF9uYiwJCQkJ CQlcCj4+ICAgfQo+Pgo+PiArI2RlZmluZSBSSzMwMzZfUExMX1JBVEUoX3JhdGUsIF9yZWZkaXYs IF9mYmRpdiwgX3Bvc3RkaXYxLAlcCj4+ICsJCQlfcG9zdGRpdjIsIF9kc21wZCwgX2ZyYWMpCQlc Cj4+ICt7CQkJCQkJCQlcCj4+ICsJLnJhdGUJPSBfcmF0ZSMjVSwJCQkJCVwKPj4gKwkuZmJkaXYg PSBfZmJkaXYsCQkJCQlcCj4+ICsJLnBvc3RkaXYxID0gX3Bvc3RkaXYxLAkJCQkJXAo+PiArCS5y ZWZkaXYgPSBfcmVmZGl2LAkJCQkJXAo+PiArCS5wb3N0ZGl2MiA9IF9wb3N0ZGl2MiwJCQkJCVwK Pj4gKwkuZHNtcGQgPSBfZHNtcGQsCQkJCQlcCj4+ICsJLmZyYWMgPSBfZnJhYywJCQkJCQlcCj4+ ICt9Cj4+ICsKPj4gICBzdHJ1Y3Qgcm9ja2NoaXBfcGxsX3JhdGVfdGFibGUgewo+PiAgIAl1bnNp Z25lZCBsb25nIHJhdGU7Cj4+ICAgCXVuc2lnbmVkIGludCBucjsKPj4gICAJdW5zaWduZWQgaW50 IG5mOwo+PiAgIAl1bnNpZ25lZCBpbnQgbm87Cj4+ICAgCXVuc2lnbmVkIGludCBuYjsKPj4gKwkv KiBmb3IgUkszMDM2ICovCj4+ICsJdW5zaWduZWQgaW50IGZiZGl2Owo+PiArCXVuc2lnbmVkIGlu dCBwb3N0ZGl2MTsKPj4gKwl1bnNpZ25lZCBpbnQgcmVmZGl2Owo+PiArCXVuc2lnbmVkIGludCBw b3N0ZGl2MjsKPj4gKwl1bnNpZ25lZCBpbnQgZHNtcGQ7Cj4+ICsJdW5zaWduZWQgaW50IGZyYWM7 Cj4gc2FtZSBmb3IgdGhlc2UgMiAuLi4gc2hvdWxkIGJlIHBhcnQgb2YgdGhlIHBsbCBhZGRpdGlv biBpdHNlbGYKRG9uZS4KPgo+PiAgIH07Cj4+Cj4+ICAgLyoqClRoYW5rcy4KCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1yb2NrY2hpcCBtYWls aW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlwCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: zhengxing@rock-chips.com (Xing Zheng) Date: Thu, 24 Sep 2015 11:04:31 +0800 Subject: [PATCH v2 3/9] clk: rockchip: add clock controller for rk3036 In-Reply-To: <1775899.zcIuq65f1o@diego> References: <1442478540-15068-1-git-send-email-zhengxing@rock-chips.com> <1442478540-15068-4-git-send-email-zhengxing@rock-chips.com> <1775899.zcIuq65f1o@diego> Message-ID: <5603683F.4020302@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2015?09?17? 17:47, Heiko St?bner wrote: > Hi, > > Am Donnerstag, 17. September 2015, 16:28:54 schrieb Xing Zheng: >> Add the clock tree definition for the new rk3036 SoC. >> >> Signed-off-by: Xing Zheng > missing a dt-bindings document in a separate patch. See "dt-bindings: add > documentation of rk3668 clock controller" > (http://lists.infradead.org/pipermail/linux-rockchip/2015-July/003396.html) > for comparison. Yes, I sent a dt-bindings document in patch 5: "dt-bindings: add documentation of rk3036 clock controller", and I think I will adjust the order of document before "Add the clock tree..." for rk3036. >> --- >> >> Changes in v2: None >> >> drivers/clk/rockchip/Makefile | 1 + >> drivers/clk/rockchip/clk-rk3036.c | 504 >> +++++++++++++++++++++++++++++++++++++ drivers/clk/rockchip/clk.h | >> 30 +++ >> 3 files changed, 535 insertions(+) >> create mode 100644 drivers/clk/rockchip/clk-rk3036.c >> >> diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile >> index b27edd6..d599829 100644 >> --- a/drivers/clk/rockchip/Makefile >> +++ b/drivers/clk/rockchip/Makefile >> @@ -10,6 +10,7 @@ obj-y += clk-inverter.o >> obj-y += clk-mmc-phase.o >> obj-$(CONFIG_RESET_CONTROLLER) += softrst.o >> >> +obj-y += clk-rk3036.o >> obj-y += clk-rk3188.o >> obj-y += clk-rk3288.o >> obj-y += clk-rk3368.o >> diff --git a/drivers/clk/rockchip/clk-rk3036.c >> b/drivers/clk/rockchip/clk-rk3036.c new file mode 100644 >> index 0000000..724d467 >> --- /dev/null >> +++ b/drivers/clk/rockchip/clk-rk3036.c >> @@ -0,0 +1,504 @@ >> +/* >> + * Copyright (c) 2014 MundoReader S.L. >> + * Author: Heiko Stuebner >> + * >> + * Copyright (c) 2015 Rockchip Electronics Co. Ltd. >> + * Author: Xing Zheng >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include "clk.h" >> + >> +enum rk3036_plls { >> + apll, dpll, gpll, >> +}; >> + >> +static struct rockchip_pll_rate_table rk3036_pll_rates[] = { >> + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ >> + RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0), >> + RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0), >> + RK3036_PLL_RATE(1000000000, 6, 500, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 984000000, 1, 82, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 960000000, 1, 80, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 936000000, 1, 78, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 912000000, 1, 76, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 900000000, 4, 300, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 888000000, 1, 74, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 864000000, 1, 72, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 840000000, 1, 70, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 816000000, 1, 68, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 800000000, 6, 400, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 700000000, 6, 350, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 696000000, 1, 58, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 600000000, 1, 75, 3, 1, 1, 0), >> + RK3036_PLL_RATE( 594000000, 2, 99, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 504000000, 1, 63, 3, 1, 1, 0), >> + RK3036_PLL_RATE( 500000000, 6, 250, 2, 1, 1, 0), >> + RK3036_PLL_RATE( 408000000, 1, 68, 2, 2, 1, 0), >> + RK3036_PLL_RATE( 312000000, 1, 52, 2, 2, 1, 0), >> + RK3036_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), >> + RK3036_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), >> + RK3036_PLL_RATE(0, 1, 0, 1, 1, 1, 0), > you shouldn't need a "0" rate entry I guess Done. >> + { /* sentinel */ }, >> +}; >> + >> +#define RK3036_DIV_CPU_MASK 0x1f >> +#define RK3036_DIV_CPU_SHIFT 8 >> + >> +#define RK3036_DIV_PERI_MASK 0xf >> +#define RK3036_DIV_PERI_SHIFT 0 >> +#define RK3036_DIV_ACLK_MASK 0x7 >> +#define RK3036_DIV_ACLK_SHIFT 4 >> +#define RK3036_DIV_HCLK_MASK 0x3 >> +#define RK3036_DIV_HCLK_SHIFT 8 >> +#define RK3036_DIV_PCLK_MASK 0x7 >> +#define RK3036_DIV_PCLK_SHIFT 12 >> + >> +#define RK3036_CLKSEL1(_core_periph_div) \ >> + { \ >> + .reg = RK2928_CLKSEL_CON(1), \ >> + .val = HIWORD_UPDATE(_core_periph_div, RK3036_DIV_PERI_MASK, \ >> + RK3036_DIV_PERI_SHIFT) \ >> + } >> + >> +#define RK3036_CPUCLK_RATE(_prate, _core_periph_div) \ >> + { \ >> + .prate = _prate, \ >> + .divs = { \ >> + RK3036_CLKSEL1(_core_periph_div), \ >> + }, \ >> + } >> + >> +static struct rockchip_cpuclk_rate_table rk3036_cpuclk_rates[] __initdata = >> { + RK3036_CPUCLK_RATE(816000000, 4), >> + RK3036_CPUCLK_RATE(600000000, 4), >> + RK3036_CPUCLK_RATE(312000000, 4), >> +}; >> + >> +static const struct rockchip_cpuclk_reg_data rk3036_cpuclk_data = { >> + .core_reg = RK2928_CLKSEL_CON(0), >> + .div_core_shift = 0, >> + .div_core_mask = 0x1f, >> + .mux_core_shift = 7, >> +}; >> + >> +PNAME(mux_pll_p) = { "xin24m", "xin24m" }; > looks like you overlooked the divider? Like > > DIV(0, "xin24m_plldiv", "xin24m", 0, > RK2928_CLKSEL_CON(4), 8, 5, DFLAGS), > > PNAME(mux_pll_p) = { "xin24m_plldiv", "xin24m" }; Did I? There are not xin24m_plldiv and CRU_CLKSEL_CON4 register in my rk3036 TRM... >> + >> +PNAME(mux_armclk_p) = { "apll", "gpll_armclk" }; >> +PNAME(mux_busclk_p) = { "apll", "dpll_cpu", "gpll_cpu" }; > [...] > >> + /* >> + * Clock-Architecture Diagram 3 >> + */ >> + >> + /* aclk_cpu gates */ >> + GATE(0, "sclk_intmem", "aclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 12, GFLAGS), + GATE(0, "aclk_strc_sys", "aclk_cpu", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 10, GFLAGS), + >> + /* hclk_cpu gates */ >> + GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 6, GFLAGS), + >> + /* pclk_cpu gates */ >> + GATE(PCLK_GRF, "pclk_grf", "pclk_cpu", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 4, GFLAGS), + GATE(PCLK_DDRUPCTL, "pclk_ddrupctl", >> "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 7, GFLAGS), + GATE(ACLK_VCODEC, >> "pclk_acodec", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 14, GFLAGS), >> + GATE(PCLK_HDMI, "pclk_hdmi", "pclk_cpu", 0, RK2928_CLKGATE_CON(3), 8, >> GFLAGS), + >> + /* aclk_vio gates */ >> + GATE(ACLK_VIO, "aclk_vio", "aclk_disp1_pre", 0, >> + RK2928_CLKGATE_CON(6), 13, GFLAGS), >> + GATE(ACLK_LCDC, "aclk_lcdc", "aclk_disp1_pre", 0, >> + RK2928_CLKGATE_CON(9), 6, GFLAGS), >> + >> + GATE(HCLK_VIO_BUS, "hclk_vio_bus", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(6), 12, GFLAGS), >> + GATE(HCLK_LCDC, "hclk_lcdc", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(9), 5, GFLAGS), >> + >> + /* aclk_video gates */ >> + GATE(HCLK_LCDC, "hclk_vcodec", "hclk_disp_pre", 0, >> + RK2928_CLKGATE_CON(3), 12, GFLAGS), > in big gate-block from diagram 3, please stick to the one-line format, like > the rest of the gates here (diagram3 only) Done. >> + >> + /* xin24m gates */ >> + GATE(SCLK_PVTM_CORE, "sclk_pvtm_core", "xin24m", 0, >> RK2928_CLKGATE_CON(10), 0, GFLAGS), + GATE(SCLK_PVTM_GPU, "sclk_pvtm_gpu", >> "xin24m", 0, RK2928_CLKGATE_CON(10), 1, GFLAGS), + >> + /* aclk_peri gates */ >> + GATE(0, "aclk_peri_axi_matrix", "aclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 3, GFLAGS), + GATE(0, "aclk_cpu_peri", "aclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 2, GFLAGS), + GATE(ACLK_DMAC2, >> "aclk_dmac2", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 1, GFLAGS), + GATE(0, >> "aclk_peri_niu", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 15, >> GFLAGS), + >> + /* hclk_peri gates */ >> + GATE(0, "hclk_peri_matrix", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 0, GFLAGS), + GATE(0, "hclk_usb_peri", "hclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 13, GFLAGS), + GATE(0, >> "hclk_peri_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), >> 14, GFLAGS), + GATE(HCLK_NANDC, "hclk_nandc", "hclk_peri", 0, >> RK2928_CLKGATE_CON(5), 9, GFLAGS), + GATE(HCLK_SDMMC, "hclk_sdmmc", >> "hclk_peri", 0, RK2928_CLKGATE_CON(5), 10, GFLAGS), + GATE(HCLK_SDIO, >> "hclk_sdio", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 11, GFLAGS), >> + GATE(HCLK_EMMC, "hclk_emmc", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, >> GFLAGS), + GATE(HCLK_OTG0, "hclk_otg0", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(5), 13, GFLAGS), + GATE(HCLK_OTG1, "hclk_otg1", >> "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(7), 13, GFLAGS), >> + GATE(HCLK_I2S, "hclk_i2s", "hclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(7), 2, GFLAGS), + GATE(0, "hclk_sfc", "hclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 14, GFLAGS), + GATE(0, >> "hclk_mac", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 15, >> GFLAGS), + >> + /* pclk_peri gates */ >> + GATE(0, "pclk_peri_matrix", "pclk_peri", CLK_IGNORE_UNUSED, >> RK2928_CLKGATE_CON(4), 1, GFLAGS), + GATE(0, "pclk_efuse", "pclk_peri", >> CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 2, GFLAGS), + GATE(PCLK_TIMER, >> "pclk_timer0", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 7, GFLAGS), >> + GATE(PCLK_PWM, "pclk_pwm", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 10, >> GFLAGS), + GATE(PCLK_SPI, "pclk_spi", "pclk_peri", 0, >> RK2928_CLKGATE_CON(7), 12, GFLAGS), + GATE(PCLK_WDT, "pclk_wdt", >> "pclk_peri", 0, RK2928_CLKGATE_CON(7), 15, GFLAGS), + GATE(PCLK_UART0, >> "pclk_uart0", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 0, GFLAGS), >> + GATE(PCLK_UART1, "pclk_uart1", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 1, >> GFLAGS), + GATE(PCLK_UART2, "pclk_uart2", "pclk_peri", 0, >> RK2928_CLKGATE_CON(8), 2, GFLAGS), + GATE(PCLK_I2C0, "pclk_i2c0", >> "pclk_peri", 0, RK2928_CLKGATE_CON(8), 4, GFLAGS), + GATE(PCLK_I2C1, >> "pclk_i2c1", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 5, GFLAGS), >> + GATE(PCLK_I2C2, "pclk_i2c2", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 6, >> GFLAGS), + GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_peri", 0, >> RK2928_CLKGATE_CON(8), 9, GFLAGS), + GATE(PCLK_GPIO1, "pclk_gpio1", >> "pclk_peri", 0, RK2928_CLKGATE_CON(8), 10, GFLAGS), + GATE(PCLK_GPIO2, >> "pclk_gpio2", "pclk_peri", 0, RK2928_CLKGATE_CON(8), 11, GFLAGS), +}; >> + >> +static const char *const rk3036_critical_clocks[] __initconst = { >> + "aclk_cpu", >> + "aclk_peri", >> + "hclk_peri", >> + "pclk_peri", >> +}; >> + >> +static void __init rk3036_clk_init(struct device_node *np) >> +{ >> + void __iomem *reg_base; >> + struct clk *clk; >> + >> + reg_base = of_iomap(np, 0); >> + if (!reg_base) { >> + pr_err("%s: could not map cru region\n", __func__); >> + return; >> + } >> + >> + rockchip_clk_init(np, reg_base, CLK_NR_CLKS); >> + >> + /* xin12m is created by an cru-internal divider */ >> + clk = clk_register_fixed_factor(NULL, "xin12m", "xin24m", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock xin12m: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "usb480m", "xin24m", 0, 20, 1); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock usb480m: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "ddrphy", "ddrphy2x", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock ddrphy: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "hclk_vcodec_pre", >> + "aclk_vcodec", 0, 1, 4); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock hclk_vcodec_pre: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + clk = clk_register_fixed_factor(NULL, "sclk_macref_out", >> + "hclk_peri_src", 0, 1, 2); >> + if (IS_ERR(clk)) >> + pr_warn("%s: could not register clock sclk_macref_out: %ld\n", >> + __func__, PTR_ERR(clk)); >> + >> + rockchip_clk_register_plls(rk3036_pll_clks, >> + ARRAY_SIZE(rk3036_pll_clks), >> + -1); >> + rockchip_clk_register_branches(rk3036_clk_branches, >> + ARRAY_SIZE(rk3036_clk_branches)); >> + rockchip_clk_protect_critical(rk3036_critical_clocks, >> + ARRAY_SIZE(rk3036_critical_clocks)); >> + >> + rockchip_clk_register_armclk(ARMCLK, "armclk", >> + mux_armclk_p, ARRAY_SIZE(mux_armclk_p), >> + &rk3036_cpuclk_data, rk3036_cpuclk_rates, >> + ARRAY_SIZE(rk3036_cpuclk_rates)); >> + >> + rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), >> + ROCKCHIP_SOFTRST_HIWORD_MASK); >> + >> + rockchip_register_restart_notifier(RK2928_GLB_SRST_FST); >> +} >> +CLK_OF_DECLARE(rk3036_cru, "rockchip,rk3036-cru", rk3036_clk_init); >> diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h >> index dc8ecb2..6603c07 100644 >> --- a/drivers/clk/rockchip/clk.h >> +++ b/drivers/clk/rockchip/clk.h >> @@ -2,6 +2,9 @@ >> * Copyright (c) 2014 MundoReader S.L. >> * Author: Heiko Stuebner >> * >> + * Copyright (c) 2015 Rockchip Electronics Co. Ltd. >> + * Author: Xing Zheng >> + * >> * based on >> * >> * samsung/clk.h >> @@ -40,6 +43,13 @@ struct clk; >> #define RK2928_SOFTRST_CON(x) ((x) * 0x4 + 0x110) >> #define RK2928_MISC_CON 0x134 >> >> +#define RK3036_SDMMC_CON0 0x144 >> +#define RK3036_SDMMC_CON1 0x148 >> +#define RK3036_SDIO_CON0 0x14c >> +#define RK3036_SDIO_CON1 0x150 >> +#define RK3036_EMMC_CON0 0x154 >> +#define RK3036_EMMC_CON1 0x158 >> + >> #define RK3288_PLL_CON(x) RK2928_PLL_CON(x) >> #define RK3288_MODE_CON 0x50 >> #define RK3288_CLKSEL_CON(x) ((x) * 0x4 + 0x60) >> @@ -75,6 +85,7 @@ struct clk; >> >> enum rockchip_pll_type { >> pll_rk3066, >> + pll_rk3036, > this should be part of the addition of the pll type (your patch4, and should > be reordered accordingly) > > Also please all 3036 before the 3066 entry OK, done. >> }; >> >> #define RK3066_PLL_RATE(_rate, _nr, _nf, _no) \ >> @@ -95,12 +106,31 @@ enum rockchip_pll_type { >> .nb = _nb, \ >> } >> >> +#define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, \ >> + _postdiv2, _dsmpd, _frac) \ >> +{ \ >> + .rate = _rate##U, \ >> + .fbdiv = _fbdiv, \ >> + .postdiv1 = _postdiv1, \ >> + .refdiv = _refdiv, \ >> + .postdiv2 = _postdiv2, \ >> + .dsmpd = _dsmpd, \ >> + .frac = _frac, \ >> +} >> + >> struct rockchip_pll_rate_table { >> unsigned long rate; >> unsigned int nr; >> unsigned int nf; >> unsigned int no; >> unsigned int nb; >> + /* for RK3036 */ >> + unsigned int fbdiv; >> + unsigned int postdiv1; >> + unsigned int refdiv; >> + unsigned int postdiv2; >> + unsigned int dsmpd; >> + unsigned int frac; > same for these 2 ... should be part of the pll addition itself Done. > >> }; >> >> /** Thanks.