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

Merge branches 'clk-mediatek', 'clk-hisi', 'clk-allwinner', 'clk-ux500' and 'clk-renesas' into clk-next

* clk-mediatek:
clk: mediatek: add audsys support for MT2701
clk: mediatek: add devm_of_platform_populate() for MT7622 audsys
dt-bindings: clock: mediatek: add audsys support for MT2701
dt-bindings: clock: mediatek: update audsys documentation to adapt MFD device
clk: mediatek: update missing clock data for MT7622 audsys
clk: mediatek: fix PWM clock source by adding a fixed-factor clock
dt-bindings: clock: mediatek: add binding for fixed-factor clock axisel_d4

* clk-hisi:
clk: hisilicon: fix potential NULL dereference in hisi_clk_alloc()
clk: hisilicon: mark wdt_mux_p[] as const
clk: hisilicon: Mark phase_ops static
clk: hi3798cv200: add emmc sample and drive clock
clk: hisilicon: add hisi phase clock support
clk: hi3798cv200: add COMBPHY0 clock support
clk: hi3798cv200: fix define indentation
clk: hi3798cv200: add support for HISTB_USB2_OTG_UTMI_CLK
clk: hi3798cv200: correct IR clock parent
clk: hi3798cv200: fix unregister call sequence in error path

* clk-allwinner:
clk: sunxi-ng: add missing hdmi-slow clock for H6 CCU
clk: sunxi-ng: add support for the Allwinner H6 CCU
dt-bindings: add device tree binding for Allwinner H6 main CCU
clk: sunxi-ng: Support fixed post-dividers on NKMP style clocks
clk: sunxi-ng: h3: h5: export CLK_PLL_VIDEO
clk: sunxi-ng: h3: h5: Allow some clocks to set parent rate
clk: sunxi-ng: h3: h5: Add minimal rate for video PLL
clk: sunxi-ng: Add check for minimal rate to NM PLLs
clk: sunxi-ng: Use u64 for calculation of nkmp rate
clk: sunxi-ng: Mask nkmp factors when setting register
clk: sunxi-ng: remove select on obsolete SUNXI_CCU_X kconfig name

* clk-ux500:
clk: ux500: Drop AB8540/9540 support

* clk-renesas: (27 commits)
clk: renesas: cpg-mssr: Adjust r8a77980 ifdef
clk: renesas: rcar-gen3: Always use readl()/writel()
clk: renesas: sh73a0: Always use readl()/writel()
clk: renesas: rza1: Always use readl()/writel()
clk: renesas: rcar-gen2: Always use readl()/writel()
clk: renesas: r8a7740: Always use readl()/writel()
clk: renesas: r8a73a4: Always use readl()/writel()
clk: renesas: mstp: Always use readl()/writel()
clk: renesas: div6: Always use readl()/writel()
clk: fix false-positive Wmaybe-uninitialized warning
clk: renesas: r8a77965: Replace DU2 clock
clk: renesas: cpg-mssr: Add support for R-Car M3-N
clk: renesas: cpg-mssr: add R8A77980 support
dt-bindings: clock: add R8A77980 CPG core clock definitions
clk: renesas: r8a7792: Add rwdt clock
clk: renesas: r8a7794: Add rwdt clock
clk: renesas: r8a7791/r8a7793: Add rwdt clock
clk: renesas: r8a7790: Add rwdt clock
clk: renesas: r8a7745: Add rwdt clock
clk: renesas: r8a7743: Add rwdt clock
...

