Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'v4.7-rockchip-clk1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-next

Pull rockchip clk updates from Heiko Stuebner:

This is first big chunk of Rockchip clock-related changes for 4.7.

Main change is probably the added support for the new rk3399 soc
and necessary infrastructure changes surrounding it.

The biggest chunk is probably that clock code is now able to
handle multiple clock providers in one system, as the rk3399
has two of those. A general one and another smaller one in a
separate power domain. The rk3399 also uses another new pll type.
Thankfully it just fits nicely into our current structure.
It also needs some parts like the cpuclk mux parameters to be
a bit more flexible and an new fractional divider subtype without
gate.

Apart from this big change we have some more fixes and removal
of forgotten variables.

* tag 'v4.7-rockchip-clk1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip:
clk: rockchip: add clock controller for the RK3399
dt-bindings: add bindings for rk3399 clock controller
clk: rockchip: add dt-binding header for rk3399
clk: rockchip: release io resource when failing to init clk
clk: rockchip: remove redundant checking of device_node
clk: rockchip: fix warning reported by kernel-doc
clk: rockchip: remove mux_core_reg from rockchip_cpuclk_reg_data
clk: rockchip: add new pll-type for rk3399 and similar socs
clk: rockchip: Add support for multiple clock providers
clk: rockchip: allow varying mux parameters for cpuclk pll-sources
clk: rockchip: add a COMPOSITE_FRACMUX_NOGATE type

