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

Merge tag 'newsoc-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc

Pull RISC-V SoC updates from Arnd Bergmann:
"Add support for StarFive JH7100 RISC-V SoC

This adds support for the StarFive JH7100, including the necessary
device drivers and DT files for the BeagleV Starlight prototype board,
with additional boards to be added later. This SoC promises to be the
first usable low-cost platform for RISC-V.

I've taken this through the SoC tree in the anticipation of adding a
few other Arm based SoCs as well, but those did not pass the review in
time, so it's only this one"

* tag 'newsoc-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc:
reset: starfive-jh7100: Fix 32bit compilation
RISC-V: Add BeagleV Starlight Beta device tree
RISC-V: Add initial StarFive JH7100 device tree
serial: 8250_dw: Add StarFive JH7100 quirk
dt-bindings: serial: snps-dw-apb-uart: Add JH7100 uarts
pinctrl: starfive: Add pinctrl driver for StarFive SoCs
dt-bindings: pinctrl: Add StarFive JH7100 bindings
dt-bindings: pinctrl: Add StarFive pinctrl definitions
reset: starfive-jh7100: Add StarFive JH7100 reset driver
dt-bindings: reset: Add Starfive JH7100 reset bindings
dt-bindings: reset: Add StarFive JH7100 reset definitions
clk: starfive: Add JH7100 clock generator driver
dt-bindings: clock: starfive: Add JH7100 bindings
dt-bindings: clock: starfive: Add JH7100 clock definitions
dt-bindings: interrupt-controller: Add StarFive JH7100 plic
dt-bindings: timer: Add StarFive JH7100 clint
RISC-V: Add StarFive SoC Kconfig option

