Merge branches 'clk-xilinx', 'clk-kunit', 'clk-cs2000' and 'clk-renesas' into clk-next

- Kunit tests for clk-gate implementation
- Convert Cirrus Logic CS2000P driver to regmap, yamlify DT binding and add
support for dynamic mode

* clk-xilinx:
clk: zynqmp: replace warn_once with pr_debug for failed clock ops

* clk-kunit:
clk: gate: Add some kunit test suites

* clk-cs2000:
clk: cs2000-cp: convert driver to regmap
clk: cs2000-cp: freeze config during register fiddling
clk: cs2000-cp: make clock skip setting configurable
clk: cs2000-cp: add support for dynamic mode
clk: cs2000-cp: Make aux output function controllable
dt-bindings: clock: cs2000-cp: document cirrus,dynamic-mode
dt-bindings: clock: cs2000-cp: document cirrus,clock-skip flag
dt-bindings: clock: cs2000-cp: document aux-output-source
dt-bindings: clock: convert cs2000-cp bindings to yaml

* clk-renesas:
dt-bindings: clock: renesas: Make example 'clocks' parsable
clk: rs9: Add Renesas 9-series PCIe clock generator driver
clk: fixed-factor: Introduce devm_clk_hw_register_fixed_factor_index()
dt-bindings: clk: rs9: Add Renesas 9-series I2C PCIe clock generator
clk: renesas: r8a779f0: Add PFC clock
clk: renesas: r8a779f0: Add I2C clocks
clk: renesas: r8a779f0: Add WDT clock
clk: renesas: r8a779f0: Fix RSW2 clock divider
clk: renesas: rzg2l-cpg: Add support for RZ/V2L SoC
dt-bindings: clock: renesas: Document RZ/V2L SoC
dt-bindings: clock: Add R9A07G054 CPG Clock and Reset Definitions
clk: renesas: r8a779a0: Add CANFD module clock
clk: renesas: r9a07g044: Update multiplier and divider values for PLL2/3
clk: renesas: r8a7799[05]: Add MLP clocks
clk: renesas: r8a779f0: Add SYS-DMAC clocks