+2945 -136
+62
Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.txt
··· 1 + * Rockchip RK3399 Clock and Reset Unit 2 + 3 + The RK3399 clock controller generates and supplies clock to various 4 + controllers within the SoC and also implements a reset controller for SoC 5 + peripherals. 6 + 7 + Required Properties: 8 + 9 + - compatible: PMU for CRU should be "rockchip,rk3399-pmucru" 10 + - compatible: CRU should be "rockchip,rk3399-cru" 11 + - reg: physical base address of the controller and length of memory mapped 12 + region. 13 + - #clock-cells: should be 1. 14 + - #reset-cells: should be 1. 15 + 16 + Each clock is assigned an identifier and client nodes can use this identifier 17 + to specify the clock which they consume. All available clocks are defined as 18 + preprocessor macros in the dt-bindings/clock/rk3399-cru.h headers and can be 19 + used in device tree sources. Similar macros exist for the reset sources in 20 + these files. 21 + 22 + External clocks: 23 + 24 + There are several clocks that are generated outside the SoC. It is expected 25 + that they are defined using standard clock bindings with following 26 + clock-output-names: 27 + - "xin24m" - crystal input - required, 28 + - "xin32k" - rtc clock - optional, 29 + - "clkin_gmac" - external GMAC clock - optional, 30 + - "clkin_i2s" - external I2S clock - optional, 31 + - "pclkin_cif" - external ISP clock - optional, 32 + - "clk_usbphy0_480m" - output clock of the pll in the usbphy0 33 + - "clk_usbphy1_480m" - output clock of the pll in the usbphy1 34 + 35 + Example: Clock controller node: 36 + 37 + pmucru: pmu-clock-controller@ff750000 { 38 + compatible = "rockchip,rk3399-pmucru"; 39 + reg = <0x0 0xff750000 0x0 0x1000>; 40 + #clock-cells = <1>; 41 + #reset-cells = <1>; 42 + }; 43 + 44 + cru: clock-controller@ff760000 { 45 + compatible = "rockchip,rk3399-cru"; 46 + reg = <0x0 0xff760000 0x0 0x1000>; 47 + #clock-cells = <1>; 48 + #reset-cells = <1>; 49 + }; 50 + 51 + Example: UART controller node that consumes the clock generated by the clock 52 + controller: 53 + 54 + uart0: serial@ff1a0000 { 55 + compatible = "rockchip,rk3399-uart", "snps,dw-apb-uart"; 56 + reg = <0x0 0xff180000 0x0 0x100>; 57 + clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>; 58 + clock-names = "baudclk", "apb_pclk"; 59 + interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; 60 + reg-shift = <2>; 61 + reg-io-width = <4>; 62 + };
+1
drivers/clk/rockchip/Makefile
··· 15 15 obj-y += clk-rk3228.o 16 16 obj-y += clk-rk3288.o 17 17 obj-y += clk-rk3368.o 18 + obj-y += clk-rk3399.o
+18 -11
drivers/clk/rockchip/clk-cpu.c
··· 158 158 159 159 writel(HIWORD_UPDATE(alt_div, reg_data->div_core_mask, 160 160 reg_data->div_core_shift) | 161 - HIWORD_UPDATE(1, 1, reg_data->mux_core_shift), 161 + HIWORD_UPDATE(reg_data->mux_core_alt, 162 + reg_data->mux_core_mask, 163 + reg_data->mux_core_shift), 162 164 cpuclk->reg_base + reg_data->core_reg); 163 165 } else { 164 166 /* select alternate parent */ 165 - writel(HIWORD_UPDATE(1, 1, reg_data->mux_core_shift), 166 - cpuclk->reg_base + reg_data->core_reg); 167 + writel(HIWORD_UPDATE(reg_data->mux_core_alt, 168 + reg_data->mux_core_mask, 169 + reg_data->mux_core_shift), 170 + cpuclk->reg_base + reg_data->core_reg); 167 171 } 168 172 169 173 spin_unlock_irqrestore(cpuclk->lock, flags); ··· 202 198 203 199 writel(HIWORD_UPDATE(0, reg_data->div_core_mask, 204 200 reg_data->div_core_shift) | 205 - HIWORD_UPDATE(0, 1, reg_data->mux_core_shift), 201 + HIWORD_UPDATE(reg_data->mux_core_main, 202 + reg_data->mux_core_mask, 203 + reg_data->mux_core_shift), 206 204 cpuclk->reg_base + reg_data->core_reg); 207 205 208 206 if (ndata->old_rate > ndata->new_rate) ··· 258 252 return ERR_PTR(-ENOMEM); 259 253 260 254 init.name = name; 261 - init.parent_names = &parent_names[0]; 255 + init.parent_names = &parent_names[reg_data->mux_core_main]; 262 256 init.num_parents = 1; 263 257 init.ops = &rockchip_cpuclk_ops; 264 258 ··· 276 270 cpuclk->clk_nb.notifier_call = rockchip_cpuclk_notifier_cb; 277 271 cpuclk->hw.init = &init; 278 272 279 - cpuclk->alt_parent = __clk_lookup(parent_names[1]); 273 + cpuclk->alt_parent = __clk_lookup(parent_names[reg_data->mux_core_alt]); 280 274 if (!cpuclk->alt_parent) { 281 - pr_err("%s: could not lookup alternate parent\n", 282 - __func__); 275 + pr_err("%s: could not lookup alternate parent: (%d)\n", 276 + __func__, reg_data->mux_core_alt); 283 277 ret = -EINVAL; 284 278 goto free_cpuclk; 285 279 } ··· 291 285 goto free_cpuclk; 292 286 } 293 287 294 - clk = __clk_lookup(parent_names[0]); 288 + clk = __clk_lookup(parent_names[reg_data->mux_core_main]); 295 289 if (!clk) { 296 - pr_err("%s: could not lookup parent clock %s\n", 297 - __func__, parent_names[0]); 290 + pr_err("%s: could not lookup parent clock: (%d) %s\n", 291 + __func__, reg_data->mux_core_main, 292 + parent_names[reg_data->mux_core_main]); 298 293 ret = -EINVAL; 299 294 goto free_alt_parent; 300 295 }
+287 -14
drivers/clk/rockchip/clk-pll.c
··· 46 46 const struct rockchip_pll_rate_table *rate_table; 47 47 unsigned int rate_count; 48 48 spinlock_t *lock; 49 + 50 + struct rockchip_clk_provider *ctx; 49 51 }; 50 52 51 53 #define to_rockchip_clk_pll(_hw) container_of(_hw, struct rockchip_clk_pll, hw) ··· 92 90 */ 93 91 static int rockchip_pll_wait_lock(struct rockchip_clk_pll *pll) 94 92 { 95 - struct regmap *grf = rockchip_clk_get_grf(); 93 + struct regmap *grf = rockchip_clk_get_grf(pll->ctx); 96 94 unsigned int val; 97 95 int delay = 24000000, ret; 98 96 ··· 253 251 struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 254 252 const struct rockchip_pll_rate_table *rate; 255 253 unsigned long old_rate = rockchip_rk3036_pll_recalc_rate(hw, prate); 256 - struct regmap *grf = rockchip_clk_get_grf(); 254 + struct regmap *grf = rockchip_clk_get_grf(pll->ctx); 257 255 258 256 if (IS_ERR(grf)) { 259 257 pr_debug("%s: grf regmap not available, aborting rate change\n", ··· 492 490 struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 493 491 const struct rockchip_pll_rate_table *rate; 494 492 unsigned long old_rate = rockchip_rk3066_pll_recalc_rate(hw, prate); 495 - struct regmap *grf = rockchip_clk_get_grf(); 493 + struct regmap *grf = rockchip_clk_get_grf(pll->ctx); 496 494 497 495 if (IS_ERR(grf)) { 498 496 pr_debug("%s: grf regmap not available, aborting rate change\n", ··· 565 563 rate->no, cur.no, rate->nf, cur.nf, rate->nb, cur.nb); 566 564 if (rate->nr != cur.nr || rate->no != cur.no || rate->nf != cur.nf 567 565 || rate->nb != cur.nb) { 568 - struct regmap *grf = rockchip_clk_get_grf(); 566 + struct regmap *grf = rockchip_clk_get_grf(pll->ctx); 569 567 570 568 if (IS_ERR(grf)) 571 569 return; ··· 593 591 .init = rockchip_rk3066_pll_init, 594 592 }; 595 593 594 + /** 595 + * PLL used in RK3399 596 + */ 597 + 598 + #define RK3399_PLLCON(i) (i * 0x4) 599 + #define RK3399_PLLCON0_FBDIV_MASK 0xfff 600 + #define RK3399_PLLCON0_FBDIV_SHIFT 0 601 + #define RK3399_PLLCON1_REFDIV_MASK 0x3f 602 + #define RK3399_PLLCON1_REFDIV_SHIFT 0 603 + #define RK3399_PLLCON1_POSTDIV1_MASK 0x7 604 + #define RK3399_PLLCON1_POSTDIV1_SHIFT 8 605 + #define RK3399_PLLCON1_POSTDIV2_MASK 0x7 606 + #define RK3399_PLLCON1_POSTDIV2_SHIFT 12 607 + #define RK3399_PLLCON2_FRAC_MASK 0xffffff 608 + #define RK3399_PLLCON2_FRAC_SHIFT 0 609 + #define RK3399_PLLCON2_LOCK_STATUS BIT(31) 610 + #define RK3399_PLLCON3_PWRDOWN BIT(0) 611 + #define RK3399_PLLCON3_DSMPD_MASK 0x1 612 + #define RK3399_PLLCON3_DSMPD_SHIFT 3 613 + 614 + static int rockchip_rk3399_pll_wait_lock(struct rockchip_clk_pll *pll) 615 + { 616 + u32 pllcon; 617 + int delay = 24000000; 618 + 619 + /* poll check the lock status in rk3399 xPLLCON2 */ 620 + while (delay > 0) { 621 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(2)); 622 + if (pllcon & RK3399_PLLCON2_LOCK_STATUS) 623 + return 0; 624 + 625 + delay--; 626 + } 627 + 628 + pr_err("%s: timeout waiting for pll to lock\n", __func__); 629 + return -ETIMEDOUT; 630 + } 631 + 632 + static void rockchip_rk3399_pll_get_params(struct rockchip_clk_pll *pll, 633 + struct rockchip_pll_rate_table *rate) 634 + { 635 + u32 pllcon; 636 + 637 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(0)); 638 + rate->fbdiv = ((pllcon >> RK3399_PLLCON0_FBDIV_SHIFT) 639 + & RK3399_PLLCON0_FBDIV_MASK); 640 + 641 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(1)); 642 + rate->refdiv = ((pllcon >> RK3399_PLLCON1_REFDIV_SHIFT) 643 + & RK3399_PLLCON1_REFDIV_MASK); 644 + rate->postdiv1 = ((pllcon >> RK3399_PLLCON1_POSTDIV1_SHIFT) 645 + & RK3399_PLLCON1_POSTDIV1_MASK); 646 + rate->postdiv2 = ((pllcon >> RK3399_PLLCON1_POSTDIV2_SHIFT) 647 + & RK3399_PLLCON1_POSTDIV2_MASK); 648 + 649 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(2)); 650 + rate->frac = ((pllcon >> RK3399_PLLCON2_FRAC_SHIFT) 651 + & RK3399_PLLCON2_FRAC_MASK); 652 + 653 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(3)); 654 + rate->dsmpd = ((pllcon >> RK3399_PLLCON3_DSMPD_SHIFT) 655 + & RK3399_PLLCON3_DSMPD_MASK); 656 + } 657 + 658 + static unsigned long rockchip_rk3399_pll_recalc_rate(struct clk_hw *hw, 659 + unsigned long prate) 660 + { 661 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 662 + struct rockchip_pll_rate_table cur; 663 + u64 rate64 = prate; 664 + 665 + rockchip_rk3399_pll_get_params(pll, &cur); 666 + 667 + rate64 *= cur.fbdiv; 668 + do_div(rate64, cur.refdiv); 669 + 670 + if (cur.dsmpd == 0) { 671 + /* fractional mode */ 672 + u64 frac_rate64 = prate * cur.frac; 673 + 674 + do_div(frac_rate64, cur.refdiv); 675 + rate64 += frac_rate64 >> 24; 676 + } 677 + 678 + do_div(rate64, cur.postdiv1); 679 + do_div(rate64, cur.postdiv2); 680 + 681 + return (unsigned long)rate64; 682 + } 683 + 684 + static int rockchip_rk3399_pll_set_params(struct rockchip_clk_pll *pll, 685 + const struct rockchip_pll_rate_table *rate) 686 + { 687 + const struct clk_ops *pll_mux_ops = pll->pll_mux_ops; 688 + struct clk_mux *pll_mux = &pll->pll_mux; 689 + struct rockchip_pll_rate_table cur; 690 + u32 pllcon; 691 + int rate_change_remuxed = 0; 692 + int cur_parent; 693 + int ret; 694 + 695 + pr_debug("%s: rate settings for %lu fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n", 696 + __func__, rate->rate, rate->fbdiv, rate->postdiv1, rate->refdiv, 697 + rate->postdiv2, rate->dsmpd, rate->frac); 698 + 699 + rockchip_rk3399_pll_get_params(pll, &cur); 700 + cur.rate = 0; 701 + 702 + cur_parent = pll_mux_ops->get_parent(&pll_mux->hw); 703 + if (cur_parent == PLL_MODE_NORM) { 704 + pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_SLOW); 705 + rate_change_remuxed = 1; 706 + } 707 + 708 + /* update pll values */ 709 + writel_relaxed(HIWORD_UPDATE(rate->fbdiv, RK3399_PLLCON0_FBDIV_MASK, 710 + RK3399_PLLCON0_FBDIV_SHIFT), 711 + pll->reg_base + RK3399_PLLCON(0)); 712 + 713 + writel_relaxed(HIWORD_UPDATE(rate->refdiv, RK3399_PLLCON1_REFDIV_MASK, 714 + RK3399_PLLCON1_REFDIV_SHIFT) | 715 + HIWORD_UPDATE(rate->postdiv1, RK3399_PLLCON1_POSTDIV1_MASK, 716 + RK3399_PLLCON1_POSTDIV1_SHIFT) | 717 + HIWORD_UPDATE(rate->postdiv2, RK3399_PLLCON1_POSTDIV2_MASK, 718 + RK3399_PLLCON1_POSTDIV2_SHIFT), 719 + pll->reg_base + RK3399_PLLCON(1)); 720 + 721 + /* xPLL CON2 is not HIWORD_MASK */ 722 + pllcon = readl_relaxed(pll->reg_base + RK3399_PLLCON(2)); 723 + pllcon &= ~(RK3399_PLLCON2_FRAC_MASK << RK3399_PLLCON2_FRAC_SHIFT); 724 + pllcon |= rate->frac << RK3399_PLLCON2_FRAC_SHIFT; 725 + writel_relaxed(pllcon, pll->reg_base + RK3399_PLLCON(2)); 726 + 727 + writel_relaxed(HIWORD_UPDATE(rate->dsmpd, RK3399_PLLCON3_DSMPD_MASK, 728 + RK3399_PLLCON3_DSMPD_SHIFT), 729 + pll->reg_base + RK3399_PLLCON(3)); 730 + 731 + /* wait for the pll to lock */ 732 + ret = rockchip_rk3399_pll_wait_lock(pll); 733 + if (ret) { 734 + pr_warn("%s: pll update unsuccessful, trying to restore old params\n", 735 + __func__); 736 + rockchip_rk3399_pll_set_params(pll, &cur); 737 + } 738 + 739 + if (rate_change_remuxed) 740 + pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_NORM); 741 + 742 + return ret; 743 + } 744 + 745 + static int rockchip_rk3399_pll_set_rate(struct clk_hw *hw, unsigned long drate, 746 + unsigned long prate) 747 + { 748 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 749 + const struct rockchip_pll_rate_table *rate; 750 + unsigned long old_rate = rockchip_rk3399_pll_recalc_rate(hw, prate); 751 + 752 + pr_debug("%s: changing %s from %lu to %lu with a parent rate of %lu\n", 753 + __func__, __clk_get_name(hw->clk), old_rate, drate, prate); 754 + 755 + /* Get required rate settings from table */ 756 + rate = rockchip_get_pll_settings(pll, drate); 757 + if (!rate) { 758 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 759 + drate, __clk_get_name(hw->clk)); 760 + return -EINVAL; 761 + } 762 + 763 + return rockchip_rk3399_pll_set_params(pll, rate); 764 + } 765 + 766 + static int rockchip_rk3399_pll_enable(struct clk_hw *hw) 767 + { 768 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 769 + 770 + writel(HIWORD_UPDATE(0, RK3399_PLLCON3_PWRDOWN, 0), 771 + pll->reg_base + RK3399_PLLCON(3)); 772 + 773 + return 0; 774 + } 775 + 776 + static void rockchip_rk3399_pll_disable(struct clk_hw *hw) 777 + { 778 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 779 + 780 + writel(HIWORD_UPDATE(RK3399_PLLCON3_PWRDOWN, 781 + RK3399_PLLCON3_PWRDOWN, 0), 782 + pll->reg_base + RK3399_PLLCON(3)); 783 + } 784 + 785 + static int rockchip_rk3399_pll_is_enabled(struct clk_hw *hw) 786 + { 787 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 788 + u32 pllcon = readl(pll->reg_base + RK3399_PLLCON(3)); 789 + 790 + return !(pllcon & RK3399_PLLCON3_PWRDOWN); 791 + } 792 + 793 + static void rockchip_rk3399_pll_init(struct clk_hw *hw) 794 + { 795 + struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); 796 + const struct rockchip_pll_rate_table *rate; 797 + struct rockchip_pll_rate_table cur; 798 + unsigned long drate; 799 + 800 + if (!(pll->flags & ROCKCHIP_PLL_SYNC_RATE)) 801 + return; 802 + 803 + drate = clk_hw_get_rate(hw); 804 + rate = rockchip_get_pll_settings(pll, drate); 805 + 806 + /* when no rate setting for the current rate, rely on clk_set_rate */ 807 + if (!rate) 808 + return; 809 + 810 + rockchip_rk3399_pll_get_params(pll, &cur); 811 + 812 + pr_debug("%s: pll %s@%lu: Hz\n", __func__, __clk_get_name(hw->clk), 813 + drate); 814 + pr_debug("old - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n", 815 + cur.fbdiv, cur.postdiv1, cur.refdiv, cur.postdiv2, 816 + cur.dsmpd, cur.frac); 817 + pr_debug("new - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n", 818 + rate->fbdiv, rate->postdiv1, rate->refdiv, rate->postdiv2, 819 + rate->dsmpd, rate->frac); 820 + 821 + if (rate->fbdiv != cur.fbdiv || rate->postdiv1 != cur.postdiv1 || 822 + rate->refdiv != cur.refdiv || rate->postdiv2 != cur.postdiv2 || 823 + rate->dsmpd != cur.dsmpd || rate->frac != cur.frac) { 824 + struct clk *parent = clk_get_parent(hw->clk); 825 + 826 + if (!parent) { 827 + pr_warn("%s: parent of %s not available\n", 828 + __func__, __clk_get_name(hw->clk)); 829 + return; 830 + } 831 + 832 + pr_debug("%s: pll %s: rate params do not match rate table, adjusting\n", 833 + __func__, __clk_get_name(hw->clk)); 834 + rockchip_rk3399_pll_set_params(pll, rate); 835 + } 836 + } 837 + 838 + static const struct clk_ops rockchip_rk3399_pll_clk_norate_ops = { 839 + .recalc_rate = rockchip_rk3399_pll_recalc_rate, 840 + .enable = rockchip_rk3399_pll_enable, 841 + .disable = rockchip_rk3399_pll_disable, 842 + .is_enabled = rockchip_rk3399_pll_is_enabled, 843 + }; 844 + 845 + static const struct clk_ops rockchip_rk3399_pll_clk_ops = { 846 + .recalc_rate = rockchip_rk3399_pll_recalc_rate, 847 + .round_rate = rockchip_pll_round_rate, 848 + .set_rate = rockchip_rk3399_pll_set_rate, 849 + .enable = rockchip_rk3399_pll_enable, 850 + .disable = rockchip_rk3399_pll_disable, 851 + .is_enabled = rockchip_rk3399_pll_is_enabled, 852 + .init = rockchip_rk3399_pll_init, 853 + }; 854 + 596 855 /* 597 856 * Common registering of pll clocks 598 857 */ 599 858 600 - struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, 859 + struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx, 860 + enum rockchip_pll_type pll_type, 601 861 const char *name, const char *const *parent_names, 602 - u8 num_parents, void __iomem *base, int con_offset, 603 - int grf_lock_offset, int lock_shift, int mode_offset, 604 - int mode_shift, struct rockchip_pll_rate_table *rate_table, 605 - u8 clk_pll_flags, spinlock_t *lock) 862 + u8 num_parents, int con_offset, int grf_lock_offset, 863 + int lock_shift, int mode_offset, int mode_shift, 864 + struct rockchip_pll_rate_table *rate_table, 865 + u8 clk_pll_flags) 606 866 { 607 867 const char *pll_parents[3]; 608 868 struct clk_init_data init; ··· 888 624 /* create the mux on top of the real pll */ 889 625 pll->pll_mux_ops = &clk_mux_ops; 890 626 pll_mux = &pll->pll_mux; 891 - pll_mux->reg = base + mode_offset; 627 + pll_mux->reg = ctx->reg_base + mode_offset; 892 628 pll_mux->shift = mode_shift; 893 629 pll_mux->mask = PLL_MODE_MASK; 894 630 pll_mux->flags = 0; 895 - pll_mux->lock = lock; 631 + pll_mux->lock = &ctx->lock; 896 632 pll_mux->hw.init = &init; 897 633 898 - if (pll_type == pll_rk3036 || pll_type == pll_rk3066) 634 + if (pll_type == pll_rk3036 || 635 + pll_type == pll_rk3066 || 636 + pll_type == pll_rk3399) 899 637 pll_mux->flags |= CLK_MUX_HIWORD_MASK; 900 638 901 639 /* the actual muxing is xin24m, pll-output, xin32k */ ··· 954 688 else 955 689 init.ops = &rockchip_rk3066_pll_clk_ops; 956 690 break; 691 + case pll_rk3399: 692 + if (!pll->rate_table) 693 + init.ops = &rockchip_rk3399_pll_clk_norate_ops; 694 + else 695 + init.ops = &rockchip_rk3399_pll_clk_ops; 696 + break; 957 697 default: 958 698 pr_warn("%s: Unknown pll type for pll clk %s\n", 959 699 __func__, name); ··· 967 695 968 696 pll->hw.init = &init; 969 697 pll->type = pll_type; 970 - pll->reg_base = base + con_offset; 698 + pll->reg_base = ctx->reg_base + con_offset; 971 699 pll->lock_offset = grf_lock_offset; 972 700 pll->lock_shift = lock_shift; 973 701 pll->flags = clk_pll_flags; 974 - pll->lock = lock; 702 + pll->lock = &ctx->lock; 703 + pll->ctx = ctx; 975 704 976 705 pll_clk = clk_register(NULL, &pll->hw); 977 706 if (IS_ERR(pll_clk)) {
+16 -5
drivers/clk/rockchip/clk-rk3036.c
··· 113 113 .core_reg = RK2928_CLKSEL_CON(0), 114 114 .div_core_shift = 0, 115 115 .div_core_mask = 0x1f, 116 + .mux_core_alt = 1, 117 + .mux_core_main = 0, 116 118 .mux_core_shift = 7, 119 + .mux_core_mask = 0x1, 117 120 }; 118 121 119 122 PNAME(mux_pll_p) = { "xin24m", "xin24m" }; ··· 440 437 441 438 static void __init rk3036_clk_init(struct device_node *np) 442 439 { 440 + struct rockchip_clk_provider *ctx; 443 441 void __iomem *reg_base; 444 442 struct clk *clk; 445 443 ··· 450 446 return; 451 447 } 452 448 453 - rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 449 + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 450 + if (IS_ERR(ctx)) { 451 + pr_err("%s: rockchip clk init failed\n", __func__); 452 + iounmap(reg_base); 453 + return; 454 + } 454 455 455 456 clk = clk_register_fixed_factor(NULL, "usb480m", "xin24m", 0, 20, 1); 456 457 if (IS_ERR(clk)) 457 458 pr_warn("%s: could not register clock usb480m: %ld\n", 458 459 __func__, PTR_ERR(clk)); 459 460 460 - rockchip_clk_register_plls(rk3036_pll_clks, 461 + rockchip_clk_register_plls(ctx, rk3036_pll_clks, 461 462 ARRAY_SIZE(rk3036_pll_clks), 462 463 RK3036_GRF_SOC_STATUS0); 463 - rockchip_clk_register_branches(rk3036_clk_branches, 464 + rockchip_clk_register_branches(ctx, rk3036_clk_branches, 464 465 ARRAY_SIZE(rk3036_clk_branches)); 465 466 rockchip_clk_protect_critical(rk3036_critical_clocks, 466 467 ARRAY_SIZE(rk3036_critical_clocks)); 467 468 468 - rockchip_clk_register_armclk(ARMCLK, "armclk", 469 + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", 469 470 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 470 471 &rk3036_cpuclk_data, rk3036_cpuclk_rates, 471 472 ARRAY_SIZE(rk3036_cpuclk_rates)); ··· 478 469 rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), 479 470 ROCKCHIP_SOFTRST_HIWORD_MASK); 480 471 481 - rockchip_register_restart_notifier(RK2928_GLB_SRST_FST, NULL); 472 + rockchip_register_restart_notifier(ctx, RK2928_GLB_SRST_FST, NULL); 473 + 474 + rockchip_clk_of_add_provider(np, ctx); 482 475 } 483 476 CLK_OF_DECLARE(rk3036_cru, "rockchip,rk3036-cru", rk3036_clk_init);
+38 -13
drivers/clk/rockchip/clk-rk3188.c
··· 155 155 .core_reg = RK2928_CLKSEL_CON(0), 156 156 .div_core_shift = 0, 157 157 .div_core_mask = 0x1f, 158 + .mux_core_alt = 1, 159 + .mux_core_main = 0, 158 160 .mux_core_shift = 8, 161 + .mux_core_mask = 0x1, 159 162 }; 160 163 161 164 #define RK3188_DIV_ACLK_CORE_MASK 0x7 ··· 194 191 .core_reg = RK2928_CLKSEL_CON(0), 195 192 .div_core_shift = 9, 196 193 .div_core_mask = 0x1f, 194 + .mux_core_alt = 1, 195 + .mux_core_main = 0, 197 196 .mux_core_shift = 8, 197 + .mux_core_mask = 0x1, 198 198 }; 199 199 200 200 PNAME(mux_pll_p) = { "xin24m", "xin32k" }; ··· 759 753 "hclk_cpubus" 760 754 }; 761 755 762 - static void __init rk3188_common_clk_init(struct device_node *np) 756 + static struct rockchip_clk_provider *__init rk3188_common_clk_init(struct device_node *np) 763 757 { 758 + struct rockchip_clk_provider *ctx; 764 759 void __iomem *reg_base; 765 760 766 761 reg_base = of_iomap(np, 0); 767 762 if (!reg_base) { 768 763 pr_err("%s: could not map cru region\n", __func__); 769 - return; 764 + return ERR_PTR(-ENOMEM); 770 765 } 771 766 772 - rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 767 + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 768 + if (IS_ERR(ctx)) { 769 + pr_err("%s: rockchip clk init failed\n", __func__); 770 + iounmap(reg_base); 771 + return ERR_PTR(-ENOMEM); 772 + } 773 773 774 - rockchip_clk_register_branches(common_clk_branches, 774 + rockchip_clk_register_branches(ctx, common_clk_branches, 775 775 ARRAY_SIZE(common_clk_branches)); 776 776 777 777 rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), 778 778 ROCKCHIP_SOFTRST_HIWORD_MASK); 779 779 780 - rockchip_register_restart_notifier(RK2928_GLB_SRST_FST, NULL); 780 + rockchip_register_restart_notifier(ctx, RK2928_GLB_SRST_FST, NULL); 781 + 782 + return ctx; 781 783 } 782 784 783 785 static void __init rk3066a_clk_init(struct device_node *np) 784 786 { 785 - rk3188_common_clk_init(np); 786 - rockchip_clk_register_plls(rk3066_pll_clks, 787 + struct rockchip_clk_provider *ctx; 788 + 789 + ctx = rk3188_common_clk_init(np); 790 + if (IS_ERR(ctx)) 791 + return; 792 + 793 + rockchip_clk_register_plls(ctx, rk3066_pll_clks, 787 794 ARRAY_SIZE(rk3066_pll_clks), 788 795 RK3066_GRF_SOC_STATUS); 789 - rockchip_clk_register_branches(rk3066a_clk_branches, 796 + rockchip_clk_register_branches(ctx, rk3066a_clk_branches, 790 797 ARRAY_SIZE(rk3066a_clk_branches)); 791 - rockchip_clk_register_armclk(ARMCLK, "armclk", 798 + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", 792 799 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 793 800 &rk3066_cpuclk_data, rk3066_cpuclk_rates, 794 801 ARRAY_SIZE(rk3066_cpuclk_rates)); 795 802 rockchip_clk_protect_critical(rk3188_critical_clocks, 796 803 ARRAY_SIZE(rk3188_critical_clocks)); 804 + rockchip_clk_of_add_provider(np, ctx); 797 805 } 798 806 CLK_OF_DECLARE(rk3066a_cru, "rockchip,rk3066a-cru", rk3066a_clk_init); 799 807 800 808 static void __init rk3188a_clk_init(struct device_node *np) 801 809 { 810 + struct rockchip_clk_provider *ctx; 802 811 struct clk *clk1, *clk2; 803 812 unsigned long rate; 804 813 int ret; 805 814 806 - rk3188_common_clk_init(np); 807 - rockchip_clk_register_plls(rk3188_pll_clks, 815 + ctx = rk3188_common_clk_init(np); 816 + if (IS_ERR(ctx)) 817 + return; 818 + 819 + rockchip_clk_register_plls(ctx, rk3188_pll_clks, 808 820 ARRAY_SIZE(rk3188_pll_clks), 809 821 RK3188_GRF_SOC_STATUS); 810 - rockchip_clk_register_branches(rk3188_clk_branches, 822 + rockchip_clk_register_branches(ctx, rk3188_clk_branches, 811 823 ARRAY_SIZE(rk3188_clk_branches)); 812 - rockchip_clk_register_armclk(ARMCLK, "armclk", 824 + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", 813 825 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 814 826 &rk3188_cpuclk_data, rk3188_cpuclk_rates, 815 827 ARRAY_SIZE(rk3188_cpuclk_rates)); ··· 851 827 852 828 rockchip_clk_protect_critical(rk3188_critical_clocks, 853 829 ARRAY_SIZE(rk3188_critical_clocks)); 830 + rockchip_clk_of_add_provider(np, ctx); 854 831 } 855 832 CLK_OF_DECLARE(rk3188a_cru, "rockchip,rk3188a-cru", rk3188a_clk_init); 856 833
+16 -5
drivers/clk/rockchip/clk-rk3228.c
··· 111 111 .core_reg = RK2928_CLKSEL_CON(0), 112 112 .div_core_shift = 0, 113 113 .div_core_mask = 0x1f, 114 + .mux_core_alt = 1, 115 + .mux_core_main = 0, 114 116 .mux_core_shift = 6, 117 + .mux_core_mask = 0x1, 115 118 }; 116 119 117 120 PNAME(mux_pll_p) = { "clk_24m", "xin24m" }; ··· 628 625 629 626 static void __init rk3228_clk_init(struct device_node *np) 630 627 { 628 + struct rockchip_clk_provider *ctx; 631 629 void __iomem *reg_base; 632 630 633 631 reg_base = of_iomap(np, 0); ··· 637 633 return; 638 634 } 639 635 640 - rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 636 + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 637 + if (IS_ERR(ctx)) { 638 + pr_err("%s: rockchip clk init failed\n", __func__); 639 + iounmap(reg_base); 640 + return; 641 + } 641 642 642 - rockchip_clk_register_plls(rk3228_pll_clks, 643 + rockchip_clk_register_plls(ctx, rk3228_pll_clks, 643 644 ARRAY_SIZE(rk3228_pll_clks), 644 645 RK3228_GRF_SOC_STATUS0); 645 - rockchip_clk_register_branches(rk3228_clk_branches, 646 + rockchip_clk_register_branches(ctx, rk3228_clk_branches, 646 647 ARRAY_SIZE(rk3228_clk_branches)); 647 648 rockchip_clk_protect_critical(rk3228_critical_clocks, 648 649 ARRAY_SIZE(rk3228_critical_clocks)); 649 650 650 - rockchip_clk_register_armclk(ARMCLK, "armclk", 651 + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", 651 652 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 652 653 &rk3228_cpuclk_data, rk3228_cpuclk_rates, 653 654 ARRAY_SIZE(rk3228_cpuclk_rates)); ··· 660 651 rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), 661 652 ROCKCHIP_SOFTRST_HIWORD_MASK); 662 653 663 - rockchip_register_restart_notifier(RK3228_GLB_SRST_FST, NULL); 654 + rockchip_register_restart_notifier(ctx, RK3228_GLB_SRST_FST, NULL); 655 + 656 + rockchip_clk_of_add_provider(np, ctx); 664 657 } 665 658 CLK_OF_DECLARE(rk3228_cru, "rockchip,rk3228-cru", rk3228_clk_init);
+17 -6
drivers/clk/rockchip/clk-rk3288.c
··· 165 165 .core_reg = RK3288_CLKSEL_CON(0), 166 166 .div_core_shift = 8, 167 167 .div_core_mask = 0x1f, 168 + .mux_core_alt = 1, 169 + .mux_core_main = 0, 168 170 .mux_core_shift = 15, 171 + .mux_core_mask = 0x1, 169 172 }; 170 173 171 174 PNAME(mux_pll_p) = { "xin24m", "xin32k" }; ··· 881 878 882 879 static void __init rk3288_clk_init(struct device_node *np) 883 880 { 881 + struct rockchip_clk_provider *ctx; 884 882 struct clk *clk; 885 883 886 884 rk3288_cru_base = of_iomap(np, 0); ··· 890 886 return; 891 887 } 892 888 893 - rockchip_clk_init(np, rk3288_cru_base, CLK_NR_CLKS); 889 + ctx = rockchip_clk_init(np, rk3288_cru_base, CLK_NR_CLKS); 890 + if (IS_ERR(ctx)) { 891 + pr_err("%s: rockchip clk init failed\n", __func__); 892 + iounmap(rk3288_cru_base); 893 + return; 894 + } 894 895 895 896 /* Watchdog pclk is controlled by RK3288_SGRF_SOC_CON0[1]. */ 896 897 clk = clk_register_fixed_factor(NULL, "pclk_wdt", "pclk_pd_alive", 0, 1, 1); ··· 903 894 pr_warn("%s: could not register clock pclk_wdt: %ld\n", 904 895 __func__, PTR_ERR(clk)); 905 896 else 906 - rockchip_clk_add_lookup(clk, PCLK_WDT); 897 + rockchip_clk_add_lookup(ctx, clk, PCLK_WDT); 907 898 908 - rockchip_clk_register_plls(rk3288_pll_clks, 899 + rockchip_clk_register_plls(ctx, rk3288_pll_clks, 909 900 ARRAY_SIZE(rk3288_pll_clks), 910 901 RK3288_GRF_SOC_STATUS1); 911 - rockchip_clk_register_branches(rk3288_clk_branches, 902 + rockchip_clk_register_branches(ctx, rk3288_clk_branches, 912 903 ARRAY_SIZE(rk3288_clk_branches)); 913 904 rockchip_clk_protect_critical(rk3288_critical_clocks, 914 905 ARRAY_SIZE(rk3288_critical_clocks)); 915 906 916 - rockchip_clk_register_armclk(ARMCLK, "armclk", 907 + rockchip_clk_register_armclk(ctx, ARMCLK, "armclk", 917 908 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 918 909 &rk3288_cpuclk_data, rk3288_cpuclk_rates, 919 910 ARRAY_SIZE(rk3288_cpuclk_rates)); ··· 922 913 rk3288_cru_base + RK3288_SOFTRST_CON(0), 923 914 ROCKCHIP_SOFTRST_HIWORD_MASK); 924 915 925 - rockchip_register_restart_notifier(RK3288_GLB_SRST_FST, 916 + rockchip_register_restart_notifier(ctx, RK3288_GLB_SRST_FST, 926 917 rk3288_clk_shutdown); 927 918 register_syscore_ops(&rk3288_clk_syscore_ops); 919 + 920 + rockchip_clk_of_add_provider(np, ctx); 928 921 } 929 922 CLK_OF_DECLARE(rk3288_cru, "rockchip,rk3288-cru", rk3288_clk_init);
+21 -7
drivers/clk/rockchip/clk-rk3368.c
··· 165 165 .core_reg = RK3368_CLKSEL_CON(0), 166 166 .div_core_shift = 0, 167 167 .div_core_mask = 0x1f, 168 + .mux_core_alt = 1, 169 + .mux_core_main = 0, 168 170 .mux_core_shift = 7, 171 + .mux_core_mask = 0x1, 169 172 }; 170 173 171 174 static const struct rockchip_cpuclk_reg_data rk3368_cpuclkl_data = { 172 175 .core_reg = RK3368_CLKSEL_CON(2), 173 176 .div_core_shift = 0, 177 + .mux_core_alt = 1, 178 + .mux_core_main = 0, 174 179 .div_core_mask = 0x1f, 175 180 .mux_core_shift = 7, 181 + .mux_core_mask = 0x1, 176 182 }; 177 183 178 184 #define RK3368_DIV_ACLKM_MASK 0x1f ··· 862 856 863 857 static void __init rk3368_clk_init(struct device_node *np) 864 858 { 859 + struct rockchip_clk_provider *ctx; 865 860 void __iomem *reg_base; 866 861 struct clk *clk; 867 862 ··· 872 865 return; 873 866 } 874 867 875 - rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 868 + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 869 + if (IS_ERR(ctx)) { 870 + pr_err("%s: rockchip clk init failed\n", __func__); 871 + iounmap(reg_base); 872 + return; 873 + } 876 874 877 875 /* Watchdog pclk is controlled by sgrf_soc_con3[7]. */ 878 876 clk = clk_register_fixed_factor(NULL, "pclk_wdt", "pclk_pd_alive", 0, 1, 1); ··· 885 873 pr_warn("%s: could not register clock pclk_wdt: %ld\n", 886 874 __func__, PTR_ERR(clk)); 887 875 else 888 - rockchip_clk_add_lookup(clk, PCLK_WDT); 876 + rockchip_clk_add_lookup(ctx, clk, PCLK_WDT); 889 877 890 - rockchip_clk_register_plls(rk3368_pll_clks, 878 + rockchip_clk_register_plls(ctx, rk3368_pll_clks, 891 879 ARRAY_SIZE(rk3368_pll_clks), 892 880 RK3368_GRF_SOC_STATUS0); 893 - rockchip_clk_register_branches(rk3368_clk_branches, 881 + rockchip_clk_register_branches(ctx, rk3368_clk_branches, 894 882 ARRAY_SIZE(rk3368_clk_branches)); 895 883 rockchip_clk_protect_critical(rk3368_critical_clocks, 896 884 ARRAY_SIZE(rk3368_critical_clocks)); 897 885 898 - rockchip_clk_register_armclk(ARMCLKB, "armclkb", 886 + rockchip_clk_register_armclk(ctx, ARMCLKB, "armclkb", 899 887 mux_armclkb_p, ARRAY_SIZE(mux_armclkb_p), 900 888 &rk3368_cpuclkb_data, rk3368_cpuclkb_rates, 901 889 ARRAY_SIZE(rk3368_cpuclkb_rates)); 902 890 903 - rockchip_clk_register_armclk(ARMCLKL, "armclkl", 891 + rockchip_clk_register_armclk(ctx, ARMCLKL, "armclkl", 904 892 mux_armclkl_p, ARRAY_SIZE(mux_armclkl_p), 905 893 &rk3368_cpuclkl_data, rk3368_cpuclkl_rates, 906 894 ARRAY_SIZE(rk3368_cpuclkl_rates)); ··· 908 896 rockchip_register_softrst(np, 15, reg_base + RK3368_SOFTRST_CON(0), 909 897 ROCKCHIP_SOFTRST_HIWORD_MASK); 910 898 911 - rockchip_register_restart_notifier(RK3368_GLB_SRST_FST, NULL); 899 + rockchip_register_restart_notifier(ctx, RK3368_GLB_SRST_FST, NULL); 900 + 901 + rockchip_clk_of_add_provider(np, ctx); 912 902 } 913 903 CLK_OF_DECLARE(rk3368_cru, "rockchip,rk3368-cru", rk3368_clk_init);
+1540
drivers/clk/rockchip/clk-rk3399.c
··· 1 + /* 2 + * Copyright (c) 2016 Rockchip Electronics Co. Ltd. 3 + * Author: Xing Zheng <zhengxing@rock-chips.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License as published by 7 + * the Free Software Foundation; either version 2 of the License, or 8 + * (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + */ 15 + 16 + #include <linux/clk-provider.h> 17 + #include <linux/of.h> 18 + #include <linux/of_address.h> 19 + #include <linux/platform_device.h> 20 + #include <linux/regmap.h> 21 + #include <dt-bindings/clock/rk3399-cru.h> 22 + #include "clk.h" 23 + 24 + enum rk3399_plls { 25 + lpll, bpll, dpll, cpll, gpll, npll, vpll, 26 + }; 27 + 28 + enum rk3399_pmu_plls { 29 + ppll, 30 + }; 31 + 32 + static struct rockchip_pll_rate_table rk3399_pll_rates[] = { 33 + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ 34 + RK3036_PLL_RATE(2208000000, 1, 92, 1, 1, 1, 0), 35 + RK3036_PLL_RATE(2184000000, 1, 91, 1, 1, 1, 0), 36 + RK3036_PLL_RATE(2160000000, 1, 90, 1, 1, 1, 0), 37 + RK3036_PLL_RATE(2136000000, 1, 89, 1, 1, 1, 0), 38 + RK3036_PLL_RATE(2112000000, 1, 88, 1, 1, 1, 0), 39 + RK3036_PLL_RATE(2088000000, 1, 87, 1, 1, 1, 0), 40 + RK3036_PLL_RATE(2064000000, 1, 86, 1, 1, 1, 0), 41 + RK3036_PLL_RATE(2040000000, 1, 85, 1, 1, 1, 0), 42 + RK3036_PLL_RATE(2016000000, 1, 84, 1, 1, 1, 0), 43 + RK3036_PLL_RATE(1992000000, 1, 83, 1, 1, 1, 0), 44 + RK3036_PLL_RATE(1968000000, 1, 82, 1, 1, 1, 0), 45 + RK3036_PLL_RATE(1944000000, 1, 81, 1, 1, 1, 0), 46 + RK3036_PLL_RATE(1920000000, 1, 80, 1, 1, 1, 0), 47 + RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0), 48 + RK3036_PLL_RATE(1872000000, 1, 78, 1, 1, 1, 0), 49 + RK3036_PLL_RATE(1848000000, 1, 77, 1, 1, 1, 0), 50 + RK3036_PLL_RATE(1824000000, 1, 76, 1, 1, 1, 0), 51 + RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0), 52 + RK3036_PLL_RATE(1776000000, 1, 74, 1, 1, 1, 0), 53 + RK3036_PLL_RATE(1752000000, 1, 73, 1, 1, 1, 0), 54 + RK3036_PLL_RATE(1728000000, 1, 72, 1, 1, 1, 0), 55 + RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0), 56 + RK3036_PLL_RATE(1680000000, 1, 70, 1, 1, 1, 0), 57 + RK3036_PLL_RATE(1656000000, 1, 69, 1, 1, 1, 0), 58 + RK3036_PLL_RATE(1632000000, 1, 68, 1, 1, 1, 0), 59 + RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), 60 + RK3036_PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0), 61 + RK3036_PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0), 62 + RK3036_PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0), 63 + RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0), 64 + RK3036_PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0), 65 + RK3036_PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0), 66 + RK3036_PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0), 67 + RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0), 68 + RK3036_PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0), 69 + RK3036_PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0), 70 + RK3036_PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0), 71 + RK3036_PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0), 72 + RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0), 73 + RK3036_PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0), 74 + RK3036_PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0), 75 + RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0), 76 + RK3036_PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0), 77 + RK3036_PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0), 78 + RK3036_PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0), 79 + RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0), 80 + RK3036_PLL_RATE(1000000000, 6, 500, 2, 1, 1, 0), 81 + RK3036_PLL_RATE( 984000000, 1, 82, 2, 1, 1, 0), 82 + RK3036_PLL_RATE( 960000000, 1, 80, 2, 1, 1, 0), 83 + RK3036_PLL_RATE( 936000000, 1, 78, 2, 1, 1, 0), 84 + RK3036_PLL_RATE( 912000000, 1, 76, 2, 1, 1, 0), 85 + RK3036_PLL_RATE( 900000000, 4, 300, 2, 1, 1, 0), 86 + RK3036_PLL_RATE( 888000000, 1, 74, 2, 1, 1, 0), 87 + RK3036_PLL_RATE( 864000000, 1, 72, 2, 1, 1, 0), 88 + RK3036_PLL_RATE( 840000000, 1, 70, 2, 1, 1, 0), 89 + RK3036_PLL_RATE( 816000000, 1, 68, 2, 1, 1, 0), 90 + RK3036_PLL_RATE( 800000000, 6, 400, 2, 1, 1, 0), 91 + RK3036_PLL_RATE( 700000000, 6, 350, 2, 1, 1, 0), 92 + RK3036_PLL_RATE( 696000000, 1, 58, 2, 1, 1, 0), 93 + RK3036_PLL_RATE( 676000000, 3, 169, 2, 1, 1, 0), 94 + RK3036_PLL_RATE( 600000000, 1, 75, 3, 1, 1, 0), 95 + RK3036_PLL_RATE( 594000000, 2, 99, 2, 1, 1, 0), 96 + RK3036_PLL_RATE( 504000000, 1, 63, 3, 1, 1, 0), 97 + RK3036_PLL_RATE( 500000000, 6, 250, 2, 1, 1, 0), 98 + RK3036_PLL_RATE( 408000000, 1, 68, 2, 2, 1, 0), 99 + RK3036_PLL_RATE( 312000000, 1, 52, 2, 2, 1, 0), 100 + RK3036_PLL_RATE( 216000000, 1, 72, 4, 2, 1, 0), 101 + RK3036_PLL_RATE( 96000000, 1, 64, 4, 4, 1, 0), 102 + { /* sentinel */ }, 103 + }; 104 + 105 + /* CRU parents */ 106 + PNAME(mux_pll_p) = { "xin24m", "xin32k" }; 107 + 108 + PNAME(mux_armclkl_p) = { "clk_core_l_lpll_src", 109 + "clk_core_l_bpll_src", 110 + "clk_core_l_dpll_src", 111 + "clk_core_l_gpll_src" }; 112 + PNAME(mux_armclkb_p) = { "clk_core_b_lpll_src", 113 + "clk_core_b_bpll_src", 114 + "clk_core_b_dpll_src", 115 + "clk_core_b_gpll_src" }; 116 + PNAME(mux_aclk_cci_p) = { "cpll_aclk_cci_src", 117 + "gpll_aclk_cci_src", 118 + "npll_aclk_cci_src", 119 + "vpll_aclk_cci_src" }; 120 + PNAME(mux_cci_trace_p) = { "cpll_cci_trace", "gpll_cci_trace" }; 121 + PNAME(mux_cs_p) = { "cpll_cs", "gpll_cs", "npll_cs"}; 122 + PNAME(mux_aclk_perihp_p) = { "cpll_aclk_perihp_src", "gpll_aclk_perihp_src" }; 123 + 124 + PNAME(mux_pll_src_cpll_gpll_p) = { "cpll", "gpll" }; 125 + PNAME(mux_pll_src_cpll_gpll_npll_p) = { "cpll", "gpll", "npll" }; 126 + PNAME(mux_pll_src_cpll_gpll_ppll_p) = { "cpll", "gpll", "ppll" }; 127 + PNAME(mux_pll_src_cpll_gpll_upll_p) = { "cpll", "gpll", "upll" }; 128 + PNAME(mux_pll_src_npll_cpll_gpll_p) = { "npll", "cpll", "gpll" }; 129 + PNAME(mux_pll_src_cpll_gpll_npll_ppll_p) = { "cpll", "gpll", "npll", "ppll" }; 130 + PNAME(mux_pll_src_cpll_gpll_npll_24m_p) = { "cpll", "gpll", "npll", "xin24m" }; 131 + PNAME(mux_pll_src_cpll_gpll_npll_usbphy480m_p) = { "cpll", "gpll", "npll", "clk_usbphy_480m" }; 132 + PNAME(mux_pll_src_ppll_cpll_gpll_npll_p) = { "ppll", "cpll", "gpll", "npll", "upll" }; 133 + PNAME(mux_pll_src_cpll_gpll_npll_upll_24m_p) = { "cpll", "gpll", "npll", "upll", "xin24m" }; 134 + PNAME(mux_pll_src_cpll_gpll_npll_ppll_upll_24m_p) = { "cpll", "gpll", "npll", "ppll", "upll", "xin24m" }; 135 + 136 + PNAME(mux_pll_src_vpll_cpll_gpll_p) = { "vpll", "cpll", "gpll" }; 137 + PNAME(mux_pll_src_vpll_cpll_gpll_npll_p) = { "vpll", "cpll", "gpll", "npll" }; 138 + PNAME(mux_pll_src_vpll_cpll_gpll_24m_p) = { "vpll", "cpll", "gpll", "xin24m" }; 139 + 140 + PNAME(mux_dclk_vop0_p) = { "dclk_vop0_div", "dclk_vop0_frac" }; 141 + PNAME(mux_dclk_vop1_p) = { "dclk_vop1_div", "dclk_vop1_frac" }; 142 + 143 + PNAME(mux_clk_cif_p) = { "clk_cifout_div", "xin24m" }; 144 + 145 + PNAME(mux_pll_src_24m_usbphy480m_p) = { "xin24m", "clk_usbphy_480m" }; 146 + PNAME(mux_pll_src_24m_pciephy_p) = { "xin24m", "clk_pciephy_ref100m" }; 147 + PNAME(mux_pll_src_24m_32k_cpll_gpll_p) = { "xin24m", "xin32k", "cpll", "gpll" }; 148 + PNAME(mux_pciecore_cru_phy_p) = { "clk_pcie_core_cru", "clk_pcie_core_phy" }; 149 + 150 + PNAME(mux_aclk_emmc_p) = { "cpll_aclk_emmc_src", "gpll_aclk_emmc_src" }; 151 + 152 + PNAME(mux_aclk_perilp0_p) = { "cpll_aclk_perilp0_src", "gpll_aclk_perilp0_src" }; 153 + 154 + PNAME(mux_fclk_cm0s_p) = { "cpll_fclk_cm0s_src", "gpll_fclk_cm0s_src" }; 155 + 156 + PNAME(mux_hclk_perilp1_p) = { "cpll_hclk_perilp1_src", "gpll_hclk_perilp1_src" }; 157 + 158 + PNAME(mux_clk_testout1_p) = { "clk_testout1_pll_src", "xin24m" }; 159 + PNAME(mux_clk_testout2_p) = { "clk_testout2_pll_src", "xin24m" }; 160 + 161 + PNAME(mux_usbphy_480m_p) = { "clk_usbphy0_480m_src", "clk_usbphy1_480m_src" }; 162 + PNAME(mux_aclk_gmac_p) = { "cpll_aclk_gmac_src", "gpll_aclk_gmac_src" }; 163 + PNAME(mux_rmii_p) = { "clk_gmac", "clkin_gmac" }; 164 + PNAME(mux_spdif_p) = { "clk_spdif_div", "clk_spdif_frac", 165 + "clkin_i2s", "xin12m" }; 166 + PNAME(mux_i2s0_p) = { "clk_i2s0_div", "clk_i2s0_frac", 167 + "clkin_i2s", "xin12m" }; 168 + PNAME(mux_i2s1_p) = { "clk_i2s1_div", "clk_i2s1_frac", 169 + "clkin_i2s", "xin12m" }; 170 + PNAME(mux_i2s2_p) = { "clk_i2s2_div", "clk_i2s2_frac", 171 + "clkin_i2s", "xin12m" }; 172 + PNAME(mux_i2sch_p) = { "clk_i2s0", "clk_i2s1", "clk_i2s2" }; 173 + PNAME(mux_i2sout_p) = { "clk_i2sout_src", "xin12m" }; 174 + 175 + PNAME(mux_uart0_p) = { "clk_uart0_div", "clk_uart0_frac", "xin24m" }; 176 + PNAME(mux_uart1_p) = { "clk_uart1_div", "clk_uart1_frac", "xin24m" }; 177 + PNAME(mux_uart2_p) = { "clk_uart2_div", "clk_uart2_frac", "xin24m" }; 178 + PNAME(mux_uart3_p) = { "clk_uart3_div", "clk_uart3_frac", "xin24m" }; 179 + 180 + /* PMU CRU parents */ 181 + PNAME(mux_ppll_24m_p) = { "ppll", "xin24m" }; 182 + PNAME(mux_24m_ppll_p) = { "xin24m", "ppll" }; 183 + PNAME(mux_fclk_cm0s_pmu_ppll_p) = { "fclk_cm0s_pmu_ppll_src", "xin24m" }; 184 + PNAME(mux_wifi_pmu_p) = { "clk_wifi_div", "clk_wifi_frac" }; 185 + PNAME(mux_uart4_pmu_p) = { "clk_uart4_div", "clk_uart4_frac", "xin24m" }; 186 + PNAME(mux_clk_testout2_2io_p) = { "clk_testout2", "clk_32k_suspend_pmu" }; 187 + 188 + static struct rockchip_pll_clock rk3399_pll_clks[] __initdata = { 189 + [lpll] = PLL(pll_rk3399, PLL_APLLL, "lpll", mux_pll_p, 0, RK3399_PLL_CON(0), 190 + RK3399_PLL_CON(3), 8, 31, 0, rk3399_pll_rates), 191 + [bpll] = PLL(pll_rk3399, PLL_APLLB, "bpll", mux_pll_p, 0, RK3399_PLL_CON(8), 192 + RK3399_PLL_CON(11), 8, 31, 0, rk3399_pll_rates), 193 + [dpll] = PLL(pll_rk3399, PLL_DPLL, "dpll", mux_pll_p, 0, RK3399_PLL_CON(16), 194 + RK3399_PLL_CON(19), 8, 31, 0, NULL), 195 + [cpll] = PLL(pll_rk3399, PLL_CPLL, "cpll", mux_pll_p, 0, RK3399_PLL_CON(24), 196 + RK3399_PLL_CON(27), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), 197 + [gpll] = PLL(pll_rk3399, PLL_GPLL, "gpll", mux_pll_p, 0, RK3399_PLL_CON(32), 198 + RK3399_PLL_CON(35), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), 199 + [npll] = PLL(pll_rk3399, PLL_NPLL, "npll", mux_pll_p, 0, RK3399_PLL_CON(40), 200 + RK3399_PLL_CON(43), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), 201 + [vpll] = PLL(pll_rk3399, PLL_VPLL, "vpll", mux_pll_p, 0, RK3399_PLL_CON(48), 202 + RK3399_PLL_CON(51), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), 203 + }; 204 + 205 + static struct rockchip_pll_clock rk3399_pmu_pll_clks[] __initdata = { 206 + [ppll] = PLL(pll_rk3399, PLL_PPLL, "ppll", mux_pll_p, 0, RK3399_PMU_PLL_CON(0), 207 + RK3399_PMU_PLL_CON(3), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rk3399_pll_rates), 208 + }; 209 + 210 + #define MFLAGS CLK_MUX_HIWORD_MASK 211 + #define DFLAGS CLK_DIVIDER_HIWORD_MASK 212 + #define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE) 213 + #define IFLAGS ROCKCHIP_INVERTER_HIWORD_MASK 214 + 215 + static struct rockchip_clk_branch rk3399_spdif_fracmux __initdata = 216 + MUX(0, "clk_spdif_mux", mux_spdif_p, CLK_SET_RATE_PARENT, 217 + RK3399_CLKSEL_CON(32), 13, 2, MFLAGS); 218 + 219 + static struct rockchip_clk_branch rk3399_i2s0_fracmux __initdata = 220 + MUX(0, "clk_i2s0_mux", mux_i2s0_p, CLK_SET_RATE_PARENT, 221 + RK3399_CLKSEL_CON(28), 8, 2, MFLAGS); 222 + 223 + static struct rockchip_clk_branch rk3399_i2s1_fracmux __initdata = 224 + MUX(0, "clk_i2s1_mux", mux_i2s1_p, CLK_SET_RATE_PARENT, 225 + RK3399_CLKSEL_CON(29), 8, 2, MFLAGS); 226 + 227 + static struct rockchip_clk_branch rk3399_i2s2_fracmux __initdata = 228 + MUX(0, "clk_i2s2_mux", mux_i2s2_p, CLK_SET_RATE_PARENT, 229 + RK3399_CLKSEL_CON(30), 8, 2, MFLAGS); 230 + 231 + static struct rockchip_clk_branch rk3399_uart0_fracmux __initdata = 232 + MUX(SCLK_UART0, "clk_uart0", mux_uart0_p, CLK_SET_RATE_PARENT, 233 + RK3399_CLKSEL_CON(33), 8, 2, MFLAGS); 234 + 235 + static struct rockchip_clk_branch rk3399_uart1_fracmux __initdata = 236 + MUX(SCLK_UART1, "clk_uart1", mux_uart1_p, CLK_SET_RATE_PARENT, 237 + RK3399_CLKSEL_CON(34), 8, 2, MFLAGS); 238 + 239 + static struct rockchip_clk_branch rk3399_uart2_fracmux __initdata = 240 + MUX(SCLK_UART2, "clk_uart2", mux_uart2_p, CLK_SET_RATE_PARENT, 241 + RK3399_CLKSEL_CON(35), 8, 2, MFLAGS); 242 + 243 + static struct rockchip_clk_branch rk3399_uart3_fracmux __initdata = 244 + MUX(SCLK_UART3, "clk_uart3", mux_uart3_p, CLK_SET_RATE_PARENT, 245 + RK3399_CLKSEL_CON(36), 8, 2, MFLAGS); 246 + 247 + static struct rockchip_clk_branch rk3399_uart4_pmu_fracmux __initdata = 248 + MUX(SCLK_UART4_PMU, "clk_uart4_pmu", mux_uart4_pmu_p, CLK_SET_RATE_PARENT, 249 + RK3399_PMU_CLKSEL_CON(5), 8, 2, MFLAGS); 250 + 251 + static struct rockchip_clk_branch rk3399_dclk_vop0_fracmux __initdata = 252 + MUX(DCLK_VOP0, "dclk_vop0", mux_dclk_vop0_p, CLK_SET_RATE_PARENT, 253 + RK3399_CLKSEL_CON(49), 11, 1, MFLAGS); 254 + 255 + static struct rockchip_clk_branch rk3399_dclk_vop1_fracmux __initdata = 256 + MUX(DCLK_VOP1, "dclk_vop1", mux_dclk_vop1_p, CLK_SET_RATE_PARENT, 257 + RK3399_CLKSEL_CON(50), 11, 1, MFLAGS); 258 + 259 + static struct rockchip_clk_branch rk3399_pmuclk_wifi_fracmux __initdata = 260 + MUX(SCLK_WIFI_PMU, "clk_wifi_pmu", mux_wifi_pmu_p, CLK_SET_RATE_PARENT, 261 + RK3399_PMU_CLKSEL_CON(1), 14, 1, MFLAGS); 262 + 263 + static const struct rockchip_cpuclk_reg_data rk3399_cpuclkl_data = { 264 + .core_reg = RK3399_CLKSEL_CON(0), 265 + .div_core_shift = 0, 266 + .div_core_mask = 0x1f, 267 + .mux_core_alt = 3, 268 + .mux_core_main = 0, 269 + .mux_core_shift = 6, 270 + .mux_core_mask = 0x3, 271 + }; 272 + 273 + static const struct rockchip_cpuclk_reg_data rk3399_cpuclkb_data = { 274 + .core_reg = RK3399_CLKSEL_CON(2), 275 + .div_core_shift = 0, 276 + .div_core_mask = 0x1f, 277 + .mux_core_alt = 3, 278 + .mux_core_main = 1, 279 + .mux_core_shift = 6, 280 + .mux_core_mask = 0x3, 281 + }; 282 + 283 + #define RK3399_DIV_ACLKM_MASK 0x1f 284 + #define RK3399_DIV_ACLKM_SHIFT 8 285 + #define RK3399_DIV_ATCLK_MASK 0x1f 286 + #define RK3399_DIV_ATCLK_SHIFT 0 287 + #define RK3399_DIV_PCLK_DBG_MASK 0x1f 288 + #define RK3399_DIV_PCLK_DBG_SHIFT 8 289 + 290 + #define RK3399_CLKSEL0(_offs, _aclkm) \ 291 + { \ 292 + .reg = RK3399_CLKSEL_CON(0 + _offs), \ 293 + .val = HIWORD_UPDATE(_aclkm, RK3399_DIV_ACLKM_MASK, \ 294 + RK3399_DIV_ACLKM_SHIFT), \ 295 + } 296 + #define RK3399_CLKSEL1(_offs, _atclk, _pdbg) \ 297 + { \ 298 + .reg = RK3399_CLKSEL_CON(1 + _offs), \ 299 + .val = HIWORD_UPDATE(_atclk, RK3399_DIV_ATCLK_MASK, \ 300 + RK3399_DIV_ATCLK_SHIFT) | \ 301 + HIWORD_UPDATE(_pdbg, RK3399_DIV_PCLK_DBG_MASK, \ 302 + RK3399_DIV_PCLK_DBG_SHIFT), \ 303 + } 304 + 305 + /* cluster_l: aclkm in clksel0, rest in clksel1 */ 306 + #define RK3399_CPUCLKL_RATE(_prate, _aclkm, _atclk, _pdbg) \ 307 + { \ 308 + .prate = _prate##U, \ 309 + .divs = { \ 310 + RK3399_CLKSEL0(0, _aclkm), \ 311 + RK3399_CLKSEL1(0, _atclk, _pdbg), \ 312 + }, \ 313 + } 314 + 315 + /* cluster_b: aclkm in clksel2, rest in clksel3 */ 316 + #define RK3399_CPUCLKB_RATE(_prate, _aclkm, _atclk, _pdbg) \ 317 + { \ 318 + .prate = _prate##U, \ 319 + .divs = { \ 320 + RK3399_CLKSEL0(2, _aclkm), \ 321 + RK3399_CLKSEL1(2, _atclk, _pdbg), \ 322 + }, \ 323 + } 324 + 325 + static struct rockchip_cpuclk_rate_table rk3399_cpuclkl_rates[] __initdata = { 326 + RK3399_CPUCLKL_RATE(1800000000, 1, 8, 8), 327 + RK3399_CPUCLKL_RATE(1704000000, 1, 8, 8), 328 + RK3399_CPUCLKL_RATE(1608000000, 1, 7, 7), 329 + RK3399_CPUCLKL_RATE(1512000000, 1, 7, 7), 330 + RK3399_CPUCLKL_RATE(1488000000, 1, 6, 6), 331 + RK3399_CPUCLKL_RATE(1416000000, 1, 6, 6), 332 + RK3399_CPUCLKL_RATE(1200000000, 1, 5, 5), 333 + RK3399_CPUCLKL_RATE(1008000000, 1, 5, 5), 334 + RK3399_CPUCLKL_RATE( 816000000, 1, 4, 4), 335 + RK3399_CPUCLKL_RATE( 696000000, 1, 3, 3), 336 + RK3399_CPUCLKL_RATE( 600000000, 1, 3, 3), 337 + RK3399_CPUCLKL_RATE( 408000000, 1, 2, 2), 338 + RK3399_CPUCLKL_RATE( 312000000, 1, 1, 1), 339 + }; 340 + 341 + static struct rockchip_cpuclk_rate_table rk3399_cpuclkb_rates[] __initdata = { 342 + RK3399_CPUCLKB_RATE(2208000000, 1, 11, 11), 343 + RK3399_CPUCLKB_RATE(2184000000, 1, 11, 11), 344 + RK3399_CPUCLKB_RATE(2088000000, 1, 10, 10), 345 + RK3399_CPUCLKB_RATE(2040000000, 1, 10, 10), 346 + RK3399_CPUCLKB_RATE(1992000000, 1, 9, 9), 347 + RK3399_CPUCLKB_RATE(1896000000, 1, 9, 9), 348 + RK3399_CPUCLKB_RATE(1800000000, 1, 8, 8), 349 + RK3399_CPUCLKB_RATE(1704000000, 1, 8, 8), 350 + RK3399_CPUCLKB_RATE(1608000000, 1, 7, 7), 351 + RK3399_CPUCLKB_RATE(1512000000, 1, 7, 7), 352 + RK3399_CPUCLKB_RATE(1488000000, 1, 6, 6), 353 + RK3399_CPUCLKB_RATE(1416000000, 1, 6, 6), 354 + RK3399_CPUCLKB_RATE(1200000000, 1, 5, 5), 355 + RK3399_CPUCLKB_RATE(1008000000, 1, 5, 5), 356 + RK3399_CPUCLKB_RATE( 816000000, 1, 4, 4), 357 + RK3399_CPUCLKB_RATE( 696000000, 1, 3, 3), 358 + RK3399_CPUCLKB_RATE( 600000000, 1, 3, 3), 359 + RK3399_CPUCLKB_RATE( 408000000, 1, 2, 2), 360 + RK3399_CPUCLKB_RATE( 312000000, 1, 1, 1), 361 + }; 362 + 363 + static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { 364 + /* 365 + * CRU Clock-Architecture 366 + */ 367 + 368 + /* usbphy */ 369 + GATE(SCLK_USB2PHY0_REF, "clk_usb2phy0_ref", "xin24m", CLK_IGNORE_UNUSED, 370 + RK3399_CLKGATE_CON(6), 5, GFLAGS), 371 + GATE(SCLK_USB2PHY1_REF, "clk_usb2phy1_ref", "xin24m", CLK_IGNORE_UNUSED, 372 + RK3399_CLKGATE_CON(6), 6, GFLAGS), 373 + 374 + GATE(0, "clk_usbphy0_480m_src", "clk_usbphy0_480m", CLK_IGNORE_UNUSED, 375 + RK3399_CLKGATE_CON(13), 12, GFLAGS), 376 + GATE(0, "clk_usbphy1_480m_src", "clk_usbphy1_480m", CLK_IGNORE_UNUSED, 377 + RK3399_CLKGATE_CON(13), 12, GFLAGS), 378 + MUX(0, "clk_usbphy_480m", mux_usbphy_480m_p, CLK_IGNORE_UNUSED, 379 + RK3399_CLKSEL_CON(14), 6, 1, MFLAGS), 380 + 381 + MUX(0, "upll", mux_pll_src_24m_usbphy480m_p, 0, 382 + RK3399_CLKSEL_CON(14), 15, 1, MFLAGS), 383 + 384 + COMPOSITE_NODIV(SCLK_HSICPHY, "clk_hsicphy", mux_pll_src_cpll_gpll_npll_usbphy480m_p, CLK_IGNORE_UNUSED, 385 + RK3399_CLKSEL_CON(19), 0, 2, MFLAGS, 386 + RK3399_CLKGATE_CON(6), 4, GFLAGS), 387 + 388 + COMPOSITE(ACLK_USB3, "aclk_usb3", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 389 + RK3399_CLKSEL_CON(39), 6, 2, MFLAGS, 0, 5, DFLAGS, 390 + RK3399_CLKGATE_CON(12), 0, GFLAGS), 391 + GATE(ACLK_USB3_NOC, "aclk_usb3_noc", "aclk_usb3", CLK_IGNORE_UNUSED, 392 + RK3399_CLKGATE_CON(30), 0, GFLAGS), 393 + GATE(ACLK_USB3OTG0, "aclk_usb3otg0", "aclk_usb3", CLK_IGNORE_UNUSED, 394 + RK3399_CLKGATE_CON(30), 1, GFLAGS), 395 + GATE(ACLK_USB3OTG1, "aclk_usb3otg1", "aclk_usb3", CLK_IGNORE_UNUSED, 396 + RK3399_CLKGATE_CON(30), 2, GFLAGS), 397 + GATE(ACLK_USB3_RKSOC_AXI_PERF, "aclk_usb3_rksoc_axi_perf", "aclk_usb3", CLK_IGNORE_UNUSED, 398 + RK3399_CLKGATE_CON(30), 3, GFLAGS), 399 + GATE(ACLK_USB3_GRF, "aclk_usb3_grf", "aclk_usb3", CLK_IGNORE_UNUSED, 400 + RK3399_CLKGATE_CON(30), 4, GFLAGS), 401 + 402 + GATE(SCLK_USB3OTG0_REF, "clk_usb3otg0_ref", "xin24m", CLK_IGNORE_UNUSED, 403 + RK3399_CLKGATE_CON(12), 1, GFLAGS), 404 + GATE(SCLK_USB3OTG1_REF, "clk_usb3otg1_ref", "xin24m", CLK_IGNORE_UNUSED, 405 + RK3399_CLKGATE_CON(12), 2, GFLAGS), 406 + 407 + COMPOSITE(SCLK_USB3OTG0_SUSPEND, "clk_usb3otg0_suspend", mux_pll_p, CLK_IGNORE_UNUSED, 408 + RK3399_CLKSEL_CON(40), 15, 1, MFLAGS, 0, 10, DFLAGS, 409 + RK3399_CLKGATE_CON(12), 3, GFLAGS), 410 + 411 + COMPOSITE(SCLK_USB3OTG1_SUSPEND, "clk_usb3otg1_suspend", mux_pll_p, CLK_IGNORE_UNUSED, 412 + RK3399_CLKSEL_CON(41), 15, 1, MFLAGS, 0, 10, DFLAGS, 413 + RK3399_CLKGATE_CON(12), 4, GFLAGS), 414 + 415 + COMPOSITE(SCLK_UPHY0_TCPDPHY_REF, "clk_uphy0_tcpdphy_ref", mux_pll_p, CLK_IGNORE_UNUSED, 416 + RK3399_CLKSEL_CON(64), 15, 1, MFLAGS, 8, 5, DFLAGS, 417 + RK3399_CLKGATE_CON(13), 4, GFLAGS), 418 + 419 + COMPOSITE(SCLK_UPHY0_TCPDCORE, "clk_uphy0_tcpdcore", mux_pll_src_24m_32k_cpll_gpll_p, CLK_IGNORE_UNUSED, 420 + RK3399_CLKSEL_CON(64), 6, 2, MFLAGS, 0, 5, DFLAGS, 421 + RK3399_CLKGATE_CON(13), 5, GFLAGS), 422 + 423 + COMPOSITE(SCLK_UPHY1_TCPDPHY_REF, "clk_uphy1_tcpdphy_ref", mux_pll_p, CLK_IGNORE_UNUSED, 424 + RK3399_CLKSEL_CON(65), 15, 1, MFLAGS, 8, 5, DFLAGS, 425 + RK3399_CLKGATE_CON(13), 6, GFLAGS), 426 + 427 + COMPOSITE(SCLK_UPHY1_TCPDCORE, "clk_uphy1_tcpdcore", mux_pll_src_24m_32k_cpll_gpll_p, CLK_IGNORE_UNUSED, 428 + RK3399_CLKSEL_CON(65), 6, 2, MFLAGS, 0, 5, DFLAGS, 429 + RK3399_CLKGATE_CON(13), 7, GFLAGS), 430 + 431 + /* little core */ 432 + GATE(0, "clk_core_l_lpll_src", "lpll", CLK_IGNORE_UNUSED, 433 + RK3399_CLKGATE_CON(0), 0, GFLAGS), 434 + GATE(0, "clk_core_l_bpll_src", "bpll", CLK_IGNORE_UNUSED, 435 + RK3399_CLKGATE_CON(0), 1, GFLAGS), 436 + GATE(0, "clk_core_l_dpll_src", "dpll", CLK_IGNORE_UNUSED, 437 + RK3399_CLKGATE_CON(0), 2, GFLAGS), 438 + GATE(0, "clk_core_l_gpll_src", "gpll", CLK_IGNORE_UNUSED, 439 + RK3399_CLKGATE_CON(0), 3, GFLAGS), 440 + 441 + COMPOSITE_NOMUX(0, "aclkm_core_l", "armclkl", CLK_IGNORE_UNUSED, 442 + RK3399_CLKSEL_CON(0), 8, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 443 + RK3399_CLKGATE_CON(0), 4, GFLAGS), 444 + COMPOSITE_NOMUX(0, "atclk_core_l", "armclkl", CLK_IGNORE_UNUSED, 445 + RK3399_CLKSEL_CON(1), 0, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 446 + RK3399_CLKGATE_CON(0), 5, GFLAGS), 447 + COMPOSITE_NOMUX(0, "pclk_dbg_core_l", "armclkl", CLK_IGNORE_UNUSED, 448 + RK3399_CLKSEL_CON(1), 8, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 449 + RK3399_CLKGATE_CON(0), 6, GFLAGS), 450 + 451 + GATE(ACLK_CORE_ADB400_CORE_L_2_CCI500, "aclk_core_adb400_core_l_2_cci500", "aclkm_core_l", CLK_IGNORE_UNUSED, 452 + RK3399_CLKGATE_CON(14), 12, GFLAGS), 453 + GATE(ACLK_PERF_CORE_L, "aclk_perf_core_l", "aclkm_core_l", CLK_IGNORE_UNUSED, 454 + RK3399_CLKGATE_CON(14), 13, GFLAGS), 455 + 456 + GATE(0, "clk_dbg_pd_core_l", "armclkl", CLK_IGNORE_UNUSED, 457 + RK3399_CLKGATE_CON(14), 9, GFLAGS), 458 + GATE(ACLK_GIC_ADB400_GIC_2_CORE_L, "aclk_core_adb400_gic_2_core_l", "armclkl", CLK_IGNORE_UNUSED, 459 + RK3399_CLKGATE_CON(14), 10, GFLAGS), 460 + GATE(ACLK_GIC_ADB400_CORE_L_2_GIC, "aclk_core_adb400_core_l_2_gic", "armclkl", CLK_IGNORE_UNUSED, 461 + RK3399_CLKGATE_CON(14), 11, GFLAGS), 462 + GATE(SCLK_PVTM_CORE_L, "clk_pvtm_core_l", "xin24m", CLK_IGNORE_UNUSED, 463 + RK3399_CLKGATE_CON(0), 7, GFLAGS), 464 + 465 + /* big core */ 466 + GATE(0, "clk_core_b_lpll_src", "lpll", CLK_IGNORE_UNUSED, 467 + RK3399_CLKGATE_CON(1), 0, GFLAGS), 468 + GATE(0, "clk_core_b_bpll_src", "bpll", CLK_IGNORE_UNUSED, 469 + RK3399_CLKGATE_CON(1), 1, GFLAGS), 470 + GATE(0, "clk_core_b_dpll_src", "dpll", CLK_IGNORE_UNUSED, 471 + RK3399_CLKGATE_CON(1), 2, GFLAGS), 472 + GATE(0, "clk_core_b_gpll_src", "gpll", CLK_IGNORE_UNUSED, 473 + RK3399_CLKGATE_CON(1), 3, GFLAGS), 474 + 475 + COMPOSITE_NOMUX(0, "aclkm_core_b", "armclkb", CLK_IGNORE_UNUSED, 476 + RK3399_CLKSEL_CON(2), 8, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 477 + RK3399_CLKGATE_CON(1), 4, GFLAGS), 478 + COMPOSITE_NOMUX(0, "atclk_core_b", "armclkb", CLK_IGNORE_UNUSED, 479 + RK3399_CLKSEL_CON(3), 0, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 480 + RK3399_CLKGATE_CON(1), 5, GFLAGS), 481 + COMPOSITE_NOMUX(0, "pclk_dbg_core_b", "armclkb", CLK_IGNORE_UNUSED, 482 + RK3399_CLKSEL_CON(3), 8, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, 483 + RK3399_CLKGATE_CON(1), 6, GFLAGS), 484 + 485 + GATE(ACLK_CORE_ADB400_CORE_B_2_CCI500, "aclk_core_adb400_core_b_2_cci500", "aclkm_core_b", CLK_IGNORE_UNUSED, 486 + RK3399_CLKGATE_CON(14), 5, GFLAGS), 487 + GATE(ACLK_PERF_CORE_B, "aclk_perf_core_b", "aclkm_core_b", CLK_IGNORE_UNUSED, 488 + RK3399_CLKGATE_CON(14), 6, GFLAGS), 489 + 490 + GATE(0, "clk_dbg_pd_core_b", "armclkb", CLK_IGNORE_UNUSED, 491 + RK3399_CLKGATE_CON(14), 1, GFLAGS), 492 + GATE(ACLK_GIC_ADB400_GIC_2_CORE_B, "aclk_core_adb400_gic_2_core_b", "armclkb", CLK_IGNORE_UNUSED, 493 + RK3399_CLKGATE_CON(14), 3, GFLAGS), 494 + GATE(ACLK_GIC_ADB400_CORE_B_2_GIC, "aclk_core_adb400_core_b_2_gic", "armclkb", CLK_IGNORE_UNUSED, 495 + RK3399_CLKGATE_CON(14), 4, GFLAGS), 496 + 497 + DIV(0, "pclken_dbg_core_b", "pclk_dbg_core_b", CLK_IGNORE_UNUSED, 498 + RK3399_CLKSEL_CON(3), 13, 2, DFLAGS | CLK_DIVIDER_READ_ONLY), 499 + 500 + GATE(0, "pclk_dbg_cxcs_pd_core_b", "pclk_dbg_core_b", CLK_IGNORE_UNUSED, 501 + RK3399_CLKGATE_CON(14), 2, GFLAGS), 502 + 503 + GATE(SCLK_PVTM_CORE_B, "clk_pvtm_core_b", "xin24m", CLK_IGNORE_UNUSED, 504 + RK3399_CLKGATE_CON(1), 7, GFLAGS), 505 + 506 + /* gmac */ 507 + GATE(0, "cpll_aclk_gmac_src", "cpll", CLK_IGNORE_UNUSED, 508 + RK3399_CLKGATE_CON(6), 9, GFLAGS), 509 + GATE(0, "gpll_aclk_gmac_src", "gpll", CLK_IGNORE_UNUSED, 510 + RK3399_CLKGATE_CON(6), 8, GFLAGS), 511 + COMPOSITE(0, "aclk_gmac_pre", mux_aclk_gmac_p, CLK_IGNORE_UNUSED, 512 + RK3399_CLKSEL_CON(20), 7, 1, MFLAGS, 0, 5, DFLAGS, 513 + RK3399_CLKGATE_CON(6), 10, GFLAGS), 514 + 515 + GATE(ACLK_GMAC, "aclk_gmac", "aclk_gmac_pre", CLK_IGNORE_UNUSED, 516 + RK3399_CLKGATE_CON(32), 0, GFLAGS), 517 + GATE(ACLK_GMAC_NOC, "aclk_gmac_noc", "aclk_gmac_pre", CLK_IGNORE_UNUSED, 518 + RK3399_CLKGATE_CON(32), 1, GFLAGS), 519 + GATE(ACLK_PERF_GMAC, "aclk_perf_gmac", "aclk_gmac_pre", CLK_IGNORE_UNUSED, 520 + RK3399_CLKGATE_CON(32), 4, GFLAGS), 521 + 522 + COMPOSITE_NOMUX(0, "pclk_gmac_pre", "aclk_gmac_pre", 0, 523 + RK3399_CLKSEL_CON(19), 8, 3, DFLAGS, 524 + RK3399_CLKGATE_CON(6), 11, GFLAGS), 525 + GATE(PCLK_GMAC, "pclk_gmac", "pclk_gmac_pre", CLK_IGNORE_UNUSED, 526 + RK3399_CLKGATE_CON(32), 2, GFLAGS), 527 + GATE(PCLK_GMAC_NOC, "pclk_gmac_noc", "pclk_gmac_pre", CLK_IGNORE_UNUSED, 528 + RK3399_CLKGATE_CON(32), 3, GFLAGS), 529 + 530 + COMPOSITE(SCLK_MAC, "clk_gmac", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 531 + RK3399_CLKSEL_CON(20), 14, 2, MFLAGS, 8, 5, DFLAGS, 532 + RK3399_CLKGATE_CON(5), 5, GFLAGS), 533 + 534 + MUX(0, "clk_rmii_src", mux_rmii_p, CLK_SET_RATE_PARENT, 535 + RK3399_CLKSEL_CON(19), 4, 1, MFLAGS), 536 + GATE(SCLK_MACREF_OUT, "clk_mac_refout", "clk_rmii_src", CLK_IGNORE_UNUSED, 537 + RK3399_CLKGATE_CON(5), 6, GFLAGS), 538 + GATE(SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", CLK_IGNORE_UNUSED, 539 + RK3399_CLKGATE_CON(5), 7, GFLAGS), 540 + GATE(SCLK_MAC_RX, "clk_rmii_rx", "clk_rmii_src", CLK_IGNORE_UNUSED, 541 + RK3399_CLKGATE_CON(5), 8, GFLAGS), 542 + GATE(SCLK_MAC_TX, "clk_rmii_tx", "clk_rmii_src", CLK_IGNORE_UNUSED, 543 + RK3399_CLKGATE_CON(5), 9, GFLAGS), 544 + 545 + /* spdif */ 546 + COMPOSITE(0, "clk_spdif_div", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 547 + RK3399_CLKSEL_CON(32), 7, 1, MFLAGS, 0, 7, DFLAGS, 548 + RK3399_CLKGATE_CON(8), 13, GFLAGS), 549 + COMPOSITE_FRACMUX(0, "clk_spdif_frac", "clk_spdif_div", CLK_SET_RATE_PARENT, 550 + RK3399_CLKSEL_CON(99), 0, 551 + RK3399_CLKGATE_CON(8), 14, GFLAGS, 552 + &rk3399_spdif_fracmux), 553 + GATE(SCLK_SPDIF_8CH, "clk_spdif", "clk_spdif_mux", CLK_SET_RATE_PARENT, 554 + RK3399_CLKGATE_CON(8), 15, GFLAGS), 555 + 556 + COMPOSITE(SCLK_SPDIF_REC_DPTX, "clk_spdif_rec_dptx", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 557 + RK3399_CLKSEL_CON(32), 15, 1, MFLAGS, 0, 5, DFLAGS, 558 + RK3399_CLKGATE_CON(10), 6, GFLAGS), 559 + /* i2s */ 560 + COMPOSITE(0, "clk_i2s0_div", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 561 + RK3399_CLKSEL_CON(28), 7, 1, MFLAGS, 0, 7, DFLAGS, 562 + RK3399_CLKGATE_CON(8), 3, GFLAGS), 563 + COMPOSITE_FRACMUX(0, "clk_i2s0_frac", "clk_i2s0_div", CLK_SET_RATE_PARENT, 564 + RK3399_CLKSEL_CON(96), 0, 565 + RK3399_CLKGATE_CON(8), 4, GFLAGS, 566 + &rk3399_i2s0_fracmux), 567 + GATE(SCLK_I2S0_8CH, "clk_i2s0", "clk_i2s0_mux", CLK_SET_RATE_PARENT, 568 + RK3399_CLKGATE_CON(8), 5, GFLAGS), 569 + 570 + COMPOSITE(0, "clk_i2s1_div", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 571 + RK3399_CLKSEL_CON(29), 7, 1, MFLAGS, 0, 7, DFLAGS, 572 + RK3399_CLKGATE_CON(8), 6, GFLAGS), 573 + COMPOSITE_FRACMUX(0, "clk_i2s1_frac", "clk_i2s1_div", CLK_SET_RATE_PARENT, 574 + RK3399_CLKSEL_CON(97), 0, 575 + RK3399_CLKGATE_CON(8), 7, GFLAGS, 576 + &rk3399_i2s1_fracmux), 577 + GATE(SCLK_I2S1_8CH, "clk_i2s1", "clk_i2s1_mux", CLK_SET_RATE_PARENT, 578 + RK3399_CLKGATE_CON(8), 8, GFLAGS), 579 + 580 + COMPOSITE(0, "clk_i2s2_div", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 581 + RK3399_CLKSEL_CON(30), 7, 1, MFLAGS, 0, 7, DFLAGS, 582 + RK3399_CLKGATE_CON(8), 9, GFLAGS), 583 + COMPOSITE_FRACMUX(0, "clk_i2s2_frac", "clk_i2s2_div", CLK_SET_RATE_PARENT, 584 + RK3399_CLKSEL_CON(98), 0, 585 + RK3399_CLKGATE_CON(8), 10, GFLAGS, 586 + &rk3399_i2s2_fracmux), 587 + GATE(SCLK_I2S2_8CH, "clk_i2s2", "clk_i2s2_mux", CLK_SET_RATE_PARENT, 588 + RK3399_CLKGATE_CON(8), 11, GFLAGS), 589 + 590 + MUX(0, "clk_i2sout_src", mux_i2sch_p, CLK_SET_RATE_PARENT, 591 + RK3399_CLKSEL_CON(31), 0, 2, MFLAGS), 592 + COMPOSITE_NODIV(SCLK_I2S_8CH_OUT, "clk_i2sout", mux_i2sout_p, CLK_SET_RATE_PARENT, 593 + RK3399_CLKSEL_CON(30), 8, 2, MFLAGS, 594 + RK3399_CLKGATE_CON(8), 12, GFLAGS), 595 + 596 + /* uart */ 597 + MUX(0, "clk_uart0_src", mux_pll_src_cpll_gpll_upll_p, 0, 598 + RK3399_CLKSEL_CON(33), 12, 2, MFLAGS), 599 + COMPOSITE_NOMUX(0, "clk_uart0_div", "clk_uart0_src", 0, 600 + RK3399_CLKSEL_CON(33), 0, 7, DFLAGS, 601 + RK3399_CLKGATE_CON(9), 0, GFLAGS), 602 + COMPOSITE_FRACMUX(0, "clk_uart0_frac", "clk_uart0_div", CLK_SET_RATE_PARENT, 603 + RK3399_CLKSEL_CON(100), 0, 604 + RK3399_CLKGATE_CON(9), 1, GFLAGS, 605 + &rk3399_uart0_fracmux), 606 + 607 + MUX(0, "clk_uart_src", mux_pll_src_cpll_gpll_p, 0, 608 + RK3399_CLKSEL_CON(33), 15, 1, MFLAGS), 609 + COMPOSITE_NOMUX(0, "clk_uart1_div", "clk_uart_src", 0, 610 + RK3399_CLKSEL_CON(34), 0, 7, DFLAGS, 611 + RK3399_CLKGATE_CON(9), 2, GFLAGS), 612 + COMPOSITE_FRACMUX(0, "clk_uart1_frac", "clk_uart1_div", CLK_SET_RATE_PARENT, 613 + RK3399_CLKSEL_CON(101), 0, 614 + RK3399_CLKGATE_CON(9), 3, GFLAGS, 615 + &rk3399_uart1_fracmux), 616 + 617 + COMPOSITE_NOMUX(0, "clk_uart2_div", "clk_uart_src", 0, 618 + RK3399_CLKSEL_CON(35), 0, 7, DFLAGS, 619 + RK3399_CLKGATE_CON(9), 4, GFLAGS), 620 + COMPOSITE_FRACMUX(0, "clk_uart2_frac", "clk_uart2_div", CLK_SET_RATE_PARENT, 621 + RK3399_CLKSEL_CON(102), 0, 622 + RK3399_CLKGATE_CON(9), 5, GFLAGS, 623 + &rk3399_uart2_fracmux), 624 + 625 + COMPOSITE_NOMUX(0, "clk_uart3_div", "clk_uart_src", 0, 626 + RK3399_CLKSEL_CON(36), 0, 7, DFLAGS, 627 + RK3399_CLKGATE_CON(9), 6, GFLAGS), 628 + COMPOSITE_FRACMUX(0, "clk_uart3_frac", "clk_uart3_div", CLK_SET_RATE_PARENT, 629 + RK3399_CLKSEL_CON(103), 0, 630 + RK3399_CLKGATE_CON(9), 7, GFLAGS, 631 + &rk3399_uart3_fracmux), 632 + 633 + COMPOSITE(0, "pclk_ddr", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 634 + RK3399_CLKSEL_CON(6), 15, 1, MFLAGS, 8, 5, DFLAGS, 635 + RK3399_CLKGATE_CON(3), 4, GFLAGS), 636 + 637 + GATE(PCLK_CENTER_MAIN_NOC, "pclk_center_main_noc", "pclk_ddr", CLK_IGNORE_UNUSED, 638 + RK3399_CLKGATE_CON(18), 10, GFLAGS), 639 + GATE(PCLK_DDR_MON, "pclk_ddr_mon", "pclk_ddr", CLK_IGNORE_UNUSED, 640 + RK3399_CLKGATE_CON(18), 12, GFLAGS), 641 + GATE(PCLK_CIC, "pclk_cic", "pclk_ddr", CLK_IGNORE_UNUSED, 642 + RK3399_CLKGATE_CON(18), 15, GFLAGS), 643 + GATE(PCLK_DDR_SGRF, "pclk_ddr_sgrf", "pclk_ddr", CLK_IGNORE_UNUSED, 644 + RK3399_CLKGATE_CON(19), 2, GFLAGS), 645 + 646 + GATE(SCLK_PVTM_DDR, "clk_pvtm_ddr", "xin24m", CLK_IGNORE_UNUSED, 647 + RK3399_CLKGATE_CON(4), 11, GFLAGS), 648 + GATE(SCLK_DFIMON0_TIMER, "clk_dfimon0_timer", "xin24m", CLK_IGNORE_UNUSED, 649 + RK3399_CLKGATE_CON(3), 5, GFLAGS), 650 + GATE(SCLK_DFIMON1_TIMER, "clk_dfimon1_timer", "xin24m", CLK_IGNORE_UNUSED, 651 + RK3399_CLKGATE_CON(3), 6, GFLAGS), 652 + 653 + /* cci */ 654 + GATE(0, "cpll_aclk_cci_src", "cpll", CLK_IGNORE_UNUSED, 655 + RK3399_CLKGATE_CON(2), 0, GFLAGS), 656 + GATE(0, "gpll_aclk_cci_src", "gpll", CLK_IGNORE_UNUSED, 657 + RK3399_CLKGATE_CON(2), 1, GFLAGS), 658 + GATE(0, "npll_aclk_cci_src", "npll", CLK_IGNORE_UNUSED, 659 + RK3399_CLKGATE_CON(2), 2, GFLAGS), 660 + GATE(0, "vpll_aclk_cci_src", "vpll", CLK_IGNORE_UNUSED, 661 + RK3399_CLKGATE_CON(2), 3, GFLAGS), 662 + 663 + COMPOSITE(0, "aclk_cci_pre", mux_aclk_cci_p, CLK_IGNORE_UNUSED, 664 + RK3399_CLKSEL_CON(5), 6, 2, MFLAGS, 0, 5, DFLAGS, 665 + RK3399_CLKGATE_CON(2), 4, GFLAGS), 666 + 667 + GATE(ACLK_ADB400M_PD_CORE_L, "aclk_adb400m_pd_core_l", "aclk_cci_pre", CLK_IGNORE_UNUSED, 668 + RK3399_CLKGATE_CON(15), 0, GFLAGS), 669 + GATE(ACLK_ADB400M_PD_CORE_B, "aclk_adb400m_pd_core_b", "aclk_cci_pre", CLK_IGNORE_UNUSED, 670 + RK3399_CLKGATE_CON(15), 1, GFLAGS), 671 + GATE(ACLK_CCI, "aclk_cci", "aclk_cci_pre", CLK_IGNORE_UNUSED, 672 + RK3399_CLKGATE_CON(15), 2, GFLAGS), 673 + GATE(ACLK_CCI_NOC0, "aclk_cci_noc0", "aclk_cci_pre", CLK_IGNORE_UNUSED, 674 + RK3399_CLKGATE_CON(15), 3, GFLAGS), 675 + GATE(ACLK_CCI_NOC1, "aclk_cci_noc1", "aclk_cci_pre", CLK_IGNORE_UNUSED, 676 + RK3399_CLKGATE_CON(15), 4, GFLAGS), 677 + GATE(ACLK_CCI_GRF, "aclk_cci_grf", "aclk_cci_pre", CLK_IGNORE_UNUSED, 678 + RK3399_CLKGATE_CON(15), 7, GFLAGS), 679 + 680 + GATE(0, "cpll_cci_trace", "cpll", CLK_IGNORE_UNUSED, 681 + RK3399_CLKGATE_CON(2), 5, GFLAGS), 682 + GATE(0, "gpll_cci_trace", "gpll", CLK_IGNORE_UNUSED, 683 + RK3399_CLKGATE_CON(2), 6, GFLAGS), 684 + COMPOSITE(SCLK_CCI_TRACE, "clk_cci_trace", mux_cci_trace_p, CLK_IGNORE_UNUSED, 685 + RK3399_CLKSEL_CON(5), 15, 2, MFLAGS, 8, 5, DFLAGS, 686 + RK3399_CLKGATE_CON(2), 7, GFLAGS), 687 + 688 + GATE(0, "cpll_cs", "cpll", CLK_IGNORE_UNUSED, 689 + RK3399_CLKGATE_CON(2), 8, GFLAGS), 690 + GATE(0, "gpll_cs", "gpll", CLK_IGNORE_UNUSED, 691 + RK3399_CLKGATE_CON(2), 9, GFLAGS), 692 + GATE(0, "npll_cs", "npll", CLK_IGNORE_UNUSED, 693 + RK3399_CLKGATE_CON(2), 10, GFLAGS), 694 + COMPOSITE_NOGATE(0, "clk_cs", mux_cs_p, CLK_IGNORE_UNUSED, 695 + RK3399_CLKSEL_CON(4), 6, 2, MFLAGS, 0, 5, DFLAGS), 696 + GATE(0, "clk_dbg_cxcs", "clk_cs", CLK_IGNORE_UNUSED, 697 + RK3399_CLKGATE_CON(15), 5, GFLAGS), 698 + GATE(0, "clk_dbg_noc", "clk_cs", CLK_IGNORE_UNUSED, 699 + RK3399_CLKGATE_CON(15), 6, GFLAGS), 700 + 701 + /* vcodec */ 702 + COMPOSITE(0, "aclk_vcodec_pre", mux_pll_src_cpll_gpll_npll_ppll_p, 0, 703 + RK3399_CLKSEL_CON(7), 6, 2, MFLAGS, 0, 5, DFLAGS, 704 + RK3399_CLKGATE_CON(4), 0, GFLAGS), 705 + COMPOSITE_NOMUX(0, "hclk_vcodec_pre", "aclk_vcodec_pre", 0, 706 + RK3399_CLKSEL_CON(7), 8, 5, DFLAGS, 707 + RK3399_CLKGATE_CON(4), 1, GFLAGS), 708 + GATE(HCLK_VCODEC, "hclk_vcodec", "hclk_vcodec_pre", CLK_IGNORE_UNUSED, 709 + RK3399_CLKGATE_CON(17), 2, GFLAGS), 710 + GATE(0, "hclk_vcodec_noc", "hclk_vcodec_pre", CLK_IGNORE_UNUSED, 711 + RK3399_CLKGATE_CON(17), 3, GFLAGS), 712 + 713 + GATE(ACLK_VCODEC, "aclk_vcodec", "aclk_vcodec_pre", CLK_IGNORE_UNUSED, 714 + RK3399_CLKGATE_CON(17), 0, GFLAGS), 715 + GATE(0, "aclk_vcodec_noc", "aclk_vcodec_pre", CLK_IGNORE_UNUSED, 716 + RK3399_CLKGATE_CON(17), 1, GFLAGS), 717 + 718 + /* vdu */ 719 + COMPOSITE(SCLK_VDU_CORE, "clk_vdu_core", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 720 + RK3399_CLKSEL_CON(9), 6, 2, MFLAGS, 0, 5, DFLAGS, 721 + RK3399_CLKGATE_CON(4), 4, GFLAGS), 722 + COMPOSITE(SCLK_VDU_CA, "clk_vdu_ca", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 723 + RK3399_CLKSEL_CON(9), 14, 2, MFLAGS, 8, 5, DFLAGS, 724 + RK3399_CLKGATE_CON(4), 5, GFLAGS), 725 + 726 + COMPOSITE(0, "aclk_vdu_pre", mux_pll_src_cpll_gpll_npll_ppll_p, 0, 727 + RK3399_CLKSEL_CON(8), 6, 2, MFLAGS, 0, 5, DFLAGS, 728 + RK3399_CLKGATE_CON(4), 2, GFLAGS), 729 + COMPOSITE_NOMUX(0, "hclk_vdu_pre", "aclk_vdu_pre", 0, 730 + RK3399_CLKSEL_CON(8), 8, 5, DFLAGS, 731 + RK3399_CLKGATE_CON(4), 3, GFLAGS), 732 + GATE(HCLK_VDU, "hclk_vdu", "hclk_vdu_pre", CLK_IGNORE_UNUSED, 733 + RK3399_CLKGATE_CON(17), 10, GFLAGS), 734 + GATE(HCLK_VDU_NOC, "hclk_vdu_noc", "hclk_vdu_pre", CLK_IGNORE_UNUSED, 735 + RK3399_CLKGATE_CON(17), 11, GFLAGS), 736 + 737 + GATE(ACLK_VDU, "aclk_vdu", "aclk_vdu_pre", CLK_IGNORE_UNUSED, 738 + RK3399_CLKGATE_CON(17), 8, GFLAGS), 739 + GATE(ACLK_VDU_NOC, "aclk_vdu_noc", "aclk_vdu_pre", CLK_IGNORE_UNUSED, 740 + RK3399_CLKGATE_CON(17), 9, GFLAGS), 741 + 742 + /* iep */ 743 + COMPOSITE(0, "aclk_iep_pre", mux_pll_src_cpll_gpll_npll_ppll_p, CLK_IGNORE_UNUSED, 744 + RK3399_CLKSEL_CON(10), 6, 2, MFLAGS, 0, 5, DFLAGS, 745 + RK3399_CLKGATE_CON(4), 6, GFLAGS), 746 + COMPOSITE_NOMUX(0, "hclk_iep_pre", "aclk_iep_pre", 0, 747 + RK3399_CLKSEL_CON(10), 8, 5, DFLAGS, 748 + RK3399_CLKGATE_CON(4), 7, GFLAGS), 749 + GATE(HCLK_IEP, "hclk_iep", "hclk_iep_pre", CLK_IGNORE_UNUSED, 750 + RK3399_CLKGATE_CON(16), 2, GFLAGS), 751 + GATE(HCLK_IEP_NOC, "hclk_iep_noc", "hclk_iep_pre", CLK_IGNORE_UNUSED, 752 + RK3399_CLKGATE_CON(16), 3, GFLAGS), 753 + 754 + GATE(ACLK_IEP, "aclk_iep", "aclk_iep_pre", CLK_IGNORE_UNUSED, 755 + RK3399_CLKGATE_CON(16), 0, GFLAGS), 756 + GATE(ACLK_IEP_NOC, "aclk_iep_noc", "aclk_iep_pre", CLK_IGNORE_UNUSED, 757 + RK3399_CLKGATE_CON(16), 1, GFLAGS), 758 + 759 + /* rga */ 760 + COMPOSITE(0, "clk_rga_core", mux_pll_src_cpll_gpll_npll_ppll_p, CLK_IGNORE_UNUSED, 761 + RK3399_CLKSEL_CON(12), 6, 2, MFLAGS, 0, 5, DFLAGS, 762 + RK3399_CLKGATE_CON(4), 10, GFLAGS), 763 + 764 + COMPOSITE(0, "aclk_rga_pre", mux_pll_src_cpll_gpll_npll_ppll_p, CLK_IGNORE_UNUSED, 765 + RK3399_CLKSEL_CON(11), 6, 2, MFLAGS, 0, 5, DFLAGS, 766 + RK3399_CLKGATE_CON(4), 8, GFLAGS), 767 + COMPOSITE_NOMUX(0, "hclk_rga_pre", "aclk_rga_pre", 0, 768 + RK3399_CLKSEL_CON(11), 8, 5, DFLAGS, 769 + RK3399_CLKGATE_CON(4), 9, GFLAGS), 770 + GATE(HCLK_RGA, "hclk_rga", "hclk_rga_pre", CLK_IGNORE_UNUSED, 771 + RK3399_CLKGATE_CON(16), 10, GFLAGS), 772 + GATE(HCLK_RGA_NOC, "hclk_rga_noc", "hclk_rga_pre", CLK_IGNORE_UNUSED, 773 + RK3399_CLKGATE_CON(16), 11, GFLAGS), 774 + 775 + GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", CLK_IGNORE_UNUSED, 776 + RK3399_CLKGATE_CON(16), 8, GFLAGS), 777 + GATE(ACLK_RGA_NOC, "aclk_rga_noc", "aclk_rga_pre", CLK_IGNORE_UNUSED, 778 + RK3399_CLKGATE_CON(16), 9, GFLAGS), 779 + 780 + /* center */ 781 + COMPOSITE(0, "aclk_center", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 782 + RK3399_CLKSEL_CON(12), 14, 2, MFLAGS, 8, 5, DFLAGS, 783 + RK3399_CLKGATE_CON(3), 7, GFLAGS), 784 + GATE(ACLK_CENTER_MAIN_NOC, "aclk_center_main_noc", "aclk_center", CLK_IGNORE_UNUSED, 785 + RK3399_CLKGATE_CON(19), 0, GFLAGS), 786 + GATE(ACLK_CENTER_PERI_NOC, "aclk_center_peri_noc", "aclk_center", CLK_IGNORE_UNUSED, 787 + RK3399_CLKGATE_CON(19), 1, GFLAGS), 788 + 789 + /* gpu */ 790 + COMPOSITE(0, "aclk_gpu_pre", mux_pll_src_ppll_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 791 + RK3399_CLKSEL_CON(13), 5, 3, MFLAGS, 0, 5, DFLAGS, 792 + RK3399_CLKGATE_CON(13), 0, GFLAGS), 793 + GATE(ACLK_GPU, "aclk_gpu", "aclk_gpu_pre", CLK_IGNORE_UNUSED, 794 + RK3399_CLKGATE_CON(30), 8, GFLAGS), 795 + GATE(ACLK_PERF_GPU, "aclk_perf_gpu", "aclk_gpu_pre", CLK_IGNORE_UNUSED, 796 + RK3399_CLKGATE_CON(30), 10, GFLAGS), 797 + GATE(ACLK_GPU_GRF, "aclk_gpu_grf", "aclk_gpu_pre", CLK_IGNORE_UNUSED, 798 + RK3399_CLKGATE_CON(30), 11, GFLAGS), 799 + GATE(SCLK_PVTM_GPU, "aclk_pvtm_gpu", "xin24m", CLK_IGNORE_UNUSED, 800 + RK3399_CLKGATE_CON(13), 1, GFLAGS), 801 + 802 + /* perihp */ 803 + GATE(0, "cpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED, 804 + RK3399_CLKGATE_CON(5), 0, GFLAGS), 805 + GATE(0, "gpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED, 806 + RK3399_CLKGATE_CON(5), 1, GFLAGS), 807 + COMPOSITE(ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_p, CLK_IGNORE_UNUSED, 808 + RK3399_CLKSEL_CON(14), 7, 1, MFLAGS, 0, 5, DFLAGS, 809 + RK3399_CLKGATE_CON(5), 2, GFLAGS), 810 + COMPOSITE_NOMUX(HCLK_PERIHP, "hclk_perihp", "aclk_perihp", CLK_IGNORE_UNUSED, 811 + RK3399_CLKSEL_CON(14), 8, 2, DFLAGS, 812 + RK3399_CLKGATE_CON(5), 3, GFLAGS), 813 + COMPOSITE_NOMUX(PCLK_PERIHP, "pclk_perihp", "aclk_perihp", CLK_IGNORE_UNUSED, 814 + RK3399_CLKSEL_CON(14), 12, 2, DFLAGS, 815 + RK3399_CLKGATE_CON(5), 4, GFLAGS), 816 + 817 + GATE(ACLK_PERF_PCIE, "aclk_perf_pcie", "aclk_perihp", CLK_IGNORE_UNUSED, 818 + RK3399_CLKGATE_CON(20), 2, GFLAGS), 819 + GATE(ACLK_PCIE, "aclk_pcie", "aclk_perihp", CLK_IGNORE_UNUSED, 820 + RK3399_CLKGATE_CON(20), 10, GFLAGS), 821 + GATE(0, "aclk_perihp_noc", "aclk_perihp", CLK_IGNORE_UNUSED, 822 + RK3399_CLKGATE_CON(20), 12, GFLAGS), 823 + 824 + GATE(HCLK_HOST0, "hclk_host0", "hclk_perihp", CLK_IGNORE_UNUSED, 825 + RK3399_CLKGATE_CON(20), 5, GFLAGS), 826 + GATE(HCLK_HOST0_ARB, "hclk_host0_arb", "hclk_perihp", CLK_IGNORE_UNUSED, 827 + RK3399_CLKGATE_CON(20), 6, GFLAGS), 828 + GATE(HCLK_HOST1, "hclk_host1", "hclk_perihp", CLK_IGNORE_UNUSED, 829 + RK3399_CLKGATE_CON(20), 7, GFLAGS), 830 + GATE(HCLK_HOST1_ARB, "hclk_host1_arb", "hclk_perihp", CLK_IGNORE_UNUSED, 831 + RK3399_CLKGATE_CON(20), 8, GFLAGS), 832 + GATE(HCLK_HSIC, "hclk_hsic", "hclk_perihp", CLK_IGNORE_UNUSED, 833 + RK3399_CLKGATE_CON(20), 9, GFLAGS), 834 + GATE(0, "hclk_perihp_noc", "hclk_perihp", CLK_IGNORE_UNUSED, 835 + RK3399_CLKGATE_CON(20), 13, GFLAGS), 836 + GATE(0, "hclk_ahb1tom", "hclk_perihp", CLK_IGNORE_UNUSED, 837 + RK3399_CLKGATE_CON(20), 15, GFLAGS), 838 + 839 + GATE(PCLK_PERIHP_GRF, "pclk_perihp_grf", "pclk_perihp", CLK_IGNORE_UNUSED, 840 + RK3399_CLKGATE_CON(20), 4, GFLAGS), 841 + GATE(PCLK_PCIE, "pclk_pcie", "pclk_perihp", CLK_IGNORE_UNUSED, 842 + RK3399_CLKGATE_CON(20), 11, GFLAGS), 843 + GATE(0, "pclk_perihp_noc", "pclk_perihp", CLK_IGNORE_UNUSED, 844 + RK3399_CLKGATE_CON(20), 14, GFLAGS), 845 + GATE(PCLK_HSICPHY, "pclk_hsicphy", "pclk_perihp", CLK_IGNORE_UNUSED, 846 + RK3399_CLKGATE_CON(31), 8, GFLAGS), 847 + 848 + /* sdio & sdmmc */ 849 + COMPOSITE(0, "hclk_sd", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 850 + RK3399_CLKSEL_CON(13), 15, 1, MFLAGS, 8, 5, DFLAGS, 851 + RK3399_CLKGATE_CON(12), 13, GFLAGS), 852 + GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_sd", CLK_IGNORE_UNUSED, 853 + RK3399_CLKGATE_CON(33), 8, GFLAGS), 854 + GATE(0, "hclk_sdmmc_noc", "hclk_sd", CLK_IGNORE_UNUSED, 855 + RK3399_CLKGATE_CON(33), 9, GFLAGS), 856 + 857 + COMPOSITE(SCLK_SDIO, "clk_sdio", mux_pll_src_cpll_gpll_npll_ppll_upll_24m_p, CLK_IGNORE_UNUSED, 858 + RK3399_CLKSEL_CON(15), 8, 3, MFLAGS, 0, 7, DFLAGS, 859 + RK3399_CLKGATE_CON(6), 0, GFLAGS), 860 + 861 + COMPOSITE(SCLK_SDMMC, "clk_sdmmc", mux_pll_src_cpll_gpll_npll_ppll_upll_24m_p, CLK_IGNORE_UNUSED, 862 + RK3399_CLKSEL_CON(16), 8, 3, MFLAGS, 0, 7, DFLAGS, 863 + RK3399_CLKGATE_CON(6), 1, GFLAGS), 864 + 865 + MMC(SCLK_SDMMC_DRV, "emmc_drv", "clk_sdmmc", RK3399_SDMMC_CON0, 1), 866 + MMC(SCLK_SDMMC_SAMPLE, "emmc_sample", "clk_sdmmc", RK3399_SDMMC_CON1, 1), 867 + 868 + MMC(SCLK_SDIO_DRV, "sdio_drv", "clk_sdio", RK3399_SDIO_CON0, 1), 869 + MMC(SCLK_SDIO_SAMPLE, "sdio_sample", "clk_sdio", RK3399_SDIO_CON1, 1), 870 + 871 + /* pcie */ 872 + COMPOSITE(SCLK_PCIE_PM, "clk_pcie_pm", mux_pll_src_cpll_gpll_npll_24m_p, CLK_IGNORE_UNUSED, 873 + RK3399_CLKSEL_CON(17), 8, 3, MFLAGS, 0, 7, DFLAGS, 874 + RK3399_CLKGATE_CON(6), 2, GFLAGS), 875 + 876 + COMPOSITE_NOMUX(0, "clk_pciephy_ref100m", "npll", CLK_IGNORE_UNUSED, 877 + RK3399_CLKSEL_CON(18), 11, 5, DFLAGS, 878 + RK3399_CLKGATE_CON(12), 6, GFLAGS), 879 + MUX(SCLK_PCIEPHY_REF, "clk_pciephy_ref", mux_pll_src_24m_pciephy_p, CLK_SET_RATE_PARENT, 880 + RK3399_CLKSEL_CON(18), 10, 1, MFLAGS), 881 + 882 + COMPOSITE(0, "clk_pcie_core_cru", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 883 + RK3399_CLKSEL_CON(18), 8, 2, MFLAGS, 0, 7, DFLAGS, 884 + RK3399_CLKGATE_CON(6), 3, GFLAGS), 885 + MUX(SCLK_PCIE_CORE, "clk_pcie_core", mux_pciecore_cru_phy_p, CLK_SET_RATE_PARENT, 886 + RK3399_CLKSEL_CON(18), 7, 1, MFLAGS), 887 + 888 + /* emmc */ 889 + COMPOSITE(SCLK_EMMC, "clk_emmc", mux_pll_src_cpll_gpll_npll_upll_24m_p, CLK_IGNORE_UNUSED, 890 + RK3399_CLKSEL_CON(22), 8, 3, MFLAGS, 0, 7, DFLAGS, 891 + RK3399_CLKGATE_CON(6), 14, GFLAGS), 892 + 893 + GATE(0, "cpll_aclk_emmc_src", "cpll", CLK_IGNORE_UNUSED, 894 + RK3399_CLKGATE_CON(6), 12, GFLAGS), 895 + GATE(0, "gpll_aclk_emmc_src", "gpll", CLK_IGNORE_UNUSED, 896 + RK3399_CLKGATE_CON(6), 13, GFLAGS), 897 + COMPOSITE_NOGATE(ACLK_EMMC, "aclk_emmc", mux_aclk_emmc_p, CLK_IGNORE_UNUSED, 898 + RK3399_CLKSEL_CON(21), 7, 1, MFLAGS, 0, 5, DFLAGS), 899 + GATE(ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", CLK_IGNORE_UNUSED, 900 + RK3399_CLKGATE_CON(32), 8, GFLAGS), 901 + GATE(ACLK_EMMC_NOC, "aclk_emmc_noc", "aclk_emmc", CLK_IGNORE_UNUSED, 902 + RK3399_CLKGATE_CON(32), 9, GFLAGS), 903 + GATE(ACLK_EMMC_GRF, "aclk_emmcgrf", "aclk_emmc", CLK_IGNORE_UNUSED, 904 + RK3399_CLKGATE_CON(32), 10, GFLAGS), 905 + 906 + /* perilp0 */ 907 + GATE(0, "cpll_aclk_perilp0_src", "cpll", CLK_IGNORE_UNUSED, 908 + RK3399_CLKGATE_CON(7), 1, GFLAGS), 909 + GATE(0, "gpll_aclk_perilp0_src", "gpll", CLK_IGNORE_UNUSED, 910 + RK3399_CLKGATE_CON(7), 0, GFLAGS), 911 + COMPOSITE(ACLK_PERILP0, "aclk_perilp0", mux_aclk_perilp0_p, CLK_IGNORE_UNUSED, 912 + RK3399_CLKSEL_CON(23), 7, 1, MFLAGS, 0, 5, DFLAGS, 913 + RK3399_CLKGATE_CON(7), 2, GFLAGS), 914 + COMPOSITE_NOMUX(HCLK_PERILP0, "hclk_perilp0", "aclk_perilp0", CLK_IGNORE_UNUSED, 915 + RK3399_CLKSEL_CON(23), 8, 2, DFLAGS, 916 + RK3399_CLKGATE_CON(7), 3, GFLAGS), 917 + COMPOSITE_NOMUX(PCLK_PERILP0, "pclk_perilp0", "aclk_perilp0", 0, 918 + RK3399_CLKSEL_CON(23), 12, 3, DFLAGS, 919 + RK3399_CLKGATE_CON(7), 4, GFLAGS), 920 + 921 + /* aclk_perilp0 gates */ 922 + GATE(ACLK_INTMEM, "aclk_intmem", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 0, GFLAGS), 923 + GATE(ACLK_TZMA, "aclk_tzma", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 1, GFLAGS), 924 + GATE(SCLK_INTMEM0, "clk_intmem0", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 2, GFLAGS), 925 + GATE(SCLK_INTMEM1, "clk_intmem1", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 3, GFLAGS), 926 + GATE(SCLK_INTMEM2, "clk_intmem2", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 4, GFLAGS), 927 + GATE(SCLK_INTMEM3, "clk_intmem3", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 5, GFLAGS), 928 + GATE(SCLK_INTMEM4, "clk_intmem4", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 6, GFLAGS), 929 + GATE(SCLK_INTMEM5, "clk_intmem5", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 7, GFLAGS), 930 + GATE(ACLK_DCF, "aclk_dcf", "aclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 8, GFLAGS), 931 + GATE(ACLK_DMAC0_PERILP, "aclk_dmac0_perilp", "aclk_perilp0", 0, RK3399_CLKGATE_CON(25), 5, GFLAGS), 932 + GATE(ACLK_DMAC1_PERILP, "aclk_dmac1_perilp", "aclk_perilp0", 0, RK3399_CLKGATE_CON(25), 6, GFLAGS), 933 + GATE(ACLK_PERILP0_NOC, "aclk_perilp0_noc", "aclk_perilp0", 0, RK3399_CLKGATE_CON(25), 7, GFLAGS), 934 + 935 + /* hclk_perilp0 gates */ 936 + GATE(HCLK_ROM, "hclk_rom", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 4, GFLAGS), 937 + GATE(HCLK_M_CRYPTO0, "hclk_m_crypto0", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 5, GFLAGS), 938 + GATE(HCLK_S_CRYPTO0, "hclk_s_crypto0", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 6, GFLAGS), 939 + GATE(HCLK_M_CRYPTO1, "hclk_m_crypto1", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 14, GFLAGS), 940 + GATE(HCLK_S_CRYPTO1, "hclk_s_crypto1", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 15, GFLAGS), 941 + GATE(HCLK_PERILP0_NOC, "hclk_perilp0_noc", "hclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(25), 8, GFLAGS), 942 + 943 + /* pclk_perilp0 gates */ 944 + GATE(PCLK_DCF, "pclk_dcf", "pclk_perilp0", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(23), 9, GFLAGS), 945 + 946 + /* crypto */ 947 + COMPOSITE(SCLK_CRYPTO0, "clk_crypto0", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 948 + RK3399_CLKSEL_CON(24), 6, 2, MFLAGS, 0, 5, DFLAGS, 949 + RK3399_CLKGATE_CON(7), 7, GFLAGS), 950 + 951 + COMPOSITE(SCLK_CRYPTO1, "clk_crypto1", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 952 + RK3399_CLKSEL_CON(26), 6, 2, MFLAGS, 0, 5, DFLAGS, 953 + RK3399_CLKGATE_CON(7), 8, GFLAGS), 954 + 955 + /* cm0s_perilp */ 956 + GATE(0, "cpll_fclk_cm0s_src", "cpll", CLK_IGNORE_UNUSED, 957 + RK3399_CLKGATE_CON(7), 6, GFLAGS), 958 + GATE(0, "gpll_fclk_cm0s_src", "gpll", CLK_IGNORE_UNUSED, 959 + RK3399_CLKGATE_CON(7), 5, GFLAGS), 960 + COMPOSITE(FCLK_CM0S, "fclk_cm0s", mux_fclk_cm0s_p, CLK_IGNORE_UNUSED, 961 + RK3399_CLKSEL_CON(24), 15, 1, MFLAGS, 8, 5, DFLAGS, 962 + RK3399_CLKGATE_CON(7), 9, GFLAGS), 963 + 964 + /* fclk_cm0s gates */ 965 + GATE(SCLK_M0_PERILP, "sclk_m0_perilp", "fclk_cm0s", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 8, GFLAGS), 966 + GATE(HCLK_M0_PERILP, "hclk_m0_perilp", "fclk_cm0s", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 9, GFLAGS), 967 + GATE(DCLK_M0_PERILP, "dclk_m0_perilp", "fclk_cm0s", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 10, GFLAGS), 968 + GATE(SCLK_M0_PERILP_DEC, "clk_m0_perilp_dec", "fclk_cm0s", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(24), 11, GFLAGS), 969 + GATE(HCLK_M0_PERILP_NOC, "hclk_m0_perilp_noc", "fclk_cm0s", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(25), 11, GFLAGS), 970 + 971 + /* perilp1 */ 972 + GATE(0, "cpll_hclk_perilp1_src", "cpll", CLK_IGNORE_UNUSED, 973 + RK3399_CLKGATE_CON(8), 1, GFLAGS), 974 + GATE(0, "gpll_hclk_perilp1_src", "gpll", CLK_IGNORE_UNUSED, 975 + RK3399_CLKGATE_CON(8), 0, GFLAGS), 976 + COMPOSITE_NOGATE(HCLK_PERILP1, "hclk_perilp1", mux_hclk_perilp1_p, CLK_IGNORE_UNUSED, 977 + RK3399_CLKSEL_CON(25), 7, 1, MFLAGS, 0, 5, DFLAGS), 978 + COMPOSITE_NOMUX(PCLK_PERILP1, "pclk_perilp1", "hclk_perilp1", CLK_IGNORE_UNUSED, 979 + RK3399_CLKSEL_CON(25), 8, 3, DFLAGS, 980 + RK3399_CLKGATE_CON(8), 2, GFLAGS), 981 + 982 + /* hclk_perilp1 gates */ 983 + GATE(0, "hclk_perilp1_noc", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(25), 9, GFLAGS), 984 + GATE(0, "hclk_sdio_noc", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(25), 12, GFLAGS), 985 + GATE(HCLK_I2S0_8CH, "hclk_i2s0", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 0, GFLAGS), 986 + GATE(HCLK_I2S1_8CH, "hclk_i2s1", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 1, GFLAGS), 987 + GATE(HCLK_I2S2_8CH, "hclk_i2s2", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 2, GFLAGS), 988 + GATE(HCLK_SPDIF, "hclk_spdif", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 3, GFLAGS), 989 + GATE(HCLK_SDIO, "hclk_sdio", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 4, GFLAGS), 990 + GATE(PCLK_SPI5, "pclk_spi5", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 5, GFLAGS), 991 + GATE(0, "hclk_sdioaudio_noc", "hclk_perilp1", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(34), 6, GFLAGS), 992 + 993 + /* pclk_perilp1 gates */ 994 + GATE(PCLK_UART0, "pclk_uart0", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 0, GFLAGS), 995 + GATE(PCLK_UART1, "pclk_uart1", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 1, GFLAGS), 996 + GATE(PCLK_UART2, "pclk_uart2", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 2, GFLAGS), 997 + GATE(PCLK_UART3, "pclk_uart3", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 3, GFLAGS), 998 + GATE(PCLK_I2C7, "pclk_rki2c7", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 5, GFLAGS), 999 + GATE(PCLK_I2C1, "pclk_rki2c1", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 6, GFLAGS), 1000 + GATE(PCLK_I2C5, "pclk_rki2c5", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 7, GFLAGS), 1001 + GATE(PCLK_I2C6, "pclk_rki2c6", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 8, GFLAGS), 1002 + GATE(PCLK_I2C2, "pclk_rki2c2", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 9, GFLAGS), 1003 + GATE(PCLK_I2C3, "pclk_rki2c3", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 10, GFLAGS), 1004 + GATE(PCLK_MAILBOX0, "pclk_mailbox0", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 11, GFLAGS), 1005 + GATE(PCLK_SARADC, "pclk_saradc", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 12, GFLAGS), 1006 + GATE(PCLK_TSADC, "pclk_tsadc", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 13, GFLAGS), 1007 + GATE(PCLK_EFUSE1024NS, "pclk_efuse1024ns", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 14, GFLAGS), 1008 + GATE(PCLK_EFUSE1024S, "pclk_efuse1024s", "pclk_perilp1", 0, RK3399_CLKGATE_CON(22), 15, GFLAGS), 1009 + GATE(PCLK_SPI0, "pclk_spi0", "pclk_perilp1", 0, RK3399_CLKGATE_CON(23), 10, GFLAGS), 1010 + GATE(PCLK_SPI1, "pclk_spi1", "pclk_perilp1", 0, RK3399_CLKGATE_CON(23), 11, GFLAGS), 1011 + GATE(PCLK_SPI2, "pclk_spi2", "pclk_perilp1", 0, RK3399_CLKGATE_CON(23), 12, GFLAGS), 1012 + GATE(PCLK_SPI4, "pclk_spi4", "pclk_perilp1", 0, RK3399_CLKGATE_CON(23), 13, GFLAGS), 1013 + GATE(PCLK_PERIHP_GRF, "pclk_perilp_sgrf", "pclk_perilp1", 0, RK3399_CLKGATE_CON(24), 13, GFLAGS), 1014 + GATE(0, "pclk_perilp1_noc", "pclk_perilp1", 0, RK3399_CLKGATE_CON(25), 10, GFLAGS), 1015 + 1016 + /* saradc */ 1017 + COMPOSITE_NOMUX(SCLK_SARADC, "clk_saradc", "xin24m", 0, 1018 + RK3399_CLKSEL_CON(26), 8, 8, DFLAGS, 1019 + RK3399_CLKGATE_CON(9), 11, GFLAGS), 1020 + 1021 + /* tsadc */ 1022 + COMPOSITE(SCLK_TSADC, "clk_tsadc", mux_pll_p, CLK_IGNORE_UNUSED, 1023 + RK3399_CLKSEL_CON(27), 15, 1, MFLAGS, 0, 10, DFLAGS, 1024 + RK3399_CLKGATE_CON(9), 10, GFLAGS), 1025 + 1026 + /* cif_testout */ 1027 + MUX(0, "clk_testout1_pll_src", mux_pll_src_cpll_gpll_npll_p, 0, 1028 + RK3399_CLKSEL_CON(38), 6, 2, MFLAGS), 1029 + COMPOSITE(0, "clk_testout1", mux_clk_testout1_p, 0, 1030 + RK3399_CLKSEL_CON(38), 5, 1, MFLAGS, 0, 5, DFLAGS, 1031 + RK3399_CLKGATE_CON(13), 14, GFLAGS), 1032 + 1033 + MUX(0, "clk_testout2_pll_src", mux_pll_src_cpll_gpll_npll_p, 0, 1034 + RK3399_CLKSEL_CON(38), 14, 2, MFLAGS), 1035 + COMPOSITE(0, "clk_testout2", mux_clk_testout2_p, 0, 1036 + RK3399_CLKSEL_CON(38), 13, 1, MFLAGS, 8, 5, DFLAGS, 1037 + RK3399_CLKGATE_CON(13), 15, GFLAGS), 1038 + 1039 + /* vio */ 1040 + COMPOSITE(ACLK_VIO, "aclk_vio", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 1041 + RK3399_CLKSEL_CON(42), 6, 2, MFLAGS, 0, 5, DFLAGS, 1042 + RK3399_CLKGATE_CON(11), 10, GFLAGS), 1043 + COMPOSITE_NOMUX(PCLK_VIO, "pclk_vio", "aclk_vio", 0, 1044 + RK3399_CLKSEL_CON(43), 0, 5, DFLAGS, 1045 + RK3399_CLKGATE_CON(11), 1, GFLAGS), 1046 + 1047 + GATE(ACLK_VIO_NOC, "aclk_vio_noc", "aclk_vio", CLK_IGNORE_UNUSED, 1048 + RK3399_CLKGATE_CON(29), 0, GFLAGS), 1049 + 1050 + GATE(PCLK_MIPI_DSI0, "pclk_mipi_dsi0", "pclk_vio", CLK_IGNORE_UNUSED, 1051 + RK3399_CLKGATE_CON(29), 1, GFLAGS), 1052 + GATE(PCLK_MIPI_DSI1, "pclk_mipi_dsi1", "pclk_vio", CLK_IGNORE_UNUSED, 1053 + RK3399_CLKGATE_CON(29), 2, GFLAGS), 1054 + GATE(PCLK_VIO_GRF, "pclk_vio_grf", "pclk_vio", CLK_IGNORE_UNUSED, 1055 + RK3399_CLKGATE_CON(29), 12, GFLAGS), 1056 + 1057 + /* hdcp */ 1058 + COMPOSITE(ACLK_HDCP, "aclk_hdcp", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 1059 + RK3399_CLKSEL_CON(42), 14, 2, MFLAGS, 8, 5, DFLAGS, 1060 + RK3399_CLKGATE_CON(11), 12, GFLAGS), 1061 + COMPOSITE_NOMUX(HCLK_HDCP, "hclk_hdcp", "aclk_hdcp", CLK_IGNORE_UNUSED, 1062 + RK3399_CLKSEL_CON(43), 5, 5, DFLAGS, 1063 + RK3399_CLKGATE_CON(11), 3, GFLAGS), 1064 + COMPOSITE_NOMUX(PCLK_HDCP, "pclk_hdcp", "aclk_hdcp", CLK_IGNORE_UNUSED, 1065 + RK3399_CLKSEL_CON(43), 10, 5, DFLAGS, 1066 + RK3399_CLKGATE_CON(11), 10, GFLAGS), 1067 + 1068 + GATE(ACLK_HDCP_NOC, "aclk_hdcp_noc", "aclk_hdcp", CLK_IGNORE_UNUSED, 1069 + RK3399_CLKGATE_CON(29), 4, GFLAGS), 1070 + GATE(ACLK_HDCP22, "aclk_hdcp22", "aclk_hdcp", CLK_IGNORE_UNUSED, 1071 + RK3399_CLKGATE_CON(29), 10, GFLAGS), 1072 + 1073 + GATE(HCLK_HDCP_NOC, "hclk_hdcp_noc", "hclk_hdcp", CLK_IGNORE_UNUSED, 1074 + RK3399_CLKGATE_CON(29), 5, GFLAGS), 1075 + GATE(HCLK_HDCP22, "hclk_hdcp22", "hclk_hdcp", CLK_IGNORE_UNUSED, 1076 + RK3399_CLKGATE_CON(29), 9, GFLAGS), 1077 + 1078 + GATE(PCLK_HDCP_NOC, "pclk_hdcp_noc", "pclk_hdcp", CLK_IGNORE_UNUSED, 1079 + RK3399_CLKGATE_CON(29), 3, GFLAGS), 1080 + GATE(PCLK_HDMI_CTRL, "pclk_hdmi_ctrl", "pclk_hdcp", CLK_IGNORE_UNUSED, 1081 + RK3399_CLKGATE_CON(29), 6, GFLAGS), 1082 + GATE(PCLK_DP_CTRL, "pclk_dp_ctrl", "pclk_hdcp", CLK_IGNORE_UNUSED, 1083 + RK3399_CLKGATE_CON(29), 7, GFLAGS), 1084 + GATE(PCLK_HDCP22, "pclk_hdcp22", "pclk_hdcp", CLK_IGNORE_UNUSED, 1085 + RK3399_CLKGATE_CON(29), 8, GFLAGS), 1086 + GATE(PCLK_GASKET, "pclk_gasket", "pclk_hdcp", CLK_IGNORE_UNUSED, 1087 + RK3399_CLKGATE_CON(29), 11, GFLAGS), 1088 + 1089 + /* edp */ 1090 + COMPOSITE(SCLK_DP_CORE, "clk_dp_core", mux_pll_src_npll_cpll_gpll_p, CLK_IGNORE_UNUSED, 1091 + RK3399_CLKSEL_CON(46), 6, 2, MFLAGS, 0, 5, DFLAGS, 1092 + RK3399_CLKGATE_CON(11), 8, GFLAGS), 1093 + 1094 + COMPOSITE(PCLK_EDP, "pclk_edp", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 1095 + RK3399_CLKSEL_CON(44), 15, 1, MFLAGS, 8, 5, DFLAGS, 1096 + RK3399_CLKGATE_CON(11), 11, GFLAGS), 1097 + GATE(PCLK_EDP_NOC, "pclk_edp_noc", "pclk_edp", CLK_IGNORE_UNUSED, 1098 + RK3399_CLKGATE_CON(32), 12, GFLAGS), 1099 + GATE(PCLK_EDP_CTRL, "pclk_edp_ctrl", "pclk_edp", CLK_IGNORE_UNUSED, 1100 + RK3399_CLKGATE_CON(32), 13, GFLAGS), 1101 + 1102 + /* hdmi */ 1103 + GATE(SCLK_HDMI_SFR, "clk_hdmi_sfr", "xin24m", CLK_IGNORE_UNUSED, 1104 + RK3399_CLKGATE_CON(11), 6, GFLAGS), 1105 + 1106 + COMPOSITE(SCLK_HDMI_CEC, "clk_hdmi_cec", mux_pll_p, CLK_IGNORE_UNUSED, 1107 + RK3399_CLKSEL_CON(45), 15, 1, MFLAGS, 0, 10, DFLAGS, 1108 + RK3399_CLKGATE_CON(11), 7, GFLAGS), 1109 + 1110 + /* vop0 */ 1111 + COMPOSITE(ACLK_VOP0_PRE, "aclk_vop0_pre", mux_pll_src_vpll_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 1112 + RK3399_CLKSEL_CON(47), 6, 2, MFLAGS, 0, 5, DFLAGS, 1113 + RK3399_CLKGATE_CON(10), 8, GFLAGS), 1114 + COMPOSITE_NOMUX(0, "hclk_vop0_pre", "aclk_vop0_pre", 0, 1115 + RK3399_CLKSEL_CON(47), 8, 5, DFLAGS, 1116 + RK3399_CLKGATE_CON(10), 9, GFLAGS), 1117 + 1118 + GATE(ACLK_VOP0, "aclk_vop0", "aclk_vop0_pre", CLK_IGNORE_UNUSED, 1119 + RK3399_CLKGATE_CON(28), 3, GFLAGS), 1120 + GATE(ACLK_VOP0_NOC, "aclk_vop0_noc", "aclk_vop0_pre", CLK_IGNORE_UNUSED, 1121 + RK3399_CLKGATE_CON(28), 1, GFLAGS), 1122 + 1123 + GATE(HCLK_VOP0, "hclk_vop0", "hclk_vop0_pre", CLK_IGNORE_UNUSED, 1124 + RK3399_CLKGATE_CON(28), 2, GFLAGS), 1125 + GATE(HCLK_VOP0_NOC, "hclk_vop0_noc", "hclk_vop0_pre", CLK_IGNORE_UNUSED, 1126 + RK3399_CLKGATE_CON(28), 0, GFLAGS), 1127 + 1128 + COMPOSITE(DCLK_VOP0_DIV, "dclk_vop0_div", mux_pll_src_vpll_cpll_gpll_p, CLK_IGNORE_UNUSED, 1129 + RK3399_CLKSEL_CON(49), 8, 2, MFLAGS, 0, 8, DFLAGS, 1130 + RK3399_CLKGATE_CON(10), 12, GFLAGS), 1131 + 1132 + COMPOSITE_FRACMUX_NOGATE(0, "dclk_vop0_frac", "dclk_vop0_div", CLK_SET_RATE_PARENT, 1133 + RK3399_CLKSEL_CON(106), 0, 1134 + &rk3399_dclk_vop0_fracmux), 1135 + 1136 + COMPOSITE(SCLK_VOP0_PWM, "clk_vop0_pwm", mux_pll_src_vpll_cpll_gpll_24m_p, CLK_IGNORE_UNUSED, 1137 + RK3399_CLKSEL_CON(51), 6, 2, MFLAGS, 0, 5, DFLAGS, 1138 + RK3399_CLKGATE_CON(10), 14, GFLAGS), 1139 + 1140 + /* vop1 */ 1141 + COMPOSITE(ACLK_VOP1_PRE, "aclk_vop1_pre", mux_pll_src_vpll_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 1142 + RK3399_CLKSEL_CON(48), 6, 2, MFLAGS, 0, 5, DFLAGS, 1143 + RK3399_CLKGATE_CON(10), 10, GFLAGS), 1144 + COMPOSITE_NOMUX(0, "hclk_vop1_pre", "aclk_vop1_pre", 0, 1145 + RK3399_CLKSEL_CON(48), 8, 5, DFLAGS, 1146 + RK3399_CLKGATE_CON(10), 11, GFLAGS), 1147 + 1148 + GATE(ACLK_VOP1, "aclk_vop1", "aclk_vop1_pre", CLK_IGNORE_UNUSED, 1149 + RK3399_CLKGATE_CON(28), 7, GFLAGS), 1150 + GATE(ACLK_VOP1_NOC, "aclk_vop1_noc", "aclk_vop1_pre", CLK_IGNORE_UNUSED, 1151 + RK3399_CLKGATE_CON(28), 5, GFLAGS), 1152 + 1153 + GATE(HCLK_VOP1, "hclk_vop1", "hclk_vop1_pre", CLK_IGNORE_UNUSED, 1154 + RK3399_CLKGATE_CON(28), 6, GFLAGS), 1155 + GATE(HCLK_VOP1_NOC, "hclk_vop1_noc", "hclk_vop1_pre", CLK_IGNORE_UNUSED, 1156 + RK3399_CLKGATE_CON(28), 4, GFLAGS), 1157 + 1158 + COMPOSITE(DCLK_VOP1_DIV, "dclk_vop1_div", mux_pll_src_vpll_cpll_gpll_p, CLK_IGNORE_UNUSED, 1159 + RK3399_CLKSEL_CON(50), 8, 2, MFLAGS, 0, 8, DFLAGS, 1160 + RK3399_CLKGATE_CON(10), 13, GFLAGS), 1161 + 1162 + COMPOSITE_FRACMUX_NOGATE(0, "dclk_vop1_frac", "dclk_vop1_div", CLK_SET_RATE_PARENT, 1163 + RK3399_CLKSEL_CON(107), 0, 1164 + &rk3399_dclk_vop1_fracmux), 1165 + 1166 + COMPOSITE(SCLK_VOP1_PWM, "clk_vop1_pwm", mux_pll_src_vpll_cpll_gpll_24m_p, CLK_IGNORE_UNUSED, 1167 + RK3399_CLKSEL_CON(52), 6, 2, MFLAGS, 0, 5, DFLAGS, 1168 + RK3399_CLKGATE_CON(10), 15, GFLAGS), 1169 + 1170 + /* isp */ 1171 + COMPOSITE(0, "aclk_isp0", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 1172 + RK3399_CLKSEL_CON(53), 6, 2, MFLAGS, 0, 5, DFLAGS, 1173 + RK3399_CLKGATE_CON(12), 8, GFLAGS), 1174 + COMPOSITE_NOMUX(0, "hclk_isp0", "aclk_isp0", 0, 1175 + RK3399_CLKSEL_CON(53), 8, 5, DFLAGS, 1176 + RK3399_CLKGATE_CON(12), 9, GFLAGS), 1177 + 1178 + GATE(ACLK_ISP0_NOC, "aclk_isp0_noc", "aclk_isp0", CLK_IGNORE_UNUSED, 1179 + RK3399_CLKGATE_CON(27), 1, GFLAGS), 1180 + GATE(ACLK_ISP0_WRAPPER, "aclk_isp0_wrapper", "aclk_isp0", CLK_IGNORE_UNUSED, 1181 + RK3399_CLKGATE_CON(27), 5, GFLAGS), 1182 + GATE(HCLK_ISP1_WRAPPER, "hclk_isp1_wrapper", "aclk_isp0", CLK_IGNORE_UNUSED, 1183 + RK3399_CLKGATE_CON(27), 7, GFLAGS), 1184 + 1185 + GATE(HCLK_ISP0_NOC, "hclk_isp0_noc", "hclk_isp0", CLK_IGNORE_UNUSED, 1186 + RK3399_CLKGATE_CON(27), 0, GFLAGS), 1187 + GATE(HCLK_ISP0_WRAPPER, "hclk_isp0_wrapper", "hclk_isp0", CLK_IGNORE_UNUSED, 1188 + RK3399_CLKGATE_CON(27), 4, GFLAGS), 1189 + 1190 + COMPOSITE(SCLK_ISP0, "clk_isp0", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 1191 + RK3399_CLKSEL_CON(55), 6, 2, MFLAGS, 0, 5, DFLAGS, 1192 + RK3399_CLKGATE_CON(11), 4, GFLAGS), 1193 + 1194 + COMPOSITE(ACLK_ISP1, "aclk_isp1", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, 1195 + RK3399_CLKSEL_CON(54), 6, 2, MFLAGS, 0, 5, DFLAGS, 1196 + RK3399_CLKGATE_CON(12), 10, GFLAGS), 1197 + COMPOSITE_NOMUX(0, "hclk_isp1", "aclk_isp1", 0, 1198 + RK3399_CLKSEL_CON(54), 8, 5, DFLAGS, 1199 + RK3399_CLKGATE_CON(12), 11, GFLAGS), 1200 + 1201 + GATE(ACLK_ISP1_NOC, "aclk_isp1_noc", "aclk_isp1", CLK_IGNORE_UNUSED, 1202 + RK3399_CLKGATE_CON(27), 3, GFLAGS), 1203 + 1204 + GATE(HCLK_ISP1_NOC, "hclk_isp1_noc", "hclk_isp1", CLK_IGNORE_UNUSED, 1205 + RK3399_CLKGATE_CON(27), 2, GFLAGS), 1206 + GATE(ACLK_ISP1_WRAPPER, "aclk_isp1_wrapper", "hclk_isp1", CLK_IGNORE_UNUSED, 1207 + RK3399_CLKGATE_CON(27), 8, GFLAGS), 1208 + 1209 + COMPOSITE(SCLK_ISP1, "clk_isp1", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 1210 + RK3399_CLKSEL_CON(55), 14, 2, MFLAGS, 8, 5, DFLAGS, 1211 + RK3399_CLKGATE_CON(11), 5, GFLAGS), 1212 + 1213 + /* 1214 + * We use pclkin_cifinv by default GRF_SOC_CON20[9] (GSC20_9) setting in system, 1215 + * so we ignore the mux and make clocks nodes as following, 1216 + * 1217 + * pclkin_cifinv --|-------\ 1218 + * |GSC20_9|-- pclkin_cifmux -- |G27_6| -- pclkin_isp1_wrapper 1219 + * pclkin_cif --|-------/ 1220 + */ 1221 + GATE(PCLK_ISP1_WRAPPER, "pclkin_isp1_wrapper", "pclkin_cif", CLK_IGNORE_UNUSED, 1222 + RK3399_CLKGATE_CON(27), 6, GFLAGS), 1223 + 1224 + /* cif */ 1225 + COMPOSITE(0, "clk_cifout_div", mux_pll_src_cpll_gpll_npll_p, CLK_IGNORE_UNUSED, 1226 + RK3399_CLKSEL_CON(56), 6, 2, MFLAGS, 0, 5, DFLAGS, 1227 + RK3399_CLKGATE_CON(10), 7, GFLAGS), 1228 + MUX(SCLK_CIF_OUT, "clk_cifout", mux_clk_cif_p, CLK_SET_RATE_PARENT, 1229 + RK3399_CLKSEL_CON(56), 5, 1, MFLAGS), 1230 + 1231 + /* gic */ 1232 + COMPOSITE(ACLK_GIC_PRE, "aclk_gic_pre", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 1233 + RK3399_CLKSEL_CON(56), 15, 1, MFLAGS, 8, 5, DFLAGS, 1234 + RK3399_CLKGATE_CON(12), 12, GFLAGS), 1235 + 1236 + GATE(ACLK_GIC, "aclk_gic", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 0, GFLAGS), 1237 + GATE(ACLK_GIC_NOC, "aclk_gic_noc", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 1, GFLAGS), 1238 + GATE(ACLK_GIC_ADB400_CORE_L_2_GIC, "aclk_gic_adb400_core_l_2_gic", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 2, GFLAGS), 1239 + GATE(ACLK_GIC_ADB400_CORE_B_2_GIC, "aclk_gic_adb400_core_b_2_gic", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 3, GFLAGS), 1240 + GATE(ACLK_GIC_ADB400_GIC_2_CORE_L, "aclk_gic_adb400_gic_2_core_l", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 4, GFLAGS), 1241 + GATE(ACLK_GIC_ADB400_GIC_2_CORE_B, "aclk_gic_adb400_gic_2_core_b", "aclk_gic_pre", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(33), 5, GFLAGS), 1242 + 1243 + /* alive */ 1244 + /* pclk_alive_gpll_src is controlled by PMUGRF_SOC_CON0[6] */ 1245 + DIV(PCLK_ALIVE, "pclk_alive", "gpll", 0, 1246 + RK3399_CLKSEL_CON(57), 0, 5, DFLAGS), 1247 + 1248 + GATE(PCLK_USBPHY_MUX_G, "pclk_usbphy_mux_g", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 4, GFLAGS), 1249 + GATE(PCLK_UPHY0_TCPHY_G, "pclk_uphy0_tcphy_g", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 5, GFLAGS), 1250 + GATE(PCLK_UPHY0_TCPD_G, "pclk_uphy0_tcpd_g", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 6, GFLAGS), 1251 + GATE(PCLK_UPHY1_TCPHY_G, "pclk_uphy1_tcphy_g", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 8, GFLAGS), 1252 + GATE(PCLK_UPHY1_TCPD_G, "pclk_uphy1_tcpd_g", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 9, GFLAGS), 1253 + 1254 + GATE(PCLK_GRF, "pclk_grf", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 1, GFLAGS), 1255 + GATE(PCLK_INTR_ARB, "pclk_intr_arb", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 2, GFLAGS), 1256 + GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 3, GFLAGS), 1257 + GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 4, GFLAGS), 1258 + GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 5, GFLAGS), 1259 + GATE(PCLK_TIMER0, "pclk_timer0", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 6, GFLAGS), 1260 + GATE(PCLK_TIMER1, "pclk_timer1", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 7, GFLAGS), 1261 + GATE(PCLK_PMU_INTR_ARB, "pclk_pmu_intr_arb", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 9, GFLAGS), 1262 + GATE(PCLK_SGRF, "pclk_sgrf", "pclk_alive", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(31), 10, GFLAGS), 1263 + 1264 + GATE(SCLK_MIPIDPHY_REF, "clk_mipidphy_ref", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(11), 14, GFLAGS), 1265 + GATE(SCLK_DPHY_PLL, "clk_dphy_pll", "clk_mipidphy_ref", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 0, GFLAGS), 1266 + 1267 + GATE(SCLK_MIPIDPHY_CFG, "clk_mipidphy_cfg", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(11), 15, GFLAGS), 1268 + GATE(SCLK_DPHY_TX0_CFG, "clk_dphy_tx0_cfg", "clk_mipidphy_cfg", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 1, GFLAGS), 1269 + GATE(SCLK_DPHY_TX1RX1_CFG, "clk_dphy_tx1rx1_cfg", "clk_mipidphy_cfg", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 2, GFLAGS), 1270 + GATE(SCLK_DPHY_RX0_CFG, "clk_dphy_rx0_cfg", "clk_mipidphy_cfg", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(21), 3, GFLAGS), 1271 + 1272 + /* testout */ 1273 + MUX(0, "clk_test_pre", mux_pll_src_cpll_gpll_p, CLK_SET_RATE_PARENT, 1274 + RK3399_CLKSEL_CON(58), 7, 1, MFLAGS), 1275 + COMPOSITE_FRAC(0, "clk_test_frac", "clk_test_pre", CLK_SET_RATE_PARENT, 1276 + RK3399_CLKSEL_CON(105), 0, 1277 + RK3399_CLKGATE_CON(13), 9, GFLAGS), 1278 + 1279 + DIV(0, "clk_test_24m", "xin24m", 0, 1280 + RK3399_CLKSEL_CON(57), 6, 10, DFLAGS), 1281 + 1282 + /* spi */ 1283 + COMPOSITE(SCLK_SPI0, "clk_spi0", mux_pll_src_cpll_gpll_p, 0, 1284 + RK3399_CLKSEL_CON(59), 7, 1, MFLAGS, 0, 7, DFLAGS, 1285 + RK3399_CLKGATE_CON(9), 12, GFLAGS), 1286 + 1287 + COMPOSITE(SCLK_SPI1, "clk_spi1", mux_pll_src_cpll_gpll_p, 0, 1288 + RK3399_CLKSEL_CON(59), 15, 1, MFLAGS, 8, 7, DFLAGS, 1289 + RK3399_CLKGATE_CON(9), 13, GFLAGS), 1290 + 1291 + COMPOSITE(SCLK_SPI2, "clk_spi2", mux_pll_src_cpll_gpll_p, 0, 1292 + RK3399_CLKSEL_CON(60), 7, 1, MFLAGS, 0, 7, DFLAGS, 1293 + RK3399_CLKGATE_CON(9), 14, GFLAGS), 1294 + 1295 + COMPOSITE(SCLK_SPI4, "clk_spi4", mux_pll_src_cpll_gpll_p, 0, 1296 + RK3399_CLKSEL_CON(60), 15, 1, MFLAGS, 8, 7, DFLAGS, 1297 + RK3399_CLKGATE_CON(9), 15, GFLAGS), 1298 + 1299 + COMPOSITE(SCLK_SPI5, "clk_spi5", mux_pll_src_cpll_gpll_p, 0, 1300 + RK3399_CLKSEL_CON(58), 15, 1, MFLAGS, 8, 7, DFLAGS, 1301 + RK3399_CLKGATE_CON(13), 13, GFLAGS), 1302 + 1303 + /* i2c */ 1304 + COMPOSITE(SCLK_I2C1, "clk_i2c1", mux_pll_src_cpll_gpll_p, 0, 1305 + RK3399_CLKSEL_CON(61), 7, 1, MFLAGS, 0, 7, DFLAGS, 1306 + RK3399_CLKGATE_CON(10), 0, GFLAGS), 1307 + 1308 + COMPOSITE(SCLK_I2C2, "clk_i2c2", mux_pll_src_cpll_gpll_p, 0, 1309 + RK3399_CLKSEL_CON(62), 7, 1, MFLAGS, 0, 7, DFLAGS, 1310 + RK3399_CLKGATE_CON(10), 2, GFLAGS), 1311 + 1312 + COMPOSITE(SCLK_I2C3, "clk_i2c3", mux_pll_src_cpll_gpll_p, 0, 1313 + RK3399_CLKSEL_CON(63), 7, 1, MFLAGS, 0, 7, DFLAGS, 1314 + RK3399_CLKGATE_CON(10), 4, GFLAGS), 1315 + 1316 + COMPOSITE(SCLK_I2C5, "clk_i2c5", mux_pll_src_cpll_gpll_p, 0, 1317 + RK3399_CLKSEL_CON(61), 15, 1, MFLAGS, 8, 7, DFLAGS, 1318 + RK3399_CLKGATE_CON(10), 1, GFLAGS), 1319 + 1320 + COMPOSITE(SCLK_I2C6, "clk_i2c6", mux_pll_src_cpll_gpll_p, 0, 1321 + RK3399_CLKSEL_CON(62), 15, 1, MFLAGS, 8, 7, DFLAGS, 1322 + RK3399_CLKGATE_CON(10), 3, GFLAGS), 1323 + 1324 + COMPOSITE(SCLK_I2C7, "clk_i2c7", mux_pll_src_cpll_gpll_p, 0, 1325 + RK3399_CLKSEL_CON(63), 15, 1, MFLAGS, 8, 7, DFLAGS, 1326 + RK3399_CLKGATE_CON(10), 5, GFLAGS), 1327 + 1328 + /* timer */ 1329 + GATE(SCLK_TIMER00, "clk_timer00", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 0, GFLAGS), 1330 + GATE(SCLK_TIMER01, "clk_timer01", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 1, GFLAGS), 1331 + GATE(SCLK_TIMER02, "clk_timer02", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 2, GFLAGS), 1332 + GATE(SCLK_TIMER03, "clk_timer03", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 3, GFLAGS), 1333 + GATE(SCLK_TIMER04, "clk_timer04", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 4, GFLAGS), 1334 + GATE(SCLK_TIMER05, "clk_timer05", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 5, GFLAGS), 1335 + GATE(SCLK_TIMER06, "clk_timer06", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 6, GFLAGS), 1336 + GATE(SCLK_TIMER07, "clk_timer07", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 7, GFLAGS), 1337 + GATE(SCLK_TIMER08, "clk_timer08", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 8, GFLAGS), 1338 + GATE(SCLK_TIMER09, "clk_timer09", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 9, GFLAGS), 1339 + GATE(SCLK_TIMER10, "clk_timer10", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 10, GFLAGS), 1340 + GATE(SCLK_TIMER11, "clk_timer11", "xin24m", CLK_IGNORE_UNUSED, RK3399_CLKGATE_CON(26), 11, GFLAGS), 1341 + 1342 + /* clk_test */ 1343 + /* clk_test_pre is controlled by CRU_MISC_CON[3] */ 1344 + COMPOSITE_NOMUX(0, "clk_test", "clk_test_pre", CLK_IGNORE_UNUSED, 1345 + RK3368_CLKSEL_CON(58), 0, 5, DFLAGS, 1346 + RK3368_CLKGATE_CON(13), 11, GFLAGS), 1347 + }; 1348 + 1349 + static struct rockchip_clk_branch rk3399_clk_pmu_branches[] __initdata = { 1350 + /* 1351 + * PMU CRU Clock-Architecture 1352 + */ 1353 + 1354 + GATE(0, "fclk_cm0s_pmu_ppll_src", "ppll", CLK_IGNORE_UNUSED, 1355 + RK3399_PMU_CLKGATE_CON(0), 1, GFLAGS), 1356 + 1357 + COMPOSITE_NOGATE(FCLK_CM0S_SRC_PMU, "fclk_cm0s_src_pmu", mux_fclk_cm0s_pmu_ppll_p, CLK_IGNORE_UNUSED, 1358 + RK3399_PMU_CLKSEL_CON(0), 15, 1, MFLAGS, 8, 5, DFLAGS), 1359 + 1360 + COMPOSITE(SCLK_SPI3_PMU, "clk_spi3_pmu", mux_24m_ppll_p, CLK_IGNORE_UNUSED, 1361 + RK3399_PMU_CLKSEL_CON(1), 7, 1, MFLAGS, 0, 7, DFLAGS, 1362 + RK3399_PMU_CLKGATE_CON(0), 2, GFLAGS), 1363 + 1364 + COMPOSITE(0, "clk_wifi_div", mux_ppll_24m_p, CLK_IGNORE_UNUSED, 1365 + RK3399_PMU_CLKSEL_CON(1), 13, 1, MFLAGS, 8, 5, DFLAGS, 1366 + RK3399_PMU_CLKGATE_CON(0), 8, GFLAGS), 1367 + 1368 + COMPOSITE_FRACMUX_NOGATE(0, "clk_wifi_frac", "clk_wifi_div", CLK_SET_RATE_PARENT, 1369 + RK3399_PMU_CLKSEL_CON(7), 0, 1370 + &rk3399_pmuclk_wifi_fracmux), 1371 + 1372 + MUX(0, "clk_timer_src_pmu", mux_pll_p, CLK_IGNORE_UNUSED, 1373 + RK3399_PMU_CLKSEL_CON(1), 15, 1, MFLAGS), 1374 + 1375 + COMPOSITE_NOMUX(SCLK_I2C0_PMU, "clk_i2c0_pmu", "ppll", 0, 1376 + RK3399_PMU_CLKSEL_CON(2), 0, 7, DFLAGS, 1377 + RK3399_PMU_CLKGATE_CON(0), 9, GFLAGS), 1378 + 1379 + COMPOSITE_NOMUX(SCLK_I2C4_PMU, "clk_i2c4_pmu", "ppll", 0, 1380 + RK3399_PMU_CLKSEL_CON(3), 0, 7, DFLAGS, 1381 + RK3399_PMU_CLKGATE_CON(0), 11, GFLAGS), 1382 + 1383 + COMPOSITE_NOMUX(SCLK_I2C8_PMU, "clk_i2c8_pmu", "ppll", 0, 1384 + RK3399_PMU_CLKSEL_CON(2), 8, 7, DFLAGS, 1385 + RK3399_PMU_CLKGATE_CON(0), 10, GFLAGS), 1386 + 1387 + DIV(0, "clk_32k_suspend_pmu", "xin24m", CLK_IGNORE_UNUSED, 1388 + RK3399_PMU_CLKSEL_CON(4), 0, 10, DFLAGS), 1389 + MUX(0, "clk_testout_2io", mux_clk_testout2_2io_p, CLK_IGNORE_UNUSED, 1390 + RK3399_PMU_CLKSEL_CON(4), 15, 1, MFLAGS), 1391 + 1392 + COMPOSITE(0, "clk_uart4_div", mux_24m_ppll_p, CLK_IGNORE_UNUSED, 1393 + RK3399_PMU_CLKSEL_CON(5), 10, 1, MFLAGS, 0, 7, DFLAGS, 1394 + RK3399_PMU_CLKGATE_CON(0), 5, GFLAGS), 1395 + 1396 + COMPOSITE_FRACMUX(0, "clk_uart4_frac", "clk_uart4_div", CLK_SET_RATE_PARENT, 1397 + RK3399_PMU_CLKSEL_CON(6), 0, 1398 + RK3399_PMU_CLKGATE_CON(0), 6, GFLAGS, 1399 + &rk3399_uart4_pmu_fracmux), 1400 + 1401 + DIV(PCLK_SRC_PMU, "pclk_pmu_src", "ppll", CLK_IGNORE_UNUSED, 1402 + RK3399_PMU_CLKSEL_CON(0), 0, 5, DFLAGS), 1403 + 1404 + /* pmu clock gates */ 1405 + GATE(SCLK_TIMER12_PMU, "clk_timer0_pmu", "clk_timer_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(0), 3, GFLAGS), 1406 + GATE(SCLK_TIMER13_PMU, "clk_timer1_pmu", "clk_timer_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(0), 4, GFLAGS), 1407 + 1408 + GATE(SCLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(0), 7, GFLAGS), 1409 + 1410 + GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 0, GFLAGS), 1411 + GATE(PCLK_PMUGRF_PMU, "pclk_pmugrf_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 1, GFLAGS), 1412 + GATE(PCLK_INTMEM1_PMU, "pclk_intmem1_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 2, GFLAGS), 1413 + GATE(PCLK_GPIO0_PMU, "pclk_gpio0_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 3, GFLAGS), 1414 + GATE(PCLK_GPIO1_PMU, "pclk_gpio1_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 4, GFLAGS), 1415 + GATE(PCLK_SGRF_PMU, "pclk_sgrf_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 5, GFLAGS), 1416 + GATE(PCLK_NOC_PMU, "pclk_noc_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 6, GFLAGS), 1417 + GATE(PCLK_I2C0_PMU, "pclk_i2c0_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 7, GFLAGS), 1418 + GATE(PCLK_I2C4_PMU, "pclk_i2c4_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 8, GFLAGS), 1419 + GATE(PCLK_I2C8_PMU, "pclk_i2c8_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 9, GFLAGS), 1420 + GATE(PCLK_RKPWM_PMU, "pclk_rkpwm_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 10, GFLAGS), 1421 + GATE(PCLK_SPI3_PMU, "pclk_spi3_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 11, GFLAGS), 1422 + GATE(PCLK_TIMER_PMU, "pclk_timer_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 12, GFLAGS), 1423 + GATE(PCLK_MAILBOX_PMU, "pclk_mailbox_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 13, GFLAGS), 1424 + GATE(PCLK_UART4_PMU, "pclk_uart4_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 14, GFLAGS), 1425 + GATE(PCLK_WDT_M0_PMU, "pclk_wdt_m0_pmu", "pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1), 15, GFLAGS), 1426 + 1427 + GATE(FCLK_CM0S_PMU, "fclk_cm0s_pmu", "fclk_cm0s_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(2), 0, GFLAGS), 1428 + GATE(SCLK_CM0S_PMU, "sclk_cm0s_pmu", "fclk_cm0s_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(2), 1, GFLAGS), 1429 + GATE(HCLK_CM0S_PMU, "hclk_cm0s_pmu", "fclk_cm0s_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(2), 2, GFLAGS), 1430 + GATE(DCLK_CM0S_PMU, "dclk_cm0s_pmu", "fclk_cm0s_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(2), 3, GFLAGS), 1431 + GATE(HCLK_NOC_PMU, "hclk_noc_pmu", "fclk_cm0s_src_pmu", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(2), 5, GFLAGS), 1432 + }; 1433 + 1434 + static const char *const rk3399_cru_critical_clocks[] __initconst = { 1435 + "aclk_cci_pre", 1436 + "pclk_perilp0", 1437 + "pclk_perilp0", 1438 + "hclk_perilp0", 1439 + "hclk_perilp0_noc", 1440 + "pclk_perilp1", 1441 + "pclk_perilp1_noc", 1442 + "pclk_perihp", 1443 + "pclk_perihp_noc", 1444 + "hclk_perihp", 1445 + "aclk_perihp", 1446 + "aclk_perihp_noc", 1447 + "aclk_perilp0", 1448 + "aclk_perilp0_noc", 1449 + "hclk_perilp1", 1450 + "hclk_perilp1_noc", 1451 + "aclk_dmac0_perilp", 1452 + "gpll_hclk_perilp1_src", 1453 + "gpll_aclk_perilp0_src", 1454 + "gpll_aclk_perihp_src", 1455 + }; 1456 + 1457 + static const char *const rk3399_pmucru_critical_clocks[] __initconst = { 1458 + "ppll", 1459 + "pclk_pmu_src", 1460 + "fclk_cm0s_src_pmu", 1461 + "clk_timer_src_pmu", 1462 + }; 1463 + 1464 + static void __init rk3399_clk_init(struct device_node *np) 1465 + { 1466 + struct rockchip_clk_provider *ctx; 1467 + void __iomem *reg_base; 1468 + 1469 + reg_base = of_iomap(np, 0); 1470 + if (!reg_base) { 1471 + pr_err("%s: could not map cru region\n", __func__); 1472 + return; 1473 + } 1474 + 1475 + ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS); 1476 + if (IS_ERR(ctx)) { 1477 + pr_err("%s: rockchip clk init failed\n", __func__); 1478 + return; 1479 + } 1480 + 1481 + rockchip_clk_register_plls(ctx, rk3399_pll_clks, 1482 + ARRAY_SIZE(rk3399_pll_clks), -1); 1483 + 1484 + rockchip_clk_register_branches(ctx, rk3399_clk_branches, 1485 + ARRAY_SIZE(rk3399_clk_branches)); 1486 + 1487 + rockchip_clk_protect_critical(rk3399_cru_critical_clocks, 1488 + ARRAY_SIZE(rk3399_cru_critical_clocks)); 1489 + 1490 + rockchip_clk_register_armclk(ctx, ARMCLKL, "armclkl", 1491 + mux_armclkl_p, ARRAY_SIZE(mux_armclkl_p), 1492 + &rk3399_cpuclkl_data, rk3399_cpuclkl_rates, 1493 + ARRAY_SIZE(rk3399_cpuclkl_rates)); 1494 + 1495 + rockchip_clk_register_armclk(ctx, ARMCLKB, "armclkb", 1496 + mux_armclkb_p, ARRAY_SIZE(mux_armclkb_p), 1497 + &rk3399_cpuclkb_data, rk3399_cpuclkb_rates, 1498 + ARRAY_SIZE(rk3399_cpuclkb_rates)); 1499 + 1500 + rockchip_register_softrst(np, 21, reg_base + RK3399_SOFTRST_CON(0), 1501 + ROCKCHIP_SOFTRST_HIWORD_MASK); 1502 + 1503 + rockchip_register_restart_notifier(ctx, RK3399_GLB_SRST_FST, NULL); 1504 + 1505 + rockchip_clk_of_add_provider(np, ctx); 1506 + } 1507 + CLK_OF_DECLARE(rk3399_cru, "rockchip,rk3399-cru", rk3399_clk_init); 1508 + 1509 + static void __init rk3399_pmu_clk_init(struct device_node *np) 1510 + { 1511 + struct rockchip_clk_provider *ctx; 1512 + void __iomem *reg_base; 1513 + 1514 + reg_base = of_iomap(np, 0); 1515 + if (!reg_base) { 1516 + pr_err("%s: could not map cru pmu region\n", __func__); 1517 + return; 1518 + } 1519 + 1520 + ctx = rockchip_clk_init(np, reg_base, CLKPMU_NR_CLKS); 1521 + if (IS_ERR(ctx)) { 1522 + pr_err("%s: rockchip pmu clk init failed\n", __func__); 1523 + return; 1524 + } 1525 + 1526 + rockchip_clk_register_plls(ctx, rk3399_pmu_pll_clks, 1527 + ARRAY_SIZE(rk3399_pmu_pll_clks), -1); 1528 + 1529 + rockchip_clk_register_branches(ctx, rk3399_clk_pmu_branches, 1530 + ARRAY_SIZE(rk3399_clk_pmu_branches)); 1531 + 1532 + rockchip_clk_protect_critical(rk3399_pmucru_critical_clocks, 1533 + ARRAY_SIZE(rk3399_pmucru_critical_clocks)); 1534 + 1535 + rockchip_register_softrst(np, 2, reg_base + RK3399_PMU_SOFTRST_CON(0), 1536 + ROCKCHIP_SOFTRST_HIWORD_MASK); 1537 + 1538 + rockchip_clk_of_add_provider(np, ctx); 1539 + } 1540 + CLK_OF_DECLARE(rk3399_cru_pmu, "rockchip,rk3399-pmucru", rk3399_pmu_clk_init);
+90 -56
drivers/clk/rockchip/clk.c
··· 2 2 * Copyright (c) 2014 MundoReader S.L. 3 3 * Author: Heiko Stuebner <heiko@sntech.de> 4 4 * 5 + * Copyright (c) 2016 Rockchip Electronics Co. Ltd. 6 + * Author: Xing Zheng <zhengxing@rock-chips.com> 7 + * 5 8 * based on 6 9 * 7 10 * samsung/clk.c ··· 160 157 return notifier_from_errno(ret); 161 158 } 162 159 163 - static struct clk *rockchip_clk_register_frac_branch(const char *name, 160 + static struct clk *rockchip_clk_register_frac_branch( 161 + struct rockchip_clk_provider *ctx, const char *name, 164 162 const char *const *parent_names, u8 num_parents, 165 163 void __iomem *base, int muxdiv_offset, u8 div_flags, 166 164 int gate_offset, u8 gate_shift, u8 gate_flags, ··· 254 250 if (IS_ERR(mux_clk)) 255 251 return clk; 256 252 257 - rockchip_clk_add_lookup(mux_clk, child->id); 253 + rockchip_clk_add_lookup(ctx, mux_clk, child->id); 258 254 259 255 /* notifier on the fraction divider to catch rate changes */ 260 256 if (frac->mux_frac_idx >= 0) { ··· 318 314 return clk; 319 315 } 320 316 321 - static DEFINE_SPINLOCK(clk_lock); 322 - static struct clk **clk_table; 323 - static void __iomem *reg_base; 324 - static struct clk_onecell_data clk_data; 325 - static struct device_node *cru_node; 326 - static struct regmap *grf; 327 - 328 - void __init rockchip_clk_init(struct device_node *np, void __iomem *base, 329 - unsigned long nr_clks) 317 + struct rockchip_clk_provider * __init rockchip_clk_init(struct device_node *np, 318 + void __iomem *base, unsigned long nr_clks) 330 319 { 331 - reg_base = base; 332 - cru_node = np; 333 - grf = ERR_PTR(-EPROBE_DEFER); 320 + struct rockchip_clk_provider *ctx; 321 + struct clk **clk_table; 322 + int i; 323 + 324 + ctx = kzalloc(sizeof(struct rockchip_clk_provider), GFP_KERNEL); 325 + if (!ctx) { 326 + pr_err("%s: Could not allocate clock provider context\n", 327 + __func__); 328 + return ERR_PTR(-ENOMEM); 329 + } 334 330 335 331 clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL); 336 - if (!clk_table) 337 - pr_err("%s: could not allocate clock lookup table\n", __func__); 332 + if (!clk_table) { 333 + pr_err("%s: Could not allocate clock lookup table\n", 334 + __func__); 335 + goto err_free; 336 + } 338 337 339 - clk_data.clks = clk_table; 340 - clk_data.clk_num = nr_clks; 341 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 338 + for (i = 0; i < nr_clks; ++i) 339 + clk_table[i] = ERR_PTR(-ENOENT); 340 + 341 + ctx->reg_base = base; 342 + ctx->clk_data.clks = clk_table; 343 + ctx->clk_data.clk_num = nr_clks; 344 + ctx->cru_node = np; 345 + ctx->grf = ERR_PTR(-EPROBE_DEFER); 346 + spin_lock_init(&ctx->lock); 347 + 348 + return ctx; 349 + 350 + err_free: 351 + kfree(ctx); 352 + return ERR_PTR(-ENOMEM); 342 353 } 343 354 344 - struct regmap *rockchip_clk_get_grf(void) 355 + void __init rockchip_clk_of_add_provider(struct device_node *np, 356 + struct rockchip_clk_provider *ctx) 345 357 { 346 - if (IS_ERR(grf)) 347 - grf = syscon_regmap_lookup_by_phandle(cru_node, "rockchip,grf"); 348 - return grf; 358 + if (of_clk_add_provider(np, of_clk_src_onecell_get, 359 + &ctx->clk_data)) 360 + pr_err("%s: could not register clk provider\n", __func__); 349 361 } 350 362 351 - void rockchip_clk_add_lookup(struct clk *clk, unsigned int id) 363 + struct regmap *rockchip_clk_get_grf(struct rockchip_clk_provider *ctx) 352 364 { 353 - if (clk_table && id) 354 - clk_table[id] = clk; 365 + if (IS_ERR(ctx->grf)) 366 + ctx->grf = syscon_regmap_lookup_by_phandle(ctx->cru_node, "rockchip,grf"); 367 + return ctx->grf; 355 368 } 356 369 357 - void __init rockchip_clk_register_plls(struct rockchip_pll_clock *list, 370 + void rockchip_clk_add_lookup(struct rockchip_clk_provider *ctx, 371 + struct clk *clk, unsigned int id) 372 + { 373 + if (ctx->clk_data.clks && id) 374 + ctx->clk_data.clks[id] = clk; 375 + } 376 + 377 + void __init rockchip_clk_register_plls(struct rockchip_clk_provider *ctx, 378 + struct rockchip_pll_clock *list, 358 379 unsigned int nr_pll, int grf_lock_offset) 359 380 { 360 381 struct clk *clk; 361 382 int idx; 362 383 363 384 for (idx = 0; idx < nr_pll; idx++, list++) { 364 - clk = rockchip_clk_register_pll(list->type, list->name, 385 + clk = rockchip_clk_register_pll(ctx, list->type, list->name, 365 386 list->parent_names, list->num_parents, 366 - reg_base, list->con_offset, grf_lock_offset, 387 + list->con_offset, grf_lock_offset, 367 388 list->lock_shift, list->mode_offset, 368 389 list->mode_shift, list->rate_table, 369 - list->pll_flags, &clk_lock); 390 + list->pll_flags); 370 391 if (IS_ERR(clk)) { 371 392 pr_err("%s: failed to register clock %s\n", __func__, 372 393 list->name); 373 394 continue; 374 395 } 375 396 376 - rockchip_clk_add_lookup(clk, list->id); 397 + rockchip_clk_add_lookup(ctx, clk, list->id); 377 398 } 378 399 } 379 400 380 401 void __init rockchip_clk_register_branches( 402 + struct rockchip_clk_provider *ctx, 381 403 struct rockchip_clk_branch *list, 382 404 unsigned int nr_clk) 383 405 { ··· 419 389 case branch_mux: 420 390 clk = clk_register_mux(NULL, list->name, 421 391 list->parent_names, list->num_parents, 422 - flags, reg_base + list->muxdiv_offset, 392 + flags, ctx->reg_base + list->muxdiv_offset, 423 393 list->mux_shift, list->mux_width, 424 - list->mux_flags, &clk_lock); 394 + list->mux_flags, &ctx->lock); 425 395 break; 426 396 case branch_divider: 427 397 if (list->div_table) 428 398 clk = clk_register_divider_table(NULL, 429 399 list->name, list->parent_names[0], 430 - flags, reg_base + list->muxdiv_offset, 400 + flags, ctx->reg_base + list->muxdiv_offset, 431 401 list->div_shift, list->div_width, 432 402 list->div_flags, list->div_table, 433 - &clk_lock); 403 + &ctx->lock); 434 404 else 435 405 clk = clk_register_divider(NULL, list->name, 436 406 list->parent_names[0], flags, 437 - reg_base + list->muxdiv_offset, 407 + ctx->reg_base + list->muxdiv_offset, 438 408 list->div_shift, list->div_width, 439 - list->div_flags, &clk_lock); 409 + list->div_flags, &ctx->lock); 440 410 break; 441 411 case branch_fraction_divider: 442 - clk = rockchip_clk_register_frac_branch(list->name, 412 + clk = rockchip_clk_register_frac_branch(ctx, list->name, 443 413 list->parent_names, list->num_parents, 444 - reg_base, list->muxdiv_offset, list->div_flags, 414 + ctx->reg_base, list->muxdiv_offset, list->div_flags, 445 415 list->gate_offset, list->gate_shift, 446 416 list->gate_flags, flags, list->child, 447 - &clk_lock); 417 + &ctx->lock); 448 418 break; 449 419 case branch_gate: 450 420 flags |= CLK_SET_RATE_PARENT; 451 421 452 422 clk = clk_register_gate(NULL, list->name, 453 423 list->parent_names[0], flags, 454 - reg_base + list->gate_offset, 455 - list->gate_shift, list->gate_flags, &clk_lock); 424 + ctx->reg_base + list->gate_offset, 425 + list->gate_shift, list->gate_flags, &ctx->lock); 456 426 break; 457 427 case branch_composite: 458 428 clk = rockchip_clk_register_branch(list->name, 459 429 list->parent_names, list->num_parents, 460 - reg_base, list->muxdiv_offset, list->mux_shift, 430 + ctx->reg_base, list->muxdiv_offset, list->mux_shift, 461 431 list->mux_width, list->mux_flags, 462 432 list->div_shift, list->div_width, 463 433 list->div_flags, list->div_table, 464 434 list->gate_offset, list->gate_shift, 465 - list->gate_flags, flags, &clk_lock); 435 + list->gate_flags, flags, &ctx->lock); 466 436 break; 467 437 case branch_mmc: 468 438 clk = rockchip_clk_register_mmc( 469 439 list->name, 470 440 list->parent_names, list->num_parents, 471 - reg_base + list->muxdiv_offset, 441 + ctx->reg_base + list->muxdiv_offset, 472 442 list->div_shift 473 443 ); 474 444 break; ··· 476 446 clk = rockchip_clk_register_inverter( 477 447 list->name, list->parent_names, 478 448 list->num_parents, 479 - reg_base + list->muxdiv_offset, 480 - list->div_shift, list->div_flags, &clk_lock); 449 + ctx->reg_base + list->muxdiv_offset, 450 + list->div_shift, list->div_flags, &ctx->lock); 481 451 break; 482 452 case branch_factor: 483 453 clk = rockchip_clk_register_factor_branch( 484 454 list->name, list->parent_names, 485 - list->num_parents, reg_base, 455 + list->num_parents, ctx->reg_base, 486 456 list->div_shift, list->div_width, 487 457 list->gate_offset, list->gate_shift, 488 - list->gate_flags, flags, &clk_lock); 458 + list->gate_flags, flags, &ctx->lock); 489 459 break; 490 460 } 491 461 ··· 502 472 continue; 503 473 } 504 474 505 - rockchip_clk_add_lookup(clk, list->id); 475 + rockchip_clk_add_lookup(ctx, clk, list->id); 506 476 } 507 477 } 508 478 509 - void __init rockchip_clk_register_armclk(unsigned int lookup_id, 479 + void __init rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx, 480 + unsigned int lookup_id, 510 481 const char *name, const char *const *parent_names, 511 482 u8 num_parents, 512 483 const struct rockchip_cpuclk_reg_data *reg_data, ··· 517 486 struct clk *clk; 518 487 519 488 clk = rockchip_clk_register_cpuclk(name, parent_names, num_parents, 520 - reg_data, rates, nrates, reg_base, 521 - &clk_lock); 489 + reg_data, rates, nrates, ctx->reg_base, 490 + &ctx->lock); 522 491 if (IS_ERR(clk)) { 523 492 pr_err("%s: failed to register clock %s: %ld\n", 524 493 __func__, name, PTR_ERR(clk)); 525 494 return; 526 495 } 527 496 528 - rockchip_clk_add_lookup(clk, lookup_id); 497 + rockchip_clk_add_lookup(ctx, clk, lookup_id); 529 498 } 530 499 531 500 void __init rockchip_clk_protect_critical(const char *const clocks[], ··· 542 511 } 543 512 } 544 513 514 + static void __iomem *rst_base; 545 515 static unsigned int reg_restart; 546 516 static void (*cb_restart)(void); 547 517 static int rockchip_restart_notify(struct notifier_block *this, ··· 551 519 if (cb_restart) 552 520 cb_restart(); 553 521 554 - writel(0xfdb9, reg_base + reg_restart); 522 + writel(0xfdb9, rst_base + reg_restart); 555 523 return NOTIFY_DONE; 556 524 } 557 525 ··· 560 528 .priority = 128, 561 529 }; 562 530 563 - void __init rockchip_register_restart_notifier(unsigned int reg, void (*cb)(void)) 531 + void __init rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx, 532 + unsigned int reg, void (*cb)(void)) 564 533 { 565 534 int ret; 566 535 536 + rst_base = ctx->reg_base; 567 537 reg_restart = reg; 568 538 cb_restart = cb; 569 539 ret = register_restart_handler(&rockchip_restart_handler);
+87 -19
drivers/clk/rockchip/clk.h
··· 27 27 #define CLK_ROCKCHIP_CLK_H 28 28 29 29 #include <linux/io.h> 30 + #include <linux/clk-provider.h> 30 31 31 32 struct clk; 32 33 33 34 #define HIWORD_UPDATE(val, mask, shift) \ 34 35 ((val) << (shift) | (mask) << ((shift) + 16)) 35 36 36 - /* register positions shared by RK2928, RK3036, RK3066, RK3188 and RK3228 */ 37 + /* register positions shared by RK2928, RK3036, RK3066, RK3188, RK3228, RK3399 */ 37 38 #define RK2928_PLL_CON(x) ((x) * 0x4) 38 39 #define RK2928_MODE_CON 0x40 39 40 #define RK2928_CLKSEL_CON(x) ((x) * 0x4 + 0x44) ··· 93 92 #define RK3368_EMMC_CON0 0x418 94 93 #define RK3368_EMMC_CON1 0x41c 95 94 95 + #define RK3399_PLL_CON(x) RK2928_PLL_CON(x) 96 + #define RK3399_CLKSEL_CON(x) ((x) * 0x4 + 0x100) 97 + #define RK3399_CLKGATE_CON(x) ((x) * 0x4 + 0x300) 98 + #define RK3399_SOFTRST_CON(x) ((x) * 0x4 + 0x400) 99 + #define RK3399_GLB_SRST_FST 0x500 100 + #define RK3399_GLB_SRST_SND 0x504 101 + #define RK3399_GLB_CNT_TH 0x508 102 + #define RK3399_MISC_CON 0x50c 103 + #define RK3399_RST_CON 0x510 104 + #define RK3399_RST_ST 0x514 105 + #define RK3399_SDMMC_CON0 0x580 106 + #define RK3399_SDMMC_CON1 0x584 107 + #define RK3399_SDIO_CON0 0x588 108 + #define RK3399_SDIO_CON1 0x58c 109 + 110 + #define RK3399_PMU_PLL_CON(x) RK2928_PLL_CON(x) 111 + #define RK3399_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x80) 112 + #define RK3399_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x100) 113 + #define RK3399_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x110) 114 + 96 115 enum rockchip_pll_type { 97 116 pll_rk3036, 98 117 pll_rk3066, 118 + pll_rk3399, 99 119 }; 100 120 101 121 #define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, \ ··· 149 127 .nb = _nb, \ 150 128 } 151 129 130 + /** 131 + * struct rockchip_clk_provider - information about clock provider 132 + * @reg_base: virtual address for the register base. 133 + * @clk_data: holds clock related data like clk* and number of clocks. 134 + * @cru_node: device-node of the clock-provider 135 + * @grf: regmap of the general-register-files syscon 136 + * @lock: maintains exclusion between callbacks for a given clock-provider. 137 + */ 138 + struct rockchip_clk_provider { 139 + void __iomem *reg_base; 140 + struct clk_onecell_data clk_data; 141 + struct device_node *cru_node; 142 + struct regmap *grf; 143 + spinlock_t lock; 144 + }; 145 + 152 146 struct rockchip_pll_rate_table { 153 147 unsigned long rate; 154 148 unsigned int nr; 155 149 unsigned int nf; 156 150 unsigned int no; 157 151 unsigned int nb; 158 - /* for RK3036 */ 152 + /* for RK3036/RK3399 */ 159 153 unsigned int fbdiv; 160 154 unsigned int postdiv1; 161 155 unsigned int refdiv; ··· 181 143 }; 182 144 183 145 /** 184 - * struct rockchip_pll_clock: information about pll clock 146 + * struct rockchip_pll_clock - information about pll clock 185 147 * @id: platform specific id of the clock. 186 148 * @name: name of this pll clock. 187 - * @parent_name: name of the parent clock. 149 + * @parent_names: name of the parent clock. 150 + * @num_parents: number of parents 188 151 * @flags: optional flags for basic clock. 189 152 * @con_offset: offset of the register for configuring the PLL. 190 153 * @mode_offset: offset of the register for configuring the PLL-mode. ··· 233 194 .rate_table = _rtable, \ 234 195 } 235 196 236 - struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, 197 + struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx, 198 + enum rockchip_pll_type pll_type, 237 199 const char *name, const char *const *parent_names, 238 - u8 num_parents, void __iomem *base, int con_offset, 239 - int grf_lock_offset, int lock_shift, int reg_mode, 240 - int mode_shift, struct rockchip_pll_rate_table *rate_table, 241 - u8 clk_pll_flags, spinlock_t *lock); 200 + u8 num_parents, int con_offset, int grf_lock_offset, 201 + int lock_shift, int mode_offset, int mode_shift, 202 + struct rockchip_pll_rate_table *rate_table, 203 + u8 clk_pll_flags); 242 204 243 205 struct rockchip_cpuclk_clksel { 244 206 int reg; ··· 253 213 }; 254 214 255 215 /** 256 - * struct rockchip_cpuclk_reg_data: describes register offsets and masks of the cpuclock 216 + * struct rockchip_cpuclk_reg_data - describes register offsets and masks of the cpuclock 257 217 * @core_reg: register offset of the core settings register 258 218 * @div_core_shift: core divider offset used to divide the pll value 259 219 * @div_core_mask: core divider mask 220 + * @mux_core_alt: mux value to select alternate parent 221 + * @mux_core_main: mux value to select main parent of core 260 222 * @mux_core_shift: offset of the core multiplexer 223 + * @mux_core_mask: core multiplexer mask 261 224 */ 262 225 struct rockchip_cpuclk_reg_data { 263 226 int core_reg; 264 227 u8 div_core_shift; 265 228 u32 div_core_mask; 266 - int mux_core_reg; 229 + u8 mux_core_alt; 230 + u8 mux_core_main; 267 231 u8 mux_core_shift; 232 + u32 mux_core_mask; 268 233 }; 269 234 270 235 struct clk *rockchip_clk_register_cpuclk(const char *name, ··· 473 428 .child = ch, \ 474 429 } 475 430 431 + #define COMPOSITE_FRACMUX_NOGATE(_id, cname, pname, f, mo, df, ch) \ 432 + { \ 433 + .id = _id, \ 434 + .branch_type = branch_fraction_divider, \ 435 + .name = cname, \ 436 + .parent_names = (const char *[]){ pname }, \ 437 + .num_parents = 1, \ 438 + .flags = f, \ 439 + .muxdiv_offset = mo, \ 440 + .div_shift = 16, \ 441 + .div_width = 16, \ 442 + .div_flags = df, \ 443 + .gate_offset = -1, \ 444 + .child = ch, \ 445 + } 446 + 476 447 #define MUX(_id, cname, pnames, f, o, s, w, mf) \ 477 448 { \ 478 449 .id = _id, \ ··· 597 536 .gate_flags = gf, \ 598 537 } 599 538 600 - void rockchip_clk_init(struct device_node *np, void __iomem *base, 601 - unsigned long nr_clks); 602 - struct regmap *rockchip_clk_get_grf(void); 603 - void rockchip_clk_add_lookup(struct clk *clk, unsigned int id); 604 - void rockchip_clk_register_branches(struct rockchip_clk_branch *clk_list, 539 + struct rockchip_clk_provider *rockchip_clk_init(struct device_node *np, 540 + void __iomem *base, unsigned long nr_clks); 541 + void rockchip_clk_of_add_provider(struct device_node *np, 542 + struct rockchip_clk_provider *ctx); 543 + struct regmap *rockchip_clk_get_grf(struct rockchip_clk_provider *ctx); 544 + void rockchip_clk_add_lookup(struct rockchip_clk_provider *ctx, 545 + struct clk *clk, unsigned int id); 546 + void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx, 547 + struct rockchip_clk_branch *list, 605 548 unsigned int nr_clk); 606 - void rockchip_clk_register_plls(struct rockchip_pll_clock *pll_list, 549 + void rockchip_clk_register_plls(struct rockchip_clk_provider *ctx, 550 + struct rockchip_pll_clock *pll_list, 607 551 unsigned int nr_pll, int grf_lock_offset); 608 - void rockchip_clk_register_armclk(unsigned int lookup_id, const char *name, 552 + void rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx, 553 + unsigned int lookup_id, const char *name, 609 554 const char *const *parent_names, u8 num_parents, 610 555 const struct rockchip_cpuclk_reg_data *reg_data, 611 556 const struct rockchip_cpuclk_rate_table *rates, 612 557 int nrates); 613 558 void rockchip_clk_protect_critical(const char *const clocks[], int nclocks); 614 - void rockchip_register_restart_notifier(unsigned int reg, void (*cb)(void)); 559 + void rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx, 560 + unsigned int reg, void (*cb)(void)); 615 561 616 562 #define ROCKCHIP_SOFTRST_HIWORD_MASK BIT(0) 617 563
+752
include/dt-bindings/clock/rk3399-cru.h
··· 1 + /* 2 + * Copyright (c) 2016 Rockchip Electronics Co. Ltd. 3 + * Author: Xing Zheng <zhengxing@rock-chips.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License as published by 7 + * the Free Software Foundation; either version 2 of the License, or 8 + * (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + */ 15 + 16 + #ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3399_H 17 + #define _DT_BINDINGS_CLK_ROCKCHIP_RK3399_H 18 + 19 + /* core clocks */ 20 + #define PLL_APLLL 1 21 + #define PLL_APLLB 2 22 + #define PLL_DPLL 3 23 + #define PLL_CPLL 4 24 + #define PLL_GPLL 5 25 + #define PLL_NPLL 6 26 + #define PLL_VPLL 7 27 + #define ARMCLKL 8 28 + #define ARMCLKB 9 29 + 30 + /* sclk gates (special clocks) */ 31 + #define SCLK_I2C1 65 32 + #define SCLK_I2C2 66 33 + #define SCLK_I2C3 67 34 + #define SCLK_I2C5 68 35 + #define SCLK_I2C6 69 36 + #define SCLK_I2C7 70 37 + #define SCLK_SPI0 71 38 + #define SCLK_SPI1 72 39 + #define SCLK_SPI2 73 40 + #define SCLK_SPI4 74 41 + #define SCLK_SPI5 75 42 + #define SCLK_SDMMC 76 43 + #define SCLK_SDIO 77 44 + #define SCLK_EMMC 78 45 + #define SCLK_TSADC 79 46 + #define SCLK_SARADC 80 47 + #define SCLK_UART0 81 48 + #define SCLK_UART1 82 49 + #define SCLK_UART2 83 50 + #define SCLK_UART3 84 51 + #define SCLK_SPDIF_8CH 85 52 + #define SCLK_I2S0_8CH 86 53 + #define SCLK_I2S1_8CH 87 54 + #define SCLK_I2S2_8CH 88 55 + #define SCLK_I2S_8CH_OUT 89 56 + #define SCLK_TIMER00 90 57 + #define SCLK_TIMER01 91 58 + #define SCLK_TIMER02 92 59 + #define SCLK_TIMER03 93 60 + #define SCLK_TIMER04 94 61 + #define SCLK_TIMER05 95 62 + #define SCLK_TIMER06 96 63 + #define SCLK_TIMER07 97 64 + #define SCLK_TIMER08 98 65 + #define SCLK_TIMER09 99 66 + #define SCLK_TIMER10 100 67 + #define SCLK_TIMER11 101 68 + #define SCLK_MACREF 102 69 + #define SCLK_MAC_RX 103 70 + #define SCLK_MAC_TX 104 71 + #define SCLK_MAC 105 72 + #define SCLK_MACREF_OUT 106 73 + #define SCLK_VOP0_PWM 107 74 + #define SCLK_VOP1_PWM 108 75 + #define SCLK_RGA 109 76 + #define SCLK_ISP0 110 77 + #define SCLK_ISP1 111 78 + #define SCLK_HDMI_CEC 112 79 + #define SCLK_HDMI_SFR 113 80 + #define SCLK_DP_CORE 114 81 + #define SCLK_PVTM_CORE_L 115 82 + #define SCLK_PVTM_CORE_B 116 83 + #define SCLK_PVTM_GPU 117 84 + #define SCLK_PVTM_DDR 118 85 + #define SCLK_MIPIDPHY_REF 119 86 + #define SCLK_MIPIDPHY_CFG 120 87 + #define SCLK_HSICPHY 121 88 + #define SCLK_USBPHY480M 122 89 + #define SCLK_USB2PHY0_REF 123 90 + #define SCLK_USB2PHY1_REF 124 91 + #define SCLK_UPHY0_TCPDPHY_REF 125 92 + #define SCLK_UPHY0_TCPDCORE 126 93 + #define SCLK_UPHY1_TCPDPHY_REF 127 94 + #define SCLK_UPHY1_TCPDCORE 128 95 + #define SCLK_USB3OTG0_REF 129 96 + #define SCLK_USB3OTG1_REF 130 97 + #define SCLK_USB3OTG0_SUSPEND 131 98 + #define SCLK_USB3OTG1_SUSPEND 132 99 + #define SCLK_CRYPTO0 133 100 + #define SCLK_CRYPTO1 134 101 + #define SCLK_CCI_TRACE 135 102 + #define SCLK_CS 136 103 + #define SCLK_CIF_OUT 137 104 + #define SCLK_PCIEPHY_REF 138 105 + #define SCLK_PCIE_CORE 139 106 + #define SCLK_M0_PERILP 140 107 + #define SCLK_M0_PERILP_DEC 141 108 + #define SCLK_CM0S 142 109 + #define SCLK_DBG_NOC 143 110 + #define SCLK_DBG_PD_CORE_B 144 111 + #define SCLK_DBG_PD_CORE_L 145 112 + #define SCLK_DFIMON0_TIMER 146 113 + #define SCLK_DFIMON1_TIMER 147 114 + #define SCLK_INTMEM0 148 115 + #define SCLK_INTMEM1 149 116 + #define SCLK_INTMEM2 150 117 + #define SCLK_INTMEM3 151 118 + #define SCLK_INTMEM4 152 119 + #define SCLK_INTMEM5 153 120 + #define SCLK_SDMMC_DRV 154 121 + #define SCLK_SDMMC_SAMPLE 155 122 + #define SCLK_SDIO_DRV 156 123 + #define SCLK_SDIO_SAMPLE 157 124 + #define SCLK_VDU_CORE 158 125 + #define SCLK_VDU_CA 159 126 + #define SCLK_PCIE_PM 160 127 + #define SCLK_SPDIF_REC_DPTX 161 128 + #define SCLK_DPHY_PLL 162 129 + #define SCLK_DPHY_TX0_CFG 163 130 + #define SCLK_DPHY_TX1RX1_CFG 164 131 + #define SCLK_DPHY_RX0_CFG 165 132 + 133 + #define DCLK_VOP0 180 134 + #define DCLK_VOP1 181 135 + #define DCLK_VOP0_DIV 182 136 + #define DCLK_VOP1_DIV 183 137 + #define DCLK_M0_PERILP 184 138 + 139 + #define FCLK_CM0S 190 140 + 141 + /* aclk gates */ 142 + #define ACLK_PERIHP 192 143 + #define ACLK_PERIHP_NOC 193 144 + #define ACLK_PERILP0 194 145 + #define ACLK_PERILP0_NOC 195 146 + #define ACLK_PERF_PCIE 196 147 + #define ACLK_PCIE 197 148 + #define ACLK_INTMEM 198 149 + #define ACLK_TZMA 199 150 + #define ACLK_DCF 200 151 + #define ACLK_CCI 201 152 + #define ACLK_CCI_NOC0 202 153 + #define ACLK_CCI_NOC1 203 154 + #define ACLK_CCI_GRF 204 155 + #define ACLK_CENTER 205 156 + #define ACLK_CENTER_MAIN_NOC 206 157 + #define ACLK_CENTER_PERI_NOC 207 158 + #define ACLK_GPU 208 159 + #define ACLK_PERF_GPU 209 160 + #define ACLK_GPU_GRF 210 161 + #define ACLK_DMAC0_PERILP 211 162 + #define ACLK_DMAC1_PERILP 212 163 + #define ACLK_GMAC 213 164 + #define ACLK_GMAC_NOC 214 165 + #define ACLK_PERF_GMAC 215 166 + #define ACLK_VOP0_NOC 216 167 + #define ACLK_VOP0 217 168 + #define ACLK_VOP1_NOC 218 169 + #define ACLK_VOP1 219 170 + #define ACLK_RGA 220 171 + #define ACLK_RGA_NOC 221 172 + #define ACLK_HDCP 222 173 + #define ACLK_HDCP_NOC 223 174 + #define ACLK_HDCP22 224 175 + #define ACLK_IEP 225 176 + #define ACLK_IEP_NOC 226 177 + #define ACLK_VIO 227 178 + #define ACLK_VIO_NOC 228 179 + #define ACLK_ISP0 229 180 + #define ACLK_ISP1 230 181 + #define ACLK_ISP0_NOC 231 182 + #define ACLK_ISP1_NOC 232 183 + #define ACLK_ISP0_WRAPPER 233 184 + #define ACLK_ISP1_WRAPPER 234 185 + #define ACLK_VCODEC 235 186 + #define ACLK_VCODEC_NOC 236 187 + #define ACLK_VDU 237 188 + #define ACLK_VDU_NOC 238 189 + #define ACLK_PERI 239 190 + #define ACLK_EMMC 240 191 + #define ACLK_EMMC_CORE 241 192 + #define ACLK_EMMC_NOC 242 193 + #define ACLK_EMMC_GRF 243 194 + #define ACLK_USB3 244 195 + #define ACLK_USB3_NOC 245 196 + #define ACLK_USB3OTG0 246 197 + #define ACLK_USB3OTG1 247 198 + #define ACLK_USB3_RKSOC_AXI_PERF 248 199 + #define ACLK_USB3_GRF 249 200 + #define ACLK_GIC 250 201 + #define ACLK_GIC_NOC 251 202 + #define ACLK_GIC_ADB400_CORE_L_2_GIC 252 203 + #define ACLK_GIC_ADB400_CORE_B_2_GIC 253 204 + #define ACLK_GIC_ADB400_GIC_2_CORE_L 254 205 + #define ACLK_GIC_ADB400_GIC_2_CORE_B 255 206 + #define ACLK_CORE_ADB400_CORE_L_2_CCI500 256 207 + #define ACLK_CORE_ADB400_CORE_B_2_CCI500 257 208 + #define ACLK_ADB400M_PD_CORE_L 258 209 + #define ACLK_ADB400M_PD_CORE_B 259 210 + #define ACLK_PERF_CORE_L 260 211 + #define ACLK_PERF_CORE_B 261 212 + #define ACLK_GIC_PRE 262 213 + #define ACLK_VOP0_PRE 263 214 + #define ACLK_VOP1_PRE 264 215 + 216 + /* pclk gates */ 217 + #define PCLK_PERIHP 320 218 + #define PCLK_PERIHP_NOC 321 219 + #define PCLK_PERILP0 322 220 + #define PCLK_PERILP1 323 221 + #define PCLK_PERILP1_NOC 324 222 + #define PCLK_PERILP_SGRF 325 223 + #define PCLK_PERIHP_GRF 326 224 + #define PCLK_PCIE 327 225 + #define PCLK_SGRF 328 226 + #define PCLK_INTR_ARB 329 227 + #define PCLK_CENTER_MAIN_NOC 330 228 + #define PCLK_CIC 331 229 + #define PCLK_COREDBG_B 332 230 + #define PCLK_COREDBG_L 333 231 + #define PCLK_DBG_CXCS_PD_CORE_B 334 232 + #define PCLK_DCF 335 233 + #define PCLK_GPIO2 336 234 + #define PCLK_GPIO3 337 235 + #define PCLK_GPIO4 338 236 + #define PCLK_GRF 339 237 + #define PCLK_HSICPHY 340 238 + #define PCLK_I2C1 341 239 + #define PCLK_I2C2 342 240 + #define PCLK_I2C3 343 241 + #define PCLK_I2C5 344 242 + #define PCLK_I2C6 345 243 + #define PCLK_I2C7 346 244 + #define PCLK_SPI0 347 245 + #define PCLK_SPI1 348 246 + #define PCLK_SPI2 349 247 + #define PCLK_SPI4 350 248 + #define PCLK_SPI5 351 249 + #define PCLK_UART0 352 250 + #define PCLK_UART1 353 251 + #define PCLK_UART2 354 252 + #define PCLK_UART3 355 253 + #define PCLK_TSADC 356 254 + #define PCLK_SARADC 357 255 + #define PCLK_GMAC 358 256 + #define PCLK_GMAC_NOC 359 257 + #define PCLK_TIMER0 360 258 + #define PCLK_TIMER1 361 259 + #define PCLK_EDP 362 260 + #define PCLK_EDP_NOC 363 261 + #define PCLK_EDP_CTRL 364 262 + #define PCLK_VIO 365 263 + #define PCLK_VIO_NOC 366 264 + #define PCLK_VIO_GRF 367 265 + #define PCLK_MIPI_DSI0 368 266 + #define PCLK_MIPI_DSI1 369 267 + #define PCLK_HDCP 370 268 + #define PCLK_HDCP_NOC 371 269 + #define PCLK_HDMI_CTRL 372 270 + #define PCLK_DP_CTRL 373 271 + #define PCLK_HDCP22 374 272 + #define PCLK_GASKET 375 273 + #define PCLK_DDR 376 274 + #define PCLK_DDR_MON 377 275 + #define PCLK_DDR_SGRF 378 276 + #define PCLK_ISP1_WRAPPER 379 277 + #define PCLK_WDT 380 278 + #define PCLK_EFUSE1024NS 381 279 + #define PCLK_EFUSE1024S 382 280 + #define PCLK_PMU_INTR_ARB 383 281 + #define PCLK_MAILBOX0 384 282 + #define PCLK_USBPHY_MUX_G 385 283 + #define PCLK_UPHY0_TCPHY_G 386 284 + #define PCLK_UPHY0_TCPD_G 387 285 + #define PCLK_UPHY1_TCPHY_G 388 286 + #define PCLK_UPHY1_TCPD_G 389 287 + #define PCLK_ALIVE 390 288 + 289 + /* hclk gates */ 290 + #define HCLK_PERIHP 448 291 + #define HCLK_PERILP0 449 292 + #define HCLK_PERILP1 450 293 + #define HCLK_PERILP0_NOC 451 294 + #define HCLK_PERILP1_NOC 452 295 + #define HCLK_M0_PERILP 453 296 + #define HCLK_M0_PERILP_NOC 454 297 + #define HCLK_AHB1TOM 455 298 + #define HCLK_HOST0 456 299 + #define HCLK_HOST0_ARB 457 300 + #define HCLK_HOST1 458 301 + #define HCLK_HOST1_ARB 459 302 + #define HCLK_HSIC 460 303 + #define HCLK_SD 461 304 + #define HCLK_SDMMC 462 305 + #define HCLK_SDMMC_NOC 463 306 + #define HCLK_M_CRYPTO0 464 307 + #define HCLK_M_CRYPTO1 465 308 + #define HCLK_S_CRYPTO0 466 309 + #define HCLK_S_CRYPTO1 467 310 + #define HCLK_I2S0_8CH 468 311 + #define HCLK_I2S1_8CH 469 312 + #define HCLK_I2S2_8CH 470 313 + #define HCLK_SPDIF 471 314 + #define HCLK_VOP0_NOC 472 315 + #define HCLK_VOP0 473 316 + #define HCLK_VOP1_NOC 474 317 + #define HCLK_VOP1 475 318 + #define HCLK_ROM 476 319 + #define HCLK_IEP 477 320 + #define HCLK_IEP_NOC 478 321 + #define HCLK_ISP0 479 322 + #define HCLK_ISP1 480 323 + #define HCLK_ISP0_NOC 481 324 + #define HCLK_ISP1_NOC 482 325 + #define HCLK_ISP0_WRAPPER 483 326 + #define HCLK_ISP1_WRAPPER 484 327 + #define HCLK_RGA 485 328 + #define HCLK_RGA_NOC 486 329 + #define HCLK_HDCP 487 330 + #define HCLK_HDCP_NOC 488 331 + #define HCLK_HDCP22 489 332 + #define HCLK_VCODEC 490 333 + #define HCLK_VCODEC_NOC 491 334 + #define HCLK_VDU 492 335 + #define HCLK_VDU_NOC 493 336 + #define HCLK_SDIO 494 337 + #define HCLK_SDIO_NOC 495 338 + #define HCLK_SDIOAUDIO_NOC 496 339 + 340 + #define CLK_NR_CLKS (HCLK_SDIOAUDIO_NOC + 1) 341 + 342 + /* pmu-clocks indices */ 343 + 344 + #define PLL_PPLL 1 345 + 346 + #define SCLK_32K_SUSPEND_PMU 2 347 + #define SCLK_SPI3_PMU 3 348 + #define SCLK_TIMER12_PMU 4 349 + #define SCLK_TIMER13_PMU 5 350 + #define SCLK_UART4_PMU 6 351 + #define SCLK_PVTM_PMU 7 352 + #define SCLK_WIFI_PMU 8 353 + #define SCLK_I2C0_PMU 9 354 + #define SCLK_I2C4_PMU 10 355 + #define SCLK_I2C8_PMU 11 356 + 357 + #define PCLK_SRC_PMU 19 358 + #define PCLK_PMU 20 359 + #define PCLK_PMUGRF_PMU 21 360 + #define PCLK_INTMEM1_PMU 22 361 + #define PCLK_GPIO0_PMU 23 362 + #define PCLK_GPIO1_PMU 24 363 + #define PCLK_SGRF_PMU 25 364 + #define PCLK_NOC_PMU 26 365 + #define PCLK_I2C0_PMU 27 366 + #define PCLK_I2C4_PMU 28 367 + #define PCLK_I2C8_PMU 29 368 + #define PCLK_RKPWM_PMU 30 369 + #define PCLK_SPI3_PMU 31 370 + #define PCLK_TIMER_PMU 32 371 + #define PCLK_MAILBOX_PMU 33 372 + #define PCLK_UART4_PMU 34 373 + #define PCLK_WDT_M0_PMU 35 374 + 375 + #define FCLK_CM0S_SRC_PMU 44 376 + #define FCLK_CM0S_PMU 45 377 + #define SCLK_CM0S_PMU 46 378 + #define HCLK_CM0S_PMU 47 379 + #define DCLK_CM0S_PMU 48 380 + #define PCLK_INTR_ARB_PMU 49 381 + #define HCLK_NOC_PMU 50 382 + 383 + #define CLKPMU_NR_CLKS (HCLK_NOC_PMU + 1) 384 + 385 + /* soft-reset indices */ 386 + 387 + /* cru_softrst_con0 */ 388 + #define SRST_CORE_L0 0 389 + #define SRST_CORE_B0 1 390 + #define SRST_CORE_PO_L0 2 391 + #define SRST_CORE_PO_B0 3 392 + #define SRST_L2_L 4 393 + #define SRST_L2_B 5 394 + #define SRST_ADB_L 6 395 + #define SRST_ADB_B 7 396 + #define SRST_A_CCI 8 397 + #define SRST_A_CCIM0_NOC 9 398 + #define SRST_A_CCIM1_NOC 10 399 + #define SRST_DBG_NOC 11 400 + 401 + /* cru_softrst_con1 */ 402 + #define SRST_CORE_L0_T 16 403 + #define SRST_CORE_L1 17 404 + #define SRST_CORE_L2 18 405 + #define SRST_CORE_L3 19 406 + #define SRST_CORE_PO_L0_T 20 407 + #define SRST_CORE_PO_L1 21 408 + #define SRST_CORE_PO_L2 22 409 + #define SRST_CORE_PO_L3 23 410 + #define SRST_A_ADB400_GIC2COREL 24 411 + #define SRST_A_ADB400_COREL2GIC 25 412 + #define SRST_P_DBG_L 26 413 + #define SRST_L2_L_T 28 414 + #define SRST_ADB_L_T 29 415 + #define SRST_A_RKPERF_L 30 416 + #define SRST_PVTM_CORE_L 31 417 + 418 + /* cru_softrst_con2 */ 419 + #define SRST_CORE_B0_T 32 420 + #define SRST_CORE_B1 33 421 + #define SRST_CORE_PO_B0_T 36 422 + #define SRST_CORE_PO_B1 37 423 + #define SRST_A_ADB400_GIC2COREB 40 424 + #define SRST_A_ADB400_COREB2GIC 41 425 + #define SRST_P_DBG_B 42 426 + #define SRST_L2_B_T 43 427 + #define SRST_ADB_B_T 45 428 + #define SRST_A_RKPERF_B 46 429 + #define SRST_PVTM_CORE_B 47 430 + 431 + /* cru_softrst_con3 */ 432 + #define SRST_A_CCI_T 50 433 + #define SRST_A_CCIM0_NOC_T 51 434 + #define SRST_A_CCIM1_NOC_T 52 435 + #define SRST_A_ADB400M_PD_CORE_B_T 53 436 + #define SRST_A_ADB400M_PD_CORE_L_T 54 437 + #define SRST_DBG_NOC_T 55 438 + #define SRST_DBG_CXCS 56 439 + #define SRST_CCI_TRACE 57 440 + #define SRST_P_CCI_GRF 58 441 + 442 + /* cru_softrst_con4 */ 443 + #define SRST_A_CENTER_MAIN_NOC 64 444 + #define SRST_A_CENTER_PERI_NOC 65 445 + #define SRST_P_CENTER_MAIN 66 446 + #define SRST_P_DDRMON 67 447 + #define SRST_P_CIC 68 448 + #define SRST_P_CENTER_SGRF 69 449 + #define SRST_DDR0_MSCH 70 450 + #define SRST_DDRCFG0_MSCH 71 451 + #define SRST_DDR0 72 452 + #define SRST_DDRPHY0 73 453 + #define SRST_DDR1_MSCH 74 454 + #define SRST_DDRCFG1_MSCH 75 455 + #define SRST_DDR1 76 456 + #define SRST_DDRPHY1 77 457 + #define SRST_DDR_CIC 78 458 + #define SRST_PVTM_DDR 79 459 + 460 + /* cru_softrst_con5 */ 461 + #define SRST_A_VCODEC_NOC 80 462 + #define SRST_A_VCODEC 81 463 + #define SRST_H_VCODEC_NOC 82 464 + #define SRST_H_VCODEC 83 465 + #define SRST_A_VDU_NOC 88 466 + #define SRST_A_VDU 89 467 + #define SRST_H_VDU_NOC 90 468 + #define SRST_H_VDU 91 469 + #define SRST_VDU_CORE 92 470 + #define SRST_VDU_CA 93 471 + 472 + /* cru_softrst_con6 */ 473 + #define SRST_A_IEP_NOC 96 474 + #define SRST_A_VOP_IEP 97 475 + #define SRST_A_IEP 98 476 + #define SRST_H_IEP_NOC 99 477 + #define SRST_H_IEP 100 478 + #define SRST_A_RGA_NOC 102 479 + #define SRST_A_RGA 103 480 + #define SRST_H_RGA_NOC 104 481 + #define SRST_H_RGA 105 482 + #define SRST_RGA_CORE 106 483 + #define SRST_EMMC_NOC 108 484 + #define SRST_EMMC 109 485 + #define SRST_EMMC_GRF 110 486 + 487 + /* cru_softrst_con7 */ 488 + #define SRST_A_PERIHP_NOC 112 489 + #define SRST_P_PERIHP_GRF 113 490 + #define SRST_H_PERIHP_NOC 114 491 + #define SRST_USBHOST0 115 492 + #define SRST_HOSTC0_AUX 116 493 + #define SRST_HOST0_ARB 117 494 + #define SRST_USBHOST1 118 495 + #define SRST_HOSTC1_AUX 119 496 + #define SRST_HOST1_ARB 120 497 + #define SRST_SDIO0 121 498 + #define SRST_SDMMC 122 499 + #define SRST_HSIC 123 500 + #define SRST_HSIC_AUX 124 501 + #define SRST_AHB1TOM 125 502 + #define SRST_P_PERIHP_NOC 126 503 + #define SRST_HSICPHY 127 504 + 505 + /* cru_softrst_con8 */ 506 + #define SRST_A_PCIE 128 507 + #define SRST_P_PCIE 129 508 + #define SRST_PCIE_CORE 130 509 + #define SRST_PCIE_MGMT 131 510 + #define SRST_PCIE_MGMT_STICKY 132 511 + #define SRST_PCIE_PIPE 133 512 + #define SRST_PCIE_PM 134 513 + #define SRST_PCIEPHY 135 514 + #define SRST_A_GMAC_NOC 136 515 + #define SRST_A_GMAC 137 516 + #define SRST_P_GMAC_NOC 138 517 + #define SRST_P_GMAC_GRF 140 518 + #define SRST_HSICPHY_POR 142 519 + #define SRST_HSICPHY_UTMI 143 520 + 521 + /* cru_softrst_con9 */ 522 + #define SRST_USB2PHY0_POR 144 523 + #define SRST_USB2PHY0_UTMI_PORT0 145 524 + #define SRST_USB2PHY0_UTMI_PORT1 146 525 + #define SRST_USB2PHY0_EHCIPHY 147 526 + #define SRST_UPHY0_PIPE_L00 148 527 + #define SRST_UPHY0 149 528 + #define SRST_UPHY0_TCPDPWRUP 150 529 + #define SRST_USB2PHY1_POR 152 530 + #define SRST_USB2PHY1_UTMI_PORT0 153 531 + #define SRST_USB2PHY1_UTMI_PORT1 154 532 + #define SRST_USB2PHY1_EHCIPHY 155 533 + #define SRST_UPHY1_PIPE_L00 156 534 + #define SRST_UPHY1 157 535 + #define SRST_UPHY1_TCPDPWRUP 158 536 + 537 + /* cru_softrst_con10 */ 538 + #define SRST_A_PERILP0_NOC 160 539 + #define SRST_A_DCF 161 540 + #define SRST_GIC500 162 541 + #define SRST_DMAC0_PERILP0 163 542 + #define SRST_DMAC1_PERILP0 164 543 + #define SRST_TZMA 165 544 + #define SRST_INTMEM 166 545 + #define SRST_ADB400_MST0 167 546 + #define SRST_ADB400_MST1 168 547 + #define SRST_ADB400_SLV0 169 548 + #define SRST_ADB400_SLV1 170 549 + #define SRST_H_PERILP0 171 550 + #define SRST_H_PERILP0_NOC 172 551 + #define SRST_ROM 173 552 + #define SRST_CRYPTO_S 174 553 + #define SRST_CRYPTO_M 175 554 + 555 + /* cru_softrst_con11 */ 556 + #define SRST_P_DCF 176 557 + #define SRST_CM0S_NOC 177 558 + #define SRST_CM0S 178 559 + #define SRST_CM0S_DBG 179 560 + #define SRST_CM0S_PO 180 561 + #define SRST_CRYPTO 181 562 + #define SRST_P_PERILP1_SGRF 182 563 + #define SRST_P_PERILP1_GRF 183 564 + #define SRST_CRYPTO1_S 184 565 + #define SRST_CRYPTO1_M 185 566 + #define SRST_CRYPTO1 186 567 + #define SRST_GIC_NOC 188 568 + #define SRST_SD_NOC 189 569 + #define SRST_SDIOAUDIO_BRG 190 570 + 571 + /* cru_softrst_con12 */ 572 + #define SRST_H_PERILP1 192 573 + #define SRST_H_PERILP1_NOC 193 574 + #define SRST_H_I2S0_8CH 194 575 + #define SRST_H_I2S1_8CH 195 576 + #define SRST_H_I2S2_8CH 196 577 + #define SRST_H_SPDIF_8CH 197 578 + #define SRST_P_PERILP1_NOC 198 579 + #define SRST_P_EFUSE_1024 199 580 + #define SRST_P_EFUSE_1024S 200 581 + #define SRST_P_I2C0 201 582 + #define SRST_P_I2C1 202 583 + #define SRST_P_I2C2 203 584 + #define SRST_P_I2C3 204 585 + #define SRST_P_I2C4 205 586 + #define SRST_P_I2C5 206 587 + #define SRST_P_MAILBOX0 207 588 + 589 + /* cru_softrst_con13 */ 590 + #define SRST_P_UART0 208 591 + #define SRST_P_UART1 209 592 + #define SRST_P_UART2 210 593 + #define SRST_P_UART3 211 594 + #define SRST_P_SARADC 212 595 + #define SRST_P_TSADC 213 596 + #define SRST_P_SPI0 214 597 + #define SRST_P_SPI1 215 598 + #define SRST_P_SPI2 216 599 + #define SRST_P_SPI3 217 600 + #define SRST_P_SPI4 218 601 + #define SRST_SPI0 219 602 + #define SRST_SPI1 220 603 + #define SRST_SPI2 221 604 + #define SRST_SPI3 222 605 + #define SRST_SPI4 223 606 + 607 + /* cru_softrst_con14 */ 608 + #define SRST_I2S0_8CH 224 609 + #define SRST_I2S1_8CH 225 610 + #define SRST_I2S2_8CH 226 611 + #define SRST_SPDIF_8CH 227 612 + #define SRST_UART0 228 613 + #define SRST_UART1 229 614 + #define SRST_UART2 230 615 + #define SRST_UART3 231 616 + #define SRST_TSADC 232 617 + #define SRST_I2C0 233 618 + #define SRST_I2C1 234 619 + #define SRST_I2C2 235 620 + #define SRST_I2C3 236 621 + #define SRST_I2C4 237 622 + #define SRST_I2C5 238 623 + #define SRST_SDIOAUDIO_NOC 239 624 + 625 + /* cru_softrst_con15 */ 626 + #define SRST_A_VIO_NOC 240 627 + #define SRST_A_HDCP_NOC 241 628 + #define SRST_A_HDCP 242 629 + #define SRST_H_HDCP_NOC 243 630 + #define SRST_H_HDCP 244 631 + #define SRST_P_HDCP_NOC 245 632 + #define SRST_P_HDCP 246 633 + #define SRST_P_HDMI_CTRL 247 634 + #define SRST_P_DP_CTRL 248 635 + #define SRST_S_DP_CTRL 249 636 + #define SRST_C_DP_CTRL 250 637 + #define SRST_P_MIPI_DSI0 251 638 + #define SRST_P_MIPI_DSI1 252 639 + #define SRST_DP_CORE 253 640 + #define SRST_DP_I2S 254 641 + 642 + /* cru_softrst_con16 */ 643 + #define SRST_GASKET 256 644 + #define SRST_VIO_GRF 258 645 + #define SRST_DPTX_SPDIF_REC 259 646 + #define SRST_HDMI_CTRL 260 647 + #define SRST_HDCP_CTRL 261 648 + #define SRST_A_ISP0_NOC 262 649 + #define SRST_A_ISP1_NOC 263 650 + #define SRST_H_ISP0_NOC 266 651 + #define SRST_H_ISP1_NOC 267 652 + #define SRST_H_ISP0 268 653 + #define SRST_H_ISP1 269 654 + #define SRST_ISP0 270 655 + #define SRST_ISP1 271 656 + 657 + /* cru_softrst_con17 */ 658 + #define SRST_A_VOP0_NOC 272 659 + #define SRST_A_VOP1_NOC 273 660 + #define SRST_A_VOP0 274 661 + #define SRST_A_VOP1 275 662 + #define SRST_H_VOP0_NOC 276 663 + #define SRST_H_VOP1_NOC 277 664 + #define SRST_H_VOP0 278 665 + #define SRST_H_VOP1 279 666 + #define SRST_D_VOP0 280 667 + #define SRST_D_VOP1 281 668 + #define SRST_VOP0_PWM 282 669 + #define SRST_VOP1_PWM 283 670 + #define SRST_P_EDP_NOC 284 671 + #define SRST_P_EDP_CTRL 285 672 + 673 + /* cru_softrst_con18 */ 674 + #define SRST_A_GPU_NOC 289 675 + #define SRST_A_GPU_GRF 290 676 + #define SRST_PVTM_GPU 291 677 + #define SRST_A_USB3_NOC 292 678 + #define SRST_A_USB3_OTG0 293 679 + #define SRST_A_USB3_OTG1 294 680 + #define SRST_A_USB3_GRF 295 681 + #define SRST_PMU 296 682 + 683 + /* cru_softrst_con19 */ 684 + #define SRST_P_TIMER0_5 304 685 + #define SRST_TIMER0 305 686 + #define SRST_TIMER1 306 687 + #define SRST_TIMER2 307 688 + #define SRST_TIMER3 308 689 + #define SRST_TIMER4 309 690 + #define SRST_TIMER5 310 691 + #define SRST_P_TIMER6_11 311 692 + #define SRST_TIMER6 312 693 + #define SRST_TIMER7 313 694 + #define SRST_TIMER8 314 695 + #define SRST_TIMER9 315 696 + #define SRST_TIMER10 316 697 + #define SRST_TIMER11 317 698 + #define SRST_P_INTR_ARB_PMU 318 699 + #define SRST_P_ALIVE_SGRF 319 700 + 701 + /* cru_softrst_con20 */ 702 + #define SRST_P_GPIO2 320 703 + #define SRST_P_GPIO3 321 704 + #define SRST_P_GPIO4 322 705 + #define SRST_P_GRF 323 706 + #define SRST_P_ALIVE_NOC 324 707 + #define SRST_P_WDT0 325 708 + #define SRST_P_WDT1 326 709 + #define SRST_P_INTR_ARB 327 710 + #define SRST_P_UPHY0_DPTX 328 711 + #define SRST_P_UPHY0_APB 330 712 + #define SRST_P_UPHY0_TCPHY 332 713 + #define SRST_P_UPHY1_TCPHY 333 714 + #define SRST_P_UPHY0_TCPDCTRL 334 715 + #define SRST_P_UPHY1_TCPDCTRL 335 716 + 717 + /* pmu soft-reset indices */ 718 + 719 + /* pmu_cru_softrst_con0 */ 720 + #define SRST_P_NOC 0 721 + #define SRST_P_INTMEM 1 722 + #define SRST_H_CM0S 2 723 + #define SRST_H_CM0S_NOC 3 724 + #define SRST_DBG_CM0S 4 725 + #define SRST_PO_CM0S 5 726 + #define SRST_P_SPI6 6 727 + #define SRST_SPI6 7 728 + #define SRST_P_TIMER_0_1 8 729 + #define SRST_P_TIMER_0 9 730 + #define SRST_P_TIMER_1 10 731 + #define SRST_P_UART4 11 732 + #define SRST_UART4 12 733 + #define SRST_P_WDT 13 734 + 735 + /* pmu_cru_softrst_con1 */ 736 + #define SRST_P_I2C6 16 737 + #define SRST_P_I2C7 17 738 + #define SRST_P_I2C8 18 739 + #define SRST_P_MAILBOX 19 740 + #define SRST_P_RKPWM 20 741 + #define SRST_P_PMUGRF 21 742 + #define SRST_P_SGRF 22 743 + #define SRST_P_GPIO0 23 744 + #define SRST_P_GPIO1 24 745 + #define SRST_P_CRU 25 746 + #define SRST_P_INTR 26 747 + #define SRST_PVTM 27 748 + #define SRST_I2C6 28 749 + #define SRST_I2C7 29 750 + #define SRST_I2C8 30 751 + 752 + #endif