+3697
+56
Documentation/devicetree/bindings/clock/starfive,jh7100-clkgen.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/starfive,jh7100-clkgen.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive JH7100 Clock Generator 8 + 9 + maintainers: 10 + - Geert Uytterhoeven <geert@linux-m68k.org> 11 + - Emil Renner Berthing <kernel@esmil.dk> 12 + 13 + properties: 14 + compatible: 15 + const: starfive,jh7100-clkgen 16 + 17 + reg: 18 + maxItems: 1 19 + 20 + clocks: 21 + items: 22 + - description: Main clock source (25 MHz) 23 + - description: Application-specific clock source (12-27 MHz) 24 + - description: RMII reference clock (50 MHz) 25 + - description: RGMII RX clock (125 MHz) 26 + 27 + clock-names: 28 + items: 29 + - const: osc_sys 30 + - const: osc_aud 31 + - const: gmac_rmii_ref 32 + - const: gmac_gr_mii_rxclk 33 + 34 + '#clock-cells': 35 + const: 1 36 + description: 37 + See <dt-bindings/clock/starfive-jh7100.h> for valid indices. 38 + 39 + required: 40 + - compatible 41 + - reg 42 + - clocks 43 + - clock-names 44 + - '#clock-cells' 45 + 46 + additionalProperties: false 47 + 48 + examples: 49 + - | 50 + clock-controller@11800000 { 51 + compatible = "starfive,jh7100-clkgen"; 52 + reg = <0x11800000 0x10000>; 53 + clocks = <&osc_sys>, <&osc_aud>, <&gmac_rmii_ref>, <&gmac_gr_mii_rxclk>; 54 + clock-names = "osc_sys", "osc_aud", "gmac_rmii_ref", "gmac_gr_mii_rxclk"; 55 + #clock-cells = <1>; 56 + };
+1
Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml
··· 45 45 items: 46 46 - enum: 47 47 - sifive,fu540-c000-plic 48 + - starfive,jh7100-plic 48 49 - canaan,k210-plic 49 50 - const: sifive,plic-1.0.0 50 51
+307
Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/pinctrl/starfive,jh7100-pinctrl.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive JH7100 Pin Controller Device Tree Bindings 8 + 9 + description: | 10 + Bindings for the JH7100 RISC-V SoC from StarFive Ltd. 11 + 12 + Out of the SoC's many pins only the ones named PAD_GPIO[0] to PAD_GPIO[63] 13 + and PAD_FUNC_SHARE[0] to PAD_FUNC_SHARE[141] can be multiplexed and have 14 + configurable bias, drive strength, schmitt trigger etc. The SoC has an 15 + interesting 2-layered approach to pin muxing best illustrated by the diagram 16 + below. 17 + 18 + Signal group 0, 1, ... or 6 19 + ___|___ 20 + | | 21 + LCD output -----------------| | 22 + CMOS Camera interface ------| |--- PAD_GPIO[0] 23 + Ethernet PHY interface -----| MUX |--- PAD_GPIO[1] 24 + ... | | ... 25 + | |--- PAD_GPIO[63] 26 + -------- GPIO0 ------------| | 27 + | -------|-- GPIO1 --------| |--- PAD_FUNC_SHARE[0] 28 + | | | | | |--- PAD_FUNC_SHARE[1] 29 + | | | | ... | | ... 30 + | | | | | |--- PAD_FUNC_SHARE[141] 31 + | | -----|---|-- GPIO63 ---| | 32 + | | | | | | ------- 33 + UART0 UART1 -- 34 + 35 + 36 + The big MUX in the diagram only has 7 different ways of mapping peripherals 37 + on the left to pins on the right. StarFive calls the 7 configurations "signal 38 + groups". 39 + However some peripherals have their I/O go through the 64 "GPIOs". The 40 + diagram only shows UART0 and UART1, but this also includes a number of other 41 + UARTs, I2Cs, SPIs, PWMs etc. All these peripherals are connected to all 64 42 + GPIOs such that any GPIO can be set up to be controlled by any of the 43 + peripherals. 44 + Note that signal group 0 doesn't map any of the GPIOs to pins, and only 45 + signal group 1 maps the GPIOs to the pins named PAD_GPIO[0] to PAD_GPIO[63]. 46 + 47 + maintainers: 48 + - Emil Renner Berthing <kernel@esmil.dk> 49 + - Drew Fustini <drew@beagleboard.org> 50 + 51 + properties: 52 + compatible: 53 + const: starfive,jh7100-pinctrl 54 + 55 + reg: 56 + minItems: 2 57 + maxItems: 2 58 + 59 + reg-names: 60 + items: 61 + - const: gpio 62 + - const: padctl 63 + 64 + clocks: 65 + maxItems: 1 66 + 67 + resets: 68 + maxItems: 1 69 + 70 + gpio-controller: true 71 + 72 + "#gpio-cells": 73 + const: 2 74 + 75 + interrupts: 76 + maxItems: 1 77 + description: The GPIO parent interrupt. 78 + 79 + interrupt-controller: true 80 + 81 + "#interrupt-cells": 82 + const: 2 83 + 84 + starfive,signal-group: 85 + description: | 86 + Select one of the 7 signal groups. If this property is not set it 87 + defaults to the configuration already chosen by the earlier boot stages. 88 + $ref: /schemas/types.yaml#/definitions/uint32 89 + enum: [0, 1, 2, 3, 4, 5, 6] 90 + 91 + required: 92 + - compatible 93 + - reg 94 + - reg-names 95 + - clocks 96 + - gpio-controller 97 + - "#gpio-cells" 98 + - interrupts 99 + - interrupt-controller 100 + - "#interrupt-cells" 101 + 102 + patternProperties: 103 + '-[0-9]+$': 104 + type: object 105 + patternProperties: 106 + '-pins$': 107 + type: object 108 + description: | 109 + A pinctrl node should contain at least one subnode representing the 110 + pinctrl groups available on the machine. Each subnode will list the 111 + pins it needs, and how they should be configured, with regard to 112 + muxer configuration, bias, input enable/disable, input schmitt 113 + trigger enable/disable, slew-rate and drive strength. 114 + $ref: "/schemas/pinctrl/pincfg-node.yaml" 115 + 116 + properties: 117 + pins: 118 + description: | 119 + The list of pin identifiers that properties in the node apply to. 120 + This should be set using either the PAD_GPIO or PAD_FUNC_SHARE 121 + macros. 122 + Either this or "pinmux" has to be specified, but not both. 123 + $ref: "/schemas/pinctrl/pinmux-node.yaml#/properties/pins" 124 + 125 + pinmux: 126 + description: | 127 + The list of GPIOs and their mux settings that properties in the 128 + node apply to. This should be set using the GPIOMUX macro. 129 + Either this or "pins" has to be specified, but not both. 130 + $ref: "/schemas/pinctrl/pinmux-node.yaml#/properties/pinmux" 131 + 132 + bias-disable: true 133 + 134 + bias-pull-up: 135 + type: boolean 136 + 137 + bias-pull-down: 138 + type: boolean 139 + 140 + drive-strength: 141 + enum: [ 14, 21, 28, 35, 42, 49, 56, 63 ] 142 + 143 + input-enable: true 144 + 145 + input-disable: true 146 + 147 + input-schmitt-enable: true 148 + 149 + input-schmitt-disable: true 150 + 151 + slew-rate: 152 + maximum: 7 153 + 154 + starfive,strong-pull-up: 155 + description: enable strong pull-up. 156 + type: boolean 157 + 158 + additionalProperties: false 159 + 160 + additionalProperties: false 161 + 162 + additionalProperties: false 163 + 164 + examples: 165 + - | 166 + #include <dt-bindings/clock/starfive-jh7100.h> 167 + #include <dt-bindings/reset/starfive-jh7100.h> 168 + #include <dt-bindings/pinctrl/pinctrl-starfive.h> 169 + 170 + soc { 171 + #address-cells = <2>; 172 + #size-cells = <2>; 173 + 174 + pinctrl@11910000 { 175 + compatible = "starfive,jh7100-pinctrl"; 176 + reg = <0x0 0x11910000 0x0 0x10000>, 177 + <0x0 0x11858000 0x0 0x1000>; 178 + reg-names = "gpio", "padctl"; 179 + clocks = <&clkgen JH7100_CLK_GPIO_APB>; 180 + resets = <&clkgen JH7100_RSTN_GPIO_APB>; 181 + interrupts = <32>; 182 + gpio-controller; 183 + #gpio-cells = <2>; 184 + interrupt-controller; 185 + #interrupt-cells = <2>; 186 + starfive,signal-group = <6>; 187 + 188 + gmac_pins_default: gmac-0 { 189 + gtxclk-pins { 190 + pins = <PAD_FUNC_SHARE(115)>; 191 + bias-pull-up; 192 + drive-strength = <35>; 193 + input-enable; 194 + input-schmitt-enable; 195 + slew-rate = <0>; 196 + }; 197 + miitxclk-pins { 198 + pins = <PAD_FUNC_SHARE(116)>; 199 + bias-pull-up; 200 + drive-strength = <14>; 201 + input-enable; 202 + input-schmitt-disable; 203 + slew-rate = <0>; 204 + }; 205 + tx-pins { 206 + pins = <PAD_FUNC_SHARE(117)>, 207 + <PAD_FUNC_SHARE(119)>, 208 + <PAD_FUNC_SHARE(120)>, 209 + <PAD_FUNC_SHARE(121)>, 210 + <PAD_FUNC_SHARE(122)>, 211 + <PAD_FUNC_SHARE(123)>, 212 + <PAD_FUNC_SHARE(124)>, 213 + <PAD_FUNC_SHARE(125)>, 214 + <PAD_FUNC_SHARE(126)>; 215 + bias-disable; 216 + drive-strength = <35>; 217 + input-disable; 218 + input-schmitt-disable; 219 + slew-rate = <0>; 220 + }; 221 + rxclk-pins { 222 + pins = <PAD_FUNC_SHARE(127)>; 223 + bias-pull-up; 224 + drive-strength = <14>; 225 + input-enable; 226 + input-schmitt-disable; 227 + slew-rate = <6>; 228 + }; 229 + rxer-pins { 230 + pins = <PAD_FUNC_SHARE(129)>; 231 + bias-pull-up; 232 + drive-strength = <14>; 233 + input-enable; 234 + input-schmitt-disable; 235 + slew-rate = <0>; 236 + }; 237 + rx-pins { 238 + pins = <PAD_FUNC_SHARE(128)>, 239 + <PAD_FUNC_SHARE(130)>, 240 + <PAD_FUNC_SHARE(131)>, 241 + <PAD_FUNC_SHARE(132)>, 242 + <PAD_FUNC_SHARE(133)>, 243 + <PAD_FUNC_SHARE(134)>, 244 + <PAD_FUNC_SHARE(135)>, 245 + <PAD_FUNC_SHARE(136)>, 246 + <PAD_FUNC_SHARE(137)>, 247 + <PAD_FUNC_SHARE(138)>, 248 + <PAD_FUNC_SHARE(139)>, 249 + <PAD_FUNC_SHARE(140)>, 250 + <PAD_FUNC_SHARE(141)>; 251 + bias-pull-up; 252 + drive-strength = <14>; 253 + input-enable; 254 + input-schmitt-enable; 255 + slew-rate = <0>; 256 + }; 257 + }; 258 + 259 + i2c0_pins_default: i2c0-0 { 260 + i2c-pins { 261 + pinmux = <GPIOMUX(62, GPO_LOW, 262 + GPO_I2C0_PAD_SCK_OEN, 263 + GPI_I2C0_PAD_SCK_IN)>, 264 + <GPIOMUX(61, GPO_LOW, 265 + GPO_I2C0_PAD_SDA_OEN, 266 + GPI_I2C0_PAD_SDA_IN)>; 267 + bias-disable; /* external pull-up */ 268 + input-enable; 269 + input-schmitt-enable; 270 + }; 271 + }; 272 + 273 + uart3_pins_default: uart3-0 { 274 + rx-pins { 275 + pinmux = <GPIOMUX(13, GPO_LOW, GPO_DISABLE, 276 + GPI_UART3_PAD_SIN)>; 277 + bias-pull-up; 278 + input-enable; 279 + input-schmitt-enable; 280 + }; 281 + tx-pins { 282 + pinmux = <GPIOMUX(14, GPO_UART3_PAD_SOUT, 283 + GPO_ENABLE, GPI_NONE)>; 284 + bias-disable; 285 + input-disable; 286 + input-schmitt-disable; 287 + }; 288 + }; 289 + }; 290 + 291 + gmac { 292 + pinctrl-0 = <&gmac_pins_default>; 293 + pinctrl-names = "default"; 294 + }; 295 + 296 + i2c0 { 297 + pinctrl-0 = <&i2c0_pins_default>; 298 + pinctrl-names = "default"; 299 + }; 300 + 301 + uart3 { 302 + pinctrl-0 = <&uart3_pins_default>; 303 + pinctrl-names = "default"; 304 + }; 305 + }; 306 + 307 + ...
+38
Documentation/devicetree/bindings/reset/starfive,jh7100-reset.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/reset/starfive,jh7100-reset.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive JH7100 SoC Reset Controller Device Tree Bindings 8 + 9 + maintainers: 10 + - Emil Renner Berthing <kernel@esmil.dk> 11 + 12 + properties: 13 + compatible: 14 + enum: 15 + - starfive,jh7100-reset 16 + 17 + reg: 18 + maxItems: 1 19 + 20 + "#reset-cells": 21 + const: 1 22 + 23 + required: 24 + - compatible 25 + - reg 26 + - "#reset-cells" 27 + 28 + additionalProperties: false 29 + 30 + examples: 31 + - | 32 + reset-controller@11840000 { 33 + compatible = "starfive,jh7100-reset"; 34 + reg = <0x11840000 0x10000>; 35 + #reset-cells = <1>; 36 + }; 37 + 38 + ...
+5
Documentation/devicetree/bindings/serial/snps-dw-apb-uart.yaml
··· 40 40 - brcm,bcm11351-dw-apb-uart 41 41 - brcm,bcm21664-dw-apb-uart 42 42 - const: snps,dw-apb-uart 43 + - items: 44 + - enum: 45 + - starfive,jh7100-hsuart 46 + - starfive,jh7100-uart 47 + - const: snps,dw-apb-uart 43 48 - const: snps,dw-apb-uart 44 49 45 50 reg:
+1
Documentation/devicetree/bindings/timer/sifive,clint.yaml
··· 25 25 items: 26 26 - enum: 27 27 - sifive,fu540-c000-clint 28 + - starfive,jh7100-clint 28 29 - canaan,k210-clint 29 30 - const: sifive,clint0 30 31
+22
MAINTAINERS
··· 18164 18164 S: Odd Fixes 18165 18165 F: drivers/net/ethernet/adaptec/starfire* 18166 18166 18167 + STARFIVE JH7100 CLOCK DRIVER 18168 + M: Emil Renner Berthing <kernel@esmil.dk> 18169 + S: Maintained 18170 + F: Documentation/devicetree/bindings/clock/starfive,jh7100-clkgen.yaml 18171 + F: drivers/clk/starfive/clk-starfive-jh7100.c 18172 + F: include/dt-bindings/clock/starfive-jh7100.h 18173 + 18174 + STARFIVE JH7100 PINCTRL DRIVER 18175 + M: Emil Renner Berthing <kernel@esmil.dk> 18176 + L: linux-gpio@vger.kernel.org 18177 + S: Maintained 18178 + F: Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml 18179 + F: drivers/pinctrl/pinctrl-starfive.c 18180 + F: include/dt-bindings/pinctrl/pinctrl-starfive.h 18181 + 18182 + STARFIVE JH7100 RESET CONTROLLER DRIVER 18183 + M: Emil Renner Berthing <kernel@esmil.dk> 18184 + S: Maintained 18185 + F: Documentation/devicetree/bindings/reset/starfive,jh7100-reset.yaml 18186 + F: drivers/reset/reset-starfive-jh7100.c 18187 + F: include/dt-bindings/reset/starfive-jh7100.h 18188 + 18167 18189 STATIC BRANCH/CALL 18168 18190 M: Peter Zijlstra <peterz@infradead.org> 18169 18191 M: Josh Poimboeuf <jpoimboe@redhat.com>
+8
arch/riscv/Kconfig.socs
··· 19 19 help 20 20 This enables support for SiFive SoC platform hardware. 21 21 22 + config SOC_STARFIVE 23 + bool "StarFive SoCs" 24 + select PINCTRL 25 + select RESET_CONTROLLER 26 + select SIFIVE_PLIC 27 + help 28 + This enables support for StarFive SoC platform hardware. 29 + 22 30 config SOC_VIRT 23 31 bool "QEMU Virt Machine" 24 32 select CLINT_TIMER if RISCV_M_MODE
+1
arch/riscv/boot/dts/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 subdir-y += sifive 3 + subdir-y += starfive 3 4 subdir-$(CONFIG_SOC_CANAAN_K210_DTB_BUILTIN) += canaan 4 5 subdir-y += microchip 5 6
+2
arch/riscv/boot/dts/starfive/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + dtb-$(CONFIG_SOC_STARFIVE) += jh7100-beaglev-starlight.dtb
+164
arch/riscv/boot/dts/starfive/jh7100-beaglev-starlight.dts
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright (C) 2021 StarFive Technology Co., Ltd. 4 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 5 + */ 6 + 7 + /dts-v1/; 8 + #include "jh7100.dtsi" 9 + #include <dt-bindings/gpio/gpio.h> 10 + #include <dt-bindings/leds/common.h> 11 + #include <dt-bindings/pinctrl/pinctrl-starfive.h> 12 + 13 + / { 14 + model = "BeagleV Starlight Beta"; 15 + compatible = "beagle,beaglev-starlight-jh7100-r0", "starfive,jh7100"; 16 + 17 + aliases { 18 + serial0 = &uart3; 19 + }; 20 + 21 + chosen { 22 + stdout-path = "serial0:115200n8"; 23 + }; 24 + 25 + cpus { 26 + timebase-frequency = <6250000>; 27 + }; 28 + 29 + memory@80000000 { 30 + device_type = "memory"; 31 + reg = <0x0 0x80000000 0x2 0x0>; 32 + }; 33 + 34 + leds { 35 + compatible = "gpio-leds"; 36 + 37 + led-ack { 38 + gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; 39 + color = <LED_COLOR_ID_GREEN>; 40 + function = LED_FUNCTION_HEARTBEAT; 41 + linux,default-trigger = "heartbeat"; 42 + label = "ack"; 43 + }; 44 + }; 45 + }; 46 + 47 + &gpio { 48 + i2c0_pins: i2c0-0 { 49 + i2c-pins { 50 + pinmux = <GPIOMUX(62, GPO_LOW, 51 + GPO_I2C0_PAD_SCK_OEN, 52 + GPI_I2C0_PAD_SCK_IN)>, 53 + <GPIOMUX(61, GPO_LOW, 54 + GPO_I2C0_PAD_SDA_OEN, 55 + GPI_I2C0_PAD_SDA_IN)>; 56 + bias-disable; /* external pull-up */ 57 + input-enable; 58 + input-schmitt-enable; 59 + }; 60 + }; 61 + 62 + i2c1_pins: i2c1-0 { 63 + i2c-pins { 64 + pinmux = <GPIOMUX(47, GPO_LOW, 65 + GPO_I2C1_PAD_SCK_OEN, 66 + GPI_I2C1_PAD_SCK_IN)>, 67 + <GPIOMUX(48, GPO_LOW, 68 + GPO_I2C1_PAD_SDA_OEN, 69 + GPI_I2C1_PAD_SDA_IN)>; 70 + bias-pull-up; 71 + input-enable; 72 + input-schmitt-enable; 73 + }; 74 + }; 75 + 76 + i2c2_pins: i2c2-0 { 77 + i2c-pins { 78 + pinmux = <GPIOMUX(60, GPO_LOW, 79 + GPO_I2C2_PAD_SCK_OEN, 80 + GPI_I2C2_PAD_SCK_IN)>, 81 + <GPIOMUX(59, GPO_LOW, 82 + GPO_I2C2_PAD_SDA_OEN, 83 + GPI_I2C2_PAD_SDA_IN)>; 84 + bias-disable; /* external pull-up */ 85 + input-enable; 86 + input-schmitt-enable; 87 + }; 88 + }; 89 + 90 + uart3_pins: uart3-0 { 91 + rx-pins { 92 + pinmux = <GPIOMUX(13, GPO_LOW, GPO_DISABLE, 93 + GPI_UART3_PAD_SIN)>; 94 + bias-pull-up; 95 + drive-strength = <14>; 96 + input-enable; 97 + input-schmitt-enable; 98 + slew-rate = <0>; 99 + }; 100 + tx-pins { 101 + pinmux = <GPIOMUX(14, GPO_UART3_PAD_SOUT, 102 + GPO_ENABLE, GPI_NONE)>; 103 + bias-disable; 104 + drive-strength = <35>; 105 + input-disable; 106 + input-schmitt-disable; 107 + slew-rate = <0>; 108 + }; 109 + }; 110 + }; 111 + 112 + &i2c0 { 113 + clock-frequency = <100000>; 114 + i2c-sda-hold-time-ns = <300>; 115 + i2c-sda-falling-time-ns = <500>; 116 + i2c-scl-falling-time-ns = <500>; 117 + pinctrl-names = "default"; 118 + pinctrl-0 = <&i2c0_pins>; 119 + status = "okay"; 120 + 121 + pmic@5e { 122 + compatible = "ti,tps65086"; 123 + reg = <0x5e>; 124 + gpio-controller; 125 + #gpio-cells = <2>; 126 + 127 + regulators { 128 + }; 129 + }; 130 + }; 131 + 132 + &i2c1 { 133 + clock-frequency = <400000>; 134 + i2c-sda-hold-time-ns = <300>; 135 + i2c-sda-falling-time-ns = <100>; 136 + i2c-scl-falling-time-ns = <100>; 137 + pinctrl-names = "default"; 138 + pinctrl-0 = <&i2c1_pins>; 139 + status = "okay"; 140 + }; 141 + 142 + &i2c2 { 143 + clock-frequency = <100000>; 144 + i2c-sda-hold-time-ns = <300>; 145 + i2c-sda-falling-time-ns = <500>; 146 + i2c-scl-falling-time-ns = <500>; 147 + pinctrl-names = "default"; 148 + pinctrl-0 = <&i2c2_pins>; 149 + status = "okay"; 150 + }; 151 + 152 + &osc_sys { 153 + clock-frequency = <25000000>; 154 + }; 155 + 156 + &osc_aud { 157 + clock-frequency = <27000000>; 158 + }; 159 + 160 + &uart3 { 161 + pinctrl-names = "default"; 162 + pinctrl-0 = <&uart3_pins>; 163 + status = "okay"; 164 + };
+230
arch/riscv/boot/dts/starfive/jh7100.dtsi
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright (C) 2021 StarFive Technology Co., Ltd. 4 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 5 + */ 6 + 7 + /dts-v1/; 8 + #include <dt-bindings/clock/starfive-jh7100.h> 9 + #include <dt-bindings/reset/starfive-jh7100.h> 10 + 11 + / { 12 + compatible = "starfive,jh7100"; 13 + #address-cells = <2>; 14 + #size-cells = <2>; 15 + 16 + cpus { 17 + #address-cells = <1>; 18 + #size-cells = <0>; 19 + 20 + cpu@0 { 21 + compatible = "sifive,u74-mc", "riscv"; 22 + reg = <0>; 23 + d-cache-block-size = <64>; 24 + d-cache-sets = <64>; 25 + d-cache-size = <32768>; 26 + d-tlb-sets = <1>; 27 + d-tlb-size = <32>; 28 + device_type = "cpu"; 29 + i-cache-block-size = <64>; 30 + i-cache-sets = <64>; 31 + i-cache-size = <32768>; 32 + i-tlb-sets = <1>; 33 + i-tlb-size = <32>; 34 + mmu-type = "riscv,sv39"; 35 + riscv,isa = "rv64imafdc"; 36 + tlb-split; 37 + 38 + cpu0_intc: interrupt-controller { 39 + compatible = "riscv,cpu-intc"; 40 + interrupt-controller; 41 + #interrupt-cells = <1>; 42 + }; 43 + }; 44 + 45 + cpu@1 { 46 + compatible = "sifive,u74-mc", "riscv"; 47 + reg = <1>; 48 + d-cache-block-size = <64>; 49 + d-cache-sets = <64>; 50 + d-cache-size = <32768>; 51 + d-tlb-sets = <1>; 52 + d-tlb-size = <32>; 53 + device_type = "cpu"; 54 + i-cache-block-size = <64>; 55 + i-cache-sets = <64>; 56 + i-cache-size = <32768>; 57 + i-tlb-sets = <1>; 58 + i-tlb-size = <32>; 59 + mmu-type = "riscv,sv39"; 60 + riscv,isa = "rv64imafdc"; 61 + tlb-split; 62 + 63 + cpu1_intc: interrupt-controller { 64 + compatible = "riscv,cpu-intc"; 65 + interrupt-controller; 66 + #interrupt-cells = <1>; 67 + }; 68 + }; 69 + }; 70 + 71 + osc_sys: osc_sys { 72 + compatible = "fixed-clock"; 73 + #clock-cells = <0>; 74 + /* This value must be overridden by the board */ 75 + clock-frequency = <0>; 76 + }; 77 + 78 + osc_aud: osc_aud { 79 + compatible = "fixed-clock"; 80 + #clock-cells = <0>; 81 + /* This value must be overridden by the board */ 82 + clock-frequency = <0>; 83 + }; 84 + 85 + gmac_rmii_ref: gmac_rmii_ref { 86 + compatible = "fixed-clock"; 87 + #clock-cells = <0>; 88 + /* Should be overridden by the board when needed */ 89 + clock-frequency = <0>; 90 + }; 91 + 92 + gmac_gr_mii_rxclk: gmac_gr_mii_rxclk { 93 + compatible = "fixed-clock"; 94 + #clock-cells = <0>; 95 + /* Should be overridden by the board when needed */ 96 + clock-frequency = <0>; 97 + }; 98 + 99 + soc { 100 + compatible = "simple-bus"; 101 + interrupt-parent = <&plic>; 102 + #address-cells = <2>; 103 + #size-cells = <2>; 104 + ranges; 105 + 106 + clint: clint@2000000 { 107 + compatible = "starfive,jh7100-clint", "sifive,clint0"; 108 + reg = <0x0 0x2000000 0x0 0x10000>; 109 + interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7 110 + &cpu1_intc 3 &cpu1_intc 7>; 111 + }; 112 + 113 + plic: interrupt-controller@c000000 { 114 + compatible = "starfive,jh7100-plic", "sifive,plic-1.0.0"; 115 + reg = <0x0 0xc000000 0x0 0x4000000>; 116 + interrupts-extended = <&cpu0_intc 11 &cpu0_intc 9 117 + &cpu1_intc 11 &cpu1_intc 9>; 118 + interrupt-controller; 119 + #address-cells = <0>; 120 + #interrupt-cells = <1>; 121 + riscv,ndev = <127>; 122 + }; 123 + 124 + clkgen: clock-controller@11800000 { 125 + compatible = "starfive,jh7100-clkgen"; 126 + reg = <0x0 0x11800000 0x0 0x10000>; 127 + clocks = <&osc_sys>, <&osc_aud>, <&gmac_rmii_ref>, <&gmac_gr_mii_rxclk>; 128 + clock-names = "osc_sys", "osc_aud", "gmac_rmii_ref", "gmac_gr_mii_rxclk"; 129 + #clock-cells = <1>; 130 + }; 131 + 132 + rstgen: reset-controller@11840000 { 133 + compatible = "starfive,jh7100-reset"; 134 + reg = <0x0 0x11840000 0x0 0x10000>; 135 + #reset-cells = <1>; 136 + }; 137 + 138 + i2c0: i2c@118b0000 { 139 + compatible = "snps,designware-i2c"; 140 + reg = <0x0 0x118b0000 0x0 0x10000>; 141 + clocks = <&clkgen JH7100_CLK_I2C0_CORE>, 142 + <&clkgen JH7100_CLK_I2C0_APB>; 143 + clock-names = "ref", "pclk"; 144 + resets = <&rstgen JH7100_RSTN_I2C0_APB>; 145 + interrupts = <96>; 146 + #address-cells = <1>; 147 + #size-cells = <0>; 148 + status = "disabled"; 149 + }; 150 + 151 + i2c1: i2c@118c0000 { 152 + compatible = "snps,designware-i2c"; 153 + reg = <0x0 0x118c0000 0x0 0x10000>; 154 + clocks = <&clkgen JH7100_CLK_I2C1_CORE>, 155 + <&clkgen JH7100_CLK_I2C1_APB>; 156 + clock-names = "ref", "pclk"; 157 + resets = <&rstgen JH7100_RSTN_I2C1_APB>; 158 + interrupts = <97>; 159 + #address-cells = <1>; 160 + #size-cells = <0>; 161 + status = "disabled"; 162 + }; 163 + 164 + gpio: pinctrl@11910000 { 165 + compatible = "starfive,jh7100-pinctrl"; 166 + reg = <0x0 0x11910000 0x0 0x10000>, 167 + <0x0 0x11858000 0x0 0x1000>; 168 + reg-names = "gpio", "padctl"; 169 + clocks = <&clkgen JH7100_CLK_GPIO_APB>; 170 + resets = <&rstgen JH7100_RSTN_GPIO_APB>; 171 + interrupts = <32>; 172 + gpio-controller; 173 + #gpio-cells = <2>; 174 + interrupt-controller; 175 + #interrupt-cells = <2>; 176 + }; 177 + 178 + uart2: serial@12430000 { 179 + compatible = "starfive,jh7100-uart", "snps,dw-apb-uart"; 180 + reg = <0x0 0x12430000 0x0 0x10000>; 181 + clocks = <&clkgen JH7100_CLK_UART2_CORE>, 182 + <&clkgen JH7100_CLK_UART2_APB>; 183 + clock-names = "baudclk", "apb_pclk"; 184 + resets = <&rstgen JH7100_RSTN_UART2_APB>; 185 + interrupts = <72>; 186 + reg-io-width = <4>; 187 + reg-shift = <2>; 188 + status = "disabled"; 189 + }; 190 + 191 + uart3: serial@12440000 { 192 + compatible = "starfive,jh7100-uart", "snps,dw-apb-uart"; 193 + reg = <0x0 0x12440000 0x0 0x10000>; 194 + clocks = <&clkgen JH7100_CLK_UART3_CORE>, 195 + <&clkgen JH7100_CLK_UART3_APB>; 196 + clock-names = "baudclk", "apb_pclk"; 197 + resets = <&rstgen JH7100_RSTN_UART3_APB>; 198 + interrupts = <73>; 199 + reg-io-width = <4>; 200 + reg-shift = <2>; 201 + status = "disabled"; 202 + }; 203 + 204 + i2c2: i2c@12450000 { 205 + compatible = "snps,designware-i2c"; 206 + reg = <0x0 0x12450000 0x0 0x10000>; 207 + clocks = <&clkgen JH7100_CLK_I2C2_CORE>, 208 + <&clkgen JH7100_CLK_I2C2_APB>; 209 + clock-names = "ref", "pclk"; 210 + resets = <&rstgen JH7100_RSTN_I2C2_APB>; 211 + interrupts = <74>; 212 + #address-cells = <1>; 213 + #size-cells = <0>; 214 + status = "disabled"; 215 + }; 216 + 217 + i2c3: i2c@12460000 { 218 + compatible = "snps,designware-i2c"; 219 + reg = <0x0 0x12460000 0x0 0x10000>; 220 + clocks = <&clkgen JH7100_CLK_I2C3_CORE>, 221 + <&clkgen JH7100_CLK_I2C3_APB>; 222 + clock-names = "ref", "pclk"; 223 + resets = <&rstgen JH7100_RSTN_I2C3_APB>; 224 + interrupts = <75>; 225 + #address-cells = <1>; 226 + #size-cells = <0>; 227 + status = "disabled"; 228 + }; 229 + }; 230 + };
+1
drivers/clk/Kconfig
··· 412 412 source "drivers/clk/sifive/Kconfig" 413 413 source "drivers/clk/socfpga/Kconfig" 414 414 source "drivers/clk/sprd/Kconfig" 415 + source "drivers/clk/starfive/Kconfig" 415 416 source "drivers/clk/sunxi/Kconfig" 416 417 source "drivers/clk/sunxi-ng/Kconfig" 417 418 source "drivers/clk/tegra/Kconfig"
+1
drivers/clk/Makefile
··· 109 109 obj-$(CONFIG_PLAT_SPEAR) += spear/ 110 110 obj-y += sprd/ 111 111 obj-$(CONFIG_ARCH_STI) += st/ 112 + obj-$(CONFIG_SOC_STARFIVE) += starfive/ 112 113 obj-$(CONFIG_ARCH_SUNXI) += sunxi/ 113 114 obj-$(CONFIG_SUNXI_CCU) += sunxi-ng/ 114 115 obj-$(CONFIG_ARCH_TEGRA) += tegra/
+9
drivers/clk/starfive/Kconfig
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + 3 + config CLK_STARFIVE_JH7100 4 + bool "StarFive JH7100 clock support" 5 + depends on SOC_STARFIVE || COMPILE_TEST 6 + default SOC_STARFIVE 7 + help 8 + Say yes here to support the clock controller on the StarFive JH7100 9 + SoC.
+3
drivers/clk/starfive/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + # StarFive Clock 3 + obj-$(CONFIG_CLK_STARFIVE_JH7100) += clk-starfive-jh7100.o
+689
drivers/clk/starfive/clk-starfive-jh7100.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * StarFive JH7100 Clock Generator Driver 4 + * 5 + * Copyright 2021 Ahmad Fatoum, Pengutronix 6 + * Copyright (C) 2021 Glider bv 7 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 8 + */ 9 + 10 + #include <linux/bits.h> 11 + #include <linux/clk-provider.h> 12 + #include <linux/debugfs.h> 13 + #include <linux/device.h> 14 + #include <linux/init.h> 15 + #include <linux/io.h> 16 + #include <linux/kernel.h> 17 + #include <linux/mod_devicetable.h> 18 + #include <linux/module.h> 19 + #include <linux/platform_device.h> 20 + 21 + #include <dt-bindings/clock/starfive-jh7100.h> 22 + 23 + /* external clocks */ 24 + #define JH7100_CLK_OSC_SYS (JH7100_CLK_END + 0) 25 + #define JH7100_CLK_OSC_AUD (JH7100_CLK_END + 1) 26 + #define JH7100_CLK_GMAC_RMII_REF (JH7100_CLK_END + 2) 27 + #define JH7100_CLK_GMAC_GR_MII_RX (JH7100_CLK_END + 3) 28 + 29 + /* register fields */ 30 + #define JH7100_CLK_ENABLE BIT(31) 31 + #define JH7100_CLK_INVERT BIT(30) 32 + #define JH7100_CLK_MUX_MASK GENMASK(27, 24) 33 + #define JH7100_CLK_MUX_SHIFT 24 34 + #define JH7100_CLK_DIV_MASK GENMASK(23, 0) 35 + 36 + /* clock data */ 37 + #define JH7100_GATE(_idx, _name, _flags, _parent) [_idx] = { \ 38 + .name = _name, \ 39 + .flags = CLK_SET_RATE_PARENT | (_flags), \ 40 + .max = JH7100_CLK_ENABLE, \ 41 + .parents = { [0] = _parent }, \ 42 + } 43 + 44 + #define JH7100__DIV(_idx, _name, _max, _parent) [_idx] = { \ 45 + .name = _name, \ 46 + .flags = 0, \ 47 + .max = _max, \ 48 + .parents = { [0] = _parent }, \ 49 + } 50 + 51 + #define JH7100_GDIV(_idx, _name, _flags, _max, _parent) [_idx] = { \ 52 + .name = _name, \ 53 + .flags = _flags, \ 54 + .max = JH7100_CLK_ENABLE | (_max), \ 55 + .parents = { [0] = _parent }, \ 56 + } 57 + 58 + #define JH7100__MUX(_idx, _name, _nparents, ...) [_idx] = { \ 59 + .name = _name, \ 60 + .flags = 0, \ 61 + .max = ((_nparents) - 1) << JH7100_CLK_MUX_SHIFT, \ 62 + .parents = { __VA_ARGS__ }, \ 63 + } 64 + 65 + #define JH7100_GMUX(_idx, _name, _flags, _nparents, ...) [_idx] = { \ 66 + .name = _name, \ 67 + .flags = _flags, \ 68 + .max = JH7100_CLK_ENABLE | \ 69 + (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT), \ 70 + .parents = { __VA_ARGS__ }, \ 71 + } 72 + 73 + #define JH7100__INV(_idx, _name, _parent) [_idx] = { \ 74 + .name = _name, \ 75 + .flags = CLK_SET_RATE_PARENT, \ 76 + .max = JH7100_CLK_INVERT, \ 77 + .parents = { [0] = _parent }, \ 78 + } 79 + 80 + static const struct { 81 + const char *name; 82 + unsigned long flags; 83 + u32 max; 84 + u8 parents[4]; 85 + } jh7100_clk_data[] __initconst = { 86 + JH7100__MUX(JH7100_CLK_CPUNDBUS_ROOT, "cpundbus_root", 4, 87 + JH7100_CLK_OSC_SYS, 88 + JH7100_CLK_PLL0_OUT, 89 + JH7100_CLK_PLL1_OUT, 90 + JH7100_CLK_PLL2_OUT), 91 + JH7100__MUX(JH7100_CLK_DLA_ROOT, "dla_root", 3, 92 + JH7100_CLK_OSC_SYS, 93 + JH7100_CLK_PLL1_OUT, 94 + JH7100_CLK_PLL2_OUT), 95 + JH7100__MUX(JH7100_CLK_DSP_ROOT, "dsp_root", 4, 96 + JH7100_CLK_OSC_SYS, 97 + JH7100_CLK_PLL0_OUT, 98 + JH7100_CLK_PLL1_OUT, 99 + JH7100_CLK_PLL2_OUT), 100 + JH7100__MUX(JH7100_CLK_GMACUSB_ROOT, "gmacusb_root", 3, 101 + JH7100_CLK_OSC_SYS, 102 + JH7100_CLK_PLL0_OUT, 103 + JH7100_CLK_PLL2_OUT), 104 + JH7100__MUX(JH7100_CLK_PERH0_ROOT, "perh0_root", 2, 105 + JH7100_CLK_OSC_SYS, 106 + JH7100_CLK_PLL0_OUT), 107 + JH7100__MUX(JH7100_CLK_PERH1_ROOT, "perh1_root", 2, 108 + JH7100_CLK_OSC_SYS, 109 + JH7100_CLK_PLL2_OUT), 110 + JH7100__MUX(JH7100_CLK_VIN_ROOT, "vin_root", 3, 111 + JH7100_CLK_OSC_SYS, 112 + JH7100_CLK_PLL1_OUT, 113 + JH7100_CLK_PLL2_OUT), 114 + JH7100__MUX(JH7100_CLK_VOUT_ROOT, "vout_root", 3, 115 + JH7100_CLK_OSC_AUD, 116 + JH7100_CLK_PLL0_OUT, 117 + JH7100_CLK_PLL2_OUT), 118 + JH7100_GDIV(JH7100_CLK_AUDIO_ROOT, "audio_root", 0, 8, JH7100_CLK_PLL0_OUT), 119 + JH7100__MUX(JH7100_CLK_CDECHIFI4_ROOT, "cdechifi4_root", 3, 120 + JH7100_CLK_OSC_SYS, 121 + JH7100_CLK_PLL1_OUT, 122 + JH7100_CLK_PLL2_OUT), 123 + JH7100__MUX(JH7100_CLK_CDEC_ROOT, "cdec_root", 3, 124 + JH7100_CLK_OSC_SYS, 125 + JH7100_CLK_PLL0_OUT, 126 + JH7100_CLK_PLL1_OUT), 127 + JH7100__MUX(JH7100_CLK_VOUTBUS_ROOT, "voutbus_root", 3, 128 + JH7100_CLK_OSC_AUD, 129 + JH7100_CLK_PLL0_OUT, 130 + JH7100_CLK_PLL2_OUT), 131 + JH7100__DIV(JH7100_CLK_CPUNBUS_ROOT_DIV, "cpunbus_root_div", 2, JH7100_CLK_CPUNDBUS_ROOT), 132 + JH7100__DIV(JH7100_CLK_DSP_ROOT_DIV, "dsp_root_div", 4, JH7100_CLK_DSP_ROOT), 133 + JH7100__DIV(JH7100_CLK_PERH0_SRC, "perh0_src", 4, JH7100_CLK_PERH0_ROOT), 134 + JH7100__DIV(JH7100_CLK_PERH1_SRC, "perh1_src", 4, JH7100_CLK_PERH1_ROOT), 135 + JH7100_GDIV(JH7100_CLK_PLL0_TESTOUT, "pll0_testout", 0, 31, JH7100_CLK_PERH0_SRC), 136 + JH7100_GDIV(JH7100_CLK_PLL1_TESTOUT, "pll1_testout", 0, 31, JH7100_CLK_DLA_ROOT), 137 + JH7100_GDIV(JH7100_CLK_PLL2_TESTOUT, "pll2_testout", 0, 31, JH7100_CLK_PERH1_SRC), 138 + JH7100__MUX(JH7100_CLK_PLL2_REF, "pll2_refclk", 2, 139 + JH7100_CLK_OSC_SYS, 140 + JH7100_CLK_OSC_AUD), 141 + JH7100__DIV(JH7100_CLK_CPU_CORE, "cpu_core", 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 142 + JH7100__DIV(JH7100_CLK_CPU_AXI, "cpu_axi", 8, JH7100_CLK_CPU_CORE), 143 + JH7100__DIV(JH7100_CLK_AHB_BUS, "ahb_bus", 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 144 + JH7100__DIV(JH7100_CLK_APB1_BUS, "apb1_bus", 8, JH7100_CLK_AHB_BUS), 145 + JH7100__DIV(JH7100_CLK_APB2_BUS, "apb2_bus", 8, JH7100_CLK_AHB_BUS), 146 + JH7100_GATE(JH7100_CLK_DOM3AHB_BUS, "dom3ahb_bus", CLK_IS_CRITICAL, JH7100_CLK_AHB_BUS), 147 + JH7100_GATE(JH7100_CLK_DOM7AHB_BUS, "dom7ahb_bus", CLK_IS_CRITICAL, JH7100_CLK_AHB_BUS), 148 + JH7100_GATE(JH7100_CLK_U74_CORE0, "u74_core0", CLK_IS_CRITICAL, JH7100_CLK_CPU_CORE), 149 + JH7100_GDIV(JH7100_CLK_U74_CORE1, "u74_core1", CLK_IS_CRITICAL, 8, JH7100_CLK_CPU_CORE), 150 + JH7100_GATE(JH7100_CLK_U74_AXI, "u74_axi", CLK_IS_CRITICAL, JH7100_CLK_CPU_AXI), 151 + JH7100_GATE(JH7100_CLK_U74RTC_TOGGLE, "u74rtc_toggle", CLK_IS_CRITICAL, JH7100_CLK_OSC_SYS), 152 + JH7100_GATE(JH7100_CLK_SGDMA2P_AXI, "sgdma2p_axi", 0, JH7100_CLK_CPU_AXI), 153 + JH7100_GATE(JH7100_CLK_DMA2PNOC_AXI, "dma2pnoc_axi", 0, JH7100_CLK_CPU_AXI), 154 + JH7100_GATE(JH7100_CLK_SGDMA2P_AHB, "sgdma2p_ahb", 0, JH7100_CLK_AHB_BUS), 155 + JH7100__DIV(JH7100_CLK_DLA_BUS, "dla_bus", 4, JH7100_CLK_DLA_ROOT), 156 + JH7100_GATE(JH7100_CLK_DLA_AXI, "dla_axi", 0, JH7100_CLK_DLA_BUS), 157 + JH7100_GATE(JH7100_CLK_DLANOC_AXI, "dlanoc_axi", 0, JH7100_CLK_DLA_BUS), 158 + JH7100_GATE(JH7100_CLK_DLA_APB, "dla_apb", 0, JH7100_CLK_APB1_BUS), 159 + JH7100_GDIV(JH7100_CLK_VP6_CORE, "vp6_core", 0, 4, JH7100_CLK_DSP_ROOT_DIV), 160 + JH7100__DIV(JH7100_CLK_VP6BUS_SRC, "vp6bus_src", 4, JH7100_CLK_DSP_ROOT), 161 + JH7100_GDIV(JH7100_CLK_VP6_AXI, "vp6_axi", 0, 4, JH7100_CLK_VP6BUS_SRC), 162 + JH7100__DIV(JH7100_CLK_VCDECBUS_SRC, "vcdecbus_src", 4, JH7100_CLK_CDECHIFI4_ROOT), 163 + JH7100__DIV(JH7100_CLK_VDEC_BUS, "vdec_bus", 8, JH7100_CLK_VCDECBUS_SRC), 164 + JH7100_GATE(JH7100_CLK_VDEC_AXI, "vdec_axi", 0, JH7100_CLK_VDEC_BUS), 165 + JH7100_GATE(JH7100_CLK_VDECBRG_MAIN, "vdecbrg_mainclk", 0, JH7100_CLK_VDEC_BUS), 166 + JH7100_GDIV(JH7100_CLK_VDEC_BCLK, "vdec_bclk", 0, 8, JH7100_CLK_VCDECBUS_SRC), 167 + JH7100_GDIV(JH7100_CLK_VDEC_CCLK, "vdec_cclk", 0, 8, JH7100_CLK_CDEC_ROOT), 168 + JH7100_GATE(JH7100_CLK_VDEC_APB, "vdec_apb", 0, JH7100_CLK_APB1_BUS), 169 + JH7100_GDIV(JH7100_CLK_JPEG_AXI, "jpeg_axi", 0, 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 170 + JH7100_GDIV(JH7100_CLK_JPEG_CCLK, "jpeg_cclk", 0, 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 171 + JH7100_GATE(JH7100_CLK_JPEG_APB, "jpeg_apb", 0, JH7100_CLK_APB1_BUS), 172 + JH7100_GDIV(JH7100_CLK_GC300_2X, "gc300_2x", 0, 8, JH7100_CLK_CDECHIFI4_ROOT), 173 + JH7100_GATE(JH7100_CLK_GC300_AHB, "gc300_ahb", 0, JH7100_CLK_AHB_BUS), 174 + JH7100__DIV(JH7100_CLK_JPCGC300_AXIBUS, "jpcgc300_axibus", 8, JH7100_CLK_VCDECBUS_SRC), 175 + JH7100_GATE(JH7100_CLK_GC300_AXI, "gc300_axi", 0, JH7100_CLK_JPCGC300_AXIBUS), 176 + JH7100_GATE(JH7100_CLK_JPCGC300_MAIN, "jpcgc300_mainclk", 0, JH7100_CLK_JPCGC300_AXIBUS), 177 + JH7100__DIV(JH7100_CLK_VENC_BUS, "venc_bus", 8, JH7100_CLK_VCDECBUS_SRC), 178 + JH7100_GATE(JH7100_CLK_VENC_AXI, "venc_axi", 0, JH7100_CLK_VENC_BUS), 179 + JH7100_GATE(JH7100_CLK_VENCBRG_MAIN, "vencbrg_mainclk", 0, JH7100_CLK_VENC_BUS), 180 + JH7100_GDIV(JH7100_CLK_VENC_BCLK, "venc_bclk", 0, 8, JH7100_CLK_VCDECBUS_SRC), 181 + JH7100_GDIV(JH7100_CLK_VENC_CCLK, "venc_cclk", 0, 8, JH7100_CLK_CDEC_ROOT), 182 + JH7100_GATE(JH7100_CLK_VENC_APB, "venc_apb", 0, JH7100_CLK_APB1_BUS), 183 + JH7100_GDIV(JH7100_CLK_DDRPLL_DIV2, "ddrpll_div2", CLK_IS_CRITICAL, 2, JH7100_CLK_PLL1_OUT), 184 + JH7100_GDIV(JH7100_CLK_DDRPLL_DIV4, "ddrpll_div4", CLK_IS_CRITICAL, 2, JH7100_CLK_DDRPLL_DIV2), 185 + JH7100_GDIV(JH7100_CLK_DDRPLL_DIV8, "ddrpll_div8", CLK_IS_CRITICAL, 2, JH7100_CLK_DDRPLL_DIV4), 186 + JH7100_GDIV(JH7100_CLK_DDROSC_DIV2, "ddrosc_div2", CLK_IS_CRITICAL, 2, JH7100_CLK_OSC_SYS), 187 + JH7100_GMUX(JH7100_CLK_DDRC0, "ddrc0", CLK_IS_CRITICAL, 4, 188 + JH7100_CLK_DDROSC_DIV2, 189 + JH7100_CLK_DDRPLL_DIV2, 190 + JH7100_CLK_DDRPLL_DIV4, 191 + JH7100_CLK_DDRPLL_DIV8), 192 + JH7100_GMUX(JH7100_CLK_DDRC1, "ddrc1", CLK_IS_CRITICAL, 4, 193 + JH7100_CLK_DDROSC_DIV2, 194 + JH7100_CLK_DDRPLL_DIV2, 195 + JH7100_CLK_DDRPLL_DIV4, 196 + JH7100_CLK_DDRPLL_DIV8), 197 + JH7100_GATE(JH7100_CLK_DDRPHY_APB, "ddrphy_apb", 0, JH7100_CLK_APB1_BUS), 198 + JH7100__DIV(JH7100_CLK_NOC_ROB, "noc_rob", 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 199 + JH7100__DIV(JH7100_CLK_NOC_COG, "noc_cog", 8, JH7100_CLK_DLA_ROOT), 200 + JH7100_GATE(JH7100_CLK_NNE_AHB, "nne_ahb", 0, JH7100_CLK_AHB_BUS), 201 + JH7100__DIV(JH7100_CLK_NNEBUS_SRC1, "nnebus_src1", 4, JH7100_CLK_DSP_ROOT), 202 + JH7100__MUX(JH7100_CLK_NNE_BUS, "nne_bus", 2, 203 + JH7100_CLK_CPU_AXI, 204 + JH7100_CLK_NNEBUS_SRC1), 205 + JH7100_GATE(JH7100_CLK_NNE_AXI, "nne_axi", 0, JH7100_CLK_NNE_BUS), 206 + JH7100_GATE(JH7100_CLK_NNENOC_AXI, "nnenoc_axi", 0, JH7100_CLK_NNE_BUS), 207 + JH7100_GATE(JH7100_CLK_DLASLV_AXI, "dlaslv_axi", 0, JH7100_CLK_NNE_BUS), 208 + JH7100_GATE(JH7100_CLK_DSPX2C_AXI, "dspx2c_axi", CLK_IS_CRITICAL, JH7100_CLK_NNE_BUS), 209 + JH7100__DIV(JH7100_CLK_HIFI4_SRC, "hifi4_src", 4, JH7100_CLK_CDECHIFI4_ROOT), 210 + JH7100__DIV(JH7100_CLK_HIFI4_COREFREE, "hifi4_corefree", 8, JH7100_CLK_HIFI4_SRC), 211 + JH7100_GATE(JH7100_CLK_HIFI4_CORE, "hifi4_core", 0, JH7100_CLK_HIFI4_COREFREE), 212 + JH7100__DIV(JH7100_CLK_HIFI4_BUS, "hifi4_bus", 8, JH7100_CLK_HIFI4_COREFREE), 213 + JH7100_GATE(JH7100_CLK_HIFI4_AXI, "hifi4_axi", 0, JH7100_CLK_HIFI4_BUS), 214 + JH7100_GATE(JH7100_CLK_HIFI4NOC_AXI, "hifi4noc_axi", 0, JH7100_CLK_HIFI4_BUS), 215 + JH7100__DIV(JH7100_CLK_SGDMA1P_BUS, "sgdma1p_bus", 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 216 + JH7100_GATE(JH7100_CLK_SGDMA1P_AXI, "sgdma1p_axi", 0, JH7100_CLK_SGDMA1P_BUS), 217 + JH7100_GATE(JH7100_CLK_DMA1P_AXI, "dma1p_axi", 0, JH7100_CLK_SGDMA1P_BUS), 218 + JH7100_GDIV(JH7100_CLK_X2C_AXI, "x2c_axi", CLK_IS_CRITICAL, 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 219 + JH7100__DIV(JH7100_CLK_USB_BUS, "usb_bus", 8, JH7100_CLK_CPUNBUS_ROOT_DIV), 220 + JH7100_GATE(JH7100_CLK_USB_AXI, "usb_axi", 0, JH7100_CLK_USB_BUS), 221 + JH7100_GATE(JH7100_CLK_USBNOC_AXI, "usbnoc_axi", 0, JH7100_CLK_USB_BUS), 222 + JH7100__DIV(JH7100_CLK_USBPHY_ROOTDIV, "usbphy_rootdiv", 4, JH7100_CLK_GMACUSB_ROOT), 223 + JH7100_GDIV(JH7100_CLK_USBPHY_125M, "usbphy_125m", 0, 8, JH7100_CLK_USBPHY_ROOTDIV), 224 + JH7100_GDIV(JH7100_CLK_USBPHY_PLLDIV25M, "usbphy_plldiv25m", 0, 32, JH7100_CLK_USBPHY_ROOTDIV), 225 + JH7100__MUX(JH7100_CLK_USBPHY_25M, "usbphy_25m", 2, 226 + JH7100_CLK_OSC_SYS, 227 + JH7100_CLK_USBPHY_PLLDIV25M), 228 + JH7100__DIV(JH7100_CLK_AUDIO_DIV, "audio_div", 131072, JH7100_CLK_AUDIO_ROOT), 229 + JH7100_GATE(JH7100_CLK_AUDIO_SRC, "audio_src", 0, JH7100_CLK_AUDIO_DIV), 230 + JH7100_GATE(JH7100_CLK_AUDIO_12288, "audio_12288", 0, JH7100_CLK_OSC_AUD), 231 + JH7100_GDIV(JH7100_CLK_VIN_SRC, "vin_src", 0, 4, JH7100_CLK_VIN_ROOT), 232 + JH7100__DIV(JH7100_CLK_ISP0_BUS, "isp0_bus", 8, JH7100_CLK_VIN_SRC), 233 + JH7100_GATE(JH7100_CLK_ISP0_AXI, "isp0_axi", 0, JH7100_CLK_ISP0_BUS), 234 + JH7100_GATE(JH7100_CLK_ISP0NOC_AXI, "isp0noc_axi", 0, JH7100_CLK_ISP0_BUS), 235 + JH7100_GATE(JH7100_CLK_ISPSLV_AXI, "ispslv_axi", 0, JH7100_CLK_ISP0_BUS), 236 + JH7100__DIV(JH7100_CLK_ISP1_BUS, "isp1_bus", 8, JH7100_CLK_VIN_SRC), 237 + JH7100_GATE(JH7100_CLK_ISP1_AXI, "isp1_axi", 0, JH7100_CLK_ISP1_BUS), 238 + JH7100_GATE(JH7100_CLK_ISP1NOC_AXI, "isp1noc_axi", 0, JH7100_CLK_ISP1_BUS), 239 + JH7100__DIV(JH7100_CLK_VIN_BUS, "vin_bus", 8, JH7100_CLK_VIN_SRC), 240 + JH7100_GATE(JH7100_CLK_VIN_AXI, "vin_axi", 0, JH7100_CLK_VIN_BUS), 241 + JH7100_GATE(JH7100_CLK_VINNOC_AXI, "vinnoc_axi", 0, JH7100_CLK_VIN_BUS), 242 + JH7100_GDIV(JH7100_CLK_VOUT_SRC, "vout_src", 0, 4, JH7100_CLK_VOUT_ROOT), 243 + JH7100__DIV(JH7100_CLK_DISPBUS_SRC, "dispbus_src", 4, JH7100_CLK_VOUTBUS_ROOT), 244 + JH7100__DIV(JH7100_CLK_DISP_BUS, "disp_bus", 4, JH7100_CLK_DISPBUS_SRC), 245 + JH7100_GATE(JH7100_CLK_DISP_AXI, "disp_axi", 0, JH7100_CLK_DISP_BUS), 246 + JH7100_GATE(JH7100_CLK_DISPNOC_AXI, "dispnoc_axi", 0, JH7100_CLK_DISP_BUS), 247 + JH7100_GATE(JH7100_CLK_SDIO0_AHB, "sdio0_ahb", 0, JH7100_CLK_AHB_BUS), 248 + JH7100_GDIV(JH7100_CLK_SDIO0_CCLKINT, "sdio0_cclkint", 0, 24, JH7100_CLK_PERH0_SRC), 249 + JH7100__INV(JH7100_CLK_SDIO0_CCLKINT_INV, "sdio0_cclkint_inv", JH7100_CLK_SDIO0_CCLKINT), 250 + JH7100_GATE(JH7100_CLK_SDIO1_AHB, "sdio1_ahb", 0, JH7100_CLK_AHB_BUS), 251 + JH7100_GDIV(JH7100_CLK_SDIO1_CCLKINT, "sdio1_cclkint", 0, 24, JH7100_CLK_PERH1_SRC), 252 + JH7100__INV(JH7100_CLK_SDIO1_CCLKINT_INV, "sdio1_cclkint_inv", JH7100_CLK_SDIO1_CCLKINT), 253 + JH7100_GATE(JH7100_CLK_GMAC_AHB, "gmac_ahb", 0, JH7100_CLK_AHB_BUS), 254 + JH7100__DIV(JH7100_CLK_GMAC_ROOT_DIV, "gmac_root_div", 8, JH7100_CLK_GMACUSB_ROOT), 255 + JH7100_GDIV(JH7100_CLK_GMAC_PTP_REF, "gmac_ptp_refclk", 0, 31, JH7100_CLK_GMAC_ROOT_DIV), 256 + JH7100_GDIV(JH7100_CLK_GMAC_GTX, "gmac_gtxclk", 0, 255, JH7100_CLK_GMAC_ROOT_DIV), 257 + JH7100_GDIV(JH7100_CLK_GMAC_RMII_TX, "gmac_rmii_txclk", 0, 8, JH7100_CLK_GMAC_RMII_REF), 258 + JH7100_GDIV(JH7100_CLK_GMAC_RMII_RX, "gmac_rmii_rxclk", 0, 8, JH7100_CLK_GMAC_RMII_REF), 259 + JH7100__MUX(JH7100_CLK_GMAC_TX, "gmac_tx", 3, 260 + JH7100_CLK_GMAC_GTX, 261 + JH7100_CLK_GMAC_TX_INV, 262 + JH7100_CLK_GMAC_RMII_TX), 263 + JH7100__INV(JH7100_CLK_GMAC_TX_INV, "gmac_tx_inv", JH7100_CLK_GMAC_TX), 264 + JH7100__MUX(JH7100_CLK_GMAC_RX_PRE, "gmac_rx_pre", 2, 265 + JH7100_CLK_GMAC_GR_MII_RX, 266 + JH7100_CLK_GMAC_RMII_RX), 267 + JH7100__INV(JH7100_CLK_GMAC_RX_INV, "gmac_rx_inv", JH7100_CLK_GMAC_RX_PRE), 268 + JH7100_GATE(JH7100_CLK_GMAC_RMII, "gmac_rmii", 0, JH7100_CLK_GMAC_RMII_REF), 269 + JH7100_GDIV(JH7100_CLK_GMAC_TOPHYREF, "gmac_tophyref", 0, 127, JH7100_CLK_GMAC_ROOT_DIV), 270 + JH7100_GATE(JH7100_CLK_SPI2AHB_AHB, "spi2ahb_ahb", 0, JH7100_CLK_AHB_BUS), 271 + JH7100_GDIV(JH7100_CLK_SPI2AHB_CORE, "spi2ahb_core", 0, 31, JH7100_CLK_PERH0_SRC), 272 + JH7100_GATE(JH7100_CLK_EZMASTER_AHB, "ezmaster_ahb", 0, JH7100_CLK_AHB_BUS), 273 + JH7100_GATE(JH7100_CLK_E24_AHB, "e24_ahb", 0, JH7100_CLK_AHB_BUS), 274 + JH7100_GATE(JH7100_CLK_E24RTC_TOGGLE, "e24rtc_toggle", 0, JH7100_CLK_OSC_SYS), 275 + JH7100_GATE(JH7100_CLK_QSPI_AHB, "qspi_ahb", 0, JH7100_CLK_AHB_BUS), 276 + JH7100_GATE(JH7100_CLK_QSPI_APB, "qspi_apb", 0, JH7100_CLK_APB1_BUS), 277 + JH7100_GDIV(JH7100_CLK_QSPI_REF, "qspi_refclk", 0, 31, JH7100_CLK_PERH0_SRC), 278 + JH7100_GATE(JH7100_CLK_SEC_AHB, "sec_ahb", 0, JH7100_CLK_AHB_BUS), 279 + JH7100_GATE(JH7100_CLK_AES, "aes_clk", 0, JH7100_CLK_SEC_AHB), 280 + JH7100_GATE(JH7100_CLK_SHA, "sha_clk", 0, JH7100_CLK_SEC_AHB), 281 + JH7100_GATE(JH7100_CLK_PKA, "pka_clk", 0, JH7100_CLK_SEC_AHB), 282 + JH7100_GATE(JH7100_CLK_TRNG_APB, "trng_apb", 0, JH7100_CLK_APB1_BUS), 283 + JH7100_GATE(JH7100_CLK_OTP_APB, "otp_apb", 0, JH7100_CLK_APB1_BUS), 284 + JH7100_GATE(JH7100_CLK_UART0_APB, "uart0_apb", 0, JH7100_CLK_APB1_BUS), 285 + JH7100_GDIV(JH7100_CLK_UART0_CORE, "uart0_core", 0, 63, JH7100_CLK_PERH1_SRC), 286 + JH7100_GATE(JH7100_CLK_UART1_APB, "uart1_apb", 0, JH7100_CLK_APB1_BUS), 287 + JH7100_GDIV(JH7100_CLK_UART1_CORE, "uart1_core", 0, 63, JH7100_CLK_PERH1_SRC), 288 + JH7100_GATE(JH7100_CLK_SPI0_APB, "spi0_apb", 0, JH7100_CLK_APB1_BUS), 289 + JH7100_GDIV(JH7100_CLK_SPI0_CORE, "spi0_core", 0, 63, JH7100_CLK_PERH1_SRC), 290 + JH7100_GATE(JH7100_CLK_SPI1_APB, "spi1_apb", 0, JH7100_CLK_APB1_BUS), 291 + JH7100_GDIV(JH7100_CLK_SPI1_CORE, "spi1_core", 0, 63, JH7100_CLK_PERH1_SRC), 292 + JH7100_GATE(JH7100_CLK_I2C0_APB, "i2c0_apb", 0, JH7100_CLK_APB1_BUS), 293 + JH7100_GDIV(JH7100_CLK_I2C0_CORE, "i2c0_core", 0, 63, JH7100_CLK_PERH1_SRC), 294 + JH7100_GATE(JH7100_CLK_I2C1_APB, "i2c1_apb", 0, JH7100_CLK_APB1_BUS), 295 + JH7100_GDIV(JH7100_CLK_I2C1_CORE, "i2c1_core", 0, 63, JH7100_CLK_PERH1_SRC), 296 + JH7100_GATE(JH7100_CLK_GPIO_APB, "gpio_apb", 0, JH7100_CLK_APB1_BUS), 297 + JH7100_GATE(JH7100_CLK_UART2_APB, "uart2_apb", 0, JH7100_CLK_APB2_BUS), 298 + JH7100_GDIV(JH7100_CLK_UART2_CORE, "uart2_core", 0, 63, JH7100_CLK_PERH0_SRC), 299 + JH7100_GATE(JH7100_CLK_UART3_APB, "uart3_apb", 0, JH7100_CLK_APB2_BUS), 300 + JH7100_GDIV(JH7100_CLK_UART3_CORE, "uart3_core", 0, 63, JH7100_CLK_PERH0_SRC), 301 + JH7100_GATE(JH7100_CLK_SPI2_APB, "spi2_apb", 0, JH7100_CLK_APB2_BUS), 302 + JH7100_GDIV(JH7100_CLK_SPI2_CORE, "spi2_core", 0, 63, JH7100_CLK_PERH0_SRC), 303 + JH7100_GATE(JH7100_CLK_SPI3_APB, "spi3_apb", 0, JH7100_CLK_APB2_BUS), 304 + JH7100_GDIV(JH7100_CLK_SPI3_CORE, "spi3_core", 0, 63, JH7100_CLK_PERH0_SRC), 305 + JH7100_GATE(JH7100_CLK_I2C2_APB, "i2c2_apb", 0, JH7100_CLK_APB2_BUS), 306 + JH7100_GDIV(JH7100_CLK_I2C2_CORE, "i2c2_core", 0, 63, JH7100_CLK_PERH0_SRC), 307 + JH7100_GATE(JH7100_CLK_I2C3_APB, "i2c3_apb", 0, JH7100_CLK_APB2_BUS), 308 + JH7100_GDIV(JH7100_CLK_I2C3_CORE, "i2c3_core", 0, 63, JH7100_CLK_PERH0_SRC), 309 + JH7100_GATE(JH7100_CLK_WDTIMER_APB, "wdtimer_apb", 0, JH7100_CLK_APB2_BUS), 310 + JH7100_GDIV(JH7100_CLK_WDT_CORE, "wdt_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 311 + JH7100_GDIV(JH7100_CLK_TIMER0_CORE, "timer0_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 312 + JH7100_GDIV(JH7100_CLK_TIMER1_CORE, "timer1_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 313 + JH7100_GDIV(JH7100_CLK_TIMER2_CORE, "timer2_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 314 + JH7100_GDIV(JH7100_CLK_TIMER3_CORE, "timer3_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 315 + JH7100_GDIV(JH7100_CLK_TIMER4_CORE, "timer4_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 316 + JH7100_GDIV(JH7100_CLK_TIMER5_CORE, "timer5_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 317 + JH7100_GDIV(JH7100_CLK_TIMER6_CORE, "timer6_coreclk", 0, 63, JH7100_CLK_PERH0_SRC), 318 + JH7100_GATE(JH7100_CLK_VP6INTC_APB, "vp6intc_apb", 0, JH7100_CLK_APB2_BUS), 319 + JH7100_GATE(JH7100_CLK_PWM_APB, "pwm_apb", 0, JH7100_CLK_APB2_BUS), 320 + JH7100_GATE(JH7100_CLK_MSI_APB, "msi_apb", 0, JH7100_CLK_APB2_BUS), 321 + JH7100_GATE(JH7100_CLK_TEMP_APB, "temp_apb", 0, JH7100_CLK_APB2_BUS), 322 + JH7100_GDIV(JH7100_CLK_TEMP_SENSE, "temp_sense", 0, 31, JH7100_CLK_OSC_SYS), 323 + JH7100_GATE(JH7100_CLK_SYSERR_APB, "syserr_apb", 0, JH7100_CLK_APB2_BUS), 324 + }; 325 + 326 + struct jh7100_clk { 327 + struct clk_hw hw; 328 + unsigned int idx; 329 + unsigned int max_div; 330 + }; 331 + 332 + struct jh7100_clk_priv { 333 + /* protect clk enable and set rate/parent from happening at the same time */ 334 + spinlock_t rmw_lock; 335 + struct device *dev; 336 + void __iomem *base; 337 + struct clk_hw *pll[3]; 338 + struct jh7100_clk reg[JH7100_CLK_PLL0_OUT]; 339 + }; 340 + 341 + static struct jh7100_clk *jh7100_clk_from(struct clk_hw *hw) 342 + { 343 + return container_of(hw, struct jh7100_clk, hw); 344 + } 345 + 346 + static struct jh7100_clk_priv *jh7100_priv_from(struct jh7100_clk *clk) 347 + { 348 + return container_of(clk, struct jh7100_clk_priv, reg[clk->idx]); 349 + } 350 + 351 + static u32 jh7100_clk_reg_get(struct jh7100_clk *clk) 352 + { 353 + struct jh7100_clk_priv *priv = jh7100_priv_from(clk); 354 + void __iomem *reg = priv->base + 4 * clk->idx; 355 + 356 + return readl_relaxed(reg); 357 + } 358 + 359 + static void jh7100_clk_reg_rmw(struct jh7100_clk *clk, u32 mask, u32 value) 360 + { 361 + struct jh7100_clk_priv *priv = jh7100_priv_from(clk); 362 + void __iomem *reg = priv->base + 4 * clk->idx; 363 + unsigned long flags; 364 + 365 + spin_lock_irqsave(&priv->rmw_lock, flags); 366 + value |= readl_relaxed(reg) & ~mask; 367 + writel_relaxed(value, reg); 368 + spin_unlock_irqrestore(&priv->rmw_lock, flags); 369 + } 370 + 371 + static int jh7100_clk_enable(struct clk_hw *hw) 372 + { 373 + struct jh7100_clk *clk = jh7100_clk_from(hw); 374 + 375 + jh7100_clk_reg_rmw(clk, JH7100_CLK_ENABLE, JH7100_CLK_ENABLE); 376 + return 0; 377 + } 378 + 379 + static void jh7100_clk_disable(struct clk_hw *hw) 380 + { 381 + struct jh7100_clk *clk = jh7100_clk_from(hw); 382 + 383 + jh7100_clk_reg_rmw(clk, JH7100_CLK_ENABLE, 0); 384 + } 385 + 386 + static int jh7100_clk_is_enabled(struct clk_hw *hw) 387 + { 388 + struct jh7100_clk *clk = jh7100_clk_from(hw); 389 + 390 + return !!(jh7100_clk_reg_get(clk) & JH7100_CLK_ENABLE); 391 + } 392 + 393 + static unsigned long jh7100_clk_recalc_rate(struct clk_hw *hw, 394 + unsigned long parent_rate) 395 + { 396 + struct jh7100_clk *clk = jh7100_clk_from(hw); 397 + u32 div = jh7100_clk_reg_get(clk) & JH7100_CLK_DIV_MASK; 398 + 399 + return div ? parent_rate / div : 0; 400 + } 401 + 402 + static unsigned long jh7100_clk_bestdiv(struct jh7100_clk *clk, 403 + unsigned long rate, unsigned long parent) 404 + { 405 + unsigned long max = clk->max_div; 406 + unsigned long div = DIV_ROUND_UP(parent, rate); 407 + 408 + return min(div, max); 409 + } 410 + 411 + static int jh7100_clk_determine_rate(struct clk_hw *hw, 412 + struct clk_rate_request *req) 413 + { 414 + struct jh7100_clk *clk = jh7100_clk_from(hw); 415 + unsigned long parent = req->best_parent_rate; 416 + unsigned long rate = clamp(req->rate, req->min_rate, req->max_rate); 417 + unsigned long div = jh7100_clk_bestdiv(clk, rate, parent); 418 + unsigned long result = parent / div; 419 + 420 + /* 421 + * we want the result clamped by min_rate and max_rate if possible: 422 + * case 1: div hits the max divider value, which means it's less than 423 + * parent / rate, so the result is greater than rate and min_rate in 424 + * particular. we can't do anything about result > max_rate because the 425 + * divider doesn't go any further. 426 + * case 2: div = DIV_ROUND_UP(parent, rate) which means the result is 427 + * always lower or equal to rate and max_rate. however the result may 428 + * turn out lower than min_rate, but then the next higher rate is fine: 429 + * div - 1 = ceil(parent / rate) - 1 < parent / rate 430 + * and thus 431 + * min_rate <= rate < parent / (div - 1) 432 + */ 433 + if (result < req->min_rate && div > 1) 434 + result = parent / (div - 1); 435 + 436 + req->rate = result; 437 + return 0; 438 + } 439 + 440 + static int jh7100_clk_set_rate(struct clk_hw *hw, 441 + unsigned long rate, 442 + unsigned long parent_rate) 443 + { 444 + struct jh7100_clk *clk = jh7100_clk_from(hw); 445 + unsigned long div = jh7100_clk_bestdiv(clk, rate, parent_rate); 446 + 447 + jh7100_clk_reg_rmw(clk, JH7100_CLK_DIV_MASK, div); 448 + return 0; 449 + } 450 + 451 + static u8 jh7100_clk_get_parent(struct clk_hw *hw) 452 + { 453 + struct jh7100_clk *clk = jh7100_clk_from(hw); 454 + u32 value = jh7100_clk_reg_get(clk); 455 + 456 + return (value & JH7100_CLK_MUX_MASK) >> JH7100_CLK_MUX_SHIFT; 457 + } 458 + 459 + static int jh7100_clk_set_parent(struct clk_hw *hw, u8 index) 460 + { 461 + struct jh7100_clk *clk = jh7100_clk_from(hw); 462 + u32 value = (u32)index << JH7100_CLK_MUX_SHIFT; 463 + 464 + jh7100_clk_reg_rmw(clk, JH7100_CLK_MUX_MASK, value); 465 + return 0; 466 + } 467 + 468 + static int jh7100_clk_mux_determine_rate(struct clk_hw *hw, 469 + struct clk_rate_request *req) 470 + { 471 + return clk_mux_determine_rate_flags(hw, req, 0); 472 + } 473 + 474 + static int jh7100_clk_get_phase(struct clk_hw *hw) 475 + { 476 + struct jh7100_clk *clk = jh7100_clk_from(hw); 477 + u32 value = jh7100_clk_reg_get(clk); 478 + 479 + return (value & JH7100_CLK_INVERT) ? 180 : 0; 480 + } 481 + 482 + static int jh7100_clk_set_phase(struct clk_hw *hw, int degrees) 483 + { 484 + struct jh7100_clk *clk = jh7100_clk_from(hw); 485 + u32 value; 486 + 487 + if (degrees == 0) 488 + value = 0; 489 + else if (degrees == 180) 490 + value = JH7100_CLK_INVERT; 491 + else 492 + return -EINVAL; 493 + 494 + jh7100_clk_reg_rmw(clk, JH7100_CLK_INVERT, value); 495 + return 0; 496 + } 497 + 498 + #ifdef CONFIG_DEBUG_FS 499 + static void jh7100_clk_debug_init(struct clk_hw *hw, struct dentry *dentry) 500 + { 501 + static const struct debugfs_reg32 jh7100_clk_reg = { 502 + .name = "CTRL", 503 + .offset = 0, 504 + }; 505 + struct jh7100_clk *clk = jh7100_clk_from(hw); 506 + struct jh7100_clk_priv *priv = jh7100_priv_from(clk); 507 + struct debugfs_regset32 *regset; 508 + 509 + regset = devm_kzalloc(priv->dev, sizeof(*regset), GFP_KERNEL); 510 + if (!regset) 511 + return; 512 + 513 + regset->regs = &jh7100_clk_reg; 514 + regset->nregs = 1; 515 + regset->base = priv->base + 4 * clk->idx; 516 + 517 + debugfs_create_regset32("registers", 0400, dentry, regset); 518 + } 519 + #else 520 + #define jh7100_clk_debug_init NULL 521 + #endif 522 + 523 + static const struct clk_ops jh7100_clk_gate_ops = { 524 + .enable = jh7100_clk_enable, 525 + .disable = jh7100_clk_disable, 526 + .is_enabled = jh7100_clk_is_enabled, 527 + .debug_init = jh7100_clk_debug_init, 528 + }; 529 + 530 + static const struct clk_ops jh7100_clk_div_ops = { 531 + .recalc_rate = jh7100_clk_recalc_rate, 532 + .determine_rate = jh7100_clk_determine_rate, 533 + .set_rate = jh7100_clk_set_rate, 534 + .debug_init = jh7100_clk_debug_init, 535 + }; 536 + 537 + static const struct clk_ops jh7100_clk_gdiv_ops = { 538 + .enable = jh7100_clk_enable, 539 + .disable = jh7100_clk_disable, 540 + .is_enabled = jh7100_clk_is_enabled, 541 + .recalc_rate = jh7100_clk_recalc_rate, 542 + .determine_rate = jh7100_clk_determine_rate, 543 + .set_rate = jh7100_clk_set_rate, 544 + .debug_init = jh7100_clk_debug_init, 545 + }; 546 + 547 + static const struct clk_ops jh7100_clk_mux_ops = { 548 + .determine_rate = jh7100_clk_mux_determine_rate, 549 + .set_parent = jh7100_clk_set_parent, 550 + .get_parent = jh7100_clk_get_parent, 551 + .debug_init = jh7100_clk_debug_init, 552 + }; 553 + 554 + static const struct clk_ops jh7100_clk_gmux_ops = { 555 + .enable = jh7100_clk_enable, 556 + .disable = jh7100_clk_disable, 557 + .is_enabled = jh7100_clk_is_enabled, 558 + .determine_rate = jh7100_clk_mux_determine_rate, 559 + .set_parent = jh7100_clk_set_parent, 560 + .get_parent = jh7100_clk_get_parent, 561 + .debug_init = jh7100_clk_debug_init, 562 + }; 563 + 564 + static const struct clk_ops jh7100_clk_inv_ops = { 565 + .get_phase = jh7100_clk_get_phase, 566 + .set_phase = jh7100_clk_set_phase, 567 + .debug_init = jh7100_clk_debug_init, 568 + }; 569 + 570 + static const struct clk_ops *__init jh7100_clk_ops(u32 max) 571 + { 572 + if (max & JH7100_CLK_DIV_MASK) { 573 + if (max & JH7100_CLK_ENABLE) 574 + return &jh7100_clk_gdiv_ops; 575 + return &jh7100_clk_div_ops; 576 + } 577 + 578 + if (max & JH7100_CLK_MUX_MASK) { 579 + if (max & JH7100_CLK_ENABLE) 580 + return &jh7100_clk_gmux_ops; 581 + return &jh7100_clk_mux_ops; 582 + } 583 + 584 + if (max & JH7100_CLK_ENABLE) 585 + return &jh7100_clk_gate_ops; 586 + 587 + return &jh7100_clk_inv_ops; 588 + } 589 + 590 + static struct clk_hw *jh7100_clk_get(struct of_phandle_args *clkspec, void *data) 591 + { 592 + struct jh7100_clk_priv *priv = data; 593 + unsigned int idx = clkspec->args[0]; 594 + 595 + if (idx < JH7100_CLK_PLL0_OUT) 596 + return &priv->reg[idx].hw; 597 + 598 + if (idx < JH7100_CLK_END) 599 + return priv->pll[idx - JH7100_CLK_PLL0_OUT]; 600 + 601 + return ERR_PTR(-EINVAL); 602 + } 603 + 604 + static int __init clk_starfive_jh7100_probe(struct platform_device *pdev) 605 + { 606 + struct jh7100_clk_priv *priv; 607 + unsigned int idx; 608 + int ret; 609 + 610 + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 611 + if (!priv) 612 + return -ENOMEM; 613 + 614 + spin_lock_init(&priv->rmw_lock); 615 + priv->dev = &pdev->dev; 616 + priv->base = devm_platform_ioremap_resource(pdev, 0); 617 + if (IS_ERR(priv->base)) 618 + return PTR_ERR(priv->base); 619 + 620 + priv->pll[0] = devm_clk_hw_register_fixed_factor(priv->dev, "pll0_out", 621 + "osc_sys", 0, 40, 1); 622 + if (IS_ERR(priv->pll[0])) 623 + return PTR_ERR(priv->pll[0]); 624 + 625 + priv->pll[1] = devm_clk_hw_register_fixed_factor(priv->dev, "pll1_out", 626 + "osc_sys", 0, 64, 1); 627 + if (IS_ERR(priv->pll[1])) 628 + return PTR_ERR(priv->pll[1]); 629 + 630 + priv->pll[2] = devm_clk_hw_register_fixed_factor(priv->dev, "pll2_out", 631 + "pll2_refclk", 0, 55, 1); 632 + if (IS_ERR(priv->pll[2])) 633 + return PTR_ERR(priv->pll[2]); 634 + 635 + for (idx = 0; idx < JH7100_CLK_PLL0_OUT; idx++) { 636 + u32 max = jh7100_clk_data[idx].max; 637 + struct clk_parent_data parents[4] = {}; 638 + struct clk_init_data init = { 639 + .name = jh7100_clk_data[idx].name, 640 + .ops = jh7100_clk_ops(max), 641 + .parent_data = parents, 642 + .num_parents = ((max & JH7100_CLK_MUX_MASK) >> JH7100_CLK_MUX_SHIFT) + 1, 643 + .flags = jh7100_clk_data[idx].flags, 644 + }; 645 + struct jh7100_clk *clk = &priv->reg[idx]; 646 + unsigned int i; 647 + 648 + for (i = 0; i < init.num_parents; i++) { 649 + unsigned int pidx = jh7100_clk_data[idx].parents[i]; 650 + 651 + if (pidx < JH7100_CLK_PLL0_OUT) 652 + parents[i].hw = &priv->reg[pidx].hw; 653 + else if (pidx < JH7100_CLK_END) 654 + parents[i].hw = priv->pll[pidx - JH7100_CLK_PLL0_OUT]; 655 + else if (pidx == JH7100_CLK_OSC_SYS) 656 + parents[i].fw_name = "osc_sys"; 657 + else if (pidx == JH7100_CLK_OSC_AUD) 658 + parents[i].fw_name = "osc_aud"; 659 + else if (pidx == JH7100_CLK_GMAC_RMII_REF) 660 + parents[i].fw_name = "gmac_rmii_ref"; 661 + else if (pidx == JH7100_CLK_GMAC_GR_MII_RX) 662 + parents[i].fw_name = "gmac_gr_mii_rxclk"; 663 + } 664 + 665 + clk->hw.init = &init; 666 + clk->idx = idx; 667 + clk->max_div = max & JH7100_CLK_DIV_MASK; 668 + 669 + ret = devm_clk_hw_register(priv->dev, &clk->hw); 670 + if (ret) 671 + return ret; 672 + } 673 + 674 + return devm_of_clk_add_hw_provider(priv->dev, jh7100_clk_get, priv); 675 + } 676 + 677 + static const struct of_device_id clk_starfive_jh7100_match[] = { 678 + { .compatible = "starfive,jh7100-clkgen" }, 679 + { /* sentinel */ } 680 + }; 681 + 682 + static struct platform_driver clk_starfive_jh7100_driver = { 683 + .driver = { 684 + .name = "clk-starfive-jh7100", 685 + .of_match_table = clk_starfive_jh7100_match, 686 + .suppress_bind_attrs = true, 687 + }, 688 + }; 689 + builtin_platform_driver_probe(clk_starfive_jh7100_driver, clk_starfive_jh7100_probe);
+17
drivers/pinctrl/Kconfig
··· 281 281 select PINCONF 282 282 select GPIOLIB_IRQCHIP 283 283 284 + config PINCTRL_STARFIVE 285 + tristate "Pinctrl and GPIO driver for the StarFive JH7100 SoC" 286 + depends on SOC_STARFIVE || COMPILE_TEST 287 + depends on OF 288 + default SOC_STARFIVE 289 + select GENERIC_PINCTRL_GROUPS 290 + select GENERIC_PINMUX_FUNCTIONS 291 + select GENERIC_PINCONF 292 + select GPIOLIB 293 + select GPIOLIB_IRQCHIP 294 + select OF_GPIO 295 + help 296 + Say yes here to support pin control on the StarFive JH7100 SoC. 297 + This also provides an interface to the GPIO pins not used by other 298 + peripherals supporting inputs, outputs, configuring pull-up/pull-down 299 + and interrupts on input changes. 300 + 284 301 config PINCTRL_STMFX 285 302 tristate "STMicroelectronics STMFX GPIO expander pinctrl driver" 286 303 depends on I2C
+1
drivers/pinctrl/Makefile
··· 39 39 obj-$(CONFIG_PINCTRL_LPC18XX) += pinctrl-lpc18xx.o 40 40 obj-$(CONFIG_PINCTRL_TB10X) += pinctrl-tb10x.o 41 41 obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o 42 + obj-$(CONFIG_PINCTRL_STARFIVE) += pinctrl-starfive.o 42 43 obj-$(CONFIG_PINCTRL_STMFX) += pinctrl-stmfx.o 43 44 obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o 44 45 obj-$(CONFIG_PINCTRL_ZYNQMP) += pinctrl-zynqmp.o
+1354
drivers/pinctrl/pinctrl-starfive.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Pinctrl / GPIO driver for StarFive JH7100 SoC 4 + * 5 + * Copyright (C) 2020 Shanghai StarFive Technology Co., Ltd. 6 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 7 + */ 8 + 9 + #include <linux/bits.h> 10 + #include <linux/clk.h> 11 + #include <linux/gpio/driver.h> 12 + #include <linux/io.h> 13 + #include <linux/mod_devicetable.h> 14 + #include <linux/module.h> 15 + #include <linux/of.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/reset.h> 18 + #include <linux/spinlock.h> 19 + 20 + #include <linux/pinctrl/pinctrl.h> 21 + #include <linux/pinctrl/pinmux.h> 22 + 23 + #include <dt-bindings/pinctrl/pinctrl-starfive.h> 24 + 25 + #include "core.h" 26 + #include "pinctrl-utils.h" 27 + #include "pinmux.h" 28 + #include "pinconf.h" 29 + 30 + #define DRIVER_NAME "pinctrl-starfive" 31 + 32 + /* 33 + * Refer to Section 12. GPIO Registers in the JH7100 data sheet: 34 + * https://github.com/starfive-tech/JH7100_Docs 35 + */ 36 + #define NR_GPIOS 64 37 + 38 + /* 39 + * Global enable for GPIO interrupts. If bit 0 is set to 1 the GPIO interrupts 40 + * are enabled. If set to 0 the GPIO interrupts are disabled. 41 + */ 42 + #define GPIOEN 0x000 43 + 44 + /* 45 + * The following 32-bit registers come in pairs, but only the offset of the 46 + * first register is defined. The first controls (interrupts for) GPIO 0-31 and 47 + * the second GPIO 32-63. 48 + */ 49 + 50 + /* 51 + * Interrupt Type. If set to 1 the interrupt is edge-triggered. If set to 0 the 52 + * interrupt is level-triggered. 53 + */ 54 + #define GPIOIS 0x010 55 + 56 + /* 57 + * Edge-Trigger Interrupt Type. If set to 1 the interrupt gets triggered on 58 + * both positive and negative edges. If set to 0 the interrupt is triggered by a 59 + * single edge. 60 + */ 61 + #define GPIOIBE 0x018 62 + 63 + /* 64 + * Interrupt Trigger Polarity. If set to 1 the interrupt is triggered on a 65 + * rising edge (edge-triggered) or high level (level-triggered). If set to 0 the 66 + * interrupt is triggered on a falling edge (edge-triggered) or low level 67 + * (level-triggered). 68 + */ 69 + #define GPIOIEV 0x020 70 + 71 + /* 72 + * Interrupt Mask. If set to 1 the interrupt is enabled (unmasked). If set to 0 73 + * the interrupt is disabled (masked). Note that the current documentation is 74 + * wrong and says the exct opposite of this. 75 + */ 76 + #define GPIOIE 0x028 77 + 78 + /* 79 + * Clear Edge-Triggered Interrupts. Write a 1 to clear the edge-triggered 80 + * interrupt. 81 + */ 82 + #define GPIOIC 0x030 83 + 84 + /* 85 + * Edge-Triggered Interrupt Status. A 1 means the configured edge was detected. 86 + */ 87 + #define GPIORIS 0x038 88 + 89 + /* 90 + * Interrupt Status after Masking. A 1 means the configured edge or level was 91 + * detected and not masked. 92 + */ 93 + #define GPIOMIS 0x040 94 + 95 + /* 96 + * Data Value. Dynamically reflects the value of the GPIO pin. If 1 the pin is 97 + * a digital 1 and if 0 the pin is a digital 0. 98 + */ 99 + #define GPIODIN 0x048 100 + 101 + /* 102 + * From the data sheet section 12.2, there are 64 32-bit output data registers 103 + * and 64 output enable registers. Output data and output enable registers for 104 + * a given GPIO are contiguous. Eg. GPO0_DOUT_CFG is 0x50 and GPO0_DOEN_CFG is 105 + * 0x54 while GPO1_DOUT_CFG is 0x58 and GPO1_DOEN_CFG is 0x5c. The stride 106 + * between GPIO registers is effectively 8, thus: GPOn_DOUT_CFG is 0x50 + 8n 107 + * and GPOn_DOEN_CFG is 0x54 + 8n. 108 + */ 109 + #define GPON_DOUT_CFG 0x050 110 + #define GPON_DOEN_CFG 0x054 111 + 112 + /* 113 + * From Section 12.3, there are 75 input signal configuration registers which 114 + * are 4 bytes wide starting with GPI_CPU_JTAG_TCK_CFG at 0x250 and ending with 115 + * GPI_USB_OVER_CURRENT_CFG 0x378 116 + */ 117 + #define GPI_CFG_OFFSET 0x250 118 + 119 + /* 120 + * Pad Control Bits. There are 16 pad control bits for each pin located in 103 121 + * 32-bit registers controlling PAD_GPIO[0] to PAD_GPIO[63] followed by 122 + * PAD_FUNC_SHARE[0] to PAD_FUNC_SHARE[141]. Odd numbered pins use the upper 16 123 + * bit of each register. 124 + */ 125 + #define PAD_SLEW_RATE_MASK GENMASK(11, 9) 126 + #define PAD_SLEW_RATE_POS 9 127 + #define PAD_BIAS_STRONG_PULL_UP BIT(8) 128 + #define PAD_INPUT_ENABLE BIT(7) 129 + #define PAD_INPUT_SCHMITT_ENABLE BIT(6) 130 + #define PAD_BIAS_DISABLE BIT(5) 131 + #define PAD_BIAS_PULL_DOWN BIT(4) 132 + #define PAD_BIAS_MASK \ 133 + (PAD_BIAS_STRONG_PULL_UP | \ 134 + PAD_BIAS_DISABLE | \ 135 + PAD_BIAS_PULL_DOWN) 136 + #define PAD_DRIVE_STRENGTH_MASK GENMASK(3, 0) 137 + #define PAD_DRIVE_STRENGTH_POS 0 138 + 139 + /* 140 + * From Section 11, the IO_PADSHARE_SEL register can be programmed to select 141 + * one of seven pre-defined multiplexed signal groups on PAD_FUNC_SHARE and 142 + * PAD_GPIO pads. This is a global setting. 143 + */ 144 + #define IO_PADSHARE_SEL 0x1a0 145 + 146 + /* 147 + * This just needs to be some number such that when 148 + * sfp->gpio.pin_base = PAD_INVALID_GPIO then 149 + * starfive_pin_to_gpio(sfp, validpin) is never a valid GPIO number. 150 + * That is it should underflow and return something >= NR_GPIOS. 151 + */ 152 + #define PAD_INVALID_GPIO 0x10000 153 + 154 + /* 155 + * The packed pinmux values from the device tree look like this: 156 + * 157 + * | 31 - 24 | 23 - 16 | 15 - 8 | 7 | 6 | 5 - 0 | 158 + * | dout | doen | din | dout rev | doen rev | gpio nr | 159 + * 160 + * ..but the GPOn_DOUT_CFG and GPOn_DOEN_CFG registers look like this: 161 + * 162 + * | 31 | 30 - 8 | 7 - 0 | 163 + * | dout/doen rev | unused | dout/doen | 164 + */ 165 + static unsigned int starfive_pinmux_to_gpio(u32 v) 166 + { 167 + return v & (NR_GPIOS - 1); 168 + } 169 + 170 + static u32 starfive_pinmux_to_dout(u32 v) 171 + { 172 + return ((v & BIT(7)) << (31 - 7)) | ((v >> 24) & GENMASK(7, 0)); 173 + } 174 + 175 + static u32 starfive_pinmux_to_doen(u32 v) 176 + { 177 + return ((v & BIT(6)) << (31 - 6)) | ((v >> 16) & GENMASK(7, 0)); 178 + } 179 + 180 + static u32 starfive_pinmux_to_din(u32 v) 181 + { 182 + return (v >> 8) & GENMASK(7, 0); 183 + } 184 + 185 + /* 186 + * The maximum GPIO output current depends on the chosen drive strength: 187 + * 188 + * DS: 0 1 2 3 4 5 6 7 189 + * mA: 14.2 21.2 28.2 35.2 42.2 49.1 56.0 62.8 190 + * 191 + * After rounding that is 7*DS + 14 mA 192 + */ 193 + static u32 starfive_drive_strength_to_max_mA(u16 ds) 194 + { 195 + return 7 * ds + 14; 196 + } 197 + 198 + static u16 starfive_drive_strength_from_max_mA(u32 i) 199 + { 200 + return (clamp(i, 14U, 63U) - 14) / 7; 201 + } 202 + 203 + struct starfive_pinctrl { 204 + struct gpio_chip gc; 205 + struct pinctrl_gpio_range gpios; 206 + raw_spinlock_t lock; 207 + void __iomem *base; 208 + void __iomem *padctl; 209 + struct pinctrl_dev *pctl; 210 + }; 211 + 212 + static inline unsigned int starfive_pin_to_gpio(const struct starfive_pinctrl *sfp, 213 + unsigned int pin) 214 + { 215 + return pin - sfp->gpios.pin_base; 216 + } 217 + 218 + static inline unsigned int starfive_gpio_to_pin(const struct starfive_pinctrl *sfp, 219 + unsigned int gpio) 220 + { 221 + return sfp->gpios.pin_base + gpio; 222 + } 223 + 224 + static struct starfive_pinctrl *starfive_from_irq_data(struct irq_data *d) 225 + { 226 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 227 + 228 + return container_of(gc, struct starfive_pinctrl, gc); 229 + } 230 + 231 + static struct starfive_pinctrl *starfive_from_irq_desc(struct irq_desc *desc) 232 + { 233 + struct gpio_chip *gc = irq_desc_get_handler_data(desc); 234 + 235 + return container_of(gc, struct starfive_pinctrl, gc); 236 + } 237 + 238 + static const struct pinctrl_pin_desc starfive_pins[] = { 239 + PINCTRL_PIN(PAD_GPIO(0), "GPIO[0]"), 240 + PINCTRL_PIN(PAD_GPIO(1), "GPIO[1]"), 241 + PINCTRL_PIN(PAD_GPIO(2), "GPIO[2]"), 242 + PINCTRL_PIN(PAD_GPIO(3), "GPIO[3]"), 243 + PINCTRL_PIN(PAD_GPIO(4), "GPIO[4]"), 244 + PINCTRL_PIN(PAD_GPIO(5), "GPIO[5]"), 245 + PINCTRL_PIN(PAD_GPIO(6), "GPIO[6]"), 246 + PINCTRL_PIN(PAD_GPIO(7), "GPIO[7]"), 247 + PINCTRL_PIN(PAD_GPIO(8), "GPIO[8]"), 248 + PINCTRL_PIN(PAD_GPIO(9), "GPIO[9]"), 249 + PINCTRL_PIN(PAD_GPIO(10), "GPIO[10]"), 250 + PINCTRL_PIN(PAD_GPIO(11), "GPIO[11]"), 251 + PINCTRL_PIN(PAD_GPIO(12), "GPIO[12]"), 252 + PINCTRL_PIN(PAD_GPIO(13), "GPIO[13]"), 253 + PINCTRL_PIN(PAD_GPIO(14), "GPIO[14]"), 254 + PINCTRL_PIN(PAD_GPIO(15), "GPIO[15]"), 255 + PINCTRL_PIN(PAD_GPIO(16), "GPIO[16]"), 256 + PINCTRL_PIN(PAD_GPIO(17), "GPIO[17]"), 257 + PINCTRL_PIN(PAD_GPIO(18), "GPIO[18]"), 258 + PINCTRL_PIN(PAD_GPIO(19), "GPIO[19]"), 259 + PINCTRL_PIN(PAD_GPIO(20), "GPIO[20]"), 260 + PINCTRL_PIN(PAD_GPIO(21), "GPIO[21]"), 261 + PINCTRL_PIN(PAD_GPIO(22), "GPIO[22]"), 262 + PINCTRL_PIN(PAD_GPIO(23), "GPIO[23]"), 263 + PINCTRL_PIN(PAD_GPIO(24), "GPIO[24]"), 264 + PINCTRL_PIN(PAD_GPIO(25), "GPIO[25]"), 265 + PINCTRL_PIN(PAD_GPIO(26), "GPIO[26]"), 266 + PINCTRL_PIN(PAD_GPIO(27), "GPIO[27]"), 267 + PINCTRL_PIN(PAD_GPIO(28), "GPIO[28]"), 268 + PINCTRL_PIN(PAD_GPIO(29), "GPIO[29]"), 269 + PINCTRL_PIN(PAD_GPIO(30), "GPIO[30]"), 270 + PINCTRL_PIN(PAD_GPIO(31), "GPIO[31]"), 271 + PINCTRL_PIN(PAD_GPIO(32), "GPIO[32]"), 272 + PINCTRL_PIN(PAD_GPIO(33), "GPIO[33]"), 273 + PINCTRL_PIN(PAD_GPIO(34), "GPIO[34]"), 274 + PINCTRL_PIN(PAD_GPIO(35), "GPIO[35]"), 275 + PINCTRL_PIN(PAD_GPIO(36), "GPIO[36]"), 276 + PINCTRL_PIN(PAD_GPIO(37), "GPIO[37]"), 277 + PINCTRL_PIN(PAD_GPIO(38), "GPIO[38]"), 278 + PINCTRL_PIN(PAD_GPIO(39), "GPIO[39]"), 279 + PINCTRL_PIN(PAD_GPIO(40), "GPIO[40]"), 280 + PINCTRL_PIN(PAD_GPIO(41), "GPIO[41]"), 281 + PINCTRL_PIN(PAD_GPIO(42), "GPIO[42]"), 282 + PINCTRL_PIN(PAD_GPIO(43), "GPIO[43]"), 283 + PINCTRL_PIN(PAD_GPIO(44), "GPIO[44]"), 284 + PINCTRL_PIN(PAD_GPIO(45), "GPIO[45]"), 285 + PINCTRL_PIN(PAD_GPIO(46), "GPIO[46]"), 286 + PINCTRL_PIN(PAD_GPIO(47), "GPIO[47]"), 287 + PINCTRL_PIN(PAD_GPIO(48), "GPIO[48]"), 288 + PINCTRL_PIN(PAD_GPIO(49), "GPIO[49]"), 289 + PINCTRL_PIN(PAD_GPIO(50), "GPIO[50]"), 290 + PINCTRL_PIN(PAD_GPIO(51), "GPIO[51]"), 291 + PINCTRL_PIN(PAD_GPIO(52), "GPIO[52]"), 292 + PINCTRL_PIN(PAD_GPIO(53), "GPIO[53]"), 293 + PINCTRL_PIN(PAD_GPIO(54), "GPIO[54]"), 294 + PINCTRL_PIN(PAD_GPIO(55), "GPIO[55]"), 295 + PINCTRL_PIN(PAD_GPIO(56), "GPIO[56]"), 296 + PINCTRL_PIN(PAD_GPIO(57), "GPIO[57]"), 297 + PINCTRL_PIN(PAD_GPIO(58), "GPIO[58]"), 298 + PINCTRL_PIN(PAD_GPIO(59), "GPIO[59]"), 299 + PINCTRL_PIN(PAD_GPIO(60), "GPIO[60]"), 300 + PINCTRL_PIN(PAD_GPIO(61), "GPIO[61]"), 301 + PINCTRL_PIN(PAD_GPIO(62), "GPIO[62]"), 302 + PINCTRL_PIN(PAD_GPIO(63), "GPIO[63]"), 303 + PINCTRL_PIN(PAD_FUNC_SHARE(0), "FUNC_SHARE[0]"), 304 + PINCTRL_PIN(PAD_FUNC_SHARE(1), "FUNC_SHARE[1]"), 305 + PINCTRL_PIN(PAD_FUNC_SHARE(2), "FUNC_SHARE[2]"), 306 + PINCTRL_PIN(PAD_FUNC_SHARE(3), "FUNC_SHARE[3]"), 307 + PINCTRL_PIN(PAD_FUNC_SHARE(4), "FUNC_SHARE[4]"), 308 + PINCTRL_PIN(PAD_FUNC_SHARE(5), "FUNC_SHARE[5]"), 309 + PINCTRL_PIN(PAD_FUNC_SHARE(6), "FUNC_SHARE[6]"), 310 + PINCTRL_PIN(PAD_FUNC_SHARE(7), "FUNC_SHARE[7]"), 311 + PINCTRL_PIN(PAD_FUNC_SHARE(8), "FUNC_SHARE[8]"), 312 + PINCTRL_PIN(PAD_FUNC_SHARE(9), "FUNC_SHARE[9]"), 313 + PINCTRL_PIN(PAD_FUNC_SHARE(10), "FUNC_SHARE[10]"), 314 + PINCTRL_PIN(PAD_FUNC_SHARE(11), "FUNC_SHARE[11]"), 315 + PINCTRL_PIN(PAD_FUNC_SHARE(12), "FUNC_SHARE[12]"), 316 + PINCTRL_PIN(PAD_FUNC_SHARE(13), "FUNC_SHARE[13]"), 317 + PINCTRL_PIN(PAD_FUNC_SHARE(14), "FUNC_SHARE[14]"), 318 + PINCTRL_PIN(PAD_FUNC_SHARE(15), "FUNC_SHARE[15]"), 319 + PINCTRL_PIN(PAD_FUNC_SHARE(16), "FUNC_SHARE[16]"), 320 + PINCTRL_PIN(PAD_FUNC_SHARE(17), "FUNC_SHARE[17]"), 321 + PINCTRL_PIN(PAD_FUNC_SHARE(18), "FUNC_SHARE[18]"), 322 + PINCTRL_PIN(PAD_FUNC_SHARE(19), "FUNC_SHARE[19]"), 323 + PINCTRL_PIN(PAD_FUNC_SHARE(20), "FUNC_SHARE[20]"), 324 + PINCTRL_PIN(PAD_FUNC_SHARE(21), "FUNC_SHARE[21]"), 325 + PINCTRL_PIN(PAD_FUNC_SHARE(22), "FUNC_SHARE[22]"), 326 + PINCTRL_PIN(PAD_FUNC_SHARE(23), "FUNC_SHARE[23]"), 327 + PINCTRL_PIN(PAD_FUNC_SHARE(24), "FUNC_SHARE[24]"), 328 + PINCTRL_PIN(PAD_FUNC_SHARE(25), "FUNC_SHARE[25]"), 329 + PINCTRL_PIN(PAD_FUNC_SHARE(26), "FUNC_SHARE[26]"), 330 + PINCTRL_PIN(PAD_FUNC_SHARE(27), "FUNC_SHARE[27]"), 331 + PINCTRL_PIN(PAD_FUNC_SHARE(28), "FUNC_SHARE[28]"), 332 + PINCTRL_PIN(PAD_FUNC_SHARE(29), "FUNC_SHARE[29]"), 333 + PINCTRL_PIN(PAD_FUNC_SHARE(30), "FUNC_SHARE[30]"), 334 + PINCTRL_PIN(PAD_FUNC_SHARE(31), "FUNC_SHARE[31]"), 335 + PINCTRL_PIN(PAD_FUNC_SHARE(32), "FUNC_SHARE[32]"), 336 + PINCTRL_PIN(PAD_FUNC_SHARE(33), "FUNC_SHARE[33]"), 337 + PINCTRL_PIN(PAD_FUNC_SHARE(34), "FUNC_SHARE[34]"), 338 + PINCTRL_PIN(PAD_FUNC_SHARE(35), "FUNC_SHARE[35]"), 339 + PINCTRL_PIN(PAD_FUNC_SHARE(36), "FUNC_SHARE[36]"), 340 + PINCTRL_PIN(PAD_FUNC_SHARE(37), "FUNC_SHARE[37]"), 341 + PINCTRL_PIN(PAD_FUNC_SHARE(38), "FUNC_SHARE[38]"), 342 + PINCTRL_PIN(PAD_FUNC_SHARE(39), "FUNC_SHARE[39]"), 343 + PINCTRL_PIN(PAD_FUNC_SHARE(40), "FUNC_SHARE[40]"), 344 + PINCTRL_PIN(PAD_FUNC_SHARE(41), "FUNC_SHARE[41]"), 345 + PINCTRL_PIN(PAD_FUNC_SHARE(42), "FUNC_SHARE[42]"), 346 + PINCTRL_PIN(PAD_FUNC_SHARE(43), "FUNC_SHARE[43]"), 347 + PINCTRL_PIN(PAD_FUNC_SHARE(44), "FUNC_SHARE[44]"), 348 + PINCTRL_PIN(PAD_FUNC_SHARE(45), "FUNC_SHARE[45]"), 349 + PINCTRL_PIN(PAD_FUNC_SHARE(46), "FUNC_SHARE[46]"), 350 + PINCTRL_PIN(PAD_FUNC_SHARE(47), "FUNC_SHARE[47]"), 351 + PINCTRL_PIN(PAD_FUNC_SHARE(48), "FUNC_SHARE[48]"), 352 + PINCTRL_PIN(PAD_FUNC_SHARE(49), "FUNC_SHARE[49]"), 353 + PINCTRL_PIN(PAD_FUNC_SHARE(50), "FUNC_SHARE[50]"), 354 + PINCTRL_PIN(PAD_FUNC_SHARE(51), "FUNC_SHARE[51]"), 355 + PINCTRL_PIN(PAD_FUNC_SHARE(52), "FUNC_SHARE[52]"), 356 + PINCTRL_PIN(PAD_FUNC_SHARE(53), "FUNC_SHARE[53]"), 357 + PINCTRL_PIN(PAD_FUNC_SHARE(54), "FUNC_SHARE[54]"), 358 + PINCTRL_PIN(PAD_FUNC_SHARE(55), "FUNC_SHARE[55]"), 359 + PINCTRL_PIN(PAD_FUNC_SHARE(56), "FUNC_SHARE[56]"), 360 + PINCTRL_PIN(PAD_FUNC_SHARE(57), "FUNC_SHARE[57]"), 361 + PINCTRL_PIN(PAD_FUNC_SHARE(58), "FUNC_SHARE[58]"), 362 + PINCTRL_PIN(PAD_FUNC_SHARE(59), "FUNC_SHARE[59]"), 363 + PINCTRL_PIN(PAD_FUNC_SHARE(60), "FUNC_SHARE[60]"), 364 + PINCTRL_PIN(PAD_FUNC_SHARE(61), "FUNC_SHARE[61]"), 365 + PINCTRL_PIN(PAD_FUNC_SHARE(62), "FUNC_SHARE[62]"), 366 + PINCTRL_PIN(PAD_FUNC_SHARE(63), "FUNC_SHARE[63]"), 367 + PINCTRL_PIN(PAD_FUNC_SHARE(64), "FUNC_SHARE[64]"), 368 + PINCTRL_PIN(PAD_FUNC_SHARE(65), "FUNC_SHARE[65]"), 369 + PINCTRL_PIN(PAD_FUNC_SHARE(66), "FUNC_SHARE[66]"), 370 + PINCTRL_PIN(PAD_FUNC_SHARE(67), "FUNC_SHARE[67]"), 371 + PINCTRL_PIN(PAD_FUNC_SHARE(68), "FUNC_SHARE[68]"), 372 + PINCTRL_PIN(PAD_FUNC_SHARE(69), "FUNC_SHARE[69]"), 373 + PINCTRL_PIN(PAD_FUNC_SHARE(70), "FUNC_SHARE[70]"), 374 + PINCTRL_PIN(PAD_FUNC_SHARE(71), "FUNC_SHARE[71]"), 375 + PINCTRL_PIN(PAD_FUNC_SHARE(72), "FUNC_SHARE[72]"), 376 + PINCTRL_PIN(PAD_FUNC_SHARE(73), "FUNC_SHARE[73]"), 377 + PINCTRL_PIN(PAD_FUNC_SHARE(74), "FUNC_SHARE[74]"), 378 + PINCTRL_PIN(PAD_FUNC_SHARE(75), "FUNC_SHARE[75]"), 379 + PINCTRL_PIN(PAD_FUNC_SHARE(76), "FUNC_SHARE[76]"), 380 + PINCTRL_PIN(PAD_FUNC_SHARE(77), "FUNC_SHARE[77]"), 381 + PINCTRL_PIN(PAD_FUNC_SHARE(78), "FUNC_SHARE[78]"), 382 + PINCTRL_PIN(PAD_FUNC_SHARE(79), "FUNC_SHARE[79]"), 383 + PINCTRL_PIN(PAD_FUNC_SHARE(80), "FUNC_SHARE[80]"), 384 + PINCTRL_PIN(PAD_FUNC_SHARE(81), "FUNC_SHARE[81]"), 385 + PINCTRL_PIN(PAD_FUNC_SHARE(82), "FUNC_SHARE[82]"), 386 + PINCTRL_PIN(PAD_FUNC_SHARE(83), "FUNC_SHARE[83]"), 387 + PINCTRL_PIN(PAD_FUNC_SHARE(84), "FUNC_SHARE[84]"), 388 + PINCTRL_PIN(PAD_FUNC_SHARE(85), "FUNC_SHARE[85]"), 389 + PINCTRL_PIN(PAD_FUNC_SHARE(86), "FUNC_SHARE[86]"), 390 + PINCTRL_PIN(PAD_FUNC_SHARE(87), "FUNC_SHARE[87]"), 391 + PINCTRL_PIN(PAD_FUNC_SHARE(88), "FUNC_SHARE[88]"), 392 + PINCTRL_PIN(PAD_FUNC_SHARE(89), "FUNC_SHARE[89]"), 393 + PINCTRL_PIN(PAD_FUNC_SHARE(90), "FUNC_SHARE[90]"), 394 + PINCTRL_PIN(PAD_FUNC_SHARE(91), "FUNC_SHARE[91]"), 395 + PINCTRL_PIN(PAD_FUNC_SHARE(92), "FUNC_SHARE[92]"), 396 + PINCTRL_PIN(PAD_FUNC_SHARE(93), "FUNC_SHARE[93]"), 397 + PINCTRL_PIN(PAD_FUNC_SHARE(94), "FUNC_SHARE[94]"), 398 + PINCTRL_PIN(PAD_FUNC_SHARE(95), "FUNC_SHARE[95]"), 399 + PINCTRL_PIN(PAD_FUNC_SHARE(96), "FUNC_SHARE[96]"), 400 + PINCTRL_PIN(PAD_FUNC_SHARE(97), "FUNC_SHARE[97]"), 401 + PINCTRL_PIN(PAD_FUNC_SHARE(98), "FUNC_SHARE[98]"), 402 + PINCTRL_PIN(PAD_FUNC_SHARE(99), "FUNC_SHARE[99]"), 403 + PINCTRL_PIN(PAD_FUNC_SHARE(100), "FUNC_SHARE[100]"), 404 + PINCTRL_PIN(PAD_FUNC_SHARE(101), "FUNC_SHARE[101]"), 405 + PINCTRL_PIN(PAD_FUNC_SHARE(102), "FUNC_SHARE[102]"), 406 + PINCTRL_PIN(PAD_FUNC_SHARE(103), "FUNC_SHARE[103]"), 407 + PINCTRL_PIN(PAD_FUNC_SHARE(104), "FUNC_SHARE[104]"), 408 + PINCTRL_PIN(PAD_FUNC_SHARE(105), "FUNC_SHARE[105]"), 409 + PINCTRL_PIN(PAD_FUNC_SHARE(106), "FUNC_SHARE[106]"), 410 + PINCTRL_PIN(PAD_FUNC_SHARE(107), "FUNC_SHARE[107]"), 411 + PINCTRL_PIN(PAD_FUNC_SHARE(108), "FUNC_SHARE[108]"), 412 + PINCTRL_PIN(PAD_FUNC_SHARE(109), "FUNC_SHARE[109]"), 413 + PINCTRL_PIN(PAD_FUNC_SHARE(110), "FUNC_SHARE[110]"), 414 + PINCTRL_PIN(PAD_FUNC_SHARE(111), "FUNC_SHARE[111]"), 415 + PINCTRL_PIN(PAD_FUNC_SHARE(112), "FUNC_SHARE[112]"), 416 + PINCTRL_PIN(PAD_FUNC_SHARE(113), "FUNC_SHARE[113]"), 417 + PINCTRL_PIN(PAD_FUNC_SHARE(114), "FUNC_SHARE[114]"), 418 + PINCTRL_PIN(PAD_FUNC_SHARE(115), "FUNC_SHARE[115]"), 419 + PINCTRL_PIN(PAD_FUNC_SHARE(116), "FUNC_SHARE[116]"), 420 + PINCTRL_PIN(PAD_FUNC_SHARE(117), "FUNC_SHARE[117]"), 421 + PINCTRL_PIN(PAD_FUNC_SHARE(118), "FUNC_SHARE[118]"), 422 + PINCTRL_PIN(PAD_FUNC_SHARE(119), "FUNC_SHARE[119]"), 423 + PINCTRL_PIN(PAD_FUNC_SHARE(120), "FUNC_SHARE[120]"), 424 + PINCTRL_PIN(PAD_FUNC_SHARE(121), "FUNC_SHARE[121]"), 425 + PINCTRL_PIN(PAD_FUNC_SHARE(122), "FUNC_SHARE[122]"), 426 + PINCTRL_PIN(PAD_FUNC_SHARE(123), "FUNC_SHARE[123]"), 427 + PINCTRL_PIN(PAD_FUNC_SHARE(124), "FUNC_SHARE[124]"), 428 + PINCTRL_PIN(PAD_FUNC_SHARE(125), "FUNC_SHARE[125]"), 429 + PINCTRL_PIN(PAD_FUNC_SHARE(126), "FUNC_SHARE[126]"), 430 + PINCTRL_PIN(PAD_FUNC_SHARE(127), "FUNC_SHARE[127]"), 431 + PINCTRL_PIN(PAD_FUNC_SHARE(128), "FUNC_SHARE[128]"), 432 + PINCTRL_PIN(PAD_FUNC_SHARE(129), "FUNC_SHARE[129]"), 433 + PINCTRL_PIN(PAD_FUNC_SHARE(130), "FUNC_SHARE[130]"), 434 + PINCTRL_PIN(PAD_FUNC_SHARE(131), "FUNC_SHARE[131]"), 435 + PINCTRL_PIN(PAD_FUNC_SHARE(132), "FUNC_SHARE[132]"), 436 + PINCTRL_PIN(PAD_FUNC_SHARE(133), "FUNC_SHARE[133]"), 437 + PINCTRL_PIN(PAD_FUNC_SHARE(134), "FUNC_SHARE[134]"), 438 + PINCTRL_PIN(PAD_FUNC_SHARE(135), "FUNC_SHARE[135]"), 439 + PINCTRL_PIN(PAD_FUNC_SHARE(136), "FUNC_SHARE[136]"), 440 + PINCTRL_PIN(PAD_FUNC_SHARE(137), "FUNC_SHARE[137]"), 441 + PINCTRL_PIN(PAD_FUNC_SHARE(138), "FUNC_SHARE[138]"), 442 + PINCTRL_PIN(PAD_FUNC_SHARE(139), "FUNC_SHARE[139]"), 443 + PINCTRL_PIN(PAD_FUNC_SHARE(140), "FUNC_SHARE[140]"), 444 + PINCTRL_PIN(PAD_FUNC_SHARE(141), "FUNC_SHARE[141]"), 445 + }; 446 + 447 + #ifdef CONFIG_DEBUG_FS 448 + static void starfive_pin_dbg_show(struct pinctrl_dev *pctldev, 449 + struct seq_file *s, 450 + unsigned int pin) 451 + { 452 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 453 + unsigned int gpio = starfive_pin_to_gpio(sfp, pin); 454 + void __iomem *reg; 455 + u32 dout, doen; 456 + 457 + if (gpio >= NR_GPIOS) 458 + return; 459 + 460 + reg = sfp->base + GPON_DOUT_CFG + 8 * gpio; 461 + dout = readl_relaxed(reg + 0x000); 462 + doen = readl_relaxed(reg + 0x004); 463 + 464 + seq_printf(s, "dout=%lu%s doen=%lu%s", 465 + dout & GENMASK(7, 0), (dout & BIT(31)) ? "r" : "", 466 + doen & GENMASK(7, 0), (doen & BIT(31)) ? "r" : ""); 467 + } 468 + #else 469 + #define starfive_pin_dbg_show NULL 470 + #endif 471 + 472 + static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, 473 + struct device_node *np, 474 + struct pinctrl_map **maps, 475 + unsigned int *num_maps) 476 + { 477 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 478 + struct device *dev = sfp->gc.parent; 479 + struct device_node *child; 480 + struct pinctrl_map *map; 481 + const char **pgnames; 482 + const char *grpname; 483 + u32 *pinmux; 484 + int ngroups; 485 + int *pins; 486 + int nmaps; 487 + int ret; 488 + 489 + nmaps = 0; 490 + ngroups = 0; 491 + for_each_child_of_node(np, child) { 492 + int npinmux = of_property_count_u32_elems(child, "pinmux"); 493 + int npins = of_property_count_u32_elems(child, "pins"); 494 + 495 + if (npinmux > 0 && npins > 0) { 496 + dev_err(dev, "invalid pinctrl group %pOFn.%pOFn: both pinmux and pins set\n", 497 + np, child); 498 + of_node_put(child); 499 + return -EINVAL; 500 + } 501 + if (npinmux == 0 && npins == 0) { 502 + dev_err(dev, "invalid pinctrl group %pOFn.%pOFn: neither pinmux nor pins set\n", 503 + np, child); 504 + of_node_put(child); 505 + return -EINVAL; 506 + } 507 + 508 + if (npinmux > 0) 509 + nmaps += 2; 510 + else 511 + nmaps += 1; 512 + ngroups += 1; 513 + } 514 + 515 + pgnames = devm_kcalloc(dev, ngroups, sizeof(*pgnames), GFP_KERNEL); 516 + if (!pgnames) 517 + return -ENOMEM; 518 + 519 + map = kcalloc(nmaps, sizeof(*map), GFP_KERNEL); 520 + if (!map) 521 + return -ENOMEM; 522 + 523 + nmaps = 0; 524 + ngroups = 0; 525 + for_each_child_of_node(np, child) { 526 + int npins; 527 + int i; 528 + 529 + grpname = devm_kasprintf(dev, GFP_KERNEL, "%pOFn.%pOFn", np, child); 530 + if (!grpname) { 531 + ret = -ENOMEM; 532 + goto put_child; 533 + } 534 + 535 + pgnames[ngroups++] = grpname; 536 + 537 + if ((npins = of_property_count_u32_elems(child, "pinmux")) > 0) { 538 + pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL); 539 + if (!pins) { 540 + ret = -ENOMEM; 541 + goto put_child; 542 + } 543 + 544 + pinmux = devm_kcalloc(dev, npins, sizeof(*pinmux), GFP_KERNEL); 545 + if (!pinmux) { 546 + ret = -ENOMEM; 547 + goto put_child; 548 + } 549 + 550 + ret = of_property_read_u32_array(child, "pinmux", pinmux, npins); 551 + if (ret) 552 + goto put_child; 553 + 554 + for (i = 0; i < npins; i++) { 555 + unsigned int gpio = starfive_pinmux_to_gpio(pinmux[i]); 556 + 557 + pins[i] = starfive_gpio_to_pin(sfp, gpio); 558 + } 559 + 560 + map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP; 561 + map[nmaps].data.mux.function = np->name; 562 + map[nmaps].data.mux.group = grpname; 563 + nmaps += 1; 564 + } else if ((npins = of_property_count_u32_elems(child, "pins")) > 0) { 565 + pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL); 566 + if (!pins) { 567 + ret = -ENOMEM; 568 + goto put_child; 569 + } 570 + 571 + pinmux = NULL; 572 + 573 + for (i = 0; i < npins; i++) { 574 + u32 v; 575 + 576 + ret = of_property_read_u32_index(child, "pins", i, &v); 577 + if (ret) 578 + goto put_child; 579 + pins[i] = v; 580 + } 581 + } else { 582 + ret = -EINVAL; 583 + goto put_child; 584 + } 585 + 586 + ret = pinctrl_generic_add_group(pctldev, grpname, pins, npins, pinmux); 587 + if (ret < 0) { 588 + dev_err(dev, "error adding group %s: %d\n", grpname, ret); 589 + goto put_child; 590 + } 591 + 592 + ret = pinconf_generic_parse_dt_config(child, pctldev, 593 + &map[nmaps].data.configs.configs, 594 + &map[nmaps].data.configs.num_configs); 595 + if (ret) { 596 + dev_err(dev, "error parsing pin config of group %s: %d\n", 597 + grpname, ret); 598 + goto put_child; 599 + } 600 + 601 + /* don't create a map if there are no pinconf settings */ 602 + if (map[nmaps].data.configs.num_configs == 0) 603 + continue; 604 + 605 + map[nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP; 606 + map[nmaps].data.configs.group_or_pin = grpname; 607 + nmaps += 1; 608 + } 609 + 610 + ret = pinmux_generic_add_function(pctldev, np->name, pgnames, ngroups, NULL); 611 + if (ret < 0) { 612 + dev_err(dev, "error adding function %s: %d\n", np->name, ret); 613 + goto free_map; 614 + } 615 + 616 + *maps = map; 617 + *num_maps = nmaps; 618 + return 0; 619 + 620 + put_child: 621 + of_node_put(child); 622 + free_map: 623 + pinctrl_utils_free_map(pctldev, map, nmaps); 624 + return ret; 625 + } 626 + 627 + static const struct pinctrl_ops starfive_pinctrl_ops = { 628 + .get_groups_count = pinctrl_generic_get_group_count, 629 + .get_group_name = pinctrl_generic_get_group_name, 630 + .get_group_pins = pinctrl_generic_get_group_pins, 631 + .pin_dbg_show = starfive_pin_dbg_show, 632 + .dt_node_to_map = starfive_dt_node_to_map, 633 + .dt_free_map = pinctrl_utils_free_map, 634 + }; 635 + 636 + static int starfive_set_mux(struct pinctrl_dev *pctldev, 637 + unsigned int fsel, unsigned int gsel) 638 + { 639 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 640 + struct device *dev = sfp->gc.parent; 641 + const struct group_desc *group; 642 + const u32 *pinmux; 643 + unsigned int i; 644 + 645 + group = pinctrl_generic_get_group(pctldev, gsel); 646 + if (!group) 647 + return -EINVAL; 648 + 649 + pinmux = group->data; 650 + for (i = 0; i < group->num_pins; i++) { 651 + u32 v = pinmux[i]; 652 + unsigned int gpio = starfive_pinmux_to_gpio(v); 653 + u32 dout = starfive_pinmux_to_dout(v); 654 + u32 doen = starfive_pinmux_to_doen(v); 655 + u32 din = starfive_pinmux_to_din(v); 656 + void __iomem *reg_dout; 657 + void __iomem *reg_doen; 658 + void __iomem *reg_din; 659 + unsigned long flags; 660 + 661 + dev_dbg(dev, "GPIO%u: dout=0x%x doen=0x%x din=0x%x\n", 662 + gpio, dout, doen, din); 663 + 664 + reg_dout = sfp->base + GPON_DOUT_CFG + 8 * gpio; 665 + reg_doen = sfp->base + GPON_DOEN_CFG + 8 * gpio; 666 + if (din != GPI_NONE) 667 + reg_din = sfp->base + GPI_CFG_OFFSET + 4 * din; 668 + else 669 + reg_din = NULL; 670 + 671 + raw_spin_lock_irqsave(&sfp->lock, flags); 672 + writel_relaxed(dout, reg_dout); 673 + writel_relaxed(doen, reg_doen); 674 + if (reg_din) 675 + writel_relaxed(gpio + 2, reg_din); 676 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 677 + } 678 + 679 + return 0; 680 + } 681 + 682 + static const struct pinmux_ops starfive_pinmux_ops = { 683 + .get_functions_count = pinmux_generic_get_function_count, 684 + .get_function_name = pinmux_generic_get_function_name, 685 + .get_function_groups = pinmux_generic_get_function_groups, 686 + .set_mux = starfive_set_mux, 687 + .strict = true, 688 + }; 689 + 690 + static u16 starfive_padctl_get(struct starfive_pinctrl *sfp, 691 + unsigned int pin) 692 + { 693 + void __iomem *reg = sfp->padctl + 4 * (pin / 2); 694 + int shift = 16 * (pin % 2); 695 + 696 + return readl_relaxed(reg) >> shift; 697 + } 698 + 699 + static void starfive_padctl_rmw(struct starfive_pinctrl *sfp, 700 + unsigned int pin, 701 + u16 _mask, u16 _value) 702 + { 703 + void __iomem *reg = sfp->padctl + 4 * (pin / 2); 704 + int shift = 16 * (pin % 2); 705 + u32 mask = (u32)_mask << shift; 706 + u32 value = (u32)_value << shift; 707 + unsigned long flags; 708 + 709 + dev_dbg(sfp->gc.parent, "padctl_rmw(%u, 0x%03x, 0x%03x)\n", pin, _mask, _value); 710 + 711 + raw_spin_lock_irqsave(&sfp->lock, flags); 712 + value |= readl_relaxed(reg) & ~mask; 713 + writel_relaxed(value, reg); 714 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 715 + } 716 + 717 + #define PIN_CONFIG_STARFIVE_STRONG_PULL_UP (PIN_CONFIG_END + 1) 718 + 719 + static const struct pinconf_generic_params starfive_pinconf_custom_params[] = { 720 + { "starfive,strong-pull-up", PIN_CONFIG_STARFIVE_STRONG_PULL_UP, 1 }, 721 + }; 722 + 723 + #ifdef CONFIG_DEBUG_FS 724 + static const struct pin_config_item starfive_pinconf_custom_conf_items[] = { 725 + PCONFDUMP(PIN_CONFIG_STARFIVE_STRONG_PULL_UP, "input bias strong pull-up", NULL, false), 726 + }; 727 + 728 + static_assert(ARRAY_SIZE(starfive_pinconf_custom_conf_items) == 729 + ARRAY_SIZE(starfive_pinconf_custom_params)); 730 + #else 731 + #define starfive_pinconf_custom_conf_items NULL 732 + #endif 733 + 734 + static int starfive_pinconf_get(struct pinctrl_dev *pctldev, 735 + unsigned int pin, unsigned long *config) 736 + { 737 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 738 + int param = pinconf_to_config_param(*config); 739 + u16 value = starfive_padctl_get(sfp, pin); 740 + bool enabled; 741 + u32 arg; 742 + 743 + switch (param) { 744 + case PIN_CONFIG_BIAS_DISABLE: 745 + enabled = value & PAD_BIAS_DISABLE; 746 + arg = 0; 747 + break; 748 + case PIN_CONFIG_BIAS_PULL_DOWN: 749 + enabled = value & PAD_BIAS_PULL_DOWN; 750 + arg = 1; 751 + break; 752 + case PIN_CONFIG_BIAS_PULL_UP: 753 + enabled = !(value & PAD_BIAS_MASK); 754 + arg = 1; 755 + break; 756 + case PIN_CONFIG_DRIVE_STRENGTH: 757 + enabled = value & PAD_DRIVE_STRENGTH_MASK; 758 + arg = starfive_drive_strength_to_max_mA(value & PAD_DRIVE_STRENGTH_MASK); 759 + break; 760 + case PIN_CONFIG_INPUT_ENABLE: 761 + enabled = value & PAD_INPUT_ENABLE; 762 + arg = enabled; 763 + break; 764 + case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 765 + enabled = value & PAD_INPUT_SCHMITT_ENABLE; 766 + arg = enabled; 767 + break; 768 + case PIN_CONFIG_SLEW_RATE: 769 + enabled = value & PAD_SLEW_RATE_MASK; 770 + arg = (value & PAD_SLEW_RATE_MASK) >> PAD_SLEW_RATE_POS; 771 + break; 772 + case PIN_CONFIG_STARFIVE_STRONG_PULL_UP: 773 + enabled = value & PAD_BIAS_STRONG_PULL_UP; 774 + arg = enabled; 775 + break; 776 + default: 777 + return -ENOTSUPP; 778 + } 779 + 780 + *config = pinconf_to_config_packed(param, arg); 781 + return enabled ? 0 : -EINVAL; 782 + } 783 + 784 + static int starfive_pinconf_group_get(struct pinctrl_dev *pctldev, 785 + unsigned int gsel, unsigned long *config) 786 + { 787 + const struct group_desc *group; 788 + 789 + group = pinctrl_generic_get_group(pctldev, gsel); 790 + if (!group) 791 + return -EINVAL; 792 + 793 + return starfive_pinconf_get(pctldev, group->pins[0], config); 794 + } 795 + 796 + static int starfive_pinconf_group_set(struct pinctrl_dev *pctldev, 797 + unsigned int gsel, 798 + unsigned long *configs, 799 + unsigned int num_configs) 800 + { 801 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 802 + const struct group_desc *group; 803 + u16 mask, value; 804 + int i; 805 + 806 + group = pinctrl_generic_get_group(pctldev, gsel); 807 + if (!group) 808 + return -EINVAL; 809 + 810 + mask = 0; 811 + value = 0; 812 + for (i = 0; i < num_configs; i++) { 813 + int param = pinconf_to_config_param(configs[i]); 814 + u32 arg = pinconf_to_config_argument(configs[i]); 815 + 816 + switch (param) { 817 + case PIN_CONFIG_BIAS_DISABLE: 818 + mask |= PAD_BIAS_MASK; 819 + value = (value & ~PAD_BIAS_MASK) | PAD_BIAS_DISABLE; 820 + break; 821 + case PIN_CONFIG_BIAS_PULL_DOWN: 822 + if (arg == 0) 823 + return -ENOTSUPP; 824 + mask |= PAD_BIAS_MASK; 825 + value = (value & ~PAD_BIAS_MASK) | PAD_BIAS_PULL_DOWN; 826 + break; 827 + case PIN_CONFIG_BIAS_PULL_UP: 828 + if (arg == 0) 829 + return -ENOTSUPP; 830 + mask |= PAD_BIAS_MASK; 831 + value = value & ~PAD_BIAS_MASK; 832 + break; 833 + case PIN_CONFIG_DRIVE_STRENGTH: 834 + mask |= PAD_DRIVE_STRENGTH_MASK; 835 + value = (value & ~PAD_DRIVE_STRENGTH_MASK) | 836 + starfive_drive_strength_from_max_mA(arg); 837 + break; 838 + case PIN_CONFIG_INPUT_ENABLE: 839 + mask |= PAD_INPUT_ENABLE; 840 + if (arg) 841 + value |= PAD_INPUT_ENABLE; 842 + else 843 + value &= ~PAD_INPUT_ENABLE; 844 + break; 845 + case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 846 + mask |= PAD_INPUT_SCHMITT_ENABLE; 847 + if (arg) 848 + value |= PAD_INPUT_SCHMITT_ENABLE; 849 + else 850 + value &= ~PAD_INPUT_SCHMITT_ENABLE; 851 + break; 852 + case PIN_CONFIG_SLEW_RATE: 853 + mask |= PAD_SLEW_RATE_MASK; 854 + value = (value & ~PAD_SLEW_RATE_MASK) | 855 + ((arg << PAD_SLEW_RATE_POS) & PAD_SLEW_RATE_MASK); 856 + break; 857 + case PIN_CONFIG_STARFIVE_STRONG_PULL_UP: 858 + if (arg) { 859 + mask |= PAD_BIAS_MASK; 860 + value = (value & ~PAD_BIAS_MASK) | 861 + PAD_BIAS_STRONG_PULL_UP; 862 + } else { 863 + mask |= PAD_BIAS_STRONG_PULL_UP; 864 + value = value & ~PAD_BIAS_STRONG_PULL_UP; 865 + } 866 + break; 867 + default: 868 + return -ENOTSUPP; 869 + } 870 + } 871 + 872 + for (i = 0; i < group->num_pins; i++) 873 + starfive_padctl_rmw(sfp, group->pins[i], mask, value); 874 + 875 + return 0; 876 + } 877 + 878 + #ifdef CONFIG_DEBUG_FS 879 + static void starfive_pinconf_dbg_show(struct pinctrl_dev *pctldev, 880 + struct seq_file *s, unsigned int pin) 881 + { 882 + struct starfive_pinctrl *sfp = pinctrl_dev_get_drvdata(pctldev); 883 + u16 value = starfive_padctl_get(sfp, pin); 884 + 885 + seq_printf(s, " (0x%03x)", value); 886 + } 887 + #else 888 + #define starfive_pinconf_dbg_show NULL 889 + #endif 890 + 891 + static const struct pinconf_ops starfive_pinconf_ops = { 892 + .pin_config_get = starfive_pinconf_get, 893 + .pin_config_group_get = starfive_pinconf_group_get, 894 + .pin_config_group_set = starfive_pinconf_group_set, 895 + .pin_config_dbg_show = starfive_pinconf_dbg_show, 896 + .is_generic = true, 897 + }; 898 + 899 + static struct pinctrl_desc starfive_desc = { 900 + .name = DRIVER_NAME, 901 + .pins = starfive_pins, 902 + .npins = ARRAY_SIZE(starfive_pins), 903 + .pctlops = &starfive_pinctrl_ops, 904 + .pmxops = &starfive_pinmux_ops, 905 + .confops = &starfive_pinconf_ops, 906 + .owner = THIS_MODULE, 907 + .num_custom_params = ARRAY_SIZE(starfive_pinconf_custom_params), 908 + .custom_params = starfive_pinconf_custom_params, 909 + .custom_conf_items = starfive_pinconf_custom_conf_items, 910 + }; 911 + 912 + static int starfive_gpio_request(struct gpio_chip *gc, unsigned int gpio) 913 + { 914 + return pinctrl_gpio_request(gc->base + gpio); 915 + } 916 + 917 + static void starfive_gpio_free(struct gpio_chip *gc, unsigned int gpio) 918 + { 919 + pinctrl_gpio_free(gc->base + gpio); 920 + } 921 + 922 + static int starfive_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio) 923 + { 924 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 925 + void __iomem *doen = sfp->base + GPON_DOEN_CFG + 8 * gpio; 926 + 927 + if (readl_relaxed(doen) == GPO_ENABLE) 928 + return GPIO_LINE_DIRECTION_OUT; 929 + 930 + return GPIO_LINE_DIRECTION_IN; 931 + } 932 + 933 + static int starfive_gpio_direction_input(struct gpio_chip *gc, 934 + unsigned int gpio) 935 + { 936 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 937 + void __iomem *doen = sfp->base + GPON_DOEN_CFG + 8 * gpio; 938 + unsigned long flags; 939 + 940 + /* enable input and schmitt trigger */ 941 + starfive_padctl_rmw(sfp, starfive_gpio_to_pin(sfp, gpio), 942 + PAD_INPUT_ENABLE | PAD_INPUT_SCHMITT_ENABLE, 943 + PAD_INPUT_ENABLE | PAD_INPUT_SCHMITT_ENABLE); 944 + 945 + raw_spin_lock_irqsave(&sfp->lock, flags); 946 + writel_relaxed(GPO_DISABLE, doen); 947 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 948 + return 0; 949 + } 950 + 951 + static int starfive_gpio_direction_output(struct gpio_chip *gc, 952 + unsigned int gpio, int value) 953 + { 954 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 955 + void __iomem *dout = sfp->base + GPON_DOUT_CFG + 8 * gpio; 956 + void __iomem *doen = sfp->base + GPON_DOEN_CFG + 8 * gpio; 957 + unsigned long flags; 958 + 959 + raw_spin_lock_irqsave(&sfp->lock, flags); 960 + writel_relaxed(value, dout); 961 + writel_relaxed(GPO_ENABLE, doen); 962 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 963 + 964 + /* disable input, schmitt trigger and bias */ 965 + starfive_padctl_rmw(sfp, starfive_gpio_to_pin(sfp, gpio), 966 + PAD_BIAS_MASK | PAD_INPUT_ENABLE | PAD_INPUT_SCHMITT_ENABLE, 967 + PAD_BIAS_DISABLE); 968 + 969 + return 0; 970 + } 971 + 972 + static int starfive_gpio_get(struct gpio_chip *gc, unsigned int gpio) 973 + { 974 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 975 + void __iomem *din = sfp->base + GPIODIN + 4 * (gpio / 32); 976 + 977 + return !!(readl_relaxed(din) & BIT(gpio % 32)); 978 + } 979 + 980 + static void starfive_gpio_set(struct gpio_chip *gc, unsigned int gpio, 981 + int value) 982 + { 983 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 984 + void __iomem *dout = sfp->base + GPON_DOUT_CFG + 8 * gpio; 985 + unsigned long flags; 986 + 987 + raw_spin_lock_irqsave(&sfp->lock, flags); 988 + writel_relaxed(value, dout); 989 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 990 + } 991 + 992 + static int starfive_gpio_set_config(struct gpio_chip *gc, unsigned int gpio, 993 + unsigned long config) 994 + { 995 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 996 + u32 arg = pinconf_to_config_argument(config); 997 + u16 value; 998 + u16 mask; 999 + 1000 + switch (pinconf_to_config_param(config)) { 1001 + case PIN_CONFIG_BIAS_DISABLE: 1002 + mask = PAD_BIAS_MASK; 1003 + value = PAD_BIAS_DISABLE; 1004 + break; 1005 + case PIN_CONFIG_BIAS_PULL_DOWN: 1006 + if (arg == 0) 1007 + return -ENOTSUPP; 1008 + mask = PAD_BIAS_MASK; 1009 + value = PAD_BIAS_PULL_DOWN; 1010 + break; 1011 + case PIN_CONFIG_BIAS_PULL_UP: 1012 + if (arg == 0) 1013 + return -ENOTSUPP; 1014 + mask = PAD_BIAS_MASK; 1015 + value = 0; 1016 + break; 1017 + case PIN_CONFIG_DRIVE_PUSH_PULL: 1018 + return 0; 1019 + case PIN_CONFIG_INPUT_ENABLE: 1020 + mask = PAD_INPUT_ENABLE; 1021 + value = arg ? PAD_INPUT_ENABLE : 0; 1022 + break; 1023 + case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 1024 + mask = PAD_INPUT_SCHMITT_ENABLE; 1025 + value = arg ? PAD_INPUT_SCHMITT_ENABLE : 0; 1026 + break; 1027 + default: 1028 + return -ENOTSUPP; 1029 + }; 1030 + 1031 + starfive_padctl_rmw(sfp, starfive_gpio_to_pin(sfp, gpio), mask, value); 1032 + return 0; 1033 + } 1034 + 1035 + static int starfive_gpio_add_pin_ranges(struct gpio_chip *gc) 1036 + { 1037 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 1038 + 1039 + sfp->gpios.name = sfp->gc.label; 1040 + sfp->gpios.base = sfp->gc.base; 1041 + /* 1042 + * sfp->gpios.pin_base depends on the chosen signal group 1043 + * and is set in starfive_probe() 1044 + */ 1045 + sfp->gpios.npins = NR_GPIOS; 1046 + sfp->gpios.gc = &sfp->gc; 1047 + pinctrl_add_gpio_range(sfp->pctl, &sfp->gpios); 1048 + return 0; 1049 + } 1050 + 1051 + static void starfive_irq_ack(struct irq_data *d) 1052 + { 1053 + struct starfive_pinctrl *sfp = starfive_from_irq_data(d); 1054 + irq_hw_number_t gpio = irqd_to_hwirq(d); 1055 + void __iomem *ic = sfp->base + GPIOIC + 4 * (gpio / 32); 1056 + u32 mask = BIT(gpio % 32); 1057 + unsigned long flags; 1058 + 1059 + raw_spin_lock_irqsave(&sfp->lock, flags); 1060 + writel_relaxed(mask, ic); 1061 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 1062 + } 1063 + 1064 + static void starfive_irq_mask(struct irq_data *d) 1065 + { 1066 + struct starfive_pinctrl *sfp = starfive_from_irq_data(d); 1067 + irq_hw_number_t gpio = irqd_to_hwirq(d); 1068 + void __iomem *ie = sfp->base + GPIOIE + 4 * (gpio / 32); 1069 + u32 mask = BIT(gpio % 32); 1070 + unsigned long flags; 1071 + u32 value; 1072 + 1073 + raw_spin_lock_irqsave(&sfp->lock, flags); 1074 + value = readl_relaxed(ie) & ~mask; 1075 + writel_relaxed(value, ie); 1076 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 1077 + } 1078 + 1079 + static void starfive_irq_mask_ack(struct irq_data *d) 1080 + { 1081 + struct starfive_pinctrl *sfp = starfive_from_irq_data(d); 1082 + irq_hw_number_t gpio = irqd_to_hwirq(d); 1083 + void __iomem *ie = sfp->base + GPIOIE + 4 * (gpio / 32); 1084 + void __iomem *ic = sfp->base + GPIOIC + 4 * (gpio / 32); 1085 + u32 mask = BIT(gpio % 32); 1086 + unsigned long flags; 1087 + u32 value; 1088 + 1089 + raw_spin_lock_irqsave(&sfp->lock, flags); 1090 + value = readl_relaxed(ie) & ~mask; 1091 + writel_relaxed(value, ie); 1092 + writel_relaxed(mask, ic); 1093 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 1094 + } 1095 + 1096 + static void starfive_irq_unmask(struct irq_data *d) 1097 + { 1098 + struct starfive_pinctrl *sfp = starfive_from_irq_data(d); 1099 + irq_hw_number_t gpio = irqd_to_hwirq(d); 1100 + void __iomem *ie = sfp->base + GPIOIE + 4 * (gpio / 32); 1101 + u32 mask = BIT(gpio % 32); 1102 + unsigned long flags; 1103 + u32 value; 1104 + 1105 + raw_spin_lock_irqsave(&sfp->lock, flags); 1106 + value = readl_relaxed(ie) | mask; 1107 + writel_relaxed(value, ie); 1108 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 1109 + } 1110 + 1111 + static int starfive_irq_set_type(struct irq_data *d, unsigned int trigger) 1112 + { 1113 + struct starfive_pinctrl *sfp = starfive_from_irq_data(d); 1114 + irq_hw_number_t gpio = irqd_to_hwirq(d); 1115 + void __iomem *base = sfp->base + 4 * (gpio / 32); 1116 + u32 mask = BIT(gpio % 32); 1117 + u32 irq_type, edge_both, polarity; 1118 + unsigned long flags; 1119 + 1120 + switch (trigger) { 1121 + case IRQ_TYPE_EDGE_RISING: 1122 + irq_type = mask; /* 1: edge triggered */ 1123 + edge_both = 0; /* 0: single edge */ 1124 + polarity = mask; /* 1: rising edge */ 1125 + break; 1126 + case IRQ_TYPE_EDGE_FALLING: 1127 + irq_type = mask; /* 1: edge triggered */ 1128 + edge_both = 0; /* 0: single edge */ 1129 + polarity = 0; /* 0: falling edge */ 1130 + break; 1131 + case IRQ_TYPE_EDGE_BOTH: 1132 + irq_type = mask; /* 1: edge triggered */ 1133 + edge_both = mask; /* 1: both edges */ 1134 + polarity = 0; /* 0: ignored */ 1135 + break; 1136 + case IRQ_TYPE_LEVEL_HIGH: 1137 + irq_type = 0; /* 0: level triggered */ 1138 + edge_both = 0; /* 0: ignored */ 1139 + polarity = mask; /* 1: high level */ 1140 + break; 1141 + case IRQ_TYPE_LEVEL_LOW: 1142 + irq_type = 0; /* 0: level triggered */ 1143 + edge_both = 0; /* 0: ignored */ 1144 + polarity = 0; /* 0: low level */ 1145 + break; 1146 + default: 1147 + return -EINVAL; 1148 + } 1149 + 1150 + if (trigger & IRQ_TYPE_EDGE_BOTH) 1151 + irq_set_handler_locked(d, handle_edge_irq); 1152 + else 1153 + irq_set_handler_locked(d, handle_level_irq); 1154 + 1155 + raw_spin_lock_irqsave(&sfp->lock, flags); 1156 + irq_type |= readl_relaxed(base + GPIOIS) & ~mask; 1157 + writel_relaxed(irq_type, base + GPIOIS); 1158 + edge_both |= readl_relaxed(base + GPIOIBE) & ~mask; 1159 + writel_relaxed(edge_both, base + GPIOIBE); 1160 + polarity |= readl_relaxed(base + GPIOIEV) & ~mask; 1161 + writel_relaxed(polarity, base + GPIOIEV); 1162 + raw_spin_unlock_irqrestore(&sfp->lock, flags); 1163 + return 0; 1164 + } 1165 + 1166 + static struct irq_chip starfive_irq_chip = { 1167 + .irq_ack = starfive_irq_ack, 1168 + .irq_mask = starfive_irq_mask, 1169 + .irq_mask_ack = starfive_irq_mask_ack, 1170 + .irq_unmask = starfive_irq_unmask, 1171 + .irq_set_type = starfive_irq_set_type, 1172 + .flags = IRQCHIP_SET_TYPE_MASKED, 1173 + }; 1174 + 1175 + static void starfive_gpio_irq_handler(struct irq_desc *desc) 1176 + { 1177 + struct starfive_pinctrl *sfp = starfive_from_irq_desc(desc); 1178 + struct irq_chip *chip = irq_desc_get_chip(desc); 1179 + unsigned long mis; 1180 + unsigned int pin; 1181 + 1182 + chained_irq_enter(chip, desc); 1183 + 1184 + mis = readl_relaxed(sfp->base + GPIOMIS + 0); 1185 + for_each_set_bit(pin, &mis, 32) 1186 + generic_handle_domain_irq(sfp->gc.irq.domain, pin); 1187 + 1188 + mis = readl_relaxed(sfp->base + GPIOMIS + 4); 1189 + for_each_set_bit(pin, &mis, 32) 1190 + generic_handle_domain_irq(sfp->gc.irq.domain, pin + 32); 1191 + 1192 + chained_irq_exit(chip, desc); 1193 + } 1194 + 1195 + static int starfive_gpio_init_hw(struct gpio_chip *gc) 1196 + { 1197 + struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc); 1198 + 1199 + /* mask all GPIO interrupts */ 1200 + writel(0, sfp->base + GPIOIE + 0); 1201 + writel(0, sfp->base + GPIOIE + 4); 1202 + /* clear edge interrupt flags */ 1203 + writel(~0U, sfp->base + GPIOIC + 0); 1204 + writel(~0U, sfp->base + GPIOIC + 4); 1205 + /* enable GPIO interrupts */ 1206 + writel(1, sfp->base + GPIOEN); 1207 + return 0; 1208 + } 1209 + 1210 + static void starfive_disable_clock(void *data) 1211 + { 1212 + clk_disable_unprepare(data); 1213 + } 1214 + 1215 + static int starfive_probe(struct platform_device *pdev) 1216 + { 1217 + struct device *dev = &pdev->dev; 1218 + struct starfive_pinctrl *sfp; 1219 + struct reset_control *rst; 1220 + struct clk *clk; 1221 + u32 value; 1222 + int ret; 1223 + 1224 + sfp = devm_kzalloc(dev, sizeof(*sfp), GFP_KERNEL); 1225 + if (!sfp) 1226 + return -ENOMEM; 1227 + 1228 + sfp->base = devm_platform_ioremap_resource_byname(pdev, "gpio"); 1229 + if (IS_ERR(sfp->base)) 1230 + return PTR_ERR(sfp->base); 1231 + 1232 + sfp->padctl = devm_platform_ioremap_resource_byname(pdev, "padctl"); 1233 + if (IS_ERR(sfp->padctl)) 1234 + return PTR_ERR(sfp->padctl); 1235 + 1236 + clk = devm_clk_get(dev, NULL); 1237 + if (IS_ERR(clk)) 1238 + return dev_err_probe(dev, PTR_ERR(clk), "could not get clock\n"); 1239 + 1240 + rst = devm_reset_control_get_exclusive(dev, NULL); 1241 + if (IS_ERR(rst)) 1242 + return dev_err_probe(dev, PTR_ERR(rst), "could not get reset\n"); 1243 + 1244 + ret = clk_prepare_enable(clk); 1245 + if (ret) 1246 + return dev_err_probe(dev, ret, "could not enable clock\n"); 1247 + 1248 + ret = devm_add_action_or_reset(dev, starfive_disable_clock, clk); 1249 + if (ret) 1250 + return ret; 1251 + 1252 + /* 1253 + * We don't want to assert reset and risk undoing pin muxing for the 1254 + * early boot serial console, but let's make sure the reset line is 1255 + * deasserted in case someone runs a really minimal bootloader. 1256 + */ 1257 + ret = reset_control_deassert(rst); 1258 + if (ret) 1259 + return dev_err_probe(dev, ret, "could not deassert reset\n"); 1260 + 1261 + platform_set_drvdata(pdev, sfp); 1262 + sfp->gc.parent = dev; 1263 + raw_spin_lock_init(&sfp->lock); 1264 + 1265 + ret = devm_pinctrl_register_and_init(dev, &starfive_desc, sfp, &sfp->pctl); 1266 + if (ret) 1267 + return dev_err_probe(dev, ret, "could not register pinctrl driver\n"); 1268 + 1269 + if (!of_property_read_u32(dev->of_node, "starfive,signal-group", &value)) { 1270 + if (value > 6) 1271 + return dev_err_probe(dev, -EINVAL, "invalid signal group %u\n", value); 1272 + writel(value, sfp->padctl + IO_PADSHARE_SEL); 1273 + } 1274 + 1275 + value = readl(sfp->padctl + IO_PADSHARE_SEL); 1276 + switch (value) { 1277 + case 0: 1278 + sfp->gpios.pin_base = PAD_INVALID_GPIO; 1279 + goto out_pinctrl_enable; 1280 + case 1: 1281 + sfp->gpios.pin_base = PAD_GPIO(0); 1282 + break; 1283 + case 2: 1284 + sfp->gpios.pin_base = PAD_FUNC_SHARE(72); 1285 + break; 1286 + case 3: 1287 + sfp->gpios.pin_base = PAD_FUNC_SHARE(70); 1288 + break; 1289 + case 4: case 5: case 6: 1290 + sfp->gpios.pin_base = PAD_FUNC_SHARE(0); 1291 + break; 1292 + default: 1293 + return dev_err_probe(dev, -EINVAL, "invalid signal group %u\n", value); 1294 + } 1295 + 1296 + sfp->gc.label = dev_name(dev); 1297 + sfp->gc.owner = THIS_MODULE; 1298 + sfp->gc.request = starfive_gpio_request; 1299 + sfp->gc.free = starfive_gpio_free; 1300 + sfp->gc.get_direction = starfive_gpio_get_direction; 1301 + sfp->gc.direction_input = starfive_gpio_direction_input; 1302 + sfp->gc.direction_output = starfive_gpio_direction_output; 1303 + sfp->gc.get = starfive_gpio_get; 1304 + sfp->gc.set = starfive_gpio_set; 1305 + sfp->gc.set_config = starfive_gpio_set_config; 1306 + sfp->gc.add_pin_ranges = starfive_gpio_add_pin_ranges; 1307 + sfp->gc.base = -1; 1308 + sfp->gc.ngpio = NR_GPIOS; 1309 + 1310 + starfive_irq_chip.parent_device = dev; 1311 + starfive_irq_chip.name = sfp->gc.label; 1312 + 1313 + sfp->gc.irq.chip = &starfive_irq_chip; 1314 + sfp->gc.irq.parent_handler = starfive_gpio_irq_handler; 1315 + sfp->gc.irq.num_parents = 1; 1316 + sfp->gc.irq.parents = devm_kcalloc(dev, sfp->gc.irq.num_parents, 1317 + sizeof(*sfp->gc.irq.parents), GFP_KERNEL); 1318 + if (!sfp->gc.irq.parents) 1319 + return -ENOMEM; 1320 + sfp->gc.irq.default_type = IRQ_TYPE_NONE; 1321 + sfp->gc.irq.handler = handle_bad_irq; 1322 + sfp->gc.irq.init_hw = starfive_gpio_init_hw; 1323 + 1324 + ret = platform_get_irq(pdev, 0); 1325 + if (ret < 0) 1326 + return ret; 1327 + sfp->gc.irq.parents[0] = ret; 1328 + 1329 + ret = devm_gpiochip_add_data(dev, &sfp->gc, sfp); 1330 + if (ret) 1331 + return dev_err_probe(dev, ret, "could not register gpiochip\n"); 1332 + 1333 + out_pinctrl_enable: 1334 + return pinctrl_enable(sfp->pctl); 1335 + } 1336 + 1337 + static const struct of_device_id starfive_of_match[] = { 1338 + { .compatible = "starfive,jh7100-pinctrl" }, 1339 + { /* sentinel */ } 1340 + }; 1341 + MODULE_DEVICE_TABLE(of, starfive_of_match); 1342 + 1343 + static struct platform_driver starfive_pinctrl_driver = { 1344 + .probe = starfive_probe, 1345 + .driver = { 1346 + .name = DRIVER_NAME, 1347 + .of_match_table = starfive_of_match, 1348 + }, 1349 + }; 1350 + module_platform_driver(starfive_pinctrl_driver); 1351 + 1352 + MODULE_DESCRIPTION("Pinctrl driver for StarFive SoCs"); 1353 + MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>"); 1354 + MODULE_LICENSE("GPL v2");
+7
drivers/reset/Kconfig
··· 224 224 This enables the reset driver for the SoCFPGA ARMv7 platforms. This 225 225 driver gets initialized early during platform init calls. 226 226 227 + config RESET_STARFIVE_JH7100 228 + bool "StarFive JH7100 Reset Driver" 229 + depends on SOC_STARFIVE || COMPILE_TEST 230 + default SOC_STARFIVE 231 + help 232 + This enables the reset controller driver for the StarFive JH7100 SoC. 233 + 227 234 config RESET_SUNXI 228 235 bool "Allwinner SoCs Reset Driver" if COMPILE_TEST && !ARCH_SUNXI 229 236 default ARCH_SUNXI
+1
drivers/reset/Makefile
··· 29 29 obj-$(CONFIG_RESET_SCMI) += reset-scmi.o 30 30 obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o 31 31 obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o 32 + obj-$(CONFIG_RESET_STARFIVE_JH7100) += reset-starfive-jh7100.o 32 33 obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o 33 34 obj-$(CONFIG_RESET_TI_SCI) += reset-ti-sci.o 34 35 obj-$(CONFIG_RESET_TI_SYSCON) += reset-ti-syscon.o
+173
drivers/reset/reset-starfive-jh7100.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Reset driver for the StarFive JH7100 SoC 4 + * 5 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 6 + */ 7 + 8 + #include <linux/bitmap.h> 9 + #include <linux/io.h> 10 + #include <linux/io-64-nonatomic-lo-hi.h> 11 + #include <linux/iopoll.h> 12 + #include <linux/mod_devicetable.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/reset-controller.h> 15 + #include <linux/spinlock.h> 16 + 17 + #include <dt-bindings/reset/starfive-jh7100.h> 18 + 19 + /* register offsets */ 20 + #define JH7100_RESET_ASSERT0 0x00 21 + #define JH7100_RESET_ASSERT1 0x04 22 + #define JH7100_RESET_ASSERT2 0x08 23 + #define JH7100_RESET_ASSERT3 0x0c 24 + #define JH7100_RESET_STATUS0 0x10 25 + #define JH7100_RESET_STATUS1 0x14 26 + #define JH7100_RESET_STATUS2 0x18 27 + #define JH7100_RESET_STATUS3 0x1c 28 + 29 + /* 30 + * Writing a 1 to the n'th bit of the m'th ASSERT register asserts 31 + * line 32m + n, and writing a 0 deasserts the same line. 32 + * Most reset lines have their status inverted so a 0 bit in the STATUS 33 + * register means the line is asserted and a 1 means it's deasserted. A few 34 + * lines don't though, so store the expected value of the status registers when 35 + * all lines are asserted. 36 + */ 37 + static const u64 jh7100_reset_asserted[2] = { 38 + /* STATUS0 */ 39 + BIT_ULL_MASK(JH7100_RST_U74) | 40 + BIT_ULL_MASK(JH7100_RST_VP6_DRESET) | 41 + BIT_ULL_MASK(JH7100_RST_VP6_BRESET) | 42 + /* STATUS1 */ 43 + BIT_ULL_MASK(JH7100_RST_HIFI4_DRESET) | 44 + BIT_ULL_MASK(JH7100_RST_HIFI4_BRESET), 45 + /* STATUS2 */ 46 + BIT_ULL_MASK(JH7100_RST_E24) | 47 + /* STATUS3 */ 48 + 0, 49 + }; 50 + 51 + struct jh7100_reset { 52 + struct reset_controller_dev rcdev; 53 + /* protect registers against concurrent read-modify-write */ 54 + spinlock_t lock; 55 + void __iomem *base; 56 + }; 57 + 58 + static inline struct jh7100_reset * 59 + jh7100_reset_from(struct reset_controller_dev *rcdev) 60 + { 61 + return container_of(rcdev, struct jh7100_reset, rcdev); 62 + } 63 + 64 + static int jh7100_reset_update(struct reset_controller_dev *rcdev, 65 + unsigned long id, bool assert) 66 + { 67 + struct jh7100_reset *data = jh7100_reset_from(rcdev); 68 + unsigned long offset = BIT_ULL_WORD(id); 69 + u64 mask = BIT_ULL_MASK(id); 70 + void __iomem *reg_assert = data->base + JH7100_RESET_ASSERT0 + offset * sizeof(u64); 71 + void __iomem *reg_status = data->base + JH7100_RESET_STATUS0 + offset * sizeof(u64); 72 + u64 done = jh7100_reset_asserted[offset] & mask; 73 + u64 value; 74 + unsigned long flags; 75 + int ret; 76 + 77 + if (!assert) 78 + done ^= mask; 79 + 80 + spin_lock_irqsave(&data->lock, flags); 81 + 82 + value = readq(reg_assert); 83 + if (assert) 84 + value |= mask; 85 + else 86 + value &= ~mask; 87 + writeq(value, reg_assert); 88 + 89 + /* if the associated clock is gated, deasserting might otherwise hang forever */ 90 + ret = readq_poll_timeout_atomic(reg_status, value, (value & mask) == done, 0, 1000); 91 + 92 + spin_unlock_irqrestore(&data->lock, flags); 93 + return ret; 94 + } 95 + 96 + static int jh7100_reset_assert(struct reset_controller_dev *rcdev, 97 + unsigned long id) 98 + { 99 + return jh7100_reset_update(rcdev, id, true); 100 + } 101 + 102 + static int jh7100_reset_deassert(struct reset_controller_dev *rcdev, 103 + unsigned long id) 104 + { 105 + return jh7100_reset_update(rcdev, id, false); 106 + } 107 + 108 + static int jh7100_reset_reset(struct reset_controller_dev *rcdev, 109 + unsigned long id) 110 + { 111 + int ret; 112 + 113 + ret = jh7100_reset_assert(rcdev, id); 114 + if (ret) 115 + return ret; 116 + 117 + return jh7100_reset_deassert(rcdev, id); 118 + } 119 + 120 + static int jh7100_reset_status(struct reset_controller_dev *rcdev, 121 + unsigned long id) 122 + { 123 + struct jh7100_reset *data = jh7100_reset_from(rcdev); 124 + unsigned long offset = BIT_ULL_WORD(id); 125 + u64 mask = BIT_ULL_MASK(id); 126 + void __iomem *reg_status = data->base + JH7100_RESET_STATUS0 + offset * sizeof(u64); 127 + u64 value = readq(reg_status); 128 + 129 + return !((value ^ jh7100_reset_asserted[offset]) & mask); 130 + } 131 + 132 + static const struct reset_control_ops jh7100_reset_ops = { 133 + .assert = jh7100_reset_assert, 134 + .deassert = jh7100_reset_deassert, 135 + .reset = jh7100_reset_reset, 136 + .status = jh7100_reset_status, 137 + }; 138 + 139 + static int __init jh7100_reset_probe(struct platform_device *pdev) 140 + { 141 + struct jh7100_reset *data; 142 + 143 + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 144 + if (!data) 145 + return -ENOMEM; 146 + 147 + data->base = devm_platform_ioremap_resource(pdev, 0); 148 + if (IS_ERR(data->base)) 149 + return PTR_ERR(data->base); 150 + 151 + data->rcdev.ops = &jh7100_reset_ops; 152 + data->rcdev.owner = THIS_MODULE; 153 + data->rcdev.nr_resets = JH7100_RSTN_END; 154 + data->rcdev.dev = &pdev->dev; 155 + data->rcdev.of_node = pdev->dev.of_node; 156 + spin_lock_init(&data->lock); 157 + 158 + return devm_reset_controller_register(&pdev->dev, &data->rcdev); 159 + } 160 + 161 + static const struct of_device_id jh7100_reset_dt_ids[] = { 162 + { .compatible = "starfive,jh7100-reset" }, 163 + { /* sentinel */ } 164 + }; 165 + 166 + static struct platform_driver jh7100_reset_driver = { 167 + .driver = { 168 + .name = "jh7100-reset", 169 + .of_match_table = jh7100_reset_dt_ids, 170 + .suppress_bind_attrs = true, 171 + }, 172 + }; 173 + builtin_platform_driver_probe(jh7100_reset_driver, jh7100_reset_probe);
+3
drivers/tty/serial/8250/8250_dw.c
··· 414 414 415 415 if (of_device_is_compatible(np, "marvell,armada-38x-uart")) 416 416 p->serial_out = dw8250_serial_out38x; 417 + if (of_device_is_compatible(np, "starfive,jh7100-uart")) 418 + p->set_termios = dw8250_do_set_termios; 417 419 418 420 } else if (acpi_dev_present("APMC0D08", NULL, -1)) { 419 421 p->iotype = UPIO_MEM32; ··· 698 696 { .compatible = "cavium,octeon-3860-uart" }, 699 697 { .compatible = "marvell,armada-38x-uart" }, 700 698 { .compatible = "renesas,rzn1-uart" }, 699 + { .compatible = "starfive,jh7100-uart" }, 701 700 { /* Sentinel */ } 702 701 }; 703 702 MODULE_DEVICE_TABLE(of, dw8250_of_match);
+202
include/dt-bindings/clock/starfive-jh7100.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + /* 3 + * Copyright (C) 2021 Ahmad Fatoum, Pengutronix 4 + */ 5 + 6 + #ifndef __DT_BINDINGS_CLOCK_STARFIVE_JH7100_H__ 7 + #define __DT_BINDINGS_CLOCK_STARFIVE_JH7100_H__ 8 + 9 + #define JH7100_CLK_CPUNDBUS_ROOT 0 10 + #define JH7100_CLK_DLA_ROOT 1 11 + #define JH7100_CLK_DSP_ROOT 2 12 + #define JH7100_CLK_GMACUSB_ROOT 3 13 + #define JH7100_CLK_PERH0_ROOT 4 14 + #define JH7100_CLK_PERH1_ROOT 5 15 + #define JH7100_CLK_VIN_ROOT 6 16 + #define JH7100_CLK_VOUT_ROOT 7 17 + #define JH7100_CLK_AUDIO_ROOT 8 18 + #define JH7100_CLK_CDECHIFI4_ROOT 9 19 + #define JH7100_CLK_CDEC_ROOT 10 20 + #define JH7100_CLK_VOUTBUS_ROOT 11 21 + #define JH7100_CLK_CPUNBUS_ROOT_DIV 12 22 + #define JH7100_CLK_DSP_ROOT_DIV 13 23 + #define JH7100_CLK_PERH0_SRC 14 24 + #define JH7100_CLK_PERH1_SRC 15 25 + #define JH7100_CLK_PLL0_TESTOUT 16 26 + #define JH7100_CLK_PLL1_TESTOUT 17 27 + #define JH7100_CLK_PLL2_TESTOUT 18 28 + #define JH7100_CLK_PLL2_REF 19 29 + #define JH7100_CLK_CPU_CORE 20 30 + #define JH7100_CLK_CPU_AXI 21 31 + #define JH7100_CLK_AHB_BUS 22 32 + #define JH7100_CLK_APB1_BUS 23 33 + #define JH7100_CLK_APB2_BUS 24 34 + #define JH7100_CLK_DOM3AHB_BUS 25 35 + #define JH7100_CLK_DOM7AHB_BUS 26 36 + #define JH7100_CLK_U74_CORE0 27 37 + #define JH7100_CLK_U74_CORE1 28 38 + #define JH7100_CLK_U74_AXI 29 39 + #define JH7100_CLK_U74RTC_TOGGLE 30 40 + #define JH7100_CLK_SGDMA2P_AXI 31 41 + #define JH7100_CLK_DMA2PNOC_AXI 32 42 + #define JH7100_CLK_SGDMA2P_AHB 33 43 + #define JH7100_CLK_DLA_BUS 34 44 + #define JH7100_CLK_DLA_AXI 35 45 + #define JH7100_CLK_DLANOC_AXI 36 46 + #define JH7100_CLK_DLA_APB 37 47 + #define JH7100_CLK_VP6_CORE 38 48 + #define JH7100_CLK_VP6BUS_SRC 39 49 + #define JH7100_CLK_VP6_AXI 40 50 + #define JH7100_CLK_VCDECBUS_SRC 41 51 + #define JH7100_CLK_VDEC_BUS 42 52 + #define JH7100_CLK_VDEC_AXI 43 53 + #define JH7100_CLK_VDECBRG_MAIN 44 54 + #define JH7100_CLK_VDEC_BCLK 45 55 + #define JH7100_CLK_VDEC_CCLK 46 56 + #define JH7100_CLK_VDEC_APB 47 57 + #define JH7100_CLK_JPEG_AXI 48 58 + #define JH7100_CLK_JPEG_CCLK 49 59 + #define JH7100_CLK_JPEG_APB 50 60 + #define JH7100_CLK_GC300_2X 51 61 + #define JH7100_CLK_GC300_AHB 52 62 + #define JH7100_CLK_JPCGC300_AXIBUS 53 63 + #define JH7100_CLK_GC300_AXI 54 64 + #define JH7100_CLK_JPCGC300_MAIN 55 65 + #define JH7100_CLK_VENC_BUS 56 66 + #define JH7100_CLK_VENC_AXI 57 67 + #define JH7100_CLK_VENCBRG_MAIN 58 68 + #define JH7100_CLK_VENC_BCLK 59 69 + #define JH7100_CLK_VENC_CCLK 60 70 + #define JH7100_CLK_VENC_APB 61 71 + #define JH7100_CLK_DDRPLL_DIV2 62 72 + #define JH7100_CLK_DDRPLL_DIV4 63 73 + #define JH7100_CLK_DDRPLL_DIV8 64 74 + #define JH7100_CLK_DDROSC_DIV2 65 75 + #define JH7100_CLK_DDRC0 66 76 + #define JH7100_CLK_DDRC1 67 77 + #define JH7100_CLK_DDRPHY_APB 68 78 + #define JH7100_CLK_NOC_ROB 69 79 + #define JH7100_CLK_NOC_COG 70 80 + #define JH7100_CLK_NNE_AHB 71 81 + #define JH7100_CLK_NNEBUS_SRC1 72 82 + #define JH7100_CLK_NNE_BUS 73 83 + #define JH7100_CLK_NNE_AXI 74 84 + #define JH7100_CLK_NNENOC_AXI 75 85 + #define JH7100_CLK_DLASLV_AXI 76 86 + #define JH7100_CLK_DSPX2C_AXI 77 87 + #define JH7100_CLK_HIFI4_SRC 78 88 + #define JH7100_CLK_HIFI4_COREFREE 79 89 + #define JH7100_CLK_HIFI4_CORE 80 90 + #define JH7100_CLK_HIFI4_BUS 81 91 + #define JH7100_CLK_HIFI4_AXI 82 92 + #define JH7100_CLK_HIFI4NOC_AXI 83 93 + #define JH7100_CLK_SGDMA1P_BUS 84 94 + #define JH7100_CLK_SGDMA1P_AXI 85 95 + #define JH7100_CLK_DMA1P_AXI 86 96 + #define JH7100_CLK_X2C_AXI 87 97 + #define JH7100_CLK_USB_BUS 88 98 + #define JH7100_CLK_USB_AXI 89 99 + #define JH7100_CLK_USBNOC_AXI 90 100 + #define JH7100_CLK_USBPHY_ROOTDIV 91 101 + #define JH7100_CLK_USBPHY_125M 92 102 + #define JH7100_CLK_USBPHY_PLLDIV25M 93 103 + #define JH7100_CLK_USBPHY_25M 94 104 + #define JH7100_CLK_AUDIO_DIV 95 105 + #define JH7100_CLK_AUDIO_SRC 96 106 + #define JH7100_CLK_AUDIO_12288 97 107 + #define JH7100_CLK_VIN_SRC 98 108 + #define JH7100_CLK_ISP0_BUS 99 109 + #define JH7100_CLK_ISP0_AXI 100 110 + #define JH7100_CLK_ISP0NOC_AXI 101 111 + #define JH7100_CLK_ISPSLV_AXI 102 112 + #define JH7100_CLK_ISP1_BUS 103 113 + #define JH7100_CLK_ISP1_AXI 104 114 + #define JH7100_CLK_ISP1NOC_AXI 105 115 + #define JH7100_CLK_VIN_BUS 106 116 + #define JH7100_CLK_VIN_AXI 107 117 + #define JH7100_CLK_VINNOC_AXI 108 118 + #define JH7100_CLK_VOUT_SRC 109 119 + #define JH7100_CLK_DISPBUS_SRC 110 120 + #define JH7100_CLK_DISP_BUS 111 121 + #define JH7100_CLK_DISP_AXI 112 122 + #define JH7100_CLK_DISPNOC_AXI 113 123 + #define JH7100_CLK_SDIO0_AHB 114 124 + #define JH7100_CLK_SDIO0_CCLKINT 115 125 + #define JH7100_CLK_SDIO0_CCLKINT_INV 116 126 + #define JH7100_CLK_SDIO1_AHB 117 127 + #define JH7100_CLK_SDIO1_CCLKINT 118 128 + #define JH7100_CLK_SDIO1_CCLKINT_INV 119 129 + #define JH7100_CLK_GMAC_AHB 120 130 + #define JH7100_CLK_GMAC_ROOT_DIV 121 131 + #define JH7100_CLK_GMAC_PTP_REF 122 132 + #define JH7100_CLK_GMAC_GTX 123 133 + #define JH7100_CLK_GMAC_RMII_TX 124 134 + #define JH7100_CLK_GMAC_RMII_RX 125 135 + #define JH7100_CLK_GMAC_TX 126 136 + #define JH7100_CLK_GMAC_TX_INV 127 137 + #define JH7100_CLK_GMAC_RX_PRE 128 138 + #define JH7100_CLK_GMAC_RX_INV 129 139 + #define JH7100_CLK_GMAC_RMII 130 140 + #define JH7100_CLK_GMAC_TOPHYREF 131 141 + #define JH7100_CLK_SPI2AHB_AHB 132 142 + #define JH7100_CLK_SPI2AHB_CORE 133 143 + #define JH7100_CLK_EZMASTER_AHB 134 144 + #define JH7100_CLK_E24_AHB 135 145 + #define JH7100_CLK_E24RTC_TOGGLE 136 146 + #define JH7100_CLK_QSPI_AHB 137 147 + #define JH7100_CLK_QSPI_APB 138 148 + #define JH7100_CLK_QSPI_REF 139 149 + #define JH7100_CLK_SEC_AHB 140 150 + #define JH7100_CLK_AES 141 151 + #define JH7100_CLK_SHA 142 152 + #define JH7100_CLK_PKA 143 153 + #define JH7100_CLK_TRNG_APB 144 154 + #define JH7100_CLK_OTP_APB 145 155 + #define JH7100_CLK_UART0_APB 146 156 + #define JH7100_CLK_UART0_CORE 147 157 + #define JH7100_CLK_UART1_APB 148 158 + #define JH7100_CLK_UART1_CORE 149 159 + #define JH7100_CLK_SPI0_APB 150 160 + #define JH7100_CLK_SPI0_CORE 151 161 + #define JH7100_CLK_SPI1_APB 152 162 + #define JH7100_CLK_SPI1_CORE 153 163 + #define JH7100_CLK_I2C0_APB 154 164 + #define JH7100_CLK_I2C0_CORE 155 165 + #define JH7100_CLK_I2C1_APB 156 166 + #define JH7100_CLK_I2C1_CORE 157 167 + #define JH7100_CLK_GPIO_APB 158 168 + #define JH7100_CLK_UART2_APB 159 169 + #define JH7100_CLK_UART2_CORE 160 170 + #define JH7100_CLK_UART3_APB 161 171 + #define JH7100_CLK_UART3_CORE 162 172 + #define JH7100_CLK_SPI2_APB 163 173 + #define JH7100_CLK_SPI2_CORE 164 174 + #define JH7100_CLK_SPI3_APB 165 175 + #define JH7100_CLK_SPI3_CORE 166 176 + #define JH7100_CLK_I2C2_APB 167 177 + #define JH7100_CLK_I2C2_CORE 168 178 + #define JH7100_CLK_I2C3_APB 169 179 + #define JH7100_CLK_I2C3_CORE 170 180 + #define JH7100_CLK_WDTIMER_APB 171 181 + #define JH7100_CLK_WDT_CORE 172 182 + #define JH7100_CLK_TIMER0_CORE 173 183 + #define JH7100_CLK_TIMER1_CORE 174 184 + #define JH7100_CLK_TIMER2_CORE 175 185 + #define JH7100_CLK_TIMER3_CORE 176 186 + #define JH7100_CLK_TIMER4_CORE 177 187 + #define JH7100_CLK_TIMER5_CORE 178 188 + #define JH7100_CLK_TIMER6_CORE 179 189 + #define JH7100_CLK_VP6INTC_APB 180 190 + #define JH7100_CLK_PWM_APB 181 191 + #define JH7100_CLK_MSI_APB 182 192 + #define JH7100_CLK_TEMP_APB 183 193 + #define JH7100_CLK_TEMP_SENSE 184 194 + #define JH7100_CLK_SYSERR_APB 185 195 + 196 + #define JH7100_CLK_PLL0_OUT 186 197 + #define JH7100_CLK_PLL1_OUT 187 198 + #define JH7100_CLK_PLL2_OUT 188 199 + 200 + #define JH7100_CLK_END 189 201 + 202 + #endif /* __DT_BINDINGS_CLOCK_STARFIVE_JH7100_H__ */
+275
include/dt-bindings/pinctrl/pinctrl-starfive.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + /* 3 + * Copyright (C) 2021 Emil Renner Berthing <kernel@esmil.dk> 4 + */ 5 + 6 + #ifndef __DT_BINDINGS_PINCTRL_STARFIVE_H__ 7 + #define __DT_BINDINGS_PINCTRL_STARFIVE_H__ 8 + 9 + #define PAD_GPIO_OFFSET 0 10 + #define PAD_FUNC_SHARE_OFFSET 64 11 + #define PAD_GPIO(x) (PAD_GPIO_OFFSET + (x)) 12 + #define PAD_FUNC_SHARE(x) (PAD_FUNC_SHARE_OFFSET + (x)) 13 + 14 + /* 15 + * GPIOMUX bits: 16 + * | 31 - 24 | 23 - 16 | 15 - 8 | 7 | 6 | 5 - 0 | 17 + * | dout | doen | din | dout rev | doen rev | gpio nr | 18 + * 19 + * dout: output signal 20 + * doen: output enable signal 21 + * din: optional input signal, 0xff = none 22 + * dout rev: output signal reverse bit 23 + * doen rev: output enable signal reverse bit 24 + * gpio nr: gpio number, 0 - 63 25 + */ 26 + #define GPIOMUX(n, dout, doen, din) ( \ 27 + (((dout) & 0x80000000) >> (31 - 7)) | (((dout) & 0xff) << 24) | \ 28 + (((doen) & 0x80000000) >> (31 - 6)) | (((doen) & 0xff) << 16) | \ 29 + (((din) & 0xff) << 8) | \ 30 + ((n) & 0x3f)) 31 + 32 + #define GPO_REVERSE 0x80000000 33 + 34 + #define GPO_LOW 0 35 + #define GPO_HIGH 1 36 + #define GPO_ENABLE 0 37 + #define GPO_DISABLE 1 38 + #define GPO_CLK_GMAC_PAPHYREF 2 39 + #define GPO_JTAG_TDO 3 40 + #define GPO_JTAG_TDO_OEN 4 41 + #define GPO_DMIC_CLK_OUT 5 42 + #define GPO_DSP_JTDOEN_PAD 6 43 + #define GPO_DSP_JTDO_PAD 7 44 + #define GPO_I2C0_PAD_SCK_OE 8 45 + #define GPO_I2C0_PAD_SCK_OEN (GPO_I2C0_PAD_SCK_OE | GPO_REVERSE) 46 + #define GPO_I2C0_PAD_SDA_OE 9 47 + #define GPO_I2C0_PAD_SDA_OEN (GPO_I2C0_PAD_SDA_OE | GPO_REVERSE) 48 + #define GPO_I2C1_PAD_SCK_OE 10 49 + #define GPO_I2C1_PAD_SCK_OEN (GPO_I2C1_PAD_SCK_OE | GPO_REVERSE) 50 + #define GPO_I2C1_PAD_SDA_OE 11 51 + #define GPO_I2C1_PAD_SDA_OEN (GPO_I2C1_PAD_SDA_OE | GPO_REVERSE) 52 + #define GPO_I2C2_PAD_SCK_OE 12 53 + #define GPO_I2C2_PAD_SCK_OEN (GPO_I2C2_PAD_SCK_OE | GPO_REVERSE) 54 + #define GPO_I2C2_PAD_SDA_OE 13 55 + #define GPO_I2C2_PAD_SDA_OEN (GPO_I2C2_PAD_SDA_OE | GPO_REVERSE) 56 + #define GPO_I2C3_PAD_SCK_OE 14 57 + #define GPO_I2C3_PAD_SCK_OEN (GPO_I2C3_PAD_SCK_OE | GPO_REVERSE) 58 + #define GPO_I2C3_PAD_SDA_OE 15 59 + #define GPO_I2C3_PAD_SDA_OEN (GPO_I2C3_PAD_SDA_OE | GPO_REVERSE) 60 + #define GPO_I2SRX_BCLK_OUT 16 61 + #define GPO_I2SRX_BCLK_OUT_OEN 17 62 + #define GPO_I2SRX_LRCK_OUT 18 63 + #define GPO_I2SRX_LRCK_OUT_OEN 19 64 + #define GPO_I2SRX_MCLK_OUT 20 65 + #define GPO_I2STX_BCLK_OUT 21 66 + #define GPO_I2STX_BCLK_OUT_OEN 22 67 + #define GPO_I2STX_LRCK_OUT 23 68 + #define GPO_I2STX_LRCK_OUT_OEN 24 69 + #define GPO_I2STX_MCLK_OUT 25 70 + #define GPO_I2STX_SDOUT0 26 71 + #define GPO_I2STX_SDOUT1 27 72 + #define GPO_LCD_PAD_CSM_N 28 73 + #define GPO_PWM_PAD_OE_N_BIT0 29 74 + #define GPO_PWM_PAD_OE_N_BIT1 30 75 + #define GPO_PWM_PAD_OE_N_BIT2 31 76 + #define GPO_PWM_PAD_OE_N_BIT3 32 77 + #define GPO_PWM_PAD_OE_N_BIT4 33 78 + #define GPO_PWM_PAD_OE_N_BIT5 34 79 + #define GPO_PWM_PAD_OE_N_BIT6 35 80 + #define GPO_PWM_PAD_OE_N_BIT7 36 81 + #define GPO_PWM_PAD_OUT_BIT0 37 82 + #define GPO_PWM_PAD_OUT_BIT1 38 83 + #define GPO_PWM_PAD_OUT_BIT2 39 84 + #define GPO_PWM_PAD_OUT_BIT3 40 85 + #define GPO_PWM_PAD_OUT_BIT4 41 86 + #define GPO_PWM_PAD_OUT_BIT5 42 87 + #define GPO_PWM_PAD_OUT_BIT6 43 88 + #define GPO_PWM_PAD_OUT_BIT7 44 89 + #define GPO_PWMDAC_LEFT_OUT 45 90 + #define GPO_PWMDAC_RIGHT_OUT 46 91 + #define GPO_QSPI_CSN1_OUT 47 92 + #define GPO_QSPI_CSN2_OUT 48 93 + #define GPO_QSPI_CSN3_OUT 49 94 + #define GPO_REGISTER23_SCFG_CMSENSOR_RST0 50 95 + #define GPO_REGISTER23_SCFG_CMSENSOR_RST1 51 96 + #define GPO_REGISTER32_SCFG_GMAC_PHY_RSTN 52 97 + #define GPO_SDIO0_PAD_CARD_POWER_EN 53 98 + #define GPO_SDIO0_PAD_CCLK_OUT 54 99 + #define GPO_SDIO0_PAD_CCMD_OE 55 100 + #define GPO_SDIO0_PAD_CCMD_OEN (GPO_SDIO0_PAD_CCMD_OE | GPO_REVERSE) 101 + #define GPO_SDIO0_PAD_CCMD_OUT 56 102 + #define GPO_SDIO0_PAD_CDATA_OE_BIT0 57 103 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT0 (GPO_SDIO0_PAD_CDATA_OE_BIT0 | GPO_REVERSE) 104 + #define GPO_SDIO0_PAD_CDATA_OE_BIT1 58 105 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT1 (GPO_SDIO0_PAD_CDATA_OE_BIT1 | GPO_REVERSE) 106 + #define GPO_SDIO0_PAD_CDATA_OE_BIT2 59 107 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT2 (GPO_SDIO0_PAD_CDATA_OE_BIT2 | GPO_REVERSE) 108 + #define GPO_SDIO0_PAD_CDATA_OE_BIT3 60 109 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT3 (GPO_SDIO0_PAD_CDATA_OE_BIT3 | GPO_REVERSE) 110 + #define GPO_SDIO0_PAD_CDATA_OE_BIT4 61 111 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT4 (GPO_SDIO0_PAD_CDATA_OE_BIT4 | GPO_REVERSE) 112 + #define GPO_SDIO0_PAD_CDATA_OE_BIT5 62 113 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT5 (GPO_SDIO0_PAD_CDATA_OE_BIT5 | GPO_REVERSE) 114 + #define GPO_SDIO0_PAD_CDATA_OE_BIT6 63 115 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT6 (GPO_SDIO0_PAD_CDATA_OE_BIT6 | GPO_REVERSE) 116 + #define GPO_SDIO0_PAD_CDATA_OE_BIT7 64 117 + #define GPO_SDIO0_PAD_CDATA_OEN_BIT7 (GPO_SDIO0_PAD_CDATA_OE_BIT7 | GPO_REVERSE) 118 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT0 65 119 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT1 66 120 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT2 67 121 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT3 68 122 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT4 69 123 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT5 70 124 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT6 71 125 + #define GPO_SDIO0_PAD_CDATA_OUT_BIT7 72 126 + #define GPO_SDIO0_PAD_RST_N 73 127 + #define GPO_SDIO1_PAD_CARD_POWER_EN 74 128 + #define GPO_SDIO1_PAD_CCLK_OUT 75 129 + #define GPO_SDIO1_PAD_CCMD_OE 76 130 + #define GPO_SDIO1_PAD_CCMD_OEN (GPO_SDIO1_PAD_CCMD_OE | GPO_REVERSE) 131 + #define GPO_SDIO1_PAD_CCMD_OUT 77 132 + #define GPO_SDIO1_PAD_CDATA_OE_BIT0 78 133 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT0 (GPO_SDIO1_PAD_CDATA_OE_BIT0 | GPO_REVERSE) 134 + #define GPO_SDIO1_PAD_CDATA_OE_BIT1 79 135 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT1 (GPO_SDIO1_PAD_CDATA_OE_BIT1 | GPO_REVERSE) 136 + #define GPO_SDIO1_PAD_CDATA_OE_BIT2 80 137 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT2 (GPO_SDIO1_PAD_CDATA_OE_BIT2 | GPO_REVERSE) 138 + #define GPO_SDIO1_PAD_CDATA_OE_BIT3 81 139 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT3 (GPO_SDIO1_PAD_CDATA_OE_BIT3 | GPO_REVERSE) 140 + #define GPO_SDIO1_PAD_CDATA_OE_BIT4 82 141 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT4 (GPO_SDIO1_PAD_CDATA_OE_BIT4 | GPO_REVERSE) 142 + #define GPO_SDIO1_PAD_CDATA_OE_BIT5 83 143 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT5 (GPO_SDIO1_PAD_CDATA_OE_BIT5 | GPO_REVERSE) 144 + #define GPO_SDIO1_PAD_CDATA_OE_BIT6 84 145 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT6 (GPO_SDIO1_PAD_CDATA_OE_BIT6 | GPO_REVERSE) 146 + #define GPO_SDIO1_PAD_CDATA_OE_BIT7 85 147 + #define GPO_SDIO1_PAD_CDATA_OEN_BIT7 (GPO_SDIO1_PAD_CDATA_OE_BIT7 | GPO_REVERSE) 148 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT0 86 149 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT1 87 150 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT2 88 151 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT3 89 152 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT4 90 153 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT5 91 154 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT6 92 155 + #define GPO_SDIO1_PAD_CDATA_OUT_BIT7 93 156 + #define GPO_SDIO1_PAD_RST_N 94 157 + #define GPO_SPDIF_TX_SDOUT 95 158 + #define GPO_SPDIF_TX_SDOUT_OEN 96 159 + #define GPO_SPI0_PAD_OE_N 97 160 + #define GPO_SPI0_PAD_SCK_OUT 98 161 + #define GPO_SPI0_PAD_SS_0_N 99 162 + #define GPO_SPI0_PAD_SS_1_N 100 163 + #define GPO_SPI0_PAD_TXD 101 164 + #define GPO_SPI1_PAD_OE_N 102 165 + #define GPO_SPI1_PAD_SCK_OUT 103 166 + #define GPO_SPI1_PAD_SS_0_N 104 167 + #define GPO_SPI1_PAD_SS_1_N 105 168 + #define GPO_SPI1_PAD_TXD 106 169 + #define GPO_SPI2_PAD_OE_N 107 170 + #define GPO_SPI2_PAD_SCK_OUT 108 171 + #define GPO_SPI2_PAD_SS_0_N 109 172 + #define GPO_SPI2_PAD_SS_1_N 110 173 + #define GPO_SPI2_PAD_TXD 111 174 + #define GPO_SPI2AHB_PAD_OE_N_BIT0 112 175 + #define GPO_SPI2AHB_PAD_OE_N_BIT1 113 176 + #define GPO_SPI2AHB_PAD_OE_N_BIT2 114 177 + #define GPO_SPI2AHB_PAD_OE_N_BIT3 115 178 + #define GPO_SPI2AHB_PAD_TXD_BIT0 116 179 + #define GPO_SPI2AHB_PAD_TXD_BIT1 117 180 + #define GPO_SPI2AHB_PAD_TXD_BIT2 118 181 + #define GPO_SPI2AHB_PAD_TXD_BIT3 119 182 + #define GPO_SPI3_PAD_OE_N 120 183 + #define GPO_SPI3_PAD_SCK_OUT 121 184 + #define GPO_SPI3_PAD_SS_0_N 122 185 + #define GPO_SPI3_PAD_SS_1_N 123 186 + #define GPO_SPI3_PAD_TXD 124 187 + #define GPO_UART0_PAD_DTRN 125 188 + #define GPO_UART0_PAD_RTSN 126 189 + #define GPO_UART0_PAD_SOUT 127 190 + #define GPO_UART1_PAD_SOUT 128 191 + #define GPO_UART2_PAD_DTR_N 129 192 + #define GPO_UART2_PAD_RTS_N 130 193 + #define GPO_UART2_PAD_SOUT 131 194 + #define GPO_UART3_PAD_SOUT 132 195 + #define GPO_USB_DRV_BUS 133 196 + 197 + #define GPI_CPU_JTAG_TCK 0 198 + #define GPI_CPU_JTAG_TDI 1 199 + #define GPI_CPU_JTAG_TMS 2 200 + #define GPI_CPU_JTAG_TRST 3 201 + #define GPI_DMIC_SDIN_BIT0 4 202 + #define GPI_DMIC_SDIN_BIT1 5 203 + #define GPI_DSP_JTCK_PAD 6 204 + #define GPI_DSP_JTDI_PAD 7 205 + #define GPI_DSP_JTMS_PAD 8 206 + #define GPI_DSP_TRST_PAD 9 207 + #define GPI_I2C0_PAD_SCK_IN 10 208 + #define GPI_I2C0_PAD_SDA_IN 11 209 + #define GPI_I2C1_PAD_SCK_IN 12 210 + #define GPI_I2C1_PAD_SDA_IN 13 211 + #define GPI_I2C2_PAD_SCK_IN 14 212 + #define GPI_I2C2_PAD_SDA_IN 15 213 + #define GPI_I2C3_PAD_SCK_IN 16 214 + #define GPI_I2C3_PAD_SDA_IN 17 215 + #define GPI_I2SRX_BCLK_IN 18 216 + #define GPI_I2SRX_LRCK_IN 19 217 + #define GPI_I2SRX_SDIN_BIT0 20 218 + #define GPI_I2SRX_SDIN_BIT1 21 219 + #define GPI_I2SRX_SDIN_BIT2 22 220 + #define GPI_I2STX_BCLK_IN 23 221 + #define GPI_I2STX_LRCK_IN 24 222 + #define GPI_SDIO0_PAD_CARD_DETECT_N 25 223 + #define GPI_SDIO0_PAD_CARD_WRITE_PRT 26 224 + #define GPI_SDIO0_PAD_CCMD_IN 27 225 + #define GPI_SDIO0_PAD_CDATA_IN_BIT0 28 226 + #define GPI_SDIO0_PAD_CDATA_IN_BIT1 29 227 + #define GPI_SDIO0_PAD_CDATA_IN_BIT2 30 228 + #define GPI_SDIO0_PAD_CDATA_IN_BIT3 31 229 + #define GPI_SDIO0_PAD_CDATA_IN_BIT4 32 230 + #define GPI_SDIO0_PAD_CDATA_IN_BIT5 33 231 + #define GPI_SDIO0_PAD_CDATA_IN_BIT6 34 232 + #define GPI_SDIO0_PAD_CDATA_IN_BIT7 35 233 + #define GPI_SDIO1_PAD_CARD_DETECT_N 36 234 + #define GPI_SDIO1_PAD_CARD_WRITE_PRT 37 235 + #define GPI_SDIO1_PAD_CCMD_IN 38 236 + #define GPI_SDIO1_PAD_CDATA_IN_BIT0 39 237 + #define GPI_SDIO1_PAD_CDATA_IN_BIT1 40 238 + #define GPI_SDIO1_PAD_CDATA_IN_BIT2 41 239 + #define GPI_SDIO1_PAD_CDATA_IN_BIT3 42 240 + #define GPI_SDIO1_PAD_CDATA_IN_BIT4 43 241 + #define GPI_SDIO1_PAD_CDATA_IN_BIT5 44 242 + #define GPI_SDIO1_PAD_CDATA_IN_BIT6 45 243 + #define GPI_SDIO1_PAD_CDATA_IN_BIT7 46 244 + #define GPI_SPDIF_RX_SDIN 47 245 + #define GPI_SPI0_PAD_RXD 48 246 + #define GPI_SPI0_PAD_SS_IN_N 49 247 + #define GPI_SPI1_PAD_RXD 50 248 + #define GPI_SPI1_PAD_SS_IN_N 51 249 + #define GPI_SPI2_PAD_RXD 52 250 + #define GPI_SPI2_PAD_SS_IN_N 53 251 + #define GPI_SPI2AHB_PAD_RXD_BIT0 54 252 + #define GPI_SPI2AHB_PAD_RXD_BIT1 55 253 + #define GPI_SPI2AHB_PAD_RXD_BIT2 56 254 + #define GPI_SPI2AHB_PAD_RXD_BIT3 57 255 + #define GPI_SPI2AHB_PAD_SS_N 58 256 + #define GPI_SPI2AHB_SLV_SCLKIN 59 257 + #define GPI_SPI3_PAD_RXD 60 258 + #define GPI_SPI3_PAD_SS_IN_N 61 259 + #define GPI_UART0_PAD_CTSN 62 260 + #define GPI_UART0_PAD_DCDN 63 261 + #define GPI_UART0_PAD_DSRN 64 262 + #define GPI_UART0_PAD_RIN 65 263 + #define GPI_UART0_PAD_SIN 66 264 + #define GPI_UART1_PAD_SIN 67 265 + #define GPI_UART2_PAD_CTS_N 68 266 + #define GPI_UART2_PAD_DCD_N 69 267 + #define GPI_UART2_PAD_DSR_N 70 268 + #define GPI_UART2_PAD_RI_N 71 269 + #define GPI_UART2_PAD_SIN 72 270 + #define GPI_UART3_PAD_SIN 73 271 + #define GPI_USB_OVER_CURRENT 74 272 + 273 + #define GPI_NONE 0xff 274 + 275 + #endif /* __DT_BINDINGS_PINCTRL_STARFIVE_H__ */
+126
include/dt-bindings/reset/starfive-jh7100.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + /* 3 + * Copyright (C) 2021 Ahmad Fatoum, Pengutronix 4 + */ 5 + 6 + #ifndef __DT_BINDINGS_RESET_STARFIVE_JH7100_H__ 7 + #define __DT_BINDINGS_RESET_STARFIVE_JH7100_H__ 8 + 9 + #define JH7100_RSTN_DOM3AHB_BUS 0 10 + #define JH7100_RSTN_DOM7AHB_BUS 1 11 + #define JH7100_RST_U74 2 12 + #define JH7100_RSTN_U74_AXI 3 13 + #define JH7100_RSTN_SGDMA2P_AHB 4 14 + #define JH7100_RSTN_SGDMA2P_AXI 5 15 + #define JH7100_RSTN_DMA2PNOC_AXI 6 16 + #define JH7100_RSTN_DLA_AXI 7 17 + #define JH7100_RSTN_DLANOC_AXI 8 18 + #define JH7100_RSTN_DLA_APB 9 19 + #define JH7100_RST_VP6_DRESET 10 20 + #define JH7100_RST_VP6_BRESET 11 21 + #define JH7100_RSTN_VP6_AXI 12 22 + #define JH7100_RSTN_VDECBRG_MAIN 13 23 + #define JH7100_RSTN_VDEC_AXI 14 24 + #define JH7100_RSTN_VDEC_BCLK 15 25 + #define JH7100_RSTN_VDEC_CCLK 16 26 + #define JH7100_RSTN_VDEC_APB 17 27 + #define JH7100_RSTN_JPEG_AXI 18 28 + #define JH7100_RSTN_JPEG_CCLK 19 29 + #define JH7100_RSTN_JPEG_APB 20 30 + #define JH7100_RSTN_JPCGC300_MAIN 21 31 + #define JH7100_RSTN_GC300_2X 22 32 + #define JH7100_RSTN_GC300_AXI 23 33 + #define JH7100_RSTN_GC300_AHB 24 34 + #define JH7100_RSTN_VENC_AXI 25 35 + #define JH7100_RSTN_VENCBRG_MAIN 26 36 + #define JH7100_RSTN_VENC_BCLK 27 37 + #define JH7100_RSTN_VENC_CCLK 28 38 + #define JH7100_RSTN_VENC_APB 29 39 + #define JH7100_RSTN_DDRPHY_APB 30 40 + #define JH7100_RSTN_NOC_ROB 31 41 + #define JH7100_RSTN_NOC_COG 32 42 + #define JH7100_RSTN_HIFI4_AXI 33 43 + #define JH7100_RSTN_HIFI4NOC_AXI 34 44 + #define JH7100_RST_HIFI4_DRESET 35 45 + #define JH7100_RST_HIFI4_BRESET 36 46 + #define JH7100_RSTN_USB_AXI 37 47 + #define JH7100_RSTN_USBNOC_AXI 38 48 + #define JH7100_RSTN_SGDMA1P_AXI 39 49 + #define JH7100_RSTN_DMA1P_AXI 40 50 + #define JH7100_RSTN_X2C_AXI 41 51 + #define JH7100_RSTN_NNE_AHB 42 52 + #define JH7100_RSTN_NNE_AXI 43 53 + #define JH7100_RSTN_NNENOC_AXI 44 54 + #define JH7100_RSTN_DLASLV_AXI 45 55 + #define JH7100_RSTN_DSPX2C_AXI 46 56 + #define JH7100_RSTN_VIN_SRC 47 57 + #define JH7100_RSTN_ISPSLV_AXI 48 58 + #define JH7100_RSTN_VIN_AXI 49 59 + #define JH7100_RSTN_VINNOC_AXI 50 60 + #define JH7100_RSTN_ISP0_AXI 51 61 + #define JH7100_RSTN_ISP0NOC_AXI 52 62 + #define JH7100_RSTN_ISP1_AXI 53 63 + #define JH7100_RSTN_ISP1NOC_AXI 54 64 + #define JH7100_RSTN_VOUT_SRC 55 65 + #define JH7100_RSTN_DISP_AXI 56 66 + #define JH7100_RSTN_DISPNOC_AXI 57 67 + #define JH7100_RSTN_SDIO0_AHB 58 68 + #define JH7100_RSTN_SDIO1_AHB 59 69 + #define JH7100_RSTN_GMAC_AHB 60 70 + #define JH7100_RSTN_SPI2AHB_AHB 61 71 + #define JH7100_RSTN_SPI2AHB_CORE 62 72 + #define JH7100_RSTN_EZMASTER_AHB 63 73 + #define JH7100_RST_E24 64 74 + #define JH7100_RSTN_QSPI_AHB 65 75 + #define JH7100_RSTN_QSPI_CORE 66 76 + #define JH7100_RSTN_QSPI_APB 67 77 + #define JH7100_RSTN_SEC_AHB 68 78 + #define JH7100_RSTN_AES 69 79 + #define JH7100_RSTN_PKA 70 80 + #define JH7100_RSTN_SHA 71 81 + #define JH7100_RSTN_TRNG_APB 72 82 + #define JH7100_RSTN_OTP_APB 73 83 + #define JH7100_RSTN_UART0_APB 74 84 + #define JH7100_RSTN_UART0_CORE 75 85 + #define JH7100_RSTN_UART1_APB 76 86 + #define JH7100_RSTN_UART1_CORE 77 87 + #define JH7100_RSTN_SPI0_APB 78 88 + #define JH7100_RSTN_SPI0_CORE 79 89 + #define JH7100_RSTN_SPI1_APB 80 90 + #define JH7100_RSTN_SPI1_CORE 81 91 + #define JH7100_RSTN_I2C0_APB 82 92 + #define JH7100_RSTN_I2C0_CORE 83 93 + #define JH7100_RSTN_I2C1_APB 84 94 + #define JH7100_RSTN_I2C1_CORE 85 95 + #define JH7100_RSTN_GPIO_APB 86 96 + #define JH7100_RSTN_UART2_APB 87 97 + #define JH7100_RSTN_UART2_CORE 88 98 + #define JH7100_RSTN_UART3_APB 89 99 + #define JH7100_RSTN_UART3_CORE 90 100 + #define JH7100_RSTN_SPI2_APB 91 101 + #define JH7100_RSTN_SPI2_CORE 92 102 + #define JH7100_RSTN_SPI3_APB 93 103 + #define JH7100_RSTN_SPI3_CORE 94 104 + #define JH7100_RSTN_I2C2_APB 95 105 + #define JH7100_RSTN_I2C2_CORE 96 106 + #define JH7100_RSTN_I2C3_APB 97 107 + #define JH7100_RSTN_I2C3_CORE 98 108 + #define JH7100_RSTN_WDTIMER_APB 99 109 + #define JH7100_RSTN_WDT 100 110 + #define JH7100_RSTN_TIMER0 101 111 + #define JH7100_RSTN_TIMER1 102 112 + #define JH7100_RSTN_TIMER2 103 113 + #define JH7100_RSTN_TIMER3 104 114 + #define JH7100_RSTN_TIMER4 105 115 + #define JH7100_RSTN_TIMER5 106 116 + #define JH7100_RSTN_TIMER6 107 117 + #define JH7100_RSTN_VP6INTC_APB 108 118 + #define JH7100_RSTN_PWM_APB 109 119 + #define JH7100_RSTN_MSI_APB 110 120 + #define JH7100_RSTN_TEMP_APB 111 121 + #define JH7100_RSTN_TEMP_SENSE 112 122 + #define JH7100_RSTN_SYSERR_APB 113 123 + 124 + #define JH7100_RSTN_END 114 125 + 126 + #endif /* __DT_BINDINGS_RESET_STARFIVE_JH7100_H__ */