mediatek: add mt7986 soc support to the target
It will be supported by the new filogic subtarget Signed-off-by: Sam Shih <sam.shih@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
		| @@ -0,0 +1,51 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */ | ||||
|  | ||||
| /dts-v1/; | ||||
| /plugin/; | ||||
|  | ||||
| / { | ||||
|         compatible = "mediatek,mt7986a-spim-snand-rfb"; | ||||
|  | ||||
|         fragment@0 { | ||||
| 		target-path = "/soc/spi@1100a000"; | ||||
|                 __overlay__ { | ||||
| 			status = "okay"; | ||||
| 			spi_nand: spi_nand@0 { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <1>; | ||||
| 				compatible = "spi-nand"; | ||||
| 				reg = <1>; | ||||
| 				spi-max-frequency = <10000000>; | ||||
| 				spi-tx-buswidth = <4>; | ||||
| 				spi-rx-buswidth = <4>; | ||||
|  | ||||
| 				partitions { | ||||
| 					compatible = "fixed-partitions"; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
| 					partition@0 { | ||||
| 						label = "BL2"; | ||||
| 						reg = <0x00000 0x0100000>; | ||||
| 						read-only; | ||||
| 					}; | ||||
| 					partition@100000 { | ||||
| 						label = "u-boot-env"; | ||||
| 						reg = <0x0100000 0x0080000>; | ||||
| 					}; | ||||
| 					factory: partition@180000 { | ||||
| 						label = "Factory"; | ||||
| 						reg = <0x180000 0x0200000>; | ||||
| 					}; | ||||
| 					partition@380000 { | ||||
| 						label = "FIP"; | ||||
| 						reg = <0x380000 0x0200000>; | ||||
| 					}; | ||||
| 					partition@580000 { | ||||
| 						label = "ubi"; | ||||
| 						reg = <0x580000 0x4000000>; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|         }; | ||||
| }; | ||||
| @@ -0,0 +1,50 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */ | ||||
|  | ||||
| /dts-v1/; | ||||
| /plugin/; | ||||
|  | ||||
| / { | ||||
|         compatible = "mediatek,mt7986a-snor-rfb"; | ||||
|  | ||||
|         fragment@0 { | ||||
| 		target-path = "/soc/spi@1100a000"; | ||||
| 		__overlay__ { | ||||
| 			status = "okay"; | ||||
| 			spi_nor: spi_nor@0 { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <1>; | ||||
| 				compatible = "jedec,spi-nor"; | ||||
| 				reg = <0>; | ||||
| 				spi-max-frequency = <52000000>; | ||||
| 				spi-tx-buswidth = <4>; | ||||
| 				spi-rx-buswidth = <4>; | ||||
| 				partitions { | ||||
| 					compatible = "fixed-partitions"; | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <1>; | ||||
|  | ||||
| 					partition@00000 { | ||||
| 						label = "BL2"; | ||||
| 						reg = <0x00000 0x0040000>; | ||||
| 					}; | ||||
| 					partition@40000 { | ||||
| 						label = "u-boot-env"; | ||||
| 						reg = <0x40000 0x0010000>; | ||||
| 					}; | ||||
| 					factory: partition@50000 { | ||||
| 						label = "Factory"; | ||||
| 						reg = <0x50000 0x00B0000>; | ||||
| 					}; | ||||
| 					partition@100000 { | ||||
| 						label = "FIP"; | ||||
| 						reg = <0x100000 0x0080000>; | ||||
| 					}; | ||||
| 					partition@180000 { | ||||
| 						label = "firmware"; | ||||
| 						reg = <0x180000 0xE00000>; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|         }; | ||||
| }; | ||||
| @@ -0,0 +1,378 @@ | ||||
| // SPDX-License-Identifier: (GPL-2.0 OR MIT) | ||||
| /* | ||||
|  * Copyright (C) 2021 MediaTek Inc. | ||||
|  * Author: Sam.Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| /dts-v1/; | ||||
| #include "mt7986a.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "MediaTek MT7986a RFB"; | ||||
| 	compatible = "mediatek,mt7986a-rfb"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart0; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		stdout-path = "serial0:115200n8"; | ||||
| 	}; | ||||
|  | ||||
| 	memory { | ||||
| 		reg = <0 0x40000000 0 0x40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	reg_1p8v: regulator-1p8v { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "fixed-1.8V"; | ||||
| 		regulator-min-microvolt = <1800000>; | ||||
| 		regulator-max-microvolt = <1800000>; | ||||
| 		regulator-boot-on; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
|  | ||||
| 	reg_3p3v: regulator-3p3v { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "fixed-3.3V"; | ||||
| 		regulator-min-microvolt = <3300000>; | ||||
| 		regulator-max-microvolt = <3300000>; | ||||
| 		regulator-boot-on; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
|  | ||||
| 	reg_5v: regulator-5v { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "fixed-5V"; | ||||
| 		regulator-min-microvolt = <5000000>; | ||||
| 		regulator-max-microvolt = <5000000>; | ||||
| 		regulator-boot-on; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	gmac0: mac@0 { | ||||
| 		compatible = "mediatek,eth-mac"; | ||||
| 		reg = <0>; | ||||
| 		phy-mode = "2500base-x"; | ||||
|  | ||||
| 		fixed-link { | ||||
| 			speed = <2500>; | ||||
| 			full-duplex; | ||||
| 			pause; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gmac1: mac@1 { | ||||
| 		compatible = "mediatek,eth-mac"; | ||||
| 		reg = <1>; | ||||
| 		phy-mode = "2500base-x"; | ||||
|  | ||||
| 		fixed-link { | ||||
| 			speed = <2500>; | ||||
| 			full-duplex; | ||||
| 			pause; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	mdio: mdio-bus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &wmac { | ||||
| 	status = "okay"; | ||||
| 	pinctrl-names = "default", "dbdc"; | ||||
| 	pinctrl-0 = <&wf_2g_5g_pins>; | ||||
| 	pinctrl-1 = <&wf_dbdc_pins>; | ||||
| }; | ||||
|  | ||||
| &mdio { | ||||
| 	phy5: phy@5 { | ||||
| 		compatible = "ethernet-phy-id67c9.de0a"; | ||||
| 		reg = <5>; | ||||
| 		reset-gpios = <&pio 6 1>; | ||||
| 		reset-deassert-us = <20000>; | ||||
| 		phy-mode = "2500base-x"; | ||||
| 	}; | ||||
|  | ||||
| 	phy6: phy@6 { | ||||
| 		compatible = "ethernet-phy-id67c9.de0a"; | ||||
| 		reg = <6>; | ||||
| 		phy-mode = "2500base-x"; | ||||
| 	}; | ||||
|  | ||||
| 	switch: switch@0 { | ||||
| 		compatible = "mediatek,mt7531"; | ||||
| 		reg = <31>; | ||||
| 		reset-gpios = <&pio 5 0>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &crypto { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &mmc0 { | ||||
| 	pinctrl-names = "default", "state_uhs"; | ||||
| 	pinctrl-0 = <&mmc0_pins_default>; | ||||
| 	pinctrl-1 = <&mmc0_pins_uhs>; | ||||
| 	bus-width = <8>; | ||||
| 	max-frequency = <200000000>; | ||||
| 	cap-mmc-highspeed; | ||||
| 	mmc-hs200-1_8v; | ||||
| 	mmc-hs400-1_8v; | ||||
| 	hs400-ds-delay = <0x14014>; | ||||
| 	vmmc-supply = <®_3p3v>; | ||||
| 	vqmmc-supply = <®_1p8v>; | ||||
| 	non-removable; | ||||
| 	no-sd; | ||||
| 	no-sdio; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pcie { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&pcie_pins>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pcie_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pio { | ||||
| 	mmc0_pins_default: mmc0-pins { | ||||
| 		mux { | ||||
| 			function = "emmc"; | ||||
| 			groups = "emmc_51"; | ||||
| 		}; | ||||
| 		conf-cmd-dat { | ||||
| 			pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2", | ||||
| 			       "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5", | ||||
| 			       "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD"; | ||||
| 			input-enable; | ||||
| 			drive-strength = <4>; | ||||
| 			mediatek,pull-up-adv = <1>;	/* pull-up 10K */ | ||||
| 		}; | ||||
| 		conf-clk { | ||||
| 			pins = "EMMC_CK"; | ||||
| 			drive-strength = <6>; | ||||
| 			mediatek,pull-down-adv = <2>;	/* pull-down 50K */ | ||||
| 		}; | ||||
| 		conf-ds { | ||||
| 			pins = "EMMC_DSL"; | ||||
| 			mediatek,pull-down-adv = <2>;	/* pull-down 50K */ | ||||
| 		}; | ||||
| 		conf-rst { | ||||
| 			pins = "EMMC_RSTB"; | ||||
| 			drive-strength = <4>; | ||||
| 			mediatek,pull-up-adv = <1>;	/* pull-up 10K */ | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	mmc0_pins_uhs: mmc0-uhs-pins { | ||||
| 		mux { | ||||
| 			function = "emmc"; | ||||
| 			groups = "emmc_51"; | ||||
| 		}; | ||||
| 		conf-cmd-dat { | ||||
| 			pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2", | ||||
| 			       "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5", | ||||
| 			       "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD"; | ||||
| 			input-enable; | ||||
| 			drive-strength = <4>; | ||||
| 			mediatek,pull-up-adv = <1>;	/* pull-up 10K */ | ||||
| 		}; | ||||
| 		conf-clk { | ||||
| 			pins = "EMMC_CK"; | ||||
| 			drive-strength = <6>; | ||||
| 			mediatek,pull-down-adv = <2>;	/* pull-down 50K */ | ||||
| 		}; | ||||
| 		conf-ds { | ||||
| 			pins = "EMMC_DSL"; | ||||
| 			mediatek,pull-down-adv = <2>;	/* pull-down 50K */ | ||||
| 		}; | ||||
| 		conf-rst { | ||||
| 			pins = "EMMC_RSTB"; | ||||
| 			drive-strength = <4>; | ||||
| 			mediatek,pull-up-adv = <1>;	/* pull-up 10K */ | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	pcie_pins: pcie-pins { | ||||
| 		mux { | ||||
| 			function = "pcie"; | ||||
| 			groups = "pcie_clk", "pcie_wake", "pcie_pereset"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	spic_pins_g2: spic-pins-29-to-32 { | ||||
| 		mux { | ||||
| 			function = "spi"; | ||||
| 			groups = "spi1_2"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	spi_flash_pins: spi-flash-pins-33-to-38 { | ||||
| 		mux { | ||||
| 			function = "spi"; | ||||
| 			groups = "spi0", "spi0_wp_hold"; | ||||
| 		}; | ||||
| 		conf-pu { | ||||
| 			pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP"; | ||||
| 			drive-strength = <8>; | ||||
| 			mediatek,pull-up-adv = <0>;	/* bias-disable */ | ||||
| 		}; | ||||
| 		conf-pd { | ||||
| 			pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO"; | ||||
| 			drive-strength = <8>; | ||||
| 			mediatek,pull-down-adv = <0>;	/* bias-disable */ | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	uart1_pins: uart1-pins { | ||||
| 		mux { | ||||
| 			function = "uart"; | ||||
| 			groups = "uart1"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	uart2_pins: uart2-pins { | ||||
| 		mux { | ||||
| 			function = "uart"; | ||||
| 			groups = "uart2"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	wf_2g_5g_pins: wf_2g_5g-pins { | ||||
| 		mux { | ||||
| 			function = "wifi"; | ||||
| 			groups = "wf_2g", "wf_5g"; | ||||
| 		}; | ||||
| 		conf { | ||||
| 			pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", | ||||
| 			       "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", | ||||
| 			       "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", | ||||
| 			       "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", | ||||
| 			       "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", | ||||
| 			       "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", | ||||
| 			       "WF1_TOP_CLK", "WF1_TOP_DATA"; | ||||
| 			drive-strength = <4>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	wf_dbdc_pins: wf_dbdc-pins { | ||||
| 		mux { | ||||
| 			function = "wifi"; | ||||
| 			groups = "wf_dbdc"; | ||||
| 		}; | ||||
| 		conf { | ||||
| 			pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", | ||||
| 			       "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", | ||||
| 			       "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", | ||||
| 			       "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", | ||||
| 			       "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", | ||||
| 			       "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", | ||||
| 			       "WF1_TOP_CLK", "WF1_TOP_DATA"; | ||||
| 			drive-strength = <4>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &spi0 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&spi_flash_pins>; | ||||
| 	cs-gpios = <0>, <0>; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <0>; | ||||
| 	status = "disabled"; | ||||
| }; | ||||
|  | ||||
| &spi1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&spic_pins_g2>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	proslic_spi: proslic_spi@0 { | ||||
| 		compatible = "silabs,proslic_spi"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <10000000>; | ||||
| 		spi-cpha = <1>; | ||||
| 		spi-cpol = <1>; | ||||
| 		channel_count = <1>; | ||||
| 		debug_level = <4>;       /* 1 = TRC, 2 = DBG, 4 = ERR */ | ||||
| 		reset_gpio = <&pio 7 0>; | ||||
| 		ig,enable-spi = <1>;     /* 1: Enable, 0: Disable */ | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &switch { | ||||
| 	ports { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		port@0 { | ||||
| 			reg = <0>; | ||||
| 			label = "lan0"; | ||||
| 		}; | ||||
|  | ||||
| 		port@1 { | ||||
| 			reg = <1>; | ||||
| 			label = "lan1"; | ||||
| 		}; | ||||
|  | ||||
| 		port@2 { | ||||
| 			reg = <2>; | ||||
| 			label = "lan2"; | ||||
| 		}; | ||||
|  | ||||
| 		port@3 { | ||||
| 			reg = <3>; | ||||
| 			label = "lan3"; | ||||
| 		}; | ||||
|  | ||||
| 		port@6 { | ||||
| 			reg = <6>; | ||||
| 			label = "cpu"; | ||||
| 			ethernet = <&gmac0>; | ||||
| 			phy-mode = "2500base-x"; | ||||
|  | ||||
| 			fixed-link { | ||||
| 				speed = <2500>; | ||||
| 				full-duplex; | ||||
| 				pause; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ssusb { | ||||
| 	vusb33-supply = <®_3p3v>; | ||||
| 	vbus-supply = <®_5v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart0 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart1 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&uart1_pins>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart2 { | ||||
| 	pinctrl-names = "default"; | ||||
| 	pinctrl-0 = <&uart2_pins>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
| @@ -0,0 +1,465 @@ | ||||
| // SPDX-License-Identifier: (GPL-2.0 OR MIT) | ||||
| /* | ||||
|  * Copyright (C) 2021 MediaTek Inc. | ||||
|  * Author: Sam.Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include <dt-bindings/clock/mt7986-clk.h> | ||||
| #include <dt-bindings/interrupt-controller/irq.h> | ||||
| #include <dt-bindings/interrupt-controller/arm-gic.h> | ||||
| #include <dt-bindings/phy/phy.h> | ||||
| #include <dt-bindings/reset/mt7986-resets.h> | ||||
|  | ||||
| / { | ||||
| 	interrupt-parent = <&gic>; | ||||
| 	#address-cells = <2>; | ||||
| 	#size-cells = <2>; | ||||
|  | ||||
| 	clk40m: oscillator@0 { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		clock-frequency = <40000000>; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-output-names = "clkxtal"; | ||||
| 	}; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		cpu0: cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a53"; | ||||
| 			enable-method = "psci"; | ||||
| 			reg = <0x0>; | ||||
| 			#cooling-cells = <2>; | ||||
| 		}; | ||||
|  | ||||
| 		cpu1: cpu@1 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a53"; | ||||
| 			enable-method = "psci"; | ||||
| 			reg = <0x1>; | ||||
| 			#cooling-cells = <2>; | ||||
| 		}; | ||||
|  | ||||
| 		cpu2: cpu@2 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "arm,cortex-a53"; | ||||
| 			enable-method = "psci"; | ||||
| 			reg = <0x2>; | ||||
| 			#cooling-cells = <2>; | ||||
| 		}; | ||||
|  | ||||
| 		cpu3: cpu@3 { | ||||
| 			device_type = "cpu"; | ||||
| 			enable-method = "psci"; | ||||
| 			compatible = "arm,cortex-a53"; | ||||
| 			reg = <0x3>; | ||||
| 			#cooling-cells = <2>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	psci { | ||||
| 		compatible  = "arm,psci-0.2"; | ||||
| 		method      = "smc"; | ||||
| 	}; | ||||
|  | ||||
| 	reserved-memory { | ||||
| 		#address-cells = <2>; | ||||
| 		#size-cells = <2>; | ||||
| 		ranges; | ||||
|  | ||||
| 		/* 64 KiB reserved for ramoops/pstore */ | ||||
| 		ramoops@42ff0000 { | ||||
| 			compatible = "ramoops"; | ||||
| 			reg = <0 0x42ff0000 0 0x10000>; | ||||
| 			record-size = <0x1000>; | ||||
| 		}; | ||||
|  | ||||
| 		/* 192 KiB reserved for ARM Trusted Firmware (BL31) */ | ||||
| 		secmon_reserved: secmon@43000000 { | ||||
| 			reg = <0 0x43000000 0 0x30000>; | ||||
| 			no-map; | ||||
| 		}; | ||||
|  | ||||
| 		wmcpu_emi: wmcpu-reserved@4fc00000 { | ||||
| 			no-map; | ||||
| 			reg = <0 0x4fc00000 0 0x00100000>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	timer { | ||||
| 		compatible = "arm,armv8-timer"; | ||||
| 		interrupt-parent = <&gic>; | ||||
| 		interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>, | ||||
| 			     <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>, | ||||
| 			     <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, | ||||
| 			     <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>; | ||||
| 	}; | ||||
|  | ||||
| 	soc { | ||||
| 		#address-cells = <2>; | ||||
| 		#size-cells = <2>; | ||||
| 		compatible = "simple-bus"; | ||||
| 		ranges; | ||||
|  | ||||
| 		gic: interrupt-controller@c000000 { | ||||
| 			compatible = "arm,gic-v3"; | ||||
| 			#interrupt-cells = <3>; | ||||
| 			interrupt-parent = <&gic>; | ||||
| 			interrupt-controller; | ||||
| 			reg = <0 0x0c000000 0 0x10000>,  /* GICD */ | ||||
| 			      <0 0x0c080000 0 0x80000>,  /* GICR */ | ||||
| 			      <0 0x0c400000 0 0x2000>,   /* GICC */ | ||||
| 			      <0 0x0c410000 0 0x1000>,   /* GICH */ | ||||
| 			      <0 0x0c420000 0 0x2000>;   /* GICV */ | ||||
| 			interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		infracfg: infracfg@10001000 { | ||||
| 			compatible = "mediatek,mt7986-infracfg", "syscon"; | ||||
| 			reg = <0 0x10001000 0 0x1000>; | ||||
| 			#clock-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		topckgen: topckgen@1001b000 { | ||||
| 			compatible = "mediatek,mt7986-topckgen", "syscon"; | ||||
| 			reg = <0 0x1001B000 0 0x1000>; | ||||
| 			#clock-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		watchdog: watchdog@1001c000 { | ||||
| 			compatible = "mediatek,mt7986-wdt", | ||||
| 				     "mediatek,mt6589-wdt"; | ||||
| 			reg = <0 0x1001c000 0 0x1000>; | ||||
| 			interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			#reset-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		pio: pinctrl@1001f000 { | ||||
| 			compatible = "mediatek,mt7986a-pinctrl"; | ||||
| 			reg = <0 0x1001f000 0 0x1000>, | ||||
| 			      <0 0x11c30000 0 0x1000>, | ||||
| 			      <0 0x11c40000 0 0x1000>, | ||||
| 			      <0 0x11e20000 0 0x1000>, | ||||
| 			      <0 0x11e30000 0 0x1000>, | ||||
| 			      <0 0x11f00000 0 0x1000>, | ||||
| 			      <0 0x11f10000 0 0x1000>, | ||||
| 			      <0 0x1000b000 0 0x1000>; | ||||
| 			reg-names = "gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt", | ||||
| 				    "iocfg_lb", "iocfg_tr", "iocfg_tl", "eint"; | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 			gpio-ranges = <&pio 0 0 100>; | ||||
| 			interrupt-controller; | ||||
| 			interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			interrupt-parent = <&gic>; | ||||
| 			#interrupt-cells = <2>; | ||||
| 		}; | ||||
|  | ||||
| 		apmixedsys: apmixedsys@1001e000 { | ||||
| 			compatible = "mediatek,mt7986-apmixedsys"; | ||||
| 			reg = <0 0x1001E000 0 0x1000>; | ||||
| 			#clock-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		sgmiisys0: syscon@10060000 { | ||||
| 			compatible = "mediatek,mt7986-sgmiisys_0", | ||||
| 				     "syscon"; | ||||
| 			reg = <0 0x10060000 0 0x1000>; | ||||
| 			#clock-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		sgmiisys1: syscon@10070000 { | ||||
| 			compatible = "mediatek,mt7986-sgmiisys_1", | ||||
| 				     "syscon"; | ||||
| 			reg = <0 0x10070000 0 0x1000>; | ||||
| 			#clock-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		trng: trng@1020f000 { | ||||
| 			compatible = "mediatek,mt7986-rng"; | ||||
| 			reg = <0 0x1020f000 0 0x100>; | ||||
| 			clocks = <&infracfg CLK_INFRA_TRNG_CK>; | ||||
| 			clock-names = "rng"; | ||||
| 			status = "okay"; | ||||
| 		}; | ||||
|  | ||||
| 		crypto: crypto@10320000 { | ||||
| 			compatible = "inside-secure,safexcel-eip97"; | ||||
| 			reg = <0 0x10320000 0 0x40000>; | ||||
| 			interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			interrupt-names = "ring0", "ring1", "ring2", "ring3"; | ||||
| 			clocks = <&infracfg CLK_INFRA_EIP97_CK>; | ||||
| 			clock-names = "infra_eip97_ck"; | ||||
| 			assigned-clocks = <&topckgen CLK_TOP_EIP_B_SEL>; | ||||
| 			assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		uart0: serial@11002000 { | ||||
| 			compatible = "mediatek,mt7986-uart", | ||||
| 				     "mediatek,mt6577-uart"; | ||||
| 			reg = <0 0x11002000 0 0x400>; | ||||
| 			interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&infracfg CLK_INFRA_UART0_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_UART0_CK>; | ||||
| 			clock-names = "baud", "bus"; | ||||
| 			assigned-clocks = <&topckgen CLK_TOP_UART_SEL>, | ||||
| 					  <&infracfg CLK_INFRA_UART0_SEL>; | ||||
| 			assigned-clock-parents = <&topckgen CLK_TOP_XTAL>, | ||||
| 						 <&topckgen CLK_TOP_UART_SEL>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		uart1: serial@11003000 { | ||||
| 			compatible = "mediatek,mt7986-uart", | ||||
| 				     "mediatek,mt6577-uart"; | ||||
| 			reg = <0 0x11003000 0 0x400>; | ||||
| 			interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&infracfg CLK_INFRA_UART1_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_UART1_CK>; | ||||
| 			clock-names = "baud", "bus"; | ||||
| 			assigned-clocks = <&infracfg CLK_INFRA_UART1_SEL>; | ||||
| 			assigned-clock-parents = <&topckgen CLK_TOP_F26M_SEL>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		uart2: serial@11004000 { | ||||
| 			compatible = "mediatek,mt7986-uart", | ||||
| 				     "mediatek,mt6577-uart"; | ||||
| 			reg = <0 0x11004000 0 0x400>; | ||||
| 			interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&infracfg CLK_INFRA_UART2_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_UART2_CK>; | ||||
| 			clock-names = "baud", "bus"; | ||||
| 			assigned-clocks = <&infracfg CLK_INFRA_UART2_SEL>; | ||||
| 			assigned-clock-parents = <&topckgen CLK_TOP_F26M_SEL>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		spi0: spi@1100a000 { | ||||
| 			compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm"; | ||||
| 			reg = <0 0x1100a000 0 0x100>; | ||||
| 			interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&topckgen CLK_TOP_MPLL_D2>, | ||||
| 				 <&topckgen CLK_TOP_SPI_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_SPI0_CK>, | ||||
| 				 <&infracfg CLK_INFRA_SPI0_HCK_CK>; | ||||
| 			clock-names = "parent-clk", "sel-clk", "spi-clk", "hclk"; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		spi1: spi@1100b000 { | ||||
| 			compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm"; | ||||
| 			reg = <0 0x1100b000 0 0x100>; | ||||
| 			interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&topckgen CLK_TOP_MPLL_D2>, | ||||
| 				 <&topckgen CLK_TOP_SPIM_MST_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_SPI1_CK>, | ||||
| 				 <&infracfg CLK_INFRA_SPI1_HCK_CK>; | ||||
| 			clock-names = "parent-clk", "sel-clk", "spi-clk", "hclk"; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		ssusb: usb@11200000 { | ||||
| 			compatible = "mediatek,mt7986-xhci", | ||||
| 				     "mediatek,mtk-xhci"; | ||||
| 			reg = <0 0x11200000 0 0x2e00>, | ||||
| 			      <0 0x11203e00 0 0x0100>; | ||||
| 			reg-names = "mac", "ippc"; | ||||
| 			interrupts = <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&infracfg CLK_INFRA_IUSB_SYS_CK>, | ||||
| 				 <&topckgen CLK_TOP_U2U3_XHCI_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_IUSB_CK>, | ||||
| 				 <&infracfg CLK_INFRA_IUSB_133_CK>, | ||||
| 				 <&infracfg CLK_INFRA_IUSB_66M_CK>; | ||||
| 			clock-names = "sys_ck", | ||||
| 				      "xhci_ck", | ||||
| 				      "ref_ck", | ||||
| 				      "mcu_ck", | ||||
| 				      "dma_ck"; | ||||
| 			phys = <&u2port0 PHY_TYPE_USB2>, | ||||
| 			       <&u3port0 PHY_TYPE_USB3>, | ||||
| 			       <&u2port1 PHY_TYPE_USB2>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		mmc0: mmc@11230000 { | ||||
| 			compatible = "mediatek,mt7986-mmc"; | ||||
| 			reg = <0 0x11230000 0 0x1000>, | ||||
| 			      <0 0x11c20000 0 0x1000>; | ||||
| 			interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&infracfg CLK_INFRA_MSDC_CK>, | ||||
| 				 <&infracfg CLK_INFRA_MSDC_HCK_CK>, | ||||
| 				 <&infracfg CLK_INFRA_MSDC_66M_CK>, | ||||
| 				 <&infracfg CLK_INFRA_MSDC_133M_CK>; | ||||
| 			clock-names = "source", "hclk", "axi_cg", "ahb_cg"; | ||||
| 			assigned-clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>, | ||||
| 					  <&topckgen CLK_TOP_EMMC_250M_SEL>; | ||||
| 			assigned-clock-parents = <&apmixedsys CLK_APMIXED_MPLL>, | ||||
| 						 <&topckgen CLK_TOP_NET1PLL_D5_D2>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		pcie: pcie@11280000 { | ||||
| 			compatible = "mediatek,mt7986-pcie", | ||||
| 				     "mediatek,mt8192-pcie"; | ||||
| 			device_type = "pci"; | ||||
| 			#address-cells = <3>; | ||||
| 			#size-cells = <2>; | ||||
| 			reg = <0x00 0x11280000 0x00 0x4000>; | ||||
| 			reg-names = "pcie-mac"; | ||||
| 			interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			bus-range = <0x00 0xff>; | ||||
| 			ranges = <0x82000000 0x00 0x20000000 0x00 | ||||
| 				  0x20000000 0x00 0x10000000>; | ||||
| 			clocks = <&infracfg CLK_INFRA_PCIE_SEL>, | ||||
| 				 <&infracfg CLK_INFRA_IPCIE_CK>, | ||||
| 				 <&infracfg CLK_INFRA_IPCIE_PIPE_CK>, | ||||
| 				 <&infracfg CLK_INFRA_IPCIER_CK>, | ||||
| 				 <&infracfg CLK_INFRA_IPCIEB_CK>; | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			phys = <&pcie_port PHY_TYPE_PCIE>; | ||||
| 			phy-names = "pcie-phy"; | ||||
|  | ||||
| 			#interrupt-cells = <1>; | ||||
| 			interrupt-map-mask = <0 0 0 0x7>; | ||||
| 			interrupt-map = <0 0 0 1 &pcie_intc 0>, | ||||
| 					<0 0 0 2 &pcie_intc 1>, | ||||
| 					<0 0 0 3 &pcie_intc 2>, | ||||
| 					<0 0 0 4 &pcie_intc 3>; | ||||
| 			pcie_intc: interrupt-controller { | ||||
| 				#address-cells = <0>; | ||||
| 				#interrupt-cells = <1>; | ||||
| 				interrupt-controller; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		pcie_phy: t-phy@11c00000 { | ||||
| 			compatible = "mediatek,mt7986-tphy", | ||||
| 				     "mediatek,generic-tphy-v2"; | ||||
| 			#address-cells = <2>; | ||||
| 			#size-cells = <2>; | ||||
| 			ranges; | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			pcie_port: pcie-phy@11c00000 { | ||||
| 				reg = <0 0x11c00000 0 0x20000>; | ||||
| 				clocks = <&clk40m>; | ||||
| 				clock-names = "ref"; | ||||
| 				#phy-cells = <1>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		usb_phy: t-phy@11e10000 { | ||||
| 			compatible = "mediatek,mt7986-tphy", | ||||
| 				     "mediatek,generic-tphy-v2"; | ||||
| 			#address-cells = <2>; | ||||
| 			#size-cells = <2>; | ||||
| 			ranges; | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			u2port0: usb-phy@11e10000 { | ||||
| 				reg = <0 0x11e10000 0 0x700>; | ||||
| 				clocks = <&topckgen CLK_TOP_DA_U2_REFSEL>, | ||||
| 					 <&topckgen CLK_TOP_DA_U2_CK_1P_SEL>; | ||||
| 				clock-names = "ref", "da_ref"; | ||||
| 				#phy-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			u3port0: usb-phy@11e10700 { | ||||
| 				reg = <0 0x11e10700 0 0x900>; | ||||
| 				clocks = <&topckgen CLK_TOP_USB3_PHY_SEL>; | ||||
| 				clock-names = "ref"; | ||||
| 				#phy-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			u2port1: usb-phy@11e11000 { | ||||
| 				reg = <0 0x11e11000 0 0x700>; | ||||
| 				clocks = <&topckgen CLK_TOP_DA_U2_REFSEL>, | ||||
| 					 <&topckgen CLK_TOP_DA_U2_CK_1P_SEL>; | ||||
| 				clock-names = "ref", "da_ref"; | ||||
| 				#phy-cells = <1>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		ethsys: syscon@15000000 { | ||||
| 			 #address-cells = <1>; | ||||
| 			 #size-cells = <1>; | ||||
| 			 compatible = "mediatek,mt7986-ethsys_ck", | ||||
| 				      "syscon"; | ||||
| 			 reg = <0 0x15000000 0 0x1000>; | ||||
| 			 #clock-cells = <1>; | ||||
| 			 #reset-cells = <1>; | ||||
| 		}; | ||||
|  | ||||
| 		eth: ethernet@15100000 { | ||||
| 			compatible = "mediatek,mt7986-eth"; | ||||
| 			reg = <0 0x15100000 0 0x80000>; | ||||
| 			interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <ðsys CLK_ETH_FE_EN>, | ||||
| 				 <ðsys CLK_ETH_GP2_EN>, | ||||
| 				 <ðsys CLK_ETH_GP1_EN>, | ||||
| 				 <ðsys CLK_ETH_WOCPU1_EN>, | ||||
| 				 <ðsys CLK_ETH_WOCPU0_EN>, | ||||
| 				 <&sgmiisys0 CLK_SGMII0_TX250M_EN>, | ||||
| 				 <&sgmiisys0 CLK_SGMII0_RX250M_EN>, | ||||
| 				 <&sgmiisys0 CLK_SGMII0_CDR_REF>, | ||||
| 				 <&sgmiisys0 CLK_SGMII0_CDR_FB>, | ||||
| 				 <&sgmiisys1 CLK_SGMII1_TX250M_EN>, | ||||
| 				 <&sgmiisys1 CLK_SGMII1_RX250M_EN>, | ||||
| 				 <&sgmiisys1 CLK_SGMII1_CDR_REF>, | ||||
| 				 <&sgmiisys1 CLK_SGMII1_CDR_FB>, | ||||
| 				 <&topckgen CLK_TOP_NETSYS_SEL>, | ||||
| 				 <&topckgen CLK_TOP_NETSYS_500M_SEL>; | ||||
| 			clock-names = "fe", "gp2", "gp1", "wocpu1", "wocpu0", | ||||
| 				      "sgmii_tx250m", "sgmii_rx250m", | ||||
| 				      "sgmii_cdr_ref", "sgmii_cdr_fb", | ||||
| 				      "sgmii2_tx250m", "sgmii2_rx250m", | ||||
| 				      "sgmii2_cdr_ref", "sgmii2_cdr_fb", | ||||
| 				      "netsys0", "netsys1"; | ||||
| 			assigned-clocks = <&topckgen CLK_TOP_NETSYS_2X_SEL>, | ||||
| 					  <&topckgen CLK_TOP_SGM_325M_SEL>; | ||||
| 			assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>, | ||||
| 						 <&apmixedsys CLK_APMIXED_SGMPLL>; | ||||
| 			mediatek,ethsys = <ðsys>; | ||||
| 			mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>; | ||||
| 			#reset-cells = <1>; | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		consys: consys@10000000 { | ||||
| 			compatible = "mediatek,mt7986-consys"; | ||||
| 			reg = <0 0x10000000 0 0x8600000>; | ||||
| 			memory-region = <&wmcpu_emi>; | ||||
| 		}; | ||||
|  | ||||
| 		wmac: wmac@18000000 { | ||||
| 			compatible = "mediatek,mt7986-wmac", "mediatek,wbsys"; | ||||
| 			resets = <&watchdog MT7986_TOPRGU_CONSYS_RST>; | ||||
| 			reset-names = "consys"; | ||||
| 			reg = <0 0x18000000 0 0x1000000>, | ||||
| 			      <0 0x10003000 0 0x1000>, | ||||
| 			      <0 0x11d10000 0 0x1000>; | ||||
| 			interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>, | ||||
| 				     <GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			clocks = <&topckgen CLK_TOP_CONN_MCUSYS_SEL>, | ||||
| 				 <&topckgen CLK_TOP_AP2CNN_HOST_SEL>; | ||||
| 			clock-names = "mcu", "ap2conn"; | ||||
| 			memory-region = <&wmcpu_emi>; | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| }; | ||||
| @@ -0,0 +1,195 @@ | ||||
| // SPDX-License-Identifier: (GPL-2.0 OR MIT) | ||||
| /* | ||||
|  * Copyright (C) 2021 MediaTek Inc. | ||||
|  * Author: Sam.Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| /dts-v1/; | ||||
| #include "mt7986b.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "MediaTek MT7986b RFB"; | ||||
| 	compatible = "mediatek,mt7986b-rfb"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart0; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		stdout-path = "serial0:115200n8"; | ||||
| 	}; | ||||
|  | ||||
| 	memory { | ||||
| 		reg = <0 0x40000000 0 0x40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	reg_3p3v: regulator-3p3v { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "fixed-3.3V"; | ||||
| 		regulator-min-microvolt = <3300000>; | ||||
| 		regulator-max-microvolt = <3300000>; | ||||
| 		regulator-boot-on; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
|  | ||||
| 	reg_5v: regulator-5v { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "fixed-5V"; | ||||
| 		regulator-min-microvolt = <5000000>; | ||||
| 		regulator-max-microvolt = <5000000>; | ||||
| 		regulator-boot-on; | ||||
| 		regulator-always-on; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ssusb { | ||||
| 	vusb33-supply = <®_3p3v>; | ||||
| 	vbus-supply = <®_5v>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart0 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &wmac { | ||||
| 	status = "okay"; | ||||
| 	pinctrl-names = "default", "dbdc"; | ||||
| 	pinctrl-0 = <&wf_2g_5g_pins>; | ||||
| 	pinctrl-1 = <&wf_dbdc_pins>; | ||||
| }; | ||||
|  | ||||
| ð { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	gmac0: mac@0 { | ||||
| 		compatible = "mediatek,eth-mac"; | ||||
| 		reg = <0>; | ||||
| 		phy-mode = "2500base-x"; | ||||
|  | ||||
| 		fixed-link { | ||||
| 			speed = <2500>; | ||||
| 			full-duplex; | ||||
| 			pause; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gmac1: mac@1 { | ||||
| 		compatible = "mediatek,eth-mac"; | ||||
| 		reg = <1>; | ||||
| 		phy-mode = "2500base-x"; | ||||
|  | ||||
| 		fixed-link { | ||||
| 			speed = <2500>; | ||||
| 			full-duplex; | ||||
| 			pause; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	mdio: mdio-bus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		phy5: phy@5 { | ||||
| 			compatible = "ethernet-phy-id67c9.de0a"; | ||||
| 			reg = <5>; | ||||
| 			reset-gpios = <&pio 6 1>; | ||||
| 			reset-deassert-us = <20000>; | ||||
| 			phy-mode = "2500base-x"; | ||||
| 		}; | ||||
|  | ||||
| 		phy6: phy@6 { | ||||
| 			compatible = "ethernet-phy-id67c9.de0a"; | ||||
| 			reg = <6>; | ||||
| 			phy-mode = "2500base-x"; | ||||
| 		}; | ||||
|  | ||||
| 		switch@0 { | ||||
| 			compatible = "mediatek,mt7531"; | ||||
| 			reg = <31>; | ||||
| 			reset-gpios = <&pio 5 0>; | ||||
|  | ||||
| 			ports { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <0>; | ||||
|  | ||||
| 				port@0 { | ||||
| 					reg = <0>; | ||||
| 					label = "lan0"; | ||||
| 				}; | ||||
|  | ||||
| 				port@1 { | ||||
| 					reg = <1>; | ||||
| 					label = "lan1"; | ||||
| 				}; | ||||
|  | ||||
| 				port@2 { | ||||
| 					reg = <2>; | ||||
| 					label = "lan2"; | ||||
| 				}; | ||||
|  | ||||
| 				port@3 { | ||||
| 					reg = <3>; | ||||
| 					label = "lan3"; | ||||
| 				}; | ||||
|  | ||||
| 				port@6 { | ||||
| 					reg = <6>; | ||||
| 					label = "cpu"; | ||||
| 					ethernet = <&gmac0>; | ||||
| 					phy-mode = "2500base-x"; | ||||
|  | ||||
| 					fixed-link { | ||||
| 						speed = <2500>; | ||||
| 						full-duplex; | ||||
| 						pause; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &crypto { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pio { | ||||
| 	wf_2g_5g_pins: wf_2g_5g-pins { | ||||
| 		mux { | ||||
| 			function = "wifi"; | ||||
| 			groups = "wf_2g", "wf_5g"; | ||||
| 		}; | ||||
| 		conf { | ||||
| 			pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", | ||||
| 			       "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", | ||||
| 			       "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", | ||||
| 			       "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", | ||||
| 			       "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", | ||||
| 			       "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", | ||||
| 			       "WF1_TOP_CLK", "WF1_TOP_DATA"; | ||||
| 			drive-strength = <4>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	wf_dbdc_pins: wf_dbdc-pins { | ||||
| 		mux { | ||||
| 			function = "wifi"; | ||||
| 			groups = "wf_dbdc"; | ||||
| 		}; | ||||
| 		conf { | ||||
| 			pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", | ||||
| 			       "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", | ||||
| 			       "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", | ||||
| 			       "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", | ||||
| 			       "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", | ||||
| 			       "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", | ||||
| 			       "WF1_TOP_CLK", "WF1_TOP_DATA"; | ||||
| 			drive-strength = <4>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| @@ -0,0 +1,12 @@ | ||||
| // SPDX-License-Identifier: (GPL-2.0 OR MIT) | ||||
| /* | ||||
|  * Copyright (C) 2021 MediaTek Inc. | ||||
|  * Author: Sam.Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include "mt7986a.dtsi" | ||||
|  | ||||
| &pio { | ||||
| 	compatible = "mediatek,mt7986b-pinctrl"; | ||||
| 	gpio-ranges = <&pio 0 0 41>, <&pio 66 66 35>; | ||||
| }; | ||||
| @@ -0,0 +1,100 @@ | ||||
| // SPDX-License-Identifier: GPL-1.0 | ||||
| /* | ||||
|  * Copyright (c) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  * Author: Wenzhen Yu <wenzhen.yu@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include "clk-mtk.h" | ||||
| #include "clk-gate.h" | ||||
| #include "clk-mux.h" | ||||
|  | ||||
| #include <dt-bindings/clock/mt7986-clk.h> | ||||
| #include <linux/clk.h> | ||||
|  | ||||
| #define MT7986_PLL_FMAX (2500UL * MHZ) | ||||
| #define CON0_MT7986_RST_BAR BIT(27) | ||||
|  | ||||
| #define PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits,       \ | ||||
| 		 _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift,         \ | ||||
| 		 _div_table, _parent_name)                                     \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .reg = _reg, .pwr_reg = _pwr_reg,    \ | ||||
| 		.en_mask = _en_mask, .flags = _flags,                          \ | ||||
| 		.rst_bar_mask = CON0_MT7986_RST_BAR, .fmax = MT7986_PLL_FMAX,  \ | ||||
| 		.pcwbits = _pcwbits, .pd_reg = _pd_reg, .pd_shift = _pd_shift, \ | ||||
| 		.tuner_reg = _tuner_reg, .pcw_reg = _pcw_reg,                  \ | ||||
| 		.pcw_shift = _pcw_shift, .div_table = _div_table,              \ | ||||
| 		.parent_name = _parent_name,                                   \ | ||||
| 	} | ||||
|  | ||||
| #define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, _pd_reg,   \ | ||||
| 	    _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift)                       \ | ||||
| 	PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits,       \ | ||||
| 		 _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, NULL,   \ | ||||
| 		 "clkxtal") | ||||
|  | ||||
| static const struct mtk_pll_data plls[] = { | ||||
| 	PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001, 0, 32, | ||||
| 	    0x0200, 4, 0, 0x0204, 0), | ||||
| 	PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001, 0, 32, | ||||
| 	    0x0210, 4, 0, 0x0214, 0), | ||||
| 	PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001, 0, 32, | ||||
| 	    0x0220, 4, 0, 0x0224, 0), | ||||
| 	PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x00000001, 0, 32, | ||||
| 	    0x0230, 4, 0, 0x0234, 0), | ||||
| 	PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x00000001, 0, | ||||
| 	    32, 0x0240, 4, 0, 0x0244, 0), | ||||
| 	PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x00000001, 0, 32, | ||||
| 	    0x0250, 4, 0, 0x0254, 0), | ||||
| 	PLL(CLK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001, 0, 32, 0x0260, | ||||
| 	    4, 0, 0x0264, 0), | ||||
| 	PLL(CLK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001, 0, 32, | ||||
| 	    0x0278, 4, 0, 0x027c, 0), | ||||
| }; | ||||
|  | ||||
| static const struct of_device_id of_match_clk_mt7986_apmixed[] = { | ||||
| 	{ .compatible = "mediatek,mt7986-apmixedsys", }, | ||||
| 	{} | ||||
| }; | ||||
|  | ||||
| static int clk_mt7986_apmixed_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	struct device_node *node = pdev->dev.of_node; | ||||
| 	int r; | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls)); | ||||
| 	if (!clk_data) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| 	mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data); | ||||
|  | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMPLL]); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
| 	if (r) { | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| 		goto free_apmixed_data; | ||||
| 	} | ||||
| 	return r; | ||||
|  | ||||
| free_apmixed_data: | ||||
| 	mtk_free_clk_data(clk_data); | ||||
| 	return r; | ||||
| } | ||||
|  | ||||
| static struct platform_driver clk_mt7986_apmixed_drv = { | ||||
| 	.probe = clk_mt7986_apmixed_probe, | ||||
| 	.driver = { | ||||
| 		.name = "clk-mt7986-apmixed", | ||||
| 		.of_match_table = of_match_clk_mt7986_apmixed, | ||||
| 	}, | ||||
| }; | ||||
| builtin_platform_driver(clk_mt7986_apmixed_drv); | ||||
| @@ -0,0 +1,132 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /* | ||||
|  * Copyright (c) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  * Author: Wenzhen Yu <wenzhen.yu@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/platform_device.h> | ||||
|  | ||||
| #include "clk-mtk.h" | ||||
| #include "clk-gate.h" | ||||
|  | ||||
| #include <dt-bindings/clock/mt7986-clk.h> | ||||
|  | ||||
| static const struct mtk_gate_regs sgmii0_cg_regs = { | ||||
| 	.set_ofs = 0xe4, | ||||
| 	.clr_ofs = 0xe4, | ||||
| 	.sta_ofs = 0xe4, | ||||
| }; | ||||
|  | ||||
| #define GATE_SGMII0(_id, _name, _parent, _shift)                               \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = &sgmii0_cg_regs, .shift = _shift,                      \ | ||||
| 		.ops = &mtk_clk_gate_ops_no_setclr_inv,                        \ | ||||
| 	} | ||||
|  | ||||
| static const struct mtk_gate sgmii0_clks[] __initconst = { | ||||
| 	GATE_SGMII0(CLK_SGMII0_TX250M_EN, "sgmii0_tx250m_en", "top_xtal", 2), | ||||
| 	GATE_SGMII0(CLK_SGMII0_RX250M_EN, "sgmii0_rx250m_en", "top_xtal", 3), | ||||
| 	GATE_SGMII0(CLK_SGMII0_CDR_REF, "sgmii0_cdr_ref", "top_xtal", 4), | ||||
| 	GATE_SGMII0(CLK_SGMII0_CDR_FB, "sgmii0_cdr_fb", "top_xtal", 5), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_gate_regs sgmii1_cg_regs = { | ||||
| 	.set_ofs = 0xe4, | ||||
| 	.clr_ofs = 0xe4, | ||||
| 	.sta_ofs = 0xe4, | ||||
| }; | ||||
|  | ||||
| #define GATE_SGMII1(_id, _name, _parent, _shift)                               \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = &sgmii1_cg_regs, .shift = _shift,                      \ | ||||
| 		.ops = &mtk_clk_gate_ops_no_setclr_inv,                        \ | ||||
| 	} | ||||
|  | ||||
| static const struct mtk_gate sgmii1_clks[] __initconst = { | ||||
| 	GATE_SGMII1(CLK_SGMII1_TX250M_EN, "sgmii1_tx250m_en", "top_xtal", 2), | ||||
| 	GATE_SGMII1(CLK_SGMII1_RX250M_EN, "sgmii1_rx250m_en", "top_xtal", 3), | ||||
| 	GATE_SGMII1(CLK_SGMII1_CDR_REF, "sgmii1_cdr_ref", "top_xtal", 4), | ||||
| 	GATE_SGMII1(CLK_SGMII1_CDR_FB, "sgmii1_cdr_fb", "top_xtal", 5), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_gate_regs eth_cg_regs = { | ||||
| 	.set_ofs = 0x30, | ||||
| 	.clr_ofs = 0x30, | ||||
| 	.sta_ofs = 0x30, | ||||
| }; | ||||
|  | ||||
| #define GATE_ETH(_id, _name, _parent, _shift)                                  \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = ð_cg_regs, .shift = _shift,                         \ | ||||
| 		.ops = &mtk_clk_gate_ops_no_setclr_inv,                        \ | ||||
| 	} | ||||
|  | ||||
| static const struct mtk_gate eth_clks[] __initconst = { | ||||
| 	GATE_ETH(CLK_ETH_FE_EN, "eth_fe_en", "netsys_2x_sel", 6), | ||||
| 	GATE_ETH(CLK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m_sel", 7), | ||||
| 	GATE_ETH(CLK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m_sel", 8), | ||||
| 	GATE_ETH(CLK_ETH_WOCPU1_EN, "eth_wocpu1_en", "netsys_mcu_sel", 14), | ||||
| 	GATE_ETH(CLK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_mcu_sel", 15), | ||||
| }; | ||||
|  | ||||
| static void __init mtk_sgmiisys_0_init(struct device_node *node) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	int r; | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii0_clks)); | ||||
|  | ||||
| 	mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks), | ||||
| 			       clk_data); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
| 	if (r) | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| } | ||||
| CLK_OF_DECLARE(mtk_sgmiisys_0, "mediatek,mt7986-sgmiisys_0", | ||||
| 	       mtk_sgmiisys_0_init); | ||||
|  | ||||
| static void __init mtk_sgmiisys_1_init(struct device_node *node) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	int r; | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii1_clks)); | ||||
|  | ||||
| 	mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks), | ||||
| 			       clk_data); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
|  | ||||
| 	if (r) | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| } | ||||
| CLK_OF_DECLARE(mtk_sgmiisys_1, "mediatek,mt7986-sgmiisys_1", | ||||
| 	       mtk_sgmiisys_1_init); | ||||
|  | ||||
| static void __init mtk_ethsys_init(struct device_node *node) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	int r; | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(ARRAY_SIZE(eth_clks)); | ||||
|  | ||||
| 	mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
|  | ||||
| 	if (r) | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| } | ||||
| CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7986-ethsys_ck", mtk_ethsys_init); | ||||
| @@ -0,0 +1,224 @@ | ||||
| // SPDX-License-Identifier: GPL-1.0 | ||||
| /* | ||||
|  * Copyright (c) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  * Author: Wenzhen Yu <wenzhen.yu@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include "clk-mtk.h" | ||||
| #include "clk-gate.h" | ||||
| #include "clk-mux.h" | ||||
|  | ||||
| #include <dt-bindings/clock/mt7986-clk.h> | ||||
| #include <linux/clk.h> | ||||
|  | ||||
| static DEFINE_SPINLOCK(mt7986_clk_lock); | ||||
|  | ||||
| static const struct mtk_fixed_factor infra_divs[] = { | ||||
| 	FACTOR(CLK_INFRA_SYSAXI_D2, "infra_sysaxi_d2", "sysaxi_sel", 1, 2), | ||||
| }; | ||||
|  | ||||
| static const char *const infra_uart_parent[] __initconst = { "csw_f26m_sel", | ||||
| 							     "uart_sel" }; | ||||
|  | ||||
| static const char *const infra_spi_parents[] __initconst = { "i2c_sel", | ||||
| 							     "spi_sel" }; | ||||
|  | ||||
| static const char *const infra_pwm_bsel_parents[] __initconst = { | ||||
| 	"top_rtc_32p7k", "csw_f26m_sel", "infra_sysaxi_d2", "pwm_sel" | ||||
| }; | ||||
|  | ||||
| static const char *const infra_pcie_parents[] __initconst = { | ||||
| 	"top_rtc_32p7k", "csw_f26m_sel", "top_xtal", "pextp_tl_ck_sel" | ||||
| }; | ||||
|  | ||||
| static const struct mtk_mux infra_muxes[] = { | ||||
| 	/* MODULE_CLK_SEL_0 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART0_SEL, "infra_uart0_sel", | ||||
| 			     infra_uart_parent, 0x0018, 0x0010, 0x0014, 0, 1, | ||||
| 			     -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART1_SEL, "infra_uart1_sel", | ||||
| 			     infra_uart_parent, 0x0018, 0x0010, 0x0014, 1, 1, | ||||
| 			     -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART2_SEL, "infra_uart2_sel", | ||||
| 			     infra_uart_parent, 0x0018, 0x0010, 0x0014, 2, 1, | ||||
| 			     -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI0_SEL, "infra_spi0_sel", | ||||
| 			     infra_spi_parents, 0x0018, 0x0010, 0x0014, 4, 1, | ||||
| 			     -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI1_SEL, "infra_spi1_sel", | ||||
| 			     infra_spi_parents, 0x0018, 0x0010, 0x0014, 5, 1, | ||||
| 			     -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM1_SEL, "infra_pwm1_sel", | ||||
| 			     infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 9, | ||||
| 			     2, -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM2_SEL, "infra_pwm2_sel", | ||||
| 			     infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 11, | ||||
| 			     2, -1, -1, -1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_BSEL, "infra_pwm_bsel", | ||||
| 			     infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 13, | ||||
| 			     2, -1, -1, -1), | ||||
| 	/* MODULE_CLK_SEL_1 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_SEL, "infra_pcie_sel", | ||||
| 			     infra_pcie_parents, 0x0028, 0x0020, 0x0024, 0, 2, | ||||
| 			     -1, -1, -1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_gate_regs infra0_cg_regs = { | ||||
| 	.set_ofs = 0x40, | ||||
| 	.clr_ofs = 0x44, | ||||
| 	.sta_ofs = 0x48, | ||||
| }; | ||||
|  | ||||
| static const struct mtk_gate_regs infra1_cg_regs = { | ||||
| 	.set_ofs = 0x50, | ||||
| 	.clr_ofs = 0x54, | ||||
| 	.sta_ofs = 0x58, | ||||
| }; | ||||
|  | ||||
| static const struct mtk_gate_regs infra2_cg_regs = { | ||||
| 	.set_ofs = 0x60, | ||||
| 	.clr_ofs = 0x64, | ||||
| 	.sta_ofs = 0x68, | ||||
| }; | ||||
|  | ||||
| #define GATE_INFRA0(_id, _name, _parent, _shift)                               \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = &infra0_cg_regs, .shift = _shift,                      \ | ||||
| 		.ops = &mtk_clk_gate_ops_setclr,                               \ | ||||
| 	} | ||||
|  | ||||
| #define GATE_INFRA1(_id, _name, _parent, _shift)                               \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = &infra1_cg_regs, .shift = _shift,                      \ | ||||
| 		.ops = &mtk_clk_gate_ops_setclr,                               \ | ||||
| 	} | ||||
|  | ||||
| #define GATE_INFRA2(_id, _name, _parent, _shift)                               \ | ||||
| 	{                                                                      \ | ||||
| 		.id = _id, .name = _name, .parent_name = _parent,              \ | ||||
| 		.regs = &infra2_cg_regs, .shift = _shift,                      \ | ||||
| 		.ops = &mtk_clk_gate_ops_setclr,                               \ | ||||
| 	} | ||||
|  | ||||
| static const struct mtk_gate infra_clks[] = { | ||||
| 	/* INFRA0 */ | ||||
| 	GATE_INFRA0(CLK_INFRA_GPT_STA, "infra_gpt_sta", "infra_sysaxi_d2", 0), | ||||
| 	GATE_INFRA0(CLK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_sysaxi_d2", 1), | ||||
| 	GATE_INFRA0(CLK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bsel", 2), | ||||
| 	GATE_INFRA0(CLK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm1_sel", 3), | ||||
| 	GATE_INFRA0(CLK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm2_sel", 4), | ||||
| 	GATE_INFRA0(CLK_INFRA_CQ_DMA_CK, "infra_cq_dma", "sysaxi_sel", 6), | ||||
| 	GATE_INFRA0(CLK_INFRA_EIP97_CK, "infra_eip97", "eip_b_sel", 7), | ||||
| 	GATE_INFRA0(CLK_INFRA_AUD_BUS_CK, "infra_aud_bus", "sysaxi_sel", 8), | ||||
| 	GATE_INFRA0(CLK_INFRA_AUD_26M_CK, "infra_aud_26m", "csw_f26m_sel", 9), | ||||
| 	GATE_INFRA0(CLK_INFRA_AUD_L_CK, "infra_aud_l", "aud_l_sel", 10), | ||||
| 	GATE_INFRA0(CLK_INFRA_AUD_AUD_CK, "infra_aud_aud", "a1sys_sel", 11), | ||||
| 	GATE_INFRA0(CLK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "a_tuner_sel", 13), | ||||
| 	GATE_INFRA0(CLK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "csw_f26m_sel", | ||||
| 		    14), | ||||
| 	GATE_INFRA0(CLK_INFRA_DBG_CK, "infra_dbg", "infra_sysaxi_d2", 15), | ||||
| 	GATE_INFRA0(CLK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_sysaxi_d2", 16), | ||||
| 	GATE_INFRA0(CLK_INFRA_SEJ_CK, "infra_sej", "infra_sysaxi_d2", 24), | ||||
| 	GATE_INFRA0(CLK_INFRA_SEJ_13M_CK, "infra_sej_13m", "csw_f26m_sel", 25), | ||||
| 	GATE_INFRA0(CLK_INFRA_TRNG_CK, "infra_trng", "sysaxi_sel", 26), | ||||
| 	/* INFRA1 */ | ||||
| 	GATE_INFRA1(CLK_INFRA_THERM_CK, "infra_therm", "csw_f26m_sel", 0), | ||||
| 	GATE_INFRA1(CLK_INFRA_I2C0_CK, "infra_i2c0", "i2c_sel", 1), | ||||
| 	GATE_INFRA1(CLK_INFRA_UART0_CK, "infra_uart0", "infra_uart0_sel", 2), | ||||
| 	GATE_INFRA1(CLK_INFRA_UART1_CK, "infra_uart1", "infra_uart1_sel", 3), | ||||
| 	GATE_INFRA1(CLK_INFRA_UART2_CK, "infra_uart2", "infra_uart2_sel", 4), | ||||
| 	GATE_INFRA1(CLK_INFRA_NFI1_CK, "infra_nfi1", "nfi1x_sel", 8), | ||||
| 	GATE_INFRA1(CLK_INFRA_SPINFI1_CK, "infra_spinfi1", "spinfi_sel", 9), | ||||
| 	GATE_INFRA1(CLK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_sysaxi_d2", | ||||
| 		    10), | ||||
| 	GATE_INFRA1(CLK_INFRA_SPI0_CK, "infra_spi0", "infra_spi0_sel", 11), | ||||
| 	GATE_INFRA1(CLK_INFRA_SPI1_CK, "infra_spi1", "infra_spi1_sel", 12), | ||||
| 	GATE_INFRA1(CLK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_sysaxi_d2", | ||||
| 		    13), | ||||
| 	GATE_INFRA1(CLK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_sysaxi_d2", | ||||
| 		    14), | ||||
| 	GATE_INFRA1(CLK_INFRA_FRTC_CK, "infra_frtc", "top_rtc_32k", 15), | ||||
| 	GATE_INFRA1(CLK_INFRA_MSDC_CK, "infra_msdc", "emmc_416m_sel", 16), | ||||
| 	GATE_INFRA1(CLK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "emmc_250m_sel", | ||||
| 		    17), | ||||
| 	GATE_INFRA1(CLK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "sysaxi_sel", | ||||
| 		    18), | ||||
| 	GATE_INFRA1(CLK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "infra_sysaxi_d2", | ||||
| 		    19), | ||||
| 	GATE_INFRA1(CLK_INFRA_ADC_26M_CK, "infra_adc_26m", "csw_f26m_sel", 20), | ||||
| 	GATE_INFRA1(CLK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m_sel", 21), | ||||
| 	GATE_INFRA1(CLK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "nfi1x_sel", 23), | ||||
| 	/* INFRA2 */ | ||||
| 	GATE_INFRA2(CLK_INFRA_IUSB_133_CK, "infra_iusb_133", "sysaxi_sel", 0), | ||||
| 	GATE_INFRA2(CLK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "infra_sysaxi_d2", | ||||
| 		    1), | ||||
| 	GATE_INFRA2(CLK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "u2u3_sys_sel", 2), | ||||
| 	GATE_INFRA2(CLK_INFRA_IUSB_CK, "infra_iusb", "u2u3_sel", 3), | ||||
| 	GATE_INFRA2(CLK_INFRA_IPCIE_CK, "infra_ipcie", "pextp_tl_ck_sel", 12), | ||||
| 	GATE_INFRA2(CLK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "top_xtal", | ||||
| 		    13), | ||||
| 	GATE_INFRA2(CLK_INFRA_IPCIER_CK, "infra_ipcier", "csw_f26m_sel", 14), | ||||
| 	GATE_INFRA2(CLK_INFRA_IPCIEB_CK, "infra_ipcieb", "sysaxi_sel", 15), | ||||
| }; | ||||
|  | ||||
| static int clk_mt7986_infracfg_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	struct device_node *node = pdev->dev.of_node; | ||||
| 	int r; | ||||
| 	void __iomem *base; | ||||
| 	int nr = ARRAY_SIZE(infra_divs) + ARRAY_SIZE(infra_muxes) + | ||||
| 		 ARRAY_SIZE(infra_clks); | ||||
|  | ||||
| 	base = of_iomap(node, 0); | ||||
| 	if (!base) { | ||||
| 		pr_err("%s(): ioremap failed\n", __func__); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(nr); | ||||
|  | ||||
| 	if (!clk_data) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| 	mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data); | ||||
| 	mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node, | ||||
| 			       &mt7986_clk_lock, clk_data); | ||||
| 	mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks), | ||||
| 			       clk_data); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
| 	if (r) { | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| 		goto free_infracfg_data; | ||||
| 	} | ||||
| 	return r; | ||||
|  | ||||
| free_infracfg_data: | ||||
| 	mtk_free_clk_data(clk_data); | ||||
| 	return r; | ||||
|  | ||||
| } | ||||
|  | ||||
| static const struct of_device_id of_match_clk_mt7986_infracfg[] = { | ||||
| 	{ .compatible = "mediatek,mt7986-infracfg", }, | ||||
| 	{} | ||||
| }; | ||||
|  | ||||
| static struct platform_driver clk_mt7986_infracfg_drv = { | ||||
| 	.probe = clk_mt7986_infracfg_probe, | ||||
| 	.driver = { | ||||
| 		.name = "clk-mt7986-infracfg", | ||||
| 		.of_match_table = of_match_clk_mt7986_infracfg, | ||||
| 	}, | ||||
| }; | ||||
| builtin_platform_driver(clk_mt7986_infracfg_drv); | ||||
| @@ -0,0 +1,342 @@ | ||||
| // SPDX-License-Identifier: GPL-1.0 | ||||
| /* | ||||
|  * Copyright (c) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  * Author: Wenzhen Yu <wenzhen.yu@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include "clk-mtk.h" | ||||
| #include "clk-gate.h" | ||||
| #include "clk-mux.h" | ||||
|  | ||||
| #include <dt-bindings/clock/mt7986-clk.h> | ||||
| #include <linux/clk.h> | ||||
|  | ||||
| static DEFINE_SPINLOCK(mt7986_clk_lock); | ||||
|  | ||||
| static const struct mtk_fixed_clk top_fixed_clks[] = { | ||||
| 	FIXED_CLK(CLK_TOP_XTAL, "top_xtal", "clkxtal", 40000000), | ||||
| 	FIXED_CLK(CLK_TOP_JTAG, "top_jtag", "clkxtal", 50000000), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_fixed_factor top_divs[] = { | ||||
| 	/* XTAL */ | ||||
| 	FACTOR(CLK_TOP_XTAL_D2, "top_xtal_d2", "top_xtal", 1, 2), | ||||
| 	FACTOR(CLK_TOP_RTC_32K, "top_rtc_32k", "top_xtal", 1, 1250), | ||||
| 	FACTOR(CLK_TOP_RTC_32P7K, "top_rtc_32p7k", "top_xtal", 1, 1220), | ||||
| 	/* MPLL */ | ||||
| 	FACTOR(CLK_TOP_MPLL_D2, "top_mpll_d2", "mpll", 1, 2), | ||||
| 	FACTOR(CLK_TOP_MPLL_D4, "top_mpll_d4", "mpll", 1, 4), | ||||
| 	FACTOR(CLK_TOP_MPLL_D8, "top_mpll_d8", "mpll", 1, 8), | ||||
| 	FACTOR(CLK_TOP_MPLL_D8_D2, "top_mpll_d8_d2", "mpll", 1, 16), | ||||
| 	FACTOR(CLK_TOP_MPLL_D3_D2, "top_mpll_d3_d2", "mpll", 1, 6), | ||||
| 	/* MMPLL */ | ||||
| 	FACTOR(CLK_TOP_MMPLL_D2, "top_mmpll_d2", "mmpll", 1, 2), | ||||
| 	FACTOR(CLK_TOP_MMPLL_D4, "top_mmpll_d4", "mmpll", 1, 4), | ||||
| 	FACTOR(CLK_TOP_MMPLL_D8, "top_mmpll_d8", "mmpll", 1, 8), | ||||
| 	FACTOR(CLK_TOP_MMPLL_D8_D2, "top_mmpll_d8_d2", "mmpll", 1, 16), | ||||
| 	FACTOR(CLK_TOP_MMPLL_D3_D8, "top_mmpll_d3_d8", "mmpll", 1, 24), | ||||
| 	FACTOR(CLK_TOP_MMPLL_U2PHY, "top_mmpll_u2phy", "mmpll", 1, 30), | ||||
| 	/* APLL2 */ | ||||
| 	FACTOR(CLK_TOP_APLL2_D4, "top_apll2_d4", "apll2", 1, 4), | ||||
| 	/* NET1PLL */ | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D4, "top_net1pll_d4", "net1pll", 1, 4), | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D5, "top_net1pll_d5", "net1pll", 1, 5), | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D5_D2, "top_net1pll_d5_d2", "net1pll", 1, 10), | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D5_D4, "top_net1pll_d5_d4", "net1pll", 1, 20), | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D8_D2, "top_net1pll_d8_d2", "net1pll", 1, 16), | ||||
| 	FACTOR(CLK_TOP_NET1PLL_D8_D4, "top_net1pll_d8_d4", "net1pll", 1, 32), | ||||
| 	/* NET2PLL */ | ||||
| 	FACTOR(CLK_TOP_NET2PLL_D4, "top_net2pll_d4", "net2pll", 1, 4), | ||||
| 	FACTOR(CLK_TOP_NET2PLL_D4_D2, "top_net2pll_d4_d2", "net2pll", 1, 8), | ||||
| 	FACTOR(CLK_TOP_NET2PLL_D3_D2, "top_net2pll_d3_d2", "net2pll", 1, 2), | ||||
| 	/* WEDMCUPLL */ | ||||
| 	FACTOR(CLK_TOP_WEDMCUPLL_D5_D2, "top_wedmcupll_d5_d2", "wedmcupll", 1, | ||||
| 	       10), | ||||
| }; | ||||
|  | ||||
| static const char *const nfi1x_parents[] __initconst = { "top_xtal", | ||||
| 							 "top_mmpll_d8", | ||||
| 							 "top_net1pll_d8_d2", | ||||
| 							 "top_net2pll_d3_d2", | ||||
| 							 "top_mpll_d4", | ||||
| 							 "top_mmpll_d8_d2", | ||||
| 							 "top_wedmcupll_d5_d2", | ||||
| 							 "top_mpll_d8" }; | ||||
|  | ||||
| static const char *const spinfi_parents[] __initconst = { | ||||
| 	"top_xtal_d2",     "top_xtal",	"top_net1pll_d5_d4", | ||||
| 	"top_mpll_d4",     "top_mmpll_d8_d2", "top_wedmcupll_d5_d2", | ||||
| 	"top_mmpll_d3_d8", "top_mpll_d8" | ||||
| }; | ||||
|  | ||||
| static const char *const spi_parents[] __initconst = { | ||||
| 	"top_xtal",	  "top_mpll_d2",	"top_mmpll_d8", | ||||
| 	"top_net1pll_d8_d2", "top_net2pll_d3_d2",  "top_net1pll_d5_d4", | ||||
| 	"top_mpll_d4",       "top_wedmcupll_d5_d2" | ||||
| }; | ||||
|  | ||||
| static const char *const uart_parents[] __initconst = { "top_xtal", | ||||
| 							"top_mpll_d8", | ||||
| 							"top_mpll_d8_d2" }; | ||||
|  | ||||
| static const char *const pwm_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d8_d2", "top_net1pll_d5_d4", "top_mpll_d4" | ||||
| }; | ||||
|  | ||||
| static const char *const i2c_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d5_d4", "top_mpll_d4", "top_net1pll_d8_d4" | ||||
| }; | ||||
|  | ||||
| static const char *const pextp_tl_ck_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d5_d4", "top_net2pll_d4_d2", "top_rtc_32k" | ||||
| }; | ||||
|  | ||||
| static const char *const emmc_250m_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d5_d2" | ||||
| }; | ||||
|  | ||||
| static const char *const emmc_416m_parents[] __initconst = { "top_xtal", | ||||
| 							     "mpll" }; | ||||
|  | ||||
| static const char *const f_26m_adc_parents[] __initconst = { "top_xtal", | ||||
| 							     "top_mpll_d8_d2" }; | ||||
|  | ||||
| static const char *const dramc_md32_parents[] __initconst = { "top_xtal", | ||||
| 							      "top_mpll_d2" }; | ||||
|  | ||||
| static const char *const sysaxi_parents[] __initconst = { "top_xtal", | ||||
| 							  "top_net1pll_d8_d2", | ||||
| 							  "top_net2pll_d4" }; | ||||
|  | ||||
| static const char *const sysapb_parents[] __initconst = { "top_xtal", | ||||
| 							  "top_mpll_d3_d2", | ||||
| 							  "top_net2pll_d4_d2" }; | ||||
|  | ||||
| static const char *const arm_db_main_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net2pll_d3_d2" | ||||
| }; | ||||
|  | ||||
| static const char *const arm_db_jtsel_parents[] __initconst = { "top_jtag", | ||||
| 								"top_xtal" }; | ||||
|  | ||||
| static const char *const netsys_parents[] __initconst = { "top_xtal", | ||||
| 							  "top_mmpll_d4" }; | ||||
|  | ||||
| static const char *const netsys_500m_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d5" | ||||
| }; | ||||
|  | ||||
| static const char *const netsys_mcu_parents[] __initconst = { | ||||
| 	"top_xtal", "wedmcupll", "top_mmpll_d2", "top_net1pll_d4", | ||||
| 	"top_net1pll_d5" | ||||
| }; | ||||
|  | ||||
| static const char *const netsys_2x_parents[] __initconst = { | ||||
| 	"top_xtal", "net2pll", "wedmcupll", "top_mmpll_d2" | ||||
| }; | ||||
|  | ||||
| static const char *const sgm_325m_parents[] __initconst = { "top_xtal", | ||||
| 							    "sgmpll" }; | ||||
|  | ||||
| static const char *const sgm_reg_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d8_d4" | ||||
| }; | ||||
|  | ||||
| static const char *const a1sys_parents[] __initconst = { "top_xtal", | ||||
| 							 "top_apll2_d4" }; | ||||
|  | ||||
| static const char *const conn_mcusys_parents[] __initconst = { "top_xtal", | ||||
| 							       "top_mmpll_d2" }; | ||||
|  | ||||
| static const char *const eip_b_parents[] __initconst = { "top_xtal", | ||||
| 							 "net2pll" }; | ||||
|  | ||||
| static const char *const aud_l_parents[] __initconst = { "top_xtal", "apll2", | ||||
| 							 "top_mpll_d8_d2" }; | ||||
|  | ||||
| static const char *const a_tuner_parents[] __initconst = { "top_xtal", | ||||
| 							   "top_apll2_d4", | ||||
| 							   "top_mpll_d8_d2" }; | ||||
|  | ||||
| static const char *const u2u3_sys_parents[] __initconst = { | ||||
| 	"top_xtal", "top_net1pll_d5_d4" | ||||
| }; | ||||
|  | ||||
| static const char *const da_u2_refsel_parents[] __initconst = { | ||||
| 	"top_xtal", "top_mmpll_u2phy" | ||||
| }; | ||||
|  | ||||
| static const struct mtk_mux top_muxes[] = { | ||||
| 	/* CLK_CFG_0 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents, | ||||
| 			     0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents, | ||||
| 			     0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x000, | ||||
| 			     0x004, 0x008, 16, 3, 23, 0x1C0, 2), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents, | ||||
| 			     0x000, 0x004, 0x008, 24, 3, 31, 0x1C0, 3), | ||||
| 	/* CLK_CFG_1 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x010, | ||||
| 			     0x014, 0x018, 0, 2, 7, 0x1C0, 4), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x010, | ||||
| 			     0x014, 0x018, 8, 2, 15, 0x1C0, 5), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x010, | ||||
| 			     0x014, 0x018, 16, 2, 23, 0x1C0, 6), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel", | ||||
| 			     pextp_tl_ck_parents, 0x010, 0x014, 0x018, 24, 2, | ||||
| 			     31, 0x1C0, 7), | ||||
| 	/* CLK_CFG_2 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_250M_SEL, "emmc_250m_sel", | ||||
| 			     emmc_250m_parents, 0x020, 0x024, 0x028, 0, 1, 7, | ||||
| 			     0x1C0, 8), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_416M_SEL, "emmc_416m_sel", | ||||
| 			     emmc_416m_parents, 0x020, 0x024, 0x028, 8, 1, 15, | ||||
| 			     0x1C0, 9), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_F_26M_ADC_SEL, "f_26m_adc_sel", | ||||
| 			     f_26m_adc_parents, 0x020, 0x024, 0x028, 16, 1, 23, | ||||
| 			     0x1C0, 10), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_SEL, "dramc_sel", f_26m_adc_parents, | ||||
| 			     0x020, 0x024, 0x028, 24, 1, 31, 0x1C0, 11), | ||||
| 	/* CLK_CFG_3 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel", | ||||
| 			     dramc_md32_parents, 0x030, 0x034, 0x038, 0, 1, 7, | ||||
| 			     0x1C0, 12), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAXI_SEL, "sysaxi_sel", sysaxi_parents, | ||||
| 			     0x030, 0x034, 0x038, 8, 2, 15, 0x1C0, 13), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAPB_SEL, "sysapb_sel", sysapb_parents, | ||||
| 			     0x030, 0x034, 0x038, 16, 2, 23, 0x1C0, 14), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel", | ||||
| 			     arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1, | ||||
| 			     31, 0x1C0, 15), | ||||
| 	/* CLK_CFG_4 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_JTSEL, "arm_db_jtsel", | ||||
| 			     arm_db_jtsel_parents, 0x040, 0x044, 0x048, 0, 1, 7, | ||||
| 			     0x1C0, 16), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents, | ||||
| 			     0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_500M_SEL, "netsys_500m_sel", | ||||
| 			     netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, | ||||
| 			     23, 0x1C0, 18), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel", | ||||
| 			     netsys_mcu_parents, 0x040, 0x044, 0x048, 24, 3, 31, | ||||
| 			     0x1C0, 19), | ||||
| 	/* CLK_CFG_5 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_2X_SEL, "netsys_2x_sel", | ||||
| 			     netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7, | ||||
| 			     0x1C0, 20), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel", | ||||
| 			     sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, | ||||
| 			     0x1C0, 21), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", | ||||
| 			     sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23, | ||||
| 			     0x1C0, 22), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents, | ||||
| 			     0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23), | ||||
| 	/* CLK_CFG_6 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_CONN_MCUSYS_SEL, "conn_mcusys_sel", | ||||
| 			     conn_mcusys_parents, 0x060, 0x064, 0x068, 0, 1, 7, | ||||
| 			     0x1C0, 24), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP_B_SEL, "eip_b_sel", eip_b_parents, | ||||
| 			     0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_PCIE_PHY_SEL, "pcie_phy_sel", | ||||
| 			     f_26m_adc_parents, 0x060, 0x064, 0x068, 16, 1, 23, | ||||
| 			     0x1C0, 26), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_USB3_PHY_SEL, "usb3_phy_sel", | ||||
| 			     f_26m_adc_parents, 0x060, 0x064, 0x068, 24, 1, 31, | ||||
| 			     0x1C0, 27), | ||||
| 	/* CLK_CFG_7 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_F26M_SEL, "csw_f26m_sel", | ||||
| 			     f_26m_adc_parents, 0x070, 0x074, 0x078, 0, 1, 7, | ||||
| 			     0x1C0, 28), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents, | ||||
| 			     0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel", | ||||
| 			     a_tuner_parents, 0x070, 0x074, 0x078, 16, 2, 23, | ||||
| 			     0x1C0, 30), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SEL, "u2u3_sel", f_26m_adc_parents, | ||||
| 			     0x070, 0x074, 0x078, 24, 1, 31, 0x1C4, 0), | ||||
| 	/* CLK_CFG_8 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel", | ||||
| 			     u2u3_sys_parents, 0x080, 0x084, 0x088, 0, 1, 7, | ||||
| 			     0x1C4, 1), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel", | ||||
| 			     u2u3_sys_parents, 0x080, 0x084, 0x088, 8, 1, 15, | ||||
| 			     0x1C4, 2), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_REFSEL, "da_u2_refsel", | ||||
| 			     da_u2_refsel_parents, 0x080, 0x084, 0x088, 16, 1, | ||||
| 			     23, 0x1C4, 3), | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_CK_1P_SEL, "da_u2_ck_1p_sel", | ||||
| 			     da_u2_refsel_parents, 0x080, 0x084, 0x088, 24, 1, | ||||
| 			     31, 0x1C4, 4), | ||||
| 	/* CLK_CFG_9 */ | ||||
| 	MUX_GATE_CLR_SET_UPD(CLK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel", | ||||
| 			     sgm_reg_parents, 0x090, 0x094, 0x098, 0, 1, 7, | ||||
| 			     0x1C4, 5), | ||||
| }; | ||||
|  | ||||
| static int clk_mt7986_topckgen_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct clk_onecell_data *clk_data; | ||||
| 	struct device_node *node = pdev->dev.of_node; | ||||
| 	int r; | ||||
| 	void __iomem *base; | ||||
| 	int nr = ARRAY_SIZE(top_fixed_clks) + ARRAY_SIZE(top_divs) + | ||||
| 		 ARRAY_SIZE(top_muxes); | ||||
|  | ||||
| 	base = of_iomap(node, 0); | ||||
| 	if (!base) { | ||||
| 		pr_err("%s(): ioremap failed\n", __func__); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	clk_data = mtk_alloc_clk_data(nr); | ||||
| 	if (!clk_data) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| 	mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), | ||||
| 				    clk_data); | ||||
| 	mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data); | ||||
| 	mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node, | ||||
| 			       &mt7986_clk_lock, clk_data); | ||||
|  | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAXI_SEL]); | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAPB_SEL]); | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_SEL]); | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_MD32_SEL]); | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_F26M_SEL]); | ||||
| 	clk_prepare_enable(clk_data->clks[CLK_TOP_SGM_REG_SEL]); | ||||
|  | ||||
| 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | ||||
|  | ||||
| 	if (r) { | ||||
| 		pr_err("%s(): could not register clock provider: %d\n", | ||||
| 		       __func__, r); | ||||
| 		goto free_topckgen_data; | ||||
| 	} | ||||
| 	return r; | ||||
|  | ||||
| free_topckgen_data: | ||||
| 	mtk_free_clk_data(clk_data); | ||||
| 	return r; | ||||
| } | ||||
|  | ||||
| static const struct of_device_id of_match_clk_mt7986_topckgen[] = { | ||||
| 	{ .compatible = "mediatek,mt7986-topckgen", }, | ||||
| 	{} | ||||
| }; | ||||
|  | ||||
| static struct platform_driver clk_mt7986_topckgen_drv = { | ||||
| 	.probe = clk_mt7986_topckgen_probe, | ||||
| 	.driver = { | ||||
| 		.name = "clk-mt7986-topckgen", | ||||
| 		.of_match_table = of_match_clk_mt7986_topckgen, | ||||
| 	}, | ||||
| }; | ||||
| builtin_platform_driver(clk_mt7986_topckgen_drv); | ||||
| @@ -0,0 +1,933 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /* | ||||
|  * The MT7986 driver based on Linux generic pinctrl binding. | ||||
|  * | ||||
|  * Copyright (C) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #include "pinctrl-moore.h" | ||||
|  | ||||
| #define MT7986_PIN(_number, _name) MTK_PIN(_number, _name, 0, _number, DRV_GRP4) | ||||
| #define MT7986_NOT_BALLOUT_PIN(_number) { .number = _number, .name = NULL } | ||||
|  | ||||
| #define PIN_FIELD_BASE(_s_pin, _e_pin, _i_base, _s_addr, _x_addrs, _s_bit,	\ | ||||
| 			_x_bits)	\ | ||||
| 		PIN_FIELD_CALC(_s_pin, _e_pin, _i_base, _s_addr, _x_addrs, _s_bit,	\ | ||||
| 			_x_bits, 32, 0) | ||||
|  | ||||
| /** | ||||
|  * enum - Locking variants of the iocfg bases | ||||
|  * | ||||
|  * MT7986 have multiple bases to program pin configuration listed as the below: | ||||
|  * iocfg_rt:0x11c30000, iocfg_rb:0x11c40000, iocfg_lt:0x11e20000, | ||||
|  * iocfg_lb:0x11e30000, iocfg_tr:0x11f00000, iocfg_tl:0x11f10000, | ||||
|  * _i_based could be used to indicate what base the pin should be mapped into. | ||||
|  * | ||||
|  * Each iocfg register base control different group of pads on the SoC | ||||
|  * | ||||
|  * | ||||
|  *  chip carrier | ||||
|  * | ||||
|  *      A  B  C  D  E  F  G  H | ||||
|  *    +------------------------+ | ||||
|  *  8 | o  o  o  o  o  o  o  o | | ||||
|  *  7 | o  o  o  o  o  o  o  o | | ||||
|  *  6 | o  o  o  o  o  o  o  o | | ||||
|  *  5 | o  o  o  o  o  o  o  o | | ||||
|  *  4 | o  o  o  o  o  o  o  o | | ||||
|  *  3 | o  o  o  o  o  o  o  o | | ||||
|  *  2 | o  o  o  o  o  o  o  o | | ||||
|  *  1 | o  o  o  o  o  o  o  o | | ||||
|  *    +------------------------+ | ||||
|  * | ||||
|  *  inside Chip carrier | ||||
|  * | ||||
|  *      A  B  C  D  E  F  G  H | ||||
|  *    +------------------------+ | ||||
|  *  8 |                        | | ||||
|  *  7 |        TL  TR          | | ||||
|  *  6 |      +---------+       | | ||||
|  *  5 |   LT |         | RT    | | ||||
|  *  4 |      |         |       | | ||||
|  *  3 |   LB |         | RB    | | ||||
|  *  2 |      +---------+       | | ||||
|  *  1 |                        | | ||||
|  *    +------------------------+ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| enum { | ||||
| 	GPIO_BASE, | ||||
| 	IOCFG_RT_BASE, | ||||
| 	IOCFG_RB_BASE, | ||||
| 	IOCFG_LT_BASE, | ||||
| 	IOCFG_LB_BASE, | ||||
| 	IOCFG_TR_BASE, | ||||
| 	IOCFG_TL_BASE, | ||||
| }; | ||||
|  | ||||
| static const char *const mt7986_pinctrl_register_base_names[] = { | ||||
| 	"gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt", "iocfg_lb", "iocfg_tr", | ||||
| 	"iocfg_tl", | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_mode_range[] = { | ||||
| 	PIN_FIELD(0, 100, 0x300, 0x10, 0, 4), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_dir_range[] = { | ||||
| 	PIN_FIELD(0, 100, 0x0, 0x10, 0, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_di_range[] = { | ||||
| 	PIN_FIELD(0, 100, 0x200, 0x10, 0, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_do_range[] = { | ||||
| 	PIN_FIELD(0, 100, 0x100, 0x10, 0, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_ies_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x40, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x20, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x20, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x20, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x40, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x40, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x30, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x30, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x30, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x30, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x30, 0x10, 19, 1), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x30, 0x10, 23, 1), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x30, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x30, 0x10, 21, 1), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x20, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x20, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x20, 0x10, 7, 1), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x20, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x20, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x40, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x40, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x40, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x40, 0x10, 20, 1), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x40, 0x10, 26, 1), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x40, 0x10, 24, 1), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x30, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x30, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x30, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x30, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x40, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x40, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x40, 0x10, 13, 1), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x40, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x20, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x30, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x30, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x30, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x30, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x30, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x30, 0x10, 6, 1), | ||||
| 	PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x30, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x30, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x30, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x30, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x30, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x30, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x30, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x30, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x30, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x30, 0x10, 8, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_smt_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0xf0, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x90, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x90, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0xf0, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x90, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0xf0, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0xf0, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0xc0, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0xc0, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0xc0, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0xc0, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0xc0, 0x10, 19, 1), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0xc0, 0x10, 23, 1), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0xc0, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0xc0, 0x10, 21, 1), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x90, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x90, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x90, 0x10, 7, 1), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x90, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x90, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0xf0, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0xf0, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0xf0, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0xf0, 0x10, 20, 1), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0xf0, 0x10, 26, 1), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0xf0, 0x10, 24, 1), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0xc0, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0xc0, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0xc0, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0xc0, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0xf0, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0xf0, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0xf0, 0x10, 13, 1), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0xf0, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x90, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x80, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x80, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x80, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x80, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x80, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x80, 0x10, 6, 1), | ||||
| 	PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x80, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x80, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x80, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x70, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x70, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x70, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x70, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x70, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x70, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x70, 0x10, 8, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_pu_range[] = { | ||||
| 	PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x50, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x50, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x50, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x50, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x50, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x50, 0x10, 6, 1), | ||||
| 	PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x50, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x50, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x50, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x50, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x50, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x50, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x50, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x50, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x50, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x50, 0x10, 8, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_pd_range[] = { | ||||
| 	PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x40, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x40, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x40, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(74, 74, IOCFG_TR_BASE, 0x40, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(75, 77, IOCFG_TR_BASE, 0x40, 0x10, 6, 1), | ||||
| 	PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x40, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(80, 84, IOCFG_TR_BASE, 0x40, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x40, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x40, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x40, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x40, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x40, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x40, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(97, 100, IOCFG_TL_BASE, 0x40, 0x10, 8, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_drv_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x10, 0x10, 21, 3), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x10, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x00, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 5, IOCFG_RB_BASE, 0x00, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(6, 6, IOCFG_RB_BASE, 0x00, 0x10, 21, 3), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x00, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(11, 12, IOCFG_RB_BASE, 0x00, 0x10, 24, 3), | ||||
| 	PIN_FIELD_BASE(13, 14, IOCFG_RB_BASE, 0x10, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x00, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x10, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x10, 0x10, 24, 3), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x10, 0x10, 21, 3), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x10, 0x10, 15, 3), | ||||
| 	PIN_FIELD_BASE(28, 28, IOCFG_RT_BASE, 0x10, 0x10, 27, 3), | ||||
| 	PIN_FIELD_BASE(29, 29, IOCFG_RT_BASE, 0x20, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x20, 0x10, 9, 3), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x20, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x20, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x00, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x00, 0x10, 24, 3), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x00, 0x10, 21, 3), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x00, 0x10, 15, 3), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x00, 0x10, 27, 3), | ||||
| 	PIN_FIELD_BASE(39, 39, IOCFG_RB_BASE, 0x10, 0x10, 27, 3), | ||||
| 	PIN_FIELD_BASE(40, 40, IOCFG_RB_BASE, 0x20, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x10, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x20, 0x10, 9, 3), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x20, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x20, 0x10, 21, 3), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x20, 0x10, 15, 3), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x00, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x00, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x00, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x10, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x10, 0x10, 15, 3), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x10, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x10, 0x10, 9, 3), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x10, 0x10, 18, 3), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x00, 0x10, 2, 3), | ||||
| 	PIN_FIELD_BASE(69, 69, IOCFG_TR_BASE, 0x00, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(70, 70, IOCFG_TR_BASE, 0x00, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(71, 71, IOCFG_TR_BASE, 0x10, 0x10, 18, 3), | ||||
| 	PIN_FIELD_BASE(72, 73, IOCFG_TR_BASE, 0x10, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(74, 77, IOCFG_TR_BASE, 0x00, 0x10, 15, 3), | ||||
| 	PIN_FIELD_BASE(78, 79, IOCFG_TR_BASE, 0x00, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(80, 80, IOCFG_TR_BASE, 0x00, 0x10, 27, 3), | ||||
| 	PIN_FIELD_BASE(81, 84, IOCFG_TR_BASE, 0x10, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(85, 85, IOCFG_TR_BASE, 0x00, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(86, 86, IOCFG_TL_BASE, 0x00, 0x10, 3, 3), | ||||
| 	PIN_FIELD_BASE(87, 87, IOCFG_TL_BASE, 0x00, 0x10, 0, 3), | ||||
| 	PIN_FIELD_BASE(88, 88, IOCFG_TL_BASE, 0x10, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(89, 90, IOCFG_TL_BASE, 0x10, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(91, 94, IOCFG_TL_BASE, 0x00, 0x10, 12, 3), | ||||
| 	PIN_FIELD_BASE(95, 96, IOCFG_TL_BASE, 0x00, 0x10, 6, 3), | ||||
| 	PIN_FIELD_BASE(97, 98, IOCFG_TL_BASE, 0x00, 0x10, 24, 3), | ||||
| 	PIN_FIELD_BASE(99, 100, IOCFG_TL_BASE, 0x10, 0x10, 2, 3), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_pupd_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x60, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x30, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x60, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x30, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x60, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x60, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x40, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x40, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x40, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x40, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x40, 0x10, 19, 1), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x40, 0x10, 23, 1), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x40, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x40, 0x10, 21, 1), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x30, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x30, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x30, 0x10, 7, 1), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x30, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x30, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x60, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x60, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x60, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x60, 0x10, 20, 1), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x60, 0x10, 26, 1), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x60, 0x10, 24, 1), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x40, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x40, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x40, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x60, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x60, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x60, 0x10, 13, 1), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x60, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x40, 0x10, 2, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_r0_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x70, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x40, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x50, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x70, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x40, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x70, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x70, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x50, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x50, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x50, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x50, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x50, 0x10, 19, 1), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x50, 0x10, 23, 1), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x50, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x50, 0x10, 21, 1), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x40, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x40, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x40, 0x10, 7, 1), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x40, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x40, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x70, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x70, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x70, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x70, 0x10, 20, 1), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x70, 0x10, 26, 1), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x70, 0x10, 24, 1), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x50, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x50, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x50, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x50, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x70, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x70, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x70, 0x10, 13, 1), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x70, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x50, 0x10, 2, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_field_calc mt7986_pin_r1_range[] = { | ||||
| 	PIN_FIELD_BASE(0, 0, IOCFG_RB_BASE, 0x80, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(1, 2, IOCFG_LT_BASE, 0x50, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(3, 4, IOCFG_LB_BASE, 0x60, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(5, 6, IOCFG_RB_BASE, 0x80, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(7, 10, IOCFG_LT_BASE, 0x50, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(11, 14, IOCFG_RB_BASE, 0x80, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(15, 20, IOCFG_RB_BASE, 0x80, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(21, 23, IOCFG_RT_BASE, 0x60, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(24, 24, IOCFG_RT_BASE, 0x60, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(25, 25, IOCFG_RT_BASE, 0x60, 0x10, 17, 1), | ||||
| 	PIN_FIELD_BASE(26, 27, IOCFG_RT_BASE, 0x60, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(28, 29, IOCFG_RT_BASE, 0x60, 0x10, 19, 1), | ||||
| 	PIN_FIELD_BASE(30, 30, IOCFG_RT_BASE, 0x60, 0x10, 23, 1), | ||||
| 	PIN_FIELD_BASE(31, 31, IOCFG_RT_BASE, 0x60, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(32, 32, IOCFG_RT_BASE, 0x60, 0x10, 21, 1), | ||||
| 	PIN_FIELD_BASE(33, 33, IOCFG_LT_BASE, 0x50, 0x10, 4, 1), | ||||
| 	PIN_FIELD_BASE(34, 34, IOCFG_LT_BASE, 0x50, 0x10, 8, 1), | ||||
| 	PIN_FIELD_BASE(35, 35, IOCFG_LT_BASE, 0x50, 0x10, 7, 1), | ||||
| 	PIN_FIELD_BASE(36, 37, IOCFG_LT_BASE, 0x50, 0x10, 5, 1), | ||||
| 	PIN_FIELD_BASE(38, 38, IOCFG_LT_BASE, 0x50, 0x10, 9, 1), | ||||
| 	PIN_FIELD_BASE(39, 40, IOCFG_RB_BASE, 0x80, 0x10, 18, 1), | ||||
| 	PIN_FIELD_BASE(41, 41, IOCFG_RB_BASE, 0x80, 0x10, 12, 1), | ||||
| 	PIN_FIELD_BASE(42, 43, IOCFG_RB_BASE, 0x80, 0x10, 22, 1), | ||||
| 	PIN_FIELD_BASE(44, 45, IOCFG_RB_BASE, 0x80, 0x10, 20, 1), | ||||
| 	PIN_FIELD_BASE(46, 47, IOCFG_RB_BASE, 0x80, 0x10, 26, 1), | ||||
| 	PIN_FIELD_BASE(48, 49, IOCFG_RB_BASE, 0x80, 0x10, 24, 1), | ||||
| 	PIN_FIELD_BASE(50, 57, IOCFG_RT_BASE, 0x60, 0x10, 2, 1), | ||||
| 	PIN_FIELD_BASE(58, 58, IOCFG_RT_BASE, 0x60, 0x10, 1, 1), | ||||
| 	PIN_FIELD_BASE(59, 59, IOCFG_RT_BASE, 0x60, 0x10, 0, 1), | ||||
| 	PIN_FIELD_BASE(60, 61, IOCFG_RT_BASE, 0x60, 0x10, 10, 1), | ||||
| 	PIN_FIELD_BASE(62, 62, IOCFG_RB_BASE, 0x80, 0x10, 15, 1), | ||||
| 	PIN_FIELD_BASE(63, 63, IOCFG_RB_BASE, 0x80, 0x10, 14, 1), | ||||
| 	PIN_FIELD_BASE(64, 64, IOCFG_RB_BASE, 0x80, 0x10, 13, 1), | ||||
| 	PIN_FIELD_BASE(65, 65, IOCFG_RB_BASE, 0x80, 0x10, 16, 1), | ||||
| 	PIN_FIELD_BASE(66, 68, IOCFG_LB_BASE, 0x60, 0x10, 2, 1), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_reg_calc mt7986_reg_cals[] = { | ||||
| 	[PINCTRL_PIN_REG_MODE] = MTK_RANGE(mt7986_pin_mode_range), | ||||
| 	[PINCTRL_PIN_REG_DIR] = MTK_RANGE(mt7986_pin_dir_range), | ||||
| 	[PINCTRL_PIN_REG_DI] = MTK_RANGE(mt7986_pin_di_range), | ||||
| 	[PINCTRL_PIN_REG_DO] = MTK_RANGE(mt7986_pin_do_range), | ||||
| 	[PINCTRL_PIN_REG_SMT] = MTK_RANGE(mt7986_pin_smt_range), | ||||
| 	[PINCTRL_PIN_REG_IES] = MTK_RANGE(mt7986_pin_ies_range), | ||||
| 	[PINCTRL_PIN_REG_DRV] = MTK_RANGE(mt7986_pin_drv_range), | ||||
| 	[PINCTRL_PIN_REG_PU] = MTK_RANGE(mt7986_pin_pu_range), | ||||
| 	[PINCTRL_PIN_REG_PD] = MTK_RANGE(mt7986_pin_pd_range), | ||||
| 	[PINCTRL_PIN_REG_PUPD] = MTK_RANGE(mt7986_pin_pupd_range), | ||||
| 	[PINCTRL_PIN_REG_R0] = MTK_RANGE(mt7986_pin_r0_range), | ||||
| 	[PINCTRL_PIN_REG_R1] = MTK_RANGE(mt7986_pin_r1_range), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_desc mt7986a_pins[] = { | ||||
| 	MT7986_PIN(0, "SYS_WATCHDOG"), | ||||
| 	MT7986_PIN(1, "WF2G_LED"), | ||||
| 	MT7986_PIN(2, "WF5G_LED"), | ||||
| 	MT7986_PIN(3, "I2C_SCL"), | ||||
| 	MT7986_PIN(4, "I2C_SDA"), | ||||
| 	MT7986_PIN(5, "GPIO_0"), | ||||
| 	MT7986_PIN(6, "GPIO_1"), | ||||
| 	MT7986_PIN(7, "GPIO_2"), | ||||
| 	MT7986_PIN(8, "GPIO_3"), | ||||
| 	MT7986_PIN(9, "GPIO_4"), | ||||
| 	MT7986_PIN(10, "GPIO_5"), | ||||
| 	MT7986_PIN(11, "GPIO_6"), | ||||
| 	MT7986_PIN(12, "GPIO_7"), | ||||
| 	MT7986_PIN(13, "GPIO_8"), | ||||
| 	MT7986_PIN(14, "GPIO_9"), | ||||
| 	MT7986_PIN(15, "GPIO_10"), | ||||
| 	MT7986_PIN(16, "GPIO_11"), | ||||
| 	MT7986_PIN(17, "GPIO_12"), | ||||
| 	MT7986_PIN(18, "GPIO_13"), | ||||
| 	MT7986_PIN(19, "GPIO_14"), | ||||
| 	MT7986_PIN(20, "GPIO_15"), | ||||
| 	MT7986_PIN(21, "PWM0"), | ||||
| 	MT7986_PIN(22, "PWM1"), | ||||
| 	MT7986_PIN(23, "SPI0_CLK"), | ||||
| 	MT7986_PIN(24, "SPI0_MOSI"), | ||||
| 	MT7986_PIN(25, "SPI0_MISO"), | ||||
| 	MT7986_PIN(26, "SPI0_CS"), | ||||
| 	MT7986_PIN(27, "SPI0_HOLD"), | ||||
| 	MT7986_PIN(28, "SPI0_WP"), | ||||
| 	MT7986_PIN(29, "SPI1_CLK"), | ||||
| 	MT7986_PIN(30, "SPI1_MOSI"), | ||||
| 	MT7986_PIN(31, "SPI1_MISO"), | ||||
| 	MT7986_PIN(32, "SPI1_CS"), | ||||
| 	MT7986_PIN(33, "SPI2_CLK"), | ||||
| 	MT7986_PIN(34, "SPI2_MOSI"), | ||||
| 	MT7986_PIN(35, "SPI2_MISO"), | ||||
| 	MT7986_PIN(36, "SPI2_CS"), | ||||
| 	MT7986_PIN(37, "SPI2_HOLD"), | ||||
| 	MT7986_PIN(38, "SPI2_WP"), | ||||
| 	MT7986_PIN(39, "UART0_RXD"), | ||||
| 	MT7986_PIN(40, "UART0_TXD"), | ||||
| 	MT7986_PIN(41, "PCIE_PERESET_N"), | ||||
| 	MT7986_PIN(42, "UART1_RXD"), | ||||
| 	MT7986_PIN(43, "UART1_TXD"), | ||||
| 	MT7986_PIN(44, "UART1_CTS"), | ||||
| 	MT7986_PIN(45, "UART1_RTS"), | ||||
| 	MT7986_PIN(46, "UART2_RXD"), | ||||
| 	MT7986_PIN(47, "UART2_TXD"), | ||||
| 	MT7986_PIN(48, "UART2_CTS"), | ||||
| 	MT7986_PIN(49, "UART2_RTS"), | ||||
| 	MT7986_PIN(50, "EMMC_DATA_0"), | ||||
| 	MT7986_PIN(51, "EMMC_DATA_1"), | ||||
| 	MT7986_PIN(52, "EMMC_DATA_2"), | ||||
| 	MT7986_PIN(53, "EMMC_DATA_3"), | ||||
| 	MT7986_PIN(54, "EMMC_DATA_4"), | ||||
| 	MT7986_PIN(55, "EMMC_DATA_5"), | ||||
| 	MT7986_PIN(56, "EMMC_DATA_6"), | ||||
| 	MT7986_PIN(57, "EMMC_DATA_7"), | ||||
| 	MT7986_PIN(58, "EMMC_CMD"), | ||||
| 	MT7986_PIN(59, "EMMC_CK"), | ||||
| 	MT7986_PIN(60, "EMMC_DSL"), | ||||
| 	MT7986_PIN(61, "EMMC_RSTB"), | ||||
| 	MT7986_PIN(62, "PCM_DTX"), | ||||
| 	MT7986_PIN(63, "PCM_DRX"), | ||||
| 	MT7986_PIN(64, "PCM_CLK"), | ||||
| 	MT7986_PIN(65, "PCM_FS"), | ||||
| 	MT7986_PIN(66, "MT7531_INT"), | ||||
| 	MT7986_PIN(67, "SMI_MDC"), | ||||
| 	MT7986_PIN(68, "SMI_MDIO"), | ||||
| 	MT7986_PIN(69, "WF0_DIG_RESETB"), | ||||
| 	MT7986_PIN(70, "WF0_CBA_RESETB"), | ||||
| 	MT7986_PIN(71, "WF0_XO_REQ"), | ||||
| 	MT7986_PIN(72, "WF0_TOP_CLK"), | ||||
| 	MT7986_PIN(73, "WF0_TOP_DATA"), | ||||
| 	MT7986_PIN(74, "WF0_HB1"), | ||||
| 	MT7986_PIN(75, "WF0_HB2"), | ||||
| 	MT7986_PIN(76, "WF0_HB3"), | ||||
| 	MT7986_PIN(77, "WF0_HB4"), | ||||
| 	MT7986_PIN(78, "WF0_HB0"), | ||||
| 	MT7986_PIN(79, "WF0_HB0_B"), | ||||
| 	MT7986_PIN(80, "WF0_HB5"), | ||||
| 	MT7986_PIN(81, "WF0_HB6"), | ||||
| 	MT7986_PIN(82, "WF0_HB7"), | ||||
| 	MT7986_PIN(83, "WF0_HB8"), | ||||
| 	MT7986_PIN(84, "WF0_HB9"), | ||||
| 	MT7986_PIN(85, "WF0_HB10"), | ||||
| 	MT7986_PIN(86, "WF1_DIG_RESETB"), | ||||
| 	MT7986_PIN(87, "WF1_CBA_RESETB"), | ||||
| 	MT7986_PIN(88, "WF1_XO_REQ"), | ||||
| 	MT7986_PIN(89, "WF1_TOP_CLK"), | ||||
| 	MT7986_PIN(90, "WF1_TOP_DATA"), | ||||
| 	MT7986_PIN(91, "WF1_HB1"), | ||||
| 	MT7986_PIN(92, "WF1_HB2"), | ||||
| 	MT7986_PIN(93, "WF1_HB3"), | ||||
| 	MT7986_PIN(94, "WF1_HB4"), | ||||
| 	MT7986_PIN(95, "WF1_HB0"), | ||||
| 	MT7986_PIN(96, "WF1_HB0_B"), | ||||
| 	MT7986_PIN(97, "WF1_HB5"), | ||||
| 	MT7986_PIN(98, "WF1_HB6"), | ||||
| 	MT7986_PIN(99, "WF1_HB7"), | ||||
| 	MT7986_PIN(100, "WF1_HB8"), | ||||
| }; | ||||
|  | ||||
| static const struct mtk_pin_desc mt7986b_pins[] = { | ||||
| 	MT7986_PIN(0, "SYS_WATCHDOG"), | ||||
| 	MT7986_PIN(1, "WF2G_LED"), | ||||
| 	MT7986_PIN(2, "WF5G_LED"), | ||||
| 	MT7986_PIN(3, "I2C_SCL"), | ||||
| 	MT7986_PIN(4, "I2C_SDA"), | ||||
| 	MT7986_PIN(5, "GPIO_0"), | ||||
| 	MT7986_PIN(6, "GPIO_1"), | ||||
| 	MT7986_PIN(7, "GPIO_2"), | ||||
| 	MT7986_PIN(8, "GPIO_3"), | ||||
| 	MT7986_PIN(9, "GPIO_4"), | ||||
| 	MT7986_PIN(10, "GPIO_5"), | ||||
| 	MT7986_PIN(11, "GPIO_6"), | ||||
| 	MT7986_PIN(12, "GPIO_7"), | ||||
| 	MT7986_PIN(13, "GPIO_8"), | ||||
| 	MT7986_PIN(14, "GPIO_9"), | ||||
| 	MT7986_PIN(15, "GPIO_10"), | ||||
| 	MT7986_PIN(16, "GPIO_11"), | ||||
| 	MT7986_PIN(17, "GPIO_12"), | ||||
| 	MT7986_PIN(18, "GPIO_13"), | ||||
| 	MT7986_PIN(19, "GPIO_14"), | ||||
| 	MT7986_PIN(20, "GPIO_15"), | ||||
| 	MT7986_PIN(21, "PWM0"), | ||||
| 	MT7986_PIN(22, "PWM1"), | ||||
| 	MT7986_PIN(23, "SPI0_CLK"), | ||||
| 	MT7986_PIN(24, "SPI0_MOSI"), | ||||
| 	MT7986_PIN(25, "SPI0_MISO"), | ||||
| 	MT7986_PIN(26, "SPI0_CS"), | ||||
| 	MT7986_PIN(27, "SPI0_HOLD"), | ||||
| 	MT7986_PIN(28, "SPI0_WP"), | ||||
| 	MT7986_PIN(29, "SPI1_CLK"), | ||||
| 	MT7986_PIN(30, "SPI1_MOSI"), | ||||
| 	MT7986_PIN(31, "SPI1_MISO"), | ||||
| 	MT7986_PIN(32, "SPI1_CS"), | ||||
| 	MT7986_PIN(33, "SPI2_CLK"), | ||||
| 	MT7986_PIN(34, "SPI2_MOSI"), | ||||
| 	MT7986_PIN(35, "SPI2_MISO"), | ||||
| 	MT7986_PIN(36, "SPI2_CS"), | ||||
| 	MT7986_PIN(37, "SPI2_HOLD"), | ||||
| 	MT7986_PIN(38, "SPI2_WP"), | ||||
| 	MT7986_PIN(39, "UART0_RXD"), | ||||
| 	MT7986_PIN(40, "UART0_TXD"), | ||||
| 	MT7986_NOT_BALLOUT_PIN(41), | ||||
| 	MT7986_NOT_BALLOUT_PIN(42), | ||||
| 	MT7986_NOT_BALLOUT_PIN(43), | ||||
| 	MT7986_NOT_BALLOUT_PIN(44), | ||||
| 	MT7986_NOT_BALLOUT_PIN(45), | ||||
| 	MT7986_NOT_BALLOUT_PIN(46), | ||||
| 	MT7986_NOT_BALLOUT_PIN(47), | ||||
| 	MT7986_NOT_BALLOUT_PIN(48), | ||||
| 	MT7986_NOT_BALLOUT_PIN(49), | ||||
| 	MT7986_NOT_BALLOUT_PIN(50), | ||||
| 	MT7986_NOT_BALLOUT_PIN(51), | ||||
| 	MT7986_NOT_BALLOUT_PIN(52), | ||||
| 	MT7986_NOT_BALLOUT_PIN(53), | ||||
| 	MT7986_NOT_BALLOUT_PIN(54), | ||||
| 	MT7986_NOT_BALLOUT_PIN(55), | ||||
| 	MT7986_NOT_BALLOUT_PIN(56), | ||||
| 	MT7986_NOT_BALLOUT_PIN(57), | ||||
| 	MT7986_NOT_BALLOUT_PIN(58), | ||||
| 	MT7986_NOT_BALLOUT_PIN(59), | ||||
| 	MT7986_NOT_BALLOUT_PIN(60), | ||||
| 	MT7986_NOT_BALLOUT_PIN(61), | ||||
| 	MT7986_NOT_BALLOUT_PIN(62), | ||||
| 	MT7986_NOT_BALLOUT_PIN(63), | ||||
| 	MT7986_NOT_BALLOUT_PIN(64), | ||||
| 	MT7986_NOT_BALLOUT_PIN(65), | ||||
| 	MT7986_PIN(66, "MT7531_INT"), | ||||
| 	MT7986_PIN(67, "SMI_MDC"), | ||||
| 	MT7986_PIN(68, "SMI_MDIO"), | ||||
| 	MT7986_PIN(69, "WF0_DIG_RESETB"), | ||||
| 	MT7986_PIN(70, "WF0_CBA_RESETB"), | ||||
| 	MT7986_PIN(71, "WF0_XO_REQ"), | ||||
| 	MT7986_PIN(72, "WF0_TOP_CLK"), | ||||
| 	MT7986_PIN(73, "WF0_TOP_DATA"), | ||||
| 	MT7986_PIN(74, "WF0_HB1"), | ||||
| 	MT7986_PIN(75, "WF0_HB2"), | ||||
| 	MT7986_PIN(76, "WF0_HB3"), | ||||
| 	MT7986_PIN(77, "WF0_HB4"), | ||||
| 	MT7986_PIN(78, "WF0_HB0"), | ||||
| 	MT7986_PIN(79, "WF0_HB0_B"), | ||||
| 	MT7986_PIN(80, "WF0_HB5"), | ||||
| 	MT7986_PIN(81, "WF0_HB6"), | ||||
| 	MT7986_PIN(82, "WF0_HB7"), | ||||
| 	MT7986_PIN(83, "WF0_HB8"), | ||||
| 	MT7986_PIN(84, "WF0_HB9"), | ||||
| 	MT7986_PIN(85, "WF0_HB10"), | ||||
| 	MT7986_PIN(86, "WF1_DIG_RESETB"), | ||||
| 	MT7986_PIN(87, "WF1_CBA_RESETB"), | ||||
| 	MT7986_PIN(88, "WF1_XO_REQ"), | ||||
| 	MT7986_PIN(89, "WF1_TOP_CLK"), | ||||
| 	MT7986_PIN(90, "WF1_TOP_DATA"), | ||||
| 	MT7986_PIN(91, "WF1_HB1"), | ||||
| 	MT7986_PIN(92, "WF1_HB2"), | ||||
| 	MT7986_PIN(93, "WF1_HB3"), | ||||
| 	MT7986_PIN(94, "WF1_HB4"), | ||||
| 	MT7986_PIN(95, "WF1_HB0"), | ||||
| 	MT7986_PIN(96, "WF1_HB0_B"), | ||||
| 	MT7986_PIN(97, "WF1_HB5"), | ||||
| 	MT7986_PIN(98, "WF1_HB6"), | ||||
| 	MT7986_PIN(99, "WF1_HB7"), | ||||
| 	MT7986_PIN(100, "WF1_HB8"), | ||||
| }; | ||||
|  | ||||
| /* List all groups consisting of these pins dedicated to the enablement of | ||||
|  * certain hardware block and the corresponding mode for all of the pins. | ||||
|  * The hardware probably has multiple combinations of these pinouts. | ||||
|  */ | ||||
|  | ||||
| static int mt7986_watchdog_pins[] = { 0, }; | ||||
| static int mt7986_watchdog_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_wifi_led_pins[] = { 1, 2, }; | ||||
| static int mt7986_wifi_led_funcs[] = { 1, 1, }; | ||||
|  | ||||
| static int mt7986_i2c_pins[] = { 3, 4, }; | ||||
| static int mt7986_i2c_funcs[] = { 1, 1, }; | ||||
|  | ||||
| static int mt7986_uart1_0_pins[] = { 7, 8, 9, 10, }; | ||||
| static int mt7986_uart1_0_funcs[] = { 3, 3, 3, 3, }; | ||||
|  | ||||
| static int mt7986_spi1_0_pins[] = { 11, 12, 13, 14, }; | ||||
| static int mt7986_spi1_0_funcs[] = { 3, 3, 3, 3, }; | ||||
|  | ||||
| static int mt7986_pwm1_1_pins[] = { 20, }; | ||||
| static int mt7986_pwm1_1_funcs[] = { 2, }; | ||||
|  | ||||
| static int mt7986_pwm0_pins[] = { 21, }; | ||||
| static int mt7986_pwm0_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_pwm1_0_pins[] = { 22, }; | ||||
| static int mt7986_pwm1_0_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_emmc_45_pins[] = { | ||||
| 	22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }; | ||||
| static int mt7986_emmc_45_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; | ||||
|  | ||||
| static int mt7986_snfi_pins[] = { 23, 24, 25, 26, 27, 28, }; | ||||
| static int mt7986_snfi_funcs[] = { 1, 1, 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_spi1_1_pins[] = { 23, 24, 25, 26, }; | ||||
| static int mt7986_spi1_1_funcs[] = { 3, 3, 3, 3, }; | ||||
|  | ||||
| static int mt7986_uart1_1_pins[] = { 23, 24, 25, 26, }; | ||||
| static int mt7986_uart1_1_funcs[] = { 4, 4, 4, 4, }; | ||||
|  | ||||
| static int mt7986_spi1_2_pins[] = { 29, 30, 31, 32, }; | ||||
| static int mt7986_spi1_2_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_uart1_2_pins[] = { 29, 30, 31, 32, }; | ||||
| static int mt7986_uart1_2_funcs[] = { 3, 3, 3, 3, }; | ||||
|  | ||||
| static int mt7986_uart2_0_pins[] = { 29, 30, 31, 32, }; | ||||
| static int mt7986_uart2_0_funcs[] = { 4, 4, 4, 4, }; | ||||
|  | ||||
| static int mt7986_spi0_pins[] = { 33, 34, 35, 36, }; | ||||
| static int mt7986_spi0_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_spi0_wp_hold_pins[] = { 37, 38, }; | ||||
| static int mt7986_spi0_wp_hold_funcs[] = { 1, 1, }; | ||||
|  | ||||
| static int mt7986_uart2_1_pins[] = { 33, 34, 35, 36, }; | ||||
| static int mt7986_uart2_1_funcs[] = { 3, 3, 3, 3, }; | ||||
|  | ||||
| static int mt7986_uart1_3_rx_tx_pins[] = { 35, 36, }; | ||||
| static int mt7986_uart1_3_rx_tx_funcs[] = { 2, 2, }; | ||||
|  | ||||
| static int mt7986_uart1_3_cts_rts_pins[] = { 37, 38, }; | ||||
| static int mt7986_uart1_3_cts_rts_funcs[] = { 2, 2, }; | ||||
|  | ||||
| static int mt7986_spi1_3_pins[] = { 33, 34, 35, 36, }; | ||||
| static int mt7986_spi1_3_funcs[] = { 4, 4, 4, 4, }; | ||||
|  | ||||
| static int mt7986_uart0_pins[] = { 39, 40, }; | ||||
| static int mt7986_uart0_funcs[] = { 1, 1, }; | ||||
|  | ||||
| static int mt7986_pcie_reset_pins[] = { 41, }; | ||||
| static int mt7986_pcie_reset_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_uart1_pins[] = { 42, 43, 44, 45, }; | ||||
| static int mt7986_uart1_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_uart2_pins[] = { 46, 47, 48, 49, }; | ||||
| static int mt7986_uart2_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_emmc_51_pins[] = { | ||||
| 	50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, }; | ||||
| static int mt7986_emmc_51_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_pcm_pins[] = { 62, 63, 64, 65, }; | ||||
| static int mt7986_pcm_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_i2s_pins[] = { 62, 63, 64, 65, }; | ||||
| static int mt7986_i2s_funcs[] = { 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_switch_int_pins[] = { 66, }; | ||||
| static int mt7986_switch_int_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_mdc_mdio_pins[] = { 67, 68, }; | ||||
| static int mt7986_mdc_mdio_funcs[] = { 1, 1, }; | ||||
|  | ||||
| static int mt7986_wf_2g_pins[] = {74, 75, 76, 77, 78, 79, 80, 81, 82, 83, }; | ||||
| static int mt7986_wf_2g_funcs[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_wf_5g_pins[] = {91, 92, 93, 94, 95, 96, 97, 98, 99, 100, }; | ||||
| static int mt7986_wf_5g_funcs[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; | ||||
|  | ||||
| static int mt7986_wf_dbdc_pins[] = { | ||||
| 	74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, }; | ||||
| static int mt7986_wf_dbdc_funcs[] = { | ||||
| 	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; | ||||
|  | ||||
| static int mt7986_pcie_clk_pins[] = { 9, }; | ||||
| static int mt7986_pcie_clk_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_pcie_wake_pins[] = { 10, }; | ||||
| static int mt7986_pcie_wake_funcs[] = { 1, }; | ||||
|  | ||||
| static int mt7986_jtag_pins[] = { 11, 12, 13, 14, 15}; | ||||
| static int mt7986_jtag_funcs[] = { 1, 1, 1, 1, 1}; | ||||
|  | ||||
| static const struct group_desc mt7986_groups[] = { | ||||
| 	PINCTRL_PIN_GROUP("watchdog", mt7986_watchdog), | ||||
| 	PINCTRL_PIN_GROUP("wifi_led", mt7986_wifi_led), | ||||
| 	PINCTRL_PIN_GROUP("i2c", mt7986_i2c), | ||||
| 	PINCTRL_PIN_GROUP("uart1_0", mt7986_uart1_0), | ||||
| 	PINCTRL_PIN_GROUP("pcie_clk", mt7986_pcie_clk), | ||||
| 	PINCTRL_PIN_GROUP("pcie_wake", mt7986_pcie_wake), | ||||
| 	PINCTRL_PIN_GROUP("spi1_0", mt7986_spi1_0), | ||||
| 	PINCTRL_PIN_GROUP("pwm1_1", mt7986_pwm1_1), | ||||
| 	PINCTRL_PIN_GROUP("pwm0", mt7986_pwm0), | ||||
| 	PINCTRL_PIN_GROUP("pwm1_0", mt7986_pwm1_0), | ||||
| 	PINCTRL_PIN_GROUP("emmc_45", mt7986_emmc_45), | ||||
| 	PINCTRL_PIN_GROUP("snfi", mt7986_snfi), | ||||
| 	PINCTRL_PIN_GROUP("spi1_1", mt7986_spi1_1), | ||||
| 	PINCTRL_PIN_GROUP("uart1_1", mt7986_uart1_1), | ||||
| 	PINCTRL_PIN_GROUP("spi1_2", mt7986_spi1_2), | ||||
| 	PINCTRL_PIN_GROUP("uart1_2", mt7986_uart1_2), | ||||
| 	PINCTRL_PIN_GROUP("uart2_0", mt7986_uart2_0), | ||||
| 	PINCTRL_PIN_GROUP("spi0", mt7986_spi0), | ||||
| 	PINCTRL_PIN_GROUP("spi0_wp_hold", mt7986_spi0_wp_hold), | ||||
| 	PINCTRL_PIN_GROUP("uart2_1", mt7986_uart2_1), | ||||
| 	PINCTRL_PIN_GROUP("uart1_3_rx_tx", mt7986_uart1_3_rx_tx), | ||||
| 	PINCTRL_PIN_GROUP("uart1_3_cts_rts", mt7986_uart1_3_cts_rts), | ||||
| 	PINCTRL_PIN_GROUP("spi1_3", mt7986_spi1_3), | ||||
| 	PINCTRL_PIN_GROUP("uart0", mt7986_uart0), | ||||
| 	PINCTRL_PIN_GROUP("switch_int", mt7986_switch_int), | ||||
| 	PINCTRL_PIN_GROUP("mdc_mdio", mt7986_mdc_mdio), | ||||
| 	PINCTRL_PIN_GROUP("pcie_pereset", mt7986_pcie_reset), | ||||
| 	PINCTRL_PIN_GROUP("uart1", mt7986_uart1), | ||||
| 	PINCTRL_PIN_GROUP("uart2", mt7986_uart2), | ||||
| 	PINCTRL_PIN_GROUP("emmc_51", mt7986_emmc_51), | ||||
| 	PINCTRL_PIN_GROUP("pcm", mt7986_pcm), | ||||
| 	PINCTRL_PIN_GROUP("i2s", mt7986_i2s), | ||||
| 	PINCTRL_PIN_GROUP("wf_2g", mt7986_wf_2g), | ||||
| 	PINCTRL_PIN_GROUP("wf_5g", mt7986_wf_5g), | ||||
| 	PINCTRL_PIN_GROUP("wf_dbdc", mt7986_wf_dbdc), | ||||
| 	PINCTRL_PIN_GROUP("jtag", mt7986_jtag), | ||||
| }; | ||||
|  | ||||
| /* Joint those groups owning the same capability in user point of view which | ||||
|  * allows that people tend to use through the device tree. | ||||
|  */ | ||||
|  | ||||
| static const char *mt7986_audio_groups[] = { "pcm", "i2s" }; | ||||
| static const char *mt7986_emmc_groups[] = { | ||||
| 	"emmc_45", "emmc_51", }; | ||||
| static const char *mt7986_ethernet_groups[] = { | ||||
| 	"switch_int", "mdc_mdio", }; | ||||
| static const char *mt7986_i2c_groups[] = { "i2c", }; | ||||
| static const char *mt7986_led_groups[] = { "wifi_led", }; | ||||
| static const char *mt7986_flash_groups[] = { "snfi", }; | ||||
| static const char *mt7986_pcie_groups[] = { | ||||
| 	"pcie_clk", "pcie_wake", "pcie_pereset" }; | ||||
| static const char *mt7986_pwm_groups[] = { "pwm0", "pwm1_0", "pwm1_1", }; | ||||
| static const char *mt7986_spi_groups[] = { | ||||
| 	"spi0", "spi0_wp_hold", "spi1_0", "spi1_1", "spi1_2", "spi1_3", }; | ||||
| static const char *mt7986_uart_groups[] = { | ||||
| 	"uart1_0", "uart1_1", "uart1_2", "uart1_3_rx_tx", "uart1_3_cts_rts", | ||||
| 	"uart2_0", "uart2_1", "uart0", "uart1", "uart2", | ||||
| }; | ||||
| static const char *mt7986_wdt_groups[] = { "watchdog", }; | ||||
| static const char *mt7986_wf_groups[] = { "wf_2g", "wf_5g", "wf_dbdc", }; | ||||
| static const char *mt7986_jtag_groups[] = { "jtag", }; | ||||
|  | ||||
| static const struct function_desc mt7986_functions[] = { | ||||
| 	{"audio", mt7986_audio_groups, ARRAY_SIZE(mt7986_audio_groups)}, | ||||
| 	{"emmc", mt7986_emmc_groups, ARRAY_SIZE(mt7986_emmc_groups)}, | ||||
| 	{"eth", mt7986_ethernet_groups, ARRAY_SIZE(mt7986_ethernet_groups)}, | ||||
| 	{"i2c", mt7986_i2c_groups, ARRAY_SIZE(mt7986_i2c_groups)}, | ||||
| 	{"led", mt7986_led_groups, ARRAY_SIZE(mt7986_led_groups)}, | ||||
| 	{"flash", mt7986_flash_groups, ARRAY_SIZE(mt7986_flash_groups)}, | ||||
| 	{"pcie", mt7986_pcie_groups, ARRAY_SIZE(mt7986_pcie_groups)}, | ||||
| 	{"pwm", mt7986_pwm_groups, ARRAY_SIZE(mt7986_pwm_groups)}, | ||||
| 	{"spi", mt7986_spi_groups, ARRAY_SIZE(mt7986_spi_groups)}, | ||||
| 	{"uart", mt7986_uart_groups, ARRAY_SIZE(mt7986_uart_groups)}, | ||||
| 	{"watchdog", mt7986_wdt_groups, ARRAY_SIZE(mt7986_wdt_groups)}, | ||||
| 	{"wifi", mt7986_wf_groups, ARRAY_SIZE(mt7986_wf_groups)}, | ||||
| 	{"jtag", mt7986_jtag_groups, ARRAY_SIZE(mt7986_jtag_groups)}, | ||||
| }; | ||||
|  | ||||
| static const struct mtk_eint_hw mt7986a_eint_hw = { | ||||
| 	.port_mask = 7, | ||||
| 	.ports = 7, | ||||
| 	.ap_num = ARRAY_SIZE(mt7986a_pins), | ||||
| 	.db_cnt = 16, | ||||
| }; | ||||
|  | ||||
| static const struct mtk_eint_hw mt7986b_eint_hw = { | ||||
| 	.port_mask = 7, | ||||
| 	.ports = 7, | ||||
| 	.ap_num = ARRAY_SIZE(mt7986b_pins), | ||||
| 	.db_cnt = 16, | ||||
| }; | ||||
|  | ||||
| static struct mtk_pin_soc mt7986a_data = { | ||||
| 	.reg_cal = mt7986_reg_cals, | ||||
| 	.pins = mt7986a_pins, | ||||
| 	.npins = ARRAY_SIZE(mt7986a_pins), | ||||
| 	.grps = mt7986_groups, | ||||
| 	.ngrps = ARRAY_SIZE(mt7986_groups), | ||||
| 	.funcs = mt7986_functions, | ||||
| 	.nfuncs = ARRAY_SIZE(mt7986_functions), | ||||
| 	.eint_hw = &mt7986a_eint_hw, | ||||
| 	.gpio_m = 0, | ||||
| 	.ies_present = false, | ||||
| 	.base_names = mt7986_pinctrl_register_base_names, | ||||
| 	.nbase_names = ARRAY_SIZE(mt7986_pinctrl_register_base_names), | ||||
| 	.bias_set_combo = mtk_pinconf_bias_set_combo, | ||||
| 	.bias_get_combo = mtk_pinconf_bias_get_combo, | ||||
| 	.drive_set = mtk_pinconf_drive_set_rev1, | ||||
| 	.drive_get = mtk_pinconf_drive_get_rev1, | ||||
| 	.adv_pull_get = mtk_pinconf_adv_pull_get, | ||||
| 	.adv_pull_set = mtk_pinconf_adv_pull_set, | ||||
| }; | ||||
|  | ||||
| static struct mtk_pin_soc mt7986b_data = { | ||||
| 	.reg_cal = mt7986_reg_cals, | ||||
| 	.pins = mt7986b_pins, | ||||
| 	.npins = ARRAY_SIZE(mt7986b_pins), | ||||
| 	.grps = mt7986_groups, | ||||
| 	.ngrps = ARRAY_SIZE(mt7986_groups), | ||||
| 	.funcs = mt7986_functions, | ||||
| 	.nfuncs = ARRAY_SIZE(mt7986_functions), | ||||
| 	.eint_hw = &mt7986b_eint_hw, | ||||
| 	.gpio_m = 0, | ||||
| 	.ies_present = false, | ||||
| 	.base_names = mt7986_pinctrl_register_base_names, | ||||
| 	.nbase_names = ARRAY_SIZE(mt7986_pinctrl_register_base_names), | ||||
| 	.bias_set_combo = mtk_pinconf_bias_set_combo, | ||||
| 	.bias_get_combo = mtk_pinconf_bias_get_combo, | ||||
| 	.drive_set = mtk_pinconf_drive_set_rev1, | ||||
| 	.drive_get = mtk_pinconf_drive_get_rev1, | ||||
| 	.adv_pull_get = mtk_pinconf_adv_pull_get, | ||||
| 	.adv_pull_set = mtk_pinconf_adv_pull_set, | ||||
| }; | ||||
|  | ||||
| static const struct of_device_id mt7986a_pinctrl_of_match[] = { | ||||
| 	{.compatible = "mediatek,mt7986a-pinctrl",}, | ||||
| 	{} | ||||
| }; | ||||
|  | ||||
| static const struct of_device_id mt7986b_pinctrl_of_match[] = { | ||||
| 	{.compatible = "mediatek,mt7986b-pinctrl",}, | ||||
| 	{} | ||||
| }; | ||||
|  | ||||
| static int mt7986a_pinctrl_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	return mtk_moore_pinctrl_probe(pdev, &mt7986a_data); | ||||
| } | ||||
|  | ||||
| static int mt7986b_pinctrl_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	return mtk_moore_pinctrl_probe(pdev, &mt7986b_data); | ||||
| } | ||||
|  | ||||
| static struct platform_driver mt7986a_pinctrl_driver = { | ||||
| 	.driver = { | ||||
| 		.name = "mt7986a-pinctrl", | ||||
| 		.of_match_table = mt7986a_pinctrl_of_match, | ||||
| 	}, | ||||
| 	.probe = mt7986a_pinctrl_probe, | ||||
| }; | ||||
|  | ||||
| static struct platform_driver mt7986b_pinctrl_driver = { | ||||
| 	.driver = { | ||||
| 		.name = "mt7986b-pinctrl", | ||||
| 		.of_match_table = mt7986b_pinctrl_of_match, | ||||
| 	}, | ||||
| 	.probe = mt7986b_pinctrl_probe, | ||||
| }; | ||||
|  | ||||
| static int __init mt7986a_pinctrl_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&mt7986a_pinctrl_driver); | ||||
| } | ||||
|  | ||||
| static int __init mt7986b_pinctrl_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&mt7986b_pinctrl_driver); | ||||
| } | ||||
|  | ||||
| arch_initcall(mt7986a_pinctrl_init); | ||||
| arch_initcall(mt7986b_pinctrl_init); | ||||
| @@ -0,0 +1,169 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||||
| /* | ||||
|  * Copyright (c) 2021 MediaTek Inc. | ||||
|  * Author: Sam Shih <sam.shih@mediatek.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef _DT_BINDINGS_CLK_MT7986_H | ||||
| #define _DT_BINDINGS_CLK_MT7986_H | ||||
|  | ||||
| /* APMIXEDSYS */ | ||||
|  | ||||
| #define CLK_APMIXED_ARMPLL		0 | ||||
| #define CLK_APMIXED_NET2PLL		1 | ||||
| #define CLK_APMIXED_MMPLL		2 | ||||
| #define CLK_APMIXED_SGMPLL		3 | ||||
| #define CLK_APMIXED_WEDMCUPLL		4 | ||||
| #define CLK_APMIXED_NET1PLL		5 | ||||
| #define CLK_APMIXED_MPLL		6 | ||||
| #define CLK_APMIXED_APLL2		7 | ||||
|  | ||||
| /* TOPCKGEN */ | ||||
|  | ||||
| #define CLK_TOP_XTAL			0 | ||||
| #define CLK_TOP_XTAL_D2			1 | ||||
| #define CLK_TOP_RTC_32K			2 | ||||
| #define CLK_TOP_RTC_32P7K		3 | ||||
| #define CLK_TOP_MPLL_D2			4 | ||||
| #define CLK_TOP_MPLL_D4			5 | ||||
| #define CLK_TOP_MPLL_D8			6 | ||||
| #define CLK_TOP_MPLL_D8_D2		7 | ||||
| #define CLK_TOP_MPLL_D3_D2		8 | ||||
| #define CLK_TOP_MMPLL_D2		9 | ||||
| #define CLK_TOP_MMPLL_D4		10 | ||||
| #define CLK_TOP_MMPLL_D8		11 | ||||
| #define CLK_TOP_MMPLL_D8_D2		12 | ||||
| #define CLK_TOP_MMPLL_D3_D8		13 | ||||
| #define CLK_TOP_MMPLL_U2PHY		14 | ||||
| #define CLK_TOP_APLL2_D4		15 | ||||
| #define CLK_TOP_NET1PLL_D4		16 | ||||
| #define CLK_TOP_NET1PLL_D5		17 | ||||
| #define CLK_TOP_NET1PLL_D5_D2		18 | ||||
| #define CLK_TOP_NET1PLL_D5_D4		19 | ||||
| #define CLK_TOP_NET1PLL_D8_D2		20 | ||||
| #define CLK_TOP_NET1PLL_D8_D4		21 | ||||
| #define CLK_TOP_NET2PLL_D4		22 | ||||
| #define CLK_TOP_NET2PLL_D4_D2		23 | ||||
| #define CLK_TOP_NET2PLL_D3_D2		24 | ||||
| #define CLK_TOP_WEDMCUPLL_D5_D2		25 | ||||
| #define CLK_TOP_NFI1X_SEL		26 | ||||
| #define CLK_TOP_SPINFI_SEL		27 | ||||
| #define CLK_TOP_SPI_SEL			28 | ||||
| #define CLK_TOP_SPIM_MST_SEL		29 | ||||
| #define CLK_TOP_UART_SEL		30 | ||||
| #define CLK_TOP_PWM_SEL			31 | ||||
| #define CLK_TOP_I2C_SEL			32 | ||||
| #define CLK_TOP_PEXTP_TL_SEL		33 | ||||
| #define CLK_TOP_EMMC_250M_SEL		34 | ||||
| #define CLK_TOP_EMMC_416M_SEL		35 | ||||
| #define CLK_TOP_F_26M_ADC_SEL		36 | ||||
| #define CLK_TOP_DRAMC_SEL		37 | ||||
| #define CLK_TOP_DRAMC_MD32_SEL		38 | ||||
| #define CLK_TOP_SYSAXI_SEL		39 | ||||
| #define CLK_TOP_SYSAPB_SEL		40 | ||||
| #define CLK_TOP_ARM_DB_MAIN_SEL		41 | ||||
| #define CLK_TOP_ARM_DB_JTSEL		42 | ||||
| #define CLK_TOP_NETSYS_SEL		43 | ||||
| #define CLK_TOP_NETSYS_500M_SEL		44 | ||||
| #define CLK_TOP_NETSYS_MCU_SEL		45 | ||||
| #define CLK_TOP_NETSYS_2X_SEL		46 | ||||
| #define CLK_TOP_SGM_325M_SEL		47 | ||||
| #define CLK_TOP_SGM_REG_SEL		48 | ||||
| #define CLK_TOP_A1SYS_SEL		49 | ||||
| #define CLK_TOP_CONN_MCUSYS_SEL		50 | ||||
| #define CLK_TOP_EIP_B_SEL		51 | ||||
| #define CLK_TOP_PCIE_PHY_SEL		52 | ||||
| #define CLK_TOP_USB3_PHY_SEL		53 | ||||
| #define CLK_TOP_F26M_SEL		54 | ||||
| #define CLK_TOP_AUD_L_SEL		55 | ||||
| #define CLK_TOP_A_TUNER_SEL		56 | ||||
| #define CLK_TOP_U2U3_SEL		57 | ||||
| #define CLK_TOP_U2U3_SYS_SEL		58 | ||||
| #define CLK_TOP_U2U3_XHCI_SEL		59 | ||||
| #define CLK_TOP_DA_U2_REFSEL		60 | ||||
| #define CLK_TOP_DA_U2_CK_1P_SEL		61 | ||||
| #define CLK_TOP_AP2CNN_HOST_SEL		62 | ||||
| #define CLK_TOP_JTAG			63 | ||||
|  | ||||
| /* INFRACFG */ | ||||
|  | ||||
| #define CLK_INFRA_SYSAXI_D2		0 | ||||
| #define CLK_INFRA_UART0_SEL		1 | ||||
| #define CLK_INFRA_UART1_SEL		2 | ||||
| #define CLK_INFRA_UART2_SEL		3 | ||||
| #define CLK_INFRA_SPI0_SEL		4 | ||||
| #define CLK_INFRA_SPI1_SEL		5 | ||||
| #define CLK_INFRA_PWM1_SEL		6 | ||||
| #define CLK_INFRA_PWM2_SEL		7 | ||||
| #define CLK_INFRA_PWM_BSEL		8 | ||||
| #define CLK_INFRA_PCIE_SEL		9 | ||||
| #define CLK_INFRA_GPT_STA		10 | ||||
| #define CLK_INFRA_PWM_HCK		11 | ||||
| #define CLK_INFRA_PWM_STA		12 | ||||
| #define CLK_INFRA_PWM1_CK		13 | ||||
| #define CLK_INFRA_PWM2_CK		14 | ||||
| #define CLK_INFRA_CQ_DMA_CK		15 | ||||
| #define CLK_INFRA_EIP97_CK		16 | ||||
| #define CLK_INFRA_AUD_BUS_CK		17 | ||||
| #define CLK_INFRA_AUD_26M_CK		18 | ||||
| #define CLK_INFRA_AUD_L_CK		19 | ||||
| #define CLK_INFRA_AUD_AUD_CK		20 | ||||
| #define CLK_INFRA_AUD_EG2_CK		21 | ||||
| #define CLK_INFRA_DRAMC_26M_CK		22 | ||||
| #define CLK_INFRA_DBG_CK		23 | ||||
| #define CLK_INFRA_AP_DMA_CK		24 | ||||
| #define CLK_INFRA_SEJ_CK		25 | ||||
| #define CLK_INFRA_SEJ_13M_CK		26 | ||||
| #define CLK_INFRA_THERM_CK		27 | ||||
| #define CLK_INFRA_I2C0_CK		28 | ||||
| #define CLK_INFRA_UART0_CK		29 | ||||
| #define CLK_INFRA_UART1_CK		30 | ||||
| #define CLK_INFRA_UART2_CK		31 | ||||
| #define CLK_INFRA_NFI1_CK		32 | ||||
| #define CLK_INFRA_SPINFI1_CK		33 | ||||
| #define CLK_INFRA_NFI_HCK_CK		34 | ||||
| #define CLK_INFRA_SPI0_CK		35 | ||||
| #define CLK_INFRA_SPI1_CK		36 | ||||
| #define CLK_INFRA_SPI0_HCK_CK		37 | ||||
| #define CLK_INFRA_SPI1_HCK_CK		38 | ||||
| #define CLK_INFRA_FRTC_CK		39 | ||||
| #define CLK_INFRA_MSDC_CK		40 | ||||
| #define CLK_INFRA_MSDC_HCK_CK		41 | ||||
| #define CLK_INFRA_MSDC_133M_CK		42 | ||||
| #define CLK_INFRA_MSDC_66M_CK		43 | ||||
| #define CLK_INFRA_ADC_26M_CK		44 | ||||
| #define CLK_INFRA_ADC_FRC_CK		45 | ||||
| #define CLK_INFRA_FBIST2FPC_CK		46 | ||||
| #define CLK_INFRA_IUSB_133_CK		47 | ||||
| #define CLK_INFRA_IUSB_66M_CK		48 | ||||
| #define CLK_INFRA_IUSB_SYS_CK		49 | ||||
| #define CLK_INFRA_IUSB_CK		50 | ||||
| #define CLK_INFRA_IPCIE_CK		51 | ||||
| #define CLK_INFRA_IPCIE_PIPE_CK		52 | ||||
| #define CLK_INFRA_IPCIER_CK		53 | ||||
| #define CLK_INFRA_IPCIEB_CK		54 | ||||
| #define CLK_INFRA_TRNG_CK		55 | ||||
|  | ||||
| /* SGMIISYS_0 */ | ||||
|  | ||||
| #define CLK_SGMII0_TX250M_EN		0 | ||||
| #define CLK_SGMII0_RX250M_EN		1 | ||||
| #define CLK_SGMII0_CDR_REF		2 | ||||
| #define CLK_SGMII0_CDR_FB		3 | ||||
|  | ||||
| /* SGMIISYS_1 */ | ||||
|  | ||||
| #define CLK_SGMII1_TX250M_EN		0 | ||||
| #define CLK_SGMII1_RX250M_EN		1 | ||||
| #define CLK_SGMII1_CDR_REF		2 | ||||
| #define CLK_SGMII1_CDR_FB		3 | ||||
|  | ||||
| /* ETHSYS */ | ||||
|  | ||||
| #define CLK_ETH_FE_EN			0 | ||||
| #define CLK_ETH_GP2_EN			1 | ||||
| #define CLK_ETH_GP1_EN			2 | ||||
| #define CLK_ETH_WOCPU1_EN		3 | ||||
| #define CLK_ETH_WOCPU0_EN		4 | ||||
|  | ||||
| #endif /* _DT_BINDINGS_CLK_MT7986_H */ | ||||
| @@ -0,0 +1,10 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0 */ | ||||
| /* Copyright (c) 2021 MediaTek Inc. */ | ||||
|  | ||||
| #ifndef _DT_BINDINGS_RESET_MT7986 | ||||
| #define _DT_BINDINGS_RESET_MT7986 | ||||
|  | ||||
| #define MT7986_TOPRGU_CONSYS_RST	23 | ||||
| #define MT7986_TOPRGU_SW_RST_NUM	32 | ||||
|  | ||||
| #endif  /* _DT_BINDINGS_RESET_MT7986 */ | ||||
| @@ -70,6 +70,7 @@ CONFIG_COMMON_CLK_MT7622=y | ||||
| CONFIG_COMMON_CLK_MT7622_AUDSYS=y | ||||
| CONFIG_COMMON_CLK_MT7622_ETHSYS=y | ||||
| CONFIG_COMMON_CLK_MT7622_HIFSYS=y | ||||
| # CONFIG_COMMON_CLK_MT7986 is not set | ||||
| # CONFIG_COMMON_CLK_MT8173 is not set | ||||
| CONFIG_COMMON_CLK_MT8183=y | ||||
| # CONFIG_COMMON_CLK_MT8183_AUDIOSYS is not set | ||||
| @@ -334,6 +335,7 @@ CONFIG_PINCTRL=y | ||||
| # CONFIG_PINCTRL_MT6765 is not set | ||||
| # CONFIG_PINCTRL_MT6797 is not set | ||||
| CONFIG_PINCTRL_MT7622=y | ||||
| # CONFIG_PINCTRL_MT7986 is not set | ||||
| # CONFIG_PINCTRL_MT8173 is not set | ||||
| # CONFIG_PINCTRL_MT8183 is not set | ||||
| CONFIG_PINCTRL_MT8516=y | ||||
|   | ||||
| @@ -67,6 +67,7 @@ CONFIG_COMMON_CLK_MT2701_MMSYS=y | ||||
| CONFIG_COMMON_CLK_MT2701_VDECSYS=y | ||||
| # CONFIG_COMMON_CLK_MT7622 is not set | ||||
| # CONFIG_COMMON_CLK_MT7629 is not set | ||||
| # CONFIG_COMMON_CLK_MT7986 is not set | ||||
| # CONFIG_COMMON_CLK_MT8135 is not set | ||||
| # CONFIG_COMMON_CLK_MT8173 is not set | ||||
| CONFIG_COMMON_CLK_MT8516=y | ||||
| @@ -428,6 +429,7 @@ CONFIG_PINCTRL=y | ||||
| CONFIG_PINCTRL_MT2701=y | ||||
| CONFIG_PINCTRL_MT6397=y | ||||
| CONFIG_PINCTRL_MT7623=y | ||||
| # CONFIG_PINCTRL_MT7986 is not set | ||||
| CONFIG_PINCTRL_MTK=y | ||||
| CONFIG_PINCTRL_MTK_MOORE=y | ||||
| CONFIG_PINCTRL_MTK_V2=y | ||||
|   | ||||
| @@ -51,6 +51,7 @@ CONFIG_COMMON_CLK_MEDIATEK=y | ||||
| CONFIG_COMMON_CLK_MT7629=y | ||||
| CONFIG_COMMON_CLK_MT7629_ETHSYS=y | ||||
| CONFIG_COMMON_CLK_MT7629_HIFSYS=y | ||||
| # CONFIG_COMMON_CLK_MT7986 is not set | ||||
| # CONFIG_COMMON_CLK_MT8135 is not set | ||||
| # CONFIG_COMMON_CLK_MT8173 is not set | ||||
| CONFIG_COMMON_CLK_MT8516=y | ||||
| @@ -238,6 +239,7 @@ CONFIG_PHY_MTK_TPHY=y | ||||
| # CONFIG_PHY_MTK_XSPHY is not set | ||||
| CONFIG_PINCTRL=y | ||||
| CONFIG_PINCTRL_MT7629=y | ||||
| # CONFIG_PINCTRL_MT7986 is not set | ||||
| CONFIG_PINCTRL_MTK_MOORE=y | ||||
| CONFIG_PINCTRL_MTK_V2=y | ||||
| CONFIG_PM=y | ||||
|   | ||||
| @@ -0,0 +1,26 @@ | ||||
| --- a/drivers/pinctrl/mediatek/Kconfig | ||||
| +++ b/drivers/pinctrl/mediatek/Kconfig | ||||
| @@ -120,6 +120,13 @@ config PINCTRL_MT7622 | ||||
|  	default ARM64 && ARCH_MEDIATEK | ||||
|  	select PINCTRL_MTK_MOORE | ||||
|   | ||||
| +config PINCTRL_MT7986 | ||||
| +	bool "Mediatek MT7986 pin control" | ||||
| +	depends on OF | ||||
| +	depends on ARM64 || COMPILE_TEST | ||||
| +	default ARM64 && ARCH_MEDIATEK | ||||
| +	select PINCTRL_MTK_MOORE | ||||
| + | ||||
|  config PINCTRL_MT8167 | ||||
|  	bool "Mediatek MT8167 pin control" | ||||
|  	depends on OF | ||||
| --- a/drivers/pinctrl/mediatek/Makefile | ||||
| +++ b/drivers/pinctrl/mediatek/Makefile | ||||
| @@ -17,6 +17,7 @@ obj-$(CONFIG_PINCTRL_MT6797)	+= pinctrl- | ||||
|  obj-$(CONFIG_PINCTRL_MT7622)	+= pinctrl-mt7622.o | ||||
|  obj-$(CONFIG_PINCTRL_MT7623)	+= pinctrl-mt7623.o | ||||
|  obj-$(CONFIG_PINCTRL_MT7629)	+= pinctrl-mt7629.o | ||||
| +obj-$(CONFIG_PINCTRL_MT7986)	+= pinctrl-mt7986.o | ||||
|  obj-$(CONFIG_PINCTRL_MT8167)	+= pinctrl-mt8167.o | ||||
|  obj-$(CONFIG_PINCTRL_MT8173)	+= pinctrl-mt8173.o | ||||
|  obj-$(CONFIG_PINCTRL_MT8183)	+= pinctrl-mt8183.o | ||||
| @@ -0,0 +1,28 @@ | ||||
| --- a/drivers/clk/mediatek/clk-mtk.c | ||||
| +++ b/drivers/clk/mediatek/clk-mtk.c | ||||
| @@ -43,6 +43,15 @@ err_out: | ||||
|  	return NULL; | ||||
|  } | ||||
|   | ||||
| +void mtk_free_clk_data(struct clk_onecell_data *clk_data) | ||||
| +{ | ||||
| +	if (!clk_data) | ||||
| +		return; | ||||
| + | ||||
| +	kfree(clk_data->clks); | ||||
| +	kfree(clk_data); | ||||
| +} | ||||
| + | ||||
|  void mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks, | ||||
|  		int num, struct clk_onecell_data *clk_data) | ||||
|  { | ||||
| --- a/drivers/clk/mediatek/clk-mtk.h | ||||
| +++ b/drivers/clk/mediatek/clk-mtk.h | ||||
| @@ -202,6 +202,7 @@ void mtk_clk_register_dividers(const str | ||||
|  				struct clk_onecell_data *clk_data); | ||||
|   | ||||
|  struct clk_onecell_data *mtk_alloc_clk_data(unsigned int clk_num); | ||||
| +void mtk_free_clk_data(struct clk_onecell_data *clk_data); | ||||
|   | ||||
|  #define HAVE_RST_BAR	BIT(0) | ||||
|  #define PLL_AO		BIT(1) | ||||
| @@ -0,0 +1,39 @@ | ||||
| --- a/drivers/clk/mediatek/Kconfig | ||||
| +++ b/drivers/clk/mediatek/Kconfig | ||||
| @@ -344,6 +344,23 @@ config COMMON_CLK_MT7629_HIFSYS | ||||
|  	  This driver supports MediaTek MT7629 HIFSYS clocks providing | ||||
|  	  to PCI-E and USB. | ||||
|   | ||||
| +config COMMON_CLK_MT7986 | ||||
| +	bool "Clock driver for MediaTek MT7986" | ||||
| +	depends on ARCH_MEDIATEK || COMPILE_TEST | ||||
| +	select COMMON_CLK_MEDIATEK | ||||
| +	default ARCH_MEDIATEK | ||||
| +	help | ||||
| +	  This driver supports MediaTek MT7986 basic clocks and clocks | ||||
| +	  required for various periperals found on MediaTek. | ||||
| + | ||||
| +config COMMON_CLK_MT7986_ETHSYS | ||||
| +	bool "Clock driver for MediaTek MT7986 ETHSYS" | ||||
| +	depends on COMMON_CLK_MT7986 | ||||
| +	default COMMON_CLK_MT7986 | ||||
| +	help | ||||
| +	  This driver add support for clocks for Ethernet and SGMII | ||||
| +	  required on MediaTek MT7986 SoC. | ||||
| + | ||||
|  config COMMON_CLK_MT8135 | ||||
|  	bool "Clock driver for MediaTek MT8135" | ||||
|  	depends on (ARCH_MEDIATEK && ARM) || COMPILE_TEST | ||||
| --- a/drivers/clk/mediatek/Makefile | ||||
| +++ b/drivers/clk/mediatek/Makefile | ||||
| @@ -46,6 +46,10 @@ obj-$(CONFIG_COMMON_CLK_MT7622_AUDSYS) + | ||||
|  obj-$(CONFIG_COMMON_CLK_MT7629) += clk-mt7629.o | ||||
|  obj-$(CONFIG_COMMON_CLK_MT7629_ETHSYS) += clk-mt7629-eth.o | ||||
|  obj-$(CONFIG_COMMON_CLK_MT7629_HIFSYS) += clk-mt7629-hif.o | ||||
| +obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-apmixed.o | ||||
| +obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-topckgen.o | ||||
| +obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-infracfg.o | ||||
| +obj-$(CONFIG_COMMON_CLK_MT7986_ETHSYS) += clk-mt7986-eth.o | ||||
|  obj-$(CONFIG_COMMON_CLK_MT8135) += clk-mt8135.o | ||||
|  obj-$(CONFIG_COMMON_CLK_MT8167) += clk-mt8167.o | ||||
|  obj-$(CONFIG_COMMON_CLK_MT8167_AUDSYS) += clk-mt8167-aud.o | ||||
| @@ -0,0 +1,917 @@ | ||||
| From 7d99750f96fc6904d54affebdc8c9b0bfae1e9e8 Mon Sep 17 00:00:00 2001 | ||||
| From: Sam Shih <sam.shih@mediatek.com> | ||||
| Date: Sun, 17 Apr 2022 11:40:22 +0800 | ||||
| Subject: [PATCH] spi: mediatek: backport document and driver to support mt7986 | ||||
|  spi design | ||||
|  | ||||
| this patch add the support of ipm design and upgrade devicetree binding | ||||
|  | ||||
| The patch is comming from following threads | ||||
| - https://lore.kernel.org/all/20220315032411.2826-1-leilk.liu@mediatek.com/ | ||||
| - https://lore.kernel.org/all/20220401071616.8874-1-leilk.liu@mediatek.com/ | ||||
|  | ||||
| Signed-off-by: Sam Shih <sam.shih@mediatek.com> | ||||
| --- | ||||
|  .../bindings/spi/mediatek,spi-mt65xx.yaml     | 111 ++++ | ||||
|  drivers/spi/spi-mt65xx.c                      | 509 ++++++++++++++++-- | ||||
|  2 files changed, 572 insertions(+), 48 deletions(-) | ||||
|  create mode 100644 Documentation/devicetree/bindings/spi/mediatek,spi-mt65xx.yaml | ||||
|  | ||||
| --- /dev/null | ||||
| +++ b/Documentation/devicetree/bindings/spi/mediatek,spi-mt65xx.yaml | ||||
| @@ -0,0 +1,111 @@ | ||||
| +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| +%YAML 1.2 | ||||
| +--- | ||||
| +$id: http://devicetree.org/schemas/spi/mediatek,spi-mt65xx.yaml# | ||||
| +$schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| + | ||||
| +title: SPI Bus controller for MediaTek ARM SoCs | ||||
| + | ||||
| +maintainers: | ||||
| +  - Leilk Liu <leilk.liu@mediatek.com> | ||||
| + | ||||
| +allOf: | ||||
| +  - $ref: "/schemas/spi/spi-controller.yaml#" | ||||
| + | ||||
| +properties: | ||||
| +  compatible: | ||||
| +    oneOf: | ||||
| +      - items: | ||||
| +          - enum: | ||||
| +              - mediatek,mt7629-spi | ||||
| +          - const: mediatek,mt7622-spi | ||||
| +      - items: | ||||
| +          - enum: | ||||
| +              - mediatek,mt8516-spi | ||||
| +          - const: mediatek,mt2712-spi | ||||
| +      - items: | ||||
| +          - enum: | ||||
| +              - mediatek,mt6779-spi | ||||
| +              - mediatek,mt8186-spi | ||||
| +              - mediatek,mt8192-spi | ||||
| +              - mediatek,mt8195-spi | ||||
| +          - const: mediatek,mt6765-spi | ||||
| +      - items: | ||||
| +          - enum: | ||||
| +              - mediatek,mt7986-spi-ipm | ||||
| +          - const: mediatek,spi-ipm | ||||
| +      - items: | ||||
| +          - enum: | ||||
| +              - mediatek,mt2701-spi | ||||
| +              - mediatek,mt2712-spi | ||||
| +              - mediatek,mt6589-spi | ||||
| +              - mediatek,mt6765-spi | ||||
| +              - mediatek,mt6893-spi | ||||
| +              - mediatek,mt7622-spi | ||||
| +              - mediatek,mt8135-spi | ||||
| +              - mediatek,mt8173-spi | ||||
| +              - mediatek,mt8183-spi | ||||
| + | ||||
| +  reg: | ||||
| +    maxItems: 1 | ||||
| + | ||||
| +  interrupts: | ||||
| +    maxItems: 1 | ||||
| + | ||||
| +  clocks: | ||||
| +    minItems: 3 | ||||
| +    items: | ||||
| +      - description: clock used for the parent clock | ||||
| +      - description: clock used for the muxes clock | ||||
| +      - description: clock used for the clock gate | ||||
| +      - description: clock used for the AHB bus, this clock is optional | ||||
| + | ||||
| +  clock-names: | ||||
| +    minItems: 3 | ||||
| +    items: | ||||
| +      - const: parent-clk | ||||
| +      - const: sel-clk | ||||
| +      - const: spi-clk | ||||
| +      - const: hclk | ||||
| + | ||||
| +  mediatek,pad-select: | ||||
| +    $ref: /schemas/types.yaml#/definitions/uint32-array | ||||
| +    minItems: 1 | ||||
| +    maxItems: 4 | ||||
| +    items: | ||||
| +      enum: [0, 1, 2, 3] | ||||
| +    description: | ||||
| +      specify which pins group(ck/mi/mo/cs) spi controller used. | ||||
| +      This is an array. | ||||
| + | ||||
| +required: | ||||
| +  - compatible | ||||
| +  - reg | ||||
| +  - interrupts | ||||
| +  - clocks | ||||
| +  - clock-names | ||||
| +  - '#address-cells' | ||||
| +  - '#size-cells' | ||||
| + | ||||
| +unevaluatedProperties: false | ||||
| + | ||||
| +examples: | ||||
| +  - | | ||||
| +    #include <dt-bindings/clock/mt8173-clk.h> | ||||
| +    #include <dt-bindings/gpio/gpio.h> | ||||
| +    #include <dt-bindings/interrupt-controller/arm-gic.h> | ||||
| +    #include <dt-bindings/interrupt-controller/irq.h> | ||||
| + | ||||
| +    spi@1100a000 { | ||||
| +      compatible = "mediatek,mt8173-spi"; | ||||
| +      #address-cells = <1>; | ||||
| +      #size-cells = <0>; | ||||
| +      reg = <0x1100a000 0x1000>; | ||||
| +      interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_LOW>; | ||||
| +      clocks = <&topckgen CLK_TOP_SYSPLL3_D2>, | ||||
| +               <&topckgen CLK_TOP_SPI_SEL>, | ||||
| +               <&pericfg CLK_PERI_SPI0>; | ||||
| +      clock-names = "parent-clk", "sel-clk", "spi-clk"; | ||||
| +      cs-gpios = <&pio 105 GPIO_ACTIVE_LOW>, <&pio 72 GPIO_ACTIVE_LOW>; | ||||
| +      mediatek,pad-select = <1>, <0>; | ||||
| +    }; | ||||
| --- a/drivers/spi/spi-mt65xx.c | ||||
| +++ b/drivers/spi/spi-mt65xx.c | ||||
| @@ -12,11 +12,12 @@ | ||||
|  #include <linux/ioport.h> | ||||
|  #include <linux/module.h> | ||||
|  #include <linux/of.h> | ||||
| -#include <linux/of_gpio.h> | ||||
| +#include <linux/gpio/consumer.h> | ||||
|  #include <linux/platform_device.h> | ||||
|  #include <linux/platform_data/spi-mt65xx.h> | ||||
|  #include <linux/pm_runtime.h> | ||||
|  #include <linux/spi/spi.h> | ||||
| +#include <linux/spi/spi-mem.h> | ||||
|  #include <linux/dma-mapping.h> | ||||
|   | ||||
|  #define SPI_CFG0_REG                      0x0000 | ||||
| @@ -31,6 +32,7 @@ | ||||
|  #define SPI_CFG2_REG                      0x0028 | ||||
|  #define SPI_TX_SRC_REG_64                 0x002c | ||||
|  #define SPI_RX_DST_REG_64                 0x0030 | ||||
| +#define SPI_CFG3_IPM_REG                  0x0040 | ||||
|   | ||||
|  #define SPI_CFG0_SCK_HIGH_OFFSET          0 | ||||
|  #define SPI_CFG0_SCK_LOW_OFFSET           8 | ||||
| @@ -51,6 +53,7 @@ | ||||
|  #define SPI_CFG1_CS_IDLE_MASK             0xff | ||||
|  #define SPI_CFG1_PACKET_LOOP_MASK         0xff00 | ||||
|  #define SPI_CFG1_PACKET_LENGTH_MASK       0x3ff0000 | ||||
| +#define SPI_CFG1_IPM_PACKET_LENGTH_MASK   GENMASK(31, 16) | ||||
|  #define SPI_CFG2_SCK_HIGH_OFFSET          0 | ||||
|  #define SPI_CFG2_SCK_LOW_OFFSET           16 | ||||
|   | ||||
| @@ -71,6 +74,24 @@ | ||||
|  #define SPI_CMD_TX_ENDIAN            BIT(15) | ||||
|  #define SPI_CMD_FINISH_IE            BIT(16) | ||||
|  #define SPI_CMD_PAUSE_IE             BIT(17) | ||||
| +#define SPI_CMD_IPM_NONIDLE_MODE     BIT(19) | ||||
| +#define SPI_CMD_IPM_SPIM_LOOP        BIT(21) | ||||
| +#define SPI_CMD_IPM_GET_TICKDLY_OFFSET    22 | ||||
| + | ||||
| +#define SPI_CMD_IPM_GET_TICKDLY_MASK	GENMASK(24, 22) | ||||
| + | ||||
| +#define PIN_MODE_CFG(x)	((x) / 2) | ||||
| + | ||||
| +#define SPI_CFG3_IPM_HALF_DUPLEX_DIR		BIT(2) | ||||
| +#define SPI_CFG3_IPM_HALF_DUPLEX_EN		BIT(3) | ||||
| +#define SPI_CFG3_IPM_XMODE_EN			BIT(4) | ||||
| +#define SPI_CFG3_IPM_NODATA_FLAG		BIT(5) | ||||
| +#define SPI_CFG3_IPM_CMD_BYTELEN_OFFSET		8 | ||||
| +#define SPI_CFG3_IPM_ADDR_BYTELEN_OFFSET	12 | ||||
| + | ||||
| +#define SPI_CFG3_IPM_CMD_PIN_MODE_MASK		GENMASK(1, 0) | ||||
| +#define SPI_CFG3_IPM_CMD_BYTELEN_MASK		GENMASK(11, 8) | ||||
| +#define SPI_CFG3_IPM_ADDR_BYTELEN_MASK		GENMASK(15, 12) | ||||
|   | ||||
|  #define MT8173_SPI_MAX_PAD_SEL 3 | ||||
|   | ||||
| @@ -81,6 +102,9 @@ | ||||
|   | ||||
|  #define MTK_SPI_MAX_FIFO_SIZE 32U | ||||
|  #define MTK_SPI_PACKET_SIZE 1024 | ||||
| +#define MTK_SPI_IPM_PACKET_SIZE SZ_64K | ||||
| +#define MTK_SPI_IPM_PACKET_LOOP SZ_256 | ||||
| + | ||||
|  #define MTK_SPI_32BITS_MASK  (0xffffffff) | ||||
|   | ||||
|  #define DMA_ADDR_EXT_BITS (36) | ||||
| @@ -96,6 +120,8 @@ struct mtk_spi_compatible { | ||||
|  	bool dma_ext; | ||||
|  	/* some IC no need unprepare SPI clk */ | ||||
|  	bool no_need_unprepare; | ||||
| +	/* IPM design adjust and extend register to support more features */ | ||||
| +	bool ipm_design; | ||||
|  }; | ||||
|   | ||||
|  struct mtk_spi { | ||||
| @@ -103,7 +129,7 @@ struct mtk_spi { | ||||
|  	u32 state; | ||||
|  	int pad_num; | ||||
|  	u32 *pad_sel; | ||||
| -	struct clk *parent_clk, *sel_clk, *spi_clk; | ||||
| +	struct clk *parent_clk, *sel_clk, *spi_clk, *spi_hclk; | ||||
|  	struct spi_transfer *cur_transfer; | ||||
|  	u32 xfer_len; | ||||
|  	u32 num_xfered; | ||||
| @@ -111,6 +137,11 @@ struct mtk_spi { | ||||
|  	u32 tx_sgl_len, rx_sgl_len; | ||||
|  	const struct mtk_spi_compatible *dev_comp; | ||||
|  	u32 spi_clk_hz; | ||||
| +	struct completion spimem_done; | ||||
| +	bool use_spimem; | ||||
| +	struct device *dev; | ||||
| +	dma_addr_t tx_dma; | ||||
| +	dma_addr_t rx_dma; | ||||
|  }; | ||||
|   | ||||
|  static const struct mtk_spi_compatible mtk_common_compat; | ||||
| @@ -119,6 +150,12 @@ static const struct mtk_spi_compatible m | ||||
|  	.must_tx = true, | ||||
|  }; | ||||
|   | ||||
| +static const struct mtk_spi_compatible mtk_ipm_compat = { | ||||
| +	.enhance_timing = true, | ||||
| +	.dma_ext = true, | ||||
| +	.ipm_design = true, | ||||
| +}; | ||||
| + | ||||
|  static const struct mtk_spi_compatible mt6765_compat = { | ||||
|  	.need_pad_sel = true, | ||||
|  	.must_tx = true, | ||||
| @@ -160,6 +197,9 @@ static const struct mtk_chip_config mtk_ | ||||
|  }; | ||||
|   | ||||
|  static const struct of_device_id mtk_spi_of_match[] = { | ||||
| +	{ .compatible = "mediatek,spi-ipm", | ||||
| +		.data = (void *)&mtk_ipm_compat, | ||||
| +	}, | ||||
|  	{ .compatible = "mediatek,mt2701-spi", | ||||
|  		.data = (void *)&mtk_common_compat, | ||||
|  	}, | ||||
| @@ -278,12 +318,11 @@ static int mtk_spi_set_hw_cs_timing(stru | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -static int mtk_spi_prepare_message(struct spi_master *master, | ||||
| -				   struct spi_message *msg) | ||||
| +static int mtk_spi_hw_init(struct spi_master *master, | ||||
| +			   struct spi_device *spi) | ||||
|  { | ||||
|  	u16 cpha, cpol; | ||||
|  	u32 reg_val; | ||||
| -	struct spi_device *spi = msg->spi; | ||||
|  	struct mtk_chip_config *chip_config = spi->controller_data; | ||||
|  	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
|   | ||||
| @@ -291,6 +330,15 @@ static int mtk_spi_prepare_message(struc | ||||
|  	cpol = spi->mode & SPI_CPOL ? 1 : 0; | ||||
|   | ||||
|  	reg_val = readl(mdata->base + SPI_CMD_REG); | ||||
| +	if (mdata->dev_comp->ipm_design) { | ||||
| +		/* SPI transfer without idle time until packet length done */ | ||||
| +		reg_val |= SPI_CMD_IPM_NONIDLE_MODE; | ||||
| +		if (spi->mode & SPI_LOOP) | ||||
| +			reg_val |= SPI_CMD_IPM_SPIM_LOOP; | ||||
| +		else | ||||
| +			reg_val &= ~SPI_CMD_IPM_SPIM_LOOP; | ||||
| +	} | ||||
| + | ||||
|  	if (cpha) | ||||
|  		reg_val |= SPI_CMD_CPHA; | ||||
|  	else | ||||
| @@ -348,23 +396,39 @@ static int mtk_spi_prepare_message(struc | ||||
|  		       mdata->base + SPI_PAD_SEL_REG); | ||||
|   | ||||
|  	/* tick delay */ | ||||
| -	reg_val = readl(mdata->base + SPI_CFG1_REG); | ||||
|  	if (mdata->dev_comp->enhance_timing) { | ||||
| -		reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK; | ||||
| -		reg_val |= ((chip_config->tick_delay & 0x7) | ||||
| -			    << SPI_CFG1_GET_TICK_DLY_OFFSET); | ||||
| +		if (mdata->dev_comp->ipm_design) { | ||||
| +			reg_val = readl(mdata->base + SPI_CMD_REG); | ||||
| +			reg_val &= ~SPI_CMD_IPM_GET_TICKDLY_MASK; | ||||
| +			reg_val |= ((chip_config->tick_delay & 0x7) | ||||
| +				    << SPI_CMD_IPM_GET_TICKDLY_OFFSET); | ||||
| +			writel(reg_val, mdata->base + SPI_CMD_REG); | ||||
| +		} else { | ||||
| +			reg_val = readl(mdata->base + SPI_CFG1_REG); | ||||
| +			reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK; | ||||
| +			reg_val |= ((chip_config->tick_delay & 0x7) | ||||
| +				    << SPI_CFG1_GET_TICK_DLY_OFFSET); | ||||
| +			writel(reg_val, mdata->base + SPI_CFG1_REG); | ||||
| +		} | ||||
|  	} else { | ||||
| +		reg_val = readl(mdata->base + SPI_CFG1_REG); | ||||
|  		reg_val &= ~SPI_CFG1_GET_TICK_DLY_MASK_V1; | ||||
|  		reg_val |= ((chip_config->tick_delay & 0x3) | ||||
|  			    << SPI_CFG1_GET_TICK_DLY_OFFSET_V1); | ||||
| +		writel(reg_val, mdata->base + SPI_CFG1_REG); | ||||
|  	} | ||||
| -	writel(reg_val, mdata->base + SPI_CFG1_REG); | ||||
|   | ||||
|  	/* set hw cs timing */ | ||||
|  	mtk_spi_set_hw_cs_timing(spi); | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int mtk_spi_prepare_message(struct spi_master *master, | ||||
| +				   struct spi_message *msg) | ||||
| +{ | ||||
| +	return mtk_spi_hw_init(master, msg->spi); | ||||
| +} | ||||
| + | ||||
|  static void mtk_spi_set_cs(struct spi_device *spi, bool enable) | ||||
|  { | ||||
|  	u32 reg_val; | ||||
| @@ -386,13 +450,13 @@ static void mtk_spi_set_cs(struct spi_de | ||||
|  } | ||||
|   | ||||
|  static void mtk_spi_prepare_transfer(struct spi_master *master, | ||||
| -				     struct spi_transfer *xfer) | ||||
| +				     u32 speed_hz) | ||||
|  { | ||||
|  	u32 div, sck_time, reg_val; | ||||
|  	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
|   | ||||
| -	if (xfer->speed_hz < mdata->spi_clk_hz / 2) | ||||
| -		div = DIV_ROUND_UP(mdata->spi_clk_hz, xfer->speed_hz); | ||||
| +	if (speed_hz < mdata->spi_clk_hz / 2) | ||||
| +		div = DIV_ROUND_UP(mdata->spi_clk_hz, speed_hz); | ||||
|  	else | ||||
|  		div = 1; | ||||
|   | ||||
| @@ -423,12 +487,24 @@ static void mtk_spi_setup_packet(struct | ||||
|  	u32 packet_size, packet_loop, reg_val; | ||||
|  	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
|   | ||||
| -	packet_size = min_t(u32, mdata->xfer_len, MTK_SPI_PACKET_SIZE); | ||||
| +	if (mdata->dev_comp->ipm_design) | ||||
| +		packet_size = min_t(u32, | ||||
| +				    mdata->xfer_len, | ||||
| +				    MTK_SPI_IPM_PACKET_SIZE); | ||||
| +	else | ||||
| +		packet_size = min_t(u32, | ||||
| +				    mdata->xfer_len, | ||||
| +				    MTK_SPI_PACKET_SIZE); | ||||
| + | ||||
|  	packet_loop = mdata->xfer_len / packet_size; | ||||
|   | ||||
|  	reg_val = readl(mdata->base + SPI_CFG1_REG); | ||||
| -	reg_val &= ~(SPI_CFG1_PACKET_LENGTH_MASK | SPI_CFG1_PACKET_LOOP_MASK); | ||||
| +	if (mdata->dev_comp->ipm_design) | ||||
| +		reg_val &= ~SPI_CFG1_IPM_PACKET_LENGTH_MASK; | ||||
| +	else | ||||
| +		reg_val &= ~SPI_CFG1_PACKET_LENGTH_MASK; | ||||
|  	reg_val |= (packet_size - 1) << SPI_CFG1_PACKET_LENGTH_OFFSET; | ||||
| +	reg_val &= ~SPI_CFG1_PACKET_LOOP_MASK; | ||||
|  	reg_val |= (packet_loop - 1) << SPI_CFG1_PACKET_LOOP_OFFSET; | ||||
|  	writel(reg_val, mdata->base + SPI_CFG1_REG); | ||||
|  } | ||||
| @@ -523,7 +599,7 @@ static int mtk_spi_fifo_transfer(struct | ||||
|  	mdata->cur_transfer = xfer; | ||||
|  	mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len); | ||||
|  	mdata->num_xfered = 0; | ||||
| -	mtk_spi_prepare_transfer(master, xfer); | ||||
| +	mtk_spi_prepare_transfer(master, xfer->speed_hz); | ||||
|  	mtk_spi_setup_packet(master); | ||||
|   | ||||
|  	if (xfer->tx_buf) { | ||||
| @@ -556,7 +632,7 @@ static int mtk_spi_dma_transfer(struct s | ||||
|  	mdata->cur_transfer = xfer; | ||||
|  	mdata->num_xfered = 0; | ||||
|   | ||||
| -	mtk_spi_prepare_transfer(master, xfer); | ||||
| +	mtk_spi_prepare_transfer(master, xfer->speed_hz); | ||||
|   | ||||
|  	cmd = readl(mdata->base + SPI_CMD_REG); | ||||
|  	if (xfer->tx_buf) | ||||
| @@ -591,6 +667,19 @@ static int mtk_spi_transfer_one(struct s | ||||
|  				struct spi_device *spi, | ||||
|  				struct spi_transfer *xfer) | ||||
|  { | ||||
| +	struct mtk_spi *mdata = spi_master_get_devdata(spi->master); | ||||
| +	u32 reg_val = 0; | ||||
| + | ||||
| +	/* prepare xfer direction and duplex mode */ | ||||
| +	if (mdata->dev_comp->ipm_design) { | ||||
| +		if (!xfer->tx_buf || !xfer->rx_buf) { | ||||
| +			reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_EN; | ||||
| +			if (xfer->rx_buf) | ||||
| +				reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_DIR; | ||||
| +		} | ||||
| +		writel(reg_val, mdata->base + SPI_CFG3_IPM_REG); | ||||
| +	} | ||||
| + | ||||
|  	if (master->can_dma(master, spi, xfer)) | ||||
|  		return mtk_spi_dma_transfer(master, spi, xfer); | ||||
|  	else | ||||
| @@ -614,8 +703,9 @@ static int mtk_spi_setup(struct spi_devi | ||||
|  	if (!spi->controller_data) | ||||
|  		spi->controller_data = (void *)&mtk_default_chip_info; | ||||
|   | ||||
| -	if (mdata->dev_comp->need_pad_sel && gpio_is_valid(spi->cs_gpio)) | ||||
| -		gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); | ||||
| +	if (mdata->dev_comp->need_pad_sel && spi->cs_gpiod) | ||||
| +		/* CS de-asserted, gpiolib will handle inversion */ | ||||
| +		gpiod_direction_output(spi->cs_gpiod, 0); | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -633,6 +723,12 @@ static irqreturn_t mtk_spi_interrupt(int | ||||
|  	else | ||||
|  		mdata->state = MTK_SPI_IDLE; | ||||
|   | ||||
| +	/* SPI-MEM ops */ | ||||
| +	if (mdata->use_spimem) { | ||||
| +		complete(&mdata->spimem_done); | ||||
| +		return IRQ_HANDLED; | ||||
| +	} | ||||
| + | ||||
|  	if (!master->can_dma(master, NULL, trans)) { | ||||
|  		if (trans->rx_buf) { | ||||
|  			cnt = mdata->xfer_len / 4; | ||||
| @@ -716,6 +812,274 @@ static irqreturn_t mtk_spi_interrupt(int | ||||
|  	return IRQ_HANDLED; | ||||
|  } | ||||
|   | ||||
| +static int mtk_spi_mem_adjust_op_size(struct spi_mem *mem, | ||||
| +				      struct spi_mem_op *op) | ||||
| +{ | ||||
| +	int opcode_len; | ||||
| + | ||||
| +	if (op->data.dir != SPI_MEM_NO_DATA) { | ||||
| +		opcode_len = 1 + op->addr.nbytes + op->dummy.nbytes; | ||||
| +		if (opcode_len + op->data.nbytes > MTK_SPI_IPM_PACKET_SIZE) { | ||||
| +			op->data.nbytes = MTK_SPI_IPM_PACKET_SIZE - opcode_len; | ||||
| +			/* force data buffer dma-aligned. */ | ||||
| +			op->data.nbytes -= op->data.nbytes % 4; | ||||
| +		} | ||||
| +	} | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static bool mtk_spi_mem_supports_op(struct spi_mem *mem, | ||||
| +				    const struct spi_mem_op *op) | ||||
| +{ | ||||
| +	if (!spi_mem_default_supports_op(mem, op)) | ||||
| +		return false; | ||||
| + | ||||
| +	if (op->addr.nbytes && op->dummy.nbytes && | ||||
| +	    op->addr.buswidth != op->dummy.buswidth) | ||||
| +		return false; | ||||
| + | ||||
| +	if (op->addr.nbytes + op->dummy.nbytes > 16) | ||||
| +		return false; | ||||
| + | ||||
| +	if (op->data.nbytes > MTK_SPI_IPM_PACKET_SIZE) { | ||||
| +		if (op->data.nbytes / MTK_SPI_IPM_PACKET_SIZE > | ||||
| +		    MTK_SPI_IPM_PACKET_LOOP || | ||||
| +		    op->data.nbytes % MTK_SPI_IPM_PACKET_SIZE != 0) | ||||
| +			return false; | ||||
| +	} | ||||
| + | ||||
| +	return true; | ||||
| +} | ||||
| + | ||||
| +static void mtk_spi_mem_setup_dma_xfer(struct spi_master *master, | ||||
| +				       const struct spi_mem_op *op) | ||||
| +{ | ||||
| +	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
| + | ||||
| +	writel((u32)(mdata->tx_dma & MTK_SPI_32BITS_MASK), | ||||
| +	       mdata->base + SPI_TX_SRC_REG); | ||||
| +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | ||||
| +	if (mdata->dev_comp->dma_ext) | ||||
| +		writel((u32)(mdata->tx_dma >> 32), | ||||
| +		       mdata->base + SPI_TX_SRC_REG_64); | ||||
| +#endif | ||||
| + | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) { | ||||
| +		writel((u32)(mdata->rx_dma & MTK_SPI_32BITS_MASK), | ||||
| +		       mdata->base + SPI_RX_DST_REG); | ||||
| +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | ||||
| +		if (mdata->dev_comp->dma_ext) | ||||
| +			writel((u32)(mdata->rx_dma >> 32), | ||||
| +			       mdata->base + SPI_RX_DST_REG_64); | ||||
| +#endif | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static int mtk_spi_transfer_wait(struct spi_mem *mem, | ||||
| +				 const struct spi_mem_op *op) | ||||
| +{ | ||||
| +	struct mtk_spi *mdata = spi_master_get_devdata(mem->spi->master); | ||||
| +	/* | ||||
| +	 * For each byte we wait for 8 cycles of the SPI clock. | ||||
| +	 * Since speed is defined in Hz and we want milliseconds, | ||||
| +	 * so it should be 8 * 1000. | ||||
| +	 */ | ||||
| +	u64 ms = 8000LL; | ||||
| + | ||||
| +	if (op->data.dir == SPI_MEM_NO_DATA) | ||||
| +		ms *= 32; /* prevent we may get 0 for short transfers. */ | ||||
| +	else | ||||
| +		ms *= op->data.nbytes; | ||||
| +	ms = div_u64(ms, mem->spi->max_speed_hz); | ||||
| +	ms += ms + 1000; /* 1s tolerance */ | ||||
| + | ||||
| +	if (ms > UINT_MAX) | ||||
| +		ms = UINT_MAX; | ||||
| + | ||||
| +	if (!wait_for_completion_timeout(&mdata->spimem_done, | ||||
| +					 msecs_to_jiffies(ms))) { | ||||
| +		dev_err(mdata->dev, "spi-mem transfer timeout\n"); | ||||
| +		return -ETIMEDOUT; | ||||
| +	} | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static int mtk_spi_mem_exec_op(struct spi_mem *mem, | ||||
| +			       const struct spi_mem_op *op) | ||||
| +{ | ||||
| +	struct mtk_spi *mdata = spi_master_get_devdata(mem->spi->master); | ||||
| +	u32 reg_val, nio, tx_size; | ||||
| +	char *tx_tmp_buf, *rx_tmp_buf; | ||||
| +	int ret = 0; | ||||
| + | ||||
| +	mdata->use_spimem = true; | ||||
| +	reinit_completion(&mdata->spimem_done); | ||||
| + | ||||
| +	mtk_spi_reset(mdata); | ||||
| +	mtk_spi_hw_init(mem->spi->master, mem->spi); | ||||
| +	mtk_spi_prepare_transfer(mem->spi->master, mem->spi->max_speed_hz); | ||||
| + | ||||
| +	reg_val = readl(mdata->base + SPI_CFG3_IPM_REG); | ||||
| +	/* opcode byte len */ | ||||
| +	reg_val &= ~SPI_CFG3_IPM_CMD_BYTELEN_MASK; | ||||
| +	reg_val |= 1 << SPI_CFG3_IPM_CMD_BYTELEN_OFFSET; | ||||
| + | ||||
| +	/* addr & dummy byte len */ | ||||
| +	reg_val &= ~SPI_CFG3_IPM_ADDR_BYTELEN_MASK; | ||||
| +	if (op->addr.nbytes || op->dummy.nbytes) | ||||
| +		reg_val |= (op->addr.nbytes + op->dummy.nbytes) << | ||||
| +			    SPI_CFG3_IPM_ADDR_BYTELEN_OFFSET; | ||||
| + | ||||
| +	/* data byte len */ | ||||
| +	if (op->data.dir == SPI_MEM_NO_DATA) { | ||||
| +		reg_val |= SPI_CFG3_IPM_NODATA_FLAG; | ||||
| +		writel(0, mdata->base + SPI_CFG1_REG); | ||||
| +	} else { | ||||
| +		reg_val &= ~SPI_CFG3_IPM_NODATA_FLAG; | ||||
| +		mdata->xfer_len = op->data.nbytes; | ||||
| +		mtk_spi_setup_packet(mem->spi->master); | ||||
| +	} | ||||
| + | ||||
| +	if (op->addr.nbytes || op->dummy.nbytes) { | ||||
| +		if (op->addr.buswidth == 1 || op->dummy.buswidth == 1) | ||||
| +			reg_val |= SPI_CFG3_IPM_XMODE_EN; | ||||
| +		else | ||||
| +			reg_val &= ~SPI_CFG3_IPM_XMODE_EN; | ||||
| +	} | ||||
| + | ||||
| +	if (op->addr.buswidth == 2 || | ||||
| +	    op->dummy.buswidth == 2 || | ||||
| +	    op->data.buswidth == 2) | ||||
| +		nio = 2; | ||||
| +	else if (op->addr.buswidth == 4 || | ||||
| +		 op->dummy.buswidth == 4 || | ||||
| +		 op->data.buswidth == 4) | ||||
| +		nio = 4; | ||||
| +	else | ||||
| +		nio = 1; | ||||
| + | ||||
| +	reg_val &= ~SPI_CFG3_IPM_CMD_PIN_MODE_MASK; | ||||
| +	reg_val |= PIN_MODE_CFG(nio); | ||||
| + | ||||
| +	reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_EN; | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) | ||||
| +		reg_val |= SPI_CFG3_IPM_HALF_DUPLEX_DIR; | ||||
| +	else | ||||
| +		reg_val &= ~SPI_CFG3_IPM_HALF_DUPLEX_DIR; | ||||
| +	writel(reg_val, mdata->base + SPI_CFG3_IPM_REG); | ||||
| + | ||||
| +	tx_size = 1 + op->addr.nbytes + op->dummy.nbytes; | ||||
| +	if (op->data.dir == SPI_MEM_DATA_OUT) | ||||
| +		tx_size += op->data.nbytes; | ||||
| + | ||||
| +	tx_size = max_t(u32, tx_size, 32); | ||||
| + | ||||
| +	tx_tmp_buf = kzalloc(tx_size, GFP_KERNEL | GFP_DMA); | ||||
| +	if (!tx_tmp_buf) { | ||||
| +		mdata->use_spimem = false; | ||||
| +		return -ENOMEM; | ||||
| +	} | ||||
| + | ||||
| +	tx_tmp_buf[0] = op->cmd.opcode; | ||||
| + | ||||
| +	if (op->addr.nbytes) { | ||||
| +		int i; | ||||
| + | ||||
| +		for (i = 0; i < op->addr.nbytes; i++) | ||||
| +			tx_tmp_buf[i + 1] = op->addr.val >> | ||||
| +					(8 * (op->addr.nbytes - i - 1)); | ||||
| +	} | ||||
| + | ||||
| +	if (op->dummy.nbytes) | ||||
| +		memset(tx_tmp_buf + op->addr.nbytes + 1, | ||||
| +		       0xff, | ||||
| +		       op->dummy.nbytes); | ||||
| + | ||||
| +	if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT) | ||||
| +		memcpy(tx_tmp_buf + op->dummy.nbytes + op->addr.nbytes + 1, | ||||
| +		       op->data.buf.out, | ||||
| +		       op->data.nbytes); | ||||
| + | ||||
| +	mdata->tx_dma = dma_map_single(mdata->dev, tx_tmp_buf, | ||||
| +				       tx_size, DMA_TO_DEVICE); | ||||
| +	if (dma_mapping_error(mdata->dev, mdata->tx_dma)) { | ||||
| +		ret = -ENOMEM; | ||||
| +		goto err_exit; | ||||
| +	} | ||||
| + | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) { | ||||
| +		if (!IS_ALIGNED((size_t)op->data.buf.in, 4)) { | ||||
| +			rx_tmp_buf = kzalloc(op->data.nbytes, | ||||
| +					     GFP_KERNEL | GFP_DMA); | ||||
| +			if (!rx_tmp_buf) { | ||||
| +				ret = -ENOMEM; | ||||
| +				goto unmap_tx_dma; | ||||
| +			} | ||||
| +		} else { | ||||
| +			rx_tmp_buf = op->data.buf.in; | ||||
| +		} | ||||
| + | ||||
| +		mdata->rx_dma = dma_map_single(mdata->dev, | ||||
| +					       rx_tmp_buf, | ||||
| +					       op->data.nbytes, | ||||
| +					       DMA_FROM_DEVICE); | ||||
| +		if (dma_mapping_error(mdata->dev, mdata->rx_dma)) { | ||||
| +			ret = -ENOMEM; | ||||
| +			goto kfree_rx_tmp_buf; | ||||
| +		} | ||||
| +	} | ||||
| + | ||||
| +	reg_val = readl(mdata->base + SPI_CMD_REG); | ||||
| +	reg_val |= SPI_CMD_TX_DMA; | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) | ||||
| +		reg_val |= SPI_CMD_RX_DMA; | ||||
| +	writel(reg_val, mdata->base + SPI_CMD_REG); | ||||
| + | ||||
| +	mtk_spi_mem_setup_dma_xfer(mem->spi->master, op); | ||||
| + | ||||
| +	mtk_spi_enable_transfer(mem->spi->master); | ||||
| + | ||||
| +	/* Wait for the interrupt. */ | ||||
| +	ret = mtk_spi_transfer_wait(mem, op); | ||||
| +	if (ret) | ||||
| +		goto unmap_rx_dma; | ||||
| + | ||||
| +	/* spi disable dma */ | ||||
| +	reg_val = readl(mdata->base + SPI_CMD_REG); | ||||
| +	reg_val &= ~SPI_CMD_TX_DMA; | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) | ||||
| +		reg_val &= ~SPI_CMD_RX_DMA; | ||||
| +	writel(reg_val, mdata->base + SPI_CMD_REG); | ||||
| + | ||||
| +unmap_rx_dma: | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN) { | ||||
| +		dma_unmap_single(mdata->dev, mdata->rx_dma, | ||||
| +				 op->data.nbytes, DMA_FROM_DEVICE); | ||||
| +		if (!IS_ALIGNED((size_t)op->data.buf.in, 4)) | ||||
| +			memcpy(op->data.buf.in, rx_tmp_buf, op->data.nbytes); | ||||
| +	} | ||||
| +kfree_rx_tmp_buf: | ||||
| +	if (op->data.dir == SPI_MEM_DATA_IN && | ||||
| +	    !IS_ALIGNED((size_t)op->data.buf.in, 4)) | ||||
| +		kfree(rx_tmp_buf); | ||||
| +unmap_tx_dma: | ||||
| +	dma_unmap_single(mdata->dev, mdata->tx_dma, | ||||
| +			 tx_size, DMA_TO_DEVICE); | ||||
| +err_exit: | ||||
| +	kfree(tx_tmp_buf); | ||||
| +	mdata->use_spimem = false; | ||||
| + | ||||
| +	return ret; | ||||
| +} | ||||
| + | ||||
| +static const struct spi_controller_mem_ops mtk_spi_mem_ops = { | ||||
| +	.adjust_op_size = mtk_spi_mem_adjust_op_size, | ||||
| +	.supports_op = mtk_spi_mem_supports_op, | ||||
| +	.exec_op = mtk_spi_mem_exec_op, | ||||
| +}; | ||||
| + | ||||
|  static int mtk_spi_probe(struct platform_device *pdev) | ||||
|  { | ||||
|  	struct spi_master *master; | ||||
| @@ -739,6 +1103,7 @@ static int mtk_spi_probe(struct platform | ||||
|  	master->can_dma = mtk_spi_can_dma; | ||||
|  	master->setup = mtk_spi_setup; | ||||
|  	master->set_cs_timing = mtk_spi_set_hw_cs_timing; | ||||
| +	master->use_gpio_descriptors = true; | ||||
|   | ||||
|  	of_id = of_match_node(mtk_spi_of_match, pdev->dev.of_node); | ||||
|  	if (!of_id) { | ||||
| @@ -755,6 +1120,14 @@ static int mtk_spi_probe(struct platform | ||||
|   | ||||
|  	if (mdata->dev_comp->must_tx) | ||||
|  		master->flags = SPI_MASTER_MUST_TX; | ||||
| +	if (mdata->dev_comp->ipm_design) | ||||
| +		master->mode_bits |= SPI_LOOP; | ||||
| + | ||||
| +	if (mdata->dev_comp->ipm_design) { | ||||
| +		mdata->dev = &pdev->dev; | ||||
| +		master->mem_ops = &mtk_spi_mem_ops; | ||||
| +		init_completion(&mdata->spimem_done); | ||||
| +	} | ||||
|   | ||||
|  	if (mdata->dev_comp->need_pad_sel) { | ||||
|  		mdata->pad_num = of_property_count_u32_elems( | ||||
| @@ -831,25 +1204,40 @@ static int mtk_spi_probe(struct platform | ||||
|  		goto err_put_master; | ||||
|  	} | ||||
|   | ||||
| +	mdata->spi_hclk = devm_clk_get_optional(&pdev->dev, "hclk"); | ||||
| +	if (IS_ERR(mdata->spi_hclk)) { | ||||
| +		ret = PTR_ERR(mdata->spi_hclk); | ||||
| +		dev_err(&pdev->dev, "failed to get hclk: %d\n", ret); | ||||
| +		goto err_put_master; | ||||
| +	} | ||||
| + | ||||
| +	ret = clk_prepare_enable(mdata->spi_hclk); | ||||
| +	if (ret < 0) { | ||||
| +		dev_err(&pdev->dev, "failed to enable hclk (%d)\n", ret); | ||||
| +		goto err_put_master; | ||||
| +	} | ||||
| + | ||||
|  	ret = clk_prepare_enable(mdata->spi_clk); | ||||
|  	if (ret < 0) { | ||||
|  		dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret); | ||||
| -		goto err_put_master; | ||||
| +		goto err_disable_spi_hclk; | ||||
|  	} | ||||
|   | ||||
|  	ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); | ||||
|  	if (ret < 0) { | ||||
|  		dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); | ||||
| -		clk_disable_unprepare(mdata->spi_clk); | ||||
| -		goto err_put_master; | ||||
| +		goto err_disable_spi_clk; | ||||
|  	} | ||||
|   | ||||
|  	mdata->spi_clk_hz = clk_get_rate(mdata->spi_clk); | ||||
|   | ||||
| -	if (mdata->dev_comp->no_need_unprepare) | ||||
| +	if (mdata->dev_comp->no_need_unprepare) { | ||||
|  		clk_disable(mdata->spi_clk); | ||||
| -	else | ||||
| +		clk_disable(mdata->spi_hclk); | ||||
| +	} else { | ||||
|  		clk_disable_unprepare(mdata->spi_clk); | ||||
| +		clk_disable_unprepare(mdata->spi_hclk); | ||||
| +	} | ||||
|   | ||||
|  	pm_runtime_enable(&pdev->dev); | ||||
|   | ||||
| @@ -862,25 +1250,12 @@ static int mtk_spi_probe(struct platform | ||||
|  			goto err_disable_runtime_pm; | ||||
|  		} | ||||
|   | ||||
| -		if (!master->cs_gpios && master->num_chipselect > 1) { | ||||
| +		if (!master->cs_gpiods && master->num_chipselect > 1) { | ||||
|  			dev_err(&pdev->dev, | ||||
|  				"cs_gpios not specified and num_chipselect > 1\n"); | ||||
|  			ret = -EINVAL; | ||||
|  			goto err_disable_runtime_pm; | ||||
|  		} | ||||
| - | ||||
| -		if (master->cs_gpios) { | ||||
| -			for (i = 0; i < master->num_chipselect; i++) { | ||||
| -				ret = devm_gpio_request(&pdev->dev, | ||||
| -							master->cs_gpios[i], | ||||
| -							dev_name(&pdev->dev)); | ||||
| -				if (ret) { | ||||
| -					dev_err(&pdev->dev, | ||||
| -						"can't get CS GPIO %i\n", i); | ||||
| -					goto err_disable_runtime_pm; | ||||
| -				} | ||||
| -			} | ||||
| -		} | ||||
|  	} | ||||
|   | ||||
|  	if (mdata->dev_comp->dma_ext) | ||||
| @@ -902,6 +1277,10 @@ static int mtk_spi_probe(struct platform | ||||
|   | ||||
|  err_disable_runtime_pm: | ||||
|  	pm_runtime_disable(&pdev->dev); | ||||
| +err_disable_spi_clk: | ||||
| +	clk_disable_unprepare(mdata->spi_clk); | ||||
| +err_disable_spi_hclk: | ||||
| +	clk_disable_unprepare(mdata->spi_hclk); | ||||
|  err_put_master: | ||||
|  	spi_master_put(master); | ||||
|   | ||||
| @@ -917,8 +1296,10 @@ static int mtk_spi_remove(struct platfor | ||||
|   | ||||
|  	mtk_spi_reset(mdata); | ||||
|   | ||||
| -	if (mdata->dev_comp->no_need_unprepare) | ||||
| +	if (mdata->dev_comp->no_need_unprepare) { | ||||
|  		clk_unprepare(mdata->spi_clk); | ||||
| +		clk_unprepare(mdata->spi_hclk); | ||||
| +	} | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -934,8 +1315,10 @@ static int mtk_spi_suspend(struct device | ||||
|  	if (ret) | ||||
|  		return ret; | ||||
|   | ||||
| -	if (!pm_runtime_suspended(dev)) | ||||
| +	if (!pm_runtime_suspended(dev)) { | ||||
|  		clk_disable_unprepare(mdata->spi_clk); | ||||
| +		clk_disable_unprepare(mdata->spi_hclk); | ||||
| +	} | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -952,11 +1335,20 @@ static int mtk_spi_resume(struct device | ||||
|  			dev_err(dev, "failed to enable spi_clk (%d)\n", ret); | ||||
|  			return ret; | ||||
|  		} | ||||
| + | ||||
| +		ret = clk_prepare_enable(mdata->spi_hclk); | ||||
| +		if (ret < 0) { | ||||
| +			dev_err(dev, "failed to enable spi_hclk (%d)\n", ret); | ||||
| +			clk_disable_unprepare(mdata->spi_clk); | ||||
| +			return ret; | ||||
| +		} | ||||
|  	} | ||||
|   | ||||
|  	ret = spi_master_resume(master); | ||||
| -	if (ret < 0) | ||||
| +	if (ret < 0) { | ||||
|  		clk_disable_unprepare(mdata->spi_clk); | ||||
| +		clk_disable_unprepare(mdata->spi_hclk); | ||||
| +	} | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -968,10 +1360,13 @@ static int mtk_spi_runtime_suspend(struc | ||||
|  	struct spi_master *master = dev_get_drvdata(dev); | ||||
|  	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
|   | ||||
| -	if (mdata->dev_comp->no_need_unprepare) | ||||
| +	if (mdata->dev_comp->no_need_unprepare) { | ||||
|  		clk_disable(mdata->spi_clk); | ||||
| -	else | ||||
| +		clk_disable(mdata->spi_hclk); | ||||
| +	} else { | ||||
|  		clk_disable_unprepare(mdata->spi_clk); | ||||
| +		clk_disable_unprepare(mdata->spi_hclk); | ||||
| +	} | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -982,13 +1377,31 @@ static int mtk_spi_runtime_resume(struct | ||||
|  	struct mtk_spi *mdata = spi_master_get_devdata(master); | ||||
|  	int ret; | ||||
|   | ||||
| -	if (mdata->dev_comp->no_need_unprepare) | ||||
| +	if (mdata->dev_comp->no_need_unprepare) { | ||||
|  		ret = clk_enable(mdata->spi_clk); | ||||
| -	else | ||||
| +		if (ret < 0) { | ||||
| +			dev_err(dev, "failed to enable spi_clk (%d)\n", ret); | ||||
| +			return ret; | ||||
| +		} | ||||
| +		ret = clk_enable(mdata->spi_hclk); | ||||
| +		if (ret < 0) { | ||||
| +			dev_err(dev, "failed to enable spi_hclk (%d)\n", ret); | ||||
| +			clk_disable(mdata->spi_clk); | ||||
| +			return ret; | ||||
| +		} | ||||
| +	} else { | ||||
|  		ret = clk_prepare_enable(mdata->spi_clk); | ||||
| -	if (ret < 0) { | ||||
| -		dev_err(dev, "failed to enable spi_clk (%d)\n", ret); | ||||
| -		return ret; | ||||
| +		if (ret < 0) { | ||||
| +			dev_err(dev, "failed to prepare_enable spi_clk (%d)\n", ret); | ||||
| +			return ret; | ||||
| +		} | ||||
| + | ||||
| +		ret = clk_prepare_enable(mdata->spi_hclk); | ||||
| +		if (ret < 0) { | ||||
| +			dev_err(dev, "failed to prepare_enable spi_hclk (%d)\n", ret); | ||||
| +			clk_disable_unprepare(mdata->spi_clk); | ||||
| +			return ret; | ||||
| +		} | ||||
|  	} | ||||
|   | ||||
|  	return 0; | ||||
| @@ -0,0 +1,44 @@ | ||||
| From 1a7963e9843f6f1e4b02a30926d20b314c03e4df Mon Sep 17 00:00:00 2001 | ||||
| From: Sam Shih <sam.shih@mediatek.com> | ||||
| Date: Sat, 25 Jun 2022 02:10:13 +0800 | ||||
| Subject: [PATCH] mmc: mediatek: add support for MT7986 SoC | ||||
|  | ||||
| Adding mt7986 own characteristics and of_device_id to have support | ||||
| of MT7986 SoC. | ||||
|  | ||||
| Signed-off-by: Sam Shih <sam.shih@mediatek.com> | ||||
| Change-Id: I07cf8406cbe8c1a7114b304f35fc3e689e512e5a | ||||
| --- | ||||
|  drivers/mmc/host/mtk-sd.c | 14 ++++++++++++++ | ||||
|  1 file changed, 14 insertions(+) | ||||
|  | ||||
| --- a/drivers/mmc/host/mtk-sd.c | ||||
| +++ b/drivers/mmc/host/mtk-sd.c | ||||
| @@ -540,6 +540,19 @@ static const struct mtk_mmc_compatible m | ||||
|  	.support_64g = false, | ||||
|  }; | ||||
|   | ||||
| +static const struct mtk_mmc_compatible mt7986_compat = { | ||||
| +	.clk_div_bits = 12, | ||||
| +	.recheck_sdio_irq = true, | ||||
| +	.hs400_tune = false, | ||||
| +	.pad_tune_reg = MSDC_PAD_TUNE0, | ||||
| +	.async_fifo = true, | ||||
| +	.data_tune = true, | ||||
| +	.busy_check = true, | ||||
| +	.stop_clk_fix = true, | ||||
| +	.enhance_rx = true, | ||||
| +	.support_64g = true, | ||||
| +}; | ||||
| + | ||||
|  static const struct mtk_mmc_compatible mt8516_compat = { | ||||
|  	.clk_div_bits = 12, | ||||
|  	.recheck_sdio_irq = true, | ||||
| @@ -584,6 +597,7 @@ static const struct of_device_id msdc_of | ||||
|  	{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat}, | ||||
|  	{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat}, | ||||
|  	{ .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, | ||||
| +	{ .compatible = "mediatek,mt7986-mmc", .data = &mt7986_compat}, | ||||
|  	{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, | ||||
|  	{ .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, | ||||
|  	{ .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, | ||||
| @@ -0,0 +1,41 @@ | ||||
| From f6ba5e17bee38f8ffe118c47fbfef3cf90eb87ff Mon Sep 17 00:00:00 2001 | ||||
| From: "Mingming.Su" <Mingming.Su@mediatek.com> | ||||
| Date: Wed, 30 Jun 2021 16:59:32 +0800 | ||||
| Subject: [PATCH] mt7986: trng: add rng support | ||||
|  | ||||
| 1. Add trng compatible name for MT7986 | ||||
| 2. Fix mtk_rng_wait_ready() function | ||||
|  | ||||
| Signed-off-by: Mingming.Su <Mingming.Su@mediatek.com> | ||||
| --- | ||||
|  drivers/char/hw_random/mtk-rng.c | 5 +++-- | ||||
|  1 file changed, 3 insertions(+), 2 deletions(-) | ||||
|  | ||||
| --- a/drivers/char/hw_random/mtk-rng.c | ||||
| +++ b/drivers/char/hw_random/mtk-rng.c | ||||
| @@ -22,7 +22,7 @@ | ||||
|  #define RNG_AUTOSUSPEND_TIMEOUT		100 | ||||
|   | ||||
|  #define USEC_POLL			2 | ||||
| -#define TIMEOUT_POLL			20 | ||||
| +#define TIMEOUT_POLL			60 | ||||
|   | ||||
|  #define RNG_CTRL			0x00 | ||||
|  #define RNG_EN				BIT(0) | ||||
| @@ -77,7 +77,7 @@ static bool mtk_rng_wait_ready(struct hw | ||||
|  		readl_poll_timeout_atomic(priv->base + RNG_CTRL, ready, | ||||
|  					  ready & RNG_READY, USEC_POLL, | ||||
|  					  TIMEOUT_POLL); | ||||
| -	return !!ready; | ||||
| +	return !!(ready & RNG_READY); | ||||
|  } | ||||
|   | ||||
|  static int mtk_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) | ||||
| @@ -179,6 +179,7 @@ static const struct dev_pm_ops mtk_rng_p | ||||
|  #endif	/* CONFIG_PM */ | ||||
|   | ||||
|  static const struct of_device_id mtk_rng_match[] = { | ||||
| +	{ .compatible = "mediatek,mt7986-rng" }, | ||||
|  	{ .compatible = "mediatek,mt7623-rng" }, | ||||
|  	{}, | ||||
|  }; | ||||
| @@ -0,0 +1,57 @@ | ||||
| --- a/drivers/watchdog/mtk_wdt.c | ||||
| +++ b/drivers/watchdog/mtk_wdt.c | ||||
| @@ -9,6 +9,7 @@ | ||||
|   * Based on sunxi_wdt.c | ||||
|   */ | ||||
|   | ||||
| +#include <dt-bindings/reset/mt7986-resets.h> | ||||
|  #include <dt-bindings/reset-controller/mt2712-resets.h> | ||||
|  #include <dt-bindings/reset-controller/mt8183-resets.h> | ||||
|  #include <dt-bindings/reset-controller/mt8192-resets.h> | ||||
| @@ -65,6 +66,7 @@ struct mtk_wdt_dev { | ||||
|  	void __iomem *wdt_base; | ||||
|  	spinlock_t lock; /* protects WDT_SWSYSRST reg */ | ||||
|  	struct reset_controller_dev rcdev; | ||||
| +	bool disable_wdt_extrst; | ||||
|  }; | ||||
|   | ||||
|  struct mtk_wdt_data { | ||||
| @@ -87,6 +89,10 @@ static const struct mtk_wdt_data mt8195_ | ||||
|  	.toprgu_sw_rst_num = MT8195_TOPRGU_SW_RST_NUM, | ||||
|  }; | ||||
|   | ||||
| +static const struct mtk_wdt_data mt7986_data = { | ||||
| +	.toprgu_sw_rst_num = MT7986_TOPRGU_SW_RST_NUM, | ||||
| +}; | ||||
| + | ||||
|  static int toprgu_reset_update(struct reset_controller_dev *rcdev, | ||||
|  			       unsigned long id, bool assert) | ||||
|  { | ||||
| @@ -256,6 +262,8 @@ static int mtk_wdt_start(struct watchdog | ||||
|  		reg |= (WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN); | ||||
|  	else | ||||
|  		reg &= ~(WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN); | ||||
| +	if (mtk_wdt->disable_wdt_extrst) | ||||
| +		reg &= ~WDT_MODE_EXRST_EN; | ||||
|  	reg |= (WDT_MODE_EN | WDT_MODE_KEY); | ||||
|  	iowrite32(reg, wdt_base + WDT_MODE); | ||||
|   | ||||
| @@ -381,6 +389,10 @@ static int mtk_wdt_probe(struct platform | ||||
|  		if (err) | ||||
|  			return err; | ||||
|  	} | ||||
| + | ||||
| +	mtk_wdt->disable_wdt_extrst = | ||||
| +		of_property_read_bool(dev->of_node, "mediatek,disable-extrst"); | ||||
| + | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| @@ -414,6 +426,7 @@ static const struct of_device_id mtk_wdt | ||||
|  	{ .compatible = "mediatek,mt8183-wdt", .data = &mt8183_data }, | ||||
|  	{ .compatible = "mediatek,mt8192-wdt", .data = &mt8192_data }, | ||||
|  	{ .compatible = "mediatek,mt8195-wdt", .data = &mt8195_data }, | ||||
| +	{ .compatible = "mediatek,mt7986-wdt", .data = &mt7986_data }, | ||||
|  	{ /* sentinel */ } | ||||
|  }; | ||||
|  MODULE_DEVICE_TABLE(of, mtk_wdt_dt_ids); | ||||
| @@ -0,0 +1,47 @@ | ||||
| From 0f8a0dd620b2fb5f9c852844ce5f445bb0bd6d52 Mon Sep 17 00:00:00 2001 | ||||
| From: Sam Shih <sam.shih@mediatek.com> | ||||
| Date: Wed, 4 May 2022 10:27:43 +0800 | ||||
| Subject: [PATCH 5/5] mediatek: add mt7986a mmc support | ||||
|  | ||||
| Add mt7986a boot mmc support | ||||
|  | ||||
| Signed-off-by: Sam Shih <sam.shih@mediatek.com> | ||||
| --- | ||||
|  ...-mmc-mediatek-add-mt7986-mmc-support.patch | 31 +++++++++++++++++++ | ||||
|  1 file changed, 31 insertions(+) | ||||
|  create mode 100644 target/linux/mediatek/patches-5.15/0704-mmc-mediatek-add-mt7986-mmc-support.patch | ||||
|  | ||||
| --- /dev/null | ||||
| +++ b/target/linux/mediatek/patches-5.15/0704-mmc-mediatek-add-mt7986-mmc-support.patch | ||||
| @@ -0,0 +1,31 @@ | ||||
| +diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c | ||||
| +index 1ac9201..a32349c 100644 | ||||
| +--- a/drivers/mmc/host/mtk-sd.c | ||||
| ++++ b/drivers/mmc/host/mtk-sd.c | ||||
| +@@ -540,6 +540,18 @@ static const struct mtk_mmc_compatible mt7622_compat = { | ||||
| + 	.support_64g = false, | ||||
| + }; | ||||
| +  | ||||
| ++static const struct mtk_mmc_compatible mt7986_compat = { | ||||
| ++    .clk_div_bits = 12, | ||||
| ++    .hs400_tune = false, | ||||
| ++    .pad_tune_reg = MSDC_PAD_TUNE0, | ||||
| ++    .async_fifo = true, | ||||
| ++    .data_tune = true, | ||||
| ++    .busy_check = true, | ||||
| ++    .stop_clk_fix = true, | ||||
| ++    .enhance_rx = true, | ||||
| ++    .support_64g = true, | ||||
| ++}; | ||||
| ++ | ||||
| + static const struct mtk_mmc_compatible mt8516_compat = { | ||||
| + 	.clk_div_bits = 12, | ||||
| + 	.recheck_sdio_irq = true, | ||||
| +@@ -584,6 +596,7 @@ static const struct of_device_id msdc_of_ids[] = { | ||||
| + 	{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat}, | ||||
| + 	{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat}, | ||||
| + 	{ .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, | ||||
| ++	{ .compatible = "mediatek,mt7986-mmc", .data = &mt7986_compat}, | ||||
| + 	{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, | ||||
| + 	{ .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, | ||||
| + 	{ .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, | ||||
| @@ -0,0 +1,20 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Wed, 4 May 2022 12:03:42 +0200 | ||||
| Subject: [PATCH] PCI: mediatek-gen3: change driver name to mtk-pcie-gen3 | ||||
|  | ||||
| This allows it to coexist with the other mtk pcie driver in the same kernel | ||||
|  | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
|  | ||||
| --- a/drivers/pci/controller/pcie-mediatek-gen3.c | ||||
| +++ b/drivers/pci/controller/pcie-mediatek-gen3.c | ||||
| @@ -1025,7 +1025,7 @@ static struct platform_driver mtk_pcie_d | ||||
|  	.probe = mtk_pcie_probe, | ||||
|  	.remove = mtk_pcie_remove, | ||||
|  	.driver = { | ||||
| -		.name = "mtk-pcie", | ||||
| +		.name = "mtk-pcie-gen3", | ||||
|  		.of_match_table = mtk_pcie_of_match, | ||||
|  		.pm = &mtk_pcie_pm_ops, | ||||
|  	}, | ||||
		Reference in New Issue
	
	Block a user
	 Sam Shih
					Sam Shih