+1744 -337
+91
Documentation/devicetree/bindings/clock/cirrus,cs2000-cp.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/cirrus,cs2000-cp.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Binding CIRRUS LOGIC Fractional-N Clock Synthesizer & Clock Multiplier 8 + 9 + maintainers: 10 + - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 11 + 12 + description: | 13 + The CS2000-CP is an extremely versatile system clocking device that 14 + utilizes a programmable phase lock loop. 15 + 16 + Link: https://www.cirrus.com/products/cs2000/ 17 + 18 + properties: 19 + compatible: 20 + enum: 21 + - cirrus,cs2000-cp 22 + 23 + clocks: 24 + description: 25 + Common clock binding for CLK_IN, XTI/REF_CLK 26 + minItems: 2 27 + maxItems: 2 28 + 29 + clock-names: 30 + items: 31 + - const: clk_in 32 + - const: ref_clk 33 + 34 + '#clock-cells': 35 + const: 0 36 + 37 + reg: 38 + maxItems: 1 39 + 40 + cirrus,aux-output-source: 41 + description: 42 + Specifies the function of the auxiliary clock output pin 43 + $ref: /schemas/types.yaml#/definitions/uint32 44 + enum: 45 + - 0 # CS2000CP_AUX_OUTPUT_REF_CLK: ref_clk input 46 + - 1 # CS2000CP_AUX_OUTPUT_CLK_IN: clk_in input 47 + - 2 # CS2000CP_AUX_OUTPUT_CLK_OUT: clk_out output 48 + - 3 # CS2000CP_AUX_OUTPUT_PLL_LOCK: pll lock status 49 + default: 0 50 + 51 + cirrus,clock-skip: 52 + description: 53 + This mode allows the PLL to maintain lock even when CLK_IN 54 + has missing pulses for up to 20 ms. 55 + $ref: /schemas/types.yaml#/definitions/flag 56 + 57 + cirrus,dynamic-mode: 58 + description: 59 + In dynamic mode, the CLK_IN input is used to drive the 60 + digital PLL of the silicon. 61 + If not given, the static mode shall be used to derive the 62 + output signal directly from the REF_CLK input. 63 + $ref: /schemas/types.yaml#/definitions/flag 64 + 65 + required: 66 + - compatible 67 + - reg 68 + - clocks 69 + - clock-names 70 + - '#clock-cells' 71 + 72 + additionalProperties: false 73 + 74 + examples: 75 + - | 76 + #include <dt-bindings/clock/cirrus,cs2000-cp.h> 77 + 78 + i2c@0 { 79 + reg = <0x0 0x100>; 80 + #address-cells = <1>; 81 + #size-cells = <0>; 82 + 83 + clock-controller@4f { 84 + #clock-cells = <0>; 85 + compatible = "cirrus,cs2000-cp"; 86 + reg = <0x4f>; 87 + clocks = <&rcar_sound 0>, <&x12_clk>; 88 + clock-names = "clk_in", "ref_clk"; 89 + cirrus,aux-output-source = <CS2000CP_AUX_OUTPUT_CLK_OUT>; 90 + }; 91 + };
-22
Documentation/devicetree/bindings/clock/cs2000-cp.txt
··· 1 - CIRRUS LOGIC Fractional-N Clock Synthesizer & Clock Multiplier 2 - 3 - Required properties: 4 - 5 - - compatible: "cirrus,cs2000-cp" 6 - - reg: The chip select number on the I2C bus 7 - - clocks: common clock binding for CLK_IN, XTI/REF_CLK 8 - - clock-names: CLK_IN : clk_in, XTI/REF_CLK : ref_clk 9 - - #clock-cells: must be <0> 10 - 11 - Example: 12 - 13 - &i2c2 { 14 - ... 15 - cs2000: clk_multiplier@4f { 16 - #clock-cells = <0>; 17 - compatible = "cirrus,cs2000-cp"; 18 - reg = <0x4f>; 19 - clocks = <&rcar_sound 0>, <&x12_clk>; 20 - clock-names = "clk_in", "ref_clk"; 21 - }; 22 - };
+97
Documentation/devicetree/bindings/clock/renesas,9series.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/renesas,9series.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Binding for Renesas 9-series I2C PCIe clock generators 8 + 9 + description: | 10 + The Renesas 9-series are I2C PCIe clock generators providing 11 + from 1 to 20 output clocks. 12 + 13 + When referencing the provided clock in the DT using phandle 14 + and clock specifier, the following mapping applies: 15 + 16 + - 9FGV0241: 17 + 0 -- DIF0 18 + 1 -- DIF1 19 + 20 + maintainers: 21 + - Marek Vasut <marex@denx.de> 22 + 23 + properties: 24 + compatible: 25 + enum: 26 + - renesas,9fgv0241 27 + 28 + reg: 29 + description: I2C device address 30 + enum: [ 0x68, 0x6a ] 31 + 32 + '#clock-cells': 33 + const: 1 34 + 35 + clocks: 36 + items: 37 + - description: XTal input clock 38 + 39 + renesas,out-amplitude-microvolt: 40 + enum: [ 600000, 700000, 800000, 900000 ] 41 + description: Output clock signal amplitude 42 + 43 + renesas,out-spread-spectrum: 44 + $ref: /schemas/types.yaml#/definitions/uint32 45 + enum: [ 100000, 99750, 99500 ] 46 + description: Output clock down spread in pcm (1/1000 of percent) 47 + 48 + patternProperties: 49 + "^DIF[0-19]$": 50 + type: object 51 + description: 52 + Description of one of the outputs (DIF0..DIF19). 53 + 54 + properties: 55 + renesas,slew-rate: 56 + $ref: /schemas/types.yaml#/definitions/uint32 57 + enum: [ 2000000, 3000000 ] 58 + description: Output clock slew rate select in V/ns 59 + 60 + additionalProperties: false 61 + 62 + required: 63 + - compatible 64 + - reg 65 + - clocks 66 + - '#clock-cells' 67 + 68 + additionalProperties: false 69 + 70 + examples: 71 + - | 72 + /* 25MHz reference crystal */ 73 + ref25: ref25m { 74 + compatible = "fixed-clock"; 75 + #clock-cells = <0>; 76 + clock-frequency = <25000000>; 77 + }; 78 + 79 + i2c@0 { 80 + reg = <0x0 0x100>; 81 + #address-cells = <1>; 82 + #size-cells = <0>; 83 + 84 + rs9: clock-generator@6a { 85 + compatible = "renesas,9fgv0241"; 86 + reg = <0x6a>; 87 + #clock-cells = <1>; 88 + 89 + clocks = <&ref25m>; 90 + 91 + DIF0 { 92 + renesas,slew-rate = <3000000>; 93 + }; 94 + }; 95 + }; 96 + 97 + ...
+12
Documentation/devicetree/bindings/clock/renesas,cpg-div6-clock.yaml
··· 51 51 examples: 52 52 - | 53 53 #include <dt-bindings/clock/r8a73a4-clock.h> 54 + 55 + cpg_clocks: cpg_clocks@e6150000 { 56 + compatible = "renesas,r8a73a4-cpg-clocks"; 57 + reg = <0xe6150000 0x10000>; 58 + clocks = <&extal1_clk>, <&extal2_clk>; 59 + #clock-cells = <1>; 60 + clock-output-names = "main", "pll0", "pll1", "pll2", 61 + "pll2s", "pll2h", "z", "z2", 62 + "i", "m3", "b", "m1", "m2", 63 + "zx", "zs", "hp"; 64 + }; 65 + 54 66 sdhi2_clk: sdhi2_clk@e615007c { 55 67 compatible = "renesas,r8a73a4-div6-clock", "renesas,cpg-div6-clock"; 56 68 reg = <0xe615007c 4>;
+8 -6
Documentation/devicetree/bindings/clock/renesas,rzg2l-cpg.yaml
··· 4 4 $id: "http://devicetree.org/schemas/clock/renesas,rzg2l-cpg.yaml#" 5 5 $schema: "http://devicetree.org/meta-schemas/core.yaml#" 6 6 7 - title: Renesas RZ/G2L Clock Pulse Generator / Module Standby Mode 7 + title: Renesas RZ/{G2L,V2L} Clock Pulse Generator / Module Standby Mode 8 8 9 9 maintainers: 10 10 - Geert Uytterhoeven <geert+renesas@glider.be> 11 11 12 12 description: | 13 - On Renesas RZ/G2L SoC, the CPG (Clock Pulse Generator) and Module 13 + On Renesas RZ/{G2L,V2L} SoC, the CPG (Clock Pulse Generator) and Module 14 14 Standby Mode share the same register block. 15 15 16 16 They provide the following functionalities: ··· 22 22 23 23 properties: 24 24 compatible: 25 - const: renesas,r9a07g044-cpg # RZ/G2{L,LC} 25 + enum: 26 + - renesas,r9a07g044-cpg # RZ/G2{L,LC} 27 + - renesas,r9a07g054-cpg # RZ/V2L 26 28 27 29 reg: 28 30 maxItems: 1 ··· 42 40 description: | 43 41 - For CPG core clocks, the two clock specifier cells must be "CPG_CORE" 44 42 and a core clock reference, as defined in 45 - <dt-bindings/clock/r9a07g044-cpg.h> 43 + <dt-bindings/clock/r9a07g*-cpg.h> 46 44 - For module clocks, the two clock specifier cells must be "CPG_MOD" and 47 - a module number, as defined in the <dt-bindings/clock/r9a07g044-cpg.h>. 45 + a module number, as defined in the <dt-bindings/clock/r9a07g0*-cpg.h>. 48 46 const: 2 49 47 50 48 '#power-domain-cells': ··· 58 56 '#reset-cells': 59 57 description: 60 58 The single reset specifier cell must be the module number, as defined in 61 - the <dt-bindings/clock/r9a07g044-cpg.h>. 59 + the <dt-bindings/clock/r9a07g0*-cpg.h>. 62 60 const: 1 63 61 64 62 required:
+3
drivers/clk/.kunitconfig
··· 1 + CONFIG_KUNIT=y 2 + CONFIG_COMMON_CLK=y 3 + CONFIG_CLK_GATE_KUNIT_TEST=y
+18
drivers/clk/Kconfig
··· 197 197 config COMMON_CLK_CS2000_CP 198 198 tristate "Clock driver for CS2000 Fractional-N Clock Synthesizer & Clock Multiplier" 199 199 depends on I2C 200 + select REGMAP_I2C 200 201 help 201 202 If you say yes here you get support for the CS2000 clock multiplier. 202 203 ··· 338 337 help 339 338 Support for the OXNAS SoC Family clocks. 340 339 340 + config COMMON_CLK_RS9_PCIE 341 + tristate "Clock driver for Renesas 9-series PCIe clock generators" 342 + depends on I2C 343 + depends on OF 344 + select REGMAP_I2C 345 + help 346 + This driver supports the Renesas 9-series PCIe clock generator 347 + models 9FGV/9DBV/9DMV/9FGL/9DML/9QXL/9SQ. 348 + 341 349 config COMMON_CLK_VC5 342 350 tristate "Clock driver for IDT VersaClock 5,6 devices" 343 351 depends on I2C ··· 435 425 source "drivers/clk/x86/Kconfig" 436 426 source "drivers/clk/xilinx/Kconfig" 437 427 source "drivers/clk/zynqmp/Kconfig" 428 + 429 + # Kunit test cases 430 + config CLK_GATE_KUNIT_TEST 431 + tristate "Basic gate type Kunit test" if !KUNIT_ALL_TESTS 432 + depends on KUNIT 433 + default KUNIT_ALL_TESTS 434 + help 435 + Kunit test for the basic clk gate type. 438 436 439 437 endif
+2
drivers/clk/Makefile
··· 6 6 obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o 7 7 obj-$(CONFIG_COMMON_CLK) += clk-fixed-rate.o 8 8 obj-$(CONFIG_COMMON_CLK) += clk-gate.o 9 + obj-$(CONFIG_CLK_GATE_KUNIT_TEST) += clk-gate_test.o 9 10 obj-$(CONFIG_COMMON_CLK) += clk-multiplier.o 10 11 obj-$(CONFIG_COMMON_CLK) += clk-mux.o 11 12 obj-$(CONFIG_COMMON_CLK) += clk-composite.o ··· 68 67 obj-$(CONFIG_COMMON_CLK_TPS68470) += clk-tps68470.o 69 68 obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o 70 69 obj-$(CONFIG_ARCH_VT8500) += clk-vt8500.o 70 + obj-$(CONFIG_COMMON_CLK_RS9_PCIE) += clk-renesas-pcie.o 71 71 obj-$(CONFIG_COMMON_CLK_VC5) += clk-versaclock5.o 72 72 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o 73 73 obj-$(CONFIG_COMMON_CLK_XGENE) += clk-xgene.o
+155 -85
drivers/clk/clk-cs2000-cp.c
··· 11 11 #include <linux/i2c.h> 12 12 #include <linux/of_device.h> 13 13 #include <linux/module.h> 14 + #include <linux/regmap.h> 14 15 15 16 #define CH_MAX 4 16 17 #define RATIO_REG_SIZE 4 ··· 40 39 /* DEVICE_CFG1 */ 41 40 #define RSEL(x) (((x) & 0x3) << 3) 42 41 #define RSEL_MASK RSEL(0x3) 42 + #define AUXOUTSRC(x) (((x) & 0x3) << 1) 43 + #define AUXOUTSRC_MASK AUXOUTSRC(0x3) 43 44 #define ENDEV1 (0x1) 44 45 45 46 /* DEVICE_CFG2 */ ··· 50 47 #define LOCKCLK_MASK LOCKCLK(0x3) 51 48 #define FRACNSRC_MASK (1 << 0) 52 49 #define FRACNSRC_STATIC (0 << 0) 53 - #define FRACNSRC_DYNAMIC (1 << 1) 50 + #define FRACNSRC_DYNAMIC (1 << 0) 54 51 55 52 /* GLOBAL_CFG */ 53 + #define FREEZE (1 << 7) 56 54 #define ENDEV2 (0x1) 57 55 58 56 /* FUNC_CFG1 */ ··· 75 71 #define REF_CLK 1 76 72 #define CLK_MAX 2 77 73 74 + static bool cs2000_readable_reg(struct device *dev, unsigned int reg) 75 + { 76 + return reg > 0; 77 + } 78 + 79 + static bool cs2000_writeable_reg(struct device *dev, unsigned int reg) 80 + { 81 + return reg != DEVICE_ID; 82 + } 83 + 84 + static bool cs2000_volatile_reg(struct device *dev, unsigned int reg) 85 + { 86 + return reg == DEVICE_CTRL; 87 + } 88 + 89 + static const struct regmap_config cs2000_regmap_config = { 90 + .reg_bits = 8, 91 + .val_bits = 8, 92 + .max_register = FUNC_CFG2, 93 + .readable_reg = cs2000_readable_reg, 94 + .writeable_reg = cs2000_writeable_reg, 95 + .volatile_reg = cs2000_volatile_reg, 96 + }; 97 + 78 98 struct cs2000_priv { 79 99 struct clk_hw hw; 80 100 struct i2c_client *client; 81 101 struct clk *clk_in; 82 102 struct clk *ref_clk; 103 + struct regmap *regmap; 104 + 105 + bool dynamic_mode; 106 + bool lf_ratio; 107 + bool clk_skip; 83 108 84 109 /* suspend/resume */ 85 110 unsigned long saved_rate; ··· 127 94 }; 128 95 MODULE_DEVICE_TABLE(i2c, cs2000_id); 129 96 130 - #define cs2000_read(priv, addr) \ 131 - i2c_smbus_read_byte_data(priv_to_client(priv), addr) 132 - #define cs2000_write(priv, addr, val) \ 133 - i2c_smbus_write_byte_data(priv_to_client(priv), addr, val) 134 - 135 - static int cs2000_bset(struct cs2000_priv *priv, u8 addr, u8 mask, u8 val) 136 - { 137 - s32 data; 138 - 139 - data = cs2000_read(priv, addr); 140 - if (data < 0) 141 - return data; 142 - 143 - data &= ~mask; 144 - data |= (val & mask); 145 - 146 - return cs2000_write(priv, addr, data); 147 - } 148 - 149 97 static int cs2000_enable_dev_config(struct cs2000_priv *priv, bool enable) 150 98 { 151 99 int ret; 152 100 153 - ret = cs2000_bset(priv, DEVICE_CFG1, ENDEV1, 154 - enable ? ENDEV1 : 0); 101 + ret = regmap_update_bits(priv->regmap, DEVICE_CFG1, ENDEV1, 102 + enable ? ENDEV1 : 0); 155 103 if (ret < 0) 156 104 return ret; 157 105 158 - ret = cs2000_bset(priv, GLOBAL_CFG, ENDEV2, 159 - enable ? ENDEV2 : 0); 106 + ret = regmap_update_bits(priv->regmap, GLOBAL_CFG, ENDEV2, 107 + enable ? ENDEV2 : 0); 160 108 if (ret < 0) 161 109 return ret; 162 110 163 - ret = cs2000_bset(priv, FUNC_CFG1, CLKSKIPEN, 164 - enable ? CLKSKIPEN : 0); 165 - if (ret < 0) 166 - return ret; 167 - 168 - /* FIXME: for Static ratio mode */ 169 - ret = cs2000_bset(priv, FUNC_CFG2, LFRATIO_MASK, 170 - LFRATIO_12_20); 111 + ret = regmap_update_bits(priv->regmap, FUNC_CFG1, CLKSKIPEN, 112 + (enable && priv->clk_skip) ? CLKSKIPEN : 0); 171 113 if (ret < 0) 172 114 return ret; 173 115 174 116 return 0; 175 117 } 176 118 177 - static int cs2000_clk_in_bound_rate(struct cs2000_priv *priv, 178 - u32 rate_in) 119 + static int cs2000_ref_clk_bound_rate(struct cs2000_priv *priv, 120 + u32 rate_in) 179 121 { 180 122 u32 val; 181 123 ··· 163 155 else 164 156 return -EINVAL; 165 157 166 - return cs2000_bset(priv, FUNC_CFG1, 167 - REFCLKDIV_MASK, 168 - REFCLKDIV(val)); 158 + return regmap_update_bits(priv->regmap, FUNC_CFG1, 159 + REFCLKDIV_MASK, 160 + REFCLKDIV(val)); 169 161 } 170 162 171 163 static int cs2000_wait_pll_lock(struct cs2000_priv *priv) 172 164 { 173 165 struct device *dev = priv_to_dev(priv); 174 - s32 val; 175 - unsigned int i; 166 + unsigned int i, val; 167 + int ret; 176 168 177 169 for (i = 0; i < 256; i++) { 178 - val = cs2000_read(priv, DEVICE_CTRL); 179 - if (val < 0) 180 - return val; 170 + ret = regmap_read(priv->regmap, DEVICE_CTRL, &val); 171 + if (ret < 0) 172 + return ret; 181 173 if (!(val & PLL_UNLOCK)) 182 174 return 0; 183 175 udelay(1); ··· 191 183 static int cs2000_clk_out_enable(struct cs2000_priv *priv, bool enable) 192 184 { 193 185 /* enable both AUX_OUT, CLK_OUT */ 194 - return cs2000_bset(priv, DEVICE_CTRL, 195 - (AUXOUTDIS | CLKOUTDIS), 196 - enable ? 0 : 197 - (AUXOUTDIS | CLKOUTDIS)); 186 + return regmap_update_bits(priv->regmap, DEVICE_CTRL, 187 + (AUXOUTDIS | CLKOUTDIS), 188 + enable ? 0 : 189 + (AUXOUTDIS | CLKOUTDIS)); 198 190 } 199 191 200 - static u32 cs2000_rate_to_ratio(u32 rate_in, u32 rate_out) 192 + static u32 cs2000_rate_to_ratio(u32 rate_in, u32 rate_out, bool lf_ratio) 201 193 { 202 194 u64 ratio; 195 + u32 multiplier = lf_ratio ? 12 : 20; 203 196 204 197 /* 205 - * ratio = rate_out / rate_in * 2^20 198 + * ratio = rate_out / rate_in * 2^multiplier 206 199 * 207 200 * To avoid over flow, rate_out is u64. 208 201 * The result should be u32. 209 202 */ 210 - ratio = (u64)rate_out << 20; 203 + ratio = (u64)rate_out << multiplier; 211 204 do_div(ratio, rate_in); 212 205 213 206 return ratio; 214 207 } 215 208 216 - static unsigned long cs2000_ratio_to_rate(u32 ratio, u32 rate_in) 209 + static unsigned long cs2000_ratio_to_rate(u32 ratio, u32 rate_in, bool lf_ratio) 217 210 { 218 211 u64 rate_out; 212 + u32 multiplier = lf_ratio ? 12 : 20; 219 213 220 214 /* 221 - * ratio = rate_out / rate_in * 2^20 215 + * ratio = rate_out / rate_in * 2^multiplier 222 216 * 223 217 * To avoid over flow, rate_out is u64. 224 218 * The result should be u32 or unsigned long. 225 219 */ 226 220 227 221 rate_out = (u64)ratio * rate_in; 228 - return rate_out >> 20; 222 + return rate_out >> multiplier; 229 223 } 230 224 231 225 static int cs2000_ratio_set(struct cs2000_priv *priv, ··· 240 230 if (CH_SIZE_ERR(ch)) 241 231 return -EINVAL; 242 232 243 - val = cs2000_rate_to_ratio(rate_in, rate_out); 233 + val = cs2000_rate_to_ratio(rate_in, rate_out, priv->lf_ratio); 244 234 for (i = 0; i < RATIO_REG_SIZE; i++) { 245 - ret = cs2000_write(priv, 235 + ret = regmap_write(priv->regmap, 246 236 Ratio_Add(ch, i), 247 237 Ratio_Val(val, i)); 248 238 if (ret < 0) ··· 254 244 255 245 static u32 cs2000_ratio_get(struct cs2000_priv *priv, int ch) 256 246 { 257 - s32 tmp; 247 + unsigned int tmp, i; 258 248 u32 val; 259 - unsigned int i; 249 + int ret; 260 250 261 251 val = 0; 262 252 for (i = 0; i < RATIO_REG_SIZE; i++) { 263 - tmp = cs2000_read(priv, Ratio_Add(ch, i)); 264 - if (tmp < 0) 253 + ret = regmap_read(priv->regmap, Ratio_Add(ch, i), &tmp); 254 + if (ret < 0) 265 255 return 0; 266 256 267 257 val |= Val_Ratio(tmp, i); ··· 273 263 static int cs2000_ratio_select(struct cs2000_priv *priv, int ch) 274 264 { 275 265 int ret; 266 + u8 fracnsrc; 276 267 277 268 if (CH_SIZE_ERR(ch)) 278 269 return -EINVAL; 279 270 280 - /* 281 - * FIXME 282 - * 283 - * this driver supports static ratio mode only at this point. 284 - */ 285 - ret = cs2000_bset(priv, DEVICE_CFG1, RSEL_MASK, RSEL(ch)); 271 + ret = regmap_update_bits(priv->regmap, DEVICE_CFG1, RSEL_MASK, RSEL(ch)); 286 272 if (ret < 0) 287 273 return ret; 288 274 289 - ret = cs2000_bset(priv, DEVICE_CFG2, 290 - (AUTORMOD | LOCKCLK_MASK | FRACNSRC_MASK), 291 - (LOCKCLK(ch) | FRACNSRC_STATIC)); 275 + fracnsrc = priv->dynamic_mode ? FRACNSRC_DYNAMIC : FRACNSRC_STATIC; 276 + 277 + ret = regmap_update_bits(priv->regmap, DEVICE_CFG2, 278 + AUTORMOD | LOCKCLK_MASK | FRACNSRC_MASK, 279 + LOCKCLK(ch) | fracnsrc); 292 280 if (ret < 0) 293 281 return ret; 294 282 ··· 302 294 303 295 ratio = cs2000_ratio_get(priv, ch); 304 296 305 - return cs2000_ratio_to_rate(ratio, parent_rate); 297 + return cs2000_ratio_to_rate(ratio, parent_rate, priv->lf_ratio); 306 298 } 307 299 308 300 static long cs2000_round_rate(struct clk_hw *hw, unsigned long rate, 309 301 unsigned long *parent_rate) 310 302 { 303 + struct cs2000_priv *priv = hw_to_priv(hw); 311 304 u32 ratio; 312 305 313 - ratio = cs2000_rate_to_ratio(*parent_rate, rate); 306 + ratio = cs2000_rate_to_ratio(*parent_rate, rate, priv->lf_ratio); 314 307 315 - return cs2000_ratio_to_rate(ratio, *parent_rate); 308 + return cs2000_ratio_to_rate(ratio, *parent_rate, priv->lf_ratio); 309 + } 310 + 311 + static int cs2000_select_ratio_mode(struct cs2000_priv *priv, 312 + unsigned long rate, 313 + unsigned long parent_rate) 314 + { 315 + /* 316 + * From the datasheet: 317 + * 318 + * | It is recommended that the 12.20 High-Resolution format be 319 + * | utilized whenever the desired ratio is less than 4096 since 320 + * | the output frequency accuracy of the PLL is directly proportional 321 + * | to the accuracy of the timing reference clock and the resolution 322 + * | of the R_UD. 323 + * 324 + * This mode is only available in dynamic mode. 325 + */ 326 + priv->lf_ratio = priv->dynamic_mode && ((rate / parent_rate) > 4096); 327 + 328 + return regmap_update_bits(priv->regmap, FUNC_CFG2, LFRATIO_MASK, 329 + priv->lf_ratio ? LFRATIO_20_12 : LFRATIO_12_20); 316 330 } 317 331 318 332 static int __cs2000_set_rate(struct cs2000_priv *priv, int ch, ··· 343 313 { 344 314 int ret; 345 315 346 - ret = cs2000_clk_in_bound_rate(priv, parent_rate); 316 + ret = regmap_update_bits(priv->regmap, GLOBAL_CFG, FREEZE, FREEZE); 317 + if (ret < 0) 318 + return ret; 319 + 320 + ret = cs2000_select_ratio_mode(priv, rate, parent_rate); 347 321 if (ret < 0) 348 322 return ret; 349 323 ··· 356 322 return ret; 357 323 358 324 ret = cs2000_ratio_select(priv, ch); 325 + if (ret < 0) 326 + return ret; 327 + 328 + ret = regmap_update_bits(priv->regmap, GLOBAL_CFG, FREEZE, 0); 359 329 if (ret < 0) 360 330 return ret; 361 331 ··· 418 380 419 381 static u8 cs2000_get_parent(struct clk_hw *hw) 420 382 { 421 - /* always return REF_CLK */ 422 - return REF_CLK; 383 + struct cs2000_priv *priv = hw_to_priv(hw); 384 + 385 + /* 386 + * In dynamic mode, output rates are derived from CLK_IN. 387 + * In static mode, CLK_IN is ignored, so we return REF_CLK instead. 388 + */ 389 + return priv->dynamic_mode ? CLK_IN : REF_CLK; 423 390 } 424 391 425 392 static const struct clk_ops cs2000_ops = { ··· 464 421 struct clk_init_data init; 465 422 const char *name = np->name; 466 423 static const char *parent_names[CLK_MAX]; 424 + u32 aux_out = 0; 425 + int ref_clk_rate; 467 426 int ch = 0; /* it uses ch0 only at this point */ 468 - int rate; 469 427 int ret; 470 428 471 429 of_property_read_string(np, "clock-output-names", &name); 472 430 473 - /* 474 - * set default rate as 1/1. 475 - * otherwise .set_rate which setup ratio 476 - * is never called if user requests 1/1 rate 477 - */ 478 - rate = clk_get_rate(priv->ref_clk); 479 - ret = __cs2000_set_rate(priv, ch, rate, rate); 431 + priv->dynamic_mode = of_property_read_bool(np, "cirrus,dynamic-mode"); 432 + dev_info(dev, "operating in %s mode\n", 433 + priv->dynamic_mode ? "dynamic" : "static"); 434 + 435 + of_property_read_u32(np, "cirrus,aux-output-source", &aux_out); 436 + ret = regmap_update_bits(priv->regmap, DEVICE_CFG1, 437 + AUXOUTSRC_MASK, AUXOUTSRC(aux_out)); 480 438 if (ret < 0) 481 439 return ret; 440 + 441 + priv->clk_skip = of_property_read_bool(np, "cirrus,clock-skip"); 442 + 443 + ref_clk_rate = clk_get_rate(priv->ref_clk); 444 + ret = cs2000_ref_clk_bound_rate(priv, ref_clk_rate); 445 + if (ret < 0) 446 + return ret; 447 + 448 + if (priv->dynamic_mode) { 449 + /* Default to low-frequency mode to allow for large ratios */ 450 + priv->lf_ratio = true; 451 + } else { 452 + /* 453 + * set default rate as 1/1. 454 + * otherwise .set_rate which setup ratio 455 + * is never called if user requests 1/1 rate 456 + */ 457 + ret = __cs2000_set_rate(priv, ch, ref_clk_rate, ref_clk_rate); 458 + if (ret < 0) 459 + return ret; 460 + } 482 461 483 462 parent_names[CLK_IN] = __clk_get_name(priv->clk_in); 484 463 parent_names[REF_CLK] = __clk_get_name(priv->ref_clk); ··· 529 464 static int cs2000_version_print(struct cs2000_priv *priv) 530 465 { 531 466 struct device *dev = priv_to_dev(priv); 532 - s32 val; 533 467 const char *revision; 468 + unsigned int val; 469 + int ret; 534 470 535 - val = cs2000_read(priv, DEVICE_ID); 536 - if (val < 0) 537 - return val; 471 + ret = regmap_read(priv->regmap, DEVICE_ID, &val); 472 + if (ret < 0) 473 + return ret; 538 474 539 475 /* CS2000 should be 0x0 */ 540 476 if (val >> 3) ··· 583 517 584 518 priv->client = client; 585 519 i2c_set_clientdata(client, priv); 520 + 521 + priv->regmap = devm_regmap_init_i2c(client, &cs2000_regmap_config); 522 + if (IS_ERR(priv->regmap)) 523 + return PTR_ERR(priv->regmap); 586 524 587 525 ret = cs2000_clk_get(priv); 588 526 if (ret < 0)
+22
drivers/clk/clk-fixed-factor.c
··· 131 131 return hw; 132 132 } 133 133 134 + /** 135 + * devm_clk_hw_register_fixed_factor_index - Register a fixed factor clock with 136 + * parent from DT index 137 + * @dev: device that is registering this clock 138 + * @name: name of this clock 139 + * @index: index of phandle in @dev 'clocks' property 140 + * @flags: fixed factor flags 141 + * @mult: multiplier 142 + * @div: divider 143 + * 144 + * Return: Pointer to fixed factor clk_hw structure that was registered or 145 + * an error pointer. 146 + */ 147 + struct clk_hw *devm_clk_hw_register_fixed_factor_index(struct device *dev, 148 + const char *name, unsigned int index, unsigned long flags, 149 + unsigned int mult, unsigned int div) 150 + { 151 + return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, index, 152 + flags, mult, div, true); 153 + } 154 + EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_index); 155 + 134 156 struct clk_hw *clk_hw_register_fixed_factor(struct device *dev, 135 157 const char *name, const char *parent_name, unsigned long flags, 136 158 unsigned int mult, unsigned int div)
+464
drivers/clk/clk-gate_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Kunit test for clk gate basic type 4 + */ 5 + #include <linux/clk.h> 6 + #include <linux/clk-provider.h> 7 + #include <linux/platform_device.h> 8 + 9 + #include <kunit/test.h> 10 + 11 + static void clk_gate_register_test_dev(struct kunit *test) 12 + { 13 + struct clk_hw *ret; 14 + struct platform_device *pdev; 15 + 16 + pdev = platform_device_register_simple("test_gate_device", -1, NULL, 0); 17 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); 18 + 19 + ret = clk_hw_register_gate(&pdev->dev, "test_gate", NULL, 0, NULL, 20 + 0, 0, NULL); 21 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ret); 22 + KUNIT_EXPECT_STREQ(test, "test_gate", clk_hw_get_name(ret)); 23 + KUNIT_EXPECT_EQ(test, 0UL, clk_hw_get_flags(ret)); 24 + 25 + clk_hw_unregister_gate(ret); 26 + platform_device_put(pdev); 27 + } 28 + 29 + static void clk_gate_register_test_parent_names(struct kunit *test) 30 + { 31 + struct clk_hw *parent; 32 + struct clk_hw *ret; 33 + 34 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 35 + 1000000); 36 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 37 + 38 + ret = clk_hw_register_gate(NULL, "test_gate", "test_parent", 0, NULL, 39 + 0, 0, NULL); 40 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ret); 41 + KUNIT_EXPECT_PTR_EQ(test, parent, clk_hw_get_parent(ret)); 42 + 43 + clk_hw_unregister_gate(ret); 44 + clk_hw_unregister_fixed_rate(parent); 45 + } 46 + 47 + static void clk_gate_register_test_parent_data(struct kunit *test) 48 + { 49 + struct clk_hw *parent; 50 + struct clk_hw *ret; 51 + struct clk_parent_data pdata = { }; 52 + 53 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 54 + 1000000); 55 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 56 + pdata.hw = parent; 57 + 58 + ret = clk_hw_register_gate_parent_data(NULL, "test_gate", &pdata, 0, 59 + NULL, 0, 0, NULL); 60 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ret); 61 + KUNIT_EXPECT_PTR_EQ(test, parent, clk_hw_get_parent(ret)); 62 + 63 + clk_hw_unregister_gate(ret); 64 + clk_hw_unregister_fixed_rate(parent); 65 + } 66 + 67 + static void clk_gate_register_test_parent_data_legacy(struct kunit *test) 68 + { 69 + struct clk_hw *parent; 70 + struct clk_hw *ret; 71 + struct clk_parent_data pdata = { }; 72 + 73 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 74 + 1000000); 75 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 76 + pdata.name = "test_parent"; 77 + 78 + ret = clk_hw_register_gate_parent_data(NULL, "test_gate", &pdata, 0, 79 + NULL, 0, 0, NULL); 80 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ret); 81 + KUNIT_EXPECT_PTR_EQ(test, parent, clk_hw_get_parent(ret)); 82 + 83 + clk_hw_unregister_gate(ret); 84 + clk_hw_unregister_fixed_rate(parent); 85 + } 86 + 87 + static void clk_gate_register_test_parent_hw(struct kunit *test) 88 + { 89 + struct clk_hw *parent; 90 + struct clk_hw *ret; 91 + 92 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 93 + 1000000); 94 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 95 + 96 + ret = clk_hw_register_gate_parent_hw(NULL, "test_gate", parent, 0, NULL, 97 + 0, 0, NULL); 98 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ret); 99 + KUNIT_EXPECT_PTR_EQ(test, parent, clk_hw_get_parent(ret)); 100 + 101 + clk_hw_unregister_gate(ret); 102 + clk_hw_unregister_fixed_rate(parent); 103 + } 104 + 105 + static void clk_gate_register_test_hiword_invalid(struct kunit *test) 106 + { 107 + struct clk_hw *ret; 108 + 109 + ret = clk_hw_register_gate(NULL, "test_gate", NULL, 0, NULL, 110 + 20, CLK_GATE_HIWORD_MASK, NULL); 111 + 112 + KUNIT_EXPECT_TRUE(test, IS_ERR(ret)); 113 + } 114 + 115 + static struct kunit_case clk_gate_register_test_cases[] = { 116 + KUNIT_CASE(clk_gate_register_test_dev), 117 + KUNIT_CASE(clk_gate_register_test_parent_names), 118 + KUNIT_CASE(clk_gate_register_test_parent_data), 119 + KUNIT_CASE(clk_gate_register_test_parent_data_legacy), 120 + KUNIT_CASE(clk_gate_register_test_parent_hw), 121 + KUNIT_CASE(clk_gate_register_test_hiword_invalid), 122 + {} 123 + }; 124 + 125 + static struct kunit_suite clk_gate_register_test_suite = { 126 + .name = "clk-gate-register-test", 127 + .test_cases = clk_gate_register_test_cases, 128 + }; 129 + 130 + struct clk_gate_test_context { 131 + void __iomem *fake_mem; 132 + struct clk_hw *hw; 133 + struct clk_hw *parent; 134 + u32 fake_reg; /* Keep at end, KASAN can detect out of bounds */ 135 + }; 136 + 137 + static struct clk_gate_test_context *clk_gate_test_alloc_ctx(struct kunit *test) 138 + { 139 + struct clk_gate_test_context *ctx; 140 + 141 + test->priv = ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 142 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); 143 + ctx->fake_mem = (void __force __iomem *)&ctx->fake_reg; 144 + 145 + return ctx; 146 + } 147 + 148 + static void clk_gate_test_parent_rate(struct kunit *test) 149 + { 150 + struct clk_gate_test_context *ctx = test->priv; 151 + struct clk_hw *parent = ctx->parent; 152 + struct clk_hw *hw = ctx->hw; 153 + unsigned long prate = clk_hw_get_rate(parent); 154 + unsigned long rate = clk_hw_get_rate(hw); 155 + 156 + KUNIT_EXPECT_EQ(test, prate, rate); 157 + } 158 + 159 + static void clk_gate_test_enable(struct kunit *test) 160 + { 161 + struct clk_gate_test_context *ctx = test->priv; 162 + struct clk_hw *parent = ctx->parent; 163 + struct clk_hw *hw = ctx->hw; 164 + struct clk *clk = hw->clk; 165 + u32 enable_val = BIT(5); 166 + 167 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 168 + 169 + KUNIT_EXPECT_EQ(test, enable_val, ctx->fake_reg); 170 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(hw)); 171 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(hw)); 172 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(parent)); 173 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(parent)); 174 + } 175 + 176 + static void clk_gate_test_disable(struct kunit *test) 177 + { 178 + struct clk_gate_test_context *ctx = test->priv; 179 + struct clk_hw *parent = ctx->parent; 180 + struct clk_hw *hw = ctx->hw; 181 + struct clk *clk = hw->clk; 182 + u32 enable_val = BIT(5); 183 + u32 disable_val = 0; 184 + 185 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 186 + KUNIT_ASSERT_EQ(test, enable_val, ctx->fake_reg); 187 + 188 + clk_disable_unprepare(clk); 189 + KUNIT_EXPECT_EQ(test, disable_val, ctx->fake_reg); 190 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(hw)); 191 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(hw)); 192 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(parent)); 193 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(parent)); 194 + } 195 + 196 + static struct kunit_case clk_gate_test_cases[] = { 197 + KUNIT_CASE(clk_gate_test_parent_rate), 198 + KUNIT_CASE(clk_gate_test_enable), 199 + KUNIT_CASE(clk_gate_test_disable), 200 + {} 201 + }; 202 + 203 + static int clk_gate_test_init(struct kunit *test) 204 + { 205 + struct clk_hw *parent; 206 + struct clk_hw *hw; 207 + struct clk_gate_test_context *ctx; 208 + 209 + ctx = clk_gate_test_alloc_ctx(test); 210 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 211 + 2000000); 212 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 213 + 214 + hw = clk_hw_register_gate_parent_hw(NULL, "test_gate", parent, 0, 215 + ctx->fake_mem, 5, 0, NULL); 216 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 217 + 218 + ctx->hw = hw; 219 + ctx->parent = parent; 220 + 221 + return 0; 222 + } 223 + 224 + static void clk_gate_test_exit(struct kunit *test) 225 + { 226 + struct clk_gate_test_context *ctx = test->priv; 227 + 228 + clk_hw_unregister_gate(ctx->hw); 229 + clk_hw_unregister_fixed_rate(ctx->parent); 230 + } 231 + 232 + static struct kunit_suite clk_gate_test_suite = { 233 + .name = "clk-gate-test", 234 + .init = clk_gate_test_init, 235 + .exit = clk_gate_test_exit, 236 + .test_cases = clk_gate_test_cases, 237 + }; 238 + 239 + static void clk_gate_test_invert_enable(struct kunit *test) 240 + { 241 + struct clk_gate_test_context *ctx = test->priv; 242 + struct clk_hw *parent = ctx->parent; 243 + struct clk_hw *hw = ctx->hw; 244 + struct clk *clk = hw->clk; 245 + u32 enable_val = 0; 246 + 247 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 248 + 249 + KUNIT_EXPECT_EQ(test, enable_val, ctx->fake_reg); 250 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(hw)); 251 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(hw)); 252 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(parent)); 253 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(parent)); 254 + } 255 + 256 + static void clk_gate_test_invert_disable(struct kunit *test) 257 + { 258 + struct clk_gate_test_context *ctx = test->priv; 259 + struct clk_hw *parent = ctx->parent; 260 + struct clk_hw *hw = ctx->hw; 261 + struct clk *clk = hw->clk; 262 + u32 enable_val = 0; 263 + u32 disable_val = BIT(15); 264 + 265 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 266 + KUNIT_ASSERT_EQ(test, enable_val, ctx->fake_reg); 267 + 268 + clk_disable_unprepare(clk); 269 + KUNIT_EXPECT_EQ(test, disable_val, ctx->fake_reg); 270 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(hw)); 271 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(hw)); 272 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(parent)); 273 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(parent)); 274 + } 275 + 276 + static struct kunit_case clk_gate_test_invert_cases[] = { 277 + KUNIT_CASE(clk_gate_test_invert_enable), 278 + KUNIT_CASE(clk_gate_test_invert_disable), 279 + {} 280 + }; 281 + 282 + static int clk_gate_test_invert_init(struct kunit *test) 283 + { 284 + struct clk_hw *parent; 285 + struct clk_hw *hw; 286 + struct clk_gate_test_context *ctx; 287 + 288 + ctx = clk_gate_test_alloc_ctx(test); 289 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 290 + 2000000); 291 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 292 + 293 + ctx->fake_reg = BIT(15); /* Default to off */ 294 + hw = clk_hw_register_gate_parent_hw(NULL, "test_gate", parent, 0, 295 + ctx->fake_mem, 15, 296 + CLK_GATE_SET_TO_DISABLE, NULL); 297 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 298 + 299 + ctx->hw = hw; 300 + ctx->parent = parent; 301 + 302 + return 0; 303 + } 304 + 305 + static struct kunit_suite clk_gate_test_invert_suite = { 306 + .name = "clk-gate-invert-test", 307 + .init = clk_gate_test_invert_init, 308 + .exit = clk_gate_test_exit, 309 + .test_cases = clk_gate_test_invert_cases, 310 + }; 311 + 312 + static void clk_gate_test_hiword_enable(struct kunit *test) 313 + { 314 + struct clk_gate_test_context *ctx = test->priv; 315 + struct clk_hw *parent = ctx->parent; 316 + struct clk_hw *hw = ctx->hw; 317 + struct clk *clk = hw->clk; 318 + u32 enable_val = BIT(9) | BIT(9 + 16); 319 + 320 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 321 + 322 + KUNIT_EXPECT_EQ(test, enable_val, ctx->fake_reg); 323 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(hw)); 324 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(hw)); 325 + KUNIT_EXPECT_TRUE(test, clk_hw_is_enabled(parent)); 326 + KUNIT_EXPECT_TRUE(test, clk_hw_is_prepared(parent)); 327 + } 328 + 329 + static void clk_gate_test_hiword_disable(struct kunit *test) 330 + { 331 + struct clk_gate_test_context *ctx = test->priv; 332 + struct clk_hw *parent = ctx->parent; 333 + struct clk_hw *hw = ctx->hw; 334 + struct clk *clk = hw->clk; 335 + u32 enable_val = BIT(9) | BIT(9 + 16); 336 + u32 disable_val = BIT(9 + 16); 337 + 338 + KUNIT_ASSERT_EQ(test, clk_prepare_enable(clk), 0); 339 + KUNIT_ASSERT_EQ(test, enable_val, ctx->fake_reg); 340 + 341 + clk_disable_unprepare(clk); 342 + KUNIT_EXPECT_EQ(test, disable_val, ctx->fake_reg); 343 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(hw)); 344 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(hw)); 345 + KUNIT_EXPECT_FALSE(test, clk_hw_is_enabled(parent)); 346 + KUNIT_EXPECT_FALSE(test, clk_hw_is_prepared(parent)); 347 + } 348 + 349 + static struct kunit_case clk_gate_test_hiword_cases[] = { 350 + KUNIT_CASE(clk_gate_test_hiword_enable), 351 + KUNIT_CASE(clk_gate_test_hiword_disable), 352 + {} 353 + }; 354 + 355 + static int clk_gate_test_hiword_init(struct kunit *test) 356 + { 357 + struct clk_hw *parent; 358 + struct clk_hw *hw; 359 + struct clk_gate_test_context *ctx; 360 + 361 + ctx = clk_gate_test_alloc_ctx(test); 362 + parent = clk_hw_register_fixed_rate(NULL, "test_parent", NULL, 0, 363 + 2000000); 364 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 365 + 366 + hw = clk_hw_register_gate_parent_hw(NULL, "test_gate", parent, 0, 367 + ctx->fake_mem, 9, 368 + CLK_GATE_HIWORD_MASK, NULL); 369 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 370 + 371 + ctx->hw = hw; 372 + ctx->parent = parent; 373 + 374 + return 0; 375 + } 376 + 377 + static struct kunit_suite clk_gate_test_hiword_suite = { 378 + .name = "clk-gate-hiword-test", 379 + .init = clk_gate_test_hiword_init, 380 + .exit = clk_gate_test_exit, 381 + .test_cases = clk_gate_test_hiword_cases, 382 + }; 383 + 384 + static void clk_gate_test_is_enabled(struct kunit *test) 385 + { 386 + struct clk_hw *hw; 387 + struct clk_gate_test_context *ctx; 388 + 389 + ctx = clk_gate_test_alloc_ctx(test); 390 + ctx->fake_reg = BIT(7); 391 + hw = clk_hw_register_gate(NULL, "test_gate", NULL, 0, ctx->fake_mem, 7, 392 + 0, NULL); 393 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 394 + KUNIT_ASSERT_TRUE(test, clk_hw_is_enabled(hw)); 395 + 396 + clk_hw_unregister_gate(hw); 397 + } 398 + 399 + static void clk_gate_test_is_disabled(struct kunit *test) 400 + { 401 + struct clk_hw *hw; 402 + struct clk_gate_test_context *ctx; 403 + 404 + ctx = clk_gate_test_alloc_ctx(test); 405 + ctx->fake_reg = BIT(4); 406 + hw = clk_hw_register_gate(NULL, "test_gate", NULL, 0, ctx->fake_mem, 7, 407 + 0, NULL); 408 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 409 + KUNIT_ASSERT_FALSE(test, clk_hw_is_enabled(hw)); 410 + 411 + clk_hw_unregister_gate(hw); 412 + } 413 + 414 + static void clk_gate_test_is_enabled_inverted(struct kunit *test) 415 + { 416 + struct clk_hw *hw; 417 + struct clk_gate_test_context *ctx; 418 + 419 + ctx = clk_gate_test_alloc_ctx(test); 420 + ctx->fake_reg = BIT(31); 421 + hw = clk_hw_register_gate(NULL, "test_gate", NULL, 0, ctx->fake_mem, 2, 422 + CLK_GATE_SET_TO_DISABLE, NULL); 423 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 424 + KUNIT_ASSERT_TRUE(test, clk_hw_is_enabled(hw)); 425 + 426 + clk_hw_unregister_gate(hw); 427 + } 428 + 429 + static void clk_gate_test_is_disabled_inverted(struct kunit *test) 430 + { 431 + struct clk_hw *hw; 432 + struct clk_gate_test_context *ctx; 433 + 434 + ctx = clk_gate_test_alloc_ctx(test); 435 + ctx->fake_reg = BIT(29); 436 + hw = clk_hw_register_gate(NULL, "test_gate", NULL, 0, ctx->fake_mem, 29, 437 + CLK_GATE_SET_TO_DISABLE, NULL); 438 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 439 + KUNIT_ASSERT_FALSE(test, clk_hw_is_enabled(hw)); 440 + 441 + clk_hw_unregister_gate(hw); 442 + } 443 + 444 + static struct kunit_case clk_gate_test_enabled_cases[] = { 445 + KUNIT_CASE(clk_gate_test_is_enabled), 446 + KUNIT_CASE(clk_gate_test_is_disabled), 447 + KUNIT_CASE(clk_gate_test_is_enabled_inverted), 448 + KUNIT_CASE(clk_gate_test_is_disabled_inverted), 449 + {} 450 + }; 451 + 452 + static struct kunit_suite clk_gate_test_enabled_suite = { 453 + .name = "clk-gate-is_enabled-test", 454 + .test_cases = clk_gate_test_enabled_cases, 455 + }; 456 + 457 + kunit_test_suites( 458 + &clk_gate_register_test_suite, 459 + &clk_gate_test_suite, 460 + &clk_gate_test_invert_suite, 461 + &clk_gate_test_hiword_suite, 462 + &clk_gate_test_enabled_suite 463 + ); 464 + MODULE_LICENSE("GPL v2");
+322
drivers/clk/clk-renesas-pcie.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Driver for Renesas 9-series PCIe clock generator driver 4 + * 5 + * The following series can be supported: 6 + * - 9FGV/9DBV/9DMV/9FGL/9DML/9QXL/9SQ 7 + * Currently supported: 8 + * - 9FGV0241 9 + * 10 + * Copyright (C) 2022 Marek Vasut <marex@denx.de> 11 + */ 12 + 13 + #include <linux/clk-provider.h> 14 + #include <linux/i2c.h> 15 + #include <linux/mod_devicetable.h> 16 + #include <linux/module.h> 17 + #include <linux/of.h> 18 + #include <linux/regmap.h> 19 + 20 + #define RS9_REG_OE 0x0 21 + #define RS9_REG_OE_DIF_OE(n) BIT((n) + 1) 22 + #define RS9_REG_SS 0x1 23 + #define RS9_REG_SS_AMP_0V6 0x0 24 + #define RS9_REG_SS_AMP_0V7 0x1 25 + #define RS9_REG_SS_AMP_0V8 0x2 26 + #define RS9_REG_SS_AMP_0V9 0x3 27 + #define RS9_REG_SS_AMP_MASK 0x3 28 + #define RS9_REG_SS_SSC_100 0 29 + #define RS9_REG_SS_SSC_M025 (1 << 3) 30 + #define RS9_REG_SS_SSC_M050 (3 << 3) 31 + #define RS9_REG_SS_SSC_MASK (3 << 3) 32 + #define RS9_REG_SS_SSC_LOCK BIT(5) 33 + #define RS9_REG_SR 0x2 34 + #define RS9_REG_SR_2V0_DIF(n) 0 35 + #define RS9_REG_SR_3V0_DIF(n) BIT((n) + 1) 36 + #define RS9_REG_SR_DIF_MASK(n) BIT((n) + 1) 37 + #define RS9_REG_REF 0x3 38 + #define RS9_REG_REF_OE BIT(4) 39 + #define RS9_REG_REF_OD BIT(5) 40 + #define RS9_REG_REF_SR_SLOWEST 0 41 + #define RS9_REG_REF_SR_SLOW (1 << 6) 42 + #define RS9_REG_REF_SR_FAST (2 << 6) 43 + #define RS9_REG_REF_SR_FASTER (3 << 6) 44 + #define RS9_REG_VID 0x5 45 + #define RS9_REG_DID 0x6 46 + #define RS9_REG_BCP 0x7 47 + 48 + /* Supported Renesas 9-series models. */ 49 + enum rs9_model { 50 + RENESAS_9FGV0241, 51 + }; 52 + 53 + /* Structure to describe features of a particular 9-series model */ 54 + struct rs9_chip_info { 55 + const enum rs9_model model; 56 + unsigned int num_clks; 57 + }; 58 + 59 + struct rs9_driver_data { 60 + struct i2c_client *client; 61 + struct regmap *regmap; 62 + const struct rs9_chip_info *chip_info; 63 + struct clk *pin_xin; 64 + struct clk_hw *clk_dif[2]; 65 + u8 pll_amplitude; 66 + u8 pll_ssc; 67 + u8 clk_dif_sr; 68 + }; 69 + 70 + /* 71 + * Renesas 9-series i2c regmap 72 + */ 73 + static const struct regmap_range rs9_readable_ranges[] = { 74 + regmap_reg_range(RS9_REG_OE, RS9_REG_REF), 75 + regmap_reg_range(RS9_REG_VID, RS9_REG_BCP), 76 + }; 77 + 78 + static const struct regmap_access_table rs9_readable_table = { 79 + .yes_ranges = rs9_readable_ranges, 80 + .n_yes_ranges = ARRAY_SIZE(rs9_readable_ranges), 81 + }; 82 + 83 + static const struct regmap_range rs9_writeable_ranges[] = { 84 + regmap_reg_range(RS9_REG_OE, RS9_REG_REF), 85 + regmap_reg_range(RS9_REG_BCP, RS9_REG_BCP), 86 + }; 87 + 88 + static const struct regmap_access_table rs9_writeable_table = { 89 + .yes_ranges = rs9_writeable_ranges, 90 + .n_yes_ranges = ARRAY_SIZE(rs9_writeable_ranges), 91 + }; 92 + 93 + static const struct regmap_config rs9_regmap_config = { 94 + .reg_bits = 8, 95 + .val_bits = 8, 96 + .cache_type = REGCACHE_FLAT, 97 + .max_register = 0x8, 98 + .rd_table = &rs9_readable_table, 99 + .wr_table = &rs9_writeable_table, 100 + }; 101 + 102 + static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx) 103 + { 104 + struct i2c_client *client = rs9->client; 105 + unsigned char name[5] = "DIF0"; 106 + struct device_node *np; 107 + int ret; 108 + u32 sr; 109 + 110 + /* Set defaults */ 111 + rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx); 112 + rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx); 113 + 114 + snprintf(name, 5, "DIF%d", idx); 115 + np = of_get_child_by_name(client->dev.of_node, name); 116 + if (!np) 117 + return 0; 118 + 119 + /* Output clock slew rate */ 120 + ret = of_property_read_u32(np, "renesas,slew-rate", &sr); 121 + of_node_put(np); 122 + if (!ret) { 123 + if (sr == 2000000) { /* 2V/ns */ 124 + rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx); 125 + rs9->clk_dif_sr |= RS9_REG_SR_2V0_DIF(idx); 126 + } else if (sr == 3000000) { /* 3V/ns (default) */ 127 + rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx); 128 + rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx); 129 + } else 130 + ret = dev_err_probe(&client->dev, -EINVAL, 131 + "Invalid renesas,slew-rate value\n"); 132 + } 133 + 134 + return ret; 135 + } 136 + 137 + static int rs9_get_common_config(struct rs9_driver_data *rs9) 138 + { 139 + struct i2c_client *client = rs9->client; 140 + struct device_node *np = client->dev.of_node; 141 + unsigned int amp, ssc; 142 + int ret; 143 + 144 + /* Set defaults */ 145 + rs9->pll_amplitude = RS9_REG_SS_AMP_0V7; 146 + rs9->pll_ssc = RS9_REG_SS_SSC_100; 147 + 148 + /* Output clock amplitude */ 149 + ret = of_property_read_u32(np, "renesas,out-amplitude-microvolt", 150 + &amp); 151 + if (!ret) { 152 + if (amp == 600000) /* 0.6V */ 153 + rs9->pll_amplitude = RS9_REG_SS_AMP_0V6; 154 + else if (amp == 700000) /* 0.7V (default) */ 155 + rs9->pll_amplitude = RS9_REG_SS_AMP_0V7; 156 + else if (amp == 800000) /* 0.8V */ 157 + rs9->pll_amplitude = RS9_REG_SS_AMP_0V8; 158 + else if (amp == 900000) /* 0.9V */ 159 + rs9->pll_amplitude = RS9_REG_SS_AMP_0V9; 160 + else 161 + return dev_err_probe(&client->dev, -EINVAL, 162 + "Invalid renesas,out-amplitude-microvolt value\n"); 163 + } 164 + 165 + /* Output clock spread spectrum */ 166 + ret = of_property_read_u32(np, "renesas,out-spread-spectrum", &ssc); 167 + if (!ret) { 168 + if (ssc == 100000) /* 100% ... no spread (default) */ 169 + rs9->pll_ssc = RS9_REG_SS_SSC_100; 170 + else if (ssc == 99750) /* -0.25% ... down spread */ 171 + rs9->pll_ssc = RS9_REG_SS_SSC_M025; 172 + else if (ssc == 99500) /* -0.50% ... down spread */ 173 + rs9->pll_ssc = RS9_REG_SS_SSC_M050; 174 + else 175 + return dev_err_probe(&client->dev, -EINVAL, 176 + "Invalid renesas,out-spread-spectrum value\n"); 177 + } 178 + 179 + return 0; 180 + } 181 + 182 + static void rs9_update_config(struct rs9_driver_data *rs9) 183 + { 184 + int i; 185 + 186 + /* If amplitude is non-default, update it. */ 187 + if (rs9->pll_amplitude != RS9_REG_SS_AMP_0V7) { 188 + regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_AMP_MASK, 189 + rs9->pll_amplitude); 190 + } 191 + 192 + /* If SSC is non-default, update it. */ 193 + if (rs9->pll_ssc != RS9_REG_SS_SSC_100) { 194 + regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_SSC_MASK, 195 + rs9->pll_ssc); 196 + } 197 + 198 + for (i = 0; i < rs9->chip_info->num_clks; i++) { 199 + if (rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i)) 200 + continue; 201 + 202 + regmap_update_bits(rs9->regmap, RS9_REG_SR, RS9_REG_SR_3V0_DIF(i), 203 + rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i)); 204 + } 205 + } 206 + 207 + static struct clk_hw * 208 + rs9_of_clk_get(struct of_phandle_args *clkspec, void *data) 209 + { 210 + struct rs9_driver_data *rs9 = data; 211 + unsigned int idx = clkspec->args[0]; 212 + 213 + return rs9->clk_dif[idx]; 214 + } 215 + 216 + static int rs9_probe(struct i2c_client *client, const struct i2c_device_id *id) 217 + { 218 + unsigned char name[5] = "DIF0"; 219 + struct rs9_driver_data *rs9; 220 + struct clk_hw *hw; 221 + int i, ret; 222 + 223 + rs9 = devm_kzalloc(&client->dev, sizeof(*rs9), GFP_KERNEL); 224 + if (!rs9) 225 + return -ENOMEM; 226 + 227 + i2c_set_clientdata(client, rs9); 228 + rs9->client = client; 229 + rs9->chip_info = device_get_match_data(&client->dev); 230 + if (!rs9->chip_info) 231 + return -EINVAL; 232 + 233 + /* Fetch common configuration from DT (if specified) */ 234 + ret = rs9_get_common_config(rs9); 235 + if (ret) 236 + return ret; 237 + 238 + /* Fetch DIFx output configuration from DT (if specified) */ 239 + for (i = 0; i < rs9->chip_info->num_clks; i++) { 240 + ret = rs9_get_output_config(rs9, i); 241 + if (ret) 242 + return ret; 243 + } 244 + 245 + rs9->regmap = devm_regmap_init_i2c(client, &rs9_regmap_config); 246 + if (IS_ERR(rs9->regmap)) 247 + return dev_err_probe(&client->dev, PTR_ERR(rs9->regmap), 248 + "Failed to allocate register map\n"); 249 + 250 + /* Register clock */ 251 + for (i = 0; i < rs9->chip_info->num_clks; i++) { 252 + snprintf(name, 5, "DIF%d", i); 253 + hw = devm_clk_hw_register_fixed_factor_index(&client->dev, name, 254 + 0, 0, 4, 1); 255 + if (IS_ERR(hw)) 256 + return PTR_ERR(hw); 257 + 258 + rs9->clk_dif[i] = hw; 259 + } 260 + 261 + ret = devm_of_clk_add_hw_provider(&client->dev, rs9_of_clk_get, rs9); 262 + if (!ret) 263 + rs9_update_config(rs9); 264 + 265 + return ret; 266 + } 267 + 268 + static int __maybe_unused rs9_suspend(struct device *dev) 269 + { 270 + struct rs9_driver_data *rs9 = dev_get_drvdata(dev); 271 + 272 + regcache_cache_only(rs9->regmap, true); 273 + regcache_mark_dirty(rs9->regmap); 274 + 275 + return 0; 276 + } 277 + 278 + static int __maybe_unused rs9_resume(struct device *dev) 279 + { 280 + struct rs9_driver_data *rs9 = dev_get_drvdata(dev); 281 + int ret; 282 + 283 + regcache_cache_only(rs9->regmap, false); 284 + ret = regcache_sync(rs9->regmap); 285 + if (ret) 286 + dev_err(dev, "Failed to restore register map: %d\n", ret); 287 + return ret; 288 + } 289 + 290 + static const struct rs9_chip_info renesas_9fgv0241_info = { 291 + .model = RENESAS_9FGV0241, 292 + .num_clks = 2, 293 + }; 294 + 295 + static const struct i2c_device_id rs9_id[] = { 296 + { "9fgv0241", .driver_data = RENESAS_9FGV0241 }, 297 + { } 298 + }; 299 + MODULE_DEVICE_TABLE(i2c, rs9_id); 300 + 301 + static const struct of_device_id clk_rs9_of_match[] = { 302 + { .compatible = "renesas,9fgv0241", .data = &renesas_9fgv0241_info }, 303 + { } 304 + }; 305 + MODULE_DEVICE_TABLE(of, clk_rs9_of_match); 306 + 307 + static SIMPLE_DEV_PM_OPS(rs9_pm_ops, rs9_suspend, rs9_resume); 308 + 309 + static struct i2c_driver rs9_driver = { 310 + .driver = { 311 + .name = "clk-renesas-pcie-9series", 312 + .pm = &rs9_pm_ops, 313 + .of_match_table = clk_rs9_of_match, 314 + }, 315 + .probe = rs9_probe, 316 + .id_table = rs9_id, 317 + }; 318 + module_i2c_driver(rs9_driver); 319 + 320 + MODULE_AUTHOR("Marek Vasut <marex@denx.de>"); 321 + MODULE_DESCRIPTION("Renesas 9-series PCIe clock generator driver"); 322 + MODULE_LICENSE("GPL");
+6 -1
drivers/clk/renesas/Kconfig
··· 34 34 select CLK_R8A779F0 if ARCH_R8A779F0 35 35 select CLK_R9A06G032 if ARCH_R9A06G032 36 36 select CLK_R9A07G044 if ARCH_R9A07G044 37 + select CLK_R9A07G054 if ARCH_R9A07G054 37 38 select CLK_SH73A0 if ARCH_SH73A0 38 39 39 40 if CLK_RENESAS ··· 164 163 bool "RZ/G2L clock support" if COMPILE_TEST 165 164 select CLK_RZG2L 166 165 166 + config CLK_R9A07G054 167 + bool "RZ/V2L clock support" if COMPILE_TEST 168 + select CLK_RZG2L 169 + 167 170 config CLK_SH73A0 168 171 bool "SH-Mobile AG5 clock support" if COMPILE_TEST 169 172 select CLK_RENESAS_CPG_MSTP ··· 200 195 This is a driver for R-Car USB2 clock selector 201 196 202 197 config CLK_RZG2L 203 - bool "Renesas RZ/G2L family clock support" if COMPILE_TEST 198 + bool "Renesas RZ/{G2L,V2L} family clock support" if COMPILE_TEST 204 199 select RESET_CONTROLLER 205 200 206 201 # Generic
+1
drivers/clk/renesas/Makefile
··· 31 31 obj-$(CONFIG_CLK_R8A779F0) += r8a779f0-cpg-mssr.o 32 32 obj-$(CONFIG_CLK_R9A06G032) += r9a06g032-clocks.o 33 33 obj-$(CONFIG_CLK_R9A07G044) += r9a07g044-cpg.o 34 + obj-$(CONFIG_CLK_R9A07G054) += r9a07g044-cpg.o 34 35 obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o 35 36 36 37 # Family
+1
drivers/clk/renesas/r8a77990-cpg-mssr.c
··· 200 200 DEF_MOD("du0", 724, R8A77990_CLK_S1D1), 201 201 DEF_MOD("lvds", 727, R8A77990_CLK_S2D1), 202 202 203 + DEF_MOD("mlp", 802, R8A77990_CLK_S2D1), 203 204 DEF_MOD("vin5", 806, R8A77990_CLK_S1D2), 204 205 DEF_MOD("vin4", 807, R8A77990_CLK_S1D2), 205 206 DEF_MOD("etheravb", 812, R8A77990_CLK_S3D2),
+1
drivers/clk/renesas/r8a77995-cpg-mssr.c
··· 160 160 DEF_MOD("du1", 723, R8A77995_CLK_S1D1), 161 161 DEF_MOD("du0", 724, R8A77995_CLK_S1D1), 162 162 DEF_MOD("lvds", 727, R8A77995_CLK_S2D1), 163 + DEF_MOD("mlp", 802, R8A77995_CLK_S2D1), 163 164 DEF_MOD("vin4", 807, R8A77995_CLK_S1D2), 164 165 DEF_MOD("etheravb", 812, R8A77995_CLK_S3D2), 165 166 DEF_MOD("imr0", 823, R8A77995_CLK_S1D2),
+1
drivers/clk/renesas/r8a779a0-cpg-mssr.c
··· 136 136 DEF_MOD("avb3", 214, R8A779A0_CLK_S3D2), 137 137 DEF_MOD("avb4", 215, R8A779A0_CLK_S3D2), 138 138 DEF_MOD("avb5", 216, R8A779A0_CLK_S3D2), 139 + DEF_MOD("canfd0", 328, R8A779A0_CLK_CANFD), 139 140 DEF_MOD("csi40", 331, R8A779A0_CLK_CSI0), 140 141 DEF_MOD("csi41", 400, R8A779A0_CLK_CSI0), 141 142 DEF_MOD("csi42", 401, R8A779A0_CLK_CSI0),
+19 -1
drivers/clk/renesas/r8a779f0-cpg-mssr.c
··· 103 103 DEF_FIXED("s0d12_hsc", R8A779F0_CLK_S0D12_HSC, CLK_S0, 12, 1), 104 104 DEF_FIXED("cl16m_hsc", R8A779F0_CLK_CL16M_HSC, CLK_S0, 48, 1), 105 105 DEF_FIXED("s0d2_cc", R8A779F0_CLK_S0D2_CC, CLK_S0, 2, 1), 106 - DEF_FIXED("rsw2", R8A779F0_CLK_RSW2, CLK_PLL5, 2, 1), 106 + DEF_FIXED("rsw2", R8A779F0_CLK_RSW2, CLK_PLL5_DIV2, 5, 1), 107 107 DEF_FIXED("cbfusa", R8A779F0_CLK_CBFUSA, CLK_EXTAL, 2, 1), 108 108 DEF_FIXED("cpex", R8A779F0_CLK_CPEX, CLK_EXTAL, 2, 1), 109 109 ··· 115 115 }; 116 116 117 117 static const struct mssr_mod_clk r8a779f0_mod_clks[] __initconst = { 118 + DEF_MOD("i2c0", 518, R8A779F0_CLK_S0D6_PER), 119 + DEF_MOD("i2c1", 519, R8A779F0_CLK_S0D6_PER), 120 + DEF_MOD("i2c2", 520, R8A779F0_CLK_S0D6_PER), 121 + DEF_MOD("i2c3", 521, R8A779F0_CLK_S0D6_PER), 122 + DEF_MOD("i2c4", 522, R8A779F0_CLK_S0D6_PER), 123 + DEF_MOD("i2c5", 523, R8A779F0_CLK_S0D6_PER), 118 124 DEF_MOD("scif0", 702, R8A779F0_CLK_S0D12_PER), 119 125 DEF_MOD("scif1", 703, R8A779F0_CLK_S0D12_PER), 120 126 DEF_MOD("scif3", 704, R8A779F0_CLK_S0D12_PER), 121 127 DEF_MOD("scif4", 705, R8A779F0_CLK_S0D12_PER), 128 + DEF_MOD("sys-dmac0", 709, R8A779F0_CLK_S0D3_PER), 129 + DEF_MOD("sys-dmac1", 710, R8A779F0_CLK_S0D3_PER), 130 + DEF_MOD("wdt", 907, R8A779F0_CLK_R), 131 + DEF_MOD("pfc0", 915, R8A779F0_CLK_CL16M), 132 + }; 133 + 134 + static const unsigned int r8a779f0_crit_mod_clks[] __initconst = { 135 + MOD_CLK_ID(907), /* WDT */ 122 136 }; 123 137 124 138 /* ··· 188 174 .mod_clks = r8a779f0_mod_clks, 189 175 .num_mod_clks = ARRAY_SIZE(r8a779f0_mod_clks), 190 176 .num_hw_mod_clks = 28 * 32, 177 + 178 + /* Critical Module Clocks */ 179 + .crit_mod_clks = r8a779f0_crit_mod_clks, 180 + .num_crit_mod_clks = ARRAY_SIZE(r8a779f0_crit_mod_clks), 191 181 192 182 /* Callbacks */ 193 183 .init = r8a779f0_cpg_mssr_init,
+236 -190
drivers/clk/renesas/r9a07g044-cpg.c
··· 11 11 #include <linux/kernel.h> 12 12 13 13 #include <dt-bindings/clock/r9a07g044-cpg.h> 14 + #include <dt-bindings/clock/r9a07g054-cpg.h> 14 15 15 16 #include "rzg2l-cpg.h" 16 17 17 18 enum clk_ids { 18 19 /* Core Clock Outputs exported to DT */ 19 - LAST_DT_CORE_CLK = R9A07G044_CLK_P0_DIV2, 20 + LAST_DT_CORE_CLK = R9A07G054_CLK_DRP_A, 20 21 21 22 /* External Input Clocks */ 22 23 CLK_EXTAL, ··· 81 80 static const char * const sel_shdi[] = { ".clk_533", ".clk_400", ".clk_266" }; 82 81 static const char * const sel_gpu2[] = { ".pll6", ".pll3_div2_2" }; 83 82 84 - static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = { 85 - /* External Clock Inputs */ 86 - DEF_INPUT("extal", CLK_EXTAL), 83 + static const struct { 84 + struct cpg_core_clk common[44]; 85 + #ifdef CONFIG_CLK_R9A07G054 86 + struct cpg_core_clk drp[0]; 87 + #endif 88 + } core_clks __initconst = { 89 + .common = { 90 + /* External Clock Inputs */ 91 + DEF_INPUT("extal", CLK_EXTAL), 87 92 88 - /* Internal Core Clocks */ 89 - DEF_FIXED(".osc", R9A07G044_OSCCLK, CLK_EXTAL, 1, 1), 90 - DEF_FIXED(".osc_div1000", CLK_OSC_DIV1000, CLK_EXTAL, 1, 1000), 91 - DEF_SAMPLL(".pll1", CLK_PLL1, CLK_EXTAL, PLL146_CONF(0)), 92 - DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 133, 2), 93 - DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 133, 2), 94 - DEF_FIXED(".pll3_400", CLK_PLL3_400, CLK_PLL3, 1, 4), 95 - DEF_FIXED(".pll3_533", CLK_PLL3_533, CLK_PLL3, 1, 3), 93 + /* Internal Core Clocks */ 94 + DEF_FIXED(".osc", R9A07G044_OSCCLK, CLK_EXTAL, 1, 1), 95 + DEF_FIXED(".osc_div1000", CLK_OSC_DIV1000, CLK_EXTAL, 1, 1000), 96 + DEF_SAMPLL(".pll1", CLK_PLL1, CLK_EXTAL, PLL146_CONF(0)), 97 + DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 200, 3), 98 + DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 200, 3), 99 + DEF_FIXED(".pll3_400", CLK_PLL3_400, CLK_PLL3, 1, 4), 100 + DEF_FIXED(".pll3_533", CLK_PLL3_533, CLK_PLL3, 1, 3), 96 101 97 - DEF_FIXED(".pll5", CLK_PLL5, CLK_EXTAL, 125, 1), 98 - DEF_FIXED(".pll5_fout3", CLK_PLL5_FOUT3, CLK_PLL5, 1, 6), 102 + DEF_FIXED(".pll5", CLK_PLL5, CLK_EXTAL, 125, 1), 103 + DEF_FIXED(".pll5_fout3", CLK_PLL5_FOUT3, CLK_PLL5, 1, 6), 99 104 100 - DEF_FIXED(".pll6", CLK_PLL6, CLK_EXTAL, 125, 6), 105 + DEF_FIXED(".pll6", CLK_PLL6, CLK_EXTAL, 125, 6), 101 106 102 - DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 1, 2), 103 - DEF_FIXED(".clk_800", CLK_PLL2_800, CLK_PLL2, 1, 2), 104 - DEF_FIXED(".clk_533", CLK_PLL2_SDHI_533, CLK_PLL2, 1, 3), 105 - DEF_FIXED(".clk_400", CLK_PLL2_SDHI_400, CLK_PLL2_800, 1, 2), 106 - DEF_FIXED(".clk_266", CLK_PLL2_SDHI_266, CLK_PLL2_SDHI_533, 1, 2), 107 + DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 1, 2), 108 + DEF_FIXED(".clk_800", CLK_PLL2_800, CLK_PLL2, 1, 2), 109 + DEF_FIXED(".clk_533", CLK_PLL2_SDHI_533, CLK_PLL2, 1, 3), 110 + DEF_FIXED(".clk_400", CLK_PLL2_SDHI_400, CLK_PLL2_800, 1, 2), 111 + DEF_FIXED(".clk_266", CLK_PLL2_SDHI_266, CLK_PLL2_SDHI_533, 1, 2), 107 112 108 - DEF_FIXED(".pll2_div2_8", CLK_PLL2_DIV2_8, CLK_PLL2_DIV2, 1, 8), 109 - DEF_FIXED(".pll2_div2_10", CLK_PLL2_DIV2_10, CLK_PLL2_DIV2, 1, 10), 113 + DEF_FIXED(".pll2_div2_8", CLK_PLL2_DIV2_8, CLK_PLL2_DIV2, 1, 8), 114 + DEF_FIXED(".pll2_div2_10", CLK_PLL2_DIV2_10, CLK_PLL2_DIV2, 1, 10), 110 115 111 - DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 1, 2), 112 - DEF_FIXED(".pll3_div2_2", CLK_PLL3_DIV2_2, CLK_PLL3_DIV2, 1, 2), 113 - DEF_FIXED(".pll3_div2_4", CLK_PLL3_DIV2_4, CLK_PLL3_DIV2, 1, 4), 114 - DEF_FIXED(".pll3_div2_4_2", CLK_PLL3_DIV2_4_2, CLK_PLL3_DIV2_4, 1, 2), 115 - DEF_MUX(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3, 116 - sel_pll3_3, ARRAY_SIZE(sel_pll3_3), 0, CLK_MUX_READ_ONLY), 117 - DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3, 118 - DIVPL3C, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 116 + DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 1, 2), 117 + DEF_FIXED(".pll3_div2_2", CLK_PLL3_DIV2_2, CLK_PLL3_DIV2, 1, 2), 118 + DEF_FIXED(".pll3_div2_4", CLK_PLL3_DIV2_4, CLK_PLL3_DIV2, 1, 4), 119 + DEF_FIXED(".pll3_div2_4_2", CLK_PLL3_DIV2_4_2, CLK_PLL3_DIV2_4, 1, 2), 120 + DEF_MUX(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3, 121 + sel_pll3_3, ARRAY_SIZE(sel_pll3_3), 0, CLK_MUX_READ_ONLY), 122 + DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3, 123 + DIVPL3C, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 119 124 120 - DEF_FIXED(".pll5_250", CLK_PLL5_250, CLK_PLL5_FOUT3, 1, 2), 121 - DEF_FIXED(".pll6_250", CLK_PLL6_250, CLK_PLL6, 1, 2), 122 - DEF_MUX(".sel_gpu2", CLK_SEL_GPU2, SEL_GPU2, 123 - sel_gpu2, ARRAY_SIZE(sel_gpu2), 0, CLK_MUX_READ_ONLY), 125 + DEF_FIXED(".pll5_250", CLK_PLL5_250, CLK_PLL5_FOUT3, 1, 2), 126 + DEF_FIXED(".pll6_250", CLK_PLL6_250, CLK_PLL6, 1, 2), 127 + DEF_MUX(".sel_gpu2", CLK_SEL_GPU2, SEL_GPU2, 128 + sel_gpu2, ARRAY_SIZE(sel_gpu2), 0, CLK_MUX_READ_ONLY), 124 129 125 - /* Core output clk */ 126 - DEF_DIV("I", R9A07G044_CLK_I, CLK_PLL1, DIVPL1A, dtable_1_8, 127 - CLK_DIVIDER_HIWORD_MASK), 128 - DEF_DIV("P0", R9A07G044_CLK_P0, CLK_PLL2_DIV2_8, DIVPL2A, 129 - dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 130 - DEF_FIXED("P0_DIV2", R9A07G044_CLK_P0_DIV2, R9A07G044_CLK_P0, 1, 2), 131 - DEF_FIXED("TSU", R9A07G044_CLK_TSU, CLK_PLL2_DIV2_10, 1, 1), 132 - DEF_DIV("P1", R9A07G044_CLK_P1, CLK_PLL3_DIV2_4, 133 - DIVPL3B, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 134 - DEF_FIXED("P1_DIV2", CLK_P1_DIV2, R9A07G044_CLK_P1, 1, 2), 135 - DEF_DIV("P2", R9A07G044_CLK_P2, CLK_PLL3_DIV2_4_2, 136 - DIVPL3A, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 137 - DEF_FIXED("M0", R9A07G044_CLK_M0, CLK_PLL3_DIV2_4, 1, 1), 138 - DEF_FIXED("ZT", R9A07G044_CLK_ZT, CLK_PLL3_DIV2_4_2, 1, 1), 139 - DEF_MUX("HP", R9A07G044_CLK_HP, SEL_PLL6_2, 140 - sel_pll6_2, ARRAY_SIZE(sel_pll6_2), 0, CLK_MUX_HIWORD_MASK), 141 - DEF_FIXED("SPI0", R9A07G044_CLK_SPI0, CLK_DIV_PLL3_C, 1, 2), 142 - DEF_FIXED("SPI1", R9A07G044_CLK_SPI1, CLK_DIV_PLL3_C, 1, 4), 143 - DEF_SD_MUX("SD0", R9A07G044_CLK_SD0, SEL_SDHI0, 144 - sel_shdi, ARRAY_SIZE(sel_shdi)), 145 - DEF_SD_MUX("SD1", R9A07G044_CLK_SD1, SEL_SDHI1, 146 - sel_shdi, ARRAY_SIZE(sel_shdi)), 147 - DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G044_CLK_SD0, 1, 4), 148 - DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G044_CLK_SD1, 1, 4), 149 - DEF_DIV("G", R9A07G044_CLK_G, CLK_SEL_GPU2, DIVGPU, dtable_1_8, 150 - CLK_DIVIDER_HIWORD_MASK), 130 + /* Core output clk */ 131 + DEF_DIV("I", R9A07G044_CLK_I, CLK_PLL1, DIVPL1A, dtable_1_8, 132 + CLK_DIVIDER_HIWORD_MASK), 133 + DEF_DIV("P0", R9A07G044_CLK_P0, CLK_PLL2_DIV2_8, DIVPL2A, 134 + dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 135 + DEF_FIXED("P0_DIV2", R9A07G044_CLK_P0_DIV2, R9A07G044_CLK_P0, 1, 2), 136 + DEF_FIXED("TSU", R9A07G044_CLK_TSU, CLK_PLL2_DIV2_10, 1, 1), 137 + DEF_DIV("P1", R9A07G044_CLK_P1, CLK_PLL3_DIV2_4, 138 + DIVPL3B, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 139 + DEF_FIXED("P1_DIV2", CLK_P1_DIV2, R9A07G044_CLK_P1, 1, 2), 140 + DEF_DIV("P2", R9A07G044_CLK_P2, CLK_PLL3_DIV2_4_2, 141 + DIVPL3A, dtable_1_32, CLK_DIVIDER_HIWORD_MASK), 142 + DEF_FIXED("M0", R9A07G044_CLK_M0, CLK_PLL3_DIV2_4, 1, 1), 143 + DEF_FIXED("ZT", R9A07G044_CLK_ZT, CLK_PLL3_DIV2_4_2, 1, 1), 144 + DEF_MUX("HP", R9A07G044_CLK_HP, SEL_PLL6_2, 145 + sel_pll6_2, ARRAY_SIZE(sel_pll6_2), 0, CLK_MUX_HIWORD_MASK), 146 + DEF_FIXED("SPI0", R9A07G044_CLK_SPI0, CLK_DIV_PLL3_C, 1, 2), 147 + DEF_FIXED("SPI1", R9A07G044_CLK_SPI1, CLK_DIV_PLL3_C, 1, 4), 148 + DEF_SD_MUX("SD0", R9A07G044_CLK_SD0, SEL_SDHI0, 149 + sel_shdi, ARRAY_SIZE(sel_shdi)), 150 + DEF_SD_MUX("SD1", R9A07G044_CLK_SD1, SEL_SDHI1, 151 + sel_shdi, ARRAY_SIZE(sel_shdi)), 152 + DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G044_CLK_SD0, 1, 4), 153 + DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G044_CLK_SD1, 1, 4), 154 + DEF_DIV("G", R9A07G044_CLK_G, CLK_SEL_GPU2, DIVGPU, dtable_1_8, 155 + CLK_DIVIDER_HIWORD_MASK), 156 + }, 157 + #ifdef CONFIG_CLK_R9A07G054 158 + .drp = { 159 + }, 160 + #endif 151 161 }; 152 162 153 - static struct rzg2l_mod_clk r9a07g044_mod_clks[] = { 154 - DEF_MOD("gic", R9A07G044_GIC600_GICCLK, R9A07G044_CLK_P1, 155 - 0x514, 0), 156 - DEF_MOD("ia55_pclk", R9A07G044_IA55_PCLK, R9A07G044_CLK_P2, 157 - 0x518, 0), 158 - DEF_MOD("ia55_clk", R9A07G044_IA55_CLK, R9A07G044_CLK_P1, 159 - 0x518, 1), 160 - DEF_MOD("dmac_aclk", R9A07G044_DMAC_ACLK, R9A07G044_CLK_P1, 161 - 0x52c, 0), 162 - DEF_MOD("dmac_pclk", R9A07G044_DMAC_PCLK, CLK_P1_DIV2, 163 - 0x52c, 1), 164 - DEF_MOD("ostm0_pclk", R9A07G044_OSTM0_PCLK, R9A07G044_CLK_P0, 165 - 0x534, 0), 166 - DEF_MOD("ostm1_clk", R9A07G044_OSTM1_PCLK, R9A07G044_CLK_P0, 167 - 0x534, 1), 168 - DEF_MOD("ostm2_pclk", R9A07G044_OSTM2_PCLK, R9A07G044_CLK_P0, 169 - 0x534, 2), 170 - DEF_MOD("wdt0_pclk", R9A07G044_WDT0_PCLK, R9A07G044_CLK_P0, 171 - 0x548, 0), 172 - DEF_MOD("wdt0_clk", R9A07G044_WDT0_CLK, R9A07G044_OSCCLK, 173 - 0x548, 1), 174 - DEF_MOD("wdt1_pclk", R9A07G044_WDT1_PCLK, R9A07G044_CLK_P0, 175 - 0x548, 2), 176 - DEF_MOD("wdt1_clk", R9A07G044_WDT1_CLK, R9A07G044_OSCCLK, 177 - 0x548, 3), 178 - DEF_MOD("wdt2_pclk", R9A07G044_WDT2_PCLK, R9A07G044_CLK_P0, 179 - 0x548, 4), 180 - DEF_MOD("wdt2_clk", R9A07G044_WDT2_CLK, R9A07G044_OSCCLK, 181 - 0x548, 5), 182 - DEF_MOD("spi_clk2", R9A07G044_SPI_CLK2, R9A07G044_CLK_SPI1, 183 - 0x550, 0), 184 - DEF_MOD("spi_clk", R9A07G044_SPI_CLK, R9A07G044_CLK_SPI0, 185 - 0x550, 1), 186 - DEF_MOD("sdhi0_imclk", R9A07G044_SDHI0_IMCLK, CLK_SD0_DIV4, 187 - 0x554, 0), 188 - DEF_MOD("sdhi0_imclk2", R9A07G044_SDHI0_IMCLK2, CLK_SD0_DIV4, 189 - 0x554, 1), 190 - DEF_MOD("sdhi0_clk_hs", R9A07G044_SDHI0_CLK_HS, R9A07G044_CLK_SD0, 191 - 0x554, 2), 192 - DEF_MOD("sdhi0_aclk", R9A07G044_SDHI0_ACLK, R9A07G044_CLK_P1, 193 - 0x554, 3), 194 - DEF_MOD("sdhi1_imclk", R9A07G044_SDHI1_IMCLK, CLK_SD1_DIV4, 195 - 0x554, 4), 196 - DEF_MOD("sdhi1_imclk2", R9A07G044_SDHI1_IMCLK2, CLK_SD1_DIV4, 197 - 0x554, 5), 198 - DEF_MOD("sdhi1_clk_hs", R9A07G044_SDHI1_CLK_HS, R9A07G044_CLK_SD1, 199 - 0x554, 6), 200 - DEF_MOD("sdhi1_aclk", R9A07G044_SDHI1_ACLK, R9A07G044_CLK_P1, 201 - 0x554, 7), 202 - DEF_MOD("gpu_clk", R9A07G044_GPU_CLK, R9A07G044_CLK_G, 203 - 0x558, 0), 204 - DEF_MOD("gpu_axi_clk", R9A07G044_GPU_AXI_CLK, R9A07G044_CLK_P1, 205 - 0x558, 1), 206 - DEF_MOD("gpu_ace_clk", R9A07G044_GPU_ACE_CLK, R9A07G044_CLK_P1, 207 - 0x558, 2), 208 - DEF_MOD("ssi0_pclk", R9A07G044_SSI0_PCLK2, R9A07G044_CLK_P0, 209 - 0x570, 0), 210 - DEF_MOD("ssi0_sfr", R9A07G044_SSI0_PCLK_SFR, R9A07G044_CLK_P0, 211 - 0x570, 1), 212 - DEF_MOD("ssi1_pclk", R9A07G044_SSI1_PCLK2, R9A07G044_CLK_P0, 213 - 0x570, 2), 214 - DEF_MOD("ssi1_sfr", R9A07G044_SSI1_PCLK_SFR, R9A07G044_CLK_P0, 215 - 0x570, 3), 216 - DEF_MOD("ssi2_pclk", R9A07G044_SSI2_PCLK2, R9A07G044_CLK_P0, 217 - 0x570, 4), 218 - DEF_MOD("ssi2_sfr", R9A07G044_SSI2_PCLK_SFR, R9A07G044_CLK_P0, 219 - 0x570, 5), 220 - DEF_MOD("ssi3_pclk", R9A07G044_SSI3_PCLK2, R9A07G044_CLK_P0, 221 - 0x570, 6), 222 - DEF_MOD("ssi3_sfr", R9A07G044_SSI3_PCLK_SFR, R9A07G044_CLK_P0, 223 - 0x570, 7), 224 - DEF_MOD("usb0_host", R9A07G044_USB_U2H0_HCLK, R9A07G044_CLK_P1, 225 - 0x578, 0), 226 - DEF_MOD("usb1_host", R9A07G044_USB_U2H1_HCLK, R9A07G044_CLK_P1, 227 - 0x578, 1), 228 - DEF_MOD("usb0_func", R9A07G044_USB_U2P_EXR_CPUCLK, R9A07G044_CLK_P1, 229 - 0x578, 2), 230 - DEF_MOD("usb_pclk", R9A07G044_USB_PCLK, R9A07G044_CLK_P1, 231 - 0x578, 3), 232 - DEF_COUPLED("eth0_axi", R9A07G044_ETH0_CLK_AXI, R9A07G044_CLK_M0, 233 - 0x57c, 0), 234 - DEF_COUPLED("eth0_chi", R9A07G044_ETH0_CLK_CHI, R9A07G044_CLK_ZT, 235 - 0x57c, 0), 236 - DEF_COUPLED("eth1_axi", R9A07G044_ETH1_CLK_AXI, R9A07G044_CLK_M0, 237 - 0x57c, 1), 238 - DEF_COUPLED("eth1_chi", R9A07G044_ETH1_CLK_CHI, R9A07G044_CLK_ZT, 239 - 0x57c, 1), 240 - DEF_MOD("i2c0", R9A07G044_I2C0_PCLK, R9A07G044_CLK_P0, 241 - 0x580, 0), 242 - DEF_MOD("i2c1", R9A07G044_I2C1_PCLK, R9A07G044_CLK_P0, 243 - 0x580, 1), 244 - DEF_MOD("i2c2", R9A07G044_I2C2_PCLK, R9A07G044_CLK_P0, 245 - 0x580, 2), 246 - DEF_MOD("i2c3", R9A07G044_I2C3_PCLK, R9A07G044_CLK_P0, 247 - 0x580, 3), 248 - DEF_MOD("scif0", R9A07G044_SCIF0_CLK_PCK, R9A07G044_CLK_P0, 249 - 0x584, 0), 250 - DEF_MOD("scif1", R9A07G044_SCIF1_CLK_PCK, R9A07G044_CLK_P0, 251 - 0x584, 1), 252 - DEF_MOD("scif2", R9A07G044_SCIF2_CLK_PCK, R9A07G044_CLK_P0, 253 - 0x584, 2), 254 - DEF_MOD("scif3", R9A07G044_SCIF3_CLK_PCK, R9A07G044_CLK_P0, 255 - 0x584, 3), 256 - DEF_MOD("scif4", R9A07G044_SCIF4_CLK_PCK, R9A07G044_CLK_P0, 257 - 0x584, 4), 258 - DEF_MOD("sci0", R9A07G044_SCI0_CLKP, R9A07G044_CLK_P0, 259 - 0x588, 0), 260 - DEF_MOD("sci1", R9A07G044_SCI1_CLKP, R9A07G044_CLK_P0, 261 - 0x588, 1), 262 - DEF_MOD("rspi0", R9A07G044_RSPI0_CLKB, R9A07G044_CLK_P0, 263 - 0x590, 0), 264 - DEF_MOD("rspi1", R9A07G044_RSPI1_CLKB, R9A07G044_CLK_P0, 265 - 0x590, 1), 266 - DEF_MOD("rspi2", R9A07G044_RSPI2_CLKB, R9A07G044_CLK_P0, 267 - 0x590, 2), 268 - DEF_MOD("canfd", R9A07G044_CANFD_PCLK, R9A07G044_CLK_P0, 269 - 0x594, 0), 270 - DEF_MOD("gpio", R9A07G044_GPIO_HCLK, R9A07G044_OSCCLK, 271 - 0x598, 0), 272 - DEF_MOD("adc_adclk", R9A07G044_ADC_ADCLK, R9A07G044_CLK_TSU, 273 - 0x5a8, 0), 274 - DEF_MOD("adc_pclk", R9A07G044_ADC_PCLK, R9A07G044_CLK_P0, 275 - 0x5a8, 1), 276 - DEF_MOD("tsu_pclk", R9A07G044_TSU_PCLK, R9A07G044_CLK_TSU, 277 - 0x5ac, 0), 163 + static const struct { 164 + struct rzg2l_mod_clk common[62]; 165 + #ifdef CONFIG_CLK_R9A07G054 166 + struct rzg2l_mod_clk drp[0]; 167 + #endif 168 + } mod_clks = { 169 + .common = { 170 + DEF_MOD("gic", R9A07G044_GIC600_GICCLK, R9A07G044_CLK_P1, 171 + 0x514, 0), 172 + DEF_MOD("ia55_pclk", R9A07G044_IA55_PCLK, R9A07G044_CLK_P2, 173 + 0x518, 0), 174 + DEF_MOD("ia55_clk", R9A07G044_IA55_CLK, R9A07G044_CLK_P1, 175 + 0x518, 1), 176 + DEF_MOD("dmac_aclk", R9A07G044_DMAC_ACLK, R9A07G044_CLK_P1, 177 + 0x52c, 0), 178 + DEF_MOD("dmac_pclk", R9A07G044_DMAC_PCLK, CLK_P1_DIV2, 179 + 0x52c, 1), 180 + DEF_MOD("ostm0_pclk", R9A07G044_OSTM0_PCLK, R9A07G044_CLK_P0, 181 + 0x534, 0), 182 + DEF_MOD("ostm1_clk", R9A07G044_OSTM1_PCLK, R9A07G044_CLK_P0, 183 + 0x534, 1), 184 + DEF_MOD("ostm2_pclk", R9A07G044_OSTM2_PCLK, R9A07G044_CLK_P0, 185 + 0x534, 2), 186 + DEF_MOD("wdt0_pclk", R9A07G044_WDT0_PCLK, R9A07G044_CLK_P0, 187 + 0x548, 0), 188 + DEF_MOD("wdt0_clk", R9A07G044_WDT0_CLK, R9A07G044_OSCCLK, 189 + 0x548, 1), 190 + DEF_MOD("wdt1_pclk", R9A07G044_WDT1_PCLK, R9A07G044_CLK_P0, 191 + 0x548, 2), 192 + DEF_MOD("wdt1_clk", R9A07G044_WDT1_CLK, R9A07G044_OSCCLK, 193 + 0x548, 3), 194 + DEF_MOD("wdt2_pclk", R9A07G044_WDT2_PCLK, R9A07G044_CLK_P0, 195 + 0x548, 4), 196 + DEF_MOD("wdt2_clk", R9A07G044_WDT2_CLK, R9A07G044_OSCCLK, 197 + 0x548, 5), 198 + DEF_MOD("spi_clk2", R9A07G044_SPI_CLK2, R9A07G044_CLK_SPI1, 199 + 0x550, 0), 200 + DEF_MOD("spi_clk", R9A07G044_SPI_CLK, R9A07G044_CLK_SPI0, 201 + 0x550, 1), 202 + DEF_MOD("sdhi0_imclk", R9A07G044_SDHI0_IMCLK, CLK_SD0_DIV4, 203 + 0x554, 0), 204 + DEF_MOD("sdhi0_imclk2", R9A07G044_SDHI0_IMCLK2, CLK_SD0_DIV4, 205 + 0x554, 1), 206 + DEF_MOD("sdhi0_clk_hs", R9A07G044_SDHI0_CLK_HS, R9A07G044_CLK_SD0, 207 + 0x554, 2), 208 + DEF_MOD("sdhi0_aclk", R9A07G044_SDHI0_ACLK, R9A07G044_CLK_P1, 209 + 0x554, 3), 210 + DEF_MOD("sdhi1_imclk", R9A07G044_SDHI1_IMCLK, CLK_SD1_DIV4, 211 + 0x554, 4), 212 + DEF_MOD("sdhi1_imclk2", R9A07G044_SDHI1_IMCLK2, CLK_SD1_DIV4, 213 + 0x554, 5), 214 + DEF_MOD("sdhi1_clk_hs", R9A07G044_SDHI1_CLK_HS, R9A07G044_CLK_SD1, 215 + 0x554, 6), 216 + DEF_MOD("sdhi1_aclk", R9A07G044_SDHI1_ACLK, R9A07G044_CLK_P1, 217 + 0x554, 7), 218 + DEF_MOD("gpu_clk", R9A07G044_GPU_CLK, R9A07G044_CLK_G, 219 + 0x558, 0), 220 + DEF_MOD("gpu_axi_clk", R9A07G044_GPU_AXI_CLK, R9A07G044_CLK_P1, 221 + 0x558, 1), 222 + DEF_MOD("gpu_ace_clk", R9A07G044_GPU_ACE_CLK, R9A07G044_CLK_P1, 223 + 0x558, 2), 224 + DEF_MOD("ssi0_pclk", R9A07G044_SSI0_PCLK2, R9A07G044_CLK_P0, 225 + 0x570, 0), 226 + DEF_MOD("ssi0_sfr", R9A07G044_SSI0_PCLK_SFR, R9A07G044_CLK_P0, 227 + 0x570, 1), 228 + DEF_MOD("ssi1_pclk", R9A07G044_SSI1_PCLK2, R9A07G044_CLK_P0, 229 + 0x570, 2), 230 + DEF_MOD("ssi1_sfr", R9A07G044_SSI1_PCLK_SFR, R9A07G044_CLK_P0, 231 + 0x570, 3), 232 + DEF_MOD("ssi2_pclk", R9A07G044_SSI2_PCLK2, R9A07G044_CLK_P0, 233 + 0x570, 4), 234 + DEF_MOD("ssi2_sfr", R9A07G044_SSI2_PCLK_SFR, R9A07G044_CLK_P0, 235 + 0x570, 5), 236 + DEF_MOD("ssi3_pclk", R9A07G044_SSI3_PCLK2, R9A07G044_CLK_P0, 237 + 0x570, 6), 238 + DEF_MOD("ssi3_sfr", R9A07G044_SSI3_PCLK_SFR, R9A07G044_CLK_P0, 239 + 0x570, 7), 240 + DEF_MOD("usb0_host", R9A07G044_USB_U2H0_HCLK, R9A07G044_CLK_P1, 241 + 0x578, 0), 242 + DEF_MOD("usb1_host", R9A07G044_USB_U2H1_HCLK, R9A07G044_CLK_P1, 243 + 0x578, 1), 244 + DEF_MOD("usb0_func", R9A07G044_USB_U2P_EXR_CPUCLK, R9A07G044_CLK_P1, 245 + 0x578, 2), 246 + DEF_MOD("usb_pclk", R9A07G044_USB_PCLK, R9A07G044_CLK_P1, 247 + 0x578, 3), 248 + DEF_COUPLED("eth0_axi", R9A07G044_ETH0_CLK_AXI, R9A07G044_CLK_M0, 249 + 0x57c, 0), 250 + DEF_COUPLED("eth0_chi", R9A07G044_ETH0_CLK_CHI, R9A07G044_CLK_ZT, 251 + 0x57c, 0), 252 + DEF_COUPLED("eth1_axi", R9A07G044_ETH1_CLK_AXI, R9A07G044_CLK_M0, 253 + 0x57c, 1), 254 + DEF_COUPLED("eth1_chi", R9A07G044_ETH1_CLK_CHI, R9A07G044_CLK_ZT, 255 + 0x57c, 1), 256 + DEF_MOD("i2c0", R9A07G044_I2C0_PCLK, R9A07G044_CLK_P0, 257 + 0x580, 0), 258 + DEF_MOD("i2c1", R9A07G044_I2C1_PCLK, R9A07G044_CLK_P0, 259 + 0x580, 1), 260 + DEF_MOD("i2c2", R9A07G044_I2C2_PCLK, R9A07G044_CLK_P0, 261 + 0x580, 2), 262 + DEF_MOD("i2c3", R9A07G044_I2C3_PCLK, R9A07G044_CLK_P0, 263 + 0x580, 3), 264 + DEF_MOD("scif0", R9A07G044_SCIF0_CLK_PCK, R9A07G044_CLK_P0, 265 + 0x584, 0), 266 + DEF_MOD("scif1", R9A07G044_SCIF1_CLK_PCK, R9A07G044_CLK_P0, 267 + 0x584, 1), 268 + DEF_MOD("scif2", R9A07G044_SCIF2_CLK_PCK, R9A07G044_CLK_P0, 269 + 0x584, 2), 270 + DEF_MOD("scif3", R9A07G044_SCIF3_CLK_PCK, R9A07G044_CLK_P0, 271 + 0x584, 3), 272 + DEF_MOD("scif4", R9A07G044_SCIF4_CLK_PCK, R9A07G044_CLK_P0, 273 + 0x584, 4), 274 + DEF_MOD("sci0", R9A07G044_SCI0_CLKP, R9A07G044_CLK_P0, 275 + 0x588, 0), 276 + DEF_MOD("sci1", R9A07G044_SCI1_CLKP, R9A07G044_CLK_P0, 277 + 0x588, 1), 278 + DEF_MOD("rspi0", R9A07G044_RSPI0_CLKB, R9A07G044_CLK_P0, 279 + 0x590, 0), 280 + DEF_MOD("rspi1", R9A07G044_RSPI1_CLKB, R9A07G044_CLK_P0, 281 + 0x590, 1), 282 + DEF_MOD("rspi2", R9A07G044_RSPI2_CLKB, R9A07G044_CLK_P0, 283 + 0x590, 2), 284 + DEF_MOD("canfd", R9A07G044_CANFD_PCLK, R9A07G044_CLK_P0, 285 + 0x594, 0), 286 + DEF_MOD("gpio", R9A07G044_GPIO_HCLK, R9A07G044_OSCCLK, 287 + 0x598, 0), 288 + DEF_MOD("adc_adclk", R9A07G044_ADC_ADCLK, R9A07G044_CLK_TSU, 289 + 0x5a8, 0), 290 + DEF_MOD("adc_pclk", R9A07G044_ADC_PCLK, R9A07G044_CLK_P0, 291 + 0x5a8, 1), 292 + DEF_MOD("tsu_pclk", R9A07G044_TSU_PCLK, R9A07G044_CLK_TSU, 293 + 0x5ac, 0), 294 + }, 295 + #ifdef CONFIG_CLK_R9A07G054 296 + .drp = { 297 + }, 298 + #endif 278 299 }; 279 300 280 301 static struct rzg2l_reset r9a07g044_resets[] = { ··· 359 336 360 337 const struct rzg2l_cpg_info r9a07g044_cpg_info = { 361 338 /* Core Clocks */ 362 - .core_clks = r9a07g044_core_clks, 363 - .num_core_clks = ARRAY_SIZE(r9a07g044_core_clks), 339 + .core_clks = core_clks.common, 340 + .num_core_clks = ARRAY_SIZE(core_clks.common), 364 341 .last_dt_core_clk = LAST_DT_CORE_CLK, 365 342 .num_total_core_clks = MOD_CLK_BASE, 366 343 ··· 369 346 .num_crit_mod_clks = ARRAY_SIZE(r9a07g044_crit_mod_clks), 370 347 371 348 /* Module Clocks */ 372 - .mod_clks = r9a07g044_mod_clks, 373 - .num_mod_clks = ARRAY_SIZE(r9a07g044_mod_clks), 349 + .mod_clks = mod_clks.common, 350 + .num_mod_clks = ARRAY_SIZE(mod_clks.common), 374 351 .num_hw_mod_clks = R9A07G044_TSU_PCLK + 1, 375 352 376 353 /* Resets */ 377 354 .resets = r9a07g044_resets, 378 - .num_resets = ARRAY_SIZE(r9a07g044_resets), 355 + .num_resets = R9A07G044_TSU_PRESETN + 1, /* Last reset ID + 1 */ 379 356 }; 357 + 358 + #ifdef CONFIG_CLK_R9A07G054 359 + const struct rzg2l_cpg_info r9a07g054_cpg_info = { 360 + /* Core Clocks */ 361 + .core_clks = core_clks.common, 362 + .num_core_clks = ARRAY_SIZE(core_clks.common) + ARRAY_SIZE(core_clks.drp), 363 + .last_dt_core_clk = LAST_DT_CORE_CLK, 364 + .num_total_core_clks = MOD_CLK_BASE, 365 + 366 + /* Critical Module Clocks */ 367 + .crit_mod_clks = r9a07g044_crit_mod_clks, 368 + .num_crit_mod_clks = ARRAY_SIZE(r9a07g044_crit_mod_clks), 369 + 370 + /* Module Clocks */ 371 + .mod_clks = mod_clks.common, 372 + .num_mod_clks = ARRAY_SIZE(mod_clks.common) + ARRAY_SIZE(mod_clks.drp), 373 + .num_hw_mod_clks = R9A07G054_STPAI_ACLK_DRP + 1, 374 + 375 + /* Resets */ 376 + .resets = r9a07g044_resets, 377 + .num_resets = R9A07G054_STPAI_ARESETN + 1, /* Last reset ID + 1 */ 378 + }; 379 + #endif
+6
drivers/clk/renesas/rzg2l-cpg.c
··· 953 953 .data = &r9a07g044_cpg_info, 954 954 }, 955 955 #endif 956 + #ifdef CONFIG_CLK_R9A07G054 957 + { 958 + .compatible = "renesas,r9a07g054-cpg", 959 + .data = &r9a07g054_cpg_info, 960 + }, 961 + #endif 956 962 { /* sentinel */ } 957 963 }; 958 964
+1
drivers/clk/renesas/rzg2l-cpg.h
··· 203 203 }; 204 204 205 205 extern const struct rzg2l_cpg_info r9a07g044_cpg_info; 206 + extern const struct rzg2l_cpg_info r9a07g054_cpg_info; 206 207 207 208 #endif
+6 -6
drivers/clk/zynqmp/clk-gate-zynqmp.c
··· 41 41 ret = zynqmp_pm_clock_enable(clk_id); 42 42 43 43 if (ret) 44 - pr_warn_once("%s() clock enabled failed for %s, ret = %d\n", 45 - __func__, clk_name, ret); 44 + pr_debug("%s() clock enable failed for %s (id %d), ret = %d\n", 45 + __func__, clk_name, clk_id, ret); 46 46 47 47 return ret; 48 48 } ··· 61 61 ret = zynqmp_pm_clock_disable(clk_id); 62 62 63 63 if (ret) 64 - pr_warn_once("%s() clock disable failed for %s, ret = %d\n", 65 - __func__, clk_name, ret); 64 + pr_debug("%s() clock disable failed for %s (id %d), ret = %d\n", 65 + __func__, clk_name, clk_id, ret); 66 66 } 67 67 68 68 /** ··· 80 80 81 81 ret = zynqmp_pm_clock_getstate(clk_id, &state); 82 82 if (ret) { 83 - pr_warn_once("%s() clock get state failed for %s, ret = %d\n", 84 - __func__, clk_name, ret); 83 + pr_debug("%s() clock get state failed for %s, ret = %d\n", 84 + __func__, clk_name, ret); 85 85 return -EIO; 86 86 } 87 87
+4 -4
drivers/clk/zynqmp/clk-mux-zynqmp.c
··· 51 51 ret = zynqmp_pm_clock_getparent(clk_id, &val); 52 52 53 53 if (ret) { 54 - pr_warn_once("%s() getparent failed for clock: %s, ret = %d\n", 55 - __func__, clk_name, ret); 54 + pr_debug("%s() getparent failed for clock: %s, ret = %d\n", 55 + __func__, clk_name, ret); 56 56 /* 57 57 * clk_core_get_parent_by_index() takes num_parents as incorrect 58 58 * index which is exactly what I want to return here ··· 80 80 ret = zynqmp_pm_clock_setparent(clk_id, index); 81 81 82 82 if (ret) 83 - pr_warn_once("%s() set parent failed for clock: %s, ret = %d\n", 84 - __func__, clk_name, ret); 83 + pr_debug("%s() set parent failed for clock: %s, ret = %d\n", 84 + __func__, clk_name, ret); 85 85 86 86 return ret; 87 87 }
+6 -6
drivers/clk/zynqmp/divider.c
··· 89 89 ret = zynqmp_pm_clock_getdivider(clk_id, &div); 90 90 91 91 if (ret) 92 - pr_warn_once("%s() get divider failed for %s, ret = %d\n", 93 - __func__, clk_name, ret); 92 + pr_debug("%s() get divider failed for %s, ret = %d\n", 93 + __func__, clk_name, ret); 94 94 95 95 if (div_type == TYPE_DIV1) 96 96 value = div & 0xFFFF; ··· 177 177 ret = zynqmp_pm_clock_getdivider(clk_id, &bestdiv); 178 178 179 179 if (ret) 180 - pr_warn_once("%s() get divider failed for %s, ret = %d\n", 181 - __func__, clk_name, ret); 180 + pr_debug("%s() get divider failed for %s, ret = %d\n", 181 + __func__, clk_name, ret); 182 182 if (div_type == TYPE_DIV1) 183 183 bestdiv = bestdiv & 0xFFFF; 184 184 else ··· 244 244 ret = zynqmp_pm_clock_setdivider(clk_id, div); 245 245 246 246 if (ret) 247 - pr_warn_once("%s() set divider failed for %s, ret = %d\n", 248 - __func__, clk_name, ret); 247 + pr_debug("%s() set divider failed for %s, ret = %d\n", 248 + __func__, clk_name, ret); 249 249 250 250 return ret; 251 251 }
+16 -16
drivers/clk/zynqmp/pll.c
··· 56 56 57 57 ret = zynqmp_pm_get_pll_frac_mode(clk_id, ret_payload); 58 58 if (ret) { 59 - pr_warn_once("%s() PLL get frac mode failed for %s, ret = %d\n", 60 - __func__, clk_name, ret); 59 + pr_debug("%s() PLL get frac mode failed for %s, ret = %d\n", 60 + __func__, clk_name, ret); 61 61 return PLL_MODE_ERROR; 62 62 } 63 63 ··· 84 84 85 85 ret = zynqmp_pm_set_pll_frac_mode(clk_id, mode); 86 86 if (ret) 87 - pr_warn_once("%s() PLL set frac mode failed for %s, ret = %d\n", 88 - __func__, clk_name, ret); 87 + pr_debug("%s() PLL set frac mode failed for %s, ret = %d\n", 88 + __func__, clk_name, ret); 89 89 else 90 90 clk->set_pll_mode = true; 91 91 } ··· 145 145 146 146 ret = zynqmp_pm_clock_getdivider(clk_id, &fbdiv); 147 147 if (ret) { 148 - pr_warn_once("%s() get divider failed for %s, ret = %d\n", 149 - __func__, clk_name, ret); 148 + pr_debug("%s() get divider failed for %s, ret = %d\n", 149 + __func__, clk_name, ret); 150 150 return 0ul; 151 151 } 152 152 ··· 200 200 WARN(1, "More than allowed devices are using the %s, which is forbidden\n", 201 201 clk_name); 202 202 else if (ret) 203 - pr_warn_once("%s() set divider failed for %s, ret = %d\n", 204 - __func__, clk_name, ret); 203 + pr_debug("%s() set divider failed for %s, ret = %d\n", 204 + __func__, clk_name, ret); 205 205 zynqmp_pm_set_pll_frac_data(clk_id, f); 206 206 207 207 return rate + frac; ··· 211 211 fbdiv = clamp_t(u32, fbdiv, PLL_FBDIV_MIN, PLL_FBDIV_MAX); 212 212 ret = zynqmp_pm_clock_setdivider(clk_id, fbdiv); 213 213 if (ret) 214 - pr_warn_once("%s() set divider failed for %s, ret = %d\n", 215 - __func__, clk_name, ret); 214 + pr_debug("%s() set divider failed for %s, ret = %d\n", 215 + __func__, clk_name, ret); 216 216 217 217 return parent_rate * fbdiv; 218 218 } ··· 233 233 234 234 ret = zynqmp_pm_clock_getstate(clk_id, &state); 235 235 if (ret) { 236 - pr_warn_once("%s() clock get state failed for %s, ret = %d\n", 237 - __func__, clk_name, ret); 236 + pr_debug("%s() clock get state failed for %s, ret = %d\n", 237 + __func__, clk_name, ret); 238 238 return -EIO; 239 239 } 240 240 ··· 265 265 266 266 ret = zynqmp_pm_clock_enable(clk_id); 267 267 if (ret) 268 - pr_warn_once("%s() clock enable failed for %s, ret = %d\n", 269 - __func__, clk_name, ret); 268 + pr_debug("%s() clock enable failed for %s, ret = %d\n", 269 + __func__, clk_name, ret); 270 270 271 271 return ret; 272 272 } ··· 287 287 288 288 ret = zynqmp_pm_clock_disable(clk_id); 289 289 if (ret) 290 - pr_warn_once("%s() clock disable failed for %s, ret = %d\n", 291 - __func__, clk_name, ret); 290 + pr_debug("%s() clock disable failed for %s, ret = %d\n", 291 + __func__, clk_name, ret); 292 292 } 293 293 294 294 static const struct clk_ops zynqmp_pll_ops = {
+14
include/dt-bindings/clock/cirrus,cs2000-cp.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (C) 2021 Daniel Mack 4 + */ 5 + 6 + #ifndef __DT_BINDINGS_CS2000CP_CLK_H 7 + #define __DT_BINDINGS_CS2000CP_CLK_H 8 + 9 + #define CS2000CP_AUX_OUTPUT_REF_CLK 0 10 + #define CS2000CP_AUX_OUTPUT_CLK_IN 1 11 + #define CS2000CP_AUX_OUTPUT_CLK_OUT 2 12 + #define CS2000CP_AUX_OUTPUT_PLL_LOCK 3 13 + 14 + #endif /* __DT_BINDINGS_CS2000CP_CLK_H */
+229
include/dt-bindings/clock/r9a07g054-cpg.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + * 3 + * Copyright (C) 2022 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R9A07G054_CPG_H__ 6 + #define __DT_BINDINGS_CLOCK_R9A07G054_CPG_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* R9A07G054 CPG Core Clocks */ 11 + #define R9A07G054_CLK_I 0 12 + #define R9A07G054_CLK_I2 1 13 + #define R9A07G054_CLK_G 2 14 + #define R9A07G054_CLK_S0 3 15 + #define R9A07G054_CLK_S1 4 16 + #define R9A07G054_CLK_SPI0 5 17 + #define R9A07G054_CLK_SPI1 6 18 + #define R9A07G054_CLK_SD0 7 19 + #define R9A07G054_CLK_SD1 8 20 + #define R9A07G054_CLK_M0 9 21 + #define R9A07G054_CLK_M1 10 22 + #define R9A07G054_CLK_M2 11 23 + #define R9A07G054_CLK_M3 12 24 + #define R9A07G054_CLK_M4 13 25 + #define R9A07G054_CLK_HP 14 26 + #define R9A07G054_CLK_TSU 15 27 + #define R9A07G054_CLK_ZT 16 28 + #define R9A07G054_CLK_P0 17 29 + #define R9A07G054_CLK_P1 18 30 + #define R9A07G054_CLK_P2 19 31 + #define R9A07G054_CLK_AT 20 32 + #define R9A07G054_OSCCLK 21 33 + #define R9A07G054_CLK_P0_DIV2 22 34 + #define R9A07G054_CLK_DRP_M 23 35 + #define R9A07G054_CLK_DRP_D 24 36 + #define R9A07G054_CLK_DRP_A 25 37 + 38 + /* R9A07G054 Module Clocks */ 39 + #define R9A07G054_CA55_SCLK 0 40 + #define R9A07G054_CA55_PCLK 1 41 + #define R9A07G054_CA55_ATCLK 2 42 + #define R9A07G054_CA55_GICCLK 3 43 + #define R9A07G054_CA55_PERICLK 4 44 + #define R9A07G054_CA55_ACLK 5 45 + #define R9A07G054_CA55_TSCLK 6 46 + #define R9A07G054_GIC600_GICCLK 7 47 + #define R9A07G054_IA55_CLK 8 48 + #define R9A07G054_IA55_PCLK 9 49 + #define R9A07G054_MHU_PCLK 10 50 + #define R9A07G054_SYC_CNT_CLK 11 51 + #define R9A07G054_DMAC_ACLK 12 52 + #define R9A07G054_DMAC_PCLK 13 53 + #define R9A07G054_OSTM0_PCLK 14 54 + #define R9A07G054_OSTM1_PCLK 15 55 + #define R9A07G054_OSTM2_PCLK 16 56 + #define R9A07G054_MTU_X_MCK_MTU3 17 57 + #define R9A07G054_POE3_CLKM_POE 18 58 + #define R9A07G054_GPT_PCLK 19 59 + #define R9A07G054_POEG_A_CLKP 20 60 + #define R9A07G054_POEG_B_CLKP 21 61 + #define R9A07G054_POEG_C_CLKP 22 62 + #define R9A07G054_POEG_D_CLKP 23 63 + #define R9A07G054_WDT0_PCLK 24 64 + #define R9A07G054_WDT0_CLK 25 65 + #define R9A07G054_WDT1_PCLK 26 66 + #define R9A07G054_WDT1_CLK 27 67 + #define R9A07G054_WDT2_PCLK 28 68 + #define R9A07G054_WDT2_CLK 29 69 + #define R9A07G054_SPI_CLK2 30 70 + #define R9A07G054_SPI_CLK 31 71 + #define R9A07G054_SDHI0_IMCLK 32 72 + #define R9A07G054_SDHI0_IMCLK2 33 73 + #define R9A07G054_SDHI0_CLK_HS 34 74 + #define R9A07G054_SDHI0_ACLK 35 75 + #define R9A07G054_SDHI1_IMCLK 36 76 + #define R9A07G054_SDHI1_IMCLK2 37 77 + #define R9A07G054_SDHI1_CLK_HS 38 78 + #define R9A07G054_SDHI1_ACLK 39 79 + #define R9A07G054_GPU_CLK 40 80 + #define R9A07G054_GPU_AXI_CLK 41 81 + #define R9A07G054_GPU_ACE_CLK 42 82 + #define R9A07G054_ISU_ACLK 43 83 + #define R9A07G054_ISU_PCLK 44 84 + #define R9A07G054_H264_CLK_A 45 85 + #define R9A07G054_H264_CLK_P 46 86 + #define R9A07G054_CRU_SYSCLK 47 87 + #define R9A07G054_CRU_VCLK 48 88 + #define R9A07G054_CRU_PCLK 49 89 + #define R9A07G054_CRU_ACLK 50 90 + #define R9A07G054_MIPI_DSI_PLLCLK 51 91 + #define R9A07G054_MIPI_DSI_SYSCLK 52 92 + #define R9A07G054_MIPI_DSI_ACLK 53 93 + #define R9A07G054_MIPI_DSI_PCLK 54 94 + #define R9A07G054_MIPI_DSI_VCLK 55 95 + #define R9A07G054_MIPI_DSI_LPCLK 56 96 + #define R9A07G054_LCDC_CLK_A 57 97 + #define R9A07G054_LCDC_CLK_P 58 98 + #define R9A07G054_LCDC_CLK_D 59 99 + #define R9A07G054_SSI0_PCLK2 60 100 + #define R9A07G054_SSI0_PCLK_SFR 61 101 + #define R9A07G054_SSI1_PCLK2 62 102 + #define R9A07G054_SSI1_PCLK_SFR 63 103 + #define R9A07G054_SSI2_PCLK2 64 104 + #define R9A07G054_SSI2_PCLK_SFR 65 105 + #define R9A07G054_SSI3_PCLK2 66 106 + #define R9A07G054_SSI3_PCLK_SFR 67 107 + #define R9A07G054_SRC_CLKP 68 108 + #define R9A07G054_USB_U2H0_HCLK 69 109 + #define R9A07G054_USB_U2H1_HCLK 70 110 + #define R9A07G054_USB_U2P_EXR_CPUCLK 71 111 + #define R9A07G054_USB_PCLK 72 112 + #define R9A07G054_ETH0_CLK_AXI 73 113 + #define R9A07G054_ETH0_CLK_CHI 74 114 + #define R9A07G054_ETH1_CLK_AXI 75 115 + #define R9A07G054_ETH1_CLK_CHI 76 116 + #define R9A07G054_I2C0_PCLK 77 117 + #define R9A07G054_I2C1_PCLK 78 118 + #define R9A07G054_I2C2_PCLK 79 119 + #define R9A07G054_I2C3_PCLK 80 120 + #define R9A07G054_SCIF0_CLK_PCK 81 121 + #define R9A07G054_SCIF1_CLK_PCK 82 122 + #define R9A07G054_SCIF2_CLK_PCK 83 123 + #define R9A07G054_SCIF3_CLK_PCK 84 124 + #define R9A07G054_SCIF4_CLK_PCK 85 125 + #define R9A07G054_SCI0_CLKP 86 126 + #define R9A07G054_SCI1_CLKP 87 127 + #define R9A07G054_IRDA_CLKP 88 128 + #define R9A07G054_RSPI0_CLKB 89 129 + #define R9A07G054_RSPI1_CLKB 90 130 + #define R9A07G054_RSPI2_CLKB 91 131 + #define R9A07G054_CANFD_PCLK 92 132 + #define R9A07G054_GPIO_HCLK 93 133 + #define R9A07G054_ADC_ADCLK 94 134 + #define R9A07G054_ADC_PCLK 95 135 + #define R9A07G054_TSU_PCLK 96 136 + #define R9A07G054_STPAI_INITCLK 97 137 + #define R9A07G054_STPAI_ACLK 98 138 + #define R9A07G054_STPAI_MCLK 99 139 + #define R9A07G054_STPAI_DCLKIN 100 140 + #define R9A07G054_STPAI_ACLK_DRP 101 141 + 142 + /* R9A07G054 Resets */ 143 + #define R9A07G054_CA55_RST_1_0 0 144 + #define R9A07G054_CA55_RST_1_1 1 145 + #define R9A07G054_CA55_RST_3_0 2 146 + #define R9A07G054_CA55_RST_3_1 3 147 + #define R9A07G054_CA55_RST_4 4 148 + #define R9A07G054_CA55_RST_5 5 149 + #define R9A07G054_CA55_RST_6 6 150 + #define R9A07G054_CA55_RST_7 7 151 + #define R9A07G054_CA55_RST_8 8 152 + #define R9A07G054_CA55_RST_9 9 153 + #define R9A07G054_CA55_RST_10 10 154 + #define R9A07G054_CA55_RST_11 11 155 + #define R9A07G054_CA55_RST_12 12 156 + #define R9A07G054_GIC600_GICRESET_N 13 157 + #define R9A07G054_GIC600_DBG_GICRESET_N 14 158 + #define R9A07G054_IA55_RESETN 15 159 + #define R9A07G054_MHU_RESETN 16 160 + #define R9A07G054_DMAC_ARESETN 17 161 + #define R9A07G054_DMAC_RST_ASYNC 18 162 + #define R9A07G054_SYC_RESETN 19 163 + #define R9A07G054_OSTM0_PRESETZ 20 164 + #define R9A07G054_OSTM1_PRESETZ 21 165 + #define R9A07G054_OSTM2_PRESETZ 22 166 + #define R9A07G054_MTU_X_PRESET_MTU3 23 167 + #define R9A07G054_POE3_RST_M_REG 24 168 + #define R9A07G054_GPT_RST_C 25 169 + #define R9A07G054_POEG_A_RST 26 170 + #define R9A07G054_POEG_B_RST 27 171 + #define R9A07G054_POEG_C_RST 28 172 + #define R9A07G054_POEG_D_RST 29 173 + #define R9A07G054_WDT0_PRESETN 30 174 + #define R9A07G054_WDT1_PRESETN 31 175 + #define R9A07G054_WDT2_PRESETN 32 176 + #define R9A07G054_SPI_RST 33 177 + #define R9A07G054_SDHI0_IXRST 34 178 + #define R9A07G054_SDHI1_IXRST 35 179 + #define R9A07G054_GPU_RESETN 36 180 + #define R9A07G054_GPU_AXI_RESETN 37 181 + #define R9A07G054_GPU_ACE_RESETN 38 182 + #define R9A07G054_ISU_ARESETN 39 183 + #define R9A07G054_ISU_PRESETN 40 184 + #define R9A07G054_H264_X_RESET_VCP 41 185 + #define R9A07G054_H264_CP_PRESET_P 42 186 + #define R9A07G054_CRU_CMN_RSTB 43 187 + #define R9A07G054_CRU_PRESETN 44 188 + #define R9A07G054_CRU_ARESETN 45 189 + #define R9A07G054_MIPI_DSI_CMN_RSTB 46 190 + #define R9A07G054_MIPI_DSI_ARESET_N 47 191 + #define R9A07G054_MIPI_DSI_PRESET_N 48 192 + #define R9A07G054_LCDC_RESET_N 49 193 + #define R9A07G054_SSI0_RST_M2_REG 50 194 + #define R9A07G054_SSI1_RST_M2_REG 51 195 + #define R9A07G054_SSI2_RST_M2_REG 52 196 + #define R9A07G054_SSI3_RST_M2_REG 53 197 + #define R9A07G054_SRC_RST 54 198 + #define R9A07G054_USB_U2H0_HRESETN 55 199 + #define R9A07G054_USB_U2H1_HRESETN 56 200 + #define R9A07G054_USB_U2P_EXL_SYSRST 57 201 + #define R9A07G054_USB_PRESETN 58 202 + #define R9A07G054_ETH0_RST_HW_N 59 203 + #define R9A07G054_ETH1_RST_HW_N 60 204 + #define R9A07G054_I2C0_MRST 61 205 + #define R9A07G054_I2C1_MRST 62 206 + #define R9A07G054_I2C2_MRST 63 207 + #define R9A07G054_I2C3_MRST 64 208 + #define R9A07G054_SCIF0_RST_SYSTEM_N 65 209 + #define R9A07G054_SCIF1_RST_SYSTEM_N 66 210 + #define R9A07G054_SCIF2_RST_SYSTEM_N 67 211 + #define R9A07G054_SCIF3_RST_SYSTEM_N 68 212 + #define R9A07G054_SCIF4_RST_SYSTEM_N 69 213 + #define R9A07G054_SCI0_RST 70 214 + #define R9A07G054_SCI1_RST 71 215 + #define R9A07G054_IRDA_RST 72 216 + #define R9A07G054_RSPI0_RST 73 217 + #define R9A07G054_RSPI1_RST 74 218 + #define R9A07G054_RSPI2_RST 75 219 + #define R9A07G054_CANFD_RSTP_N 76 220 + #define R9A07G054_CANFD_RSTC_N 77 221 + #define R9A07G054_GPIO_RSTN 78 222 + #define R9A07G054_GPIO_PORT_RESETN 79 223 + #define R9A07G054_GPIO_SPARE_RESETN 80 224 + #define R9A07G054_ADC_PRESETN 81 225 + #define R9A07G054_ADC_ADRST_N 82 226 + #define R9A07G054_TSU_PRESETN 83 227 + #define R9A07G054_STPAI_ARESETN 84 228 + 229 + #endif /* __DT_BINDINGS_CLOCK_R9A07G054_CPG_H__ */
+3
include/linux/clk-provider.h
··· 1003 1003 struct clk_hw *devm_clk_hw_register_fixed_factor(struct device *dev, 1004 1004 const char *name, const char *parent_name, unsigned long flags, 1005 1005 unsigned int mult, unsigned int div); 1006 + struct clk_hw *devm_clk_hw_register_fixed_factor_index(struct device *dev, 1007 + const char *name, unsigned int index, unsigned long flags, 1008 + unsigned int mult, unsigned int div); 1006 1009 /** 1007 1010 * struct clk_fractional_divider - adjustable fractional divider clock 1008 1011 *