+2980 -793
+15 -5
Documentation/devicetree/bindings/arm/mediatek/mediatek,audsys.txt
··· 6 6 Required Properties: 7 7 8 8 - compatible: Should be one of: 9 + - "mediatek,mt2701-audsys", "syscon" 9 10 - "mediatek,mt7622-audsys", "syscon" 10 11 - #clock-cells: Must be 1 11 12 ··· 14 13 Documentation/devicetree/bindings/clock/clock-bindings.txt 15 14 The available clocks are defined in dt-bindings/clock/mt*-clk.h. 16 15 16 + Required sub-nodes: 17 + ------- 18 + For common binding part and usage, refer to 19 + ../sonud/mt2701-afe-pcm.txt. 20 + 17 21 Example: 18 22 19 - audsys: audsys@11220000 { 20 - compatible = "mediatek,mt7622-audsys", "syscon"; 21 - reg = <0 0x11220000 0 0x1000>; 22 - #clock-cells = <1>; 23 - }; 23 + audsys: clock-controller@11220000 { 24 + compatible = "mediatek,mt7622-audsys", "syscon"; 25 + reg = <0 0x11220000 0 0x2000>; 26 + #clock-cells = <1>; 27 + 28 + afe: audio-controller { 29 + ... 30 + }; 31 + };
+4 -2
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 22 22 - "renesas,r8a7794-cpg-mssr" for the r8a7794 SoC (R-Car E2) 23 23 - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3) 24 24 - "renesas,r8a7796-cpg-mssr" for the r8a7796 SoC (R-Car M3-W) 25 + - "renesas,r8a77965-cpg-mssr" for the r8a77965 SoC (R-Car M3-N) 25 26 - "renesas,r8a77970-cpg-mssr" for the r8a77970 SoC (R-Car V3M) 27 + - "renesas,r8a77980-cpg-mssr" for the r8a77980 SoC (R-Car V3H) 26 28 - "renesas,r8a77995-cpg-mssr" for the r8a77995 SoC (R-Car D3) 27 29 28 30 - reg: Base address and length of the memory resource used by the CPG/MSSR ··· 34 32 clock-names 35 33 - clock-names: List of external parent clock names. Valid names are: 36 34 - "extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794, 37 - r8a7795, r8a7796, r8a77970, r8a77995) 38 - - "extalr" (r8a7795, r8a7796, r8a77970) 35 + r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77995) 36 + - "extalr" (r8a7795, r8a7796, r8a77965, r8a77970, r8a77980) 39 37 - "usb_extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7793, r8a7794) 40 38 41 39 - #clock-cells: Must be 2
+4
Documentation/devicetree/bindings/clock/sunxi-ccu.txt
··· 20 20 - "allwinner,sun50i-a64-ccu" 21 21 - "allwinner,sun50i-a64-r-ccu" 22 22 - "allwinner,sun50i-h5-ccu" 23 + - "allwinner,sun50i-h6-ccu" 23 24 - "nextthing,gr8-ccu" 24 25 25 26 - reg: Must contain the registers base address and length ··· 31 30 - clock-names: Must contain the clock names described just above 32 31 - #clock-cells : must contain 1 33 32 - #reset-cells : must contain 1 33 + 34 + For the main CCU on H6, one more clock is needed: 35 + - "iosc": the SoC's internal frequency oscillator 34 36 35 37 For the PRCM CCUs on A83T/H3/A64, two more clocks are needed: 36 38 - "pll-periph": the SoC's peripheral PLL from the main CCU
+1 -1
drivers/clk/hisilicon/Makefile
··· 3 3 # Hisilicon Clock specific Makefile 4 4 # 5 5 6 - obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o 6 + obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o clk-hisi-phase.o 7 7 8 8 obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o 9 9 obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o
+121
drivers/clk/hisilicon/clk-hisi-phase.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2017 HiSilicon Technologies Co., Ltd. 4 + * 5 + * Simple HiSilicon phase clock implementation. 6 + */ 7 + 8 + #include <linux/err.h> 9 + #include <linux/io.h> 10 + #include <linux/module.h> 11 + #include <linux/platform_device.h> 12 + #include <linux/slab.h> 13 + 14 + #include "clk.h" 15 + 16 + struct clk_hisi_phase { 17 + struct clk_hw hw; 18 + void __iomem *reg; 19 + u32 *phase_degrees; 20 + u32 *phase_regvals; 21 + u8 phase_num; 22 + u32 mask; 23 + u8 shift; 24 + u8 flags; 25 + spinlock_t *lock; 26 + }; 27 + 28 + #define to_clk_hisi_phase(_hw) container_of(_hw, struct clk_hisi_phase, hw) 29 + 30 + static int hisi_phase_regval_to_degrees(struct clk_hisi_phase *phase, 31 + u32 regval) 32 + { 33 + int i; 34 + 35 + for (i = 0; i < phase->phase_num; i++) 36 + if (phase->phase_regvals[i] == regval) 37 + return phase->phase_degrees[i]; 38 + 39 + return -EINVAL; 40 + } 41 + 42 + static int hisi_clk_get_phase(struct clk_hw *hw) 43 + { 44 + struct clk_hisi_phase *phase = to_clk_hisi_phase(hw); 45 + u32 regval; 46 + 47 + regval = readl(phase->reg); 48 + regval = (regval & phase->mask) >> phase->shift; 49 + 50 + return hisi_phase_regval_to_degrees(phase, regval); 51 + } 52 + 53 + static int hisi_phase_degrees_to_regval(struct clk_hisi_phase *phase, 54 + int degrees) 55 + { 56 + int i; 57 + 58 + for (i = 0; i < phase->phase_num; i++) 59 + if (phase->phase_degrees[i] == degrees) 60 + return phase->phase_regvals[i]; 61 + 62 + return -EINVAL; 63 + } 64 + 65 + static int hisi_clk_set_phase(struct clk_hw *hw, int degrees) 66 + { 67 + struct clk_hisi_phase *phase = to_clk_hisi_phase(hw); 68 + unsigned long flags = 0; 69 + int regval; 70 + u32 val; 71 + 72 + regval = hisi_phase_degrees_to_regval(phase, degrees); 73 + if (regval < 0) 74 + return regval; 75 + 76 + spin_lock_irqsave(phase->lock, flags); 77 + 78 + val = clk_readl(phase->reg); 79 + val &= ~phase->mask; 80 + val |= regval << phase->shift; 81 + clk_writel(val, phase->reg); 82 + 83 + spin_unlock_irqrestore(phase->lock, flags); 84 + 85 + return 0; 86 + } 87 + 88 + static const struct clk_ops clk_phase_ops = { 89 + .get_phase = hisi_clk_get_phase, 90 + .set_phase = hisi_clk_set_phase, 91 + }; 92 + 93 + struct clk *clk_register_hisi_phase(struct device *dev, 94 + const struct hisi_phase_clock *clks, 95 + void __iomem *base, spinlock_t *lock) 96 + { 97 + struct clk_hisi_phase *phase; 98 + struct clk_init_data init; 99 + 100 + phase = devm_kzalloc(dev, sizeof(struct clk_hisi_phase), GFP_KERNEL); 101 + if (!phase) 102 + return ERR_PTR(-ENOMEM); 103 + 104 + init.name = clks->name; 105 + init.ops = &clk_phase_ops; 106 + init.flags = clks->flags | CLK_IS_BASIC; 107 + init.parent_names = clks->parent_names ? &clks->parent_names : NULL; 108 + init.num_parents = clks->parent_names ? 1 : 0; 109 + 110 + phase->reg = base + clks->offset; 111 + phase->shift = clks->shift; 112 + phase->mask = (BIT(clks->width) - 1) << clks->shift; 113 + phase->lock = lock; 114 + phase->phase_degrees = clks->phase_degrees; 115 + phase->phase_regvals = clks->phase_regvals; 116 + phase->phase_num = clks->phase_num; 117 + phase->hw.init = &init; 118 + 119 + return devm_clk_register(dev, &phase->hw); 120 + } 121 + EXPORT_SYMBOL_GPL(clk_register_hisi_phase);
+26
drivers/clk/hisilicon/clk.c
··· 49 49 return NULL; 50 50 51 51 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 52 + if (!res) 53 + return NULL; 52 54 clk_data->base = devm_ioremap(&pdev->dev, 53 55 res->start, resource_size(res)); 54 56 if (!clk_data->base) ··· 198 196 return PTR_ERR(clk); 199 197 } 200 198 EXPORT_SYMBOL_GPL(hisi_clk_register_mux); 199 + 200 + int hisi_clk_register_phase(struct device *dev, 201 + const struct hisi_phase_clock *clks, 202 + int nums, struct hisi_clock_data *data) 203 + { 204 + void __iomem *base = data->base; 205 + struct clk *clk; 206 + int i; 207 + 208 + for (i = 0; i < nums; i++) { 209 + clk = clk_register_hisi_phase(dev, &clks[i], base, 210 + &hisi_clk_lock); 211 + if (IS_ERR(clk)) { 212 + pr_err("%s: failed to register clock %s\n", __func__, 213 + clks[i].name); 214 + return PTR_ERR(clk); 215 + } 216 + 217 + data->clk_data.clks[clks[i].id] = clk; 218 + } 219 + 220 + return 0; 221 + } 222 + EXPORT_SYMBOL_GPL(hisi_clk_register_phase); 201 223 202 224 int hisi_clk_register_divider(const struct hisi_divider_clock *clks, 203 225 int nums, struct hisi_clock_data *data)
+19
drivers/clk/hisilicon/clk.h
··· 68 68 const char *alias; 69 69 }; 70 70 71 + struct hisi_phase_clock { 72 + unsigned int id; 73 + const char *name; 74 + const char *parent_names; 75 + unsigned long flags; 76 + unsigned long offset; 77 + u8 shift; 78 + u8 width; 79 + u32 *phase_degrees; 80 + u32 *phase_regvals; 81 + u8 phase_num; 82 + }; 83 + 71 84 struct hisi_divider_clock { 72 85 unsigned int id; 73 86 const char *name; ··· 133 120 int, struct hisi_clock_data *); 134 121 int hisi_clk_register_mux(const struct hisi_mux_clock *, int, 135 122 struct hisi_clock_data *); 123 + struct clk *clk_register_hisi_phase(struct device *dev, 124 + const struct hisi_phase_clock *clks, 125 + void __iomem *base, spinlock_t *lock); 126 + int hisi_clk_register_phase(struct device *dev, 127 + const struct hisi_phase_clock *clks, 128 + int nums, struct hisi_clock_data *data); 136 129 int hisi_clk_register_divider(const struct hisi_divider_clock *, 137 130 int, struct hisi_clock_data *); 138 131 int hisi_clk_register_gate(const struct hisi_gate_clock *,
+1 -1
drivers/clk/hisilicon/crg-hi3516cv300.c
··· 204 204 /* hi3516CV300 sysctrl CRG */ 205 205 #define HI3516CV300_SYSCTRL_NR_CLKS 16 206 206 207 - static const char *wdt_mux_p[] __initconst = { "3m", "apb" }; 207 + static const char *const wdt_mux_p[] __initconst = { "3m", "apb" }; 208 208 static u32 wdt_mux_table[] = {0, 1}; 209 209 210 210 static const struct hisi_mux_clock hi3516cv300_sysctrl_mux_clks[] = {
+63 -35
drivers/clk/hisilicon/crg-hi3798cv200.c
··· 27 27 #include "reset.h" 28 28 29 29 /* hi3798CV200 core CRG */ 30 - #define HI3798CV200_INNER_CLK_OFFSET 64 31 - #define HI3798CV200_FIXED_24M 65 32 - #define HI3798CV200_FIXED_25M 66 33 - #define HI3798CV200_FIXED_50M 67 34 - #define HI3798CV200_FIXED_75M 68 35 - #define HI3798CV200_FIXED_100M 69 36 - #define HI3798CV200_FIXED_150M 70 37 - #define HI3798CV200_FIXED_200M 71 38 - #define HI3798CV200_FIXED_250M 72 39 - #define HI3798CV200_FIXED_300M 73 40 - #define HI3798CV200_FIXED_400M 74 41 - #define HI3798CV200_MMC_MUX 75 42 - #define HI3798CV200_ETH_PUB_CLK 76 43 - #define HI3798CV200_ETH_BUS_CLK 77 44 - #define HI3798CV200_ETH_BUS0_CLK 78 45 - #define HI3798CV200_ETH_BUS1_CLK 79 46 - #define HI3798CV200_COMBPHY1_MUX 80 47 - #define HI3798CV200_FIXED_12M 81 48 - #define HI3798CV200_FIXED_48M 82 49 - #define HI3798CV200_FIXED_60M 83 50 - #define HI3798CV200_FIXED_166P5M 84 51 - #define HI3798CV200_SDIO0_MUX 85 30 + #define HI3798CV200_INNER_CLK_OFFSET 64 31 + #define HI3798CV200_FIXED_24M 65 32 + #define HI3798CV200_FIXED_25M 66 33 + #define HI3798CV200_FIXED_50M 67 34 + #define HI3798CV200_FIXED_75M 68 35 + #define HI3798CV200_FIXED_100M 69 36 + #define HI3798CV200_FIXED_150M 70 37 + #define HI3798CV200_FIXED_200M 71 38 + #define HI3798CV200_FIXED_250M 72 39 + #define HI3798CV200_FIXED_300M 73 40 + #define HI3798CV200_FIXED_400M 74 41 + #define HI3798CV200_MMC_MUX 75 42 + #define HI3798CV200_ETH_PUB_CLK 76 43 + #define HI3798CV200_ETH_BUS_CLK 77 44 + #define HI3798CV200_ETH_BUS0_CLK 78 45 + #define HI3798CV200_ETH_BUS1_CLK 79 46 + #define HI3798CV200_COMBPHY1_MUX 80 47 + #define HI3798CV200_FIXED_12M 81 48 + #define HI3798CV200_FIXED_48M 82 49 + #define HI3798CV200_FIXED_60M 83 50 + #define HI3798CV200_FIXED_166P5M 84 51 + #define HI3798CV200_SDIO0_MUX 85 52 + #define HI3798CV200_COMBPHY0_MUX 86 52 53 53 - #define HI3798CV200_CRG_NR_CLKS 128 54 + #define HI3798CV200_CRG_NR_CLKS 128 54 55 55 56 static const struct hisi_fixed_rate_clock hi3798cv200_fixed_rate_clks[] = { 56 57 { HISTB_OSC_CLK, "clk_osc", NULL, 0, 24000000, }, ··· 75 74 "100m", "50m", "25m", "200m", "150m" }; 76 75 static u32 mmc_mux_table[] = {0, 1, 2, 3, 6}; 77 76 78 - static const char *const comphy1_mux_p[] = { 77 + static const char *const comphy_mux_p[] = { 79 78 "100m", "25m"}; 80 - static u32 comphy1_mux_table[] = {2, 3}; 79 + static u32 comphy_mux_table[] = {2, 3}; 81 80 82 81 static const char *const sdio_mux_p[] = { 83 82 "100m", "50m", "150m", "166p5m" }; ··· 86 85 static struct hisi_mux_clock hi3798cv200_mux_clks[] = { 87 86 { HI3798CV200_MMC_MUX, "mmc_mux", mmc_mux_p, ARRAY_SIZE(mmc_mux_p), 88 87 CLK_SET_RATE_PARENT, 0xa0, 8, 3, 0, mmc_mux_table, }, 88 + { HI3798CV200_COMBPHY0_MUX, "combphy0_mux", 89 + comphy_mux_p, ARRAY_SIZE(comphy_mux_p), 90 + CLK_SET_RATE_PARENT, 0x188, 2, 2, 0, comphy_mux_table, }, 89 91 { HI3798CV200_COMBPHY1_MUX, "combphy1_mux", 90 - comphy1_mux_p, ARRAY_SIZE(comphy1_mux_p), 91 - CLK_SET_RATE_PARENT, 0x188, 10, 2, 0, comphy1_mux_table, }, 92 + comphy_mux_p, ARRAY_SIZE(comphy_mux_p), 93 + CLK_SET_RATE_PARENT, 0x188, 10, 2, 0, comphy_mux_table, }, 92 94 { HI3798CV200_SDIO0_MUX, "sdio0_mux", sdio_mux_p, 93 95 ARRAY_SIZE(sdio_mux_p), CLK_SET_RATE_PARENT, 94 96 0x9c, 8, 2, 0, sdio_mux_table, }, 97 + }; 98 + 99 + static u32 mmc_phase_regvals[] = {0, 1, 2, 3, 4, 5, 6, 7}; 100 + static u32 mmc_phase_degrees[] = {0, 45, 90, 135, 180, 225, 270, 315}; 101 + 102 + static struct hisi_phase_clock hi3798cv200_phase_clks[] = { 103 + { HISTB_MMC_SAMPLE_CLK, "mmc_sample", "clk_mmc_ciu", 104 + CLK_SET_RATE_PARENT, 0xa0, 12, 3, mmc_phase_degrees, 105 + mmc_phase_regvals, ARRAY_SIZE(mmc_phase_regvals) }, 106 + { HISTB_MMC_DRV_CLK, "mmc_drive", "clk_mmc_ciu", 107 + CLK_SET_RATE_PARENT, 0xa0, 16, 3, mmc_phase_degrees, 108 + mmc_phase_regvals, ARRAY_SIZE(mmc_phase_regvals) }, 95 109 }; 96 110 97 111 static const struct hisi_gate_clock hi3798cv200_gate_clks[] = { ··· 163 147 CLK_SET_RATE_PARENT, 0xcc, 4, 0, }, 164 148 { HISTB_ETH1_MACIF_CLK, "clk_macif1", "clk_bus_m1", 165 149 CLK_SET_RATE_PARENT, 0xcc, 25, 0, }, 150 + /* COMBPHY0 */ 151 + { HISTB_COMBPHY0_CLK, "clk_combphy0", "combphy0_mux", 152 + CLK_SET_RATE_PARENT, 0x188, 0, 0, }, 166 153 /* COMBPHY1 */ 167 154 { HISTB_COMBPHY1_CLK, "clk_combphy1", "combphy1_mux", 168 155 CLK_SET_RATE_PARENT, 0x188, 8, 0, }, ··· 180 161 CLK_SET_RATE_PARENT, 0xb8, 1, 0 }, 181 162 { HISTB_USB2_UTMI_CLK, "clk_u2_utmi", "60m", 182 163 CLK_SET_RATE_PARENT, 0xb8, 5, 0 }, 164 + { HISTB_USB2_OTG_UTMI_CLK, "clk_u2_otg_utmi", "60m", 165 + CLK_SET_RATE_PARENT, 0xb8, 3, 0 }, 183 166 { HISTB_USB2_PHY1_REF_CLK, "clk_u2_phy1_ref", "24m", 184 167 CLK_SET_RATE_PARENT, 0xbc, 0, 0 }, 185 168 { HISTB_USB2_PHY2_REF_CLK, "clk_u2_phy2_ref", "24m", ··· 197 176 clk_data = hisi_clk_alloc(pdev, HI3798CV200_CRG_NR_CLKS); 198 177 if (!clk_data) 199 178 return ERR_PTR(-ENOMEM); 179 + 180 + /* hisi_phase_clock is resource managed */ 181 + ret = hisi_clk_register_phase(&pdev->dev, 182 + hi3798cv200_phase_clks, 183 + ARRAY_SIZE(hi3798cv200_phase_clks), 184 + clk_data); 185 + if (ret) 186 + return ERR_PTR(ret); 200 187 201 188 ret = hisi_clk_register_fixed_rate(hi3798cv200_fixed_rate_clks, 202 189 ARRAY_SIZE(hi3798cv200_fixed_rate_clks), ··· 231 202 232 203 return clk_data; 233 204 234 - unregister_fixed_rate: 235 - hisi_clk_unregister_fixed_rate(hi3798cv200_fixed_rate_clks, 236 - ARRAY_SIZE(hi3798cv200_fixed_rate_clks), 205 + unregister_gate: 206 + hisi_clk_unregister_gate(hi3798cv200_gate_clks, 207 + ARRAY_SIZE(hi3798cv200_gate_clks), 237 208 clk_data); 238 - 239 209 unregister_mux: 240 210 hisi_clk_unregister_mux(hi3798cv200_mux_clks, 241 211 ARRAY_SIZE(hi3798cv200_mux_clks), 242 212 clk_data); 243 - unregister_gate: 244 - hisi_clk_unregister_gate(hi3798cv200_gate_clks, 245 - ARRAY_SIZE(hi3798cv200_gate_clks), 213 + unregister_fixed_rate: 214 + hisi_clk_unregister_fixed_rate(hi3798cv200_fixed_rate_clks, 215 + ARRAY_SIZE(hi3798cv200_fixed_rate_clks), 246 216 clk_data); 247 217 return ERR_PTR(ret); 248 218 } ··· 273 245 #define HI3798CV200_SYSCTRL_NR_CLKS 16 274 246 275 247 static const struct hisi_gate_clock hi3798cv200_sysctrl_gate_clks[] = { 276 - { HISTB_IR_CLK, "clk_ir", "100m", 248 + { HISTB_IR_CLK, "clk_ir", "24m", 277 249 CLK_SET_RATE_PARENT, 0x48, 4, 0, }, 278 250 { HISTB_TIMER01_CLK, "clk_timer01", "24m", 279 251 CLK_SET_RATE_PARENT, 0x48, 6, 0, },
+6
drivers/clk/mediatek/Kconfig
··· 54 54 ---help--- 55 55 This driver supports MediaTek MT2701 bdpsys clocks. 56 56 57 + config COMMON_CLK_MT2701_AUDSYS 58 + bool "Clock driver for Mediatek MT2701 audsys" 59 + depends on COMMON_CLK_MT2701 60 + ---help--- 61 + This driver supports Mediatek MT2701 audsys clocks. 62 + 57 63 config COMMON_CLK_MT2712 58 64 bool "Clock driver for MediaTek MT2712" 59 65 depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
+1
drivers/clk/mediatek/Makefile
··· 6 6 obj-$(CONFIG_COMMON_CLK_MT6797_VDECSYS) += clk-mt6797-vdec.o 7 7 obj-$(CONFIG_COMMON_CLK_MT6797_VENCSYS) += clk-mt6797-venc.o 8 8 obj-$(CONFIG_COMMON_CLK_MT2701) += clk-mt2701.o 9 + obj-$(CONFIG_COMMON_CLK_MT2701_AUDSYS) += clk-mt2701-aud.o 9 10 obj-$(CONFIG_COMMON_CLK_MT2701_BDPSYS) += clk-mt2701-bdp.o 10 11 obj-$(CONFIG_COMMON_CLK_MT2701_ETHSYS) += clk-mt2701-eth.o 11 12 obj-$(CONFIG_COMMON_CLK_MT2701_HIFSYS) += clk-mt2701-hif.o
+186
drivers/clk/mediatek/clk-mt2701-aud.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018 MediaTek Inc. 4 + * Author: Ryder Lee <ryder.lee@mediatek.com> 5 + */ 6 + 7 + #include <linux/clk-provider.h> 8 + #include <linux/of.h> 9 + #include <linux/of_address.h> 10 + #include <linux/of_device.h> 11 + #include <linux/platform_device.h> 12 + 13 + #include "clk-mtk.h" 14 + #include "clk-gate.h" 15 + 16 + #include <dt-bindings/clock/mt2701-clk.h> 17 + 18 + #define GATE_AUDIO0(_id, _name, _parent, _shift) { \ 19 + .id = _id, \ 20 + .name = _name, \ 21 + .parent_name = _parent, \ 22 + .regs = &audio0_cg_regs, \ 23 + .shift = _shift, \ 24 + .ops = &mtk_clk_gate_ops_no_setclr, \ 25 + } 26 + 27 + #define GATE_AUDIO1(_id, _name, _parent, _shift) { \ 28 + .id = _id, \ 29 + .name = _name, \ 30 + .parent_name = _parent, \ 31 + .regs = &audio1_cg_regs, \ 32 + .shift = _shift, \ 33 + .ops = &mtk_clk_gate_ops_no_setclr, \ 34 + } 35 + 36 + #define GATE_AUDIO2(_id, _name, _parent, _shift) { \ 37 + .id = _id, \ 38 + .name = _name, \ 39 + .parent_name = _parent, \ 40 + .regs = &audio2_cg_regs, \ 41 + .shift = _shift, \ 42 + .ops = &mtk_clk_gate_ops_no_setclr, \ 43 + } 44 + 45 + #define GATE_AUDIO3(_id, _name, _parent, _shift) { \ 46 + .id = _id, \ 47 + .name = _name, \ 48 + .parent_name = _parent, \ 49 + .regs = &audio3_cg_regs, \ 50 + .shift = _shift, \ 51 + .ops = &mtk_clk_gate_ops_no_setclr, \ 52 + } 53 + 54 + static const struct mtk_gate_regs audio0_cg_regs = { 55 + .set_ofs = 0x0, 56 + .clr_ofs = 0x0, 57 + .sta_ofs = 0x0, 58 + }; 59 + 60 + static const struct mtk_gate_regs audio1_cg_regs = { 61 + .set_ofs = 0x10, 62 + .clr_ofs = 0x10, 63 + .sta_ofs = 0x10, 64 + }; 65 + 66 + static const struct mtk_gate_regs audio2_cg_regs = { 67 + .set_ofs = 0x14, 68 + .clr_ofs = 0x14, 69 + .sta_ofs = 0x14, 70 + }; 71 + 72 + static const struct mtk_gate_regs audio3_cg_regs = { 73 + .set_ofs = 0x634, 74 + .clr_ofs = 0x634, 75 + .sta_ofs = 0x634, 76 + }; 77 + 78 + static const struct mtk_gate audio_clks[] = { 79 + /* AUDIO0 */ 80 + GATE_AUDIO0(CLK_AUD_AFE, "audio_afe", "aud_intbus_sel", 2), 81 + GATE_AUDIO0(CLK_AUD_HDMI, "audio_hdmi", "audpll_sel", 20), 82 + GATE_AUDIO0(CLK_AUD_SPDF, "audio_spdf", "audpll_sel", 21), 83 + GATE_AUDIO0(CLK_AUD_SPDF2, "audio_spdf2", "audpll_sel", 22), 84 + GATE_AUDIO0(CLK_AUD_APLL, "audio_apll", "audpll_sel", 23), 85 + /* AUDIO1 */ 86 + GATE_AUDIO1(CLK_AUD_I2SIN1, "audio_i2sin1", "aud_mux1_sel", 0), 87 + GATE_AUDIO1(CLK_AUD_I2SIN2, "audio_i2sin2", "aud_mux1_sel", 1), 88 + GATE_AUDIO1(CLK_AUD_I2SIN3, "audio_i2sin3", "aud_mux1_sel", 2), 89 + GATE_AUDIO1(CLK_AUD_I2SIN4, "audio_i2sin4", "aud_mux1_sel", 3), 90 + GATE_AUDIO1(CLK_AUD_I2SIN5, "audio_i2sin5", "aud_mux1_sel", 4), 91 + GATE_AUDIO1(CLK_AUD_I2SIN6, "audio_i2sin6", "aud_mux1_sel", 5), 92 + GATE_AUDIO1(CLK_AUD_I2SO1, "audio_i2so1", "aud_mux1_sel", 6), 93 + GATE_AUDIO1(CLK_AUD_I2SO2, "audio_i2so2", "aud_mux1_sel", 7), 94 + GATE_AUDIO1(CLK_AUD_I2SO3, "audio_i2so3", "aud_mux1_sel", 8), 95 + GATE_AUDIO1(CLK_AUD_I2SO4, "audio_i2so4", "aud_mux1_sel", 9), 96 + GATE_AUDIO1(CLK_AUD_I2SO5, "audio_i2so5", "aud_mux1_sel", 10), 97 + GATE_AUDIO1(CLK_AUD_I2SO6, "audio_i2so6", "aud_mux1_sel", 11), 98 + GATE_AUDIO1(CLK_AUD_ASRCI1, "audio_asrci1", "asm_h_sel", 12), 99 + GATE_AUDIO1(CLK_AUD_ASRCI2, "audio_asrci2", "asm_h_sel", 13), 100 + GATE_AUDIO1(CLK_AUD_ASRCO1, "audio_asrco1", "asm_h_sel", 14), 101 + GATE_AUDIO1(CLK_AUD_ASRCO2, "audio_asrco2", "asm_h_sel", 15), 102 + GATE_AUDIO1(CLK_AUD_INTDIR, "audio_intdir", "intdir_sel", 20), 103 + GATE_AUDIO1(CLK_AUD_A1SYS, "audio_a1sys", "aud_mux1_sel", 21), 104 + GATE_AUDIO1(CLK_AUD_A2SYS, "audio_a2sys", "aud_mux2_sel", 22), 105 + GATE_AUDIO1(CLK_AUD_AFE_CONN, "audio_afe_conn", "aud_mux1_sel", 23), 106 + GATE_AUDIO1(CLK_AUD_AFE_MRGIF, "audio_afe_mrgif", "aud_mux1_sel", 25), 107 + /* AUDIO2 */ 108 + GATE_AUDIO2(CLK_AUD_MMIF_UL1, "audio_ul1", "aud_mux1_sel", 0), 109 + GATE_AUDIO2(CLK_AUD_MMIF_UL2, "audio_ul2", "aud_mux1_sel", 1), 110 + GATE_AUDIO2(CLK_AUD_MMIF_UL3, "audio_ul3", "aud_mux1_sel", 2), 111 + GATE_AUDIO2(CLK_AUD_MMIF_UL4, "audio_ul4", "aud_mux1_sel", 3), 112 + GATE_AUDIO2(CLK_AUD_MMIF_UL5, "audio_ul5", "aud_mux1_sel", 4), 113 + GATE_AUDIO2(CLK_AUD_MMIF_UL6, "audio_ul6", "aud_mux1_sel", 5), 114 + GATE_AUDIO2(CLK_AUD_MMIF_DL1, "audio_dl1", "aud_mux1_sel", 6), 115 + GATE_AUDIO2(CLK_AUD_MMIF_DL2, "audio_dl2", "aud_mux1_sel", 7), 116 + GATE_AUDIO2(CLK_AUD_MMIF_DL3, "audio_dl3", "aud_mux1_sel", 8), 117 + GATE_AUDIO2(CLK_AUD_MMIF_DL4, "audio_dl4", "aud_mux1_sel", 9), 118 + GATE_AUDIO2(CLK_AUD_MMIF_DL5, "audio_dl5", "aud_mux1_sel", 10), 119 + GATE_AUDIO2(CLK_AUD_MMIF_DL6, "audio_dl6", "aud_mux1_sel", 11), 120 + GATE_AUDIO2(CLK_AUD_MMIF_DLMCH, "audio_dlmch", "aud_mux1_sel", 12), 121 + GATE_AUDIO2(CLK_AUD_MMIF_ARB1, "audio_arb1", "aud_mux1_sel", 13), 122 + GATE_AUDIO2(CLK_AUD_MMIF_AWB1, "audio_awb", "aud_mux1_sel", 14), 123 + GATE_AUDIO2(CLK_AUD_MMIF_AWB2, "audio_awb2", "aud_mux1_sel", 15), 124 + GATE_AUDIO2(CLK_AUD_MMIF_DAI, "audio_dai", "aud_mux1_sel", 16), 125 + /* AUDIO3 */ 126 + GATE_AUDIO3(CLK_AUD_ASRCI3, "audio_asrci3", "asm_h_sel", 2), 127 + GATE_AUDIO3(CLK_AUD_ASRCI4, "audio_asrci4", "asm_h_sel", 3), 128 + GATE_AUDIO3(CLK_AUD_ASRCI5, "audio_asrci5", "asm_h_sel", 4), 129 + GATE_AUDIO3(CLK_AUD_ASRCI6, "audio_asrci6", "asm_h_sel", 5), 130 + GATE_AUDIO3(CLK_AUD_ASRCO3, "audio_asrco3", "asm_h_sel", 6), 131 + GATE_AUDIO3(CLK_AUD_ASRCO4, "audio_asrco4", "asm_h_sel", 7), 132 + GATE_AUDIO3(CLK_AUD_ASRCO5, "audio_asrco5", "asm_h_sel", 8), 133 + GATE_AUDIO3(CLK_AUD_ASRCO6, "audio_asrco6", "asm_h_sel", 9), 134 + GATE_AUDIO3(CLK_AUD_MEM_ASRC1, "audio_mem_asrc1", "asm_h_sel", 10), 135 + GATE_AUDIO3(CLK_AUD_MEM_ASRC2, "audio_mem_asrc2", "asm_h_sel", 11), 136 + GATE_AUDIO3(CLK_AUD_MEM_ASRC3, "audio_mem_asrc3", "asm_h_sel", 12), 137 + GATE_AUDIO3(CLK_AUD_MEM_ASRC4, "audio_mem_asrc4", "asm_h_sel", 13), 138 + GATE_AUDIO3(CLK_AUD_MEM_ASRC5, "audio_mem_asrc5", "asm_h_sel", 14), 139 + }; 140 + 141 + static const struct of_device_id of_match_clk_mt2701_aud[] = { 142 + { .compatible = "mediatek,mt2701-audsys", }, 143 + {} 144 + }; 145 + 146 + static int clk_mt2701_aud_probe(struct platform_device *pdev) 147 + { 148 + struct clk_onecell_data *clk_data; 149 + struct device_node *node = pdev->dev.of_node; 150 + int r; 151 + 152 + clk_data = mtk_alloc_clk_data(CLK_AUD_NR); 153 + 154 + mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks), 155 + clk_data); 156 + 157 + r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 158 + if (r) { 159 + dev_err(&pdev->dev, 160 + "could not register clock provider: %s: %d\n", 161 + pdev->name, r); 162 + 163 + goto err_clk_provider; 164 + } 165 + 166 + r = devm_of_platform_populate(&pdev->dev); 167 + if (r) 168 + goto err_plat_populate; 169 + 170 + return 0; 171 + 172 + err_plat_populate: 173 + of_clk_del_provider(node); 174 + err_clk_provider: 175 + return r; 176 + } 177 + 178 + static struct platform_driver clk_mt2701_aud_drv = { 179 + .probe = clk_mt2701_aud_probe, 180 + .driver = { 181 + .name = "clk-mt2701-aud", 182 + .of_match_table = of_match_clk_mt2701_aud, 183 + }, 184 + }; 185 + 186 + builtin_platform_driver(clk_mt2701_aud_drv);
+8 -7
drivers/clk/mediatek/clk-mt2701.c
··· 148 148 FACTOR(CLK_TOP_CLK26M_D8, "clk26m_d8", "clk26m", 1, 8), 149 149 FACTOR(CLK_TOP_32K_INTERNAL, "32k_internal", "clk26m", 1, 793), 150 150 FACTOR(CLK_TOP_32K_EXTERNAL, "32k_external", "rtc32k", 1, 1), 151 + FACTOR(CLK_TOP_AXISEL_D4, "axisel_d4", "axi_sel", 1, 4), 151 152 }; 152 153 153 154 static const char * const axi_parents[] = { ··· 858 857 GATE_PERI0(CLK_PERI_USB1, "usb1_ck", "usb20_sel", 11), 859 858 GATE_PERI0(CLK_PERI_USB0, "usb0_ck", "usb20_sel", 10), 860 859 GATE_PERI0(CLK_PERI_PWM, "pwm_ck", "axi_sel", 9), 861 - GATE_PERI0(CLK_PERI_PWM7, "pwm7_ck", "axi_sel", 8), 862 - GATE_PERI0(CLK_PERI_PWM6, "pwm6_ck", "axi_sel", 7), 863 - GATE_PERI0(CLK_PERI_PWM5, "pwm5_ck", "axi_sel", 6), 864 - GATE_PERI0(CLK_PERI_PWM4, "pwm4_ck", "axi_sel", 5), 865 - GATE_PERI0(CLK_PERI_PWM3, "pwm3_ck", "axi_sel", 4), 866 - GATE_PERI0(CLK_PERI_PWM2, "pwm2_ck", "axi_sel", 3), 867 - GATE_PERI0(CLK_PERI_PWM1, "pwm1_ck", "axi_sel", 2), 860 + GATE_PERI0(CLK_PERI_PWM7, "pwm7_ck", "axisel_d4", 8), 861 + GATE_PERI0(CLK_PERI_PWM6, "pwm6_ck", "axisel_d4", 7), 862 + GATE_PERI0(CLK_PERI_PWM5, "pwm5_ck", "axisel_d4", 6), 863 + GATE_PERI0(CLK_PERI_PWM4, "pwm4_ck", "axisel_d4", 5), 864 + GATE_PERI0(CLK_PERI_PWM3, "pwm3_ck", "axisel_d4", 4), 865 + GATE_PERI0(CLK_PERI_PWM2, "pwm2_ck", "axisel_d4", 3), 866 + GATE_PERI0(CLK_PERI_PWM1, "pwm1_ck", "axisel_d4", 2), 868 867 GATE_PERI0(CLK_PERI_THERM, "therm_ck", "axi_sel", 1), 869 868 GATE_PERI0(CLK_PERI_NFI, "nfi_ck", "nfi2x_sel", 0), 870 869
+14 -1
drivers/clk/mediatek/clk-mt7622-aud.c
··· 106 106 GATE_AUDIO1(CLK_AUDIO_INTDIR, "audio_intdir", "intdir_sel", 20), 107 107 GATE_AUDIO1(CLK_AUDIO_A1SYS, "audio_a1sys", "a1sys_hp_sel", 21), 108 108 GATE_AUDIO1(CLK_AUDIO_A2SYS, "audio_a2sys", "a2sys_hp_sel", 22), 109 + GATE_AUDIO1(CLK_AUDIO_AFE_CONN, "audio_afe_conn", "a1sys_hp_sel", 23), 109 110 /* AUDIO2 */ 110 111 GATE_AUDIO2(CLK_AUDIO_UL1, "audio_ul1", "a1sys_hp_sel", 0), 111 112 GATE_AUDIO2(CLK_AUDIO_UL2, "audio_ul2", "a1sys_hp_sel", 1), ··· 150 149 clk_data); 151 150 152 151 r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 153 - if (r) 152 + if (r) { 154 153 dev_err(&pdev->dev, 155 154 "could not register clock provider: %s: %d\n", 156 155 pdev->name, r); 157 156 157 + goto err_clk_provider; 158 + } 159 + 160 + r = devm_of_platform_populate(&pdev->dev); 161 + if (r) 162 + goto err_plat_populate; 163 + 164 + return 0; 165 + 166 + err_plat_populate: 167 + of_clk_del_provider(node); 168 + err_clk_provider: 158 169 return r; 159 170 } 160 171
+12 -1
drivers/clk/renesas/Kconfig
··· 15 15 select CLK_R8A7794 if ARCH_R8A7794 16 16 select CLK_R8A7795 if ARCH_R8A7795 17 17 select CLK_R8A7796 if ARCH_R8A7796 18 + select CLK_R8A77965 if ARCH_R8A77965 18 19 select CLK_R8A77970 if ARCH_R8A77970 20 + select CLK_R8A77980 if ARCH_R8A77980 19 21 select CLK_R8A77995 if ARCH_R8A77995 20 22 select CLK_SH73A0 if ARCH_SH73A0 21 23 ··· 26 24 config CLK_RENESAS_LEGACY 27 25 bool "Legacy DT clock support" 28 26 depends on CLK_R8A7790 || CLK_R8A7791 || CLK_R8A7792 || CLK_R8A7794 29 - default y 30 27 help 31 28 Enable backward compatibility with old device trees describing a 32 29 hierarchical representation of the various CPG and MSTP clocks. 33 30 34 31 Say Y if you want your kernel to work with old DTBs. 32 + It is safe to say N if you use the DTS that is supplied with the 33 + current kernel source tree. 35 34 36 35 # SoC 37 36 config CLK_EMEV2 ··· 99 96 bool "R-Car M3-W clock support" if COMPILE_TEST 100 97 select CLK_RCAR_GEN3_CPG 101 98 99 + config CLK_R8A77965 100 + bool "R-Car M3-N clock support" if COMPILE_TEST 101 + select CLK_RCAR_GEN3_CPG 102 + 102 103 config CLK_R8A77970 103 104 bool "R-Car V3M clock support" if COMPILE_TEST 105 + select CLK_RCAR_GEN3_CPG 106 + 107 + config CLK_R8A77980 108 + bool "R-Car V3H clock support" if COMPILE_TEST 104 109 select CLK_RCAR_GEN3_CPG 105 110 106 111 config CLK_R8A77995
+2
drivers/clk/renesas/Makefile
··· 14 14 obj-$(CONFIG_CLK_R8A7794) += r8a7794-cpg-mssr.o 15 15 obj-$(CONFIG_CLK_R8A7795) += r8a7795-cpg-mssr.o 16 16 obj-$(CONFIG_CLK_R8A7796) += r8a7796-cpg-mssr.o 17 + obj-$(CONFIG_CLK_R8A77965) += r8a77965-cpg-mssr.o 17 18 obj-$(CONFIG_CLK_R8A77970) += r8a77970-cpg-mssr.o 19 + obj-$(CONFIG_CLK_R8A77980) += r8a77980-cpg-mssr.o 18 20 obj-$(CONFIG_CLK_R8A77995) += r8a77995-cpg-mssr.o 19 21 obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o 20 22
+11 -11
drivers/clk/renesas/clk-div6.c
··· 53 53 struct div6_clock *clock = to_div6_clock(hw); 54 54 u32 val; 55 55 56 - val = (clk_readl(clock->reg) & ~(CPG_DIV6_DIV_MASK | CPG_DIV6_CKSTP)) 56 + val = (readl(clock->reg) & ~(CPG_DIV6_DIV_MASK | CPG_DIV6_CKSTP)) 57 57 | CPG_DIV6_DIV(clock->div - 1); 58 - clk_writel(val, clock->reg); 58 + writel(val, clock->reg); 59 59 60 60 return 0; 61 61 } ··· 65 65 struct div6_clock *clock = to_div6_clock(hw); 66 66 u32 val; 67 67 68 - val = clk_readl(clock->reg); 68 + val = readl(clock->reg); 69 69 val |= CPG_DIV6_CKSTP; 70 70 /* 71 71 * DIV6 clocks require the divisor field to be non-zero when stopping ··· 75 75 */ 76 76 if (!(val & CPG_DIV6_DIV_MASK)) 77 77 val |= CPG_DIV6_DIV_MASK; 78 - clk_writel(val, clock->reg); 78 + writel(val, clock->reg); 79 79 } 80 80 81 81 static int cpg_div6_clock_is_enabled(struct clk_hw *hw) 82 82 { 83 83 struct div6_clock *clock = to_div6_clock(hw); 84 84 85 - return !(clk_readl(clock->reg) & CPG_DIV6_CKSTP); 85 + return !(readl(clock->reg) & CPG_DIV6_CKSTP); 86 86 } 87 87 88 88 static unsigned long cpg_div6_clock_recalc_rate(struct clk_hw *hw, ··· 122 122 123 123 clock->div = div; 124 124 125 - val = clk_readl(clock->reg) & ~CPG_DIV6_DIV_MASK; 125 + val = readl(clock->reg) & ~CPG_DIV6_DIV_MASK; 126 126 /* Only program the new divisor if the clock isn't stopped. */ 127 127 if (!(val & CPG_DIV6_CKSTP)) 128 - clk_writel(val | CPG_DIV6_DIV(clock->div - 1), clock->reg); 128 + writel(val | CPG_DIV6_DIV(clock->div - 1), clock->reg); 129 129 130 130 return 0; 131 131 } ··· 139 139 if (clock->src_width == 0) 140 140 return 0; 141 141 142 - hw_index = (clk_readl(clock->reg) >> clock->src_shift) & 142 + hw_index = (readl(clock->reg) >> clock->src_shift) & 143 143 (BIT(clock->src_width) - 1); 144 144 for (i = 0; i < clk_hw_get_num_parents(hw); i++) { 145 145 if (clock->parents[i] == hw_index) ··· 163 163 mask = ~((BIT(clock->src_width) - 1) << clock->src_shift); 164 164 hw_index = clock->parents[index]; 165 165 166 - clk_writel((clk_readl(clock->reg) & mask) | 167 - (hw_index << clock->src_shift), clock->reg); 166 + writel((readl(clock->reg) & mask) | (hw_index << clock->src_shift), 167 + clock->reg); 168 168 169 169 return 0; 170 170 } ··· 241 241 * Read the divisor. Disabling the clock overwrites the divisor, so we 242 242 * need to cache its value for the enable operation. 243 243 */ 244 - clock->div = (clk_readl(clock->reg) & CPG_DIV6_DIV_MASK) + 1; 244 + clock->div = (readl(clock->reg) & CPG_DIV6_DIV_MASK) + 1; 245 245 246 246 switch (num_parents) { 247 247 case 1:
+2 -2
drivers/clk/renesas/clk-mstp.c
··· 64 64 static inline u32 cpg_mstp_read(struct mstp_clock_group *group, 65 65 u32 __iomem *reg) 66 66 { 67 - return group->width_8bit ? readb(reg) : clk_readl(reg); 67 + return group->width_8bit ? readb(reg) : readl(reg); 68 68 } 69 69 70 70 static inline void cpg_mstp_write(struct mstp_clock_group *group, u32 val, 71 71 u32 __iomem *reg) 72 72 { 73 - group->width_8bit ? writeb(val, reg) : clk_writel(val, reg); 73 + group->width_8bit ? writeb(val, reg) : writel(val, reg); 74 74 } 75 75 76 76 static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
+5 -6
drivers/clk/renesas/clk-r8a73a4.c
··· 71 71 72 72 73 73 if (!strcmp(name, "main")) { 74 - u32 ckscr = clk_readl(cpg->reg + CPG_CKSCR); 74 + u32 ckscr = readl(cpg->reg + CPG_CKSCR); 75 75 76 76 switch ((ckscr >> 28) & 3) { 77 77 case 0: /* extal1 */ ··· 95 95 * clock implementation and we currently have no need to change 96 96 * the multiplier value. 97 97 */ 98 - u32 value = clk_readl(cpg->reg + CPG_PLL0CR); 98 + u32 value = readl(cpg->reg + CPG_PLL0CR); 99 99 100 100 parent_name = "main"; 101 101 mult = ((value >> 24) & 0x7f) + 1; 102 102 if (value & BIT(20)) 103 103 div = 2; 104 104 } else if (!strcmp(name, "pll1")) { 105 - u32 value = clk_readl(cpg->reg + CPG_PLL1CR); 105 + u32 value = readl(cpg->reg + CPG_PLL1CR); 106 106 107 107 parent_name = "main"; 108 108 /* XXX: enable bit? */ ··· 125 125 default: 126 126 return ERR_PTR(-EINVAL); 127 127 } 128 - value = clk_readl(cpg->reg + cr); 128 + value = readl(cpg->reg + cr); 129 129 switch ((value >> 5) & 7) { 130 130 case 0: 131 131 parent_name = "main"; ··· 161 161 shift = 0; 162 162 } 163 163 div *= 32; 164 - mult = 0x20 - ((clk_readl(cpg->reg + CPG_FRQCRC) >> shift) 165 - & 0x1f); 164 + mult = 0x20 - ((readl(cpg->reg + CPG_FRQCRC) >> shift) & 0x1f); 166 165 } else { 167 166 struct div4_clk *c; 168 167
+4 -4
drivers/clk/renesas/clk-r8a7740.c
··· 98 98 * clock implementation and we currently have no need to change 99 99 * the multiplier value. 100 100 */ 101 - u32 value = clk_readl(cpg->reg + CPG_FRQCRC); 101 + u32 value = readl(cpg->reg + CPG_FRQCRC); 102 102 parent_name = "system"; 103 103 mult = ((value >> 24) & 0x7f) + 1; 104 104 } else if (!strcmp(name, "pllc1")) { 105 - u32 value = clk_readl(cpg->reg + CPG_FRQCRA); 105 + u32 value = readl(cpg->reg + CPG_FRQCRA); 106 106 parent_name = "system"; 107 107 mult = ((value >> 24) & 0x7f) + 1; 108 108 div = 2; 109 109 } else if (!strcmp(name, "pllc2")) { 110 - u32 value = clk_readl(cpg->reg + CPG_PLLC2CR); 110 + u32 value = readl(cpg->reg + CPG_PLLC2CR); 111 111 parent_name = "system"; 112 112 mult = ((value >> 24) & 0x3f) + 1; 113 113 } else if (!strcmp(name, "usb24s")) { 114 - u32 value = clk_readl(cpg->reg + CPG_USBCKCR); 114 + u32 value = readl(cpg->reg + CPG_USBCKCR); 115 115 if (value & BIT(7)) 116 116 /* extal2 */ 117 117 parent_name = of_clk_get_parent_name(np, 1);
+8 -9
drivers/clk/renesas/clk-rcar-gen2.c
··· 62 62 unsigned int mult; 63 63 unsigned int val; 64 64 65 - val = (clk_readl(zclk->reg) & CPG_FRQCRC_ZFC_MASK) 66 - >> CPG_FRQCRC_ZFC_SHIFT; 65 + val = (readl(zclk->reg) & CPG_FRQCRC_ZFC_MASK) >> CPG_FRQCRC_ZFC_SHIFT; 67 66 mult = 32 - val; 68 67 69 68 return div_u64((u64)parent_rate * mult, 32); ··· 94 95 mult = div_u64((u64)rate * 32, parent_rate); 95 96 mult = clamp(mult, 1U, 32U); 96 97 97 - if (clk_readl(zclk->kick_reg) & CPG_FRQCRB_KICK) 98 + if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK) 98 99 return -EBUSY; 99 100 100 - val = clk_readl(zclk->reg); 101 + val = readl(zclk->reg); 101 102 val &= ~CPG_FRQCRC_ZFC_MASK; 102 103 val |= (32 - mult) << CPG_FRQCRC_ZFC_SHIFT; 103 - clk_writel(val, zclk->reg); 104 + writel(val, zclk->reg); 104 105 105 106 /* 106 107 * Set KICK bit in FRQCRB to update hardware setting and wait for 107 108 * clock change completion. 108 109 */ 109 - kick = clk_readl(zclk->kick_reg); 110 + kick = readl(zclk->kick_reg); 110 111 kick |= CPG_FRQCRB_KICK; 111 - clk_writel(kick, zclk->kick_reg); 112 + writel(kick, zclk->kick_reg); 112 113 113 114 /* 114 115 * Note: There is no HW information about the worst case latency. ··· 120 121 * "super" safe value. 121 122 */ 122 123 for (i = 1000; i; i--) { 123 - if (!(clk_readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) 124 + if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) 124 125 return 0; 125 126 126 127 cpu_relax(); ··· 331 332 mult = config->pll0_mult; 332 333 div = 3; 333 334 } else { 334 - u32 value = clk_readl(cpg->reg + CPG_PLL0CR); 335 + u32 value = readl(cpg->reg + CPG_PLL0CR); 335 336 mult = ((value >> 24) & ((1 << 7) - 1)) + 1; 336 337 } 337 338 parent_name = "main";
+2 -2
drivers/clk/renesas/clk-rz.c
··· 75 75 * let them run at fixed current speed and implement the details later. 76 76 */ 77 77 if (strcmp(name, "i") == 0) 78 - val = (clk_readl(cpg->reg + CPG_FRQCR) >> 8) & 3; 78 + val = (readl(cpg->reg + CPG_FRQCR) >> 8) & 3; 79 79 else if (strcmp(name, "g") == 0) 80 - val = clk_readl(cpg->reg + CPG_FRQCR2) & 3; 80 + val = readl(cpg->reg + CPG_FRQCR2) & 3; 81 81 else 82 82 return ERR_PTR(-EINVAL); 83 83
+10 -10
drivers/clk/renesas/clk-sh73a0.c
··· 46 46 unsigned int shift; 47 47 }; 48 48 49 - static struct div4_clk div4_clks[] = { 49 + static const struct div4_clk div4_clks[] = { 50 50 { "zg", "pll0", CPG_FRQCRA, 16 }, 51 51 { "m3", "pll1", CPG_FRQCRA, 12 }, 52 52 { "b", "pll1", CPG_FRQCRA, 8 }, ··· 79 79 { 80 80 const struct clk_div_table *table = NULL; 81 81 unsigned int shift, reg, width; 82 - const char *parent_name; 82 + const char *parent_name = NULL; 83 83 unsigned int mult = 1; 84 84 unsigned int div = 1; 85 85 86 86 if (!strcmp(name, "main")) { 87 87 /* extal1, extal1_div2, extal2, extal2_div2 */ 88 - u32 parent_idx = (clk_readl(cpg->reg + CPG_CKSCR) >> 28) & 3; 88 + u32 parent_idx = (readl(cpg->reg + CPG_CKSCR) >> 28) & 3; 89 89 90 90 parent_name = of_clk_get_parent_name(np, parent_idx >> 1); 91 91 div = (parent_idx & 1) + 1; ··· 110 110 default: 111 111 return ERR_PTR(-EINVAL); 112 112 } 113 - if (clk_readl(cpg->reg + CPG_PLLECR) & BIT(enable_bit)) { 114 - mult = ((clk_readl(enable_reg) >> 24) & 0x3f) + 1; 113 + if (readl(cpg->reg + CPG_PLLECR) & BIT(enable_bit)) { 114 + mult = ((readl(enable_reg) >> 24) & 0x3f) + 1; 115 115 /* handle CFG bit for PLL1 and PLL2 */ 116 116 if (enable_bit == 1 || enable_bit == 2) 117 - if (clk_readl(enable_reg) & BIT(20)) 117 + if (readl(enable_reg) & BIT(20)) 118 118 mult *= 2; 119 119 } 120 120 } else if (!strcmp(name, "dsi0phy") || !strcmp(name, "dsi1phy")) { ··· 135 135 shift = 24; 136 136 width = 5; 137 137 } else { 138 - struct div4_clk *c; 138 + const struct div4_clk *c; 139 139 140 140 for (c = div4_clks; c->name; c++) { 141 141 if (!strcmp(name, c->name)) { ··· 193 193 return; 194 194 195 195 /* Set SDHI clocks to a known state */ 196 - clk_writel(0x108, cpg->reg + CPG_SD0CKCR); 197 - clk_writel(0x108, cpg->reg + CPG_SD1CKCR); 198 - clk_writel(0x108, cpg->reg + CPG_SD2CKCR); 196 + writel(0x108, cpg->reg + CPG_SD0CKCR); 197 + writel(0x108, cpg->reg + CPG_SD1CKCR); 198 + writel(0x108, cpg->reg + CPG_SD2CKCR); 199 199 200 200 for (i = 0; i < num_clks; ++i) { 201 201 const char *name;
+2
drivers/clk/renesas/r8a7743-cpg-mssr.c
··· 117 117 DEF_MOD("cmt1", 329, R8A7743_CLK_R), 118 118 DEF_MOD("usbhs-dmac0", 330, R8A7743_CLK_HP), 119 119 DEF_MOD("usbhs-dmac1", 331, R8A7743_CLK_HP), 120 + DEF_MOD("rwdt", 402, R8A7743_CLK_R), 120 121 DEF_MOD("irqc", 407, R8A7743_CLK_CP), 121 122 DEF_MOD("intc-sys", 408, R8A7743_CLK_ZS), 122 123 DEF_MOD("audio-dmac1", 501, R8A7743_CLK_HP), ··· 196 195 }; 197 196 198 197 static const unsigned int r8a7743_crit_mod_clks[] __initconst = { 198 + MOD_CLK_ID(402), /* RWDT */ 199 199 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 200 200 }; 201 201
+2
drivers/clk/renesas/r8a7745-cpg-mssr.c
··· 114 114 DEF_MOD("cmt1", 329, R8A7745_CLK_R), 115 115 DEF_MOD("usbhs-dmac0", 330, R8A7745_CLK_HP), 116 116 DEF_MOD("usbhs-dmac1", 331, R8A7745_CLK_HP), 117 + DEF_MOD("rwdt", 402, R8A7745_CLK_R), 117 118 DEF_MOD("irqc", 407, R8A7745_CLK_CP), 118 119 DEF_MOD("intc-sys", 408, R8A7745_CLK_ZS), 119 120 DEF_MOD("audio-dmac0", 502, R8A7745_CLK_HP), ··· 181 180 }; 182 181 183 182 static const unsigned int r8a7745_crit_mod_clks[] __initconst = { 183 + MOD_CLK_ID(402), /* RWDT */ 184 184 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 185 185 }; 186 186
+2
drivers/clk/renesas/r8a7790-cpg-mssr.c
··· 140 140 DEF_MOD("cmt1", 329, R8A7790_CLK_R), 141 141 DEF_MOD("usbhs-dmac0", 330, R8A7790_CLK_HP), 142 142 DEF_MOD("usbhs-dmac1", 331, R8A7790_CLK_HP), 143 + DEF_MOD("rwdt", 402, R8A7790_CLK_R), 143 144 DEF_MOD("irqc", 407, R8A7790_CLK_CP), 144 145 DEF_MOD("intc-sys", 408, R8A7790_CLK_ZS), 145 146 DEF_MOD("audio-dmac1", 501, R8A7790_CLK_HP), ··· 212 211 }; 213 212 214 213 static const unsigned int r8a7790_crit_mod_clks[] __initconst = { 214 + MOD_CLK_ID(402), /* RWDT */ 215 215 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 216 216 }; 217 217
+2
drivers/clk/renesas/r8a7791-cpg-mssr.c
··· 128 128 DEF_MOD("cmt1", 329, R8A7791_CLK_R), 129 129 DEF_MOD("usbhs-dmac0", 330, R8A7791_CLK_HP), 130 130 DEF_MOD("usbhs-dmac1", 331, R8A7791_CLK_HP), 131 + DEF_MOD("rwdt", 402, R8A7791_CLK_R), 131 132 DEF_MOD("irqc", 407, R8A7791_CLK_CP), 132 133 DEF_MOD("intc-sys", 408, R8A7791_CLK_ZS), 133 134 DEF_MOD("audio-dmac1", 501, R8A7791_CLK_HP), ··· 210 209 }; 211 210 212 211 static const unsigned int r8a7791_crit_mod_clks[] __initconst = { 212 + MOD_CLK_ID(402), /* RWDT */ 213 213 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 214 214 }; 215 215
+2
drivers/clk/renesas/r8a7792-cpg-mssr.c
··· 98 98 DEF_MOD("tpu0", 304, R8A7792_CLK_CP), 99 99 DEF_MOD("sdhi0", 314, R8A7792_CLK_SD), 100 100 DEF_MOD("cmt1", 329, R8A7792_CLK_R), 101 + DEF_MOD("rwdt", 402, R8A7792_CLK_R), 101 102 DEF_MOD("irqc", 407, R8A7792_CLK_CP), 102 103 DEF_MOD("intc-sys", 408, R8A7792_CLK_ZS), 103 104 DEF_MOD("audio-dmac0", 502, R8A7792_CLK_HP), ··· 155 154 }; 156 155 157 156 static const unsigned int r8a7792_crit_mod_clks[] __initconst = { 157 + MOD_CLK_ID(402), /* RWDT */ 158 158 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 159 159 }; 160 160
+2
drivers/clk/renesas/r8a7794-cpg-mssr.c
··· 121 121 DEF_MOD("cmt1", 329, R8A7794_CLK_R), 122 122 DEF_MOD("usbhs-dmac0", 330, R8A7794_CLK_HP), 123 123 DEF_MOD("usbhs-dmac1", 331, R8A7794_CLK_HP), 124 + DEF_MOD("rwdt", 402, R8A7794_CLK_R), 124 125 DEF_MOD("irqc", 407, R8A7794_CLK_CP), 125 126 DEF_MOD("intc-sys", 408, R8A7794_CLK_ZS), 126 127 DEF_MOD("audio-dmac0", 502, R8A7794_CLK_HP), ··· 191 190 }; 192 191 193 192 static const unsigned int r8a7794_crit_mod_clks[] __initconst = { 193 + MOD_CLK_ID(402), /* RWDT */ 194 194 MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 195 195 }; 196 196
+2
drivers/clk/renesas/r8a7795-cpg-mssr.c
··· 74 74 DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 75 75 76 76 /* Core Clock Outputs */ 77 + DEF_BASE("z", R8A7795_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0), 78 + DEF_BASE("z2", R8A7795_CLK_Z2, CLK_TYPE_GEN3_Z2, CLK_PLL2), 77 79 DEF_FIXED("ztr", R8A7795_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 78 80 DEF_FIXED("ztrd2", R8A7795_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 79 81 DEF_FIXED("zt", R8A7795_CLK_ZT, CLK_PLL1_DIV2, 4, 1),
+2
drivers/clk/renesas/r8a7796-cpg-mssr.c
··· 74 74 DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 75 75 76 76 /* Core Clock Outputs */ 77 + DEF_BASE("z", R8A7796_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0), 78 + DEF_BASE("z2", R8A7796_CLK_Z2, CLK_TYPE_GEN3_Z2, CLK_PLL2), 77 79 DEF_FIXED("ztr", R8A7796_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 78 80 DEF_FIXED("ztrd2", R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 79 81 DEF_FIXED("zt", R8A7796_CLK_ZT, CLK_PLL1_DIV2, 4, 1),
+334
drivers/clk/renesas/r8a77965-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77965 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Jacopo Mondi <jacopo+renesas@jmondi.org> 6 + * 7 + * Based on r8a7795-cpg-mssr.c 8 + * 9 + * Copyright (C) 2015 Glider bvba 10 + * Copyright (C) 2015 Renesas Electronics Corp. 11 + */ 12 + 13 + #include <linux/device.h> 14 + #include <linux/init.h> 15 + #include <linux/kernel.h> 16 + #include <linux/soc/renesas/rcar-rst.h> 17 + 18 + #include <dt-bindings/clock/r8a77965-cpg-mssr.h> 19 + 20 + #include "renesas-cpg-mssr.h" 21 + #include "rcar-gen3-cpg.h" 22 + 23 + enum clk_ids { 24 + /* Core Clock Outputs exported to DT */ 25 + LAST_DT_CORE_CLK = R8A77965_CLK_OSC, 26 + 27 + /* External Input Clocks */ 28 + CLK_EXTAL, 29 + CLK_EXTALR, 30 + 31 + /* Internal Core Clocks */ 32 + CLK_MAIN, 33 + CLK_PLL0, 34 + CLK_PLL1, 35 + CLK_PLL3, 36 + CLK_PLL4, 37 + CLK_PLL1_DIV2, 38 + CLK_PLL1_DIV4, 39 + CLK_S0, 40 + CLK_S1, 41 + CLK_S2, 42 + CLK_S3, 43 + CLK_SDSRC, 44 + CLK_SSPSRC, 45 + CLK_RINT, 46 + 47 + /* Module Clocks */ 48 + MOD_CLK_BASE 49 + }; 50 + 51 + static const struct cpg_core_clk r8a77965_core_clks[] __initconst = { 52 + /* External Clock Inputs */ 53 + DEF_INPUT("extal", CLK_EXTAL), 54 + DEF_INPUT("extalr", CLK_EXTALR), 55 + 56 + /* Internal Core Clocks */ 57 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 58 + DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN), 59 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 60 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 61 + DEF_BASE(".pll4", CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN), 62 + 63 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 64 + DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4, CLK_PLL1_DIV2, 2, 1), 65 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1_DIV2, 2, 1), 66 + DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), 67 + DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 68 + DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 69 + DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 70 + 71 + /* Core Clock Outputs */ 72 + DEF_BASE("z", R8A77965_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0), 73 + DEF_FIXED("ztr", R8A77965_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 74 + DEF_FIXED("ztrd2", R8A77965_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 75 + DEF_FIXED("zt", R8A77965_CLK_ZT, CLK_PLL1_DIV2, 4, 1), 76 + DEF_FIXED("zx", R8A77965_CLK_ZX, CLK_PLL1_DIV2, 2, 1), 77 + DEF_FIXED("s0d1", R8A77965_CLK_S0D1, CLK_S0, 1, 1), 78 + DEF_FIXED("s0d2", R8A77965_CLK_S0D2, CLK_S0, 2, 1), 79 + DEF_FIXED("s0d3", R8A77965_CLK_S0D3, CLK_S0, 3, 1), 80 + DEF_FIXED("s0d4", R8A77965_CLK_S0D4, CLK_S0, 4, 1), 81 + DEF_FIXED("s0d6", R8A77965_CLK_S0D6, CLK_S0, 6, 1), 82 + DEF_FIXED("s0d8", R8A77965_CLK_S0D8, CLK_S0, 8, 1), 83 + DEF_FIXED("s0d12", R8A77965_CLK_S0D12, CLK_S0, 12, 1), 84 + DEF_FIXED("s1d1", R8A77965_CLK_S1D1, CLK_S1, 1, 1), 85 + DEF_FIXED("s1d2", R8A77965_CLK_S1D2, CLK_S1, 2, 1), 86 + DEF_FIXED("s1d4", R8A77965_CLK_S1D4, CLK_S1, 4, 1), 87 + DEF_FIXED("s2d1", R8A77965_CLK_S2D1, CLK_S2, 1, 1), 88 + DEF_FIXED("s2d2", R8A77965_CLK_S2D2, CLK_S2, 2, 1), 89 + DEF_FIXED("s2d4", R8A77965_CLK_S2D4, CLK_S2, 4, 1), 90 + DEF_FIXED("s3d1", R8A77965_CLK_S3D1, CLK_S3, 1, 1), 91 + DEF_FIXED("s3d2", R8A77965_CLK_S3D2, CLK_S3, 2, 1), 92 + DEF_FIXED("s3d4", R8A77965_CLK_S3D4, CLK_S3, 4, 1), 93 + 94 + DEF_GEN3_SD("sd0", R8A77965_CLK_SD0, CLK_SDSRC, 0x074), 95 + DEF_GEN3_SD("sd1", R8A77965_CLK_SD1, CLK_SDSRC, 0x078), 96 + DEF_GEN3_SD("sd2", R8A77965_CLK_SD2, CLK_SDSRC, 0x268), 97 + DEF_GEN3_SD("sd3", R8A77965_CLK_SD3, CLK_SDSRC, 0x26c), 98 + 99 + DEF_FIXED("cl", R8A77965_CLK_CL, CLK_PLL1_DIV2, 48, 1), 100 + DEF_FIXED("cp", R8A77965_CLK_CP, CLK_EXTAL, 2, 1), 101 + 102 + DEF_DIV6P1("canfd", R8A77965_CLK_CANFD, CLK_PLL1_DIV4, 0x244), 103 + DEF_DIV6P1("csi0", R8A77965_CLK_CSI0, CLK_PLL1_DIV4, 0x00c), 104 + DEF_DIV6P1("mso", R8A77965_CLK_MSO, CLK_PLL1_DIV4, 0x014), 105 + DEF_DIV6P1("hdmi", R8A77965_CLK_HDMI, CLK_PLL1_DIV4, 0x250), 106 + 107 + DEF_DIV6_RO("osc", R8A77965_CLK_OSC, CLK_EXTAL, CPG_RCKCR, 8), 108 + DEF_DIV6_RO("r_int", CLK_RINT, CLK_EXTAL, CPG_RCKCR, 32), 109 + 110 + DEF_BASE("r", R8A77965_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), 111 + }; 112 + 113 + static const struct mssr_mod_clk r8a77965_mod_clks[] __initconst = { 114 + DEF_MOD("scif5", 202, R8A77965_CLK_S3D4), 115 + DEF_MOD("scif4", 203, R8A77965_CLK_S3D4), 116 + DEF_MOD("scif3", 204, R8A77965_CLK_S3D4), 117 + DEF_MOD("scif1", 206, R8A77965_CLK_S3D4), 118 + DEF_MOD("scif0", 207, R8A77965_CLK_S3D4), 119 + DEF_MOD("sys-dmac2", 217, R8A77965_CLK_S0D3), 120 + DEF_MOD("sys-dmac1", 218, R8A77965_CLK_S0D3), 121 + DEF_MOD("sys-dmac0", 219, R8A77965_CLK_S0D3), 122 + 123 + DEF_MOD("cmt3", 300, R8A77965_CLK_R), 124 + DEF_MOD("cmt2", 301, R8A77965_CLK_R), 125 + DEF_MOD("cmt1", 302, R8A77965_CLK_R), 126 + DEF_MOD("cmt0", 303, R8A77965_CLK_R), 127 + DEF_MOD("scif2", 310, R8A77965_CLK_S3D4), 128 + DEF_MOD("sdif3", 311, R8A77965_CLK_SD3), 129 + DEF_MOD("sdif2", 312, R8A77965_CLK_SD2), 130 + DEF_MOD("sdif1", 313, R8A77965_CLK_SD1), 131 + DEF_MOD("sdif0", 314, R8A77965_CLK_SD0), 132 + DEF_MOD("pcie1", 318, R8A77965_CLK_S3D1), 133 + DEF_MOD("pcie0", 319, R8A77965_CLK_S3D1), 134 + DEF_MOD("usb3-if0", 328, R8A77965_CLK_S3D1), 135 + DEF_MOD("usb-dmac0", 330, R8A77965_CLK_S3D1), 136 + DEF_MOD("usb-dmac1", 331, R8A77965_CLK_S3D1), 137 + 138 + DEF_MOD("rwdt", 402, R8A77965_CLK_R), 139 + DEF_MOD("intc-ex", 407, R8A77965_CLK_CP), 140 + DEF_MOD("intc-ap", 408, R8A77965_CLK_S0D3), 141 + 142 + DEF_MOD("audmac1", 501, R8A77965_CLK_S0D3), 143 + DEF_MOD("audmac0", 502, R8A77965_CLK_S0D3), 144 + DEF_MOD("drif7", 508, R8A77965_CLK_S3D2), 145 + DEF_MOD("drif6", 509, R8A77965_CLK_S3D2), 146 + DEF_MOD("drif5", 510, R8A77965_CLK_S3D2), 147 + DEF_MOD("drif4", 511, R8A77965_CLK_S3D2), 148 + DEF_MOD("drif3", 512, R8A77965_CLK_S3D2), 149 + DEF_MOD("drif2", 513, R8A77965_CLK_S3D2), 150 + DEF_MOD("drif1", 514, R8A77965_CLK_S3D2), 151 + DEF_MOD("drif0", 515, R8A77965_CLK_S3D2), 152 + DEF_MOD("hscif4", 516, R8A77965_CLK_S3D1), 153 + DEF_MOD("hscif3", 517, R8A77965_CLK_S3D1), 154 + DEF_MOD("hscif2", 518, R8A77965_CLK_S3D1), 155 + DEF_MOD("hscif1", 519, R8A77965_CLK_S3D1), 156 + DEF_MOD("hscif0", 520, R8A77965_CLK_S3D1), 157 + DEF_MOD("thermal", 522, R8A77965_CLK_CP), 158 + DEF_MOD("pwm", 523, R8A77965_CLK_S0D12), 159 + 160 + DEF_MOD("fcpvd1", 602, R8A77965_CLK_S0D2), 161 + DEF_MOD("fcpvd0", 603, R8A77965_CLK_S0D2), 162 + DEF_MOD("fcpvb0", 607, R8A77965_CLK_S0D1), 163 + DEF_MOD("fcpvi0", 611, R8A77965_CLK_S0D1), 164 + DEF_MOD("fcpf0", 615, R8A77965_CLK_S0D1), 165 + DEF_MOD("fcpcs", 619, R8A77965_CLK_S0D2), 166 + DEF_MOD("vspd1", 622, R8A77965_CLK_S0D2), 167 + DEF_MOD("vspd0", 623, R8A77965_CLK_S0D2), 168 + DEF_MOD("vspb", 626, R8A77965_CLK_S0D1), 169 + DEF_MOD("vspi0", 631, R8A77965_CLK_S0D1), 170 + 171 + DEF_MOD("ehci1", 702, R8A77965_CLK_S3D4), 172 + DEF_MOD("ehci0", 703, R8A77965_CLK_S3D4), 173 + DEF_MOD("hsusb", 704, R8A77965_CLK_S3D4), 174 + DEF_MOD("csi20", 714, R8A77965_CLK_CSI0), 175 + DEF_MOD("csi40", 716, R8A77965_CLK_CSI0), 176 + DEF_MOD("du3", 721, R8A77965_CLK_S2D1), 177 + DEF_MOD("du1", 723, R8A77965_CLK_S2D1), 178 + DEF_MOD("du0", 724, R8A77965_CLK_S2D1), 179 + DEF_MOD("lvds", 727, R8A77965_CLK_S2D1), 180 + DEF_MOD("hdmi0", 729, R8A77965_CLK_HDMI), 181 + 182 + DEF_MOD("vin7", 804, R8A77965_CLK_S0D2), 183 + DEF_MOD("vin6", 805, R8A77965_CLK_S0D2), 184 + DEF_MOD("vin5", 806, R8A77965_CLK_S0D2), 185 + DEF_MOD("vin4", 807, R8A77965_CLK_S0D2), 186 + DEF_MOD("vin3", 808, R8A77965_CLK_S0D2), 187 + DEF_MOD("vin2", 809, R8A77965_CLK_S0D2), 188 + DEF_MOD("vin1", 810, R8A77965_CLK_S0D2), 189 + DEF_MOD("vin0", 811, R8A77965_CLK_S0D2), 190 + DEF_MOD("etheravb", 812, R8A77965_CLK_S0D6), 191 + DEF_MOD("imr1", 822, R8A77965_CLK_S0D2), 192 + DEF_MOD("imr0", 823, R8A77965_CLK_S0D2), 193 + 194 + DEF_MOD("gpio7", 905, R8A77965_CLK_S3D4), 195 + DEF_MOD("gpio6", 906, R8A77965_CLK_S3D4), 196 + DEF_MOD("gpio5", 907, R8A77965_CLK_S3D4), 197 + DEF_MOD("gpio4", 908, R8A77965_CLK_S3D4), 198 + DEF_MOD("gpio3", 909, R8A77965_CLK_S3D4), 199 + DEF_MOD("gpio2", 910, R8A77965_CLK_S3D4), 200 + DEF_MOD("gpio1", 911, R8A77965_CLK_S3D4), 201 + DEF_MOD("gpio0", 912, R8A77965_CLK_S3D4), 202 + DEF_MOD("can-fd", 914, R8A77965_CLK_S3D2), 203 + DEF_MOD("can-if1", 915, R8A77965_CLK_S3D4), 204 + DEF_MOD("can-if0", 916, R8A77965_CLK_S3D4), 205 + DEF_MOD("i2c6", 918, R8A77965_CLK_S0D6), 206 + DEF_MOD("i2c5", 919, R8A77965_CLK_S0D6), 207 + DEF_MOD("i2c-dvfs", 926, R8A77965_CLK_CP), 208 + DEF_MOD("i2c4", 927, R8A77965_CLK_S0D6), 209 + DEF_MOD("i2c3", 928, R8A77965_CLK_S0D6), 210 + DEF_MOD("i2c2", 929, R8A77965_CLK_S3D2), 211 + DEF_MOD("i2c1", 930, R8A77965_CLK_S3D2), 212 + DEF_MOD("i2c0", 931, R8A77965_CLK_S3D2), 213 + 214 + DEF_MOD("ssi-all", 1005, R8A77965_CLK_S3D4), 215 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 216 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 217 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 218 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 219 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 220 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 221 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 222 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 223 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 224 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 225 + DEF_MOD("scu-all", 1017, R8A77965_CLK_S3D4), 226 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 227 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 228 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 229 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 230 + DEF_MOD("scu-src9", 1022, MOD_CLK_ID(1017)), 231 + DEF_MOD("scu-src8", 1023, MOD_CLK_ID(1017)), 232 + DEF_MOD("scu-src7", 1024, MOD_CLK_ID(1017)), 233 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 234 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 235 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 236 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 237 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 238 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 239 + DEF_MOD("scu-src0", 1031, MOD_CLK_ID(1017)), 240 + }; 241 + 242 + static const unsigned int r8a77965_crit_mod_clks[] __initconst = { 243 + MOD_CLK_ID(408), /* INTC-AP (GIC) */ 244 + }; 245 + 246 + /* 247 + * CPG Clock Data 248 + */ 249 + 250 + /* 251 + * MD EXTAL PLL0 PLL1 PLL3 PLL4 252 + * 14 13 19 17 (MHz) 253 + *----------------------------------------------------------- 254 + * 0 0 0 0 16.66 x 1 x180 x192 x192 x144 255 + * 0 0 0 1 16.66 x 1 x180 x192 x128 x144 256 + * 0 0 1 0 Prohibited setting 257 + * 0 0 1 1 16.66 x 1 x180 x192 x192 x144 258 + * 0 1 0 0 20 x 1 x150 x160 x160 x120 259 + * 0 1 0 1 20 x 1 x150 x160 x106 x120 260 + * 0 1 1 0 Prohibited setting 261 + * 0 1 1 1 20 x 1 x150 x160 x160 x120 262 + * 1 0 0 0 25 x 1 x120 x128 x128 x96 263 + * 1 0 0 1 25 x 1 x120 x128 x84 x96 264 + * 1 0 1 0 Prohibited setting 265 + * 1 0 1 1 25 x 1 x120 x128 x128 x96 266 + * 1 1 0 0 33.33 / 2 x180 x192 x192 x144 267 + * 1 1 0 1 33.33 / 2 x180 x192 x128 x144 268 + * 1 1 1 0 Prohibited setting 269 + * 1 1 1 1 33.33 / 2 x180 x192 x192 x144 270 + */ 271 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 11) | \ 272 + (((md) & BIT(13)) >> 11) | \ 273 + (((md) & BIT(19)) >> 18) | \ 274 + (((md) & BIT(17)) >> 17)) 275 + 276 + static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = { 277 + /* EXTAL div PLL1 mult/div PLL3 mult/div */ 278 + { 1, 192, 1, 192, 1, }, 279 + { 1, 192, 1, 128, 1, }, 280 + { 0, /* Prohibited setting */ }, 281 + { 1, 192, 1, 192, 1, }, 282 + { 1, 160, 1, 160, 1, }, 283 + { 1, 160, 1, 106, 1, }, 284 + { 0, /* Prohibited setting */ }, 285 + { 1, 160, 1, 160, 1, }, 286 + { 1, 128, 1, 128, 1, }, 287 + { 1, 128, 1, 84, 1, }, 288 + { 0, /* Prohibited setting */ }, 289 + { 1, 128, 1, 128, 1, }, 290 + { 2, 192, 1, 192, 1, }, 291 + { 2, 192, 1, 128, 1, }, 292 + { 0, /* Prohibited setting */ }, 293 + { 2, 192, 1, 192, 1, }, 294 + }; 295 + 296 + static int __init r8a77965_cpg_mssr_init(struct device *dev) 297 + { 298 + const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 299 + u32 cpg_mode; 300 + int error; 301 + 302 + error = rcar_rst_read_mode_pins(&cpg_mode); 303 + if (error) 304 + return error; 305 + 306 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 307 + if (!cpg_pll_config->extal_div) { 308 + dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode); 309 + return -EINVAL; 310 + } 311 + 312 + return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 313 + }; 314 + 315 + const struct cpg_mssr_info r8a77965_cpg_mssr_info __initconst = { 316 + /* Core Clocks */ 317 + .core_clks = r8a77965_core_clks, 318 + .num_core_clks = ARRAY_SIZE(r8a77965_core_clks), 319 + .last_dt_core_clk = LAST_DT_CORE_CLK, 320 + .num_total_core_clks = MOD_CLK_BASE, 321 + 322 + /* Module Clocks */ 323 + .mod_clks = r8a77965_mod_clks, 324 + .num_mod_clks = ARRAY_SIZE(r8a77965_mod_clks), 325 + .num_hw_mod_clks = 12 * 32, 326 + 327 + /* Critical Module Clocks */ 328 + .crit_mod_clks = r8a77965_crit_mod_clks, 329 + .num_crit_mod_clks = ARRAY_SIZE(r8a77965_crit_mod_clks), 330 + 331 + /* Callbacks */ 332 + .init = r8a77965_cpg_mssr_init, 333 + .cpg_clk_register = rcar_gen3_cpg_clk_register, 334 + };
+227
drivers/clk/renesas/r8a77980-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77980 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Renesas Electronics Corp. 6 + * Copyright (C) 2018 Cogent Embedded, Inc. 7 + * 8 + * Based on r8a7795-cpg-mssr.c 9 + * 10 + * Copyright (C) 2015 Glider bvba 11 + */ 12 + 13 + #include <linux/device.h> 14 + #include <linux/init.h> 15 + #include <linux/kernel.h> 16 + #include <linux/soc/renesas/rcar-rst.h> 17 + #include <linux/sys_soc.h> 18 + 19 + #include <dt-bindings/clock/r8a77980-cpg-mssr.h> 20 + 21 + #include "renesas-cpg-mssr.h" 22 + #include "rcar-gen3-cpg.h" 23 + 24 + enum clk_ids { 25 + /* Core Clock Outputs exported to DT */ 26 + LAST_DT_CORE_CLK = R8A77980_CLK_OSC, 27 + 28 + /* External Input Clocks */ 29 + CLK_EXTAL, 30 + CLK_EXTALR, 31 + 32 + /* Internal Core Clocks */ 33 + CLK_MAIN, 34 + CLK_PLL1, 35 + CLK_PLL2, 36 + CLK_PLL3, 37 + CLK_PLL1_DIV2, 38 + CLK_PLL1_DIV4, 39 + CLK_S0, 40 + CLK_S1, 41 + CLK_S2, 42 + CLK_S3, 43 + CLK_SDSRC, 44 + 45 + /* Module Clocks */ 46 + MOD_CLK_BASE 47 + }; 48 + 49 + static const struct cpg_core_clk r8a77980_core_clks[] __initconst = { 50 + /* External Clock Inputs */ 51 + DEF_INPUT("extal", CLK_EXTAL), 52 + DEF_INPUT("extalr", CLK_EXTALR), 53 + 54 + /* Internal Core Clocks */ 55 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 56 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 57 + DEF_BASE(".pll2", CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN), 58 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 59 + 60 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 61 + DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4, CLK_PLL1_DIV2, 2, 1), 62 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1_DIV2, 2, 1), 63 + DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), 64 + DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 65 + DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 66 + DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 67 + 68 + /* Core Clock Outputs */ 69 + DEF_FIXED("ztr", R8A77980_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 70 + DEF_FIXED("ztrd2", R8A77980_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 71 + DEF_FIXED("zt", R8A77980_CLK_ZT, CLK_PLL1_DIV2, 4, 1), 72 + DEF_FIXED("zx", R8A77980_CLK_ZX, CLK_PLL1_DIV2, 2, 1), 73 + DEF_FIXED("s0d1", R8A77980_CLK_S0D1, CLK_S0, 1, 1), 74 + DEF_FIXED("s0d2", R8A77980_CLK_S0D2, CLK_S0, 2, 1), 75 + DEF_FIXED("s0d3", R8A77980_CLK_S0D3, CLK_S0, 3, 1), 76 + DEF_FIXED("s0d4", R8A77980_CLK_S0D4, CLK_S0, 4, 1), 77 + DEF_FIXED("s0d6", R8A77980_CLK_S0D6, CLK_S0, 6, 1), 78 + DEF_FIXED("s0d12", R8A77980_CLK_S0D12, CLK_S0, 12, 1), 79 + DEF_FIXED("s0d24", R8A77980_CLK_S0D24, CLK_S0, 24, 1), 80 + DEF_FIXED("s1d1", R8A77980_CLK_S1D1, CLK_S1, 1, 1), 81 + DEF_FIXED("s1d2", R8A77980_CLK_S1D2, CLK_S1, 2, 1), 82 + DEF_FIXED("s1d4", R8A77980_CLK_S1D4, CLK_S1, 4, 1), 83 + DEF_FIXED("s2d1", R8A77980_CLK_S2D1, CLK_S2, 1, 1), 84 + DEF_FIXED("s2d2", R8A77980_CLK_S2D2, CLK_S2, 2, 1), 85 + DEF_FIXED("s2d4", R8A77980_CLK_S2D4, CLK_S2, 4, 1), 86 + DEF_FIXED("s3d1", R8A77980_CLK_S3D1, CLK_S3, 1, 1), 87 + DEF_FIXED("s3d2", R8A77980_CLK_S3D2, CLK_S3, 2, 1), 88 + DEF_FIXED("s3d4", R8A77980_CLK_S3D4, CLK_S3, 4, 1), 89 + 90 + DEF_GEN3_SD("sd0", R8A77980_CLK_SD0, CLK_SDSRC, 0x0074), 91 + 92 + DEF_FIXED("cl", R8A77980_CLK_CL, CLK_PLL1_DIV2, 48, 1), 93 + DEF_FIXED("cp", R8A77980_CLK_CP, CLK_EXTAL, 2, 1), 94 + DEF_FIXED("cpex", R8A77980_CLK_CPEX, CLK_EXTAL, 2, 1), 95 + 96 + DEF_DIV6P1("canfd", R8A77980_CLK_CANFD, CLK_PLL1_DIV4, 0x244), 97 + DEF_DIV6P1("csi0", R8A77980_CLK_CSI0, CLK_PLL1_DIV4, 0x00c), 98 + DEF_DIV6P1("mso", R8A77980_CLK_MSO, CLK_PLL1_DIV4, 0x014), 99 + }; 100 + 101 + static const struct mssr_mod_clk r8a77980_mod_clks[] __initconst = { 102 + DEF_MOD("tmu4", 121, R8A77980_CLK_S0D6), 103 + DEF_MOD("tmu3", 122, R8A77980_CLK_S0D6), 104 + DEF_MOD("tmu2", 123, R8A77980_CLK_S0D6), 105 + DEF_MOD("tmu1", 124, R8A77980_CLK_S0D6), 106 + DEF_MOD("tmu0", 125, R8A77980_CLK_CP), 107 + DEF_MOD("scif4", 203, R8A77980_CLK_S3D4), 108 + DEF_MOD("scif3", 204, R8A77980_CLK_S3D4), 109 + DEF_MOD("scif1", 206, R8A77980_CLK_S3D4), 110 + DEF_MOD("scif0", 207, R8A77980_CLK_S3D4), 111 + DEF_MOD("msiof3", 208, R8A77980_CLK_MSO), 112 + DEF_MOD("msiof2", 209, R8A77980_CLK_MSO), 113 + DEF_MOD("msiof1", 210, R8A77980_CLK_MSO), 114 + DEF_MOD("msiof0", 211, R8A77980_CLK_MSO), 115 + DEF_MOD("sys-dmac2", 217, R8A77980_CLK_S0D3), 116 + DEF_MOD("sys-dmac1", 218, R8A77980_CLK_S0D3), 117 + DEF_MOD("tpu0", 304, R8A77980_CLK_S3D4), 118 + DEF_MOD("sdif", 314, R8A77980_CLK_SD0), 119 + DEF_MOD("pciec0", 319, R8A77980_CLK_S3D1), 120 + DEF_MOD("intc-ex", 407, R8A77980_CLK_CP), 121 + DEF_MOD("intc-ap", 408, R8A77980_CLK_S0D3), 122 + DEF_MOD("hscif3", 517, R8A77980_CLK_S3D1), 123 + DEF_MOD("hscif2", 518, R8A77980_CLK_S3D1), 124 + DEF_MOD("hscif1", 519, R8A77980_CLK_S3D1), 125 + DEF_MOD("hscif0", 520, R8A77980_CLK_S3D1), 126 + DEF_MOD("imp4", 521, R8A77980_CLK_S1D1), 127 + DEF_MOD("thermal", 522, R8A77980_CLK_CP), 128 + DEF_MOD("pwm", 523, R8A77980_CLK_S0D12), 129 + DEF_MOD("impdma1", 526, R8A77980_CLK_S1D1), 130 + DEF_MOD("impdma0", 527, R8A77980_CLK_S1D1), 131 + DEF_MOD("imp-ocv4", 528, R8A77980_CLK_S1D1), 132 + DEF_MOD("imp-ocv3", 529, R8A77980_CLK_S1D1), 133 + DEF_MOD("imp-ocv2", 531, R8A77980_CLK_S1D1), 134 + DEF_MOD("fcpvd0", 603, R8A77980_CLK_S3D1), 135 + DEF_MOD("vspd0", 623, R8A77980_CLK_S3D1), 136 + DEF_MOD("csi41", 715, R8A77980_CLK_CSI0), 137 + DEF_MOD("csi40", 716, R8A77980_CLK_CSI0), 138 + DEF_MOD("du0", 724, R8A77980_CLK_S2D1), 139 + DEF_MOD("lvds", 727, R8A77980_CLK_S2D1), 140 + DEF_MOD("etheravb", 812, R8A77980_CLK_S3D2), 141 + DEF_MOD("gether", 813, R8A77980_CLK_S3D2), 142 + DEF_MOD("imp3", 824, R8A77980_CLK_S1D1), 143 + DEF_MOD("imp2", 825, R8A77980_CLK_S1D1), 144 + DEF_MOD("imp1", 826, R8A77980_CLK_S1D1), 145 + DEF_MOD("imp0", 827, R8A77980_CLK_S1D1), 146 + DEF_MOD("imp-ocv1", 828, R8A77980_CLK_S1D1), 147 + DEF_MOD("imp-ocv0", 829, R8A77980_CLK_S1D1), 148 + DEF_MOD("impram", 830, R8A77980_CLK_S1D1), 149 + DEF_MOD("impcnn", 831, R8A77980_CLK_S1D1), 150 + DEF_MOD("gpio5", 907, R8A77980_CLK_CP), 151 + DEF_MOD("gpio4", 908, R8A77980_CLK_CP), 152 + DEF_MOD("gpio3", 909, R8A77980_CLK_CP), 153 + DEF_MOD("gpio2", 910, R8A77980_CLK_CP), 154 + DEF_MOD("gpio1", 911, R8A77980_CLK_CP), 155 + DEF_MOD("gpio0", 912, R8A77980_CLK_CP), 156 + DEF_MOD("can-fd", 914, R8A77980_CLK_S3D2), 157 + DEF_MOD("i2c4", 927, R8A77980_CLK_S0D6), 158 + DEF_MOD("i2c3", 928, R8A77980_CLK_S0D6), 159 + DEF_MOD("i2c2", 929, R8A77980_CLK_S3D2), 160 + DEF_MOD("i2c1", 930, R8A77980_CLK_S3D2), 161 + DEF_MOD("i2c0", 931, R8A77980_CLK_S3D2), 162 + }; 163 + 164 + static const unsigned int r8a77980_crit_mod_clks[] __initconst = { 165 + MOD_CLK_ID(408), /* INTC-AP (GIC) */ 166 + }; 167 + 168 + 169 + /* 170 + * CPG Clock Data 171 + */ 172 + 173 + /* 174 + * MD EXTAL PLL2 PLL1 PLL3 175 + * 14 13 (MHz) 176 + * -------------------------------------------------- 177 + * 0 0 16.66 x 1 x240 x192 x192 178 + * 0 1 20 x 1 x200 x160 x160 179 + * 1 0 27 x 1 x148 x118 x118 180 + * 1 1 33.33 / 2 x240 x192 x192 181 + */ 182 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 13) | \ 183 + (((md) & BIT(13)) >> 13)) 184 + 185 + static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[4] __initconst = { 186 + /* EXTAL div PLL1 mult/div PLL3 mult/div */ 187 + { 1, 192, 1, 192, 1, }, 188 + { 1, 160, 1, 160, 1, }, 189 + { 1, 118, 1, 118, 1, }, 190 + { 2, 192, 1, 192, 1, }, 191 + }; 192 + 193 + static int __init r8a77980_cpg_mssr_init(struct device *dev) 194 + { 195 + const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 196 + u32 cpg_mode; 197 + int error; 198 + 199 + error = rcar_rst_read_mode_pins(&cpg_mode); 200 + if (error) 201 + return error; 202 + 203 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 204 + 205 + return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 206 + } 207 + 208 + const struct cpg_mssr_info r8a77980_cpg_mssr_info __initconst = { 209 + /* Core Clocks */ 210 + .core_clks = r8a77980_core_clks, 211 + .num_core_clks = ARRAY_SIZE(r8a77980_core_clks), 212 + .last_dt_core_clk = LAST_DT_CORE_CLK, 213 + .num_total_core_clks = MOD_CLK_BASE, 214 + 215 + /* Module Clocks */ 216 + .mod_clks = r8a77980_mod_clks, 217 + .num_mod_clks = ARRAY_SIZE(r8a77980_mod_clks), 218 + .num_hw_mod_clks = 12 * 32, 219 + 220 + /* Critical Module Clocks */ 221 + .crit_mod_clks = r8a77980_crit_mod_clks, 222 + .num_crit_mod_clks = ARRAY_SIZE(r8a77980_crit_mod_clks), 223 + 224 + /* Callbacks */ 225 + .init = r8a77980_cpg_mssr_init, 226 + .cpg_clk_register = rcar_gen3_cpg_clk_register, 227 + };
+143
drivers/clk/renesas/rcar-gen3-cpg.c
··· 13 13 */ 14 14 15 15 #include <linux/bug.h> 16 + #include <linux/bitfield.h> 16 17 #include <linux/clk.h> 17 18 #include <linux/clk-provider.h> 18 19 #include <linux/device.h> ··· 60 59 { 61 60 csn->nb.notifier_call = cpg_simple_notifier_call; 62 61 raw_notifier_chain_register(notifiers, &csn->nb); 62 + } 63 + 64 + /* 65 + * Z Clock & Z2 Clock 66 + * 67 + * Traits of this clock: 68 + * prepare - clk_prepare only ensures that parents are prepared 69 + * enable - clk_enable only ensures that parents are enabled 70 + * rate - rate is adjustable. clk->rate = (parent->rate * mult / 32 ) / 2 71 + * parent - fixed parent. No clk_set_parent support 72 + */ 73 + #define CPG_FRQCRB 0x00000004 74 + #define CPG_FRQCRB_KICK BIT(31) 75 + #define CPG_FRQCRC 0x000000e0 76 + #define CPG_FRQCRC_ZFC_MASK GENMASK(12, 8) 77 + #define CPG_FRQCRC_Z2FC_MASK GENMASK(4, 0) 78 + 79 + struct cpg_z_clk { 80 + struct clk_hw hw; 81 + void __iomem *reg; 82 + void __iomem *kick_reg; 83 + unsigned long mask; 84 + }; 85 + 86 + #define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw) 87 + 88 + static unsigned long cpg_z_clk_recalc_rate(struct clk_hw *hw, 89 + unsigned long parent_rate) 90 + { 91 + struct cpg_z_clk *zclk = to_z_clk(hw); 92 + unsigned int mult; 93 + u32 val; 94 + 95 + val = readl(zclk->reg) & zclk->mask; 96 + mult = 32 - (val >> __ffs(zclk->mask)); 97 + 98 + /* Factor of 2 is for fixed divider */ 99 + return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, 32 * 2); 100 + } 101 + 102 + static long cpg_z_clk_round_rate(struct clk_hw *hw, unsigned long rate, 103 + unsigned long *parent_rate) 104 + { 105 + /* Factor of 2 is for fixed divider */ 106 + unsigned long prate = *parent_rate / 2; 107 + unsigned int mult; 108 + 109 + mult = div_u64(rate * 32ULL, prate); 110 + mult = clamp(mult, 1U, 32U); 111 + 112 + return (u64)prate * mult / 32; 113 + } 114 + 115 + static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, 116 + unsigned long parent_rate) 117 + { 118 + struct cpg_z_clk *zclk = to_z_clk(hw); 119 + unsigned int mult; 120 + unsigned int i; 121 + u32 val, kick; 122 + 123 + /* Factor of 2 is for fixed divider */ 124 + mult = DIV_ROUND_CLOSEST_ULL(rate * 32ULL * 2, parent_rate); 125 + mult = clamp(mult, 1U, 32U); 126 + 127 + if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK) 128 + return -EBUSY; 129 + 130 + val = readl(zclk->reg) & ~zclk->mask; 131 + val |= ((32 - mult) << __ffs(zclk->mask)) & zclk->mask; 132 + writel(val, zclk->reg); 133 + 134 + /* 135 + * Set KICK bit in FRQCRB to update hardware setting and wait for 136 + * clock change completion. 137 + */ 138 + kick = readl(zclk->kick_reg); 139 + kick |= CPG_FRQCRB_KICK; 140 + writel(kick, zclk->kick_reg); 141 + 142 + /* 143 + * Note: There is no HW information about the worst case latency. 144 + * 145 + * Using experimental measurements, it seems that no more than 146 + * ~10 iterations are needed, independently of the CPU rate. 147 + * Since this value might be dependent of external xtal rate, pll1 148 + * rate or even the other emulation clocks rate, use 1000 as a 149 + * "super" safe value. 150 + */ 151 + for (i = 1000; i; i--) { 152 + if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) 153 + return 0; 154 + 155 + cpu_relax(); 156 + } 157 + 158 + return -ETIMEDOUT; 159 + } 160 + 161 + static const struct clk_ops cpg_z_clk_ops = { 162 + .recalc_rate = cpg_z_clk_recalc_rate, 163 + .round_rate = cpg_z_clk_round_rate, 164 + .set_rate = cpg_z_clk_set_rate, 165 + }; 166 + 167 + static struct clk * __init cpg_z_clk_register(const char *name, 168 + const char *parent_name, 169 + void __iomem *reg, 170 + unsigned long mask) 171 + { 172 + struct clk_init_data init; 173 + struct cpg_z_clk *zclk; 174 + struct clk *clk; 175 + 176 + zclk = kzalloc(sizeof(*zclk), GFP_KERNEL); 177 + if (!zclk) 178 + return ERR_PTR(-ENOMEM); 179 + 180 + init.name = name; 181 + init.ops = &cpg_z_clk_ops; 182 + init.flags = 0; 183 + init.parent_names = &parent_name; 184 + init.num_parents = 1; 185 + 186 + zclk->reg = reg + CPG_FRQCRC; 187 + zclk->kick_reg = reg + CPG_FRQCRB; 188 + zclk->hw.init = &init; 189 + zclk->mask = mask; 190 + 191 + clk = clk_register(NULL, &zclk->hw); 192 + if (IS_ERR(clk)) 193 + kfree(zclk); 194 + 195 + return clk; 63 196 } 64 197 65 198 /* ··· 554 419 } 555 420 mult = 1; 556 421 break; 422 + 423 + case CLK_TYPE_GEN3_Z: 424 + return cpg_z_clk_register(core->name, __clk_get_name(parent), 425 + base, CPG_FRQCRC_ZFC_MASK); 426 + 427 + case CLK_TYPE_GEN3_Z2: 428 + return cpg_z_clk_register(core->name, __clk_get_name(parent), 429 + base, CPG_FRQCRC_Z2FC_MASK); 557 430 558 431 default: 559 432 return ERR_PTR(-EINVAL);
+2
drivers/clk/renesas/rcar-gen3-cpg.h
··· 21 21 CLK_TYPE_GEN3_SD, 22 22 CLK_TYPE_GEN3_R, 23 23 CLK_TYPE_GEN3_PE, 24 + CLK_TYPE_GEN3_Z, 25 + CLK_TYPE_GEN3_Z2, 24 26 }; 25 27 26 28 #define DEF_GEN3_SD(_name, _id, _parent, _offset) \
+12
drivers/clk/renesas/renesas-cpg-mssr.c
··· 693 693 .data = &r8a7796_cpg_mssr_info, 694 694 }, 695 695 #endif 696 + #ifdef CONFIG_CLK_R8A77965 697 + { 698 + .compatible = "renesas,r8a77965-cpg-mssr", 699 + .data = &r8a77965_cpg_mssr_info, 700 + }, 701 + #endif 696 702 #ifdef CONFIG_CLK_R8A77970 697 703 { 698 704 .compatible = "renesas,r8a77970-cpg-mssr", 699 705 .data = &r8a77970_cpg_mssr_info, 706 + }, 707 + #endif 708 + #ifdef CONFIG_CLK_R8A77980 709 + { 710 + .compatible = "renesas,r8a77980-cpg-mssr", 711 + .data = &r8a77980_cpg_mssr_info, 700 712 }, 701 713 #endif 702 714 #ifdef CONFIG_CLK_R8A77995
+2
drivers/clk/renesas/renesas-cpg-mssr.h
··· 139 139 extern const struct cpg_mssr_info r8a7794_cpg_mssr_info; 140 140 extern const struct cpg_mssr_info r8a7795_cpg_mssr_info; 141 141 extern const struct cpg_mssr_info r8a7796_cpg_mssr_info; 142 + extern const struct cpg_mssr_info r8a77965_cpg_mssr_info; 142 143 extern const struct cpg_mssr_info r8a77970_cpg_mssr_info; 144 + extern const struct cpg_mssr_info r8a77980_cpg_mssr_info; 143 145 extern const struct cpg_mssr_info r8a77995_cpg_mssr_info; 144 146 145 147
+5 -7
drivers/clk/sunxi-ng/Kconfig
··· 11 11 default ARM64 && ARCH_SUNXI 12 12 depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST 13 13 14 + config SUN50I_H6_CCU 15 + bool "Support for the Allwinner H6 CCU" 16 + default ARM64 && ARCH_SUNXI 17 + depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST 18 + 14 19 config SUN4I_A10_CCU 15 20 bool "Support for the Allwinner A10/A20 CCU" 16 - select SUNXI_CCU_DIV 17 - select SUNXI_CCU_MULT 18 - select SUNXI_CCU_NK 19 - select SUNXI_CCU_NKM 20 - select SUNXI_CCU_NM 21 - select SUNXI_CCU_MP 22 - select SUNXI_CCU_PHASE 23 21 default MACH_SUN4I 24 22 default MACH_SUN7I 25 23 depends on MACH_SUN4I || MACH_SUN7I || COMPILE_TEST
+1
drivers/clk/sunxi-ng/Makefile
··· 22 22 23 23 # SoC support 24 24 obj-$(CONFIG_SUN50I_A64_CCU) += ccu-sun50i-a64.o 25 + obj-$(CONFIG_SUN50I_H6_CCU) += ccu-sun50i-h6.o 25 26 obj-$(CONFIG_SUN4I_A10_CCU) += ccu-sun4i-a10.o 26 27 obj-$(CONFIG_SUN5I_CCU) += ccu-sun5i.o 27 28 obj-$(CONFIG_SUN6I_A31_CCU) += ccu-sun6i-a31.o
+1211
drivers/clk/sunxi-ng/ccu-sun50i-h6.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.io> 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/of_address.h> 8 + #include <linux/platform_device.h> 9 + 10 + #include "ccu_common.h" 11 + #include "ccu_reset.h" 12 + 13 + #include "ccu_div.h" 14 + #include "ccu_gate.h" 15 + #include "ccu_mp.h" 16 + #include "ccu_mult.h" 17 + #include "ccu_nk.h" 18 + #include "ccu_nkm.h" 19 + #include "ccu_nkmp.h" 20 + #include "ccu_nm.h" 21 + 22 + #include "ccu-sun50i-h6.h" 23 + 24 + /* 25 + * The CPU PLL is actually NP clock, with P being /1, /2 or /4. However 26 + * P should only be used for output frequencies lower than 288 MHz. 27 + * 28 + * For now we can just model it as a multiplier clock, and force P to /1. 29 + * 30 + * The M factor is present in the register's description, but not in the 31 + * frequency formula, and it's documented as "M is only used for backdoor 32 + * testing", so it's not modelled and then force to 0. 33 + */ 34 + #define SUN50I_H6_PLL_CPUX_REG 0x000 35 + static struct ccu_mult pll_cpux_clk = { 36 + .enable = BIT(31), 37 + .lock = BIT(28), 38 + .mult = _SUNXI_CCU_MULT_MIN(8, 8, 12), 39 + .common = { 40 + .reg = 0x000, 41 + .hw.init = CLK_HW_INIT("pll-cpux", "osc24M", 42 + &ccu_mult_ops, 43 + CLK_SET_RATE_UNGATE), 44 + }, 45 + }; 46 + 47 + /* Some PLLs are input * N / div1 / P. Model them as NKMP with no K */ 48 + #define SUN50I_H6_PLL_DDR0_REG 0x010 49 + static struct ccu_nkmp pll_ddr0_clk = { 50 + .enable = BIT(31), 51 + .lock = BIT(28), 52 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 53 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 54 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 55 + .common = { 56 + .reg = 0x010, 57 + .hw.init = CLK_HW_INIT("pll-ddr0", "osc24M", 58 + &ccu_nkmp_ops, 59 + CLK_SET_RATE_UNGATE), 60 + }, 61 + }; 62 + 63 + #define SUN50I_H6_PLL_PERIPH0_REG 0x020 64 + static struct ccu_nkmp pll_periph0_clk = { 65 + .enable = BIT(31), 66 + .lock = BIT(28), 67 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 68 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 69 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 70 + .fixed_post_div = 4, 71 + .common = { 72 + .reg = 0x020, 73 + .features = CCU_FEATURE_FIXED_POSTDIV, 74 + .hw.init = CLK_HW_INIT("pll-periph0", "osc24M", 75 + &ccu_nkmp_ops, 76 + CLK_SET_RATE_UNGATE), 77 + }, 78 + }; 79 + 80 + #define SUN50I_H6_PLL_PERIPH1_REG 0x028 81 + static struct ccu_nkmp pll_periph1_clk = { 82 + .enable = BIT(31), 83 + .lock = BIT(28), 84 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 85 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 86 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 87 + .fixed_post_div = 4, 88 + .common = { 89 + .reg = 0x028, 90 + .features = CCU_FEATURE_FIXED_POSTDIV, 91 + .hw.init = CLK_HW_INIT("pll-periph1", "osc24M", 92 + &ccu_nkmp_ops, 93 + CLK_SET_RATE_UNGATE), 94 + }, 95 + }; 96 + 97 + #define SUN50I_H6_PLL_GPU_REG 0x030 98 + static struct ccu_nkmp pll_gpu_clk = { 99 + .enable = BIT(31), 100 + .lock = BIT(28), 101 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 102 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 103 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 104 + .common = { 105 + .reg = 0x030, 106 + .hw.init = CLK_HW_INIT("pll-gpu", "osc24M", 107 + &ccu_nkmp_ops, 108 + CLK_SET_RATE_UNGATE), 109 + }, 110 + }; 111 + 112 + /* 113 + * For Video PLLs, the output divider is described as "used for testing" 114 + * in the user manual. So it's not modelled and forced to 0. 115 + */ 116 + #define SUN50I_H6_PLL_VIDEO0_REG 0x040 117 + static struct ccu_nm pll_video0_clk = { 118 + .enable = BIT(31), 119 + .lock = BIT(28), 120 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 121 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 122 + .fixed_post_div = 4, 123 + .common = { 124 + .reg = 0x040, 125 + .features = CCU_FEATURE_FIXED_POSTDIV, 126 + .hw.init = CLK_HW_INIT("pll-video0", "osc24M", 127 + &ccu_nm_ops, 128 + CLK_SET_RATE_UNGATE), 129 + }, 130 + }; 131 + 132 + #define SUN50I_H6_PLL_VIDEO1_REG 0x048 133 + static struct ccu_nm pll_video1_clk = { 134 + .enable = BIT(31), 135 + .lock = BIT(28), 136 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 137 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 138 + .fixed_post_div = 4, 139 + .common = { 140 + .reg = 0x048, 141 + .features = CCU_FEATURE_FIXED_POSTDIV, 142 + .hw.init = CLK_HW_INIT("pll-video1", "osc24M", 143 + &ccu_nm_ops, 144 + CLK_SET_RATE_UNGATE), 145 + }, 146 + }; 147 + 148 + #define SUN50I_H6_PLL_VE_REG 0x058 149 + static struct ccu_nkmp pll_ve_clk = { 150 + .enable = BIT(31), 151 + .lock = BIT(28), 152 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 153 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 154 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 155 + .common = { 156 + .reg = 0x058, 157 + .hw.init = CLK_HW_INIT("pll-ve", "osc24M", 158 + &ccu_nkmp_ops, 159 + CLK_SET_RATE_UNGATE), 160 + }, 161 + }; 162 + 163 + #define SUN50I_H6_PLL_DE_REG 0x060 164 + static struct ccu_nkmp pll_de_clk = { 165 + .enable = BIT(31), 166 + .lock = BIT(28), 167 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 168 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 169 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 170 + .common = { 171 + .reg = 0x060, 172 + .hw.init = CLK_HW_INIT("pll-de", "osc24M", 173 + &ccu_nkmp_ops, 174 + CLK_SET_RATE_UNGATE), 175 + }, 176 + }; 177 + 178 + #define SUN50I_H6_PLL_HSIC_REG 0x070 179 + static struct ccu_nkmp pll_hsic_clk = { 180 + .enable = BIT(31), 181 + .lock = BIT(28), 182 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 183 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 184 + .p = _SUNXI_CCU_DIV(0, 1), /* output divider */ 185 + .common = { 186 + .reg = 0x070, 187 + .hw.init = CLK_HW_INIT("pll-hsic", "osc24M", 188 + &ccu_nkmp_ops, 189 + CLK_SET_RATE_UNGATE), 190 + }, 191 + }; 192 + 193 + /* 194 + * The Audio PLL is supposed to have 3 outputs: 2 fixed factors from 195 + * the base (2x and 4x), and one variable divider (the one true pll audio). 196 + * 197 + * We don't have any need for the variable divider for now, so we just 198 + * hardcode it to match with the clock names. 199 + */ 200 + #define SUN50I_H6_PLL_AUDIO_REG 0x078 201 + static struct ccu_nm pll_audio_base_clk = { 202 + .enable = BIT(31), 203 + .lock = BIT(28), 204 + .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 205 + .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 206 + .common = { 207 + .reg = 0x078, 208 + .hw.init = CLK_HW_INIT("pll-audio-base", "osc24M", 209 + &ccu_nm_ops, 210 + CLK_SET_RATE_UNGATE), 211 + }, 212 + }; 213 + 214 + static const char * const cpux_parents[] = { "osc24M", "osc32k", 215 + "iosc", "pll-cpux" }; 216 + static SUNXI_CCU_MUX(cpux_clk, "cpux", cpux_parents, 217 + 0x500, 24, 2, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL); 218 + static SUNXI_CCU_M(axi_clk, "axi", "cpux", 0x500, 0, 2, 0); 219 + static SUNXI_CCU_M(cpux_apb_clk, "cpux-apb", "cpux", 0x500, 8, 2, 0); 220 + 221 + static const char * const psi_ahb1_ahb2_parents[] = { "osc24M", "osc32k", 222 + "iosc", "pll-periph0" }; 223 + static SUNXI_CCU_MP_WITH_MUX(psi_ahb1_ahb2_clk, "psi-ahb1-ahb2", 224 + psi_ahb1_ahb2_parents, 225 + 0x510, 226 + 0, 5, /* M */ 227 + 16, 2, /* P */ 228 + 24, 2, /* mux */ 229 + 0); 230 + 231 + static const char * const ahb3_apb1_apb2_parents[] = { "osc24M", "osc32k", 232 + "psi-ahb1-ahb2", 233 + "pll-periph0" }; 234 + static SUNXI_CCU_MP_WITH_MUX(ahb3_clk, "ahb3", ahb3_apb1_apb2_parents, 0x51c, 235 + 0, 5, /* M */ 236 + 16, 2, /* P */ 237 + 24, 2, /* mux */ 238 + 0); 239 + 240 + static SUNXI_CCU_MP_WITH_MUX(apb1_clk, "apb1", ahb3_apb1_apb2_parents, 0x520, 241 + 0, 5, /* M */ 242 + 16, 2, /* P */ 243 + 24, 2, /* mux */ 244 + 0); 245 + 246 + static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", ahb3_apb1_apb2_parents, 0x524, 247 + 0, 5, /* M */ 248 + 16, 2, /* P */ 249 + 24, 2, /* mux */ 250 + 0); 251 + 252 + static const char * const mbus_parents[] = { "osc24M", "pll-periph0-2x", 253 + "pll-ddr0", "pll-periph0-4x" }; 254 + static SUNXI_CCU_M_WITH_MUX_GATE(mbus_clk, "mbus", mbus_parents, 0x540, 255 + 0, 3, /* M */ 256 + 24, 2, /* mux */ 257 + BIT(31), /* gate */ 258 + CLK_IS_CRITICAL); 259 + 260 + static const char * const de_parents[] = { "pll-de", "pll-periph0-2x" }; 261 + static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de", de_parents, 0x600, 262 + 0, 4, /* M */ 263 + 24, 1, /* mux */ 264 + BIT(31), /* gate */ 265 + 0); 266 + 267 + static SUNXI_CCU_GATE(bus_de_clk, "bus-de", "psi-ahb1-ahb2", 268 + 0x60c, BIT(0), 0); 269 + 270 + static const char * const deinterlace_parents[] = { "pll-periph0", 271 + "pll-periph1" }; 272 + static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace", 273 + deinterlace_parents, 274 + 0x620, 275 + 0, 4, /* M */ 276 + 24, 1, /* mux */ 277 + BIT(31), /* gate */ 278 + 0); 279 + 280 + static SUNXI_CCU_GATE(bus_deinterlace_clk, "bus-deinterlace", "psi-ahb1-ahb2", 281 + 0x62c, BIT(0), 0); 282 + 283 + static const char * const gpu_parents[] = { "pll-gpu" }; 284 + static SUNXI_CCU_M_WITH_MUX_GATE(gpu_clk, "gpu", gpu_parents, 0x670, 285 + 0, 3, /* M */ 286 + 24, 1, /* mux */ 287 + BIT(31), /* gate */ 288 + 0); 289 + 290 + static SUNXI_CCU_GATE(bus_gpu_clk, "bus-gpu", "psi-ahb1-ahb2", 291 + 0x67c, BIT(0), 0); 292 + 293 + /* Also applies to EMCE */ 294 + static const char * const ce_parents[] = { "osc24M", "pll-periph0-2x" }; 295 + static SUNXI_CCU_MP_WITH_MUX_GATE(ce_clk, "ce", ce_parents, 0x680, 296 + 0, 4, /* M */ 297 + 8, 2, /* N */ 298 + 24, 1, /* mux */ 299 + BIT(31),/* gate */ 300 + 0); 301 + 302 + static SUNXI_CCU_GATE(bus_ce_clk, "bus-ce", "psi-ahb1-ahb2", 303 + 0x68c, BIT(0), 0); 304 + 305 + static const char * const ve_parents[] = { "pll-ve" }; 306 + static SUNXI_CCU_M_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, 307 + 0, 3, /* M */ 308 + 24, 1, /* mux */ 309 + BIT(31), /* gate */ 310 + 0); 311 + 312 + static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "psi-ahb1-ahb2", 313 + 0x69c, BIT(0), 0); 314 + 315 + static SUNXI_CCU_MP_WITH_MUX_GATE(emce_clk, "emce", ce_parents, 0x6b0, 316 + 0, 4, /* M */ 317 + 8, 2, /* N */ 318 + 24, 1, /* mux */ 319 + BIT(31),/* gate */ 320 + 0); 321 + 322 + static SUNXI_CCU_GATE(bus_emce_clk, "bus-emce", "psi-ahb1-ahb2", 323 + 0x6bc, BIT(0), 0); 324 + 325 + static const char * const vp9_parents[] = { "pll-ve", "pll-periph0-2x" }; 326 + static SUNXI_CCU_M_WITH_MUX_GATE(vp9_clk, "vp9", vp9_parents, 0x6c0, 327 + 0, 3, /* M */ 328 + 24, 1, /* mux */ 329 + BIT(31), /* gate */ 330 + 0); 331 + 332 + static SUNXI_CCU_GATE(bus_vp9_clk, "bus-vp9", "psi-ahb1-ahb2", 333 + 0x6cc, BIT(0), 0); 334 + 335 + static SUNXI_CCU_GATE(bus_dma_clk, "bus-dma", "psi-ahb1-ahb2", 336 + 0x70c, BIT(0), 0); 337 + 338 + static SUNXI_CCU_GATE(bus_msgbox_clk, "bus-msgbox", "psi-ahb1-ahb2", 339 + 0x71c, BIT(0), 0); 340 + 341 + static SUNXI_CCU_GATE(bus_spinlock_clk, "bus-spinlock", "psi-ahb1-ahb2", 342 + 0x72c, BIT(0), 0); 343 + 344 + static SUNXI_CCU_GATE(bus_hstimer_clk, "bus-hstimer", "psi-ahb1-ahb2", 345 + 0x73c, BIT(0), 0); 346 + 347 + static SUNXI_CCU_GATE(avs_clk, "avs", "osc24M", 0x740, BIT(31), 0); 348 + 349 + static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "psi-ahb1-ahb2", 350 + 0x78c, BIT(0), 0); 351 + 352 + static SUNXI_CCU_GATE(bus_psi_clk, "bus-psi", "psi-ahb1-ahb2", 353 + 0x79c, BIT(0), 0); 354 + 355 + static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x79c, BIT(0), 0); 356 + 357 + static SUNXI_CCU_GATE(bus_iommu_clk, "bus-iommu", "apb1", 0x7bc, BIT(0), 0); 358 + 359 + static const char * const dram_parents[] = { "pll-ddr0" }; 360 + static struct ccu_div dram_clk = { 361 + .div = _SUNXI_CCU_DIV(0, 2), 362 + .mux = _SUNXI_CCU_MUX(24, 2), 363 + .common = { 364 + .reg = 0x800, 365 + .hw.init = CLK_HW_INIT_PARENTS("dram", 366 + dram_parents, 367 + &ccu_div_ops, 368 + CLK_IS_CRITICAL), 369 + }, 370 + }; 371 + 372 + static SUNXI_CCU_GATE(mbus_dma_clk, "mbus-dma", "mbus", 373 + 0x804, BIT(0), 0); 374 + static SUNXI_CCU_GATE(mbus_ve_clk, "mbus-ve", "mbus", 375 + 0x804, BIT(1), 0); 376 + static SUNXI_CCU_GATE(mbus_ce_clk, "mbus-ce", "mbus", 377 + 0x804, BIT(2), 0); 378 + static SUNXI_CCU_GATE(mbus_ts_clk, "mbus-ts", "mbus", 379 + 0x804, BIT(3), 0); 380 + static SUNXI_CCU_GATE(mbus_nand_clk, "mbus-nand", "mbus", 381 + 0x804, BIT(5), 0); 382 + static SUNXI_CCU_GATE(mbus_csi_clk, "mbus-csi", "mbus", 383 + 0x804, BIT(8), 0); 384 + static SUNXI_CCU_GATE(mbus_deinterlace_clk, "mbus-deinterlace", "mbus", 385 + 0x804, BIT(11), 0); 386 + 387 + static SUNXI_CCU_GATE(bus_dram_clk, "bus-dram", "psi-ahb1-ahb2", 388 + 0x80c, BIT(0), CLK_IS_CRITICAL); 389 + 390 + static const char * const nand_spi_parents[] = { "osc24M", "pll-periph0", 391 + "pll-periph1", "pll-periph0-2x", 392 + "pll-periph1-2x" }; 393 + static SUNXI_CCU_MP_WITH_MUX_GATE(nand0_clk, "nand0", nand_spi_parents, 0x810, 394 + 0, 4, /* M */ 395 + 8, 2, /* N */ 396 + 24, 3, /* mux */ 397 + BIT(31),/* gate */ 398 + 0); 399 + 400 + static SUNXI_CCU_MP_WITH_MUX_GATE(nand1_clk, "nand1", nand_spi_parents, 0x814, 401 + 0, 4, /* M */ 402 + 8, 2, /* N */ 403 + 24, 3, /* mux */ 404 + BIT(31),/* gate */ 405 + 0); 406 + 407 + static SUNXI_CCU_GATE(bus_nand_clk, "bus-nand", "ahb3", 0x82c, BIT(0), 0); 408 + 409 + static const char * const mmc_parents[] = { "osc24M", "pll-periph0-2x", 410 + "pll-periph1-2x" }; 411 + static SUNXI_CCU_MP_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc_parents, 0x830, 412 + 0, 4, /* M */ 413 + 8, 2, /* N */ 414 + 24, 3, /* mux */ 415 + BIT(31),/* gate */ 416 + 0); 417 + 418 + static SUNXI_CCU_MP_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc_parents, 0x834, 419 + 0, 4, /* M */ 420 + 8, 2, /* N */ 421 + 24, 3, /* mux */ 422 + BIT(31),/* gate */ 423 + 0); 424 + 425 + static SUNXI_CCU_MP_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc_parents, 0x838, 426 + 0, 4, /* M */ 427 + 8, 2, /* N */ 428 + 24, 3, /* mux */ 429 + BIT(31),/* gate */ 430 + 0); 431 + 432 + static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb3", 0x84c, BIT(0), 0); 433 + static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb3", 0x84c, BIT(1), 0); 434 + static SUNXI_CCU_GATE(bus_mmc2_clk, "bus-mmc2", "ahb3", 0x84c, BIT(2), 0); 435 + 436 + static SUNXI_CCU_GATE(bus_uart0_clk, "bus-uart0", "apb2", 0x90c, BIT(0), 0); 437 + static SUNXI_CCU_GATE(bus_uart1_clk, "bus-uart1", "apb2", 0x90c, BIT(1), 0); 438 + static SUNXI_CCU_GATE(bus_uart2_clk, "bus-uart2", "apb2", 0x90c, BIT(2), 0); 439 + static SUNXI_CCU_GATE(bus_uart3_clk, "bus-uart3", "apb2", 0x90c, BIT(3), 0); 440 + 441 + static SUNXI_CCU_GATE(bus_i2c0_clk, "bus-i2c0", "apb2", 0x91c, BIT(0), 0); 442 + static SUNXI_CCU_GATE(bus_i2c1_clk, "bus-i2c1", "apb2", 0x91c, BIT(1), 0); 443 + static SUNXI_CCU_GATE(bus_i2c2_clk, "bus-i2c2", "apb2", 0x91c, BIT(2), 0); 444 + static SUNXI_CCU_GATE(bus_i2c3_clk, "bus-i2c3", "apb2", 0x91c, BIT(3), 0); 445 + 446 + static SUNXI_CCU_GATE(bus_scr0_clk, "bus-scr0", "apb2", 0x93c, BIT(0), 0); 447 + static SUNXI_CCU_GATE(bus_scr1_clk, "bus-scr1", "apb2", 0x93c, BIT(1), 0); 448 + 449 + static SUNXI_CCU_MP_WITH_MUX_GATE(spi0_clk, "spi0", nand_spi_parents, 0x940, 450 + 0, 4, /* M */ 451 + 8, 2, /* N */ 452 + 24, 3, /* mux */ 453 + BIT(31),/* gate */ 454 + 0); 455 + 456 + static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", nand_spi_parents, 0x944, 457 + 0, 4, /* M */ 458 + 8, 2, /* N */ 459 + 24, 3, /* mux */ 460 + BIT(31),/* gate */ 461 + 0); 462 + 463 + static SUNXI_CCU_GATE(bus_spi0_clk, "bus-spi0", "ahb3", 0x96c, BIT(0), 0); 464 + static SUNXI_CCU_GATE(bus_spi1_clk, "bus-spi1", "ahb3", 0x96c, BIT(1), 0); 465 + 466 + static SUNXI_CCU_GATE(bus_emac_clk, "bus-emac", "ahb3", 0x97c, BIT(0), 0); 467 + 468 + static const char * const ts_parents[] = { "osc24M", "pll-periph0" }; 469 + static SUNXI_CCU_MP_WITH_MUX_GATE(ts_clk, "ts", ts_parents, 0x9b0, 470 + 0, 4, /* M */ 471 + 8, 2, /* N */ 472 + 24, 1, /* mux */ 473 + BIT(31),/* gate */ 474 + 0); 475 + 476 + static SUNXI_CCU_GATE(bus_ts_clk, "bus-ts", "ahb3", 0x9bc, BIT(0), 0); 477 + 478 + static const char * const ir_tx_parents[] = { "osc32k", "osc24M" }; 479 + static SUNXI_CCU_MP_WITH_MUX_GATE(ir_tx_clk, "ir-tx", ir_tx_parents, 0x9c0, 480 + 0, 4, /* M */ 481 + 8, 2, /* N */ 482 + 24, 1, /* mux */ 483 + BIT(31),/* gate */ 484 + 0); 485 + 486 + static SUNXI_CCU_GATE(bus_ir_tx_clk, "bus-ir-tx", "apb1", 0x9cc, BIT(0), 0); 487 + 488 + static SUNXI_CCU_GATE(bus_ths_clk, "bus-ths", "apb1", 0x9fc, BIT(0), 0); 489 + 490 + static const char * const audio_parents[] = { "pll-audio", "pll-audio-2x", "pll-audio-4x" }; 491 + static struct ccu_div i2s3_clk = { 492 + .enable = BIT(31), 493 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 494 + .mux = _SUNXI_CCU_MUX(24, 2), 495 + .common = { 496 + .reg = 0xa0c, 497 + .hw.init = CLK_HW_INIT_PARENTS("i2s3", 498 + audio_parents, 499 + &ccu_div_ops, 500 + 0), 501 + }, 502 + }; 503 + 504 + static struct ccu_div i2s0_clk = { 505 + .enable = BIT(31), 506 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 507 + .mux = _SUNXI_CCU_MUX(24, 2), 508 + .common = { 509 + .reg = 0xa10, 510 + .hw.init = CLK_HW_INIT_PARENTS("i2s0", 511 + audio_parents, 512 + &ccu_div_ops, 513 + 0), 514 + }, 515 + }; 516 + 517 + static struct ccu_div i2s1_clk = { 518 + .enable = BIT(31), 519 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 520 + .mux = _SUNXI_CCU_MUX(24, 2), 521 + .common = { 522 + .reg = 0xa14, 523 + .hw.init = CLK_HW_INIT_PARENTS("i2s1", 524 + audio_parents, 525 + &ccu_div_ops, 526 + 0), 527 + }, 528 + }; 529 + 530 + static struct ccu_div i2s2_clk = { 531 + .enable = BIT(31), 532 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 533 + .mux = _SUNXI_CCU_MUX(24, 2), 534 + .common = { 535 + .reg = 0xa18, 536 + .hw.init = CLK_HW_INIT_PARENTS("i2s2", 537 + audio_parents, 538 + &ccu_div_ops, 539 + 0), 540 + }, 541 + }; 542 + 543 + static SUNXI_CCU_GATE(bus_i2s0_clk, "bus-i2s0", "apb1", 0xa1c, BIT(0), 0); 544 + static SUNXI_CCU_GATE(bus_i2s1_clk, "bus-i2s1", "apb1", 0xa1c, BIT(1), 0); 545 + static SUNXI_CCU_GATE(bus_i2s2_clk, "bus-i2s2", "apb1", 0xa1c, BIT(2), 0); 546 + static SUNXI_CCU_GATE(bus_i2s3_clk, "bus-i2s3", "apb1", 0xa1c, BIT(3), 0); 547 + 548 + static struct ccu_div spdif_clk = { 549 + .enable = BIT(31), 550 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 551 + .mux = _SUNXI_CCU_MUX(24, 2), 552 + .common = { 553 + .reg = 0xa20, 554 + .hw.init = CLK_HW_INIT_PARENTS("spdif", 555 + audio_parents, 556 + &ccu_div_ops, 557 + 0), 558 + }, 559 + }; 560 + 561 + static SUNXI_CCU_GATE(bus_spdif_clk, "bus-spdif", "apb1", 0xa2c, BIT(0), 0); 562 + 563 + static struct ccu_div dmic_clk = { 564 + .enable = BIT(31), 565 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 566 + .mux = _SUNXI_CCU_MUX(24, 2), 567 + .common = { 568 + .reg = 0xa40, 569 + .hw.init = CLK_HW_INIT_PARENTS("dmic", 570 + audio_parents, 571 + &ccu_div_ops, 572 + 0), 573 + }, 574 + }; 575 + 576 + static SUNXI_CCU_GATE(bus_dmic_clk, "bus-dmic", "apb1", 0xa4c, BIT(0), 0); 577 + 578 + static struct ccu_div audio_hub_clk = { 579 + .enable = BIT(31), 580 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 581 + .mux = _SUNXI_CCU_MUX(24, 2), 582 + .common = { 583 + .reg = 0xa60, 584 + .hw.init = CLK_HW_INIT_PARENTS("audio-hub", 585 + audio_parents, 586 + &ccu_div_ops, 587 + 0), 588 + }, 589 + }; 590 + 591 + static SUNXI_CCU_GATE(bus_audio_hub_clk, "bus-audio-hub", "apb1", 0xa6c, BIT(0), 0); 592 + 593 + /* 594 + * There are OHCI 12M clock source selection bits for 2 USB 2.0 ports. 595 + * We will force them to 0 (12M divided from 48M). 596 + */ 597 + #define SUN50I_H6_USB0_CLK_REG 0xa70 598 + #define SUN50I_H6_USB3_CLK_REG 0xa7c 599 + 600 + static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc12M", 0xa70, BIT(31), 0); 601 + static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "osc24M", 0xa70, BIT(29), 0); 602 + 603 + static SUNXI_CCU_GATE(usb_phy1_clk, "usb-phy1", "osc24M", 0xa74, BIT(29), 0); 604 + 605 + static SUNXI_CCU_GATE(usb_ohci3_clk, "usb-ohci3", "osc12M", 0xa7c, BIT(31), 0); 606 + static SUNXI_CCU_GATE(usb_phy3_clk, "usb-phy3", "osc12M", 0xa7c, BIT(29), 0); 607 + static SUNXI_CCU_GATE(usb_hsic_12m_clk, "usb-hsic-12M", "osc12M", 0xa7c, BIT(27), 0); 608 + static SUNXI_CCU_GATE(usb_hsic_clk, "usb-hsic", "pll-hsic", 0xa7c, BIT(26), 0); 609 + 610 + static SUNXI_CCU_GATE(bus_ohci0_clk, "bus-ohci0", "ahb3", 0xa8c, BIT(0), 0); 611 + static SUNXI_CCU_GATE(bus_ohci3_clk, "bus-ohci3", "ahb3", 0xa8c, BIT(3), 0); 612 + static SUNXI_CCU_GATE(bus_ehci0_clk, "bus-ehci0", "ahb3", 0xa8c, BIT(4), 0); 613 + static SUNXI_CCU_GATE(bus_xhci_clk, "bus-xhci", "ahb3", 0xa8c, BIT(5), 0); 614 + static SUNXI_CCU_GATE(bus_ehci3_clk, "bus-ehci3", "ahb3", 0xa8c, BIT(7), 0); 615 + static SUNXI_CCU_GATE(bus_otg_clk, "bus-otg", "ahb3", 0xa8c, BIT(8), 0); 616 + 617 + static CLK_FIXED_FACTOR(pcie_ref_100m_clk, "pcie-ref-100M", 618 + "pll-periph0-4x", 24, 1, 0); 619 + static SUNXI_CCU_GATE(pcie_ref_clk, "pcie-ref", "pcie-ref-100M", 620 + 0xab0, BIT(31), 0); 621 + static SUNXI_CCU_GATE(pcie_ref_out_clk, "pcie-ref-out", "pcie-ref", 622 + 0xab0, BIT(30), 0); 623 + 624 + static SUNXI_CCU_M_WITH_GATE(pcie_maxi_clk, "pcie-maxi", 625 + "pll-periph0", 0xab4, 626 + 0, 4, /* M */ 627 + BIT(31), /* gate */ 628 + 0); 629 + 630 + static SUNXI_CCU_M_WITH_GATE(pcie_aux_clk, "pcie-aux", "osc24M", 0xab8, 631 + 0, 5, /* M */ 632 + BIT(31), /* gate */ 633 + 0); 634 + 635 + static SUNXI_CCU_GATE(bus_pcie_clk, "bus-pcie", "psi-ahb1-ahb2", 636 + 0xabc, BIT(0), 0); 637 + 638 + static const char * const hdmi_parents[] = { "pll-video0", "pll-video1", 639 + "pll-video1-4x" }; 640 + static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", hdmi_parents, 0xb00, 641 + 0, 4, /* M */ 642 + 24, 2, /* mux */ 643 + BIT(31), /* gate */ 644 + 0); 645 + 646 + static SUNXI_CCU_GATE(hdmi_slow_clk, "hdmi-slow", "osc24M", 0xb04, BIT(31), 0); 647 + 648 + static const char * const hdmi_cec_parents[] = { "osc32k", "pll-periph0-2x" }; 649 + static const struct ccu_mux_fixed_prediv hdmi_cec_predivs[] = { 650 + { .index = 1, .div = 36621 }, 651 + }; 652 + static struct ccu_mux hdmi_cec_clk = { 653 + .enable = BIT(31), 654 + 655 + .mux = { 656 + .shift = 24, 657 + .width = 2, 658 + 659 + .fixed_predivs = hdmi_cec_predivs, 660 + .n_predivs = ARRAY_SIZE(hdmi_cec_predivs), 661 + }, 662 + 663 + .common = { 664 + .reg = 0xb10, 665 + .features = CCU_FEATURE_VARIABLE_PREDIV, 666 + .hw.init = CLK_HW_INIT_PARENTS("hdmi-cec", 667 + hdmi_cec_parents, 668 + &ccu_mux_ops, 669 + 0), 670 + }, 671 + }; 672 + 673 + static SUNXI_CCU_GATE(bus_hdmi_clk, "bus-hdmi", "ahb3", 0xb1c, BIT(0), 0); 674 + 675 + static SUNXI_CCU_GATE(bus_tcon_top_clk, "bus-tcon-top", "ahb3", 676 + 0xb5c, BIT(0), 0); 677 + 678 + static const char * const tcon_lcd0_parents[] = { "pll-video0", 679 + "pll-video0-4x", 680 + "pll-video1" }; 681 + static SUNXI_CCU_MUX_WITH_GATE(tcon_lcd0_clk, "tcon-lcd0", 682 + tcon_lcd0_parents, 0xb60, 683 + 24, 3, /* mux */ 684 + BIT(31), /* gate */ 685 + 0); 686 + 687 + static SUNXI_CCU_GATE(bus_tcon_lcd0_clk, "bus-tcon-lcd0", "ahb3", 688 + 0xb7c, BIT(0), 0); 689 + 690 + static const char * const tcon_tv0_parents[] = { "pll-video0", 691 + "pll-video0-4x", 692 + "pll-video1", 693 + "pll-video1-4x" }; 694 + static SUNXI_CCU_MP_WITH_MUX_GATE(tcon_tv0_clk, "tcon-tv0", 695 + tcon_tv0_parents, 0xb80, 696 + 0, 4, /* M */ 697 + 8, 2, /* P */ 698 + 24, 3, /* mux */ 699 + BIT(31), /* gate */ 700 + 0); 701 + 702 + static SUNXI_CCU_GATE(bus_tcon_tv0_clk, "bus-tcon-tv0", "ahb3", 703 + 0xb9c, BIT(0), 0); 704 + 705 + static SUNXI_CCU_GATE(csi_cci_clk, "csi-cci", "osc24M", 0xc00, BIT(0), 0); 706 + 707 + static const char * const csi_top_parents[] = { "pll-video0", "pll-ve", 708 + "pll-periph0" }; 709 + static const u8 csi_top_table[] = { 0, 2, 3 }; 710 + static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(csi_top_clk, "csi-top", 711 + csi_top_parents, csi_top_table, 0xc04, 712 + 0, 4, /* M */ 713 + 24, 3, /* mux */ 714 + BIT(31), /* gate */ 715 + 0); 716 + 717 + static const char * const csi_mclk_parents[] = { "osc24M", "pll-video0", 718 + "pll-periph0", "pll-periph1" }; 719 + static SUNXI_CCU_M_WITH_MUX_GATE(csi_mclk_clk, "csi-mclk", 720 + csi_mclk_parents, 0xc08, 721 + 0, 5, /* M */ 722 + 24, 3, /* mux */ 723 + BIT(31), /* gate */ 724 + 0); 725 + 726 + static SUNXI_CCU_GATE(bus_csi_clk, "bus-csi", "ahb3", 0xc2c, BIT(0), 0); 727 + 728 + static const char * const hdcp_parents[] = { "pll-periph0", "pll-periph1" }; 729 + static SUNXI_CCU_M_WITH_MUX_GATE(hdcp_clk, "hdcp", hdcp_parents, 0xc40, 730 + 0, 4, /* M */ 731 + 24, 2, /* mux */ 732 + BIT(31), /* gate */ 733 + 0); 734 + 735 + static SUNXI_CCU_GATE(bus_hdcp_clk, "bus-hdcp", "ahb3", 0xc4c, BIT(0), 0); 736 + 737 + /* Fixed factor clocks */ 738 + static CLK_FIXED_FACTOR(osc12M_clk, "osc12M", "osc24M", 2, 1, 0); 739 + 740 + /* 741 + * The divider of pll-audio is fixed to 8 now, as pll-audio-4x has a 742 + * fixed post-divider 2. 743 + */ 744 + static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio", 745 + "pll-audio-base", 8, 1, CLK_SET_RATE_PARENT); 746 + static CLK_FIXED_FACTOR(pll_audio_2x_clk, "pll-audio-2x", 747 + "pll-audio-base", 4, 1, CLK_SET_RATE_PARENT); 748 + static CLK_FIXED_FACTOR(pll_audio_4x_clk, "pll-audio-4x", 749 + "pll-audio-base", 2, 1, CLK_SET_RATE_PARENT); 750 + 751 + static CLK_FIXED_FACTOR(pll_periph0_4x_clk, "pll-periph0-4x", 752 + "pll-periph0", 1, 4, 0); 753 + static CLK_FIXED_FACTOR(pll_periph0_2x_clk, "pll-periph0-2x", 754 + "pll-periph0", 1, 2, 0); 755 + 756 + static CLK_FIXED_FACTOR(pll_periph1_4x_clk, "pll-periph1-4x", 757 + "pll-periph1", 1, 4, 0); 758 + static CLK_FIXED_FACTOR(pll_periph1_2x_clk, "pll-periph1-2x", 759 + "pll-periph1", 1, 2, 0); 760 + 761 + static CLK_FIXED_FACTOR(pll_video0_4x_clk, "pll-video0-4x", 762 + "pll-video0", 1, 4, CLK_SET_RATE_PARENT); 763 + 764 + static CLK_FIXED_FACTOR(pll_video1_4x_clk, "pll-video1-4x", 765 + "pll-video1", 1, 4, CLK_SET_RATE_PARENT); 766 + 767 + static struct ccu_common *sun50i_h6_ccu_clks[] = { 768 + &pll_cpux_clk.common, 769 + &pll_ddr0_clk.common, 770 + &pll_periph0_clk.common, 771 + &pll_periph1_clk.common, 772 + &pll_gpu_clk.common, 773 + &pll_video0_clk.common, 774 + &pll_video1_clk.common, 775 + &pll_ve_clk.common, 776 + &pll_de_clk.common, 777 + &pll_hsic_clk.common, 778 + &pll_audio_base_clk.common, 779 + &cpux_clk.common, 780 + &axi_clk.common, 781 + &cpux_apb_clk.common, 782 + &psi_ahb1_ahb2_clk.common, 783 + &ahb3_clk.common, 784 + &apb1_clk.common, 785 + &apb2_clk.common, 786 + &mbus_clk.common, 787 + &de_clk.common, 788 + &bus_de_clk.common, 789 + &deinterlace_clk.common, 790 + &bus_deinterlace_clk.common, 791 + &gpu_clk.common, 792 + &bus_gpu_clk.common, 793 + &ce_clk.common, 794 + &bus_ce_clk.common, 795 + &ve_clk.common, 796 + &bus_ve_clk.common, 797 + &emce_clk.common, 798 + &bus_emce_clk.common, 799 + &vp9_clk.common, 800 + &bus_vp9_clk.common, 801 + &bus_dma_clk.common, 802 + &bus_msgbox_clk.common, 803 + &bus_spinlock_clk.common, 804 + &bus_hstimer_clk.common, 805 + &avs_clk.common, 806 + &bus_dbg_clk.common, 807 + &bus_psi_clk.common, 808 + &bus_pwm_clk.common, 809 + &bus_iommu_clk.common, 810 + &dram_clk.common, 811 + &mbus_dma_clk.common, 812 + &mbus_ve_clk.common, 813 + &mbus_ce_clk.common, 814 + &mbus_ts_clk.common, 815 + &mbus_nand_clk.common, 816 + &mbus_csi_clk.common, 817 + &mbus_deinterlace_clk.common, 818 + &bus_dram_clk.common, 819 + &nand0_clk.common, 820 + &nand1_clk.common, 821 + &bus_nand_clk.common, 822 + &mmc0_clk.common, 823 + &mmc1_clk.common, 824 + &mmc2_clk.common, 825 + &bus_mmc0_clk.common, 826 + &bus_mmc1_clk.common, 827 + &bus_mmc2_clk.common, 828 + &bus_uart0_clk.common, 829 + &bus_uart1_clk.common, 830 + &bus_uart2_clk.common, 831 + &bus_uart3_clk.common, 832 + &bus_i2c0_clk.common, 833 + &bus_i2c1_clk.common, 834 + &bus_i2c2_clk.common, 835 + &bus_i2c3_clk.common, 836 + &bus_scr0_clk.common, 837 + &bus_scr1_clk.common, 838 + &spi0_clk.common, 839 + &spi1_clk.common, 840 + &bus_spi0_clk.common, 841 + &bus_spi1_clk.common, 842 + &bus_emac_clk.common, 843 + &ts_clk.common, 844 + &bus_ts_clk.common, 845 + &ir_tx_clk.common, 846 + &bus_ir_tx_clk.common, 847 + &bus_ths_clk.common, 848 + &i2s3_clk.common, 849 + &i2s0_clk.common, 850 + &i2s1_clk.common, 851 + &i2s2_clk.common, 852 + &bus_i2s0_clk.common, 853 + &bus_i2s1_clk.common, 854 + &bus_i2s2_clk.common, 855 + &bus_i2s3_clk.common, 856 + &spdif_clk.common, 857 + &bus_spdif_clk.common, 858 + &dmic_clk.common, 859 + &bus_dmic_clk.common, 860 + &audio_hub_clk.common, 861 + &bus_audio_hub_clk.common, 862 + &usb_ohci0_clk.common, 863 + &usb_phy0_clk.common, 864 + &usb_phy1_clk.common, 865 + &usb_ohci3_clk.common, 866 + &usb_phy3_clk.common, 867 + &usb_hsic_12m_clk.common, 868 + &usb_hsic_clk.common, 869 + &bus_ohci0_clk.common, 870 + &bus_ohci3_clk.common, 871 + &bus_ehci0_clk.common, 872 + &bus_xhci_clk.common, 873 + &bus_ehci3_clk.common, 874 + &bus_otg_clk.common, 875 + &pcie_ref_clk.common, 876 + &pcie_ref_out_clk.common, 877 + &pcie_maxi_clk.common, 878 + &pcie_aux_clk.common, 879 + &bus_pcie_clk.common, 880 + &hdmi_clk.common, 881 + &hdmi_slow_clk.common, 882 + &hdmi_cec_clk.common, 883 + &bus_hdmi_clk.common, 884 + &bus_tcon_top_clk.common, 885 + &tcon_lcd0_clk.common, 886 + &bus_tcon_lcd0_clk.common, 887 + &tcon_tv0_clk.common, 888 + &bus_tcon_tv0_clk.common, 889 + &csi_cci_clk.common, 890 + &csi_top_clk.common, 891 + &csi_mclk_clk.common, 892 + &bus_csi_clk.common, 893 + &hdcp_clk.common, 894 + &bus_hdcp_clk.common, 895 + }; 896 + 897 + static struct clk_hw_onecell_data sun50i_h6_hw_clks = { 898 + .hws = { 899 + [CLK_OSC12M] = &osc12M_clk.hw, 900 + [CLK_PLL_CPUX] = &pll_cpux_clk.common.hw, 901 + [CLK_PLL_DDR0] = &pll_ddr0_clk.common.hw, 902 + [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw, 903 + [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw, 904 + [CLK_PLL_PERIPH0_4X] = &pll_periph0_4x_clk.hw, 905 + [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw, 906 + [CLK_PLL_PERIPH1_2X] = &pll_periph1_2x_clk.hw, 907 + [CLK_PLL_PERIPH1_4X] = &pll_periph1_4x_clk.hw, 908 + [CLK_PLL_GPU] = &pll_gpu_clk.common.hw, 909 + [CLK_PLL_VIDEO0] = &pll_video0_clk.common.hw, 910 + [CLK_PLL_VIDEO0_4X] = &pll_video0_4x_clk.hw, 911 + [CLK_PLL_VIDEO1] = &pll_video1_clk.common.hw, 912 + [CLK_PLL_VIDEO1_4X] = &pll_video1_4x_clk.hw, 913 + [CLK_PLL_VE] = &pll_ve_clk.common.hw, 914 + [CLK_PLL_DE] = &pll_de_clk.common.hw, 915 + [CLK_PLL_HSIC] = &pll_hsic_clk.common.hw, 916 + [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw, 917 + [CLK_PLL_AUDIO] = &pll_audio_clk.hw, 918 + [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw, 919 + [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw, 920 + [CLK_CPUX] = &cpux_clk.common.hw, 921 + [CLK_AXI] = &axi_clk.common.hw, 922 + [CLK_CPUX_APB] = &cpux_apb_clk.common.hw, 923 + [CLK_PSI_AHB1_AHB2] = &psi_ahb1_ahb2_clk.common.hw, 924 + [CLK_AHB3] = &ahb3_clk.common.hw, 925 + [CLK_APB1] = &apb1_clk.common.hw, 926 + [CLK_APB2] = &apb2_clk.common.hw, 927 + [CLK_MBUS] = &mbus_clk.common.hw, 928 + [CLK_DE] = &de_clk.common.hw, 929 + [CLK_BUS_DE] = &bus_de_clk.common.hw, 930 + [CLK_DEINTERLACE] = &deinterlace_clk.common.hw, 931 + [CLK_BUS_DEINTERLACE] = &bus_deinterlace_clk.common.hw, 932 + [CLK_GPU] = &gpu_clk.common.hw, 933 + [CLK_BUS_GPU] = &bus_gpu_clk.common.hw, 934 + [CLK_CE] = &ce_clk.common.hw, 935 + [CLK_BUS_CE] = &bus_ce_clk.common.hw, 936 + [CLK_VE] = &ve_clk.common.hw, 937 + [CLK_BUS_VE] = &bus_ve_clk.common.hw, 938 + [CLK_EMCE] = &emce_clk.common.hw, 939 + [CLK_BUS_EMCE] = &bus_emce_clk.common.hw, 940 + [CLK_VP9] = &vp9_clk.common.hw, 941 + [CLK_BUS_VP9] = &bus_vp9_clk.common.hw, 942 + [CLK_BUS_DMA] = &bus_dma_clk.common.hw, 943 + [CLK_BUS_MSGBOX] = &bus_msgbox_clk.common.hw, 944 + [CLK_BUS_SPINLOCK] = &bus_spinlock_clk.common.hw, 945 + [CLK_BUS_HSTIMER] = &bus_hstimer_clk.common.hw, 946 + [CLK_AVS] = &avs_clk.common.hw, 947 + [CLK_BUS_DBG] = &bus_dbg_clk.common.hw, 948 + [CLK_BUS_PSI] = &bus_psi_clk.common.hw, 949 + [CLK_BUS_PWM] = &bus_pwm_clk.common.hw, 950 + [CLK_BUS_IOMMU] = &bus_iommu_clk.common.hw, 951 + [CLK_DRAM] = &dram_clk.common.hw, 952 + [CLK_MBUS_DMA] = &mbus_dma_clk.common.hw, 953 + [CLK_MBUS_VE] = &mbus_ve_clk.common.hw, 954 + [CLK_MBUS_CE] = &mbus_ce_clk.common.hw, 955 + [CLK_MBUS_TS] = &mbus_ts_clk.common.hw, 956 + [CLK_MBUS_NAND] = &mbus_nand_clk.common.hw, 957 + [CLK_MBUS_CSI] = &mbus_csi_clk.common.hw, 958 + [CLK_MBUS_DEINTERLACE] = &mbus_deinterlace_clk.common.hw, 959 + [CLK_BUS_DRAM] = &bus_dram_clk.common.hw, 960 + [CLK_NAND0] = &nand0_clk.common.hw, 961 + [CLK_NAND1] = &nand1_clk.common.hw, 962 + [CLK_BUS_NAND] = &bus_nand_clk.common.hw, 963 + [CLK_MMC0] = &mmc0_clk.common.hw, 964 + [CLK_MMC1] = &mmc1_clk.common.hw, 965 + [CLK_MMC2] = &mmc2_clk.common.hw, 966 + [CLK_BUS_MMC0] = &bus_mmc0_clk.common.hw, 967 + [CLK_BUS_MMC1] = &bus_mmc1_clk.common.hw, 968 + [CLK_BUS_MMC2] = &bus_mmc2_clk.common.hw, 969 + [CLK_BUS_UART0] = &bus_uart0_clk.common.hw, 970 + [CLK_BUS_UART1] = &bus_uart1_clk.common.hw, 971 + [CLK_BUS_UART2] = &bus_uart2_clk.common.hw, 972 + [CLK_BUS_UART3] = &bus_uart3_clk.common.hw, 973 + [CLK_BUS_I2C0] = &bus_i2c0_clk.common.hw, 974 + [CLK_BUS_I2C1] = &bus_i2c1_clk.common.hw, 975 + [CLK_BUS_I2C2] = &bus_i2c2_clk.common.hw, 976 + [CLK_BUS_I2C3] = &bus_i2c3_clk.common.hw, 977 + [CLK_BUS_SCR0] = &bus_scr0_clk.common.hw, 978 + [CLK_BUS_SCR1] = &bus_scr1_clk.common.hw, 979 + [CLK_SPI0] = &spi0_clk.common.hw, 980 + [CLK_SPI1] = &spi1_clk.common.hw, 981 + [CLK_BUS_SPI0] = &bus_spi0_clk.common.hw, 982 + [CLK_BUS_SPI1] = &bus_spi1_clk.common.hw, 983 + [CLK_BUS_EMAC] = &bus_emac_clk.common.hw, 984 + [CLK_TS] = &ts_clk.common.hw, 985 + [CLK_BUS_TS] = &bus_ts_clk.common.hw, 986 + [CLK_IR_TX] = &ir_tx_clk.common.hw, 987 + [CLK_BUS_IR_TX] = &bus_ir_tx_clk.common.hw, 988 + [CLK_BUS_THS] = &bus_ths_clk.common.hw, 989 + [CLK_I2S3] = &i2s3_clk.common.hw, 990 + [CLK_I2S0] = &i2s0_clk.common.hw, 991 + [CLK_I2S1] = &i2s1_clk.common.hw, 992 + [CLK_I2S2] = &i2s2_clk.common.hw, 993 + [CLK_BUS_I2S0] = &bus_i2s0_clk.common.hw, 994 + [CLK_BUS_I2S1] = &bus_i2s1_clk.common.hw, 995 + [CLK_BUS_I2S2] = &bus_i2s2_clk.common.hw, 996 + [CLK_BUS_I2S3] = &bus_i2s3_clk.common.hw, 997 + [CLK_SPDIF] = &spdif_clk.common.hw, 998 + [CLK_BUS_SPDIF] = &bus_spdif_clk.common.hw, 999 + [CLK_DMIC] = &dmic_clk.common.hw, 1000 + [CLK_BUS_DMIC] = &bus_dmic_clk.common.hw, 1001 + [CLK_AUDIO_HUB] = &audio_hub_clk.common.hw, 1002 + [CLK_BUS_AUDIO_HUB] = &bus_audio_hub_clk.common.hw, 1003 + [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw, 1004 + [CLK_USB_PHY0] = &usb_phy0_clk.common.hw, 1005 + [CLK_USB_PHY1] = &usb_phy1_clk.common.hw, 1006 + [CLK_USB_OHCI3] = &usb_ohci3_clk.common.hw, 1007 + [CLK_USB_PHY3] = &usb_phy3_clk.common.hw, 1008 + [CLK_USB_HSIC_12M] = &usb_hsic_12m_clk.common.hw, 1009 + [CLK_USB_HSIC] = &usb_hsic_clk.common.hw, 1010 + [CLK_BUS_OHCI0] = &bus_ohci0_clk.common.hw, 1011 + [CLK_BUS_OHCI3] = &bus_ohci3_clk.common.hw, 1012 + [CLK_BUS_EHCI0] = &bus_ehci0_clk.common.hw, 1013 + [CLK_BUS_XHCI] = &bus_xhci_clk.common.hw, 1014 + [CLK_BUS_EHCI3] = &bus_ehci3_clk.common.hw, 1015 + [CLK_BUS_OTG] = &bus_otg_clk.common.hw, 1016 + [CLK_PCIE_REF_100M] = &pcie_ref_100m_clk.hw, 1017 + [CLK_PCIE_REF] = &pcie_ref_clk.common.hw, 1018 + [CLK_PCIE_REF_OUT] = &pcie_ref_out_clk.common.hw, 1019 + [CLK_PCIE_MAXI] = &pcie_maxi_clk.common.hw, 1020 + [CLK_PCIE_AUX] = &pcie_aux_clk.common.hw, 1021 + [CLK_BUS_PCIE] = &bus_pcie_clk.common.hw, 1022 + [CLK_HDMI] = &hdmi_clk.common.hw, 1023 + [CLK_HDMI_SLOW] = &hdmi_slow_clk.common.hw, 1024 + [CLK_HDMI_CEC] = &hdmi_cec_clk.common.hw, 1025 + [CLK_BUS_HDMI] = &bus_hdmi_clk.common.hw, 1026 + [CLK_BUS_TCON_TOP] = &bus_tcon_top_clk.common.hw, 1027 + [CLK_TCON_LCD0] = &tcon_lcd0_clk.common.hw, 1028 + [CLK_BUS_TCON_LCD0] = &bus_tcon_lcd0_clk.common.hw, 1029 + [CLK_TCON_TV0] = &tcon_tv0_clk.common.hw, 1030 + [CLK_BUS_TCON_TV0] = &bus_tcon_tv0_clk.common.hw, 1031 + [CLK_CSI_CCI] = &csi_cci_clk.common.hw, 1032 + [CLK_CSI_TOP] = &csi_top_clk.common.hw, 1033 + [CLK_CSI_MCLK] = &csi_mclk_clk.common.hw, 1034 + [CLK_BUS_CSI] = &bus_csi_clk.common.hw, 1035 + [CLK_HDCP] = &hdcp_clk.common.hw, 1036 + [CLK_BUS_HDCP] = &bus_hdcp_clk.common.hw, 1037 + }, 1038 + .num = CLK_NUMBER, 1039 + }; 1040 + 1041 + static struct ccu_reset_map sun50i_h6_ccu_resets[] = { 1042 + [RST_MBUS] = { 0x540, BIT(30) }, 1043 + 1044 + [RST_BUS_DE] = { 0x60c, BIT(16) }, 1045 + [RST_BUS_DEINTERLACE] = { 0x62c, BIT(16) }, 1046 + [RST_BUS_GPU] = { 0x67c, BIT(16) }, 1047 + [RST_BUS_CE] = { 0x68c, BIT(16) }, 1048 + [RST_BUS_VE] = { 0x69c, BIT(16) }, 1049 + [RST_BUS_EMCE] = { 0x6bc, BIT(16) }, 1050 + [RST_BUS_VP9] = { 0x6cc, BIT(16) }, 1051 + [RST_BUS_DMA] = { 0x70c, BIT(16) }, 1052 + [RST_BUS_MSGBOX] = { 0x71c, BIT(16) }, 1053 + [RST_BUS_SPINLOCK] = { 0x72c, BIT(16) }, 1054 + [RST_BUS_HSTIMER] = { 0x73c, BIT(16) }, 1055 + [RST_BUS_DBG] = { 0x78c, BIT(16) }, 1056 + [RST_BUS_PSI] = { 0x79c, BIT(16) }, 1057 + [RST_BUS_PWM] = { 0x7ac, BIT(16) }, 1058 + [RST_BUS_IOMMU] = { 0x7bc, BIT(16) }, 1059 + [RST_BUS_DRAM] = { 0x80c, BIT(16) }, 1060 + [RST_BUS_NAND] = { 0x82c, BIT(16) }, 1061 + [RST_BUS_MMC0] = { 0x84c, BIT(16) }, 1062 + [RST_BUS_MMC1] = { 0x84c, BIT(17) }, 1063 + [RST_BUS_MMC2] = { 0x84c, BIT(18) }, 1064 + [RST_BUS_UART0] = { 0x90c, BIT(16) }, 1065 + [RST_BUS_UART1] = { 0x90c, BIT(17) }, 1066 + [RST_BUS_UART2] = { 0x90c, BIT(18) }, 1067 + [RST_BUS_UART3] = { 0x90c, BIT(19) }, 1068 + [RST_BUS_I2C0] = { 0x91c, BIT(16) }, 1069 + [RST_BUS_I2C1] = { 0x91c, BIT(17) }, 1070 + [RST_BUS_I2C2] = { 0x91c, BIT(18) }, 1071 + [RST_BUS_I2C3] = { 0x91c, BIT(19) }, 1072 + [RST_BUS_SCR0] = { 0x93c, BIT(16) }, 1073 + [RST_BUS_SCR1] = { 0x93c, BIT(17) }, 1074 + [RST_BUS_SPI0] = { 0x96c, BIT(16) }, 1075 + [RST_BUS_SPI1] = { 0x96c, BIT(17) }, 1076 + [RST_BUS_EMAC] = { 0x97c, BIT(16) }, 1077 + [RST_BUS_TS] = { 0x9bc, BIT(16) }, 1078 + [RST_BUS_IR_TX] = { 0x9cc, BIT(16) }, 1079 + [RST_BUS_THS] = { 0x9fc, BIT(16) }, 1080 + [RST_BUS_I2S0] = { 0xa1c, BIT(16) }, 1081 + [RST_BUS_I2S1] = { 0xa1c, BIT(17) }, 1082 + [RST_BUS_I2S2] = { 0xa1c, BIT(18) }, 1083 + [RST_BUS_I2S3] = { 0xa1c, BIT(19) }, 1084 + [RST_BUS_SPDIF] = { 0xa2c, BIT(16) }, 1085 + [RST_BUS_DMIC] = { 0xa4c, BIT(16) }, 1086 + [RST_BUS_AUDIO_HUB] = { 0xa6c, BIT(16) }, 1087 + 1088 + [RST_USB_PHY0] = { 0xa70, BIT(30) }, 1089 + [RST_USB_PHY1] = { 0xa74, BIT(30) }, 1090 + [RST_USB_PHY3] = { 0xa7c, BIT(30) }, 1091 + [RST_USB_HSIC] = { 0xa7c, BIT(28) }, 1092 + 1093 + [RST_BUS_OHCI0] = { 0xa8c, BIT(16) }, 1094 + [RST_BUS_OHCI3] = { 0xa8c, BIT(19) }, 1095 + [RST_BUS_EHCI0] = { 0xa8c, BIT(20) }, 1096 + [RST_BUS_XHCI] = { 0xa8c, BIT(21) }, 1097 + [RST_BUS_EHCI3] = { 0xa8c, BIT(23) }, 1098 + [RST_BUS_OTG] = { 0xa8c, BIT(24) }, 1099 + [RST_BUS_PCIE] = { 0xabc, BIT(16) }, 1100 + 1101 + [RST_PCIE_POWERUP] = { 0xabc, BIT(17) }, 1102 + 1103 + [RST_BUS_HDMI] = { 0xb1c, BIT(16) }, 1104 + [RST_BUS_HDMI_SUB] = { 0xb1c, BIT(17) }, 1105 + [RST_BUS_TCON_TOP] = { 0xb5c, BIT(16) }, 1106 + [RST_BUS_TCON_LCD0] = { 0xb7c, BIT(16) }, 1107 + [RST_BUS_TCON_TV0] = { 0xb9c, BIT(16) }, 1108 + [RST_BUS_CSI] = { 0xc2c, BIT(16) }, 1109 + [RST_BUS_HDCP] = { 0xc4c, BIT(16) }, 1110 + }; 1111 + 1112 + static const struct sunxi_ccu_desc sun50i_h6_ccu_desc = { 1113 + .ccu_clks = sun50i_h6_ccu_clks, 1114 + .num_ccu_clks = ARRAY_SIZE(sun50i_h6_ccu_clks), 1115 + 1116 + .hw_clks = &sun50i_h6_hw_clks, 1117 + 1118 + .resets = sun50i_h6_ccu_resets, 1119 + .num_resets = ARRAY_SIZE(sun50i_h6_ccu_resets), 1120 + }; 1121 + 1122 + static const u32 pll_regs[] = { 1123 + SUN50I_H6_PLL_CPUX_REG, 1124 + SUN50I_H6_PLL_DDR0_REG, 1125 + SUN50I_H6_PLL_PERIPH0_REG, 1126 + SUN50I_H6_PLL_PERIPH1_REG, 1127 + SUN50I_H6_PLL_GPU_REG, 1128 + SUN50I_H6_PLL_VIDEO0_REG, 1129 + SUN50I_H6_PLL_VIDEO1_REG, 1130 + SUN50I_H6_PLL_VE_REG, 1131 + SUN50I_H6_PLL_DE_REG, 1132 + SUN50I_H6_PLL_HSIC_REG, 1133 + SUN50I_H6_PLL_AUDIO_REG, 1134 + }; 1135 + 1136 + static const u32 pll_video_regs[] = { 1137 + SUN50I_H6_PLL_VIDEO0_REG, 1138 + SUN50I_H6_PLL_VIDEO1_REG, 1139 + }; 1140 + 1141 + static const u32 usb2_clk_regs[] = { 1142 + SUN50I_H6_USB0_CLK_REG, 1143 + SUN50I_H6_USB3_CLK_REG, 1144 + }; 1145 + 1146 + static int sun50i_h6_ccu_probe(struct platform_device *pdev) 1147 + { 1148 + struct resource *res; 1149 + void __iomem *reg; 1150 + u32 val; 1151 + int i; 1152 + 1153 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1154 + reg = devm_ioremap_resource(&pdev->dev, res); 1155 + if (IS_ERR(reg)) 1156 + return PTR_ERR(reg); 1157 + 1158 + /* Enable the lock bits on all PLLs */ 1159 + for (i = 0; i < ARRAY_SIZE(pll_regs); i++) { 1160 + val = readl(reg + pll_regs[i]); 1161 + val |= BIT(29); 1162 + writel(val, reg + pll_regs[i]); 1163 + } 1164 + 1165 + /* 1166 + * Force the output divider of video PLLs to 0. 1167 + * 1168 + * See the comment before pll-video0 definition for the reason. 1169 + */ 1170 + for (i = 0; i < ARRAY_SIZE(pll_video_regs); i++) { 1171 + val = readl(reg + pll_video_regs[i]); 1172 + val &= ~BIT(0); 1173 + writel(val, reg + pll_video_regs[i]); 1174 + } 1175 + 1176 + /* 1177 + * Force OHCI 12M clock sources to 00 (12MHz divided from 48MHz) 1178 + * 1179 + * This clock mux is still mysterious, and the code just enforces 1180 + * it to have a valid clock parent. 1181 + */ 1182 + for (i = 0; i < ARRAY_SIZE(usb2_clk_regs); i++) { 1183 + val = readl(reg + usb2_clk_regs[i]); 1184 + val &= ~GENMASK(25, 24); 1185 + writel (val, reg + usb2_clk_regs[i]); 1186 + } 1187 + 1188 + /* 1189 + * Force the post-divider of pll-audio to 8 and the output divider 1190 + * of it to 1, to make the clock name represents the real frequency. 1191 + */ 1192 + val = readl(reg + SUN50I_H6_PLL_AUDIO_REG); 1193 + val &= ~(GENMASK(21, 16) | BIT(0)); 1194 + writel(val | (7 << 16), reg + SUN50I_H6_PLL_AUDIO_REG); 1195 + 1196 + return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc); 1197 + } 1198 + 1199 + static const struct of_device_id sun50i_h6_ccu_ids[] = { 1200 + { .compatible = "allwinner,sun50i-h6-ccu" }, 1201 + { } 1202 + }; 1203 + 1204 + static struct platform_driver sun50i_h6_ccu_driver = { 1205 + .probe = sun50i_h6_ccu_probe, 1206 + .driver = { 1207 + .name = "sun50i-h6-ccu", 1208 + .of_match_table = sun50i_h6_ccu_ids, 1209 + }, 1210 + }; 1211 + builtin_platform_driver(sun50i_h6_ccu_driver);
+56
drivers/clk/sunxi-ng/ccu-sun50i-h6.h
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright 2016 Icenowy Zheng <icenowy@aosc.io> 4 + */ 5 + 6 + #ifndef _CCU_SUN50I_H6_H_ 7 + #define _CCU_SUN50I_H6_H_ 8 + 9 + #include <dt-bindings/clock/sun50i-h6-ccu.h> 10 + #include <dt-bindings/reset/sun50i-h6-ccu.h> 11 + 12 + #define CLK_OSC12M 0 13 + #define CLK_PLL_CPUX 1 14 + #define CLK_PLL_DDR0 2 15 + 16 + /* PLL_PERIPH0 exported for PRCM */ 17 + 18 + #define CLK_PLL_PERIPH0_2X 4 19 + #define CLK_PLL_PERIPH0_4X 5 20 + #define CLK_PLL_PERIPH1 6 21 + #define CLK_PLL_PERIPH1_2X 7 22 + #define CLK_PLL_PERIPH1_4X 8 23 + #define CLK_PLL_GPU 9 24 + #define CLK_PLL_VIDEO0 10 25 + #define CLK_PLL_VIDEO0_4X 11 26 + #define CLK_PLL_VIDEO1 12 27 + #define CLK_PLL_VIDEO1_4X 13 28 + #define CLK_PLL_VE 14 29 + #define CLK_PLL_DE 15 30 + #define CLK_PLL_HSIC 16 31 + #define CLK_PLL_AUDIO_BASE 17 32 + #define CLK_PLL_AUDIO 18 33 + #define CLK_PLL_AUDIO_2X 19 34 + #define CLK_PLL_AUDIO_4X 20 35 + 36 + /* CPUX clock exported for DVFS */ 37 + 38 + #define CLK_AXI 22 39 + #define CLK_CPUX_APB 23 40 + #define CLK_PSI_AHB1_AHB2 24 41 + #define CLK_AHB3 25 42 + 43 + /* APB1 clock exported for PIO */ 44 + 45 + #define CLK_APB2 27 46 + #define CLK_MBUS 28 47 + 48 + /* All module clocks and bus gates are exported except DRAM */ 49 + 50 + #define CLK_DRAM 52 51 + 52 + #define CLK_BUS_DRAM 60 53 + 54 + #define CLK_NUMBER (CLK_BUS_HDCP + 1) 55 + 56 + #endif /* _CCU_SUN50I_H6_H_ */
+18 -14
drivers/clk/sunxi-ng/ccu-sun8i-h3.c
··· 69 69 BIT(28), /* lock */ 70 70 CLK_SET_RATE_UNGATE); 71 71 72 - static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_video_clk, "pll-video", 73 - "osc24M", 0x0010, 74 - 8, 7, /* N */ 75 - 0, 4, /* M */ 76 - BIT(24), /* frac enable */ 77 - BIT(25), /* frac select */ 78 - 270000000, /* frac rate 0 */ 79 - 297000000, /* frac rate 1 */ 80 - BIT(31), /* gate */ 81 - BIT(28), /* lock */ 82 - CLK_SET_RATE_UNGATE); 72 + static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(pll_video_clk, "pll-video", 73 + "osc24M", 0x0010, 74 + 192000000, /* Minimum rate */ 75 + 8, 7, /* N */ 76 + 0, 4, /* M */ 77 + BIT(24), /* frac enable */ 78 + BIT(25), /* frac select */ 79 + 270000000, /* frac rate 0 */ 80 + 297000000, /* frac rate 1 */ 81 + BIT(31), /* gate */ 82 + BIT(28), /* lock */ 83 + CLK_SET_RATE_UNGATE); 83 84 84 85 static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", 85 86 "osc24M", 0x0018, ··· 452 451 453 452 static const char * const de_parents[] = { "pll-periph0-2x", "pll-de" }; 454 453 static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de", de_parents, 455 - 0x104, 0, 4, 24, 3, BIT(31), 0); 454 + 0x104, 0, 4, 24, 3, BIT(31), 455 + CLK_SET_RATE_PARENT); 456 456 457 457 static const char * const tcon_parents[] = { "pll-video" }; 458 458 static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents, 459 - 0x118, 0, 4, 24, 3, BIT(31), 0); 459 + 0x118, 0, 4, 24, 3, BIT(31), 460 + CLK_SET_RATE_PARENT); 460 461 461 462 static const char * const tve_parents[] = { "pll-de", "pll-periph1" }; 462 463 static SUNXI_CCU_M_WITH_MUX_GATE(tve_clk, "tve", tve_parents, ··· 489 486 490 487 static const char * const hdmi_parents[] = { "pll-video" }; 491 488 static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", hdmi_parents, 492 - 0x150, 0, 4, 24, 2, BIT(31), 0); 489 + 0x150, 0, 4, 24, 2, BIT(31), 490 + CLK_SET_RATE_PARENT); 493 491 494 492 static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 495 493 0x154, BIT(31), 0);
+3 -1
drivers/clk/sunxi-ng/ccu-sun8i-h3.h
··· 26 26 #define CLK_PLL_AUDIO_2X 3 27 27 #define CLK_PLL_AUDIO_4X 4 28 28 #define CLK_PLL_AUDIO_8X 5 29 - #define CLK_PLL_VIDEO 6 29 + 30 + /* PLL_VIDEO is exported */ 31 + 30 32 #define CLK_PLL_VE 7 31 33 #define CLK_PLL_DDR 8 32 34
+44 -12
drivers/clk/sunxi-ng/ccu_nkmp.c
··· 20 20 unsigned long p, min_p, max_p; 21 21 }; 22 22 23 + static unsigned long ccu_nkmp_calc_rate(unsigned long parent, 24 + unsigned long n, unsigned long k, 25 + unsigned long m, unsigned long p) 26 + { 27 + u64 rate = parent; 28 + 29 + rate *= n * k; 30 + do_div(rate, m * p); 31 + 32 + return rate; 33 + } 34 + 23 35 static void ccu_nkmp_find_best(unsigned long parent, unsigned long rate, 24 36 struct _ccu_nkmp *nkmp) 25 37 { ··· 45 33 for (_p = nkmp->min_p; _p <= nkmp->max_p; _p <<= 1) { 46 34 unsigned long tmp_rate; 47 35 48 - tmp_rate = parent * _n * _k / (_m * _p); 36 + tmp_rate = ccu_nkmp_calc_rate(parent, 37 + _n, _k, 38 + _m, _p); 49 39 50 40 if (tmp_rate > rate) 51 41 continue; ··· 95 81 unsigned long parent_rate) 96 82 { 97 83 struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); 98 - unsigned long n, m, k, p; 84 + unsigned long n, m, k, p, rate; 99 85 u32 reg; 100 86 101 87 reg = readl(nkmp->common.base + nkmp->common.reg); ··· 121 107 p = reg >> nkmp->p.shift; 122 108 p &= (1 << nkmp->p.width) - 1; 123 109 124 - return (parent_rate * n * k >> p) / m; 110 + rate = ccu_nkmp_calc_rate(parent_rate, n, k, m, 1 << p); 111 + if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV) 112 + rate /= nkmp->fixed_post_div; 113 + 114 + return rate; 125 115 } 126 116 127 117 static long ccu_nkmp_round_rate(struct clk_hw *hw, unsigned long rate, ··· 133 115 { 134 116 struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); 135 117 struct _ccu_nkmp _nkmp; 118 + 119 + if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV) 120 + rate *= nkmp->fixed_post_div; 136 121 137 122 _nkmp.min_n = nkmp->n.min ?: 1; 138 123 _nkmp.max_n = nkmp->n.max ?: 1 << nkmp->n.width; ··· 148 127 149 128 ccu_nkmp_find_best(*parent_rate, rate, &_nkmp); 150 129 151 - return *parent_rate * _nkmp.n * _nkmp.k / (_nkmp.m * _nkmp.p); 130 + rate = ccu_nkmp_calc_rate(*parent_rate, _nkmp.n, _nkmp.k, 131 + _nkmp.m, _nkmp.p); 132 + if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV) 133 + rate = rate / nkmp->fixed_post_div; 134 + 135 + return rate; 152 136 } 153 137 154 138 static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate, 155 139 unsigned long parent_rate) 156 140 { 157 141 struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); 142 + u32 n_mask, k_mask, m_mask, p_mask; 158 143 struct _ccu_nkmp _nkmp; 159 144 unsigned long flags; 160 145 u32 reg; 146 + 147 + if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV) 148 + rate = rate * nkmp->fixed_post_div; 161 149 162 150 _nkmp.min_n = nkmp->n.min ?: 1; 163 151 _nkmp.max_n = nkmp->n.max ?: 1 << nkmp->n.width; ··· 179 149 180 150 ccu_nkmp_find_best(parent_rate, rate, &_nkmp); 181 151 152 + n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, nkmp->n.shift); 153 + k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, nkmp->k.shift); 154 + m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift); 155 + p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift); 156 + 182 157 spin_lock_irqsave(nkmp->common.lock, flags); 183 158 184 159 reg = readl(nkmp->common.base + nkmp->common.reg); 185 - reg &= ~GENMASK(nkmp->n.width + nkmp->n.shift - 1, nkmp->n.shift); 186 - reg &= ~GENMASK(nkmp->k.width + nkmp->k.shift - 1, nkmp->k.shift); 187 - reg &= ~GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift); 188 - reg &= ~GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift); 160 + reg &= ~(n_mask | k_mask | m_mask | p_mask); 189 161 190 - reg |= (_nkmp.n - nkmp->n.offset) << nkmp->n.shift; 191 - reg |= (_nkmp.k - nkmp->k.offset) << nkmp->k.shift; 192 - reg |= (_nkmp.m - nkmp->m.offset) << nkmp->m.shift; 193 - reg |= ilog2(_nkmp.p) << nkmp->p.shift; 162 + reg |= ((_nkmp.n - nkmp->n.offset) << nkmp->n.shift) & n_mask; 163 + reg |= ((_nkmp.k - nkmp->k.offset) << nkmp->k.shift) & k_mask; 164 + reg |= ((_nkmp.m - nkmp->m.offset) << nkmp->m.shift) & m_mask; 165 + reg |= (ilog2(_nkmp.p) << nkmp->p.shift) & p_mask; 194 166 195 167 writel(reg, nkmp->common.base + nkmp->common.reg); 196 168
+2
drivers/clk/sunxi-ng/ccu_nkmp.h
··· 34 34 struct ccu_div_internal m; 35 35 struct ccu_div_internal p; 36 36 37 + unsigned int fixed_post_div; 38 + 37 39 struct ccu_common common; 38 40 }; 39 41
+7
drivers/clk/sunxi-ng/ccu_nm.c
··· 117 117 if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) 118 118 rate *= nm->fixed_post_div; 119 119 120 + if (rate < nm->min_rate) { 121 + rate = nm->min_rate; 122 + if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) 123 + rate /= nm->fixed_post_div; 124 + return rate; 125 + } 126 + 120 127 if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate)) { 121 128 if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) 122 129 rate /= nm->fixed_post_div;
+27
drivers/clk/sunxi-ng/ccu_nm.h
··· 37 37 struct ccu_sdm_internal sdm; 38 38 39 39 unsigned int fixed_post_div; 40 + unsigned int min_rate; 40 41 41 42 struct ccu_common common; 42 43 }; ··· 79 78 .frac = _SUNXI_CCU_FRAC(_frac_en, _frac_sel, \ 80 79 _frac_rate_0, \ 81 80 _frac_rate_1), \ 81 + .common = { \ 82 + .reg = _reg, \ 83 + .features = CCU_FEATURE_FRACTIONAL, \ 84 + .hw.init = CLK_HW_INIT(_name, \ 85 + _parent, \ 86 + &ccu_nm_ops, \ 87 + _flags), \ 88 + }, \ 89 + } 90 + 91 + #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(_struct, _name, _parent, \ 92 + _reg, _min_rate, \ 93 + _nshift, _nwidth, \ 94 + _mshift, _mwidth, \ 95 + _frac_en, _frac_sel, \ 96 + _frac_rate_0, _frac_rate_1,\ 97 + _gate, _lock, _flags) \ 98 + struct ccu_nm _struct = { \ 99 + .enable = _gate, \ 100 + .lock = _lock, \ 101 + .n = _SUNXI_CCU_MULT(_nshift, _nwidth), \ 102 + .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \ 103 + .frac = _SUNXI_CCU_FRAC(_frac_en, _frac_sel, \ 104 + _frac_rate_0, \ 105 + _frac_rate_1), \ 106 + .min_rate = _min_rate, \ 82 107 .common = { \ 83 108 .reg = _reg, \ 84 109 .features = CCU_FEATURE_FRACTIONAL, \
-2
drivers/clk/ux500/Makefile
··· 10 10 11 11 # Clock definitions 12 12 obj-y += u8500_of_clk.o 13 - obj-y += u9540_clk.o 14 - obj-y += u8540_clk.o 15 13 16 14 # ABX500 clock driver 17 15 obj-y += abx500-clk.o
-16
drivers/clk/ux500/abx500-clk.c
··· 88 88 return 0; 89 89 } 90 90 91 - /* Clock definitions for ab8540 */ 92 - static int ab8540_reg_clks(struct device *dev) 93 - { 94 - return 0; 95 - } 96 - 97 - /* Clock definitions for ab9540 */ 98 - static int ab9540_reg_clks(struct device *dev) 99 - { 100 - return 0; 101 - } 102 - 103 91 static int abx500_clk_probe(struct platform_device *pdev) 104 92 { 105 93 struct ab8500 *parent = dev_get_drvdata(pdev->dev.parent); ··· 95 107 96 108 if (is_ab8500(parent) || is_ab8505(parent)) { 97 109 ret = ab8500_reg_clks(&pdev->dev); 98 - } else if (is_ab8540(parent)) { 99 - ret = ab8540_reg_clks(&pdev->dev); 100 - } else if (is_ab9540(parent)) { 101 - ret = ab9540_reg_clks(&pdev->dev); 102 110 } else { 103 111 dev_err(&pdev->dev, "non supported plf id\n"); 104 112 return -ENODEV;
-597
drivers/clk/ux500/u8540_clk.c
··· 1 - /* 2 - * Clock definitions for u8540 platform. 3 - * 4 - * Copyright (C) 2012 ST-Ericsson SA 5 - * Author: Ulf Hansson <ulf.hansson@linaro.org> 6 - * 7 - * License terms: GNU General Public License (GPL) version 2 8 - */ 9 - 10 - #include <linux/of.h> 11 - #include <linux/of_address.h> 12 - #include <linux/clkdev.h> 13 - #include <linux/clk-provider.h> 14 - #include <linux/mfd/dbx500-prcmu.h> 15 - #include "clk.h" 16 - 17 - /* CLKRST4 is missing making it hard to index things */ 18 - enum clkrst_index { 19 - CLKRST1_INDEX = 0, 20 - CLKRST2_INDEX, 21 - CLKRST3_INDEX, 22 - CLKRST5_INDEX, 23 - CLKRST6_INDEX, 24 - CLKRST_MAX, 25 - }; 26 - 27 - static void u8540_clk_init(struct device_node *np) 28 - { 29 - struct clk *clk; 30 - u32 bases[CLKRST_MAX]; 31 - int i; 32 - 33 - for (i = 0; i < ARRAY_SIZE(bases); i++) { 34 - struct resource r; 35 - 36 - if (of_address_to_resource(np, i, &r)) 37 - /* Not much choice but to continue */ 38 - pr_err("failed to get CLKRST %d base address\n", 39 - i + 1); 40 - bases[i] = r.start; 41 - } 42 - 43 - /* Clock sources. */ 44 - /* Fixed ClockGen */ 45 - clk = clk_reg_prcmu_gate("soc0_pll", NULL, PRCMU_PLLSOC0, 46 - CLK_IGNORE_UNUSED); 47 - clk_register_clkdev(clk, "soc0_pll", NULL); 48 - 49 - clk = clk_reg_prcmu_gate("soc1_pll", NULL, PRCMU_PLLSOC1, 50 - CLK_IGNORE_UNUSED); 51 - clk_register_clkdev(clk, "soc1_pll", NULL); 52 - 53 - clk = clk_reg_prcmu_gate("ddr_pll", NULL, PRCMU_PLLDDR, 54 - CLK_IGNORE_UNUSED); 55 - clk_register_clkdev(clk, "ddr_pll", NULL); 56 - 57 - clk = clk_register_fixed_rate(NULL, "rtc32k", NULL, 58 - CLK_IGNORE_UNUSED, 59 - 32768); 60 - clk_register_clkdev(clk, "clk32k", NULL); 61 - clk_register_clkdev(clk, "apb_pclk", "rtc-pl031"); 62 - 63 - clk = clk_register_fixed_rate(NULL, "ulp38m4", NULL, 64 - CLK_IGNORE_UNUSED, 65 - 38400000); 66 - 67 - clk = clk_reg_prcmu_gate("uartclk", NULL, PRCMU_UARTCLK, 0); 68 - clk_register_clkdev(clk, NULL, "UART"); 69 - 70 - /* msp02clk needs a abx500 clk as parent. Handle by abx500 clk driver */ 71 - clk = clk_reg_prcmu_gate("msp02clk", "ab9540_sysclk12_b1", 72 - PRCMU_MSP02CLK, 0); 73 - clk_register_clkdev(clk, NULL, "MSP02"); 74 - 75 - clk = clk_reg_prcmu_gate("msp1clk", NULL, PRCMU_MSP1CLK, 0); 76 - clk_register_clkdev(clk, NULL, "MSP1"); 77 - 78 - clk = clk_reg_prcmu_gate("i2cclk", NULL, PRCMU_I2CCLK, 0); 79 - clk_register_clkdev(clk, NULL, "I2C"); 80 - 81 - clk = clk_reg_prcmu_gate("slimclk", NULL, PRCMU_SLIMCLK, 0); 82 - clk_register_clkdev(clk, NULL, "slim"); 83 - 84 - clk = clk_reg_prcmu_gate("per1clk", NULL, PRCMU_PER1CLK, 0); 85 - clk_register_clkdev(clk, NULL, "PERIPH1"); 86 - 87 - clk = clk_reg_prcmu_gate("per2clk", NULL, PRCMU_PER2CLK, 0); 88 - clk_register_clkdev(clk, NULL, "PERIPH2"); 89 - 90 - clk = clk_reg_prcmu_gate("per3clk", NULL, PRCMU_PER3CLK, 0); 91 - clk_register_clkdev(clk, NULL, "PERIPH3"); 92 - 93 - clk = clk_reg_prcmu_gate("per5clk", NULL, PRCMU_PER5CLK, 0); 94 - clk_register_clkdev(clk, NULL, "PERIPH5"); 95 - 96 - clk = clk_reg_prcmu_gate("per6clk", NULL, PRCMU_PER6CLK, 0); 97 - clk_register_clkdev(clk, NULL, "PERIPH6"); 98 - 99 - clk = clk_reg_prcmu_gate("per7clk", NULL, PRCMU_PER7CLK, 0); 100 - clk_register_clkdev(clk, NULL, "PERIPH7"); 101 - 102 - clk = clk_reg_prcmu_scalable("lcdclk", NULL, PRCMU_LCDCLK, 0, 103 - CLK_SET_RATE_GATE); 104 - clk_register_clkdev(clk, NULL, "lcd"); 105 - clk_register_clkdev(clk, "lcd", "mcde"); 106 - 107 - clk = clk_reg_prcmu_opp_gate("bmlclk", NULL, PRCMU_BMLCLK, 0); 108 - clk_register_clkdev(clk, NULL, "bml"); 109 - 110 - clk = clk_reg_prcmu_scalable("hsitxclk", NULL, PRCMU_HSITXCLK, 0, 111 - CLK_SET_RATE_GATE); 112 - 113 - clk = clk_reg_prcmu_scalable("hsirxclk", NULL, PRCMU_HSIRXCLK, 0, 114 - CLK_SET_RATE_GATE); 115 - 116 - clk = clk_reg_prcmu_scalable("hdmiclk", NULL, PRCMU_HDMICLK, 0, 117 - CLK_SET_RATE_GATE); 118 - clk_register_clkdev(clk, NULL, "hdmi"); 119 - clk_register_clkdev(clk, "hdmi", "mcde"); 120 - 121 - clk = clk_reg_prcmu_gate("apeatclk", NULL, PRCMU_APEATCLK, 0); 122 - clk_register_clkdev(clk, NULL, "apeat"); 123 - 124 - clk = clk_reg_prcmu_gate("apetraceclk", NULL, PRCMU_APETRACECLK, 0); 125 - clk_register_clkdev(clk, NULL, "apetrace"); 126 - 127 - clk = clk_reg_prcmu_gate("mcdeclk", NULL, PRCMU_MCDECLK, 0); 128 - clk_register_clkdev(clk, NULL, "mcde"); 129 - clk_register_clkdev(clk, "mcde", "mcde"); 130 - clk_register_clkdev(clk, NULL, "dsilink.0"); 131 - clk_register_clkdev(clk, NULL, "dsilink.1"); 132 - clk_register_clkdev(clk, NULL, "dsilink.2"); 133 - 134 - clk = clk_reg_prcmu_opp_gate("ipi2cclk", NULL, PRCMU_IPI2CCLK, 0); 135 - clk_register_clkdev(clk, NULL, "ipi2"); 136 - 137 - clk = clk_reg_prcmu_gate("dsialtclk", NULL, PRCMU_DSIALTCLK, 0); 138 - clk_register_clkdev(clk, NULL, "dsialt"); 139 - 140 - clk = clk_reg_prcmu_gate("dmaclk", NULL, PRCMU_DMACLK, 0); 141 - clk_register_clkdev(clk, NULL, "dma40.0"); 142 - 143 - clk = clk_reg_prcmu_gate("b2r2clk", NULL, PRCMU_B2R2CLK, 0); 144 - clk_register_clkdev(clk, NULL, "b2r2"); 145 - clk_register_clkdev(clk, NULL, "b2r2_core"); 146 - clk_register_clkdev(clk, NULL, "U8500-B2R2.0"); 147 - clk_register_clkdev(clk, NULL, "b2r2_1_core"); 148 - 149 - clk = clk_reg_prcmu_scalable("tvclk", NULL, PRCMU_TVCLK, 0, 150 - CLK_SET_RATE_GATE); 151 - clk_register_clkdev(clk, NULL, "tv"); 152 - clk_register_clkdev(clk, "tv", "mcde"); 153 - 154 - clk = clk_reg_prcmu_gate("sspclk", NULL, PRCMU_SSPCLK, 0); 155 - clk_register_clkdev(clk, NULL, "SSP"); 156 - 157 - clk = clk_reg_prcmu_gate("rngclk", NULL, PRCMU_RNGCLK, 0); 158 - clk_register_clkdev(clk, NULL, "rngclk"); 159 - 160 - clk = clk_reg_prcmu_gate("uiccclk", NULL, PRCMU_UICCCLK, 0); 161 - clk_register_clkdev(clk, NULL, "uicc"); 162 - 163 - clk = clk_reg_prcmu_gate("timclk", NULL, PRCMU_TIMCLK, 0); 164 - clk_register_clkdev(clk, NULL, "mtu0"); 165 - clk_register_clkdev(clk, NULL, "mtu1"); 166 - 167 - clk = clk_reg_prcmu_opp_volt_scalable("sdmmcclk", NULL, 168 - PRCMU_SDMMCCLK, 100000000, 169 - CLK_SET_RATE_GATE); 170 - clk_register_clkdev(clk, NULL, "sdmmc"); 171 - 172 - clk = clk_reg_prcmu_opp_volt_scalable("sdmmchclk", NULL, 173 - PRCMU_SDMMCHCLK, 400000000, 174 - CLK_SET_RATE_GATE); 175 - clk_register_clkdev(clk, NULL, "sdmmchclk"); 176 - 177 - clk = clk_reg_prcmu_gate("hvaclk", NULL, PRCMU_HVACLK, 0); 178 - clk_register_clkdev(clk, NULL, "hva"); 179 - 180 - clk = clk_reg_prcmu_gate("g1clk", NULL, PRCMU_G1CLK, 0); 181 - clk_register_clkdev(clk, NULL, "g1"); 182 - 183 - clk = clk_reg_prcmu_scalable("spare1clk", NULL, PRCMU_SPARE1CLK, 0, 184 - CLK_SET_RATE_GATE); 185 - clk_register_clkdev(clk, "dsilcd", "mcde"); 186 - 187 - clk = clk_reg_prcmu_scalable("dsi_pll", "hdmiclk", 188 - PRCMU_PLLDSI, 0, CLK_SET_RATE_GATE); 189 - clk_register_clkdev(clk, "dsihs2", "mcde"); 190 - clk_register_clkdev(clk, "hs_clk", "dsilink.2"); 191 - 192 - clk = clk_reg_prcmu_scalable("dsilcd_pll", "spare1clk", 193 - PRCMU_PLLDSI_LCD, 0, CLK_SET_RATE_GATE); 194 - clk_register_clkdev(clk, "dsilcd_pll", "mcde"); 195 - 196 - clk = clk_reg_prcmu_scalable("dsi0clk", "dsi_pll", 197 - PRCMU_DSI0CLK, 0, CLK_SET_RATE_GATE); 198 - clk_register_clkdev(clk, "dsihs0", "mcde"); 199 - 200 - clk = clk_reg_prcmu_scalable("dsi0lcdclk", "dsilcd_pll", 201 - PRCMU_DSI0CLK_LCD, 0, CLK_SET_RATE_GATE); 202 - clk_register_clkdev(clk, "dsihs0", "mcde"); 203 - clk_register_clkdev(clk, "hs_clk", "dsilink.0"); 204 - 205 - clk = clk_reg_prcmu_scalable("dsi1clk", "dsi_pll", 206 - PRCMU_DSI1CLK, 0, CLK_SET_RATE_GATE); 207 - clk_register_clkdev(clk, "dsihs1", "mcde"); 208 - 209 - clk = clk_reg_prcmu_scalable("dsi1lcdclk", "dsilcd_pll", 210 - PRCMU_DSI1CLK_LCD, 0, CLK_SET_RATE_GATE); 211 - clk_register_clkdev(clk, "dsihs1", "mcde"); 212 - clk_register_clkdev(clk, "hs_clk", "dsilink.1"); 213 - 214 - clk = clk_reg_prcmu_scalable("dsi0escclk", "tvclk", 215 - PRCMU_DSI0ESCCLK, 0, CLK_SET_RATE_GATE); 216 - clk_register_clkdev(clk, "lp_clk", "dsilink.0"); 217 - clk_register_clkdev(clk, "dsilp0", "mcde"); 218 - 219 - clk = clk_reg_prcmu_scalable("dsi1escclk", "tvclk", 220 - PRCMU_DSI1ESCCLK, 0, CLK_SET_RATE_GATE); 221 - clk_register_clkdev(clk, "lp_clk", "dsilink.1"); 222 - clk_register_clkdev(clk, "dsilp1", "mcde"); 223 - 224 - clk = clk_reg_prcmu_scalable("dsi2escclk", "tvclk", 225 - PRCMU_DSI2ESCCLK, 0, CLK_SET_RATE_GATE); 226 - clk_register_clkdev(clk, "lp_clk", "dsilink.2"); 227 - clk_register_clkdev(clk, "dsilp2", "mcde"); 228 - 229 - clk = clk_reg_prcmu_scalable_rate("armss", NULL, 230 - PRCMU_ARMSS, 0, CLK_IGNORE_UNUSED); 231 - clk_register_clkdev(clk, "armss", NULL); 232 - 233 - clk = clk_register_fixed_factor(NULL, "smp_twd", "armss", 234 - CLK_IGNORE_UNUSED, 1, 2); 235 - clk_register_clkdev(clk, NULL, "smp_twd"); 236 - 237 - /* PRCC P-clocks */ 238 - /* Peripheral 1 : PRCC P-clocks */ 239 - clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", bases[CLKRST1_INDEX], 240 - BIT(0), 0); 241 - clk_register_clkdev(clk, "apb_pclk", "uart0"); 242 - 243 - clk = clk_reg_prcc_pclk("p1_pclk1", "per1clk", bases[CLKRST1_INDEX], 244 - BIT(1), 0); 245 - clk_register_clkdev(clk, "apb_pclk", "uart1"); 246 - 247 - clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", bases[CLKRST1_INDEX], 248 - BIT(2), 0); 249 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.1"); 250 - 251 - clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", bases[CLKRST1_INDEX], 252 - BIT(3), 0); 253 - clk_register_clkdev(clk, "apb_pclk", "msp0"); 254 - clk_register_clkdev(clk, "apb_pclk", "dbx5x0-msp-i2s.0"); 255 - 256 - clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", bases[CLKRST1_INDEX], 257 - BIT(4), 0); 258 - clk_register_clkdev(clk, "apb_pclk", "msp1"); 259 - clk_register_clkdev(clk, "apb_pclk", "dbx5x0-msp-i2s.1"); 260 - 261 - clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", bases[CLKRST1_INDEX], 262 - BIT(5), 0); 263 - clk_register_clkdev(clk, "apb_pclk", "sdi0"); 264 - 265 - clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", bases[CLKRST1_INDEX], 266 - BIT(6), 0); 267 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.2"); 268 - 269 - clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", bases[CLKRST1_INDEX], 270 - BIT(7), 0); 271 - clk_register_clkdev(clk, NULL, "spi3"); 272 - 273 - clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", bases[CLKRST1_INDEX], 274 - BIT(8), 0); 275 - clk_register_clkdev(clk, "apb_pclk", "slimbus0"); 276 - 277 - clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", bases[CLKRST1_INDEX], 278 - BIT(9), 0); 279 - clk_register_clkdev(clk, NULL, "gpio.0"); 280 - clk_register_clkdev(clk, NULL, "gpio.1"); 281 - clk_register_clkdev(clk, NULL, "gpioblock0"); 282 - clk_register_clkdev(clk, "apb_pclk", "ab85xx-codec.0"); 283 - 284 - clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", bases[CLKRST1_INDEX], 285 - BIT(10), 0); 286 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.4"); 287 - 288 - clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", bases[CLKRST1_INDEX], 289 - BIT(11), 0); 290 - clk_register_clkdev(clk, "apb_pclk", "msp3"); 291 - clk_register_clkdev(clk, "apb_pclk", "dbx5x0-msp-i2s.3"); 292 - 293 - /* Peripheral 2 : PRCC P-clocks */ 294 - clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", bases[CLKRST2_INDEX], 295 - BIT(0), 0); 296 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.3"); 297 - 298 - clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", bases[CLKRST2_INDEX], 299 - BIT(1), 0); 300 - clk_register_clkdev(clk, NULL, "spi2"); 301 - 302 - clk = clk_reg_prcc_pclk("p2_pclk2", "per2clk", bases[CLKRST2_INDEX], 303 - BIT(2), 0); 304 - clk_register_clkdev(clk, NULL, "spi1"); 305 - 306 - clk = clk_reg_prcc_pclk("p2_pclk3", "per2clk", bases[CLKRST2_INDEX], 307 - BIT(3), 0); 308 - clk_register_clkdev(clk, NULL, "pwl"); 309 - 310 - clk = clk_reg_prcc_pclk("p2_pclk4", "per2clk", bases[CLKRST2_INDEX], 311 - BIT(4), 0); 312 - clk_register_clkdev(clk, "apb_pclk", "sdi4"); 313 - 314 - clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", bases[CLKRST2_INDEX], 315 - BIT(5), 0); 316 - clk_register_clkdev(clk, "apb_pclk", "msp2"); 317 - clk_register_clkdev(clk, "apb_pclk", "dbx5x0-msp-i2s.2"); 318 - 319 - clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", bases[CLKRST2_INDEX], 320 - BIT(6), 0); 321 - clk_register_clkdev(clk, "apb_pclk", "sdi1"); 322 - 323 - clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", bases[CLKRST2_INDEX], 324 - BIT(7), 0); 325 - clk_register_clkdev(clk, "apb_pclk", "sdi3"); 326 - 327 - clk = clk_reg_prcc_pclk("p2_pclk8", "per2clk", bases[CLKRST2_INDEX], 328 - BIT(8), 0); 329 - clk_register_clkdev(clk, NULL, "spi0"); 330 - 331 - clk = clk_reg_prcc_pclk("p2_pclk9", "per2clk", bases[CLKRST2_INDEX], 332 - BIT(9), 0); 333 - clk_register_clkdev(clk, "hsir_hclk", "ste_hsi.0"); 334 - 335 - clk = clk_reg_prcc_pclk("p2_pclk10", "per2clk", bases[CLKRST2_INDEX], 336 - BIT(10), 0); 337 - clk_register_clkdev(clk, "hsit_hclk", "ste_hsi.0"); 338 - 339 - clk = clk_reg_prcc_pclk("p2_pclk11", "per2clk", bases[CLKRST2_INDEX], 340 - BIT(11), 0); 341 - clk_register_clkdev(clk, NULL, "gpio.6"); 342 - clk_register_clkdev(clk, NULL, "gpio.7"); 343 - clk_register_clkdev(clk, NULL, "gpioblock1"); 344 - 345 - clk = clk_reg_prcc_pclk("p2_pclk12", "per2clk", bases[CLKRST2_INDEX], 346 - BIT(12), 0); 347 - clk_register_clkdev(clk, "msp4-pclk", "ab85xx-codec.0"); 348 - 349 - /* Peripheral 3 : PRCC P-clocks */ 350 - clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", bases[CLKRST3_INDEX], 351 - BIT(0), 0); 352 - clk_register_clkdev(clk, NULL, "fsmc"); 353 - 354 - clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", bases[CLKRST3_INDEX], 355 - BIT(1), 0); 356 - clk_register_clkdev(clk, "apb_pclk", "ssp0"); 357 - 358 - clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", bases[CLKRST3_INDEX], 359 - BIT(2), 0); 360 - clk_register_clkdev(clk, "apb_pclk", "ssp1"); 361 - 362 - clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", bases[CLKRST3_INDEX], 363 - BIT(3), 0); 364 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.0"); 365 - 366 - clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", bases[CLKRST3_INDEX], 367 - BIT(4), 0); 368 - clk_register_clkdev(clk, "apb_pclk", "sdi2"); 369 - 370 - clk = clk_reg_prcc_pclk("p3_pclk5", "per3clk", bases[CLKRST3_INDEX], 371 - BIT(5), 0); 372 - clk_register_clkdev(clk, "apb_pclk", "ske"); 373 - clk_register_clkdev(clk, "apb_pclk", "nmk-ske-keypad"); 374 - 375 - clk = clk_reg_prcc_pclk("p3_pclk6", "per3clk", bases[CLKRST3_INDEX], 376 - BIT(6), 0); 377 - clk_register_clkdev(clk, "apb_pclk", "uart2"); 378 - 379 - clk = clk_reg_prcc_pclk("p3_pclk7", "per3clk", bases[CLKRST3_INDEX], 380 - BIT(7), 0); 381 - clk_register_clkdev(clk, "apb_pclk", "sdi5"); 382 - 383 - clk = clk_reg_prcc_pclk("p3_pclk8", "per3clk", bases[CLKRST3_INDEX], 384 - BIT(8), 0); 385 - clk_register_clkdev(clk, NULL, "gpio.2"); 386 - clk_register_clkdev(clk, NULL, "gpio.3"); 387 - clk_register_clkdev(clk, NULL, "gpio.4"); 388 - clk_register_clkdev(clk, NULL, "gpio.5"); 389 - clk_register_clkdev(clk, NULL, "gpioblock2"); 390 - 391 - clk = clk_reg_prcc_pclk("p3_pclk9", "per3clk", bases[CLKRST3_INDEX], 392 - BIT(9), 0); 393 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.5"); 394 - 395 - clk = clk_reg_prcc_pclk("p3_pclk10", "per3clk", bases[CLKRST3_INDEX], 396 - BIT(10), 0); 397 - clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.6"); 398 - 399 - clk = clk_reg_prcc_pclk("p3_pclk11", "per3clk", bases[CLKRST3_INDEX], 400 - BIT(11), 0); 401 - clk_register_clkdev(clk, "apb_pclk", "uart3"); 402 - 403 - clk = clk_reg_prcc_pclk("p3_pclk12", "per3clk", bases[CLKRST3_INDEX], 404 - BIT(12), 0); 405 - clk_register_clkdev(clk, "apb_pclk", "uart4"); 406 - 407 - /* Peripheral 5 : PRCC P-clocks */ 408 - clk = clk_reg_prcc_pclk("p5_pclk0", "per5clk", bases[CLKRST5_INDEX], 409 - BIT(0), 0); 410 - clk_register_clkdev(clk, "usb", "musb-ux500.0"); 411 - clk_register_clkdev(clk, "usbclk", "ab-iddet.0"); 412 - 413 - clk = clk_reg_prcc_pclk("p5_pclk1", "per5clk", bases[CLKRST5_INDEX], 414 - BIT(1), 0); 415 - clk_register_clkdev(clk, NULL, "gpio.8"); 416 - clk_register_clkdev(clk, NULL, "gpioblock3"); 417 - 418 - /* Peripheral 6 : PRCC P-clocks */ 419 - clk = clk_reg_prcc_pclk("p6_pclk0", "per6clk", bases[CLKRST6_INDEX], 420 - BIT(0), 0); 421 - clk_register_clkdev(clk, "apb_pclk", "rng"); 422 - 423 - clk = clk_reg_prcc_pclk("p6_pclk1", "per6clk", bases[CLKRST6_INDEX], 424 - BIT(1), 0); 425 - clk_register_clkdev(clk, NULL, "cryp0"); 426 - clk_register_clkdev(clk, NULL, "cryp1"); 427 - 428 - clk = clk_reg_prcc_pclk("p6_pclk2", "per6clk", bases[CLKRST6_INDEX], 429 - BIT(2), 0); 430 - clk_register_clkdev(clk, NULL, "hash0"); 431 - 432 - clk = clk_reg_prcc_pclk("p6_pclk3", "per6clk", bases[CLKRST6_INDEX], 433 - BIT(3), 0); 434 - clk_register_clkdev(clk, NULL, "pka"); 435 - 436 - clk = clk_reg_prcc_pclk("p6_pclk4", "per6clk", bases[CLKRST6_INDEX], 437 - BIT(4), 0); 438 - clk_register_clkdev(clk, NULL, "db8540-hash1"); 439 - 440 - clk = clk_reg_prcc_pclk("p6_pclk5", "per6clk", bases[CLKRST6_INDEX], 441 - BIT(5), 0); 442 - clk_register_clkdev(clk, NULL, "cfgreg"); 443 - 444 - clk = clk_reg_prcc_pclk("p6_pclk6", "per6clk", bases[CLKRST6_INDEX], 445 - BIT(6), 0); 446 - clk_register_clkdev(clk, "apb_pclk", "mtu0"); 447 - 448 - clk = clk_reg_prcc_pclk("p6_pclk7", "per6clk", bases[CLKRST6_INDEX], 449 - BIT(7), 0); 450 - clk_register_clkdev(clk, "apb_pclk", "mtu1"); 451 - 452 - /* 453 - * PRCC K-clocks ==> see table PRCC_PCKEN/PRCC_KCKEN 454 - * This differs from the internal implementation: 455 - * We don't use the PERPIH[n| clock as parent, since those _should_ 456 - * only be used as parents for the P-clocks. 457 - * TODO: "parentjoin" with corresponding P-clocks for all K-clocks. 458 - */ 459 - 460 - /* Peripheral 1 : PRCC K-clocks */ 461 - clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk", 462 - bases[CLKRST1_INDEX], BIT(0), CLK_SET_RATE_GATE); 463 - clk_register_clkdev(clk, NULL, "uart0"); 464 - 465 - clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk", 466 - bases[CLKRST1_INDEX], BIT(1), CLK_SET_RATE_GATE); 467 - clk_register_clkdev(clk, NULL, "uart1"); 468 - 469 - clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", 470 - bases[CLKRST1_INDEX], BIT(2), CLK_SET_RATE_GATE); 471 - clk_register_clkdev(clk, NULL, "nmk-i2c.1"); 472 - 473 - clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", 474 - bases[CLKRST1_INDEX], BIT(3), CLK_SET_RATE_GATE); 475 - clk_register_clkdev(clk, NULL, "msp0"); 476 - clk_register_clkdev(clk, NULL, "dbx5x0-msp-i2s.0"); 477 - 478 - clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", 479 - bases[CLKRST1_INDEX], BIT(4), CLK_SET_RATE_GATE); 480 - clk_register_clkdev(clk, NULL, "msp1"); 481 - clk_register_clkdev(clk, NULL, "dbx5x0-msp-i2s.1"); 482 - 483 - clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmchclk", 484 - bases[CLKRST1_INDEX], BIT(5), CLK_SET_RATE_GATE); 485 - clk_register_clkdev(clk, NULL, "sdi0"); 486 - 487 - clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", 488 - bases[CLKRST1_INDEX], BIT(6), CLK_SET_RATE_GATE); 489 - clk_register_clkdev(clk, NULL, "nmk-i2c.2"); 490 - 491 - clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", 492 - bases[CLKRST1_INDEX], BIT(8), CLK_SET_RATE_GATE); 493 - clk_register_clkdev(clk, NULL, "slimbus0"); 494 - 495 - clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", 496 - bases[CLKRST1_INDEX], BIT(9), CLK_SET_RATE_GATE); 497 - clk_register_clkdev(clk, NULL, "nmk-i2c.4"); 498 - 499 - clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", 500 - bases[CLKRST1_INDEX], BIT(10), CLK_SET_RATE_GATE); 501 - clk_register_clkdev(clk, NULL, "msp3"); 502 - clk_register_clkdev(clk, NULL, "dbx5x0-msp-i2s.3"); 503 - 504 - /* Peripheral 2 : PRCC K-clocks */ 505 - clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", 506 - bases[CLKRST2_INDEX], BIT(0), CLK_SET_RATE_GATE); 507 - clk_register_clkdev(clk, NULL, "nmk-i2c.3"); 508 - 509 - clk = clk_reg_prcc_kclk("p2_pwl_kclk", "rtc32k", 510 - bases[CLKRST2_INDEX], BIT(1), CLK_SET_RATE_GATE); 511 - clk_register_clkdev(clk, NULL, "pwl"); 512 - 513 - clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmchclk", 514 - bases[CLKRST2_INDEX], BIT(2), CLK_SET_RATE_GATE); 515 - clk_register_clkdev(clk, NULL, "sdi4"); 516 - 517 - clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", 518 - bases[CLKRST2_INDEX], BIT(3), CLK_SET_RATE_GATE); 519 - clk_register_clkdev(clk, NULL, "msp2"); 520 - clk_register_clkdev(clk, NULL, "dbx5x0-msp-i2s.2"); 521 - 522 - clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmchclk", 523 - bases[CLKRST2_INDEX], BIT(4), CLK_SET_RATE_GATE); 524 - clk_register_clkdev(clk, NULL, "sdi1"); 525 - 526 - clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk", 527 - bases[CLKRST2_INDEX], BIT(5), CLK_SET_RATE_GATE); 528 - clk_register_clkdev(clk, NULL, "sdi3"); 529 - 530 - clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk", 531 - bases[CLKRST2_INDEX], BIT(6), 532 - CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); 533 - clk_register_clkdev(clk, "hsir_hsirxclk", "ste_hsi.0"); 534 - 535 - clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk", 536 - bases[CLKRST2_INDEX], BIT(7), 537 - CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); 538 - clk_register_clkdev(clk, "hsit_hsitxclk", "ste_hsi.0"); 539 - 540 - /* Should only be 9540, but might be added for 85xx as well */ 541 - clk = clk_reg_prcc_kclk("p2_msp4_kclk", "msp02clk", 542 - bases[CLKRST2_INDEX], BIT(9), CLK_SET_RATE_GATE); 543 - clk_register_clkdev(clk, NULL, "msp4"); 544 - clk_register_clkdev(clk, "msp4", "ab85xx-codec.0"); 545 - 546 - /* Peripheral 3 : PRCC K-clocks */ 547 - clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", 548 - bases[CLKRST3_INDEX], BIT(1), CLK_SET_RATE_GATE); 549 - clk_register_clkdev(clk, NULL, "ssp0"); 550 - 551 - clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", 552 - bases[CLKRST3_INDEX], BIT(2), CLK_SET_RATE_GATE); 553 - clk_register_clkdev(clk, NULL, "ssp1"); 554 - 555 - clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", 556 - bases[CLKRST3_INDEX], BIT(3), CLK_SET_RATE_GATE); 557 - clk_register_clkdev(clk, NULL, "nmk-i2c.0"); 558 - 559 - clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmchclk", 560 - bases[CLKRST3_INDEX], BIT(4), CLK_SET_RATE_GATE); 561 - clk_register_clkdev(clk, NULL, "sdi2"); 562 - 563 - clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k", 564 - bases[CLKRST3_INDEX], BIT(5), CLK_SET_RATE_GATE); 565 - clk_register_clkdev(clk, NULL, "ske"); 566 - clk_register_clkdev(clk, NULL, "nmk-ske-keypad"); 567 - 568 - clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk", 569 - bases[CLKRST3_INDEX], BIT(6), CLK_SET_RATE_GATE); 570 - clk_register_clkdev(clk, NULL, "uart2"); 571 - 572 - clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk", 573 - bases[CLKRST3_INDEX], BIT(7), CLK_SET_RATE_GATE); 574 - clk_register_clkdev(clk, NULL, "sdi5"); 575 - 576 - clk = clk_reg_prcc_kclk("p3_i2c5_kclk", "i2cclk", 577 - bases[CLKRST3_INDEX], BIT(8), CLK_SET_RATE_GATE); 578 - clk_register_clkdev(clk, NULL, "nmk-i2c.5"); 579 - 580 - clk = clk_reg_prcc_kclk("p3_i2c6_kclk", "i2cclk", 581 - bases[CLKRST3_INDEX], BIT(9), CLK_SET_RATE_GATE); 582 - clk_register_clkdev(clk, NULL, "nmk-i2c.6"); 583 - 584 - clk = clk_reg_prcc_kclk("p3_uart3_kclk", "uartclk", 585 - bases[CLKRST3_INDEX], BIT(10), CLK_SET_RATE_GATE); 586 - clk_register_clkdev(clk, NULL, "uart3"); 587 - 588 - clk = clk_reg_prcc_kclk("p3_uart4_kclk", "uartclk", 589 - bases[CLKRST3_INDEX], BIT(11), CLK_SET_RATE_GATE); 590 - clk_register_clkdev(clk, NULL, "uart4"); 591 - 592 - /* Peripheral 6 : PRCC K-clocks */ 593 - clk = clk_reg_prcc_kclk("p6_rng_kclk", "rngclk", 594 - bases[CLKRST6_INDEX], BIT(0), CLK_SET_RATE_GATE); 595 - clk_register_clkdev(clk, NULL, "rng"); 596 - } 597 - CLK_OF_DECLARE(u8540_clks, "stericsson,u8540-clks", u8540_clk_init);
-18
drivers/clk/ux500/u9540_clk.c
··· 1 - /* 2 - * Clock definitions for u9540 platform. 3 - * 4 - * Copyright (C) 2012 ST-Ericsson SA 5 - * Author: Ulf Hansson <ulf.hansson@linaro.org> 6 - * 7 - * License terms: GNU General Public License (GPL) version 2 8 - */ 9 - 10 - #include <linux/clk-provider.h> 11 - #include <linux/mfd/dbx500-prcmu.h> 12 - #include "clk.h" 13 - 14 - static void u9540_clk_init(struct device_node *np) 15 - { 16 - /* register clocks here */ 17 - } 18 - CLK_OF_DECLARE(u9540_clks, "stericsson,u9540-clks", u9540_clk_init);
+28 -27
include/dt-bindings/clock/histb-clock.h
··· 22 22 #define HISTB_OSC_CLK 0 23 23 #define HISTB_APB_CLK 1 24 24 #define HISTB_AHB_CLK 2 25 - #define HISTB_UART1_CLK 3 26 - #define HISTB_UART2_CLK 4 27 - #define HISTB_UART3_CLK 5 28 - #define HISTB_I2C0_CLK 6 29 - #define HISTB_I2C1_CLK 7 30 - #define HISTB_I2C2_CLK 8 31 - #define HISTB_I2C3_CLK 9 32 - #define HISTB_I2C4_CLK 10 33 - #define HISTB_I2C5_CLK 11 34 - #define HISTB_SPI0_CLK 12 35 - #define HISTB_SPI1_CLK 13 36 - #define HISTB_SPI2_CLK 14 25 + #define HISTB_UART1_CLK 3 26 + #define HISTB_UART2_CLK 4 27 + #define HISTB_UART3_CLK 5 28 + #define HISTB_I2C0_CLK 6 29 + #define HISTB_I2C1_CLK 7 30 + #define HISTB_I2C2_CLK 8 31 + #define HISTB_I2C3_CLK 9 32 + #define HISTB_I2C4_CLK 10 33 + #define HISTB_I2C5_CLK 11 34 + #define HISTB_SPI0_CLK 12 35 + #define HISTB_SPI1_CLK 13 36 + #define HISTB_SPI2_CLK 14 37 37 #define HISTB_SCI_CLK 15 38 38 #define HISTB_FMC_CLK 16 39 39 #define HISTB_MMC_BIU_CLK 17 ··· 43 43 #define HISTB_SDIO0_BIU_CLK 21 44 44 #define HISTB_SDIO0_CIU_CLK 22 45 45 #define HISTB_SDIO0_DRV_CLK 23 46 - #define HISTB_SDIO0_SAMPLE_CLK 24 46 + #define HISTB_SDIO0_SAMPLE_CLK 24 47 47 #define HISTB_PCIE_AUX_CLK 25 48 48 #define HISTB_PCIE_PIPE_CLK 26 49 49 #define HISTB_PCIE_SYS_CLK 27 ··· 53 53 #define HISTB_ETH1_MAC_CLK 31 54 54 #define HISTB_ETH1_MACIF_CLK 32 55 55 #define HISTB_COMBPHY1_CLK 33 56 - #define HISTB_USB2_BUS_CLK 34 57 - #define HISTB_USB2_PHY_CLK 35 58 - #define HISTB_USB2_UTMI_CLK 36 59 - #define HISTB_USB2_12M_CLK 37 60 - #define HISTB_USB2_48M_CLK 38 61 - #define HISTB_USB2_OTG_UTMI_CLK 39 62 - #define HISTB_USB2_PHY1_REF_CLK 40 63 - #define HISTB_USB2_PHY2_REF_CLK 41 56 + #define HISTB_USB2_BUS_CLK 34 57 + #define HISTB_USB2_PHY_CLK 35 58 + #define HISTB_USB2_UTMI_CLK 36 59 + #define HISTB_USB2_12M_CLK 37 60 + #define HISTB_USB2_48M_CLK 38 61 + #define HISTB_USB2_OTG_UTMI_CLK 39 62 + #define HISTB_USB2_PHY1_REF_CLK 40 63 + #define HISTB_USB2_PHY2_REF_CLK 41 64 + #define HISTB_COMBPHY0_CLK 42 64 65 65 66 /* clocks provided by mcu CRG */ 66 - #define HISTB_MCE_CLK 1 67 - #define HISTB_IR_CLK 2 68 - #define HISTB_TIMER01_CLK 3 69 - #define HISTB_LEDC_CLK 4 70 - #define HISTB_UART0_CLK 5 71 - #define HISTB_LSADC_CLK 6 67 + #define HISTB_MCE_CLK 1 68 + #define HISTB_IR_CLK 2 69 + #define HISTB_TIMER01_CLK 3 70 + #define HISTB_LEDC_CLK 4 71 + #define HISTB_UART0_CLK 5 72 + #define HISTB_LSADC_CLK 6 72 73 73 74 #endif /* __DTS_HISTB_CLOCK_H */
+2 -1
include/dt-bindings/clock/mt2701-clk.h
··· 176 176 #define CLK_TOP_AUD_EXT1 156 177 177 #define CLK_TOP_AUD_EXT2 157 178 178 #define CLK_TOP_NFI1X_PAD 158 179 - #define CLK_TOP_NR 159 179 + #define CLK_TOP_AXISEL_D4 159 180 + #define CLK_TOP_NR 160 180 181 181 182 /* APMIXEDSYS */ 182 183
+2 -1
include/dt-bindings/clock/mt7622-clk.h
··· 235 235 #define CLK_AUDIO_MEM_ASRC3 43 236 236 #define CLK_AUDIO_MEM_ASRC4 44 237 237 #define CLK_AUDIO_MEM_ASRC5 45 238 - #define CLK_AUDIO_NR_CLK 46 238 + #define CLK_AUDIO_AFE_CONN 46 239 + #define CLK_AUDIO_NR_CLK 47 239 240 240 241 /* SSUSBSYS */ 241 242
+62
include/dt-bindings/clock/r8a77965-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2018 Jacopo Mondi <jacopo+renesas@jmondi.org> 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77965_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77965_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77965 CPG Core Clocks */ 11 + #define R8A77965_CLK_Z 0 12 + #define R8A77965_CLK_ZR 1 13 + #define R8A77965_CLK_ZG 2 14 + #define R8A77965_CLK_ZTR 3 15 + #define R8A77965_CLK_ZTRD2 4 16 + #define R8A77965_CLK_ZT 5 17 + #define R8A77965_CLK_ZX 6 18 + #define R8A77965_CLK_S0D1 7 19 + #define R8A77965_CLK_S0D2 8 20 + #define R8A77965_CLK_S0D3 9 21 + #define R8A77965_CLK_S0D4 10 22 + #define R8A77965_CLK_S0D6 11 23 + #define R8A77965_CLK_S0D8 12 24 + #define R8A77965_CLK_S0D12 13 25 + #define R8A77965_CLK_S1D1 14 26 + #define R8A77965_CLK_S1D2 15 27 + #define R8A77965_CLK_S1D4 16 28 + #define R8A77965_CLK_S2D1 17 29 + #define R8A77965_CLK_S2D2 18 30 + #define R8A77965_CLK_S2D4 19 31 + #define R8A77965_CLK_S3D1 20 32 + #define R8A77965_CLK_S3D2 21 33 + #define R8A77965_CLK_S3D4 22 34 + #define R8A77965_CLK_LB 23 35 + #define R8A77965_CLK_CL 24 36 + #define R8A77965_CLK_ZB3 25 37 + #define R8A77965_CLK_ZB3D2 26 38 + #define R8A77965_CLK_CR 27 39 + #define R8A77965_CLK_CRD2 28 40 + #define R8A77965_CLK_SD0H 29 41 + #define R8A77965_CLK_SD0 30 42 + #define R8A77965_CLK_SD1H 31 43 + #define R8A77965_CLK_SD1 32 44 + #define R8A77965_CLK_SD2H 33 45 + #define R8A77965_CLK_SD2 34 46 + #define R8A77965_CLK_SD3H 35 47 + #define R8A77965_CLK_SD3 36 48 + #define R8A77965_CLK_SSP2 37 49 + #define R8A77965_CLK_SSP1 38 50 + #define R8A77965_CLK_SSPRS 39 51 + #define R8A77965_CLK_RPC 40 52 + #define R8A77965_CLK_RPCD2 41 53 + #define R8A77965_CLK_MSO 42 54 + #define R8A77965_CLK_CANFD 43 55 + #define R8A77965_CLK_HDMI 44 56 + #define R8A77965_CLK_CSI0 45 57 + #define R8A77965_CLK_CP 46 58 + #define R8A77965_CLK_CPEX 47 59 + #define R8A77965_CLK_R 48 60 + #define R8A77965_CLK_OSC 49 61 + 62 + #endif /* __DT_BINDINGS_CLOCK_R8A77965_CPG_MSSR_H__ */
+51
include/dt-bindings/clock/r8a77980-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * Copyright (C) 2018 Renesas Electronics Corp. 4 + * Copyright (C) 2018 Cogent Embedded, Inc. 5 + */ 6 + #ifndef __DT_BINDINGS_CLOCK_R8A77980_CPG_MSSR_H__ 7 + #define __DT_BINDINGS_CLOCK_R8A77980_CPG_MSSR_H__ 8 + 9 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 10 + 11 + /* r8a77980 CPG Core Clocks */ 12 + #define R8A77980_CLK_Z2 0 13 + #define R8A77980_CLK_ZR 1 14 + #define R8A77980_CLK_ZTR 2 15 + #define R8A77980_CLK_ZTRD2 3 16 + #define R8A77980_CLK_ZT 4 17 + #define R8A77980_CLK_ZX 5 18 + #define R8A77980_CLK_S0D1 6 19 + #define R8A77980_CLK_S0D2 7 20 + #define R8A77980_CLK_S0D3 8 21 + #define R8A77980_CLK_S0D4 9 22 + #define R8A77980_CLK_S0D6 10 23 + #define R8A77980_CLK_S0D12 11 24 + #define R8A77980_CLK_S0D24 12 25 + #define R8A77980_CLK_S1D1 13 26 + #define R8A77980_CLK_S1D2 14 27 + #define R8A77980_CLK_S1D4 15 28 + #define R8A77980_CLK_S2D1 16 29 + #define R8A77980_CLK_S2D2 17 30 + #define R8A77980_CLK_S2D4 18 31 + #define R8A77980_CLK_S3D1 19 32 + #define R8A77980_CLK_S3D2 20 33 + #define R8A77980_CLK_S3D4 21 34 + #define R8A77980_CLK_LB 22 35 + #define R8A77980_CLK_CL 23 36 + #define R8A77980_CLK_ZB3 24 37 + #define R8A77980_CLK_ZB3D2 25 38 + #define R8A77980_CLK_ZB3D4 26 39 + #define R8A77980_CLK_SD0H 27 40 + #define R8A77980_CLK_SD0 28 41 + #define R8A77980_CLK_RPC 29 42 + #define R8A77980_CLK_RPCD2 30 43 + #define R8A77980_CLK_MSO 31 44 + #define R8A77980_CLK_CANFD 32 45 + #define R8A77980_CLK_CSI0 33 46 + #define R8A77980_CLK_CP 34 47 + #define R8A77980_CLK_CPEX 35 48 + #define R8A77980_CLK_R 36 49 + #define R8A77980_CLK_OSC 37 50 + 51 + #endif /* __DT_BINDINGS_CLOCK_R8A77980_CPG_MSSR_H__ */
+125
include/dt-bindings/clock/sun50i-h6-ccu.h
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ or MIT) 2 + /* 3 + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io> 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_SUN50I_H6_H_ 7 + #define _DT_BINDINGS_CLK_SUN50I_H6_H_ 8 + 9 + #define CLK_PLL_PERIPH0 3 10 + 11 + #define CLK_CPUX 21 12 + 13 + #define CLK_APB1 26 14 + 15 + #define CLK_DE 29 16 + #define CLK_BUS_DE 30 17 + #define CLK_DEINTERLACE 31 18 + #define CLK_BUS_DEINTERLACE 32 19 + #define CLK_GPU 33 20 + #define CLK_BUS_GPU 34 21 + #define CLK_CE 35 22 + #define CLK_BUS_CE 36 23 + #define CLK_VE 37 24 + #define CLK_BUS_VE 38 25 + #define CLK_EMCE 39 26 + #define CLK_BUS_EMCE 40 27 + #define CLK_VP9 41 28 + #define CLK_BUS_VP9 42 29 + #define CLK_BUS_DMA 43 30 + #define CLK_BUS_MSGBOX 44 31 + #define CLK_BUS_SPINLOCK 45 32 + #define CLK_BUS_HSTIMER 46 33 + #define CLK_AVS 47 34 + #define CLK_BUS_DBG 48 35 + #define CLK_BUS_PSI 49 36 + #define CLK_BUS_PWM 50 37 + #define CLK_BUS_IOMMU 51 38 + 39 + #define CLK_MBUS_DMA 53 40 + #define CLK_MBUS_VE 54 41 + #define CLK_MBUS_CE 55 42 + #define CLK_MBUS_TS 56 43 + #define CLK_MBUS_NAND 57 44 + #define CLK_MBUS_CSI 58 45 + #define CLK_MBUS_DEINTERLACE 59 46 + 47 + #define CLK_NAND0 61 48 + #define CLK_NAND1 62 49 + #define CLK_BUS_NAND 63 50 + #define CLK_MMC0 64 51 + #define CLK_MMC1 65 52 + #define CLK_MMC2 66 53 + #define CLK_BUS_MMC0 67 54 + #define CLK_BUS_MMC1 68 55 + #define CLK_BUS_MMC2 69 56 + #define CLK_BUS_UART0 70 57 + #define CLK_BUS_UART1 71 58 + #define CLK_BUS_UART2 72 59 + #define CLK_BUS_UART3 73 60 + #define CLK_BUS_I2C0 74 61 + #define CLK_BUS_I2C1 75 62 + #define CLK_BUS_I2C2 76 63 + #define CLK_BUS_I2C3 77 64 + #define CLK_BUS_SCR0 78 65 + #define CLK_BUS_SCR1 79 66 + #define CLK_SPI0 80 67 + #define CLK_SPI1 81 68 + #define CLK_BUS_SPI0 82 69 + #define CLK_BUS_SPI1 83 70 + #define CLK_BUS_EMAC 84 71 + #define CLK_TS 85 72 + #define CLK_BUS_TS 86 73 + #define CLK_IR_TX 87 74 + #define CLK_BUS_IR_TX 88 75 + #define CLK_BUS_THS 89 76 + #define CLK_I2S3 90 77 + #define CLK_I2S0 91 78 + #define CLK_I2S1 92 79 + #define CLK_I2S2 93 80 + #define CLK_BUS_I2S0 94 81 + #define CLK_BUS_I2S1 95 82 + #define CLK_BUS_I2S2 96 83 + #define CLK_BUS_I2S3 97 84 + #define CLK_SPDIF 98 85 + #define CLK_BUS_SPDIF 99 86 + #define CLK_DMIC 100 87 + #define CLK_BUS_DMIC 101 88 + #define CLK_AUDIO_HUB 102 89 + #define CLK_BUS_AUDIO_HUB 103 90 + #define CLK_USB_OHCI0 104 91 + #define CLK_USB_PHY0 105 92 + #define CLK_USB_PHY1 106 93 + #define CLK_USB_OHCI3 107 94 + #define CLK_USB_PHY3 108 95 + #define CLK_USB_HSIC_12M 109 96 + #define CLK_USB_HSIC 110 97 + #define CLK_BUS_OHCI0 111 98 + #define CLK_BUS_OHCI3 112 99 + #define CLK_BUS_EHCI0 113 100 + #define CLK_BUS_XHCI 114 101 + #define CLK_BUS_EHCI3 115 102 + #define CLK_BUS_OTG 116 103 + #define CLK_PCIE_REF_100M 117 104 + #define CLK_PCIE_REF 118 105 + #define CLK_PCIE_REF_OUT 119 106 + #define CLK_PCIE_MAXI 120 107 + #define CLK_PCIE_AUX 121 108 + #define CLK_BUS_PCIE 122 109 + #define CLK_HDMI 123 110 + #define CLK_HDMI_SLOW 124 111 + #define CLK_HDMI_CEC 125 112 + #define CLK_BUS_HDMI 126 113 + #define CLK_BUS_TCON_TOP 127 114 + #define CLK_TCON_LCD0 128 115 + #define CLK_BUS_TCON_LCD0 129 116 + #define CLK_TCON_TV0 130 117 + #define CLK_BUS_TCON_TV0 131 118 + #define CLK_CSI_CCI 132 119 + #define CLK_CSI_TOP 133 120 + #define CLK_CSI_MCLK 134 121 + #define CLK_BUS_CSI 135 122 + #define CLK_HDCP 136 123 + #define CLK_BUS_HDCP 137 124 + 125 + #endif /* _DT_BINDINGS_CLK_SUN50I_H6_H_ */
+2
include/dt-bindings/clock/sun8i-h3-ccu.h
··· 43 43 #ifndef _DT_BINDINGS_CLK_SUN8I_H3_H_ 44 44 #define _DT_BINDINGS_CLK_SUN8I_H3_H_ 45 45 46 + #define CLK_PLL_VIDEO 6 47 + 46 48 #define CLK_PLL_PERIPH0 9 47 49 48 50 #define CLK_CPUX 14
+73
include/dt-bindings/reset/sun50i-h6-ccu.h
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ or MIT) 2 + /* 3 + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io> 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_RESET_SUN50I_H6_H_ 7 + #define _DT_BINDINGS_RESET_SUN50I_H6_H_ 8 + 9 + #define RST_MBUS 0 10 + #define RST_BUS_DE 1 11 + #define RST_BUS_DEINTERLACE 2 12 + #define RST_BUS_GPU 3 13 + #define RST_BUS_CE 4 14 + #define RST_BUS_VE 5 15 + #define RST_BUS_EMCE 6 16 + #define RST_BUS_VP9 7 17 + #define RST_BUS_DMA 8 18 + #define RST_BUS_MSGBOX 9 19 + #define RST_BUS_SPINLOCK 10 20 + #define RST_BUS_HSTIMER 11 21 + #define RST_BUS_DBG 12 22 + #define RST_BUS_PSI 13 23 + #define RST_BUS_PWM 14 24 + #define RST_BUS_IOMMU 15 25 + #define RST_BUS_DRAM 16 26 + #define RST_BUS_NAND 17 27 + #define RST_BUS_MMC0 18 28 + #define RST_BUS_MMC1 19 29 + #define RST_BUS_MMC2 20 30 + #define RST_BUS_UART0 21 31 + #define RST_BUS_UART1 22 32 + #define RST_BUS_UART2 23 33 + #define RST_BUS_UART3 24 34 + #define RST_BUS_I2C0 25 35 + #define RST_BUS_I2C1 26 36 + #define RST_BUS_I2C2 27 37 + #define RST_BUS_I2C3 28 38 + #define RST_BUS_SCR0 29 39 + #define RST_BUS_SCR1 30 40 + #define RST_BUS_SPI0 31 41 + #define RST_BUS_SPI1 32 42 + #define RST_BUS_EMAC 33 43 + #define RST_BUS_TS 34 44 + #define RST_BUS_IR_TX 35 45 + #define RST_BUS_THS 36 46 + #define RST_BUS_I2S0 37 47 + #define RST_BUS_I2S1 38 48 + #define RST_BUS_I2S2 39 49 + #define RST_BUS_I2S3 40 50 + #define RST_BUS_SPDIF 41 51 + #define RST_BUS_DMIC 42 52 + #define RST_BUS_AUDIO_HUB 43 53 + #define RST_USB_PHY0 44 54 + #define RST_USB_PHY1 45 55 + #define RST_USB_PHY3 46 56 + #define RST_USB_HSIC 47 57 + #define RST_BUS_OHCI0 48 58 + #define RST_BUS_OHCI3 49 59 + #define RST_BUS_EHCI0 50 60 + #define RST_BUS_XHCI 51 61 + #define RST_BUS_EHCI3 52 62 + #define RST_BUS_OTG 53 63 + #define RST_BUS_PCIE 54 64 + #define RST_PCIE_POWERUP 55 65 + #define RST_BUS_HDMI 56 66 + #define RST_BUS_HDMI_SUB 57 67 + #define RST_BUS_TCON_TOP 58 68 + #define RST_BUS_TCON_LCD0 59 69 + #define RST_BUS_TCON_TV0 60 70 + #define RST_BUS_CSI 61 71 + #define RST_BUS_HDCP 62 72 + 73 + #endif /* _DT_BINDINGS_RESET_SUN50I_H6_H_ */