mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-30 01:52:51 +00:00
mediatek: add SDK target
This adds support for panther and merlin. Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
18
feeds/mediatek-sdk/mediatek-sdk/Makefile
Normal file
18
feeds/mediatek-sdk/mediatek-sdk/Makefile
Normal file
@@ -0,0 +1,18 @@
|
||||
# Copyright (c) 2015 OpenWrt.org
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=arm
|
||||
BOARD:=mediatek-sdk
|
||||
BOARDNAME:=MediaTek ARM (SDK)
|
||||
SUBTARGETS:=mt7622 mt7623 mt7629 mt7986 mt7981
|
||||
FEATURES:=squashfs nand ramdisk fpu
|
||||
|
||||
KERNEL_PATCHVER:=5.4
|
||||
KERNEL_TESTING_PATCHVER:=5.4
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
DEFAULT_PACKAGES += \
|
||||
kmod-leds-gpio kmod-gpio-button-hotplug
|
||||
|
||||
$(eval $(call BuildTarget))
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
proto=`uci -q get network.$INTERFACE.proto`
|
||||
|
||||
if [ "$proto" = l2tp ] || [ "$proto" = pptp ]; then
|
||||
if [ "$ACTION" = ifup ]; then
|
||||
echo 0 > /sys/kernel/debug/hnat/hook_toggle
|
||||
elif [ "$ACTION" = ifdown ]; then
|
||||
echo 1 > /sys/kernel/debug/hnat/hook_toggle
|
||||
fi
|
||||
fi
|
||||
14
feeds/mediatek-sdk/mediatek-sdk/base-files/etc/hotplug.d/iface/99-mtk-lro
Executable file
14
feeds/mediatek-sdk/mediatek-sdk/base-files/etc/hotplug.d/iface/99-mtk-lro
Executable file
@@ -0,0 +1,14 @@
|
||||
[ ifup = "$ACTION" ] && {
|
||||
[ -n "$DEVICE" ] && {
|
||||
if [ "$INTERFACE" == "lan" ]; then
|
||||
if [ -f /usr/sbin/ethtool ]; then
|
||||
ifname=eth0
|
||||
lan_ip=`uci -q get network.lan.ipaddr`
|
||||
ethdrv=`ethtool -i $ifname | grep mtk_soc_eth`
|
||||
[ -n "$ethdrv" ] && {
|
||||
ethtool -N $ifname flow-type tcp4 dst-ip $lan_ip loc 0
|
||||
}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
}
|
||||
3
feeds/mediatek-sdk/mediatek-sdk/base-files/etc/inittab
Normal file
3
feeds/mediatek-sdk/mediatek-sdk/base-files/etc/inittab
Normal file
@@ -0,0 +1,3 @@
|
||||
::sysinit:/etc/init.d/rcS S boot
|
||||
::shutdown:/etc/init.d/rcS K shutdown
|
||||
ttyS0::respawnlate:/usr/libexec/login.sh
|
||||
@@ -0,0 +1,5 @@
|
||||
## This file should contains your platform's proprietary files
|
||||
## and directories that need to be preserved during OpenWRT sysupgrade.
|
||||
|
||||
# /etc/example.conf
|
||||
/etc/wireless/
|
||||
@@ -0,0 +1,15 @@
|
||||
set_preinit_iface() {
|
||||
ip link set eth0 up
|
||||
|
||||
case $(board_name) in
|
||||
ubnt,unifi-6-lr)
|
||||
ifname=eth0
|
||||
;;
|
||||
*)
|
||||
ifname=lan1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
boot_hook_add preinit_main set_preinit_iface
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
set_rps_sock_flow() {
|
||||
echo 1024 > /proc/sys/net/core/rps_sock_flow_entries
|
||||
}
|
||||
|
||||
boot_hook_add preinit_main set_rps_sock_flow
|
||||
|
||||
121
feeds/mediatek-sdk/mediatek-sdk/base-files/lib/upgrade/mmc.sh
Normal file
121
feeds/mediatek-sdk/mediatek-sdk/base-files/lib/upgrade/mmc.sh
Normal file
@@ -0,0 +1,121 @@
|
||||
|
||||
# Keep these values be up-to-date with definition in libfstools/rootdisk.c of fstools package
|
||||
ROOTDEV_OVERLAY_ALIGN=$((64*1024))
|
||||
F2FS_MINSIZE=$((100*1024*1024))
|
||||
|
||||
mtk_get_root() {
|
||||
local rootfsdev
|
||||
|
||||
if read cmdline < /proc/cmdline; then
|
||||
case "$cmdline" in
|
||||
*root=*)
|
||||
rootfsdev="${cmdline##*root=}"
|
||||
rootfsdev="${rootfsdev%% *}"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "${rootfsdev}"
|
||||
fi
|
||||
}
|
||||
|
||||
mmc_upgrade_tar() {
|
||||
local tar_file="$1"
|
||||
local kernel_dev="$2"
|
||||
local rootfs_dev="$3"
|
||||
|
||||
local board_dir=$(tar tf ${tar_file} | grep -m 1 '^sysupgrade-.*/$')
|
||||
board_dir=${board_dir%/}
|
||||
|
||||
local kernel_length=$( (tar xf $tar_file ${board_dir}/kernel -O | wc -c) 2> /dev/null)
|
||||
local rootfs_length=$( (tar xf $tar_file ${board_dir}/root -O | wc -c) 2> /dev/null)
|
||||
|
||||
[ "${kernel_length}" != 0 ] && {
|
||||
tar xf ${tar_file} ${board_dir}/kernel -O >${kernel_dev}
|
||||
}
|
||||
|
||||
[ "${rootfs_length}" != 0 ] && {
|
||||
tar xf ${tar_file} ${board_dir}/root -O >${rootfs_dev}
|
||||
}
|
||||
|
||||
local rootfs_dev_size=$(blockdev --getsize64 ${rootfs_dev})
|
||||
[ $? -ne 0 ] && return 1
|
||||
|
||||
local rootfs_data_offset=$(((rootfs_length+ROOTDEV_OVERLAY_ALIGN-1)&~(ROOTDEV_OVERLAY_ALIGN-1)))
|
||||
local rootfs_data_size=$((rootfs_dev_size-rootfs_data_offset))
|
||||
|
||||
local loopdev="$(losetup -f)"
|
||||
losetup -o $rootfs_data_offset $loopdev $rootfs_dev || {
|
||||
v "Failed to mount looped rootfs_data."
|
||||
return 1
|
||||
}
|
||||
|
||||
local fstype=ext4
|
||||
local mkfs_arg="-q -L rootfs_data"
|
||||
[ "${rootfs_data_size}" -gt "${F2FS_MINSIZE}" ] && {
|
||||
fstype=f2fs
|
||||
mkfs_arg="-q -l rootfs_data"
|
||||
}
|
||||
|
||||
v "Format new rootfs_data at position ${rootfs_data_offset}."
|
||||
mkfs.${fstype} ${mkfs_arg} ${loopdev}
|
||||
[ $? -ne 0 ] && return 1
|
||||
|
||||
[ -n "$UPGRADE_BACKUP" ] && {
|
||||
mkdir -p /tmp/new_root
|
||||
mount -t ${fstype} ${loopdev} /tmp/new_root && {
|
||||
v "Saving config to rootfs_data at position ${rootfs_data_offset}."
|
||||
mv "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
|
||||
umount /tmp/new_root
|
||||
}
|
||||
}
|
||||
|
||||
# Cleanup
|
||||
losetup -d ${loopdev} >/dev/null 2>&1
|
||||
sync
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
mtk_mmc_do_upgrade() {
|
||||
local tar_file="$1"
|
||||
local board=$(board_name)
|
||||
local kernel_dev=
|
||||
local rootfs_dev=
|
||||
local cmdline_root="$(mtk_get_root)"
|
||||
|
||||
case "$cmdline_root" in
|
||||
/dev/mmcblk*)
|
||||
rootfs_dev=${cmdline_root}
|
||||
;;
|
||||
PARTLABEL=* | PARTUUID=*)
|
||||
rootfs_dev=$(blkid -t "${cmdline_root}" -o device)
|
||||
[ -z "${rootfs_dev}" -o $? -ne 0 ] && return 1
|
||||
;;
|
||||
*)
|
||||
return 1;
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$board" in
|
||||
*)
|
||||
kernel_dev=$(blkid -t "PARTLABEL=kernel" -o device)
|
||||
[ -z "${kernel_dev}" -o $? -ne 0 ] && return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# keep sure its unbound
|
||||
losetup --detach-all || {
|
||||
v "Failed to detach all loop devices."
|
||||
sleep 10
|
||||
reboot -f
|
||||
}
|
||||
|
||||
mmc_upgrade_tar "${tar_file}" "${kernel_dev}" "${rootfs_dev}"
|
||||
|
||||
[ $? -ne 0 ] && {
|
||||
v "Upgrade failed."
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
@@ -0,0 +1,591 @@
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Ryder Lee <ryder.lee@mediatek.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0-only OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
#include "mt7622.dtsi"
|
||||
#include "mt6380.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Bananapi BPI-R64";
|
||||
compatible = "bananapi,bpi-r64-rootdisk", "mediatek,mt7622";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512 root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
factory {
|
||||
label = "factory";
|
||||
linux,code = <BTN_0>;
|
||||
gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&pio 102 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
green {
|
||||
label = "bpi-r64:pio:green";
|
||||
gpios = <&pio 89 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
red {
|
||||
label = "bpi-r64:pio:red";
|
||||
gpios = <&pio 88 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
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-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;
|
||||
};
|
||||
};
|
||||
|
||||
&bch {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&btif {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cir {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&irrx_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
switch@1f {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <0x1f>;
|
||||
reset-gpios = <&pio 54 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
wan: port@0 {
|
||||
reg = <0>;
|
||||
label = "wan";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan0";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <4>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&emmc_pins_default>;
|
||||
pinctrl-1 = <&emmc_pins_uhs>;
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
max-frequency = <50000000>;
|
||||
cap-mmc-highspeed;
|
||||
mmc-hs200-1_8v;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_1p8v>;
|
||||
assigned-clocks = <&topckgen CLK_TOP_MSDC30_0_SEL>;
|
||||
assigned-clock-parents = <&topckgen CLK_TOP_UNIV48M>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&sd0_pins_default>;
|
||||
pinctrl-1 = <&sd0_pins_uhs>;
|
||||
status = "okay";
|
||||
bus-width = <4>;
|
||||
max-frequency = <50000000>;
|
||||
cap-sd-highspeed;
|
||||
r_smpl = <1>;
|
||||
cd-gpios = <&pio 81 GPIO_ACTIVE_LOW>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
assigned-clocks = <&topckgen CLK_TOP_MSDC30_1_SEL>;
|
||||
assigned-clock-parents = <&topckgen CLK_TOP_UNIV48M>;
|
||||
};
|
||||
|
||||
&nandc {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <¶llel_nand_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&nor_flash {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_nor_pins>;
|
||||
status = "disabled";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
/* Attention: GPIO 90 is used to switch between PCIe@1,0 and
|
||||
* SATA functions. i.e. output-high: PCIe, output-low: SATA
|
||||
*/
|
||||
asm_sel {
|
||||
gpio-hog;
|
||||
gpios = <90 GPIO_ACTIVE_HIGH>;
|
||||
output-high;
|
||||
};
|
||||
|
||||
/* eMMC is shared pin with parallel NAND */
|
||||
emmc_pins_default: emmc-pins-default {
|
||||
mux {
|
||||
function = "emmc", "emmc_rst";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
/* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7",
|
||||
* "NRB","NCLE" pins are used as DAT0,DAT1,DAT2,DAT3,DAT4,
|
||||
* DAT5,DAT6,DAT7,CMD,CLK for eMMC respectively
|
||||
*/
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
emmc_pins_uhs: emmc-pins-uhs {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
drive-strength = <4>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
eth_pins: eth-pins {
|
||||
mux {
|
||||
function = "eth";
|
||||
groups = "mdc_mdio", "rgmii_via_gmac2";
|
||||
};
|
||||
};
|
||||
|
||||
i2c1_pins: i2c1-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c1_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2c2_pins: i2c2-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c2_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2s1_pins: i2s1-pins {
|
||||
mux {
|
||||
function = "i2s";
|
||||
groups = "i2s_out_mclk_bclk_ws",
|
||||
"i2s1_in_data",
|
||||
"i2s1_out_data";
|
||||
};
|
||||
|
||||
conf {
|
||||
pins = "I2S1_IN", "I2S1_OUT", "I2S_BCLK",
|
||||
"I2S_WS", "I2S_MCLK";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
irrx_pins: irrx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_rx";
|
||||
};
|
||||
};
|
||||
|
||||
irtx_pins: irtx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_tx";
|
||||
};
|
||||
};
|
||||
|
||||
/* Parallel nand is shared pin with eMMC */
|
||||
parallel_nand_pins: parallel-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "par_nand";
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie0-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie0_pad_perst",
|
||||
"pcie0_1_waken",
|
||||
"pcie0_1_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pcie1_pins: pcie1-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie1_pad_perst",
|
||||
"pcie1_0_waken",
|
||||
"pcie1_0_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pmic_bus_pins: pmic-bus-pins {
|
||||
mux {
|
||||
function = "pmic";
|
||||
groups = "pmic_bus";
|
||||
};
|
||||
};
|
||||
|
||||
pwm7_pins: pwm1-2-pins {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm_ch7_2";
|
||||
};
|
||||
};
|
||||
|
||||
wled_pins: wled-pins {
|
||||
mux {
|
||||
function = "led";
|
||||
groups = "wled";
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_default: sd0-pins-default {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
/* "I2S2_OUT, "I2S4_IN"", "I2S3_IN", "I2S2_IN",
|
||||
* "I2S4_OUT", "I2S3_OUT" are used as DAT0, DAT1,
|
||||
* DAT2, DAT3, CMD, CLK for SD respectively.
|
||||
*/
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
conf-cd {
|
||||
pins = "TXD3";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_uhs: sd0-pins-uhs {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
/* Serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic0_pins: spic0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic0_0";
|
||||
};
|
||||
};
|
||||
|
||||
spic1_pins: spic1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic1_0";
|
||||
};
|
||||
};
|
||||
|
||||
/* SPI-NOR is shared pin with serial NAND */
|
||||
spi_nor_pins: spi-nor-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi_nor";
|
||||
};
|
||||
};
|
||||
|
||||
/* serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
uart0_pins: uart0-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart0_0_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
watchdog_pins: watchdog-pins {
|
||||
mux {
|
||||
function = "watchdog";
|
||||
groups = "watchdog";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm7_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwrap {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_bus_pins>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata {
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
&sata_phy {
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&ssusb {
|
||||
vusb33-supply = <®_3p3v>;
|
||||
vbus-supply = <®_5v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u3phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&watchdog_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,608 @@
|
||||
/*
|
||||
* Copyright (c) 2017 MediaTek Inc.
|
||||
* Author: Ming Huang <ming.huang@mediatek.com>
|
||||
* Sean Wang <sean.wang@mediatek.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0-only OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
#include "mt7622.dtsi"
|
||||
#include "mt6380.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Elecom WRC-2533";
|
||||
compatible = "elecom,wrc-2533gent", "mediatek,mt7622";
|
||||
|
||||
aliases {
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
bootargs = "earlycon=uart8250,mmio32,0x11002000 swiotlb=512 console=ttyS0,115200n8";
|
||||
};
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
poll-interval = <100>;
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
factory {
|
||||
label = "factory";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&pio 102 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
switch0 {
|
||||
label = "switch0";
|
||||
gpios = <&pio 1 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_0>;
|
||||
linux,input-type = <EV_SW>;
|
||||
};
|
||||
|
||||
switch1 {
|
||||
label = "switch1";
|
||||
gpios = <&pio 16 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_1>;
|
||||
linux,input-type = <EV_SW>;
|
||||
};
|
||||
|
||||
switch2 {
|
||||
label = "switch2";
|
||||
gpios = <&pio 17 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_2>;
|
||||
linux,input-type = <EV_SW>;
|
||||
};
|
||||
|
||||
switch3 {
|
||||
label = "switch3";
|
||||
gpios = <&pio 18 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_3>;
|
||||
linux,input-type = <EV_SW>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led_power: power_g {
|
||||
label = "wrc-2533:green:power";
|
||||
gpios = <&pio 2 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
power_b {
|
||||
label = "wrc-2533:blue:power";
|
||||
gpios = <&pio 19 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
power_r {
|
||||
label = "wrc-2533:red:power";
|
||||
gpios = <&pio 73 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb {
|
||||
label = "wrc-2533:blue:usb";
|
||||
gpios = <&pio 74 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "wrc-2533:red:wps";
|
||||
gpios = <&pio 76 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wifi2 {
|
||||
label = "wrc-2533:blue:wifi2g";
|
||||
gpios = <&pio 85 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wifi5 {
|
||||
label = "wrc-2533:blue:wifi5g";
|
||||
gpios = <&pio 91 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
reg_usb_vbus: regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "usb_vbus";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
gpio = <&pio 22 GPIO_ACTIVE_LOW>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x3F000000>;
|
||||
};
|
||||
|
||||
reg_1p8v: regulator-1p8v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
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;
|
||||
};
|
||||
|
||||
rtkgsw: rtkgsw@0 {
|
||||
compatible = "mediatek,rtk-gsw";
|
||||
mediatek,ethsys = <ðsys>;
|
||||
mediatek,mdio = <&mdio>;
|
||||
mediatek,reset-pin = <&pio 54 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&slot0 {
|
||||
mt7615@0,0 {
|
||||
reg = <0x0000 0 0 0 0>;
|
||||
mediatek,mtd-eeprom = <&factory 0x05000>;
|
||||
};
|
||||
};
|
||||
|
||||
&pio {
|
||||
/* eMMC is shared pin with parallel NAND */
|
||||
emmc_pins_default: emmc-pins-default {
|
||||
mux {
|
||||
function = "emmc", "emmc_rst";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
/* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7",
|
||||
* "NRB","NCLE" pins are used as DAT0,DAT1,DAT2,DAT3,DAT4,
|
||||
* DAT5,DAT6,DAT7,CMD,CLK for eMMC respectively
|
||||
*/
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
emmc_pins_uhs: emmc-pins-uhs {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
drive-strength = <4>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
eth_pins: eth-pins {
|
||||
mux {
|
||||
function = "eth";
|
||||
groups = "mdc_mdio", "rgmii_via_gmac2";
|
||||
};
|
||||
};
|
||||
|
||||
i2c1_pins: i2c1-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c1_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2c2_pins: i2c2-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c2_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2s1_pins: i2s1-pins {
|
||||
mux {
|
||||
function = "i2s";
|
||||
groups = "i2s_out_mclk_bclk_ws",
|
||||
"i2s1_in_data",
|
||||
"i2s1_out_data";
|
||||
};
|
||||
|
||||
conf {
|
||||
pins = "I2S1_IN", "I2S1_OUT", "I2S_BCLK",
|
||||
"I2S_WS", "I2S_MCLK";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
irrx_pins: irrx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_rx";
|
||||
};
|
||||
};
|
||||
|
||||
irtx_pins: irtx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_tx";
|
||||
};
|
||||
};
|
||||
|
||||
/* Parallel nand is shared pin with eMMC */
|
||||
parallel_nand_pins: parallel-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "par_nand";
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie0-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie0_pad_perst",
|
||||
"pcie0_1_waken",
|
||||
"pcie0_1_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pcie1_pins: pcie1-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie1_pad_perst",
|
||||
"pcie1_0_waken",
|
||||
"pcie1_0_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pmic_bus_pins: pmic-bus-pins {
|
||||
mux {
|
||||
function = "pmic";
|
||||
groups = "pmic_bus";
|
||||
};
|
||||
};
|
||||
|
||||
pwm7_pins: pwm1-2-pins {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm_ch7_2";
|
||||
};
|
||||
};
|
||||
|
||||
wled_pins: wled-pins {
|
||||
mux {
|
||||
function = "led";
|
||||
groups = "wled";
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_default: sd0-pins-default {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
/* "I2S2_OUT, "I2S4_IN"", "I2S3_IN", "I2S2_IN",
|
||||
* "I2S4_OUT", "I2S3_OUT" are used as DAT0, DAT1,
|
||||
* DAT2, DAT3, CMD, CLK for SD respectively.
|
||||
*/
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
conf-cd {
|
||||
pins = "TXD3";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_uhs: sd0-pins-uhs {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
/* Serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic0_pins: spic0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic0_0";
|
||||
};
|
||||
};
|
||||
|
||||
spic1_pins: spic1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic1_0";
|
||||
};
|
||||
};
|
||||
|
||||
/* SPI-NOR is shared pin with serial NAND */
|
||||
spi_nor_pins: spi-nor-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi_nor";
|
||||
};
|
||||
};
|
||||
|
||||
/* serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
uart0_pins: uart0-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart0_0_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
watchdog_pins: watchdog-pins {
|
||||
mux {
|
||||
function = "watchdog";
|
||||
groups = "watchdog";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&bch {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&btif {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&cir {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&irrx_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <ð_pins>;
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "sgmii";
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm7_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwrap {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_bus_pins>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&snfi {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&serial_nand_pins>;
|
||||
status = "okay";
|
||||
|
||||
spi_nand@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
spi-max-frequency = <104000000>;
|
||||
reg = <0>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "Preloader";
|
||||
reg = <0x00000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@80000 {
|
||||
label = "ATF";
|
||||
reg = <0x80000 0x0040000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@c0000 {
|
||||
label = "uboot";
|
||||
reg = <0xc0000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@140000 {
|
||||
label = "uboot-env";
|
||||
reg = <0x140000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
factory: partition@1c0000 {
|
||||
label = "factory";
|
||||
reg = <0x1c0000 0x0040000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@200000 {
|
||||
label = "firmware";
|
||||
reg = <0x200000 0x2000000>;
|
||||
};
|
||||
|
||||
partition@2200000 {
|
||||
label = "reserved";
|
||||
reg = <0x2200000 0x4000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&ssusb {
|
||||
vusb33-supply = <®_3p3v>;
|
||||
vbus-supply = <®_usb_vbus>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u3phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&watchdog_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wmac {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,618 @@
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Ryder Lee <ryder.lee@mediatek.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0-only OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
#include "mt7622.dtsi"
|
||||
#include "mt6380.dtsi"
|
||||
|
||||
/ {
|
||||
model = "MT7622_MT7531 RFB";
|
||||
compatible = "mediatek,mt7622,ubi";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512";
|
||||
};
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
factory {
|
||||
label = "factory";
|
||||
linux,code = <BTN_0>;
|
||||
gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&pio 102 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
gsw: gsw@0 {
|
||||
compatible = "mediatek,mt753x";
|
||||
mediatek,ethsys = <ðsys>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
green {
|
||||
label = "bpi-r64:pio:green";
|
||||
gpios = <&pio 89 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
red {
|
||||
label = "bpi-r64:pio:red";
|
||||
gpios = <&pio 88 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
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-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;
|
||||
};
|
||||
};
|
||||
|
||||
&btif {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&cir {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&irrx_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&gsw {
|
||||
mediatek,mdio = <&mdio>;
|
||||
mediatek,portmap = "llllw";
|
||||
mediatek,mdio_master_pinmux = <0>;
|
||||
reset-gpios = <&pio 54 0>;
|
||||
interrupt-parent = <&pio>;
|
||||
interrupts = <53 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "okay";
|
||||
|
||||
port5: port@5 {
|
||||
compatible = "mediatek,mt753x-port";
|
||||
reg = <5>;
|
||||
phy-mode = "rgmii";
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
|
||||
port6: port@6 {
|
||||
compatible = "mediatek,mt753x-port";
|
||||
reg = <6>;
|
||||
phy-mode = "sgmii";
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&emmc_pins_default>;
|
||||
pinctrl-1 = <&emmc_pins_uhs>;
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
max-frequency = <50000000>;
|
||||
cap-mmc-highspeed;
|
||||
mmc-hs200-1_8v;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_1p8v>;
|
||||
assigned-clocks = <&topckgen CLK_TOP_MSDC30_0_SEL>;
|
||||
assigned-clock-parents = <&topckgen CLK_TOP_UNIV48M>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&sd0_pins_default>;
|
||||
pinctrl-1 = <&sd0_pins_uhs>;
|
||||
status = "okay";
|
||||
bus-width = <4>;
|
||||
max-frequency = <50000000>;
|
||||
cap-sd-highspeed;
|
||||
r_smpl = <1>;
|
||||
cd-gpios = <&pio 81 GPIO_ACTIVE_LOW>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
assigned-clocks = <&topckgen CLK_TOP_MSDC30_1_SEL>;
|
||||
assigned-clock-parents = <&topckgen CLK_TOP_UNIV48M>;
|
||||
};
|
||||
|
||||
&nandc {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <¶llel_nand_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&nor_flash {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_nor_pins>;
|
||||
status = "disabled";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
/* Attention: GPIO 90 is used to switch between PCIe@1,0 and
|
||||
* SATA functions. i.e. output-high: PCIe, output-low: SATA
|
||||
*/
|
||||
asm_sel {
|
||||
gpio-hog;
|
||||
gpios = <90 GPIO_ACTIVE_HIGH>;
|
||||
output-high;
|
||||
};
|
||||
|
||||
/* eMMC is shared pin with parallel NAND */
|
||||
emmc_pins_default: emmc-pins-default {
|
||||
mux {
|
||||
function = "emmc", "emmc_rst";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
/* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7",
|
||||
* "NRB","NCLE" pins are used as DAT0,DAT1,DAT2,DAT3,DAT4,
|
||||
* DAT5,DAT6,DAT7,CMD,CLK for eMMC respectively
|
||||
*/
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
emmc_pins_uhs: emmc-pins-uhs {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc";
|
||||
};
|
||||
|
||||
conf-cmd-dat {
|
||||
pins = "NDL0", "NDL1", "NDL2",
|
||||
"NDL3", "NDL4", "NDL5",
|
||||
"NDL6", "NDL7", "NRB";
|
||||
input-enable;
|
||||
drive-strength = <4>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "NCLE";
|
||||
drive-strength = <4>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
eth_pins: eth-pins {
|
||||
mux {
|
||||
function = "eth";
|
||||
groups = "mdc_mdio", "rgmii_via_gmac2";
|
||||
};
|
||||
};
|
||||
|
||||
i2c1_pins: i2c1-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c1_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2c2_pins: i2c2-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c2_0";
|
||||
};
|
||||
};
|
||||
|
||||
i2s1_pins: i2s1-pins {
|
||||
mux {
|
||||
function = "i2s";
|
||||
groups = "i2s_out_mclk_bclk_ws",
|
||||
"i2s1_in_data",
|
||||
"i2s1_out_data";
|
||||
};
|
||||
|
||||
conf {
|
||||
pins = "I2S1_IN", "I2S1_OUT", "I2S_BCLK",
|
||||
"I2S_WS", "I2S_MCLK";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
irrx_pins: irrx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_rx";
|
||||
};
|
||||
};
|
||||
|
||||
irtx_pins: irtx-pins {
|
||||
mux {
|
||||
function = "ir";
|
||||
groups = "ir_1_tx";
|
||||
};
|
||||
};
|
||||
|
||||
/* Parallel nand is shared pin with eMMC */
|
||||
parallel_nand_pins: parallel-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "par_nand";
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie0-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie0_pad_perst",
|
||||
"pcie0_1_waken",
|
||||
"pcie0_1_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pcie1_pins: pcie1-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie1_pad_perst",
|
||||
"pcie1_0_waken",
|
||||
"pcie1_0_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pmic_bus_pins: pmic-bus-pins {
|
||||
mux {
|
||||
function = "pmic";
|
||||
groups = "pmic_bus";
|
||||
};
|
||||
};
|
||||
|
||||
pwm7_pins: pwm1-2-pins {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm_ch7_2";
|
||||
};
|
||||
};
|
||||
|
||||
wled_pins: wled-pins {
|
||||
mux {
|
||||
function = "led";
|
||||
groups = "wled";
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_default: sd0-pins-default {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
/* "I2S2_OUT, "I2S4_IN"", "I2S3_IN", "I2S2_IN",
|
||||
* "I2S4_OUT", "I2S3_OUT" are used as DAT0, DAT1,
|
||||
* DAT2, DAT3, CMD, CLK for SD respectively.
|
||||
*/
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
drive-strength = <12>;
|
||||
bias-pull-down;
|
||||
};
|
||||
conf-cd {
|
||||
pins = "TXD3";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
sd0_pins_uhs: sd0-pins-uhs {
|
||||
mux {
|
||||
function = "sd";
|
||||
groups = "sd_0";
|
||||
};
|
||||
|
||||
conf-cmd-data {
|
||||
pins = "I2S2_OUT", "I2S4_IN", "I2S3_IN",
|
||||
"I2S2_IN","I2S4_OUT";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "I2S3_OUT";
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
/* Serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic0_pins: spic0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic0_0";
|
||||
};
|
||||
};
|
||||
|
||||
spic1_pins: spic1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spic1_0";
|
||||
};
|
||||
};
|
||||
|
||||
/* SPI-NOR is shared pin with serial NAND */
|
||||
spi_nor_pins: spi-nor-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi_nor";
|
||||
};
|
||||
};
|
||||
|
||||
/* serial NAND is shared pin with SPI-NOR */
|
||||
serial_nand_pins: serial-nand-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
uart0_pins: uart0-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart0_0_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
watchdog_pins: watchdog-pins {
|
||||
mux {
|
||||
function = "watchdog";
|
||||
groups = "watchdog";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm7_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwrap {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_bus_pins>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sata {
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
&sata_phy {
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&serial_nand_pins>;
|
||||
status = "okay";
|
||||
mediatek,quad-spi;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@80000 {
|
||||
label = "FIP";
|
||||
reg = <0x80000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@280000 {
|
||||
label = "Config";
|
||||
reg = <0x280000 0x0080000>;
|
||||
};
|
||||
|
||||
factory: partition@300000 {
|
||||
label = "Factory";
|
||||
reg = <0x300000 0x0100000>;
|
||||
};
|
||||
|
||||
partition@400000 {
|
||||
label = "ubi";
|
||||
reg = <0x400000 0x2400000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic1_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&ssusb {
|
||||
vusb33-supply = <®_3p3v>;
|
||||
vbus-supply = <®_5v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u3phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&watchdog_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wmac {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,327 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
/dts-v1/;
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
#include "mt7622.dtsi"
|
||||
#include "mt6380.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Ubiquiti UniFi 6 LR";
|
||||
compatible = "ubnt,unifi-6-lr", "mediatek,mt7622";
|
||||
|
||||
aliases {
|
||||
led-boot = &led_blue;
|
||||
led-failsafe = &led_blue;
|
||||
led-running = &led_blue;
|
||||
led-upgrade = &led_blue;
|
||||
label-mac-device = &gmac0;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
bootargs = "earlycon=uart8250,mmio32,0x11002000 swiotlb=512 console=ttyS0,115200n8";
|
||||
};
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
proc-supply = <&mt6380_vcpu_reg>;
|
||||
sram-supply = <&mt6380_vm_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&pio 62 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x3f000000>;
|
||||
};
|
||||
|
||||
reg_1p8v: regulator-1p8v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&slot0 {
|
||||
wifi@0,0 {
|
||||
reg = <0x0 0 0 0 0>;
|
||||
mediatek,mtd-eeprom = <&factory 0x20000>;
|
||||
mtd-mac-address = <&eeprom 0x6>;
|
||||
ieee80211-freq-limit = <5000000 6000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&pio {
|
||||
eth_pins: eth-pins {
|
||||
mux {
|
||||
function = "eth";
|
||||
groups = "mdc_mdio", "rgmii_via_gmac2";
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie0-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie0_pad_perst",
|
||||
"pcie0_1_waken",
|
||||
"pcie0_1_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pcie1_pins: pcie1-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie1_pad_perst",
|
||||
"pcie1_0_waken",
|
||||
"pcie1_0_clkreq";
|
||||
};
|
||||
};
|
||||
|
||||
pmic_bus_pins: pmic-bus-pins {
|
||||
mux {
|
||||
function = "pmic";
|
||||
groups = "pmic_bus";
|
||||
};
|
||||
};
|
||||
|
||||
spi_nor_pins: spi-nor-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi_nor";
|
||||
};
|
||||
};
|
||||
|
||||
uart0_pins: uart0-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart0_0_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
uart3_pins: uart3-pins {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart3_1_tx_rx" ;
|
||||
};
|
||||
};
|
||||
|
||||
i2c0_pins: i2c0-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c0";
|
||||
};
|
||||
};
|
||||
|
||||
watchdog_pins: watchdog-pins {
|
||||
mux {
|
||||
function = "watchdog";
|
||||
groups = "watchdog";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&bch {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&btif {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <ð_pins>;
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
|
||||
phy-mode = "2500base-x";
|
||||
mtd-mac-address = <&eeprom 0x0>;
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ethernet-phy@8 {
|
||||
/* Marvell AQRate AQR112W - no driver */
|
||||
compatible = "ethernet-phy-ieee802.3-c45";
|
||||
reg = <0x8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwrap {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_bus_pins>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&nor_flash {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_nor_pins>;
|
||||
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "preloader";
|
||||
reg = <0x0 0x40000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@40000 {
|
||||
label = "atf";
|
||||
reg = <0x40000 0x20000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@60000 {
|
||||
label = "u-boot";
|
||||
reg = <0x60000 0x60000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@c0000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0xc0000 0x10000>;
|
||||
};
|
||||
|
||||
factory: partition@d0000 {
|
||||
label = "factory";
|
||||
reg = <0xd0000 0x40000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
eeprom: partition@110000 {
|
||||
label = "eeprom";
|
||||
reg = <0x110000 0x10000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@120000 {
|
||||
label = "bs";
|
||||
reg = <0x120000 0x10000>;
|
||||
};
|
||||
|
||||
partition@130000 {
|
||||
label = "cfg";
|
||||
reg = <0x130000 0x100000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@230000 {
|
||||
compatible = "denx,fit";
|
||||
label = "firmware";
|
||||
reg = <0x230000 0x1ee0000>;
|
||||
};
|
||||
|
||||
partition@2110000 {
|
||||
label = "kernel1";
|
||||
reg = <0x2110000 0x1ee0000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart3_pins>;
|
||||
status = "okay";
|
||||
|
||||
/* MT7915 Bluetooth */
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c0_pins>;
|
||||
status = "okay";
|
||||
|
||||
led-controller@30 {
|
||||
compatible = "ubnt,ledbar";
|
||||
reg = <0x30>;
|
||||
|
||||
enable-gpio = <&pio 59 0>;
|
||||
|
||||
red {
|
||||
label = "red";
|
||||
};
|
||||
|
||||
green {
|
||||
label = "green";
|
||||
};
|
||||
|
||||
led_blue: blue {
|
||||
label = "blue";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&watchdog_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wmac {
|
||||
mediatek,mtd-eeprom = <&factory 0x0>;
|
||||
mtd-mac-address = <&eeprom 0x0>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Wenzhen.Yu <Wenzhen.Yu@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
&clkitg {
|
||||
bring-up {
|
||||
compatible = "mediatek,clk-bring-up";
|
||||
clocks =
|
||||
<&apmixedsys CK_APMIXED_ARMPLL>,
|
||||
<&apmixedsys CK_APMIXED_NET2PLL>,
|
||||
<&apmixedsys CK_APMIXED_MMPLL>,
|
||||
<&apmixedsys CK_APMIXED_SGMPLL>,
|
||||
<&apmixedsys CK_APMIXED_WEDMCUPLL>,
|
||||
<&apmixedsys CK_APMIXED_NET1PLL>,
|
||||
<&apmixedsys CK_APMIXED_MPLL>,
|
||||
<&apmixedsys CK_APMIXED_APLL2>,
|
||||
<&infracfg CK_INFRA_CK_F26M>,
|
||||
<&infracfg CK_INFRA_UART>,
|
||||
<&infracfg CK_INFRA_ISPI0>,
|
||||
<&infracfg CK_INFRA_I2C>,
|
||||
<&infracfg CK_INFRA_ISPI1>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_66M_MCK>,
|
||||
<&infracfg CK_INFRA_CK_F32K>,
|
||||
<&infracfg CK_INFRA_PCIE_CK>,
|
||||
<&infracfg CK_INFRA_PWM_BCK>,
|
||||
<&infracfg CK_INFRA_PWM_CK1>,
|
||||
<&infracfg CK_INFRA_PWM_CK2>,
|
||||
<&infracfg CK_INFRA_133M_HCK>,
|
||||
<&infracfg CK_INFRA_66M_PHCK>,
|
||||
<&infracfg CK_INFRA_FAUD_L_CK >,
|
||||
<&infracfg CK_INFRA_FAUD_AUD_CK>,
|
||||
<&infracfg CK_INFRA_FAUD_EG2_CK>,
|
||||
<&infracfg CK_INFRA_I2CS_CK>,
|
||||
<&infracfg CK_INFRA_MUX_UART0>,
|
||||
<&infracfg CK_INFRA_MUX_UART1>,
|
||||
<&infracfg CK_INFRA_MUX_UART2>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_MUX_SPI0>,
|
||||
<&infracfg CK_INFRA_MUX_SPI1>,
|
||||
<&infracfg CK_INFRA_RTC_32K>,
|
||||
<&infracfg CK_INFRA_FMSDC_CK>,
|
||||
<&infracfg CK_INFRA_FMSDC_HCK_CK>,
|
||||
<&infracfg CK_INFRA_PERI_133M>,
|
||||
<&infracfg CK_INFRA_133M_PHCK>,
|
||||
<&infracfg CK_INFRA_USB_SYS_CK>,
|
||||
<&infracfg CK_INFRA_USB_CK>,
|
||||
<&infracfg CK_INFRA_USB_XHCI_CK>,
|
||||
<&infracfg CK_INFRA_PCIE_GFMUX_TL_O_PRE>,
|
||||
<&infracfg CK_INFRA_F26M_CK0>,
|
||||
<&infracfg_ao CK_INFRA_UART0_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART2_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&infracfg_ao CK_INFRA_PCIE_SEL>,
|
||||
<&infracfg_ao CK_INFRA_GPT_STA>,
|
||||
<&infracfg_ao CK_INFRA_PWM_HCK>,
|
||||
<&infracfg_ao CK_INFRA_PWM_STA>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_CK>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_CK>,
|
||||
<&infracfg_ao CK_INFRA_CQ_DMA_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_DRAMC_26M_CK>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_AP_DMA_CK>,
|
||||
<&infracfg_ao CK_INFRA_SEJ_CK>,
|
||||
<&infracfg_ao CK_INFRA_SEJ_13M_CK>,
|
||||
<&infracfg_ao CK_INFRA_THERM_CK>,
|
||||
<&infracfg_ao CK_INFRA_I2CO_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART0_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART1_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART2_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI2_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI2_HCK_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_HCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_HCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_FRTC_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_HCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_133M_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_66M_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_FBIST2FPC_CK>,
|
||||
<&infracfg_ao CK_INFRA_I2C_MCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_I2C_PCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_133_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_66M_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_SYS_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIE_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIER_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIEB_CK>,
|
||||
<&topckgen CK_TOP_CB_M_416M>,
|
||||
<&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_CB_M_D4>,
|
||||
<&topckgen CK_TOP_CB_M_D8>,
|
||||
<&topckgen CK_TOP_M_D8_D2>,
|
||||
<&topckgen CK_TOP_M_D3_D2>,
|
||||
<&topckgen CK_TOP_CB_MM_D2>,
|
||||
<&topckgen CK_TOP_CB_MM_D4>,
|
||||
<&topckgen CK_TOP_CB_MM_D8>,
|
||||
<&topckgen CK_TOP_CB_APLL2_196M>,
|
||||
<&topckgen CK_TOP_APLL2_D4>,
|
||||
<&topckgen CK_TOP_CB_NET1_D4>,
|
||||
<&topckgen CK_TOP_CB_NET1_D5>,
|
||||
<&topckgen CK_TOP_NET1_D5_D2>,
|
||||
<&topckgen CK_TOP_NET1_D5_D4>,
|
||||
<&topckgen CK_TOP_NET1_D8_D2>,
|
||||
<&topckgen CK_TOP_NET1_D8_D4>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_CB_NET2_D4>,
|
||||
<&topckgen CK_TOP_NET2_D4_D2>,
|
||||
<&topckgen CK_TOP_CB_WEDMCU_208M>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_CB_RTC_32K>,
|
||||
<&topckgen CK_TOP_CB_RTC_32P7K>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_USB_EQ_RX250M>,
|
||||
<&topckgen CK_TOP_USB_TX250M>,
|
||||
<&topckgen CK_TOP_USB_LN0_CK>,
|
||||
<&topckgen CK_TOP_USB_CDR_CK>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_I2C_BCK>,
|
||||
<&topckgen CK_TOP_PEXTP_TL>,
|
||||
<&topckgen CK_TOP_EMMC_208M>,
|
||||
<&topckgen CK_TOP_EMMC_400M>,
|
||||
<&topckgen CK_TOP_F26M_SEL>,
|
||||
<&topckgen CK_TOP_SYSAXI>,
|
||||
<&topckgen CK_TOP_NETSYS_WED_MCU>,
|
||||
<&topckgen CK_TOP_NETSYS_2X>,
|
||||
<&topckgen CK_TOP_SGM_325M>,
|
||||
<&topckgen CK_TOP_A1SYS>,
|
||||
<&topckgen CK_TOP_F26M>,
|
||||
<&topckgen CK_TOP_AUD_L>,
|
||||
<&topckgen CK_TOP_A_TUNER>,
|
||||
<&topckgen CK_TOP_U2U3_REF>,
|
||||
<&topckgen CK_TOP_U2U3_SYS>,
|
||||
<&topckgen CK_TOP_U2U3_XHCI>,
|
||||
<&topckgen CK_TOP_AP2CNN_HOST>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_UART_SEL>,
|
||||
<&topckgen CK_TOP_PWM_SEL>,
|
||||
<&topckgen CK_TOP_I2C_SEL>,
|
||||
<&topckgen CK_TOP_PEXTP_TL_SEL>,
|
||||
<&topckgen CK_TOP_EMMC_208M_SEL >,
|
||||
<&topckgen CK_TOP_EMMC_400M_SEL >,
|
||||
<&topckgen CK_TOP_F26M_SEL>,
|
||||
<&topckgen CK_TOP_DRAMC_SEL>,
|
||||
<&topckgen CK_TOP_DRAMC_MD32_SEL>,
|
||||
<&topckgen CK_TOP_SYSAXI_SEL>,
|
||||
<&topckgen CK_TOP_SYSAPB_SEL>,
|
||||
<&topckgen CK_TOP_ARM_DB_MAIN_SEL>,
|
||||
<&topckgen CK_TOP_AP2CNN_HOST_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_500M_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_MCU_SEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_SGM_REG_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_500M_SEL>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_USB3_PHY_SEL>,
|
||||
<&topckgen CK_TOP_F26M_SEL>,
|
||||
<&topckgen CK_TOP_U2U3_SEL>,
|
||||
<&topckgen CK_TOP_U2U3_SYS_SEL>,
|
||||
<&topckgen CK_TOP_U2U3_XHCI_SEL>,
|
||||
<&topckgen CK_TOP_USB_FRMCNT_SEL>;
|
||||
|
||||
|
||||
clock-names = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
|
||||
"12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
|
||||
"24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
|
||||
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",
|
||||
"48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
|
||||
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71",
|
||||
"72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83",
|
||||
"84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95",
|
||||
"96", "97", "98", "99", "100", "101", "102", "103", "104", "105", "106", "107",
|
||||
"108", "109", "110", "111", "112", "113", "114", "115", "116", "117",
|
||||
"118", "119", "120", "121", "122", "123",
|
||||
"124", "125", "126", "127", "128", "129", "130", "131", "132", "133", "134", "135",
|
||||
"136", "137", "138", "139", "140", "141", "142", "143", "144", "145", "146", "147",
|
||||
"148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
|
||||
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171",
|
||||
"172", "173", "174", "175", "176", "177", "178", "179", "180", "181", "182", "183";
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,169 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <8>;
|
||||
max-frequency = <52000000>;
|
||||
cap-mmc-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "gmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
compatible = "ethernet-phy-id03a2.9461";
|
||||
reg = <0>;
|
||||
phy-mode = "gmii";
|
||||
nvmem-cells = <&phy_calibration>;
|
||||
nvmem-cell-names = "phy-cal-data";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pio {
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
mediatek,u3p-dis-msk = <0x0>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>,
|
||||
<&u3port0 PHY_TYPE_USB3>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,135 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 FPGA";
|
||||
compatible = "mediatek,mt7981-fpga-emmc";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
wsys_adie: wsys_adie@0 {
|
||||
// fpga cases need to manual change adie_id / sku_type for dvt only
|
||||
compatible = "mediatek,rebb-mt7981-adie";
|
||||
adie_id = <7976>;
|
||||
sku_type = <3000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <8>;
|
||||
max-frequency = <3000000>;
|
||||
cap-mmc-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "eth0";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,135 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 FPGA";
|
||||
compatible = "mediatek,mt7981-fpga-emmc";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
wsys_adie: wsys_adie@0 {
|
||||
// fpga cases need to manual change adie_id / sku_type for dvt only
|
||||
compatible = "mediatek,rebb-mt7981-adie";
|
||||
adie_id = <7976>;
|
||||
sku_type = <3000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <4>;
|
||||
max-frequency = <3000000>;
|
||||
cap-sd-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "eth0";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,157 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 FPGA";
|
||||
compatible = "mediatek,mt7981-fpga-snfi-nand";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
nmbm_snfi {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&snand>;
|
||||
forced-create;
|
||||
empty-page-ecc-protected;
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
wsys_adie: wsys_adie@0 {
|
||||
// fpga cases need to manual change adie_id / sku_type for dvt only
|
||||
compatible = "mediatek,rebb-mt7981-adie";
|
||||
adie_id = <7976>;
|
||||
sku_type = <3000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
snfi_pins: snfi-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with spic */
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
status = "okay";
|
||||
mediatek,quad-spi;
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "eth0";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,161 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 FPGA";
|
||||
compatible = "mediatek,mt7981-fpga-spim-nand";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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>;
|
||||
};
|
||||
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "FIP";
|
||||
reg = <0x380000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@580000 {
|
||||
label = "ubi";
|
||||
reg = <0x580000 0x4000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
wsys_adie: wsys_adie@0 {
|
||||
// fpga cases need to manual change adie_id / sku_type for dvt only
|
||||
compatible = "mediatek,rebb-mt7981-adie";
|
||||
adie_id = <7976>;
|
||||
sku_type = <3000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi0_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nand: spi_nand@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <3000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
spi0_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "eth0";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,148 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 FPGA";
|
||||
compatible = "mediatek,mt7981-fpga-nor";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
wsys_adie: wsys_adie@0 {
|
||||
// fpga cases need to manual change adie_id / sku_type for dvt only
|
||||
compatible = "mediatek,rebb-mt7981-adie";
|
||||
adie_id = <7976>;
|
||||
sku_type = <3000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&spi2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi2_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <500000>;
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
spi2_flash_pins: spi2-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi2", "spi2_wp_hold";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
gmac1: mac@1 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <1>;
|
||||
phy-mode = "rgmii";
|
||||
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "eth0";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wed {
|
||||
dy_txbm_enable = "true";
|
||||
dy_txbm_budge = <8>;
|
||||
txbm_init_sz = <10>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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/ti-syscon.h>
|
||||
/ {
|
||||
compatible = "mediatek,mt7981-fpga";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
auxadc: adc@1100d000 {
|
||||
compatible = "mediatek,mt7981-auxadc",
|
||||
"mediatek,mt7622-auxadc";
|
||||
reg = <0 0x1100d000 0 0x1000>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "main";
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
|
||||
wed: wed@15010000 {
|
||||
compatible = "mediatek,wed";
|
||||
wed_num = <2>;
|
||||
/* add this property for wed get the pci slot number. */
|
||||
pci_slot_map = <0>, <1>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wdma: wdma@15104800 {
|
||||
compatible = "mediatek,wed-wdma";
|
||||
reg = <0 0x15104800 0 0x400>,
|
||||
<0 0x15104c00 0 0x400>;
|
||||
};
|
||||
|
||||
ap2woccif: ap2woccif@151A5000 {
|
||||
compatible = "mediatek,ap2woccif";
|
||||
reg = <0 0x151A5000 0 0x1000>,
|
||||
<0 0x151AD000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wocpu0_ilm: wocpu0_ilm@151E0000 {
|
||||
compatible = "mediatek,wocpu0_ilm";
|
||||
reg = <0 0x151E0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu_dlm: wocpu_dlm@151E8000 {
|
||||
compatible = "mediatek,wocpu_dlm";
|
||||
reg = <0 0x151E8000 0 0x2000>,
|
||||
<0 0x151F8000 0 0x2000>;
|
||||
|
||||
resets = <ðsysrst 0>;
|
||||
reset-names = "wocpu_rst";
|
||||
};
|
||||
|
||||
cpu_boot: wocpu_boot@15194000 {
|
||||
compatible = "mediatek,wocpu_boot";
|
||||
reg = <0 0x15194000 0 0x1000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||
secmon_reserved: secmon@43000000 {
|
||||
reg = <0 0x43000000 0 0x30000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wmcpu_emi: wmcpu-reserved@47C80000 {
|
||||
compatible = "mediatek,wmcpu-reserved";
|
||||
no-map;
|
||||
reg = <0 0x47C80000 0 0x00100000>;
|
||||
};
|
||||
|
||||
wocpu0_emi: wocpu0_emi@47D80000 {
|
||||
compatible = "mediatek,wocpu0_emi";
|
||||
no-map;
|
||||
reg = <0 0x47D80000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu_data: wocpu_data@47DC0000 {
|
||||
compatible = "mediatek,wocpu_data";
|
||||
no-map;
|
||||
reg = <0 0x47DC0000 0 0x240000>;
|
||||
shared = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
system_clk: dummy13m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <13000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
rtc_clk: dummy32k {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <32000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
uart_clk: dummy12m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <12000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
gpt_clk: dummy6m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <6000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupt-parent = <&gic>;
|
||||
clock-frequency = <12000000>;
|
||||
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>;
|
||||
|
||||
};
|
||||
|
||||
watchdog: watchdog@1001c000 {
|
||||
compatible = "mediatek,mt7622-wdt",
|
||||
"mediatek,mt6589-wdt";
|
||||
reg = <0 0x1001c000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@c000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x0c000000 0 0x40000>, /* GICD */
|
||||
<0 0x0c080000 0 0x200000>; /* GICR */
|
||||
|
||||
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
uart0: serial@11002000 {
|
||||
compatible = "mediatek,mt7986-uart",
|
||||
"mediatek,mt6577-uart";
|
||||
reg = <0 0x11002000 0 0x400>;
|
||||
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
pcie: pcie@11280000 {
|
||||
compatible = "mediatek,mt7981-pcie",
|
||||
"mediatek,mt7986-pcie";
|
||||
device_type = "pci";
|
||||
reg = <0 0x11280000 0 0x4000>;
|
||||
reg-names = "pcie-mac";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||
bus-range = <0x00 0xff>;
|
||||
ranges = <0x82000000 0 0x20000000
|
||||
0x0 0x20000000 0 0x10000000>;
|
||||
status = "disabled";
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 7>;
|
||||
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 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
pio: pinctrl@11d00000 {
|
||||
compatible = "mediatek,mt7981-pinctrl";
|
||||
reg = <0 0x11d00000 0 0x1000>,
|
||||
<0 0x11c00000 0 0x1000>,
|
||||
<0 0x11c10000 0 0x1000>,
|
||||
<0 0x11d20000 0 0x1000>,
|
||||
<0 0x11e00000 0 0x1000>,
|
||||
<0 0x11e20000 0 0x1000>,
|
||||
<0 0x11f00000 0 0x1000>,
|
||||
<0 0x11f10000 0 0x1000>,
|
||||
<0 0x1000b000 0 0x1000>;
|
||||
reg-names = "gpio_base", "iocfg_rt_base", "iocfg_rm_base",
|
||||
"iocfg_rb_base", "iocfg_lb_base", "iocfg_bl_base",
|
||||
"iocfg_tm_base", "iocfg_tl_base", "eint";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&pio 0 0 56>;
|
||||
interrupt-controller;
|
||||
interrupts = <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&gic>;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
ethsys: syscon@15000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "mediatek,mt7986-ethsys",
|
||||
"syscon";
|
||||
reg = <0 0x15000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
|
||||
ethsysrst: reset-controller {
|
||||
compatible = "ti,syscon-reset";
|
||||
#reset-cells = <1>;
|
||||
ti,reset-bits = <0x34 4 0x34 4 0x34 4 (ASSERT_SET | DEASSERT_CLEAR | STATUS_SET)>;
|
||||
};
|
||||
};
|
||||
|
||||
eth: ethernet@15100000 {
|
||||
compatible = "mediatek,mt7981-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>;
|
||||
mediatek,ethsys = <ðsys>;
|
||||
mediatek,infracfg = <ðsys>;
|
||||
#reset-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hnat: hnat@15000000 {
|
||||
compatible = "mediatek,mtk-hnat_v4";
|
||||
reg = <0 0x15100000 0 0x80000>;
|
||||
resets = <ðsys 0>;
|
||||
reset-names = "mtketh";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
snand: snfi@11005000 {
|
||||
compatible = "mediatek,mt7986-snand";
|
||||
reg = <0 0x11005000 0 0x1000>, <0 0x11006000 0 0x1000>;
|
||||
reg-names = "nfi", "ecc";
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "pad_clk", "nfi_clk", "nfi_hclk";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
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 = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "source", "hclk", "source_cg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wed_pcie: wed_pcie@10003000 {
|
||||
compatible = "mediatek,wed_pcie";
|
||||
reg = <0 0x10003000 0 0x10>;
|
||||
};
|
||||
|
||||
wbsys: wbsys@18000000 {
|
||||
compatible = "mediatek,wbsys";
|
||||
reg = <0 0x18000000 0 0x1000000>;
|
||||
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
|
||||
chip_id = <0x7981>;
|
||||
};
|
||||
|
||||
spi0: spi@1100a000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x1100a000 0 0x100>;
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@1100b000 {
|
||||
compatible = "mediatek,ipm-spi-single";
|
||||
reg = <0 0x1100b000 0 0x100>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi2: spi@11009000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x11009000 0 0x100>;
|
||||
interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>,
|
||||
<&uart_clk>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
consys: consys@10000000 {
|
||||
compatible = "mediatek,mt7981-consys";
|
||||
reg = <0 0x10000000 0 0x8600000>;
|
||||
memory-region = <&wmcpu_emi>;
|
||||
};
|
||||
|
||||
xhci: xhci@11200000 {
|
||||
compatible = "mediatek,mt7981-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>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "sys_ck",
|
||||
"xhci_ck",
|
||||
"ref_ck",
|
||||
"mcu_ck",
|
||||
"dma_ck";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
mediatek,u3p-dis-msk=<0x01>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usbtphy: usb-phy@11203e00 {
|
||||
compatible = "mediatek,a60810-u2phy",
|
||||
"mediatek,a60931-u3phy",
|
||||
"mediatek,a60xxx-usbphy";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
status = "okay";
|
||||
|
||||
u2port0: usb-phy@11203ed0 {
|
||||
reg = <0 0x11203ed0 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u3port0: usb-phy@11203ed8 {
|
||||
reg = <0 0x11203ed8 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
u2port1: usb-phy@11203ee0 {
|
||||
reg = <0 0x11203ee0 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,169 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <4>;
|
||||
max-frequency = <52000000>;
|
||||
cap-sd-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "gmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
compatible = "ethernet-phy-id03a2.9461";
|
||||
reg = <0>;
|
||||
phy-mode = "gmii";
|
||||
nvmem-cells = <&phy_calibration>;
|
||||
nvmem-cell-names = "phy-cal-data";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pio {
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
mediatek,u3p-dis-msk = <0x0>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>,
|
||||
<&u3port0 PHY_TYPE_USB3>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,203 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-snand-pcie-2500wan-p5-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
nmbm_snfi {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&snand>;
|
||||
forced-create;
|
||||
empty-page-ecc-protected;
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
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>;
|
||||
phy-mode = "2500base-x";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "wan";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "wan";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
status = "okay";
|
||||
mediatek,quad-spi;
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset", "pcie_clk", "pcie_wake";
|
||||
};
|
||||
};
|
||||
|
||||
snfi_pins: snfi-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,245 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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>;
|
||||
};
|
||||
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "FIP";
|
||||
reg = <0x380000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@580000 {
|
||||
label = "ubi";
|
||||
reg = <0x580000 0x4000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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>;
|
||||
phy-mode = "2500base-x";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi0_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nand: spi_nand@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <52000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pio {
|
||||
|
||||
i2c_pins: i2c-pins-g0 {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c0_0";
|
||||
};
|
||||
};
|
||||
|
||||
pcm_pins: pcm-pins-g0 {
|
||||
mux {
|
||||
function = "pcm";
|
||||
groups = "pcm";
|
||||
};
|
||||
};
|
||||
|
||||
pwm0_pin: pwm0-pin-g0 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm0_0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm1_pin: pwm1-pin-g0 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm1_0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm2_pin: pwm2-pin {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm2";
|
||||
};
|
||||
};
|
||||
|
||||
spi0_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins: uart1-pins-g1 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins-g1 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,282 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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>;
|
||||
};
|
||||
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "FIP";
|
||||
reg = <0x380000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@580000 {
|
||||
label = "ubi";
|
||||
reg = <0x580000 0x4000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt79xx-si3218x-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
mediatek,ext-codec = <&proslic_spi>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&afe {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcm_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "gmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
compatible = "ethernet-phy-id03a2.9461";
|
||||
reg = <0>;
|
||||
phy-mode = "gmii";
|
||||
nvmem-cells = <&phy_calibration>;
|
||||
nvmem-cell-names = "phy-cal-data";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi0_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nand: spi_nand@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <52000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
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 15 0>;
|
||||
ig,enable-spi = <1>; /* 1: Enable, 0: Disable */
|
||||
};
|
||||
};
|
||||
|
||||
&pio {
|
||||
|
||||
i2c_pins: i2c-pins-g0 {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c0_0";
|
||||
};
|
||||
};
|
||||
|
||||
pcm_pins: pcm-pins-g0 {
|
||||
mux {
|
||||
function = "pcm";
|
||||
groups = "pcm";
|
||||
};
|
||||
};
|
||||
|
||||
pwm0_pin: pwm0-pin-g0 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm0_0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm1_pin: pwm1-pin-g0 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm1_0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm2_pin: pwm2-pin {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm2";
|
||||
};
|
||||
};
|
||||
|
||||
spi0_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins: uart1-pins-g1 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins-g1 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
mediatek,u3p-dis-msk = <0x0>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>,
|
||||
<&u3port0 PHY_TYPE_USB3>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,180 @@
|
||||
/dts-v1/;
|
||||
#include "mt7981.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7981 RFB";
|
||||
compatible = "mediatek,mt7981-spim-nor-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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 = "gmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
compatible = "ethernet-phy-id03a2.9461";
|
||||
reg = <0>;
|
||||
phy-mode = "gmii";
|
||||
nvmem-cells = <&phy_calibration>;
|
||||
nvmem-cell-names = "phy-cal-data";
|
||||
};
|
||||
|
||||
switch@0 {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&spi2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi2_flash_pins>;
|
||||
status = "okay";
|
||||
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>;
|
||||
|
||||
partition@00000 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0040000>;
|
||||
};
|
||||
partition@40000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x40000 0x0010000>;
|
||||
};
|
||||
partition@50000 {
|
||||
label = "Factory";
|
||||
reg = <0x50000 0x00B0000>;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "FIP";
|
||||
reg = <0x100000 0x0080000>;
|
||||
};
|
||||
partition@180000 {
|
||||
label = "firmware";
|
||||
reg = <0x180000 0xE00000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pio {
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
spi2_flash_pins: spi2-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi2", "spi2_wp_hold";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&xhci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wed {
|
||||
dy_txbm_enable = "true";
|
||||
dy_txbm_budget = <8>;
|
||||
txbm_init_sz = <8>;
|
||||
txbm_max_sz = <32>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,600 @@
|
||||
/*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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/ti-syscon.h>
|
||||
#include <dt-bindings/clock/mt7981-clk.h>
|
||||
/ {
|
||||
compatible = "mediatek,mt7981-rfb";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
auxadc: adc@1100d000 {
|
||||
compatible = "mediatek,mt7981-auxadc",
|
||||
"mediatek,mt7622-auxadc";
|
||||
reg = <0 0x1100d000 0 0x1000>;
|
||||
clocks = <&infracfg_ao CK_INFRA_ADC_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_FRC_CK>;
|
||||
clock-names = "main", "32k";
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
|
||||
wed: wed@15010000 {
|
||||
compatible = "mediatek,wed";
|
||||
wed_num = <2>;
|
||||
/* add this property for wed get the pci slot number. */
|
||||
pci_slot_map = <0>, <1>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wdma: wdma@15104800 {
|
||||
compatible = "mediatek,wed-wdma";
|
||||
reg = <0 0x15104800 0 0x400>,
|
||||
<0 0x15104c00 0 0x400>;
|
||||
};
|
||||
|
||||
ap2woccif: ap2woccif@151A5000 {
|
||||
compatible = "mediatek,ap2woccif";
|
||||
reg = <0 0x151A5000 0 0x1000>,
|
||||
<0 0x151AD000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wocpu0_ilm: wocpu0_ilm@151E0000 {
|
||||
compatible = "mediatek,wocpu0_ilm";
|
||||
reg = <0 0x151E0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu_dlm: wocpu_dlm@151E8000 {
|
||||
compatible = "mediatek,wocpu_dlm";
|
||||
reg = <0 0x151E8000 0 0x2000>,
|
||||
<0 0x151F8000 0 0x2000>;
|
||||
|
||||
resets = <ðsysrst 0>;
|
||||
reset-names = "wocpu_rst";
|
||||
};
|
||||
|
||||
cpu_boot: wocpu_boot@15194000 {
|
||||
compatible = "mediatek,wocpu_boot";
|
||||
reg = <0 0x15194000 0 0x1000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||
secmon_reserved: secmon@43000000 {
|
||||
reg = <0 0x43000000 0 0x30000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wmcpu_emi: wmcpu-reserved@47C80000 {
|
||||
compatible = "mediatek,wmcpu-reserved";
|
||||
no-map;
|
||||
reg = <0 0x47C80000 0 0x00100000>;
|
||||
};
|
||||
|
||||
wocpu0_emi: wocpu0_emi@47D80000 {
|
||||
compatible = "mediatek,wocpu0_emi";
|
||||
no-map;
|
||||
reg = <0 0x47D80000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu_data: wocpu_data@47DC0000 {
|
||||
compatible = "mediatek,wocpu_data";
|
||||
no-map;
|
||||
reg = <0 0x47DC0000 0 0x240000>;
|
||||
shared = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
clk40m: oscillator@0 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <40000000>;
|
||||
clock-output-names = "clkxtal";
|
||||
};
|
||||
|
||||
infracfg_ao: infracfg_ao@10001000 {
|
||||
compatible = "mediatek,mt7981-infracfg_ao", "syscon";
|
||||
reg = <0 0x10001000 0 0x68>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
infracfg: infracfg@10001040 {
|
||||
compatible = "mediatek,mt7981-infracfg", "syscon";
|
||||
reg = <0 0x10001068 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
topckgen: topckgen@1001B000 {
|
||||
compatible = "mediatek,mt7981-topckgen", "syscon";
|
||||
reg = <0 0x1001B000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
apmixedsys: apmixedsys@1001E000 {
|
||||
compatible = "mediatek,mt7981-apmixedsys", "syscon";
|
||||
reg = <0 0x1001E000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
system_clk: dummy_system_clk {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <40000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
uart_clk: dummy_uart_clk {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <40000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
gpt_clk: dummy_gpt_clk {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <20000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupt-parent = <&gic>;
|
||||
clock-frequency = <13000000>;
|
||||
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>;
|
||||
|
||||
};
|
||||
|
||||
watchdog: watchdog@1001c000 {
|
||||
compatible = "mediatek,mt7622-wdt",
|
||||
"mediatek,mt6589-wdt";
|
||||
reg = <0 0x1001c000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@c000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x0c000000 0 0x40000>, /* GICD */
|
||||
<0 0x0c080000 0 0x200000>; /* GICR */
|
||||
|
||||
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
uart0: serial@11002000 {
|
||||
compatible = "mediatek,mt7986-uart",
|
||||
"mediatek,mt6577-uart";
|
||||
reg = <0 0x11002000 0 0x400>;
|
||||
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@11008000 {
|
||||
compatible = "mediatek,mt7986-i2c";
|
||||
reg = <0 0x11008000 0 0x90>,
|
||||
<0 0x10217080 0 0x80>;
|
||||
interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-div = <5>;
|
||||
clocks = <&infracfg_ao CK_INFRA_I2CO_CK>,
|
||||
<&infracfg_ao CK_INFRA_AP_DMA_CK>;
|
||||
clock-names = "main", "dma";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
pcie: pcie@11280000 {
|
||||
compatible = "mediatek,mt7981-pcie",
|
||||
"mediatek,mt7986-pcie";
|
||||
device_type = "pci";
|
||||
reg = <0 0x11280000 0 0x4000>;
|
||||
reg-names = "pcie-mac";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||
bus-range = <0x00 0xff>;
|
||||
ranges = <0x82000000 0 0x20000000
|
||||
0x0 0x20000000 0 0x10000000>;
|
||||
status = "disabled";
|
||||
|
||||
phys = <&u3port0 PHY_TYPE_PCIE>;
|
||||
phy-names = "pcie-phy";
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 7>;
|
||||
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 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
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 = <&topckgen CK_TOP_EIP97B>;
|
||||
clock-names = "top_eip97_ck";
|
||||
assigned-clocks = <&topckgen CK_TOP_EIP97B_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_CKSQ_40M>;
|
||||
};
|
||||
|
||||
pio: pinctrl@11d00000 {
|
||||
compatible = "mediatek,mt7981-pinctrl";
|
||||
reg = <0 0x11d00000 0 0x1000>,
|
||||
<0 0x11c00000 0 0x1000>,
|
||||
<0 0x11c10000 0 0x1000>,
|
||||
<0 0x11d20000 0 0x1000>,
|
||||
<0 0x11e00000 0 0x1000>,
|
||||
<0 0x11e20000 0 0x1000>,
|
||||
<0 0x11f00000 0 0x1000>,
|
||||
<0 0x11f10000 0 0x1000>,
|
||||
<0 0x1000b000 0 0x1000>;
|
||||
reg-names = "gpio_base", "iocfg_rt_base", "iocfg_rm_base",
|
||||
"iocfg_rb_base", "iocfg_lb_base", "iocfg_bl_base",
|
||||
"iocfg_tm_base", "iocfg_tl_base", "eint";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&pio 0 0 56>;
|
||||
interrupt-controller;
|
||||
interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&gic>;
|
||||
#interrupt-cells = <2>;
|
||||
};
|
||||
|
||||
ethsys: syscon@15000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "mediatek,mt7981-ethsys",
|
||||
"syscon";
|
||||
reg = <0 0x15000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
|
||||
ethsysrst: reset-controller {
|
||||
compatible = "ti,syscon-reset";
|
||||
#reset-cells = <1>;
|
||||
ti,reset-bits = <0x34 4 0x34 4 0x34 4 (ASSERT_SET | DEASSERT_CLEAR | STATUS_SET)>;
|
||||
};
|
||||
};
|
||||
|
||||
eth: ethernet@15100000 {
|
||||
compatible = "mediatek,mt7981-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 CK_ETH_FE_EN>,
|
||||
<ðsys CK_ETH_GP2_EN>,
|
||||
<ðsys CK_ETH_GP1_EN>,
|
||||
<ðsys CK_ETH_WOCPU0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_TX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_RX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CK0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CDR_CK0_EN>,
|
||||
<&sgmiisys1 CK_SGM1_TX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_RX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CK1_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CDR_CK1_EN>;
|
||||
clock-names = "fe", "gp2", "gp1", "wocpu0",
|
||||
"sgmii_tx250m", "sgmii_rx250m",
|
||||
"sgmii_cdr_ref", "sgmii_cdr_fb",
|
||||
"sgmii2_tx250m", "sgmii2_rx250m",
|
||||
"sgmii2_cdr_ref", "sgmii2_cdr_fb";
|
||||
assigned-clocks = <&topckgen CK_TOP_NETSYS_2X_SEL>,
|
||||
<&topckgen CK_TOP_SGM_325M_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_NET2_800M>,
|
||||
<&topckgen CK_TOP_CB_SGM_325M>;
|
||||
mediatek,ethsys = <ðsys>;
|
||||
mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
|
||||
mediatek,infracfg = <&topmisc>;
|
||||
#reset-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hnat: hnat@15000000 {
|
||||
compatible = "mediatek,mtk-hnat_v4";
|
||||
reg = <0 0x15100000 0 0x80000>;
|
||||
resets = <ðsys 0>;
|
||||
reset-names = "mtketh";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sgmiisys0: syscon@10060000 {
|
||||
compatible = "mediatek,mt7981-sgmiisys_0", "syscon";
|
||||
reg = <0 0x10060000 0 0x1000>;
|
||||
pn_swap;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
sgmiisys1: syscon@10070000 {
|
||||
compatible = "mediatek,mt7981-sgmiisys_1", "syscon";
|
||||
reg = <0 0x10070000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
topmisc: topmisc@11d10000 {
|
||||
compatible = "mediatek,mt7981-topmisc", "syscon";
|
||||
reg = <0 0x11d10000 0 0x10000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
snand: snfi@11005000 {
|
||||
compatible = "mediatek,mt7986-snand";
|
||||
reg = <0 0x11005000 0 0x1000>, <0 0x11006000 0 0x1000>;
|
||||
reg-names = "nfi", "ecc";
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_SPINFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI_HCK_CK>;
|
||||
clock-names = "pad_clk", "nfi_clk", "nfi_hclk";
|
||||
assigned-clocks = <&topckgen CK_TOP_SPINFI_SEL>,
|
||||
<&topckgen CK_TOP_NFI1X_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_D8>,
|
||||
<&topckgen CK_TOP_CB_M_D8>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
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 = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "source", "hclk", "source_cg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wbsys: wbsys@18000000 {
|
||||
compatible = "mediatek,wbsys";
|
||||
reg = <0 0x18000000 0 0x1000000>;
|
||||
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
|
||||
chip_id = <0x7981>;
|
||||
};
|
||||
|
||||
wed_pcie: wed_pcie@10003000 {
|
||||
compatible = "mediatek,wed_pcie";
|
||||
reg = <0 0x10003000 0 0x10>;
|
||||
};
|
||||
|
||||
spi0: spi@1100a000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x1100a000 0 0x100>;
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPI_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@1100b000 {
|
||||
compatible = "mediatek,ipm-spi-single";
|
||||
reg = <0 0x1100b000 0 0x100>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPIM_MST_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi2: spi@11009000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x11009000 0 0x100>;
|
||||
interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPI_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI2_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
consys: consys@10000000 {
|
||||
compatible = "mediatek,mt7981-consys";
|
||||
reg = <0 0x10000000 0 0x8600000>;
|
||||
memory-region = <&wmcpu_emi>;
|
||||
};
|
||||
|
||||
xhci: xhci@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>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "sys_ck",
|
||||
"xhci_ck",
|
||||
"ref_ck",
|
||||
"mcu_ck",
|
||||
"dma_ck";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
mediatek,u3p-dis-msk = <0x01>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usbtphy: usb-phy@11e10000 {
|
||||
compatible = "mediatek,mt7986",
|
||||
"mediatek,generic-tphy-v2";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
status = "okay";
|
||||
|
||||
u2port0: usb-phy@11e10000 {
|
||||
reg = <0 0x11e10000 0 0x700>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u3port0: usb-phy@11e10700 {
|
||||
reg = <0 0x11e10700 0 0x900>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
mediatek,syscon-type = <&topmisc 0x218 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
clkitg: clkitg {
|
||||
compatible = "simple-bus";
|
||||
};
|
||||
|
||||
efuse: efuse@11f20000 {
|
||||
compatible = "mediatek,efuse";
|
||||
reg = <0 0x11f20000 0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
thermal_calibration: calib@274 {
|
||||
reg = <0x274 0xc>;
|
||||
};
|
||||
|
||||
phy_calibration: calib@8dc {
|
||||
reg = <0x8dc 0x10>;
|
||||
};
|
||||
};
|
||||
|
||||
afe: audio-controller@11210000 {
|
||||
compatible = "mediatek,mt79xx-audio";
|
||||
reg = <0 0x11210000 0 0x9000>;
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_AUD_BUS_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_L_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_AUD_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_EG2_CK>;
|
||||
clock-names = "aud_bus_ck",
|
||||
"aud_26m_ck",
|
||||
"aud_l_ck",
|
||||
"aud_aud_ck",
|
||||
"aud_eg2_ck";
|
||||
assigned-clocks = <&topckgen CK_TOP_AUD_SEL>,
|
||||
<&topckgen CK_TOP_A1SYS_SEL>,
|
||||
<&topckgen CK_TOP_AUD_L_SEL>,
|
||||
<&topckgen CK_TOP_A_TUNER_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&topckgen CK_TOP_CB_CKSQ_40M>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ice: ice_debug {
|
||||
compatible = "mediatek,mt7981-ice_debug",
|
||||
"mediatek,mt2701-ice_debug";
|
||||
clocks = <&infracfg_ao CK_INFRA_DBG_CK>;
|
||||
clock-names = "ice_dbg";
|
||||
};
|
||||
};
|
||||
#include "mt7981-clkitg.dtsi"
|
||||
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Wenzhen.Yu <Wenzhen.Yu@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
&clkitg {
|
||||
bring-up {
|
||||
compatible = "mediatek,clk-bring-up";
|
||||
clocks =
|
||||
<&apmixedsys CK_APMIXED_ARMPLL>,
|
||||
<&apmixedsys CK_APMIXED_NET2PLL>,
|
||||
<&apmixedsys CK_APMIXED_MMPLL>,
|
||||
<&apmixedsys CK_APMIXED_SGMPLL>,
|
||||
<&apmixedsys CK_APMIXED_WEDMCUPLL>,
|
||||
<&apmixedsys CK_APMIXED_NET1PLL>,
|
||||
<&apmixedsys CK_APMIXED_MPLL>,
|
||||
<&apmixedsys CK_APMIXED_APLL2>,
|
||||
<&infracfg CK_INFRA_CK_F26M>,
|
||||
<&infracfg CK_INFRA_UART>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_I2C>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_66M_MCK>,
|
||||
<&infracfg CK_INFRA_CK_F32K>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_PWM_BCK>,
|
||||
<&infracfg CK_INFRA_PWM_CK1>,
|
||||
<&infracfg CK_INFRA_PWM_CK2>,
|
||||
<&infracfg CK_INFRA_133M_HCK>,
|
||||
<&infracfg CK_INFRA_EIP_CK>,
|
||||
<&infracfg CK_INFRA_66M_PHCK>,
|
||||
<&infracfg CK_INFRA_FAUD_L_CK >,
|
||||
<&infracfg CK_INFRA_FAUD_AUD_CK>,
|
||||
<&infracfg CK_INFRA_FAUD_EG2_CK>,
|
||||
<&infracfg CK_INFRA_I2CS_CK>,
|
||||
<&infracfg CK_INFRA_MUX_UART0>,
|
||||
<&infracfg CK_INFRA_MUX_UART1>,
|
||||
<&infracfg CK_INFRA_MUX_UART2>,
|
||||
<&infracfg CK_INFRA_NFI_CK>,
|
||||
<&infracfg CK_INFRA_SPINFI_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_RTC_32K>,
|
||||
<&infracfg CK_INFRA_FMSDC_CK>,
|
||||
<&infracfg CK_INFRA_FMSDC_HCK_CK>,
|
||||
<&infracfg CK_INFRA_PERI_133M>,
|
||||
<&infracfg CK_INFRA_133M_PHCK>,
|
||||
<&infracfg CK_INFRA_USB_SYS_CK>,
|
||||
<&infracfg CK_INFRA_USB_CK>,
|
||||
<&infracfg CK_INFRA_USB_XHCI_CK>,
|
||||
<&clk40m>,
|
||||
<&infracfg CK_INFRA_F26M_CK0>,
|
||||
<&infracfg_ao CK_INFRA_UART0_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART2_SEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_PWM_HCK>,
|
||||
<&infracfg_ao CK_INFRA_PWM_STA>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_CK>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_CK>,
|
||||
<&infracfg_ao CK_INFRA_CQ_DMA_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_DRAMC_26M_CK>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_AP_DMA_CK>,
|
||||
<&infracfg_ao CK_INFRA_SEJ_CK>,
|
||||
<&infracfg_ao CK_INFRA_SEJ_13M_CK>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_I2CO_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART0_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART1_CK>,
|
||||
<&infracfg_ao CK_INFRA_UART2_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_FRTC_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_HCK_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_133M_CK>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_66M_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&infracfg_ao CK_INFRA_FBIST2FPC_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_133_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_66M_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_SYS_CK>,
|
||||
<&infracfg_ao CK_INFRA_IUSB_CK>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_CB_M_416M>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_CB_M_D4>,
|
||||
<&topckgen CK_TOP_CB_M_D8>,
|
||||
<&topckgen CK_TOP_M_D8_D2>,
|
||||
<&topckgen CK_TOP_M_D3_D2>,
|
||||
<&topckgen CK_TOP_CB_MM_D2>,
|
||||
<&topckgen CK_TOP_CB_MM_D4>,
|
||||
<&topckgen CK_TOP_CB_MM_D8>,
|
||||
<&topckgen CK_TOP_MM_D8_D2>,
|
||||
<&topckgen CK_TOP_MM_D3_D8>,
|
||||
<&topckgen CK_TOP_CB_U2_PHYD_CK>,
|
||||
<&topckgen CK_TOP_CB_APLL2_196M>,
|
||||
<&topckgen CK_TOP_APLL2_D4>,
|
||||
<&topckgen CK_TOP_CB_NET1_D4>,
|
||||
<&topckgen CK_TOP_CB_NET1_D5>,
|
||||
<&topckgen CK_TOP_NET1_D5_D2>,
|
||||
<&topckgen CK_TOP_NET1_D5_D4>,
|
||||
<&topckgen CK_TOP_NET1_D8_D2>,
|
||||
<&topckgen CK_TOP_NET1_D8_D4>,
|
||||
<&topckgen CK_TOP_CB_NET2_800M>,
|
||||
<&topckgen CK_TOP_CB_NET2_D4>,
|
||||
<&topckgen CK_TOP_NET2_D4_D2>,
|
||||
<&topckgen CK_TOP_NET2_D3_D2>,
|
||||
<&topckgen CK_TOP_CB_WEDMCU_760M>,
|
||||
<&topckgen CK_TOP_WEDMCU_D5_D2 >,
|
||||
<&topckgen CK_TOP_CB_SGM_325M>,
|
||||
<&topckgen CK_TOP_CB_CKSQ_40M_D2>,
|
||||
<&topckgen CK_TOP_CB_RTC_32K>,
|
||||
<&topckgen CK_TOP_CB_RTC_32P7K>,
|
||||
<&topckgen CK_TOP_NFI1X>,
|
||||
<&topckgen CK_TOP_USB_EQ_RX250M>,
|
||||
<&topckgen CK_TOP_USB_TX250M>,
|
||||
<&topckgen CK_TOP_USB_LN0_CK>,
|
||||
<&topckgen CK_TOP_USB_CDR_CK>,
|
||||
<&topckgen CK_TOP_SPINFI_BCK>,
|
||||
<&topckgen CK_TOP_I2C_BCK>,
|
||||
<&topckgen CK_TOP_PEXTP_TL>,
|
||||
<&topckgen CK_TOP_EMMC_250M>,
|
||||
<&topckgen CK_TOP_EMMC_416M>,
|
||||
<&topckgen CK_TOP_F_26M_ADC_CK>,
|
||||
<&topckgen CK_TOP_SYSAXI>,
|
||||
<&topckgen CK_TOP_NETSYS_WED_MCU>,
|
||||
<&topckgen CK_TOP_NETSYS_2X>,
|
||||
<&topckgen CK_TOP_SGM_325M>,
|
||||
<&topckgen CK_TOP_A1SYS>,
|
||||
<&topckgen CK_TOP_EIP_B>,
|
||||
<&topckgen CK_TOP_F26M>,
|
||||
<&topckgen CK_TOP_AUD_L>,
|
||||
<&topckgen CK_TOP_A_TUNER>,
|
||||
<&topckgen CK_TOP_U2U3_REF>,
|
||||
<&topckgen CK_TOP_U2U3_SYS>,
|
||||
<&topckgen CK_TOP_U2U3_XHCI>,
|
||||
<&topckgen CK_TOP_AP2CNN_HOST>,
|
||||
<&topckgen CK_TOP_NFI1X_SEL>,
|
||||
<&topckgen CK_TOP_SPINFI_SEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_UART_SEL>,
|
||||
<&topckgen CK_TOP_PWM_SEL>,
|
||||
<&topckgen CK_TOP_I2C_SEL>,
|
||||
<&topckgen CK_TOP_PEXTP_TL_SEL>,
|
||||
<&topckgen CK_TOP_EMMC_250M_SEL >,
|
||||
<&topckgen CK_TOP_EMMC_416M_SEL >,
|
||||
<&topckgen CK_TOP_F_26M_ADC_SEL>,
|
||||
<&topckgen CK_TOP_DRAMC_SEL>,
|
||||
<&topckgen CK_TOP_DRAMC_MD32_SEL>,
|
||||
<&topckgen CK_TOP_SYSAXI_SEL>,
|
||||
<&topckgen CK_TOP_SYSAPB_SEL>,
|
||||
<&topckgen CK_TOP_ARM_DB_MAIN_SEL>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_NETSYS_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_500M_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_MCU_SEL>,
|
||||
<&topckgen CK_TOP_NETSYS_2X_SEL>,
|
||||
<&topckgen CK_TOP_SGM_325M_SEL>,
|
||||
<&topckgen CK_TOP_SGM_REG_SEL>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_CONN_MCUSYS_SEL>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_PCIE_PHY_SEL>,
|
||||
<&topckgen CK_TOP_USB3_PHY_SEL>,
|
||||
<&topckgen CK_TOP_F26M_SEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&topckgen CK_TOP_U2U3_SEL>,
|
||||
<&topckgen CK_TOP_U2U3_SYS_SEL>,
|
||||
<&topckgen CK_TOP_U2U3_XHCI_SEL>,
|
||||
<&topckgen CK_TOP_DA_U2_REFSEL>,
|
||||
<&topckgen CK_TOP_DA_U2_CK_1P_SEL>,
|
||||
<&topckgen CK_TOP_AP2CNN_HOST_SEL>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>,
|
||||
<&clk40m>;
|
||||
|
||||
|
||||
clock-names = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
|
||||
"12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
|
||||
"24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
|
||||
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",
|
||||
"48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
|
||||
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71",
|
||||
"72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83",
|
||||
"84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95",
|
||||
"96", "97", "98", "99", "100", "101", "102", "103", "104", "105", "106", "107",
|
||||
"108", "109", "110", "111", "112", "113", "114", "115", "116", "117",
|
||||
"118", "119", "120", "121", "122", "123",
|
||||
"124", "125", "126", "127", "128", "129", "130", "131", "132", "133", "134", "135",
|
||||
"136", "137", "138", "139", "140", "141", "142", "143", "144", "145", "146", "147",
|
||||
"148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
|
||||
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171",
|
||||
"172", "173", "174", "175", "176", "177", "178", "179", "180", "181", "182", "183",
|
||||
"184", "185", "186", "187", "188", "189", "190", "191", "192", "193", "194", "195",
|
||||
"196", "197", "198", "199", "200", "201", "202", "203", "204", "205", "206", "207",
|
||||
"208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221";
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,163 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986 FPGA (UBI)";
|
||||
compatible = "mediatek,mt7986-fpga,ubi";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <500000>;
|
||||
|
||||
partition@00000 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0060000>;
|
||||
};
|
||||
partition@60000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x60000 0x0010000>;
|
||||
};
|
||||
partition@70000 {
|
||||
label = "Factory";
|
||||
reg = <0x70000 0x00B0000>;
|
||||
};
|
||||
partition@120000 {
|
||||
label = "BL31";
|
||||
reg = <0x120000 0x0010000>;
|
||||
};
|
||||
partition@130000 {
|
||||
label = "u-boot";
|
||||
reg = <0x130000 0x00D0000>;
|
||||
};
|
||||
partition@200000 {
|
||||
label = "firmware";
|
||||
reg = <0x200000 0xE00000>;
|
||||
};
|
||||
};
|
||||
spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <500000>;
|
||||
|
||||
partition@00000 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0100000>;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x100000 0x0080000>;
|
||||
};
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x00200000>;
|
||||
};
|
||||
partition@380000 {
|
||||
label = "BL31";
|
||||
reg = <0x380000 0x0080000>;
|
||||
};
|
||||
partition@400000 {
|
||||
label = "u-boot";
|
||||
reg = <0x400000 0x0180000>;
|
||||
};
|
||||
partition@580000 {
|
||||
label = "firmware";
|
||||
reg = <0x580000 0x7a80000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
snfi_pins: snfi-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with spic */
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
status = "okay";
|
||||
mediatek,quad-spi;
|
||||
|
||||
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>;
|
||||
};
|
||||
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "FIP";
|
||||
reg = <0x380000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@580000 {
|
||||
label = "ubi";
|
||||
reg = <0x580000 0x4000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,163 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986-fpga.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986 FPGA";
|
||||
compatible = "mediatek,mt7986-fpga";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
// fpga ddr2: 128MB*2
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
status = "okay";
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <500000>;
|
||||
|
||||
partition@00000 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0060000>;
|
||||
};
|
||||
partition@60000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x60000 0x0010000>;
|
||||
};
|
||||
partition@70000 {
|
||||
label = "Factory";
|
||||
reg = <0x70000 0x00B0000>;
|
||||
};
|
||||
partition@120000 {
|
||||
label = "BL31";
|
||||
reg = <0x120000 0x0010000>;
|
||||
};
|
||||
partition@130000 {
|
||||
label = "u-boot";
|
||||
reg = <0x130000 0x00D0000>;
|
||||
};
|
||||
partition@200000 {
|
||||
label = "firmware";
|
||||
reg = <0x200000 0xE00000>;
|
||||
};
|
||||
};
|
||||
spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <500000>;
|
||||
|
||||
partition@00000 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0100000>;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x100000 0x0080000>;
|
||||
};
|
||||
partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x00200000>;
|
||||
};
|
||||
partition@380000 {
|
||||
label = "BL31";
|
||||
reg = <0x380000 0x0080000>;
|
||||
};
|
||||
partition@400000 {
|
||||
label = "u-boot";
|
||||
reg = <0x400000 0x0180000>;
|
||||
};
|
||||
partition@580000 {
|
||||
label = "firmware";
|
||||
reg = <0x580000 0x7a80000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with snfi */
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
snfi_pins: snfi-pins {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
/* pin shared with spic */
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
status = "okay";
|
||||
mediatek,quad-spi;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@80000 {
|
||||
label = "FIP";
|
||||
reg = <0x80000 0x0200000>;
|
||||
};
|
||||
|
||||
partition@280000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x280000 0x0080000>;
|
||||
};
|
||||
|
||||
partition@300000 {
|
||||
label = "Factory";
|
||||
reg = <0x300000 0x0080000>;
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "firmware";
|
||||
reg = <0x380000 0x7c00000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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/ti-syscon.h>
|
||||
/ {
|
||||
compatible = "mediatek,mt7986-fpga";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
wed: wed@15010000 {
|
||||
compatible = "mediatek,wed";
|
||||
wed_num = <2>;
|
||||
/* add this property for wed get the pci slot number. */
|
||||
pci_slot_map = <0>, <1>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wed2: wed2@15011000 {
|
||||
compatible = "mediatek,wed2";
|
||||
wed_num = <2>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wdma: wdma@15104800 {
|
||||
compatible = "mediatek,wed-wdma";
|
||||
reg = <0 0x15104800 0 0x400>,
|
||||
<0 0x15104c00 0 0x400>;
|
||||
};
|
||||
|
||||
ap2woccif: ap2woccif@151A5000 {
|
||||
compatible = "mediatek,ap2woccif";
|
||||
reg = <0 0x151A5000 0 0x1000>,
|
||||
<0 0x151AD000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wocpu0_ilm: wocpu0_ilm@151E0000 {
|
||||
compatible = "mediatek,wocpu0_ilm";
|
||||
reg = <0 0x151E0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu1_ilm: wocpu1_ilm@151F0000 {
|
||||
compatible = "mediatek,wocpu1_ilm";
|
||||
reg = <0 0x151F0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu_dlm: wocpu_dlm@151E8000 {
|
||||
compatible = "mediatek,wocpu_dlm";
|
||||
reg = <0 0x151E8000 0 0x2000>,
|
||||
<0 0x151F8000 0 0x2000>;
|
||||
|
||||
resets = <ðsysrst 0>;
|
||||
reset-names = "wocpu_rst";
|
||||
};
|
||||
|
||||
cpu_boot: wocpu_boot@15194000 {
|
||||
compatible = "mediatek,wocpu_boot";
|
||||
reg = <0 0x15194000 0 0x1000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||
secmon_reserved: secmon@43000000 {
|
||||
reg = <0 0x43000000 0 0x30000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wmcpu_emi: wmcpu-reserved@4FC00000 {
|
||||
compatible = "mediatek,wmcpu-reserved";
|
||||
no-map;
|
||||
reg = <0 0x4FC00000 0 0x00100000>;
|
||||
};
|
||||
|
||||
wocpu0_emi: wocpu0_emi@4FD00000 {
|
||||
compatible = "mediatek,wocpu0_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD00000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu1_emi: wocpu1_emi@4FD80000 {
|
||||
compatible = "mediatek,wocpu1_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD40000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu_data: wocpu_data@4FE00000 {
|
||||
compatible = "mediatek,wocpu_data";
|
||||
no-map;
|
||||
reg = <0 0x4FD80000 0 0x200000>;
|
||||
shared = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
system_clk: dummy13m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <13000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
rtc_clk: dummy32k {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <32000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
uart_clk: dummy12m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <12000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
gpt_clk: dummy6m {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <6000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupt-parent = <&gic>;
|
||||
clock-frequency = <12000000>;
|
||||
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>;
|
||||
|
||||
};
|
||||
|
||||
watchdog: watchdog@1001c000 {
|
||||
compatible = "mediatek,mt7622-wdt",
|
||||
"mediatek,mt6589-wdt";
|
||||
reg = <0 0x1001c000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@c000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x0c000000 0 0x40000>, /* GICD */
|
||||
<0 0x0c080000 0 0x200000>; /* GICR */
|
||||
|
||||
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
uart0: serial@11002000 {
|
||||
compatible = "mediatek,mt7986-uart",
|
||||
"mediatek,mt6577-uart";
|
||||
reg = <0 0x11002000 0 0x400>;
|
||||
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
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 = <&uart_clk>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
pcie: pcie@11280000 {
|
||||
compatible = "mediatek,mt7986-pcie";
|
||||
device_type = "pci";
|
||||
reg = <0 0x11280000 0 0x5000>;
|
||||
reg-names = "port0";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||
bus-range = <0x00 0xff>;
|
||||
ranges = <0x82000000 0 0x20000000
|
||||
0x0 0x20000000 0 0x10000000>;
|
||||
|
||||
pcie0: pcie@0,0 {
|
||||
device_type = "pci";
|
||||
reg = <0x0000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 7>;
|
||||
interrupt-map = <0 0 0 1 &pcie_intc0 0>,
|
||||
<0 0 0 2 &pcie_intc0 1>,
|
||||
<0 0 0 3 &pcie_intc0 2>,
|
||||
<0 0 0 4 &pcie_intc0 3>;
|
||||
pcie_intc0: interrupt-controller {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pio: pinctrl@1001f000 {
|
||||
compatible = "mediatek,mt7986-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_base", "iocfg_rt_base", "iocfg_rb_base",
|
||||
"iocfg_lt_base", "iocfg_lb_base", "iocfg_tr_base",
|
||||
"iocfg_tl_base", "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>;
|
||||
};
|
||||
|
||||
ethsys: syscon@15000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "mediatek,mt7986-ethsys",
|
||||
"syscon";
|
||||
reg = <0 0x15000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
|
||||
ethsysrst: reset-controller {
|
||||
compatible = "ti,syscon-reset";
|
||||
#reset-cells = <1>;
|
||||
ti,reset-bits = <0x34 4 0x34 4 0x34 4 (ASSERT_SET | DEASSERT_CLEAR | STATUS_SET)>;
|
||||
};
|
||||
};
|
||||
|
||||
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>;
|
||||
mediatek,ethsys = <ðsys>;
|
||||
#reset-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
snand: snfi@11005000 {
|
||||
compatible = "mediatek,mt7986-snand";
|
||||
reg = <0 0x11005000 0 0x1000>, <0 0x11006000 0 0x1000>;
|
||||
reg-names = "nfi", "ecc";
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "nfi_clk", "pad_clk", "ecc_clk";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wed_pcie: wed_pcie@10003000 {
|
||||
compatible = "mediatek,wed_pcie";
|
||||
reg = <0 0x10003000 0 0x10>;
|
||||
};
|
||||
|
||||
wbsys: wbsys@18000000 {
|
||||
compatible = "mediatek,wbsys";
|
||||
reg = <0 0x18000000 0 0x1000000>;
|
||||
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
|
||||
chip_id = <0x7986>;
|
||||
};
|
||||
|
||||
spi0: spi@1100a000 {
|
||||
compatible = "mediatek,ipm-spi";
|
||||
reg = <0 0x1100a000 0 0x100>;
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@1100b000 {
|
||||
compatible = "mediatek,ipm-spi";
|
||||
reg = <0 0x1100b000 0 0x100>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
auxadc: adc@1100d000 {
|
||||
compatible = "mediatek,mt7986-auxadc",
|
||||
"mediatek,mt7622-auxadc";
|
||||
reg = <0 0x1100d000 0 0x1000>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "main";
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
|
||||
consys: consys@10000000 {
|
||||
compatible = "mediatek,mt7986-consys";
|
||||
reg = <0 0x10000000 0 0x8600000>;
|
||||
memory-region = <&wmcpu_emi>;
|
||||
};
|
||||
|
||||
xhci: xhci@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>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "sys_ck",
|
||||
"xhci_ck",
|
||||
"ref_ck",
|
||||
"mcu_ck",
|
||||
"dma_ck";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
mediatek,u3p-dis-msk=<0x01>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usbtphy: usb-phy@11203e00 {
|
||||
compatible = "mediatek,a60810-u2phy",
|
||||
"mediatek,a60931-u3phy",
|
||||
"mediatek,a60xxx-usbphy";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
status = "okay";
|
||||
|
||||
u2port0: usb-phy@11203ed0 {
|
||||
reg = <0 0x11203ed0 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u3port0: usb-phy@11203ed8 {
|
||||
reg = <0 0x11203ed8 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
u2port1: usb-phy@11203ee0 {
|
||||
reg = <0 0x11203ee0 0 0x008>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,44 @@
|
||||
/ {
|
||||
nmbm_snfi {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&snand>;
|
||||
forced-create;
|
||||
empty-page-ecc-protected;
|
||||
|
||||
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,43 @@
|
||||
/ {
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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,30 @@
|
||||
&spi0 {
|
||||
spi_nor@0 {
|
||||
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,296 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
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";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
mmc0_pins_default: mmc0-pins-50-to-61-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-50-to-61-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,235 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nor-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-2500wan-nor-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,246 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-2500wan-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
|
||||
spi_nand: spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,278 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
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";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
mmc0_pins_default: mmc0-pins-50-to-61-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-50-to-61-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
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 = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,219 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nor-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-nor-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,141 @@
|
||||
&pio {
|
||||
wifi_led_pins: wifi_led-pins-1-2 {
|
||||
mux {
|
||||
function = "led";
|
||||
groups = "wifi_led";
|
||||
};
|
||||
};
|
||||
|
||||
i2c_pins: i2c-pins-3-4 {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins_g0: uart1-pins-7-to-10 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_0";
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie0-pins-9-10-41 {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_clk", "pcie_wake", "pcie_pereset";
|
||||
};
|
||||
};
|
||||
|
||||
jtag_pins: jtag-pins-11-to-14 {
|
||||
mux {
|
||||
function = "jtag";
|
||||
groups = "jtag";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins_g0: spic-pins-11-to-14 {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm1_pin_g0: pwm1-pin-20 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm1_1";
|
||||
};
|
||||
};
|
||||
|
||||
pwm0_pin: pwm0-pin-21 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm0";
|
||||
};
|
||||
};
|
||||
|
||||
pwm1_pin_g1: pwm1-pin-22 {
|
||||
mux {
|
||||
function = "pwm";
|
||||
groups = "pwm1_0";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins_g1: spic-pins-23-to-26 {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins_g1: uart1-pins-23-to-26 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_1";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins_g2: spic-pins-29-to-32 {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_2";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins_g2: uart1-pins-29-to-32 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_2";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins_g0: uart1-pins-29-to-32 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_2";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins_g1: uart1-pins-23-to-36 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_1";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins_g3: spic-pins-33-to-36 {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_3";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins_g3: uart1-pins-35-to-38 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_3_rx_tx", "uart1_3_cts_rts";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins: uart1-pins-42-to-45 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart1-pins-46-to-49 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2";
|
||||
};
|
||||
};
|
||||
|
||||
pcm_pins: pcm-pins-62-to-65 {
|
||||
mux {
|
||||
function = "pcm";
|
||||
groups = "pcm";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,60 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a-rfb.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-snand-rfb";
|
||||
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&snand {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -0,0 +1,220 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
#include "mt7986-snfi-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-snfi-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
mediatek,quad-spi;
|
||||
status = "okay";
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
snfi_pins: snfi-pins-23-to-28 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI0_CLK";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI0_MOSI", "SPI0_MISO";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,229 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986a.dtsi"
|
||||
#include "mt7986a-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986a RFB";
|
||||
compatible = "mediatek,mt7986a-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt7986-wm8960-machine";
|
||||
mediatek,platform = <&afe>;
|
||||
audio-routing = "Headphone", "HP_L",
|
||||
"Headphone", "HP_R",
|
||||
"LINPUT1", "AMIC",
|
||||
"RINPUT1", "AMIC";
|
||||
mediatek,audio-codec = <&wm8960>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pwm0_pin &pwm1_pin_g1>;
|
||||
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";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
|
||||
wm8960: wm8960@1a {
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
};
|
||||
};
|
||||
|
||||
&auxadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
|
||||
spi_nand: spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins_g2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie0_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,672 @@
|
||||
/*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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/ti-syscon.h>
|
||||
#include <dt-bindings/clock/mt7986-clk.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
#include <dt-bindings/pinctrl/mt65xx.h>
|
||||
|
||||
/ {
|
||||
compatible = "mediatek,mt7986a-rfb";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x1>;
|
||||
};
|
||||
|
||||
cpu2: cpu@2 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x2>;
|
||||
};
|
||||
|
||||
cpu3: cpu@3 {
|
||||
device_type = "cpu";
|
||||
enable-method = "psci";
|
||||
compatible = "arm,cortex-a53";
|
||||
reg = <0x3>;
|
||||
};
|
||||
};
|
||||
|
||||
wed: wed@15010000 {
|
||||
compatible = "mediatek,wed";
|
||||
wed_num = <2>;
|
||||
/* add this property for wed get the pci slot number. */
|
||||
pci_slot_map = <0>, <1>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wed2: wed2@15011000 {
|
||||
compatible = "mediatek,wed2";
|
||||
wed_num = <2>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wdma: wdma@15104800 {
|
||||
compatible = "mediatek,wed-wdma";
|
||||
reg = <0 0x15104800 0 0x400>,
|
||||
<0 0x15104c00 0 0x400>;
|
||||
};
|
||||
|
||||
ap2woccif: ap2woccif@151A5000 {
|
||||
compatible = "mediatek,ap2woccif";
|
||||
reg = <0 0x151A5000 0 0x1000>,
|
||||
<0 0x151AD000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wocpu0_ilm: wocpu0_ilm@151E0000 {
|
||||
compatible = "mediatek,wocpu0_ilm";
|
||||
reg = <0 0x151E0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu1_ilm: wocpu1_ilm@151F0000 {
|
||||
compatible = "mediatek,wocpu1_ilm";
|
||||
reg = <0 0x151F0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu_dlm: wocpu_dlm@151E8000 {
|
||||
compatible = "mediatek,wocpu_dlm";
|
||||
reg = <0 0x151E8000 0 0x2000>,
|
||||
<0 0x151F8000 0 0x2000>;
|
||||
|
||||
resets = <ðsysrst 0>;
|
||||
reset-names = "wocpu_rst";
|
||||
};
|
||||
|
||||
cpu_boot: wocpu_boot@15194000 {
|
||||
compatible = "mediatek,wocpu_boot";
|
||||
reg = <0 0x15194000 0 0x1000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||
secmon_reserved: secmon@43000000 {
|
||||
reg = <0 0x43000000 0 0x30000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wmcpu_emi: wmcpu-reserved@4FC00000 {
|
||||
compatible = "mediatek,wmcpu-reserved";
|
||||
no-map;
|
||||
reg = <0 0x4FC00000 0 0x00100000>;
|
||||
};
|
||||
|
||||
wocpu0_emi: wocpu0_emi@4FD00000 {
|
||||
compatible = "mediatek,wocpu0_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD00000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu1_emi: wocpu1_emi@4FD40000 {
|
||||
compatible = "mediatek,wocpu1_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD40000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu_data: wocpu_data@4FD80000 {
|
||||
compatible = "mediatek,wocpu_data";
|
||||
no-map;
|
||||
reg = <0 0x4FD80000 0 0x240000>;
|
||||
shared = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
clk40m: oscillator@0 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <40000000>;
|
||||
clock-output-names = "clkxtal";
|
||||
};
|
||||
|
||||
system_clk: dummy_system_clk {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <40000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupt-parent = <&gic>;
|
||||
clock-frequency = <13000000>;
|
||||
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>;
|
||||
};
|
||||
|
||||
infracfg_ao: infracfg_ao@10001000 {
|
||||
compatible = "mediatek,mt7986-infracfg_ao", "syscon";
|
||||
reg = <0 0x10001000 0 0x68>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
infracfg: infracfg@10001040 {
|
||||
compatible = "mediatek,mt7986-infracfg", "syscon";
|
||||
reg = <0 0x1000106c 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
topckgen: topckgen@1001B000 {
|
||||
compatible = "mediatek,mt7986-topckgen", "syscon";
|
||||
reg = <0 0x1001B000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
apmixedsys: apmixedsys@1001E000 {
|
||||
compatible = "mediatek,mt7986-apmixedsys", "syscon";
|
||||
reg = <0 0x1001E000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
watchdog: watchdog@1001c000 {
|
||||
compatible = "mediatek,mt7622-wdt",
|
||||
"mediatek,mt6589-wdt";
|
||||
reg = <0 0x1001c000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@c000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x0c000000 0 0x40000>, /* GICD */
|
||||
<0 0x0c080000 0 0x200000>; /* GICR */
|
||||
|
||||
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
pwm: pwm@10048000 {
|
||||
compatible = "mediatek,mt7986-pwm";
|
||||
reg = <0 0x10048000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#pwm-cells = <2>;
|
||||
interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_CK>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_CK>;
|
||||
assigned-clocks = <&topckgen CK_TOP_PWM_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_D4>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_PWM>;
|
||||
clock-names = "top", "main", "pwm1", "pwm2";
|
||||
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_ao CK_INFRA_UART0_CK>;
|
||||
assigned-clocks = <&topckgen CK_TOP_UART_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART0_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&infracfg CK_INFRA_UART>;
|
||||
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_ao CK_INFRA_UART1_CK>;
|
||||
assigned-clocks = <&infracfg_ao CK_INFRA_UART1_SEL>;
|
||||
assigned-clock-parents = <&infracfg CK_INFRA_CK_F26M>;
|
||||
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_ao CK_INFRA_UART2_CK>;
|
||||
assigned-clocks = <&infracfg_ao CK_INFRA_UART2_SEL>;
|
||||
assigned-clock-parents = <&infracfg CK_INFRA_CK_F26M>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@11008000 {
|
||||
compatible = "mediatek,mt7986-i2c";
|
||||
reg = <0 0x11008000 0 0x90>,
|
||||
<0 0x10217080 0 0x80>;
|
||||
interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-div = <5>;
|
||||
clocks = <&infracfg_ao CK_INFRA_I2CO_CK>,
|
||||
<&infracfg_ao CK_INFRA_AP_DMA_CK>;
|
||||
clock-names = "main", "dma";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
thermal-zones {
|
||||
cpu_thermal: cpu-thermal {
|
||||
polling-delay-passive = <1000>;
|
||||
polling-delay = <1000>;
|
||||
thermal-sensors = <&thermal 0>;
|
||||
};
|
||||
};
|
||||
|
||||
thermal: thermal@1100c800 {
|
||||
#thermal-sensor-cells = <1>;
|
||||
compatible = "mediatek,mt7986-thermal";
|
||||
reg = <0 0x1100c800 0 0x800>;
|
||||
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_THERM_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_FRC_CK>;
|
||||
clock-names = "therm", "auxadc", "adc_32k";
|
||||
mediatek,auxadc = <&auxadc>;
|
||||
mediatek,apmixedsys = <&apmixedsys>;
|
||||
nvmem-cells = <&thermal_calibration>;
|
||||
nvmem-cell-names = "calibration-data";
|
||||
};
|
||||
|
||||
pcie0: pcie@11280000 {
|
||||
compatible = "mediatek,mt7986-pcie";
|
||||
reg = <0 0x11280000 0 0x5000>;
|
||||
reg-names = "pcie-mac";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||
bus-range = <0x00 0xff>;
|
||||
ranges = <0x82000000 0 0x20000000
|
||||
0x0 0x20000000 0 0x10000000>;
|
||||
status = "disabled";
|
||||
|
||||
clocks = <&infracfg_ao CK_INFRA_PCIE_SEL>,
|
||||
<&infracfg_ao CK_INFRA_IPCIE_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIE_PIPE_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIER_CK>,
|
||||
<&infracfg_ao CK_INFRA_IPCIEB_CK>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 7>;
|
||||
interrupt-map = <0 0 0 1 &pcie_intc0 0>,
|
||||
<0 0 0 2 &pcie_intc0 1>,
|
||||
<0 0 0 3 &pcie_intc0 2>,
|
||||
<0 0 0 4 &pcie_intc0 3>;
|
||||
pcie_intc0: interrupt-controller {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
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_ao CK_INFRA_EIP97_CK>;
|
||||
clock-names = "infra_eip97_ck";
|
||||
assigned-clocks = <&topckgen CK_TOP_EIP_B_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_NET2_800M>;
|
||||
};
|
||||
|
||||
pio: pinctrl@1001f000 {
|
||||
compatible = "mediatek,mt7986-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_base", "iocfg_rt_base", "iocfg_rb_base",
|
||||
"iocfg_lt_base", "iocfg_lb_base", "iocfg_tr_base",
|
||||
"iocfg_tl_base", "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>;
|
||||
};
|
||||
|
||||
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>;
|
||||
|
||||
ethsysrst: reset-controller {
|
||||
compatible = "ti,syscon-reset";
|
||||
#reset-cells = <1>;
|
||||
ti,reset-bits = <0x34 4 0x34 4 0x34 4 (ASSERT_SET | DEASSERT_CLEAR | STATUS_SET)>;
|
||||
};
|
||||
};
|
||||
|
||||
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 CK_ETH_FE_EN>,
|
||||
<ðsys CK_ETH_GP2_EN>,
|
||||
<ðsys CK_ETH_GP1_EN>,
|
||||
<ðsys CK_ETH_WOCPU1_EN>,
|
||||
<ðsys CK_ETH_WOCPU0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_TX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_RX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CK0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CDR_CK0_EN>,
|
||||
<&sgmiisys1 CK_SGM1_TX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_RX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CK1_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CDR_CK1_EN>;
|
||||
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";
|
||||
assigned-clocks = <&topckgen CK_TOP_NETSYS_2X_SEL>,
|
||||
<&topckgen CK_TOP_SGM_325M_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_NET2_800M>,
|
||||
<&topckgen CK_TOP_CB_SGM_325M>;
|
||||
mediatek,ethsys = <ðsys>;
|
||||
mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
|
||||
#reset-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hnat: hnat@15000000 {
|
||||
compatible = "mediatek,mtk-hnat_v4";
|
||||
reg = <0 0x15100000 0 0x80000>;
|
||||
resets = <ðsys 0>;
|
||||
reset-names = "mtketh";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sgmiisys0: syscon@10060000 {
|
||||
compatible = "mediatek,mt7986-sgmiisys",
|
||||
"mediatek,mt7986-sgmiisys_0",
|
||||
"syscon";
|
||||
reg = <0 0x10060000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
sgmiisys1: syscon@10070000 {
|
||||
compatible = "mediatek,mt7986-sgmiisys",
|
||||
"mediatek,mt7986-sgmiisys_1",
|
||||
"syscon";
|
||||
reg = <0 0x10070000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
snand: snfi@11005000 {
|
||||
compatible = "mediatek,mt7986-snand";
|
||||
reg = <0 0x11005000 0 0x1000>, <0 0x11006000 0 0x1000>;
|
||||
reg-names = "nfi", "ecc";
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_SPINFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI_HCK_CK>;
|
||||
clock-names = "pad_clk", "nfi_clk", "nfi_hclk";
|
||||
assigned-clocks = <&topckgen CK_TOP_SPINFI_SEL>,
|
||||
<&topckgen CK_TOP_NFI1X_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_D8>,
|
||||
<&topckgen CK_TOP_CB_M_D8>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wbsys: wbsys@18000000 {
|
||||
compatible = "mediatek,wbsys";
|
||||
reg = <0 0x18000000 0 0x1000000>;
|
||||
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
|
||||
chip_id = <0x7986>;
|
||||
};
|
||||
|
||||
wed_pcie: wed_pcie@10003000 {
|
||||
compatible = "mediatek,wed_pcie";
|
||||
reg = <0 0x10003000 0 0x10>;
|
||||
};
|
||||
|
||||
spi0: spi@1100a000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x1100a000 0 0x100>;
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPI_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@1100b000 {
|
||||
compatible = "mediatek,ipm-spi-single";
|
||||
reg = <0 0x1100b000 0 0x100>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPIM_MST_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
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 = <&topckgen CK_TOP_EMMC_416M>,
|
||||
<&topckgen CK_TOP_EMMC_250M>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_CK>;
|
||||
clock-names = "source", "hclk", "source_cg";
|
||||
assigned-clocks = <&topckgen CK_TOP_EMMC_416M_SEL>,
|
||||
<&topckgen CK_TOP_EMMC_250M_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_416M>,
|
||||
<&topckgen CK_TOP_NET1_D5_D2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
auxadc: adc@1100d000 {
|
||||
compatible = "mediatek,mt7986-auxadc",
|
||||
"mediatek,mt7622-auxadc";
|
||||
reg = <0 0x1100d000 0 0x1000>;
|
||||
clocks = <&infracfg_ao CK_INFRA_ADC_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_FRC_CK>;
|
||||
clock-names = "main", "32k";
|
||||
#io-channel-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
consys: consys@10000000 {
|
||||
compatible = "mediatek,mt7986-consys";
|
||||
reg = <0 0x10000000 0 0x8600000>;
|
||||
memory-region = <&wmcpu_emi>;
|
||||
};
|
||||
|
||||
xhci: xhci@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>;
|
||||
phys = <&u2port0 PHY_TYPE_USB2>,
|
||||
<&u3port0 PHY_TYPE_USB3>,
|
||||
<&u2port1 PHY_TYPE_USB2>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "sys_ck",
|
||||
"xhci_ck",
|
||||
"ref_ck",
|
||||
"mcu_ck",
|
||||
"dma_ck";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usbtphy: usb-phy@11e10000 {
|
||||
compatible = "mediatek,mt7986",
|
||||
"mediatek,generic-tphy-v2";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
status = "okay";
|
||||
|
||||
u2port0: usb-phy@11e10000 {
|
||||
reg = <0 0x11e10000 0 0x700>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u3port0: usb-phy@11e10700 {
|
||||
reg = <0 0x11e10700 0 0x900>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u2port1: usb-phy@11e11000 {
|
||||
reg = <0 0x11e11000 0 0x700>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
clkitg: clkitg {
|
||||
compatible = "simple-bus";
|
||||
};
|
||||
|
||||
afe: audio-controller@11210000 {
|
||||
compatible = "mediatek,mt7986-audio";
|
||||
reg = <0 0x11210000 0 0x9000>;
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_AUD_BUS_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_L_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_AUD_CK>,
|
||||
<&infracfg_ao CK_INFRA_AUD_EG2_CK>;
|
||||
clock-names = "aud_bus_ck",
|
||||
"aud_26m_ck",
|
||||
"aud_l_ck",
|
||||
"aud_aud_ck",
|
||||
"aud_eg2_ck";
|
||||
assigned-clocks = <&topckgen CK_TOP_A1SYS_SEL>,
|
||||
<&topckgen CK_TOP_AUD_L_SEL>,
|
||||
<&topckgen CK_TOP_A_TUNER_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_APLL2_D4>,
|
||||
<&topckgen CK_TOP_CB_APLL2_196M>,
|
||||
<&topckgen CK_TOP_APLL2_D4>;
|
||||
};
|
||||
|
||||
trng: trng@1020f000 {
|
||||
compatible = "mediatek,mt7986-rng",
|
||||
"mediatek,mt7623-rng";
|
||||
reg = <0 0x1020f000 0 0x100>;
|
||||
clocks = <&infracfg_ao CK_INFRA_TRNG_CK>;
|
||||
clock-names = "rng";
|
||||
};
|
||||
|
||||
ice: ice_debug {
|
||||
compatible = "mediatek,mt7986-ice_debug",
|
||||
"mediatek,mt2701-ice_debug";
|
||||
clocks = <&infracfg_ao CK_INFRA_DBG_CK>,
|
||||
<&topckgen CK_TOP_ARM_DB_JTSEL>;
|
||||
clock-names = "ice_dbg", "dbg_jtsel";
|
||||
};
|
||||
|
||||
efuse: efuse@11d00000 {
|
||||
compatible = "mediatek,mt7986-efuse",
|
||||
"mediatek,efuse";
|
||||
reg = <0 0x11d00000 0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
thermal_calibration: calib@274 {
|
||||
reg = <0x274 0xc>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#include "mt7986-clkitg.dtsi"
|
||||
@@ -0,0 +1,245 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <8>;
|
||||
max-frequency = <50000000>;
|
||||
cap-mmc-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
mmc0_pins_default: mmc0-pins-22-to-32-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO",
|
||||
"SPI0_CS", "SPI0_HOLD", "SPI0_WP",
|
||||
"SPI1_CLK", "SPI1_MOSI", "SPI1_MISO";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI1_CS";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||
};
|
||||
conf-rst {
|
||||
pins = "PWM1";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-22-to-32-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO",
|
||||
"SPI0_CS", "SPI0_HOLD", "SPI0_WP",
|
||||
"SPI1_CLK", "SPI1_MOSI", "SPI1_MISO";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI1_CS";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||
};
|
||||
conf-rst {
|
||||
pins = "PWM1";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,208 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nor-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-nor-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,209 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-snfi-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-snfi-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart1 */
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
mediatek,quad-spi;
|
||||
status = "okay";
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
snfi_pins: snfi-pins-23-to-28 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI0_CLK";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI0_MOSI", "SPI0_MISO";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,218 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
label = "lan5";
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
|
||||
spi_nand: spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,227 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-emmc-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000 \
|
||||
root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <8>;
|
||||
max-frequency = <50000000>;
|
||||
cap-mmc-highspeed;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
mmc0_pins_default: mmc0-pins-22-to-32-default {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO",
|
||||
"SPI0_CS", "SPI0_HOLD", "SPI0_WP",
|
||||
"SPI1_CLK", "SPI1_MOSI", "SPI1_MISO";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI1_CS";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||
};
|
||||
conf-rst {
|
||||
pins = "PWM1";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-pins-22-to-32-uhs {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "emmc_45";
|
||||
};
|
||||
conf-cmd-dat {
|
||||
pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO",
|
||||
"SPI0_CS", "SPI0_HOLD", "SPI0_WP",
|
||||
"SPI1_CLK", "SPI1_MOSI", "SPI1_MISO";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI1_CS";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <2>; /* pull-down 50K */
|
||||
};
|
||||
conf-rst {
|
||||
pins = "PWM1";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
mediatek,pull-up-adv = <1>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,191 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nor-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-nor-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
&pio {
|
||||
i2c_pins: i2c-pins-3-4 {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c";
|
||||
};
|
||||
};
|
||||
|
||||
uart1_pins: uart1-pins-23-to-26 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart1_1";
|
||||
};
|
||||
};
|
||||
|
||||
uart2_pins: uart1-pins-29-to-32 {
|
||||
mux {
|
||||
function = "uart";
|
||||
groups = "uart2_0";
|
||||
};
|
||||
};
|
||||
|
||||
spic_pins: spi1-pins-29-to-32 {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi1_2";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,60 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b-rfb.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-snand-rfb";
|
||||
|
||||
nmbm_spim_nand {
|
||||
compatible = "generic,nmbm";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
lower-mtd-device = <&spi_nand>;
|
||||
forced-create;
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&snand {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -0,0 +1,192 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-snfi-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-snfi-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart1 */
|
||||
&snand {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&snfi_pins>;
|
||||
mediatek,quad-spi;
|
||||
status = "okay";
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
snfi_pins: snfi-pins-23-to-28 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "snfi";
|
||||
};
|
||||
conf-clk {
|
||||
pins = "SPI0_CLK";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI0_MOSI", "SPI0_MISO";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,201 @@
|
||||
/dts-v1/;
|
||||
#include "mt7986b.dtsi"
|
||||
#include "mt7986b-pinctrl.dtsi"
|
||||
#include "mt7986-spim-nand-partition.dtsi"
|
||||
/ {
|
||||
model = "MediaTek MT7986b RFB";
|
||||
compatible = "mediatek,mt7986b-spim-snand-rfb";
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n1 loglevel=8 \
|
||||
earlycon=uart8250,mmio32,0x11002000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0 0x40000000 0 0x10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &snand */
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &spi1 */
|
||||
&uart2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hnat {
|
||||
mtketh-wan = "eth1";
|
||||
mtketh-lan = "lan";
|
||||
mtketh-max-gmac = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_flash_pins>;
|
||||
cs-gpios = <0>, <0>;
|
||||
status = "okay";
|
||||
|
||||
spi_nor@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
|
||||
spi_nand: spi_nand@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <20000000>;
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Warning: pins shared with &uart2 */
|
||||
&spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spic_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wbsys {
|
||||
mediatek,mtd-eeprom = <&factory 0x0000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi_flash_pins: spi-flash-pins-33-to-38 {
|
||||
mux {
|
||||
function = "flash";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
conf-pu {
|
||||
pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-up-adv = <0>; /* bias-disable */
|
||||
};
|
||||
conf-pd {
|
||||
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
|
||||
drive-strength = <MTK_DRIVE_8mA>;
|
||||
mediatek,pull-down-adv = <0>; /* bias-disable */
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,618 @@
|
||||
/*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Sam.Shih <sam.shih@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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/ti-syscon.h>
|
||||
#include <dt-bindings/clock/mt7986-clk.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
#include <dt-bindings/pinctrl/mt65xx.h>
|
||||
|
||||
/ {
|
||||
compatible = "mediatek,mt7986b-rfb";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x1>;
|
||||
};
|
||||
|
||||
cpu2: cpu@2 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53";
|
||||
enable-method = "psci";
|
||||
reg = <0x2>;
|
||||
};
|
||||
|
||||
cpu3: cpu@3 {
|
||||
device_type = "cpu";
|
||||
enable-method = "psci";
|
||||
compatible = "arm,cortex-a53";
|
||||
reg = <0x3>;
|
||||
};
|
||||
};
|
||||
|
||||
wed: wed@15010000 {
|
||||
compatible = "mediatek,wed";
|
||||
wed_num = <2>;
|
||||
/* add this property for wed get the pci slot number. */
|
||||
pci_slot_map = <0>, <1>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wed2: wed2@15011000 {
|
||||
compatible = "mediatek,wed2";
|
||||
wed_num = <2>;
|
||||
reg = <0 0x15010000 0 0x1000>,
|
||||
<0 0x15011000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 206 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wdma: wdma@15104800 {
|
||||
compatible = "mediatek,wed-wdma";
|
||||
reg = <0 0x15104800 0 0x400>,
|
||||
<0 0x15104c00 0 0x400>;
|
||||
};
|
||||
|
||||
ap2woccif: ap2woccif@151A5000 {
|
||||
compatible = "mediatek,ap2woccif";
|
||||
reg = <0 0x151A5000 0 0x1000>,
|
||||
<0 0x151AD000 0 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
wocpu0_ilm: wocpu0_ilm@151E0000 {
|
||||
compatible = "mediatek,wocpu0_ilm";
|
||||
reg = <0 0x151E0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu1_ilm: wocpu1_ilm@151F0000 {
|
||||
compatible = "mediatek,wocpu1_ilm";
|
||||
reg = <0 0x151F0000 0 0x8000>;
|
||||
};
|
||||
|
||||
wocpu_dlm: wocpu_dlm@151E8000 {
|
||||
compatible = "mediatek,wocpu_dlm";
|
||||
reg = <0 0x151E8000 0 0x2000>,
|
||||
<0 0x151F8000 0 0x2000>;
|
||||
|
||||
resets = <ðsysrst 0>;
|
||||
reset-names = "wocpu_rst";
|
||||
};
|
||||
|
||||
cpu_boot: wocpu_boot@15194000 {
|
||||
compatible = "mediatek,wocpu_boot";
|
||||
reg = <0 0x15194000 0 0x1000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 192 KiB reserved for ARM Trusted Firmware (BL31) */
|
||||
secmon_reserved: secmon@43000000 {
|
||||
reg = <0 0x43000000 0 0x30000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wmcpu_emi: wmcpu-reserved@4FC00000 {
|
||||
compatible = "mediatek,wmcpu-reserved";
|
||||
no-map;
|
||||
reg = <0 0x4FC00000 0 0x00100000>;
|
||||
};
|
||||
|
||||
wocpu0_emi: wocpu0_emi@4FD00000 {
|
||||
compatible = "mediatek,wocpu0_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD00000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu1_emi: wocpu1_emi@4FD40000 {
|
||||
compatible = "mediatek,wocpu1_emi";
|
||||
no-map;
|
||||
reg = <0 0x4FD40000 0 0x40000>;
|
||||
shared = <0>;
|
||||
};
|
||||
|
||||
wocpu_data: wocpu_data@4FD80000 {
|
||||
compatible = "mediatek,wocpu_data";
|
||||
no-map;
|
||||
reg = <0 0x4FD80000 0 0x240000>;
|
||||
shared = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
clk40m: oscillator@0 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <40000000>;
|
||||
clock-output-names = "clkxtal";
|
||||
};
|
||||
|
||||
system_clk: dummy_system_clk {
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <40000000>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupt-parent = <&gic>;
|
||||
clock-frequency = <13000000>;
|
||||
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>;
|
||||
};
|
||||
|
||||
infracfg_ao: infracfg_ao@10001000 {
|
||||
compatible = "mediatek,mt7986-infracfg_ao", "syscon";
|
||||
reg = <0 0x10001000 0 0x68>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
infracfg: infracfg@10001040 {
|
||||
compatible = "mediatek,mt7986-infracfg", "syscon";
|
||||
reg = <0 0x1000106c 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
topckgen: topckgen@1001B000 {
|
||||
compatible = "mediatek,mt7986-topckgen", "syscon";
|
||||
reg = <0 0x1001B000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
apmixedsys: apmixedsys@1001E000 {
|
||||
compatible = "mediatek,mt7986-apmixedsys", "syscon";
|
||||
reg = <0 0x1001E000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
watchdog: watchdog@1001c000 {
|
||||
compatible = "mediatek,mt7622-wdt",
|
||||
"mediatek,mt6589-wdt";
|
||||
reg = <0 0x1001c000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@c000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x0c000000 0 0x40000>, /* GICD */
|
||||
<0 0x0c080000 0 0x200000>; /* GICR */
|
||||
|
||||
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
pwm: pwm@10048000 {
|
||||
compatible = "mediatek,mt7986-pwm";
|
||||
reg = <0 0x10048000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#pwm-cells = <2>;
|
||||
interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_CK>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_CK>;
|
||||
assigned-clocks = <&topckgen CK_TOP_PWM_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM_BSEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM1_SEL>,
|
||||
<&infracfg_ao CK_INFRA_PWM2_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_D4>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_PWM>,
|
||||
<&infracfg CK_INFRA_PWM>;
|
||||
clock-names = "top", "main", "pwm1", "pwm2";
|
||||
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_ao CK_INFRA_UART0_CK>;
|
||||
assigned-clocks = <&topckgen CK_TOP_UART_SEL>,
|
||||
<&infracfg_ao CK_INFRA_UART0_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&infracfg CK_INFRA_UART>;
|
||||
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_ao CK_INFRA_UART1_CK>;
|
||||
assigned-clocks = <&infracfg_ao CK_INFRA_UART1_SEL>;
|
||||
assigned-clock-parents = <&infracfg CK_INFRA_CK_F26M>;
|
||||
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_ao CK_INFRA_UART2_CK>;
|
||||
assigned-clocks = <&infracfg_ao CK_INFRA_UART2_SEL>;
|
||||
assigned-clock-parents = <&infracfg CK_INFRA_CK_F26M>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@11008000 {
|
||||
compatible = "mediatek,mt7986-i2c";
|
||||
reg = <0 0x11008000 0 0x90>,
|
||||
<0 0x10217080 0 0x80>;
|
||||
interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-div = <5>;
|
||||
clocks = <&infracfg_ao CK_INFRA_I2CO_CK>,
|
||||
<&infracfg_ao CK_INFRA_AP_DMA_CK>;
|
||||
clock-names = "main", "dma";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
thermal-zones {
|
||||
cpu_thermal: cpu-thermal {
|
||||
polling-delay-passive = <1000>;
|
||||
polling-delay = <1000>;
|
||||
thermal-sensors = <&thermal 0>;
|
||||
};
|
||||
};
|
||||
|
||||
thermal: thermal@1100c800 {
|
||||
#thermal-sensor-cells = <1>;
|
||||
compatible = "mediatek,mt7986-thermal";
|
||||
reg = <0 0x1100c800 0 0x800>;
|
||||
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_THERM_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_FRC_CK>;
|
||||
clock-names = "therm", "auxadc", "adc_32k";
|
||||
mediatek,auxadc = <&auxadc>;
|
||||
mediatek,apmixedsys = <&apmixedsys>;
|
||||
nvmem-cells = <&thermal_calibration>;
|
||||
nvmem-cell-names = "calibration-data";
|
||||
};
|
||||
|
||||
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_ao CK_INFRA_EIP97_CK>;
|
||||
clock-names = "infra_eip97_ck";
|
||||
assigned-clocks = <&topckgen CK_TOP_EIP_B_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_NET2_800M>;
|
||||
};
|
||||
|
||||
pio: pinctrl@1001f000 {
|
||||
compatible = "mediatek,mt7986-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_base", "iocfg_rt_base", "iocfg_rb_base",
|
||||
"iocfg_lt_base", "iocfg_lb_base", "iocfg_tr_base",
|
||||
"iocfg_tl_base", "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>;
|
||||
};
|
||||
|
||||
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>;
|
||||
|
||||
ethsysrst: reset-controller {
|
||||
compatible = "ti,syscon-reset";
|
||||
#reset-cells = <1>;
|
||||
ti,reset-bits = <0x34 4 0x34 4 0x34 4 (ASSERT_SET | DEASSERT_CLEAR | STATUS_SET)>;
|
||||
};
|
||||
};
|
||||
|
||||
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 CK_ETH_FE_EN>,
|
||||
<ðsys CK_ETH_GP2_EN>,
|
||||
<ðsys CK_ETH_GP1_EN>,
|
||||
<ðsys CK_ETH_WOCPU1_EN>,
|
||||
<ðsys CK_ETH_WOCPU0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_TX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_RX_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CK0_EN>,
|
||||
<&sgmiisys0 CK_SGM0_CDR_CK0_EN>,
|
||||
<&sgmiisys1 CK_SGM1_TX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_RX_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CK1_EN>,
|
||||
<&sgmiisys1 CK_SGM1_CDR_CK1_EN>;
|
||||
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";
|
||||
assigned-clocks = <&topckgen CK_TOP_NETSYS_2X_SEL>,
|
||||
<&topckgen CK_TOP_SGM_325M_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_NET2_800M>,
|
||||
<&topckgen CK_TOP_CB_SGM_325M>;
|
||||
mediatek,ethsys = <ðsys>;
|
||||
mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
|
||||
#reset-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hnat: hnat@15000000 {
|
||||
compatible = "mediatek,mtk-hnat_v4";
|
||||
reg = <0 0x15100000 0 0x80000>;
|
||||
resets = <ðsys 0>;
|
||||
reset-names = "mtketh";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sgmiisys0: syscon@10060000 {
|
||||
compatible = "mediatek,mt7986-sgmiisys",
|
||||
"mediatek,mt7986-sgmiisys_0",
|
||||
"syscon";
|
||||
reg = <0 0x10060000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
sgmiisys1: syscon@10070000 {
|
||||
compatible = "mediatek,mt7986-sgmiisys",
|
||||
"mediatek,mt7986-sgmiisys_1",
|
||||
"syscon";
|
||||
reg = <0 0x10070000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
snand: snfi@11005000 {
|
||||
compatible = "mediatek,mt7986-snand";
|
||||
reg = <0 0x11005000 0 0x1000>, <0 0x11006000 0 0x1000>;
|
||||
reg-names = "nfi", "ecc";
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&infracfg_ao CK_INFRA_SPINFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_NFI_HCK_CK>;
|
||||
clock-names = "pad_clk", "nfi_clk", "nfi_hclk";
|
||||
assigned-clocks = <&topckgen CK_TOP_SPINFI_SEL>,
|
||||
<&topckgen CK_TOP_NFI1X_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_M_D8>,
|
||||
<&topckgen CK_TOP_CB_M_D8>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wbsys: wbsys@18000000 {
|
||||
compatible = "mediatek,wbsys";
|
||||
reg = <0 0x18000000 0 0x1000000>;
|
||||
interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
|
||||
chip_id = <0x7986>;
|
||||
};
|
||||
|
||||
wed_pcie: wed_pcie@10003000 {
|
||||
compatible = "mediatek,wed_pcie";
|
||||
reg = <0 0x10003000 0 0x10>;
|
||||
};
|
||||
|
||||
spi0: spi@1100a000 {
|
||||
compatible = "mediatek,ipm-spi-quad";
|
||||
reg = <0 0x1100a000 0 0x100>;
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPI_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI0_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi@1100b000 {
|
||||
compatible = "mediatek,ipm-spi-single";
|
||||
reg = <0 0x1100b000 0 0x100>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&topckgen CK_TOP_CB_M_D2>,
|
||||
<&topckgen CK_TOP_SPIM_MST_SEL>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_CK>,
|
||||
<&infracfg_ao CK_INFRA_SPI1_HCK_CK>;
|
||||
clock-names = "parent-clk", "sel-clk", "spi-clk", "spi-hclk";
|
||||
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 = <&topckgen CK_TOP_EMMC_416M>,
|
||||
<&topckgen CK_TOP_EMMC_250M>,
|
||||
<&infracfg_ao CK_INFRA_MSDC_CK>;
|
||||
clock-names = "source", "hclk", "source_cg";
|
||||
assigned-clocks = <&topckgen CK_TOP_EMMC_416M_SEL>,
|
||||
<&topckgen CK_TOP_EMMC_250M_SEL>;
|
||||
assigned-clock-parents = <&topckgen CK_TOP_CB_CKSQ_40M>,
|
||||
<&topckgen CK_TOP_CB_CKSQ_40M>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
auxadc: adc@1100d000 {
|
||||
compatible = "mediatek,mt7986-auxadc",
|
||||
"mediatek,mt7622-auxadc";
|
||||
reg = <0 0x1100d000 0 0x1000>;
|
||||
clocks = <&infracfg_ao CK_INFRA_ADC_26M_CK>,
|
||||
<&infracfg_ao CK_INFRA_ADC_FRC_CK>;
|
||||
clock-names = "main", "32k";
|
||||
#io-channel-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
consys: consys@10000000 {
|
||||
compatible = "mediatek,mt7986-consys";
|
||||
reg = <0 0x10000000 0 0x8600000>;
|
||||
memory-region = <&wmcpu_emi>;
|
||||
};
|
||||
|
||||
xhci: xhci@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>;
|
||||
phys = <&u3port0 PHY_TYPE_USB3>,
|
||||
<&u2port1 PHY_TYPE_USB2>;
|
||||
clocks = <&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>,
|
||||
<&system_clk>;
|
||||
clock-names = "sys_ck",
|
||||
"xhci_ck",
|
||||
"ref_ck",
|
||||
"mcu_ck",
|
||||
"dma_ck";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usbtphy: usb-phy@11e10000 {
|
||||
compatible = "mediatek,mt7986",
|
||||
"mediatek,generic-tphy-v2";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
status = "okay";
|
||||
|
||||
u2port0: usb-phy@11e10000 {
|
||||
reg = <0 0x11e10000 0 0x700>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
u3port0: usb-phy@11e10700 {
|
||||
reg = <0 0x11e10700 0 0x900>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
u2port1: usb-phy@11e11000 {
|
||||
reg = <0 0x11e11000 0 0x700>;
|
||||
clocks = <&system_clk>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
clkitg: clkitg {
|
||||
compatible = "simple-bus";
|
||||
};
|
||||
|
||||
trng: trng@1020f000 {
|
||||
compatible = "mediatek,mt7986-rng",
|
||||
"mediatek,mt7623-rng";
|
||||
reg = <0 0x1020f000 0 0x100>;
|
||||
clocks = <&infracfg_ao CK_INFRA_TRNG_CK>;
|
||||
clock-names = "rng";
|
||||
};
|
||||
|
||||
ice: ice_debug {
|
||||
compatible = "mediatek,mt7986-ice_debug",
|
||||
"mediatek,mt2701-ice_debug";
|
||||
clocks = <&infracfg_ao CK_INFRA_DBG_CK>,
|
||||
<&topckgen CK_TOP_ARM_DB_JTSEL>;
|
||||
clock-names = "ice_dbg", "dbg_jtsel";
|
||||
};
|
||||
|
||||
efuse: efuse@11d00000 {
|
||||
compatible = "mediatek,mt7986-efuse",
|
||||
"mediatek,efuse";
|
||||
reg = <0 0x11d00000 0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
thermal_calibration: calib@274 {
|
||||
reg = <0x274 0xc>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#include "mt7986-clkitg.dtsi"
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (c) 2015 MediaTek Inc.
|
||||
* Author: James Liao <jamesjj.liao@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "[clk-bringup] " fmt
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
static const struct of_device_id bring_up_id_table[] = {
|
||||
{ .compatible = "mediatek,clk-bring-up",},
|
||||
{ .compatible = "mediatek,mt8163-bring-up",},
|
||||
{ .compatible = "mediatek,mt8173-bring-up",},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, bring_up_id_table);
|
||||
|
||||
static int bring_up_probe(struct platform_device *pdev)
|
||||
{
|
||||
const int NR_CLKS = 300;
|
||||
char clk_name_buf[16];
|
||||
struct clk *clk;
|
||||
int i, r;
|
||||
|
||||
for (i = 0; i < NR_CLKS; i++) {
|
||||
sprintf(clk_name_buf, "%d", i);
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, clk_name_buf);
|
||||
if (!IS_ERR(clk)) {
|
||||
r = clk_prepare_enable(clk);
|
||||
if (r)
|
||||
pr_debug("clk_prepare_enable(%s): %d\n",
|
||||
__clk_get_name(clk), r);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bring_up_remove(struct platform_device *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver bring_up = {
|
||||
.probe = bring_up_probe,
|
||||
.remove = bring_up_remove,
|
||||
.driver = {
|
||||
.name = "bring_up",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = bring_up_id_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(bring_up);
|
||||
@@ -0,0 +1,854 @@
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Wenzhen Yu<Yenzhen.Yu@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
|
||||
#include <dt-bindings/clock/mt7981-clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7981_clk_lock);
|
||||
|
||||
|
||||
|
||||
static const struct mtk_fixed_factor infra_divs[] __initconst = {
|
||||
FACTOR(CK_INFRA_CK_F26M, "infra_ck_f26m", "csw_f26m_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_UART, "infra_uart", "uart_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_ISPI0, "infra_ispi0", "spi_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_I2C, "infra_i2c", "i2c_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_ISPI1, "infra_ispi1", "spim_mst_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM, "infra_pwm", "pwm_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_66M_MCK, "infra_66m_mck", "sysaxi_sel", 1, 2),
|
||||
FACTOR(CK_INFRA_CK_F32K, "infra_ck_f32k", "cb_rtc_32p7k", 1, 1),
|
||||
FACTOR(CK_INFRA_PCIE_CK, "infra_pcie", "pextp_tl_ck_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_BCK, "infra_pwm_bck", "infra_pwm_bsel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_CK1, "infra_pwm_ck1", "infra_pwm1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_CK2, "infra_pwm_ck2", "infra_pwm2_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_133M_HCK, "infra_133m_hck", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_66M_PHCK, "infra_66m_phck", "infra_133m_hck", 1, 1),
|
||||
FACTOR(CK_INFRA_FAUD_L_CK, "infra_faud_l", "aud_l", 1, 1),
|
||||
FACTOR(CK_INFRA_FAUD_AUD_CK, "infra_faud_aud", "a1sys", 1, 1),
|
||||
FACTOR(CK_INFRA_FAUD_EG2_CK, "infra_faud_eg2", "a_tuner", 1, 1),
|
||||
FACTOR(CK_INFRA_I2CS_CK, "infra_i2cs", "i2c_bck", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART0, "infra_mux_uart0", "infra_uart0_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART1, "infra_mux_uart1", "infra_uart1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART2, "infra_mux_uart2", "infra_uart2_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_NFI_CK, "infra_nfi", "nfi1x", 1, 1),
|
||||
FACTOR(CK_INFRA_SPINFI_CK, "infra_spinfi", "spinfi_bck", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_SPI0, "infra_mux_spi0", "infra_spi0_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_SPI1, "infra_mux_spi1", "infra_spi1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_SPI2, "infra_mux_spi2", "infra_spi2_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_RTC_32K, "infra_rtc_32k", "cb_rtc_32k", 1, 1),
|
||||
FACTOR(CK_INFRA_FMSDC_CK, "infra_fmsdc", "emmc_400m", 1, 1),
|
||||
FACTOR(CK_INFRA_FMSDC_HCK_CK, "infra_fmsdc_hck", "emmc_208m", 1, 1),
|
||||
FACTOR(CK_INFRA_PERI_133M, "infra_peri_133m", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_133M_PHCK, "infra_133m_phck", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_SYS_CK, "infra_usb_sys", "u2u3_sys", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_CK, "infra_usb", "u2u3_ref", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_XHCI_CK, "infra_usb_xhci", "u2u3_xhci", 1, 1),
|
||||
FACTOR(CK_INFRA_PCIE_GFMUX_TL_O_PRE, "infra_pcie_mux", "pextp_tl", 1, 1),
|
||||
FACTOR(CK_INFRA_F26M_CK0, "infra_f26m_ck0", "csw_f26m", 1, 1),
|
||||
FACTOR(CK_INFRA_133M_MCK, "infra_133m_mck", "sysaxi", 1, 1),
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_factor top_divs[] __initconst = {
|
||||
FACTOR(CK_TOP_CB_CKSQ_40M, "cb_cksq_40m", "clkxtal", 1, 1),
|
||||
FACTOR(CK_TOP_CB_M_416M, "cb_m_416m", "mpll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_M_D2, "cb_m_d2", "mpll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_M_D3, "cb_m_d3", "mpll", 1, 3),
|
||||
FACTOR(CK_TOP_M_D3_D2, "m_d3_d2", "mpll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_M_D4, "cb_m_d4", "mpll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_M_D8, "cb_m_d8", "mpll", 1, 8),
|
||||
FACTOR(CK_TOP_M_D8_D2, "m_d8_d2", "mpll", 1, 16),
|
||||
FACTOR(CK_TOP_CB_MM_720M, "cb_mm_720m", "mmpll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_MM_D2, "cb_mm_d2", "mmpll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_MM_D3, "cb_mm_d3", "mmpll", 1, 3),
|
||||
FACTOR(CK_TOP_CB_MM_D3_D5, "cb_mm_d3_d5", "mmpll", 1, 15),
|
||||
FACTOR(CK_TOP_CB_MM_D4, "cb_mm_d4", "mmpll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_MM_D6, "cb_mm_d6", "mmpll", 1, 6),
|
||||
FACTOR(CK_TOP_MM_D6_D2, "mm_d6_d2", "mmpll", 1, 12),
|
||||
FACTOR(CK_TOP_CB_MM_D8, "cb_mm_d8", "mmpll", 1, 8),
|
||||
FACTOR(CK_TOP_CB_APLL2_196M, "cb_apll2_196m", "apll2", 1, 1),
|
||||
FACTOR(CK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, 2),
|
||||
FACTOR(CK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
|
||||
FACTOR(CK_TOP_NET1_2500M, "net1_2500m", "net1pll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_NET1_D4, "cb_net1_d4", "net1pll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_NET1_D5, "cb_net1_d5", "net1pll", 1, 5),
|
||||
FACTOR(CK_TOP_NET1_D5_D2, "net1_d5_d2", "net1pll", 1, 10),
|
||||
FACTOR(CK_TOP_NET1_D5_D4, "net1_d5_d4", "net1pll", 1, 20),
|
||||
FACTOR(CK_TOP_CB_NET1_D8, "cb_net1_d8", "net1pll", 1, 8),
|
||||
FACTOR(CK_TOP_NET1_D8_D2, "net1_d8_d2", "net1pll", 1, 16),
|
||||
FACTOR(CK_TOP_NET1_D8_D4, "net1_d8_d4", "net1pll", 1, 32),
|
||||
FACTOR(CK_TOP_CB_NET2_800M, "cb_net2_800m", "net2pll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_NET2_D2, "cb_net2_d2", "net2pll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_NET2_D4, "cb_net2_d4", "net2pll", 1, 4),
|
||||
FACTOR(CK_TOP_NET2_D4_D2, "net2_d4_d2", "net2pll", 1, 8),
|
||||
FACTOR(CK_TOP_NET2_D4_D4, "net2_d4_d4", "net2pll", 1, 16),
|
||||
FACTOR(CK_TOP_CB_NET2_D6, "cb_net2_d6", "net2pll", 1, 6),
|
||||
FACTOR(CK_TOP_CB_WEDMCU_208M, "cb_wedmcu_208m", "wedmcupll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_SGM_325M, "cb_sgm_325m", "sgmpll", 1, 1),
|
||||
FACTOR(CK_TOP_CKSQ_40M_D2, "cksq_40m_d2", "cb_cksq_40m", 1, 2),
|
||||
FACTOR(CK_TOP_CB_RTC_32K, "cb_rtc_32k", "cb_cksq_40m", 1, 1250),
|
||||
FACTOR(CK_TOP_CB_RTC_32P7K, "cb_rtc_32p7k", "cb_cksq_40m", 1, 1220),
|
||||
FACTOR(CK_TOP_USB_TX250M, "usb_tx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_FAUD, "faud", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_NFI1X, "nfi1x", "nfi1x_sel", 1, 1),
|
||||
FACTOR(CK_TOP_USB_EQ_RX250M, "usb_eq_rx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_USB_CDR_CK, "usb_cdr", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_USB_LN0_CK, "usb_ln0", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_SPINFI_BCK, "spinfi_bck", "spinfi_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SPI, "spi", "spi_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SPIM_MST, "spim_mst", "spim_mst_sel", 1, 1),
|
||||
FACTOR(CK_TOP_UART_BCK, "uart_bck", "uart_sel", 1, 1),
|
||||
FACTOR(CK_TOP_PWM_BCK, "pwm_bck", "pwm_sel", 1, 1),
|
||||
FACTOR(CK_TOP_I2C_BCK, "i2c_bck", "i2c_sel", 1, 1),
|
||||
FACTOR(CK_TOP_PEXTP_TL, "pextp_tl", "pextp_tl_ck_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EMMC_208M, "emmc_208m", "emmc_208m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EMMC_400M, "emmc_400m", "emmc_400m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_DRAMC_REF, "dramc_ref", "dramc_sel", 1, 1),
|
||||
FACTOR(CK_TOP_DRAMC_MD32, "dramc_md32", "dramc_md32_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SYSAXI, "sysaxi", "sysaxi_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SYSAPB, "sysapb", "sysapb_sel", 1, 1),
|
||||
FACTOR(CK_TOP_ARM_DB_MAIN, "arm_db_main", "arm_db_main_sel", 1, 1),
|
||||
FACTOR(CK_TOP_AP2CNN_HOST, "ap2cnn_host", "ap2cnn_host_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS, "netsys", "netsys_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS_500M, "netsys_500m", "netsys_500m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS_WED_MCU, "netsys_wed_mcu", "netsys_mcu_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS_2X, "netsys_2x", "netsys_2x_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SGM_325M, "sgm_325m", "sgm_325m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SGM_REG, "sgm_reg", "sgm_reg_sel", 1, 1),
|
||||
FACTOR(CK_TOP_F26M, "csw_f26m", "csw_f26m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EIP97B, "eip97b", "eip97b_sel", 1, 1),
|
||||
FACTOR(CK_TOP_USB3_PHY, "usb3_phy", "usb3_phy_sel", 1, 1),
|
||||
FACTOR(CK_TOP_AUD, "aud", "faud", 1, 1),
|
||||
FACTOR(CK_TOP_A1SYS, "a1sys", "a1sys_sel", 1, 1),
|
||||
FACTOR(CK_TOP_AUD_L, "aud_l", "aud_l_sel", 1, 1),
|
||||
FACTOR(CK_TOP_A_TUNER, "a_tuner", "a_tuner_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_REF, "u2u3_ref", "u2u3_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_SYS, "u2u3_sys", "u2u3_sys_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_XHCI, "u2u3_xhci", "u2u3_xhci_sel", 1, 1),
|
||||
FACTOR(CK_TOP_USB_FRMCNT, "usb_frmcnt", "usb_frmcnt_sel", 1, 1),
|
||||
};
|
||||
|
||||
static const char * const nfi1x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_net2_d6",
|
||||
"cb_m_d4",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d4",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spinfi_parents[] __initconst = {
|
||||
"cksq_40m_d2",
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d4",
|
||||
"mm_d6_d2",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_net2_d6",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const uart_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d8",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const pwm_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"m_d8_d2",
|
||||
"cb_rtc_32k"
|
||||
};
|
||||
|
||||
static const char * const i2c_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const pextp_tl_ck_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"cb_rtc_32k"
|
||||
};
|
||||
|
||||
static const char * const emmc_208m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_net2_d4",
|
||||
"cb_apll2_196m",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_mm_d6"
|
||||
};
|
||||
|
||||
static const char * const emmc_400m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d2",
|
||||
"cb_mm_d2",
|
||||
"cb_net2_d2"
|
||||
};
|
||||
|
||||
static const char * const csw_f26m_parents[] __initconst = {
|
||||
"cksq_40m_d2",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const dramc_md32_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_wedmcu_208m"
|
||||
};
|
||||
|
||||
static const char * const sysaxi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const sysapb_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d3_d2"
|
||||
};
|
||||
|
||||
static const char * const arm_db_main_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d6"
|
||||
};
|
||||
|
||||
static const char * const ap2cnn_host_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const netsys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d2"
|
||||
};
|
||||
|
||||
static const char * const netsys_500m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net1_d5"
|
||||
};
|
||||
|
||||
static const char * const netsys_mcu_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_720m",
|
||||
"cb_net1_d4",
|
||||
"cb_net1_d5",
|
||||
"cb_m_416m"
|
||||
};
|
||||
|
||||
static const char * const netsys_2x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_800m",
|
||||
"cb_mm_720m"
|
||||
};
|
||||
|
||||
static const char * const sgm_325m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_sgm_325m"
|
||||
};
|
||||
|
||||
static const char * const sgm_reg_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d4"
|
||||
};
|
||||
|
||||
static const char * const eip97b_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net1_d5",
|
||||
"cb_m_416m",
|
||||
"cb_mm_d2",
|
||||
"net1_d5_d2"
|
||||
};
|
||||
|
||||
static const char * const aud_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_apll2_196m"
|
||||
};
|
||||
|
||||
static const char * const a1sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4"
|
||||
};
|
||||
|
||||
static const char * const aud_l_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_apll2_196m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const a_tuner_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const u2u3_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const u2u3_sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4"
|
||||
};
|
||||
|
||||
static const char * const usb_frmcnt_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d3_d5"
|
||||
};
|
||||
|
||||
static const struct mtk_mux top_muxes[] = {
|
||||
/* CLK_CFG_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NFI1X_SEL, "nfi1x_sel",
|
||||
nfi1x_parents, 0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SPINFI_SEL, "spinfi_sel",
|
||||
spinfi_parents, 0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SPI_SEL, "spi_sel",
|
||||
spi_parents, 0x000, 0x004, 0x008, 16, 3, 23, 0x1C0, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_UART_SEL, "uart_sel",
|
||||
uart_parents, 0x010, 0x014, 0x018, 0, 2, 7, 0x1C0, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_PWM_SEL, "pwm_sel",
|
||||
pwm_parents, 0x010, 0x014, 0x018, 8, 3, 15, 0x1C0, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_I2C_SEL, "i2c_sel",
|
||||
i2c_parents, 0x010, 0x014, 0x018, 16, 2, 23, 0x1C0, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_EMMC_208M_SEL, "emmc_208m_sel",
|
||||
emmc_208m_parents, 0x020, 0x024, 0x028, 0, 3, 7, 0x1C0, 8),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_EMMC_400M_SEL, "emmc_400m_sel",
|
||||
emmc_400m_parents, 0x020, 0x024, 0x028, 8, 2, 15, 0x1C0, 9),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||
csw_f26m_parents, 0x020, 0x024, 0x028, 16, 1, 23, 0x1C0, 10),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_DRAMC_SEL, "dramc_sel",
|
||||
csw_f26m_parents, 0x020, 0x024, 0x028, 24, 1, 31, 0x1C0, 11),
|
||||
/* CLK_CFG_3 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||
dramc_md32_parents, 0x030, 0x034, 0x038, 0, 2, 7, 0x1C0, 12),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAXI_SEL, "sysaxi_sel",
|
||||
sysaxi_parents, 0x030, 0x034, 0x038, 8, 1, 15, 0x1C0, 13),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAPB_SEL, "sysapb_sel",
|
||||
sysapb_parents, 0x030, 0x034, 0x038, 16, 1, 23, 0x1C0, 14),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel",
|
||||
ap2cnn_host_parents, 0x040, 0x044, 0x048, 0, 1, 7, 0x1C0, 16),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_SEL, "netsys_sel",
|
||||
netsys_parents, 0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_500M_SEL, "netsys_500m_sel",
|
||||
netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, 23, 0x1C0, 18),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_NETSYS_2X_SEL, "netsys_2x_sel",
|
||||
netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7, 0x1C0, 20),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, 0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
||||
sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_EIP97B_SEL, "eip97b_sel",
|
||||
eip97b_parents, 0x050, 0x054, 0x058, 24, 3, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_USB3_PHY_SEL, "usb3_phy_sel",
|
||||
csw_f26m_parents, 0x060, 0x064, 0x068, 0, 1, 7, 0x1C0, 24),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_AUD_SEL, "aud_sel",
|
||||
aud_parents, 0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_A1SYS_SEL, "a1sys_sel",
|
||||
a1sys_parents, 0x060, 0x064, 0x068, 16, 1, 23, 0x1C0, 26),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_AUD_L_SEL, "aud_l_sel",
|
||||
aud_l_parents, 0x060, 0x064, 0x068, 24, 2, 31, 0x1C0, 27),
|
||||
/* CLK_CFG_7 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
||||
a_tuner_parents, 0x070, 0x074, 0x078, 0, 2, 7, 0x1C0, 28),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_SEL, "u2u3_sel",
|
||||
u2u3_parents, 0x070, 0x074, 0x078, 8, 1, 15, 0x1C0, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel",
|
||||
u2u3_sys_parents, 0x070, 0x074, 0x078, 16, 1, 23, 0x1C0, 30),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel",
|
||||
u2u3_sys_parents, 0x070, 0x074, 0x078, 24, 1, 31, 0x1C4, 0),
|
||||
/* CLK_CFG_8 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_USB_FRMCNT_SEL, "usb_frmcnt_sel",
|
||||
usb_frmcnt_parents, 0x080, 0x084, 0x088, 0, 1, 7, 0x1C4, 1),
|
||||
};
|
||||
|
||||
static const char * const infra_uart0_parents[] __initconst = {
|
||||
"infra_ck_f26m",
|
||||
"infra_uart"
|
||||
};
|
||||
|
||||
static const char * const infra_spi0_parents[] __initconst = {
|
||||
"infra_i2c"
|
||||
"infra_ispi0",
|
||||
};
|
||||
|
||||
static const char * const infra_spi1_parents[] __initconst = {
|
||||
"infra_i2c"
|
||||
"infra_ispi1",
|
||||
};
|
||||
|
||||
static const char * const infra_pwm1_parents[] __initconst = {
|
||||
"infra_pwm"
|
||||
};
|
||||
|
||||
static const char * const infra_pwm_bsel_parents[] __initconst = {
|
||||
"infra_ck_f32k",
|
||||
"infra_ck_f26m",
|
||||
"infra_66m_mck",
|
||||
"infra_pwm"
|
||||
};
|
||||
|
||||
static const char * const infra_pcie_parents[] __initconst = {
|
||||
"infra_pcie",
|
||||
"cb_cksq_40m",
|
||||
"infra_ck_f26m",
|
||||
"infra_ck_f32k"
|
||||
};
|
||||
|
||||
static const struct mtk_mux infra_muxes[] = {
|
||||
/* MODULE_CLK_SEL_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART0_SEL, "infra_uart0_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 0, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART1_SEL, "infra_uart1_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 1, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART2_SEL, "infra_uart2_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 2, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI0_SEL, "infra_spi0_sel",
|
||||
infra_spi0_parents, 0x0018, 0x0010, 0x0014, 4, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI1_SEL, "infra_spi1_sel",
|
||||
infra_spi1_parents, 0x0018, 0x0010, 0x0014, 5, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI2_SEL, "infra_spi2_sel",
|
||||
infra_spi0_parents, 0x0018, 0x0010, 0x0014, 6, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM1_SEL, "infra_pwm1_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 9, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM2_SEL, "infra_pwm2_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 11, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM3_SEL, "infra_pwm3_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 15, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_INFRA_PCIE_SEL, "infra_pcie_sel",
|
||||
infra_pcie_parents, 0x0028, 0x0020, 0x0024, 0, 2, -1, -1, -1),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_divider top_adj_divs[] = {
|
||||
DIV_ADJ(CK_TOP_AUD_I2S_M, "aud_i2s_m", "aud", 0x0420, 8, 8),
|
||||
};
|
||||
|
||||
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[] __initconst = {
|
||||
/* INFRA0 */
|
||||
GATE_INFRA0(CK_INFRA_GPT_STA, "infra_gpt_sta", "infra_66m_mck", 0),
|
||||
GATE_INFRA0(CK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_66m_mck", 1),
|
||||
GATE_INFRA0(CK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bck", 2),
|
||||
GATE_INFRA0(CK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm_ck1", 3),
|
||||
GATE_INFRA0(CK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm_ck2", 4),
|
||||
GATE_INFRA0(CK_INFRA_CQ_DMA_CK, "infra_cq_dma", "infra_133m_hck", 6),
|
||||
GATE_INFRA0(CK_INFRA_AUD_BUS_CK, "infra_aud_bus", "infra_66m_phck", 8),
|
||||
GATE_INFRA0(CK_INFRA_AUD_26M_CK, "infra_aud_26m", "infra_ck_f26m", 9),
|
||||
GATE_INFRA0(CK_INFRA_AUD_L_CK, "infra_aud_l", "infra_faud_l", 10),
|
||||
GATE_INFRA0(CK_INFRA_AUD_AUD_CK, "infra_aud_aud", "infra_faud_aud", 11),
|
||||
GATE_INFRA0(CK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "infra_faud_eg2", 13),
|
||||
GATE_INFRA0(CK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "infra_ck_f26m", 14),
|
||||
GATE_INFRA0(CK_INFRA_DBG_CK, "infra_dbg", "infra_66m_mck", 15),
|
||||
GATE_INFRA0(CK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_66m_mck", 16),
|
||||
GATE_INFRA0(CK_INFRA_SEJ_CK, "infra_sej", "infra_66m_mck", 24),
|
||||
GATE_INFRA0(CK_INFRA_SEJ_13M_CK, "infra_sej_13m", "infra_ck_f26m", 25),
|
||||
GATE_INFRA0(CK_INFRA_PWM3_CK, "infra_pwm3", "infra_pwm3_sel", 27),
|
||||
/* INFRA1 */
|
||||
GATE_INFRA1(CK_INFRA_THERM_CK, "infra_therm", "infra_ck_f26m", 0),
|
||||
GATE_INFRA1(CK_INFRA_I2CO_CK, "infra_i2co", "infra_i2cs", 1),
|
||||
GATE_INFRA1(CK_INFRA_UART0_CK, "infra_uart0", "infra_mux_uart0", 2),
|
||||
GATE_INFRA1(CK_INFRA_UART1_CK, "infra_uart1", "infra_mux_uart1", 3),
|
||||
GATE_INFRA1(CK_INFRA_UART2_CK, "infra_uart2", "infra_mux_uart2", 4),
|
||||
GATE_INFRA1(CK_INFRA_SPI2_CK, "infra_spi2", "infra_mux_spi2", 6),
|
||||
GATE_INFRA1(CK_INFRA_SPI2_HCK_CK, "infra_spi2_hck", "infra_66m_mck", 7),
|
||||
GATE_INFRA1(CK_INFRA_NFI1_CK, "infra_nfi1", "infra_nfi", 8),
|
||||
GATE_INFRA1(CK_INFRA_SPINFI1_CK, "infra_spinfi1", "infra_spinfi", 9),
|
||||
GATE_INFRA1(CK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_66m_mck", 10),
|
||||
GATE_INFRA1(CK_INFRA_SPI0_CK, "infra_spi0", "infra_mux_spi0", 11),
|
||||
GATE_INFRA1(CK_INFRA_SPI1_CK, "infra_spi1", "infra_mux_spi1", 12),
|
||||
GATE_INFRA1(CK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_66m_mck", 13),
|
||||
GATE_INFRA1(CK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_66m_mck", 14),
|
||||
GATE_INFRA1(CK_INFRA_FRTC_CK, "infra_frtc", "infra_rtc_32k", 15),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_CK, "infra_msdc", "infra_fmsdc", 16),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "infra_fmsdc_hck", 17),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "infra_peri_133m", 18),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "infra_66m_phck", 19),
|
||||
GATE_INFRA1(CK_INFRA_ADC_26M_CK, "infra_adc_26m", "csw_f26m", 20),
|
||||
GATE_INFRA1(CK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m", 21),
|
||||
GATE_INFRA1(CK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "infra_nfi", 23),
|
||||
GATE_INFRA1(CK_INFRA_I2C_MCK_CK, "infra_i2c_mck", "infra_133m_mck", 25),
|
||||
GATE_INFRA1(CK_INFRA_I2C_PCK_CK, "infra_i2c_pck", "infra_66m_mck", 26),
|
||||
/* INFRA2 */
|
||||
GATE_INFRA2(CK_INFRA_IUSB_133_CK, "infra_iusb_133", "infra_133m_phck", 0),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "infra_66m_phck", 1),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "infra_usb_sys", 2),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_CK, "infra_iusb", "infra_usb", 3),
|
||||
GATE_INFRA2(CK_INFRA_IPCIE_CK, "infra_ipcie", "infra_pcie_mux", 12),
|
||||
GATE_INFRA2(CK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "cb_cksq_40m", 13),
|
||||
GATE_INFRA2(CK_INFRA_IPCIER_CK, "infra_ipcier", "infra_f26m_ck0", 14),
|
||||
GATE_INFRA2(CK_INFRA_IPCIEB_CK, "infra_ipcieb", "infra_133m_phck", 15),
|
||||
};
|
||||
|
||||
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(CK_SGM0_TX_EN, "sgm0_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII0(CK_SGM0_RX_EN, "sgm0_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII0(CK_SGM0_CK0_EN, "sgm0_ck0_en", "usb_ln0", 4),
|
||||
GATE_SGMII0(CK_SGM0_CDR_CK0_EN, "sgm0_cdr_ck0_en", "usb_cdr", 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(CK_SGM1_TX_EN, "sgm1_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII1(CK_SGM1_RX_EN, "sgm1_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII1(CK_SGM1_CK1_EN, "sgm1_ck1_en", "usb_ln0", 4),
|
||||
GATE_SGMII1(CK_SGM1_CDR_CK1_EN, "sgm1_cdr_ck1_en", "usb_cdr", 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(CK_ETH_FE_EN, "eth_fe_en", "netsys_2x", 6),
|
||||
GATE_ETH(CK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m", 7),
|
||||
GATE_ETH(CK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m", 8),
|
||||
GATE_ETH(CK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_wed_mcu", 15),
|
||||
};
|
||||
|
||||
#define MT7981_PLL_FMAX (2500UL * MHZ)
|
||||
|
||||
#define CON0_MT7981_RST_BAR BIT(27)
|
||||
|
||||
#define PLL_B(_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_MT7981_RST_BAR, \
|
||||
.fmax = MT7981_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, _parent_name) \
|
||||
PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
||||
NULL, _parent_name)
|
||||
|
||||
static const struct mtk_pll_data plls[] = {
|
||||
PLL(CK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001,
|
||||
0, 32, 0x0200, 4, 0, 0x0204, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001,
|
||||
0, 32, 0x0210, 4, 0, 0x0214, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001,
|
||||
0, 32, 0x0220, 4, 0, 0x0224, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023C, 0x00000001,
|
||||
0, 32, 0x0230, 4, 0, 0x0234, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024C, 0x00000001,
|
||||
0, 32, 0x0240, 4, 0, 0x0244, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025C, 0x00000001,
|
||||
0, 32, 0x0250, 4, 0, 0x0254, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001,
|
||||
0, 32, 0x0260, 4, 0, 0x0264, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001,
|
||||
0, 32, 0x0278, 4, 0, 0x027C, 0, "clkxtal"),
|
||||
};
|
||||
|
||||
static struct clk_onecell_data *mt7981_top_clk_data __initdata;
|
||||
static struct clk_onecell_data *mt7981_pll_clk_data __initdata;
|
||||
|
||||
static void __init mtk_clk_enable_critical(void)
|
||||
{
|
||||
if (!mt7981_top_clk_data || !mt7981_pll_clk_data)
|
||||
return;
|
||||
|
||||
clk_prepare_enable(mt7981_pll_clk_data->clks[CK_APMIXED_ARMPLL]);
|
||||
clk_prepare_enable(mt7981_top_clk_data->clks[CK_TOP_SYSAXI_SEL]);
|
||||
clk_prepare_enable(mt7981_top_clk_data->clks[CK_TOP_SYSAPB_SEL]);
|
||||
clk_prepare_enable(mt7981_top_clk_data->clks[CK_TOP_DRAMC_SEL]);
|
||||
clk_prepare_enable(mt7981_top_clk_data->clks[CK_TOP_DRAMC_MD32_SEL]);
|
||||
clk_prepare_enable(mt7981_top_clk_data->clks[CK_TOP_F26M_SEL]);
|
||||
}
|
||||
|
||||
static void __init mtk_infracfg_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
||||
mt7981_top_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), mt7981_top_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7981_top_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_infracfg, "mediatek,mt7981-infracfg", mtk_infracfg_init);
|
||||
|
||||
static void __init mtk_topckgen_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
void __iomem *base;
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base) {
|
||||
pr_err("%s(): ioremap failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
mt7981_top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), mt7981_top_clk_data);
|
||||
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node, &mt7981_clk_lock, mt7981_top_clk_data);
|
||||
mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs), base, &mt7981_clk_lock, mt7981_top_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7981_top_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt7981-topckgen", mtk_topckgen_init);
|
||||
|
||||
static void __init mtk_infracfg_ao_init(struct device_node *node)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
int r;
|
||||
void __iomem *base;
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base) {
|
||||
pr_err("%s(): ioremap failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_AO_NR_CLK);
|
||||
|
||||
mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node, &mt7981_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);
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_infracfg_ao, "mediatek,mt7981-infracfg_ao", mtk_infracfg_ao_init);
|
||||
|
||||
static void __init mtk_apmixedsys_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
|
||||
mt7981_pll_clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), mt7981_pll_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7981_pll_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt7981-apmixedsys", mtk_apmixedsys_init);
|
||||
|
||||
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(CLK_SGMII0_NR_CLK);
|
||||
|
||||
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,mt7981-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(CLK_SGMII1_NR_CLK);
|
||||
|
||||
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,mt7981-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(CLK_ETH_NR_CLK);
|
||||
|
||||
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,mt7981-ethsys", mtk_ethsys_init);
|
||||
|
||||
@@ -0,0 +1,814 @@
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Wenzhen Yu<Yenzhen.Yu@mediatek.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
|
||||
|
||||
#include <dt-bindings/clock/mt7986-clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7986_clk_lock);
|
||||
|
||||
|
||||
|
||||
static const struct mtk_fixed_factor infra_divs[] __initconst = {
|
||||
FACTOR(CK_INFRA_CK_F26M, "infra_ck_f26m", "csw_f26m_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_UART, "infra_uart", "uart_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_ISPI0, "infra_ispi0", "spi_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_I2C, "infra_i2c", "i2c_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_ISPI1, "infra_ispi1", "spim_mst_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM, "infra_pwm", "pwm_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_66M_MCK, "infra_66m_mck", "sysaxi_sel", 1, 2),
|
||||
FACTOR(CK_INFRA_CK_F32K, "infra_ck_f32k", "cb_rtc_32p7k", 1, 1),
|
||||
FACTOR(CK_INFRA_PCIE_CK, "infra_pcie", "pextp_tl_ck_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_BCK, "infra_pwm_bck", "infra_pwm_bsel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_CK1, "infra_pwm_ck1", "infra_pwm1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_PWM_CK2, "infra_pwm_ck2", "infra_pwm2_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_133M_HCK, "infra_133m_hck", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_EIP_CK, "infra_eip", "eip_b", 1, 1),
|
||||
FACTOR(CK_INFRA_66M_PHCK, "infra_66m_phck", "infra_133m_hck", 1, 2),
|
||||
FACTOR(CK_INFRA_FAUD_L_CK, "infra_faud_l", "aud_l", 1, 1),
|
||||
FACTOR(CK_INFRA_FAUD_AUD_CK, "infra_faud_aud", "a1sys", 1, 1),
|
||||
FACTOR(CK_INFRA_FAUD_EG2_CK, "infra_faud_eg2", "a_tuner", 1, 1),
|
||||
FACTOR(CK_INFRA_I2CS_CK, "infra_i2cs", "i2c_bck", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART0, "infra_mux_uart0", "infra_uart0_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART1, "infra_mux_uart1", "infra_uart1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_UART2, "infra_mux_uart2", "infra_uart2_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_NFI_CK, "infra_nfi", "nfi1x", 1, 1),
|
||||
FACTOR(CK_INFRA_SPINFI_CK, "infra_spinfi", "spinfi_bck", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_SPI0, "infra_mux_spi0", "infra_spi0_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_MUX_SPI1, "infra_mux_spi1", "infra_spi1_sel", 1, 1),
|
||||
FACTOR(CK_INFRA_RTC_32K, "infra_rtc_32k", "cb_rtc_32k", 1, 1),
|
||||
FACTOR(CK_INFRA_FMSDC_CK, "infra_fmsdc", "emmc_416m", 1, 1),
|
||||
FACTOR(CK_INFRA_FMSDC_HCK_CK, "infra_fmsdc_hck", "emmc_250m", 1, 1),
|
||||
FACTOR(CK_INFRA_PERI_133M, "infra_peri_133m", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_133M_PHCK, "infra_133m_phck", "sysaxi", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_SYS_CK, "infra_usb_sys", "u2u3_sys", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_CK, "infra_usb", "u2u3_ref", 1, 1),
|
||||
FACTOR(CK_INFRA_USB_XHCI_CK, "infra_usb_xhci", "u2u3_xhci", 1, 1),
|
||||
FACTOR(CK_INFRA_PCIE_GFMUX_TL_O_PRE, "infra_pcie_mux", "pextp_tl", 1, 1),
|
||||
FACTOR(CK_INFRA_F26M_CK0, "infra_f26m_ck0", "csw_f26m", 1, 1),
|
||||
FACTOR(CK_INFRA_HD_133M, "infra_hd_133m", "sysaxi", 1, 1),
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_factor top_divs[] __initconst = {
|
||||
FACTOR(CK_TOP_CB_CKSQ_40M, "cb_cksq_40m", "clkxtal", 1, 1),
|
||||
FACTOR(CK_TOP_CB_M_416M, "cb_m_416m", "mpll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_M_D2, "cb_m_d2", "mpll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_M_D4, "cb_m_d4", "mpll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_M_D8, "cb_m_d8", "mpll", 1, 8),
|
||||
FACTOR(CK_TOP_M_D8_D2, "m_d8_d2", "mpll", 1, 16),
|
||||
FACTOR(CK_TOP_M_D3_D2, "m_d3_d2", "mpll", 1, 6),
|
||||
FACTOR(CK_TOP_CB_MM_D2, "cb_mm_d2", "mmpll", 1, 2),
|
||||
FACTOR(CK_TOP_CB_MM_D4, "cb_mm_d4", "mmpll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_MM_D8, "cb_mm_d8", "mmpll", 1, 8),
|
||||
FACTOR(CK_TOP_MM_D8_D2, "mm_d8_d2", "mmpll", 1, 16),
|
||||
FACTOR(CK_TOP_MM_D3_D8, "mm_d3_d8", "mmpll", 1, 24),
|
||||
FACTOR(CK_TOP_CB_U2_PHYD_CK, "cb_u2_phyd", "mmpll", 1, 30),
|
||||
FACTOR(CK_TOP_CB_APLL2_196M, "cb_apll2_196m", "apll2", 1, 1),
|
||||
FACTOR(CK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
|
||||
FACTOR(CK_TOP_CB_NET1_D4, "cb_net1_d4", "net1pll", 1, 4),
|
||||
FACTOR(CK_TOP_CB_NET1_D5, "cb_net1_d5", "net1pll", 1, 5),
|
||||
FACTOR(CK_TOP_NET1_D5_D2, "net1_d5_d2", "net1pll", 1, 10),
|
||||
FACTOR(CK_TOP_NET1_D5_D4, "net1_d5_d4", "net1pll", 1, 20),
|
||||
FACTOR(CK_TOP_NET1_D8_D2, "net1_d8_d2", "net1pll", 1, 16),
|
||||
FACTOR(CK_TOP_NET1_D8_D4, "net1_d8_d4", "net1pll", 1, 32),
|
||||
FACTOR(CK_TOP_CB_NET2_800M, "cb_net2_800m", "net2pll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_NET2_D4, "cb_net2_d4", "net2pll", 1, 4),
|
||||
FACTOR(CK_TOP_NET2_D4_D2, "net2_d4_d2", "net2pll", 1, 8),
|
||||
FACTOR(CK_TOP_NET2_D3_D2, "net2_d3_d2", "net2pll", 1, 6),
|
||||
FACTOR(CK_TOP_CB_WEDMCU_760M, "cb_wedmcu_760m", "wedmcupll", 1, 1),
|
||||
FACTOR(CK_TOP_WEDMCU_D5_D2, "wedmcu_d5_d2", "wedmcupll", 1, 10),
|
||||
FACTOR(CK_TOP_CB_SGM_325M, "cb_sgm_325m", "sgmpll", 1, 1),
|
||||
FACTOR(CK_TOP_CB_CKSQ_40M_D2, "cb_cksq_40m_d2", "cb_cksq_40m", 1, 2),
|
||||
FACTOR(CK_TOP_CB_RTC_32K, "cb_rtc_32k", "cb_cksq_40m", 1, 1250),
|
||||
FACTOR(CK_TOP_CB_RTC_32P7K, "cb_rtc_32p7k", "cb_cksq_40m", 1, 1220),
|
||||
FACTOR(CK_TOP_NFI1X, "nfi1x", "nfi1x_sel", 1, 1),
|
||||
FACTOR(CK_TOP_USB_EQ_RX250M, "usb_eq_rx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_USB_TX250M, "usb_tx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_USB_LN0_CK, "usb_ln0", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_USB_CDR_CK, "usb_cdr", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CK_TOP_SPINFI_BCK, "spinfi_bck", "spinfi_sel", 1, 1),
|
||||
FACTOR(CK_TOP_I2C_BCK, "i2c_bck", "i2c_sel", 1, 1),
|
||||
FACTOR(CK_TOP_PEXTP_TL, "pextp_tl", "pextp_tl_ck_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EMMC_250M, "emmc_250m", "emmc_250m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EMMC_416M, "emmc_416m", "emmc_416m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_F_26M_ADC_CK, "f_26m_adc", "f_26m_adc_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SYSAXI, "sysaxi", "sysaxi_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS_WED_MCU, "netsys_wed_mcu", "netsys_mcu_sel", 1, 1),
|
||||
FACTOR(CK_TOP_NETSYS_2X, "netsys_2x", "netsys_2x_sel", 1, 1),
|
||||
FACTOR(CK_TOP_SGM_325M, "sgm_325m", "sgm_325m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_A1SYS, "a1sys", "a1sys_sel", 1, 1),
|
||||
FACTOR(CK_TOP_EIP_B, "eip_b", "eip_b_sel", 1, 1),
|
||||
FACTOR(CK_TOP_F26M, "csw_f26m", "csw_f26m_sel", 1, 1),
|
||||
FACTOR(CK_TOP_AUD_L, "aud_l", "aud_l_sel", 1, 1),
|
||||
FACTOR(CK_TOP_A_TUNER, "a_tuner", "a_tuner_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_REF, "u2u3_ref", "u2u3_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_SYS, "u2u3_sys", "u2u3_sys_sel", 1, 1),
|
||||
FACTOR(CK_TOP_U2U3_XHCI, "u2u3_xhci", "u2u3_xhci_sel", 1, 1),
|
||||
FACTOR(CK_TOP_AP2CNN_HOST, "ap2cnn_host", "ap2cnn_host_sel", 1, 1),
|
||||
};
|
||||
|
||||
static const char * const nfi1x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d2",
|
||||
"net2_d3_d2",
|
||||
"cb_m_d4",
|
||||
"mm_d8_d2",
|
||||
"wedmcu_d5_d2",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spinfi_parents[] __initconst = {
|
||||
"cb_cksq_40m_d2",
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"mm_d8_d2",
|
||||
"wedmcu_d5_d2",
|
||||
"mm_d3_d8",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d2",
|
||||
"net2_d3_d2",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"wedmcu_d5_d2"
|
||||
};
|
||||
|
||||
static const char * const uart_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d8",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const pwm_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4"
|
||||
};
|
||||
|
||||
static const char * const i2c_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const pextp_tl_ck_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"net2_d4_d2",
|
||||
"cb_rtc_32k"
|
||||
};
|
||||
|
||||
static const char * const emmc_250m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d2"
|
||||
};
|
||||
|
||||
static const char * const emmc_416m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_416m"
|
||||
};
|
||||
|
||||
static const char * const f_26m_adc_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const dramc_md32_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2"
|
||||
};
|
||||
|
||||
static const char * const sysaxi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2",
|
||||
"cb_net2_d4"
|
||||
};
|
||||
|
||||
static const char * const sysapb_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d3_d2",
|
||||
"net2_d4_d2"
|
||||
};
|
||||
|
||||
static const char * const arm_db_main_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net2_d3_d2"
|
||||
};
|
||||
|
||||
static const char * const arm_db_jtsel_parents[] __initconst = {
|
||||
"cb_jtck_50m",
|
||||
"cb_cksq_40m"
|
||||
};
|
||||
|
||||
static const char * const netsys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d4"
|
||||
};
|
||||
|
||||
static const char * const netsys_500m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net1_d5"
|
||||
};
|
||||
|
||||
static const char * const netsys_mcu_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_wedmcu_760m",
|
||||
"cb_mm_d2",
|
||||
"cb_net1_d4",
|
||||
"cb_net1_d5"
|
||||
};
|
||||
|
||||
static const char * const netsys_2x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_800m",
|
||||
"cb_wedmcu_760m",
|
||||
"cb_mm_d2"
|
||||
};
|
||||
|
||||
static const char * const sgm_325m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_sgm_325m"
|
||||
};
|
||||
|
||||
static const char * const sgm_reg_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const a1sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4"
|
||||
};
|
||||
|
||||
static const char * const conn_mcusys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d2"
|
||||
};
|
||||
|
||||
static const char * const eip_b_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_800m"
|
||||
};
|
||||
|
||||
static const char * const aud_l_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_apll2_196m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const a_tuner_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const u2u3_sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4"
|
||||
};
|
||||
|
||||
static const char * const da_u2_refsel_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_u2_phyd"
|
||||
};
|
||||
|
||||
static const struct mtk_mux top_muxes[] = {
|
||||
/* CLK_CFG_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NFI1X_SEL, "nfi1x_sel",
|
||||
nfi1x_parents, 0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SPINFI_SEL, "spinfi_sel",
|
||||
spinfi_parents, 0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SPI_SEL, "spi_sel",
|
||||
spi_parents, 0x000, 0x004, 0x008, 16, 3, 23, 0x1C0, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_UART_SEL, "uart_sel",
|
||||
uart_parents, 0x010, 0x014, 0x018, 0, 2, 7, 0x1C0, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_PWM_SEL, "pwm_sel",
|
||||
pwm_parents, 0x010, 0x014, 0x018, 8, 2, 15, 0x1C0, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_I2C_SEL, "i2c_sel",
|
||||
i2c_parents, 0x010, 0x014, 0x018, 16, 2, 23, 0x1C0, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_EMMC_250M_SEL, "emmc_250m_sel",
|
||||
emmc_250m_parents, 0x020, 0x024, 0x028, 0, 1, 7, 0x1C0, 8),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_EMMC_416M_SEL, "emmc_416m_sel",
|
||||
emmc_416m_parents, 0x020, 0x024, 0x028, 8, 1, 15, 0x1C0, 9),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_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(CK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||
dramc_md32_parents, 0x030, 0x034, 0x038, 0, 1, 7, 0x1C0, 12),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAXI_SEL, "sysaxi_sel",
|
||||
sysaxi_parents, 0x030, 0x034, 0x038, 8, 2, 15, 0x1C0, 13),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAPB_SEL, "sysapb_sel",
|
||||
sysapb_parents, 0x030, 0x034, 0x038, 16, 2, 23, 0x1C0, 14),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_ARM_DB_JTSEL, "arm_db_jtsel",
|
||||
arm_db_jtsel_parents, 0x040, 0x044, 0x048, 0, 1, 7, 0x1C0, 16),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_SEL, "netsys_sel",
|
||||
netsys_parents, 0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_500M_SEL, "netsys_500m_sel",
|
||||
netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, 23, 0x1C0, 18),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_NETSYS_2X_SEL, "netsys_2x_sel",
|
||||
netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7, 0x1C0, 20),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, 0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
||||
sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_A1SYS_SEL, "a1sys_sel",
|
||||
a1sys_parents, 0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_CONN_MCUSYS_SEL, "conn_mcusys_sel",
|
||||
conn_mcusys_parents, 0x060, 0x064, 0x068, 0, 1, 7, 0x1C0, 24),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_EIP_B_SEL, "eip_b_sel",
|
||||
eip_b_parents, 0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_PCIE_PHY_SEL, "pcie_phy_sel",
|
||||
f_26m_adc_parents, 0x060, 0x064, 0x068, 16, 1, 23, 0x1C0, 26),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||
f_26m_adc_parents, 0x070, 0x074, 0x078, 0, 1, 7, 0x1C0, 28),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_AUD_L_SEL, "aud_l_sel",
|
||||
aud_l_parents, 0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
||||
a_tuner_parents, 0x070, 0x074, 0x078, 16, 2, 23, 0x1C0, 30),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel",
|
||||
u2u3_sys_parents, 0x080, 0x084, 0x088, 0, 1, 7, 0x1C4, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel",
|
||||
u2u3_sys_parents, 0x080, 0x084, 0x088, 8, 1, 15, 0x1C4, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CK_TOP_DA_U2_REFSEL, "da_u2_refsel",
|
||||
da_u2_refsel_parents, 0x080, 0x084, 0x088, 16, 1, 23, 0x1C4, 3),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel",
|
||||
sgm_reg_parents, 0x090, 0x094, 0x098, 0, 1, 7, 0x1C4, 5),
|
||||
};
|
||||
|
||||
static const char * const infra_uart0_parents[] __initconst = {
|
||||
"infra_ck_f26m",
|
||||
"infra_uart"
|
||||
};
|
||||
|
||||
static const char * const infra_spi0_parents[] __initconst = {
|
||||
"infra_i2c",
|
||||
"infra_ispi0"
|
||||
};
|
||||
|
||||
static const char * const infra_spi1_parents[] __initconst = {
|
||||
"infra_i2c",
|
||||
"infra_ispi1"
|
||||
};
|
||||
|
||||
static const char * const infra_pwm_bsel_parents[] __initconst = {
|
||||
"infra_ck_f32k",
|
||||
"infra_ck_f26m",
|
||||
"infra_66m_mck",
|
||||
"infra_pwm"
|
||||
};
|
||||
|
||||
static const char * const infra_pcie_parents[] __initconst = {
|
||||
"infra_ck_f32k",
|
||||
"infra_ck_f26m",
|
||||
"cb_cksq_40m",
|
||||
"infra_pcie"
|
||||
};
|
||||
|
||||
static const struct mtk_mux infra_muxes[] = {
|
||||
/* MODULE_CLK_SEL_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART0_SEL, "infra_uart0_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 0, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART1_SEL, "infra_uart1_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 1, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_UART2_SEL, "infra_uart2_sel",
|
||||
infra_uart0_parents, 0x0018, 0x0010, 0x0014, 2, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI0_SEL, "infra_spi0_sel",
|
||||
infra_spi0_parents, 0x0018, 0x0010, 0x0014, 4, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI1_SEL, "infra_spi1_sel",
|
||||
infra_spi1_parents, 0x0018, 0x0010, 0x0014, 5, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM1_SEL, "infra_pwm1_sel",
|
||||
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 9, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM2_SEL, "infra_pwm2_sel",
|
||||
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 11, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CK_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(CK_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[] __initconst = {
|
||||
/* INFRA0 */
|
||||
GATE_INFRA0(CK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_66m_mck", 1),
|
||||
GATE_INFRA0(CK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bck", 2),
|
||||
GATE_INFRA0(CK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm_ck1", 3),
|
||||
GATE_INFRA0(CK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm_ck2", 4),
|
||||
GATE_INFRA0(CK_INFRA_CQ_DMA_CK, "infra_cq_dma", "infra_133m_hck", 6),
|
||||
GATE_INFRA0(CK_INFRA_EIP97_CK, "infra_eip97", "infra_eip", 7),
|
||||
GATE_INFRA0(CK_INFRA_AUD_BUS_CK, "infra_aud_bus", "infra_66m_phck", 8),
|
||||
GATE_INFRA0(CK_INFRA_AUD_26M_CK, "infra_aud_26m", "infra_ck_f26m", 9),
|
||||
GATE_INFRA0(CK_INFRA_AUD_L_CK, "infra_aud_l", "infra_faud_l", 10),
|
||||
GATE_INFRA0(CK_INFRA_AUD_AUD_CK, "infra_aud_aud", "infra_faud_aud", 11),
|
||||
GATE_INFRA0(CK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "infra_faud_eg2", 13),
|
||||
GATE_INFRA0(CK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "infra_ck_f26m", 14),
|
||||
GATE_INFRA0(CK_INFRA_DBG_CK, "infra_dbg", "infra_66m_mck", 15),
|
||||
GATE_INFRA0(CK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_66m_mck", 16),
|
||||
GATE_INFRA0(CK_INFRA_SEJ_CK, "infra_sej", "infra_66m_mck", 24),
|
||||
GATE_INFRA0(CK_INFRA_SEJ_13M_CK, "infra_sej_13m", "infra_ck_f26m", 25),
|
||||
GATE_INFRA0(CK_INFRA_TRNG_CK, "infra_trng", "infra_hd_133m", 26),
|
||||
/* INFRA1 */
|
||||
GATE_INFRA1(CK_INFRA_THERM_CK, "infra_therm", "infra_ck_f26m", 0),
|
||||
GATE_INFRA1(CK_INFRA_I2CO_CK, "infra_i2co", "infra_i2cs", 1),
|
||||
GATE_INFRA1(CK_INFRA_UART0_CK, "infra_uart0", "infra_mux_uart0", 2),
|
||||
GATE_INFRA1(CK_INFRA_UART1_CK, "infra_uart1", "infra_mux_uart1", 3),
|
||||
GATE_INFRA1(CK_INFRA_UART2_CK, "infra_uart2", "infra_mux_uart2", 4),
|
||||
GATE_INFRA1(CK_INFRA_NFI1_CK, "infra_nfi1", "infra_nfi", 8),
|
||||
GATE_INFRA1(CK_INFRA_SPINFI1_CK, "infra_spinfi1", "infra_spinfi", 9),
|
||||
GATE_INFRA1(CK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_66m_mck", 10),
|
||||
GATE_INFRA1(CK_INFRA_SPI0_CK, "infra_spi0", "infra_mux_spi0", 11),
|
||||
GATE_INFRA1(CK_INFRA_SPI1_CK, "infra_spi1", "infra_mux_spi1", 12),
|
||||
GATE_INFRA1(CK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_66m_mck", 13),
|
||||
GATE_INFRA1(CK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_66m_mck", 14),
|
||||
GATE_INFRA1(CK_INFRA_FRTC_CK, "infra_frtc", "infra_rtc_32k", 15),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_CK, "infra_msdc", "infra_fmsdc", 16),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "infra_fmsdc_hck", 17),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "infra_peri_133m", 18),
|
||||
GATE_INFRA1(CK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "infra_66m_phck", 19),
|
||||
GATE_INFRA1(CK_INFRA_ADC_26M_CK, "infra_adc_26m", "csw_f26m", 20),
|
||||
GATE_INFRA1(CK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m", 21),
|
||||
GATE_INFRA1(CK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "infra_nfi", 23),
|
||||
/* INFRA2 */
|
||||
GATE_INFRA2(CK_INFRA_IUSB_133_CK, "infra_iusb_133", "infra_133m_phck", 0),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "infra_66m_phck", 1),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "infra_usb_sys", 2),
|
||||
GATE_INFRA2(CK_INFRA_IUSB_CK, "infra_iusb", "infra_usb", 3),
|
||||
GATE_INFRA2(CK_INFRA_IPCIE_CK, "infra_ipcie", "infra_pcie_mux", 12),
|
||||
GATE_INFRA2(CK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "cb_cksq_40m", 13),
|
||||
GATE_INFRA2(CK_INFRA_IPCIER_CK, "infra_ipcier", "infra_f26m_ck0", 14),
|
||||
GATE_INFRA2(CK_INFRA_IPCIEB_CK, "infra_ipcieb", "infra_133m_phck", 15),
|
||||
};
|
||||
|
||||
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(CK_SGM0_TX_EN, "sgm0_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII0(CK_SGM0_RX_EN, "sgm0_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII0(CK_SGM0_CK0_EN, "sgm0_ck0_en", "usb_ln0", 4),
|
||||
GATE_SGMII0(CK_SGM0_CDR_CK0_EN, "sgm0_cdr_ck0_en", "usb_cdr", 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(CK_SGM1_TX_EN, "sgm1_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII1(CK_SGM1_RX_EN, "sgm1_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII1(CK_SGM1_CK1_EN, "sgm1_ck1_en", "usb_ln0", 4),
|
||||
GATE_SGMII1(CK_SGM1_CDR_CK1_EN, "sgm1_cdr_ck1_en", "usb_cdr", 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(CK_ETH_FE_EN, "eth_fe_en", "netsys_2x", 6),
|
||||
GATE_ETH(CK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m", 7),
|
||||
GATE_ETH(CK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m", 8),
|
||||
GATE_ETH(CK_ETH_WOCPU1_EN, "eth_wocpu1_en", "netsys_wed_mcu", 14),
|
||||
GATE_ETH(CK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_wed_mcu", 15),
|
||||
};
|
||||
|
||||
#define MT7986_PLL_FMAX (2500UL * MHZ)
|
||||
|
||||
#define CON0_MT7986_RST_BAR BIT(27)
|
||||
|
||||
#define PLL_B(_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, _parent_name) \
|
||||
PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
||||
NULL, _parent_name)
|
||||
|
||||
static const struct mtk_pll_data plls[] = {
|
||||
PLL(CK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001,
|
||||
0, 32, 0x0200, 4, 0, 0x0204, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001,
|
||||
0, 32, 0x0210, 4, 0, 0x0214, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001,
|
||||
0, 32, 0x0220, 4, 0, 0x0224, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x00000001,
|
||||
0, 32, 0x0230, 4, 0, 0x0234, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x00000001,
|
||||
0, 32, 0x0240, 4, 0, 0x0244, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x00000001,
|
||||
0, 32, 0x0250, 4, 0, 0x0254, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001,
|
||||
0, 32, 0x0260, 4, 0, 0x0264, 0, "clkxtal"),
|
||||
PLL(CK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001,
|
||||
0, 32, 0x0278, 4, 0, 0x027c, 0, "clkxtal"),
|
||||
};
|
||||
|
||||
static struct clk_onecell_data *mt7986_top_clk_data __initdata;
|
||||
static struct clk_onecell_data *mt7986_pll_clk_data __initdata;
|
||||
|
||||
static void __init mtk_clk_enable_critical(void)
|
||||
{
|
||||
if (!mt7986_top_clk_data || !mt7986_pll_clk_data)
|
||||
return;
|
||||
|
||||
clk_prepare_enable(mt7986_pll_clk_data->clks[CK_APMIXED_ARMPLL]);
|
||||
clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_SYSAXI_SEL]);
|
||||
clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_SYSAPB_SEL]);
|
||||
clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_DRAMC_SEL]);
|
||||
clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_DRAMC_MD32_SEL]);
|
||||
clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_F26M_SEL]);
|
||||
}
|
||||
|
||||
static void __init mtk_infracfg_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
||||
mt7986_top_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), mt7986_top_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_top_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_infracfg, "mediatek,mt7986-infracfg", mtk_infracfg_init);
|
||||
|
||||
static void __init mtk_topckgen_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
void __iomem *base;
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base) {
|
||||
pr_err("%s(): ioremap failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
mt7986_top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), mt7986_top_clk_data);
|
||||
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node, &mt7986_clk_lock, mt7986_top_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_top_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt7986-topckgen", mtk_topckgen_init);
|
||||
|
||||
static void __init mtk_infracfg_ao_init(struct device_node *node)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
int r;
|
||||
void __iomem *base;
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base) {
|
||||
pr_err("%s(): ioremap failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_AO_NR_CLK);
|
||||
|
||||
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);
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_infracfg_ao, "mediatek,mt7986-infracfg_ao", mtk_infracfg_ao_init);
|
||||
|
||||
static void __init mtk_apmixedsys_init(struct device_node *node)
|
||||
{
|
||||
int r;
|
||||
|
||||
mt7986_pll_clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), mt7986_pll_clk_data);
|
||||
|
||||
r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_pll_clk_data);
|
||||
|
||||
if (r)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_clk_enable_critical();
|
||||
}
|
||||
CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt7986-apmixedsys", mtk_apmixedsys_init);
|
||||
|
||||
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(CLK_SGMII0_NR_CLK);
|
||||
|
||||
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(CLK_SGMII1_NR_CLK);
|
||||
|
||||
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(CLK_ETH_NR_CLK);
|
||||
|
||||
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,210 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
/**
|
||||
* Driver for the Ubiquiti RGB LED controller (LEDBAR).
|
||||
* This Controller is based on a Holtek HT32F52241 and connected
|
||||
* via I2C.
|
||||
*
|
||||
* - The Controller needs an enable signal set to high when
|
||||
* performing a transaction. On the U6-LR, this is located
|
||||
* at Pin 18 (R6902)
|
||||
*
|
||||
* - The Pin is also printed when calling the "usetled" function
|
||||
* contained in the ubntapp bootloader application.
|
||||
*/
|
||||
|
||||
#define UBNT_LEDBAR_MAX_BRIGHTNESS 0xff
|
||||
|
||||
#define UBNT_LEDBAR_TRANSACTION_LENGTH 8
|
||||
#define UBNT_LEDBAR_TRANSACTION_SUCCESS 0xaa
|
||||
|
||||
#define UBNT_LEDBAR_TRANSACTION_BLUE_IDX 2
|
||||
#define UBNT_LEDBAR_TRANSACTION_GREEN_IDX 3
|
||||
#define UBNT_LEDBAR_TRANSACTION_RED_IDX 4
|
||||
|
||||
struct ubnt_ledbar {
|
||||
struct mutex lock;
|
||||
struct i2c_client *client;
|
||||
struct led_classdev led_red;
|
||||
struct led_classdev led_green;
|
||||
struct led_classdev led_blue;
|
||||
struct gpio_desc *enable_gpio;
|
||||
};
|
||||
|
||||
static int ubnt_ledbar_perform_transaction(struct ubnt_ledbar *ledbar,
|
||||
char *transaction)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < UBNT_LEDBAR_TRANSACTION_LENGTH; i++)
|
||||
i2c_smbus_write_byte(ledbar->client, transaction[i]);
|
||||
|
||||
return i2c_smbus_read_byte(ledbar->client);
|
||||
}
|
||||
|
||||
static int ubnt_ledbar_apply_state(struct ubnt_ledbar *ledbar)
|
||||
{
|
||||
char setup_msg[UBNT_LEDBAR_TRANSACTION_LENGTH] = {0x40, 0x10, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x11};
|
||||
char led_msg[UBNT_LEDBAR_TRANSACTION_LENGTH] = {0x40, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x01, 0x00};
|
||||
char i2c_response;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&ledbar->lock);
|
||||
|
||||
led_msg[UBNT_LEDBAR_TRANSACTION_BLUE_IDX] = ledbar->led_blue.brightness;
|
||||
led_msg[UBNT_LEDBAR_TRANSACTION_GREEN_IDX] = ledbar->led_green.brightness;
|
||||
led_msg[UBNT_LEDBAR_TRANSACTION_RED_IDX] = ledbar->led_red.brightness;
|
||||
|
||||
gpiod_set_raw_value(ledbar->enable_gpio, 1);
|
||||
|
||||
msleep(10);
|
||||
|
||||
i2c_response = ubnt_ledbar_perform_transaction(ledbar, setup_msg);
|
||||
if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) {
|
||||
dev_err(&ledbar->client->dev, "Error initializing LED transaction: %02x\n", ret);
|
||||
ret = -EINVAL;
|
||||
goto out_gpio;
|
||||
}
|
||||
|
||||
i2c_response = ubnt_ledbar_perform_transaction(ledbar, led_msg);
|
||||
if (i2c_response != UBNT_LEDBAR_TRANSACTION_SUCCESS) {
|
||||
dev_err(&ledbar->client->dev, "Failed LED transaction: %02x\n", ret);
|
||||
ret = -EINVAL;
|
||||
goto out_gpio;
|
||||
}
|
||||
|
||||
msleep(10);
|
||||
out_gpio:
|
||||
gpiod_set_raw_value(ledbar->enable_gpio, 0);
|
||||
|
||||
mutex_unlock(&ledbar->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define UBNT_LEDBAR_CONTROL_RGBS(name) \
|
||||
static int ubnt_ledbar_set_##name##_brightness(struct led_classdev *led_cdev,\
|
||||
enum led_brightness value) \
|
||||
{ \
|
||||
struct ubnt_ledbar *ledbar = \
|
||||
container_of(led_cdev, struct ubnt_ledbar, led_##name); \
|
||||
int ret; \
|
||||
led_cdev->brightness = value; \
|
||||
ret = ubnt_ledbar_apply_state(ledbar); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
UBNT_LEDBAR_CONTROL_RGBS(red);
|
||||
UBNT_LEDBAR_CONTROL_RGBS(green);
|
||||
UBNT_LEDBAR_CONTROL_RGBS(blue);
|
||||
|
||||
|
||||
static int ubnt_ledbar_init_led(struct device_node *np, struct ubnt_ledbar *ledbar,
|
||||
struct led_classdev *led_cdev)
|
||||
{
|
||||
struct led_init_data init_data = {};
|
||||
int ret;
|
||||
|
||||
if (!np)
|
||||
return 0;
|
||||
|
||||
init_data.fwnode = of_fwnode_handle(np);
|
||||
|
||||
led_cdev->max_brightness = UBNT_LEDBAR_MAX_BRIGHTNESS;
|
||||
|
||||
ret = devm_led_classdev_register_ext(&ledbar->client->dev, led_cdev,
|
||||
&init_data);
|
||||
if (ret)
|
||||
dev_err(&ledbar->client->dev, "led register err: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int ubnt_ledbar_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct device_node *np = client->dev.of_node;
|
||||
struct ubnt_ledbar *ledbar;
|
||||
int ret;
|
||||
|
||||
ledbar = devm_kzalloc(&client->dev, sizeof(*ledbar), GFP_KERNEL);
|
||||
if (!ledbar)
|
||||
return -ENOMEM;
|
||||
|
||||
ledbar->enable_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_LOW);
|
||||
|
||||
if (IS_ERR(ledbar->enable_gpio)) {
|
||||
ret = PTR_ERR(ledbar->enable_gpio);
|
||||
dev_err(&client->dev, "Failed to get enable gpio: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
gpiod_direction_output(ledbar->enable_gpio, 0);
|
||||
|
||||
ledbar->client = client;
|
||||
|
||||
mutex_init(&ledbar->lock);
|
||||
|
||||
i2c_set_clientdata(client, ledbar);
|
||||
|
||||
ledbar->led_red.brightness_set_blocking = ubnt_ledbar_set_red_brightness;
|
||||
ubnt_ledbar_init_led(of_get_child_by_name(np, "red"), ledbar, &ledbar->led_red);
|
||||
|
||||
ledbar->led_green.brightness_set_blocking = ubnt_ledbar_set_green_brightness;
|
||||
ubnt_ledbar_init_led(of_get_child_by_name(np, "green"), ledbar, &ledbar->led_green);
|
||||
|
||||
ledbar->led_blue.brightness_set_blocking = ubnt_ledbar_set_blue_brightness;
|
||||
ubnt_ledbar_init_led(of_get_child_by_name(np, "blue"), ledbar, &ledbar->led_blue);
|
||||
|
||||
return ubnt_ledbar_apply_state(ledbar);
|
||||
}
|
||||
|
||||
static int ubnt_ledbar_remove(struct i2c_client *client)
|
||||
{
|
||||
struct ubnt_ledbar *ledbar = i2c_get_clientdata(client);
|
||||
|
||||
mutex_destroy(&ledbar->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id ubnt_ledbar_id[] = {
|
||||
{ "ubnt-ledbar", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ubnt_ledbar_id);
|
||||
|
||||
static const struct of_device_id of_ubnt_ledbar_match[] = {
|
||||
{ .compatible = "ubnt,ledbar", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_ubnt_ledbar_match);
|
||||
|
||||
static struct i2c_driver ubnt_ledbar_driver = {
|
||||
.driver = {
|
||||
.name = "ubnt-ledbar",
|
||||
.of_match_table = of_ubnt_ledbar_match,
|
||||
},
|
||||
.probe = ubnt_ledbar_probe,
|
||||
.remove = ubnt_ledbar_remove,
|
||||
.id_table = ubnt_ledbar_id,
|
||||
};
|
||||
module_i2c_driver(ubnt_ledbar_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Ubiquiti LEDBAR driver");
|
||||
MODULE_AUTHOR("David Bauer <mail@david-bauer.net>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -0,0 +1,3 @@
|
||||
menu "Mediatek Misc"
|
||||
source "drivers/misc/mediatek/ice_debug/Kconfig"
|
||||
endmenu
|
||||
@@ -0,0 +1 @@
|
||||
obj-$(CONFIG_MTK_ICE_DEBUG) +=ice_debug/
|
||||
@@ -0,0 +1,3 @@
|
||||
config MTK_ICE_DEBUG
|
||||
bool "ICE_DEBUG"
|
||||
default y if ARCH_MEDIATEK
|
||||
@@ -0,0 +1,14 @@
|
||||
#
|
||||
# Copyright (C) 2015 MediaTek Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_MTK_ICE_DEBUG) += ice_debug.o
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (C) 2016 MediaTek Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See http://www.gnu.org/licenses/gpl-2.0.html for more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
static const struct of_device_id mt2701_icedbg_match[] = {
|
||||
{.compatible = "mediatek,mt2701-ice_debug", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mt2701_icedbg_match);
|
||||
|
||||
static int mtk_ice_debug_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0;
|
||||
struct clk *clk_icedbg;
|
||||
|
||||
clk_icedbg = devm_clk_get(&pdev->dev, "ice_dbg");
|
||||
if (IS_ERR(clk_icedbg)) {
|
||||
dev_err(&pdev->dev, "get ice_dbg clock fail: %ld\n",
|
||||
PTR_ERR(clk_icedbg));
|
||||
return PTR_ERR(clk_icedbg);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(clk_icedbg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*enable CK_TOP_ARM_DB_JTSEL clk*/
|
||||
clk_icedbg = devm_clk_get(&pdev->dev, "dbg_jtsel");
|
||||
if (IS_ERR(clk_icedbg)) {
|
||||
dev_err(&pdev->dev, "get dbg_sel clock fail: %ld\n",
|
||||
PTR_ERR(clk_icedbg));
|
||||
return PTR_ERR(clk_icedbg);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(clk_icedbg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver mtk_icedbg_driver = {
|
||||
.probe = mtk_ice_debug_probe,
|
||||
.driver = {
|
||||
.name = "mediatek,mt2701-ice_debug",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mt2701_icedbg_match,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mtk_ice_debug_init(void)
|
||||
{
|
||||
return platform_driver_register(&mtk_icedbg_driver);
|
||||
}
|
||||
module_init(mtk_ice_debug_init);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("MediaTek MT2701 ICE_DEBUG Driver");
|
||||
MODULE_AUTHOR("Maoguang Meng <maoguang.meng@mediatek.com>");
|
||||
@@ -0,0 +1,14 @@
|
||||
#
|
||||
# Copyright (C) 2020 MediaTek Inc. All rights reserved.
|
||||
# Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
|
||||
config MTK_SPI_NAND
|
||||
tristate "MediaTek SPI NAND flash controller driver"
|
||||
depends on MTD
|
||||
default n
|
||||
help
|
||||
This option enables access to SPI-NAND flashes through the
|
||||
MTD interface of MediaTek SPI NAND Flash Controller
|
||||
@@ -0,0 +1,11 @@
|
||||
#
|
||||
# Copyright (C) 2020 MediaTek Inc. All rights reserved.
|
||||
# Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
|
||||
obj-y += mtk-snand.o mtk-snand-ecc.o mtk-snand-ids.o mtk-snand-os.o \
|
||||
mtk-snand-mtd.o
|
||||
|
||||
ccflags-y += -DPRIVATE_MTK_SNAND_HEADER
|
||||
@@ -0,0 +1,271 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _MTK_SNAND_DEF_H_
|
||||
#define _MTK_SNAND_DEF_H_
|
||||
|
||||
#include "mtk-snand-os.h"
|
||||
|
||||
#ifdef PRIVATE_MTK_SNAND_HEADER
|
||||
#include "mtk-snand.h"
|
||||
#else
|
||||
#include <mtk-snand.h>
|
||||
#endif
|
||||
|
||||
struct mtk_snand_plat_dev;
|
||||
|
||||
enum snand_flash_io {
|
||||
SNAND_IO_1_1_1,
|
||||
SNAND_IO_1_1_2,
|
||||
SNAND_IO_1_2_2,
|
||||
SNAND_IO_1_1_4,
|
||||
SNAND_IO_1_4_4,
|
||||
|
||||
__SNAND_IO_MAX
|
||||
};
|
||||
|
||||
#define SPI_IO_1_1_1 BIT(SNAND_IO_1_1_1)
|
||||
#define SPI_IO_1_1_2 BIT(SNAND_IO_1_1_2)
|
||||
#define SPI_IO_1_2_2 BIT(SNAND_IO_1_2_2)
|
||||
#define SPI_IO_1_1_4 BIT(SNAND_IO_1_1_4)
|
||||
#define SPI_IO_1_4_4 BIT(SNAND_IO_1_4_4)
|
||||
|
||||
struct snand_opcode {
|
||||
uint8_t opcode;
|
||||
uint8_t dummy;
|
||||
};
|
||||
|
||||
struct snand_io_cap {
|
||||
uint8_t caps;
|
||||
struct snand_opcode opcodes[__SNAND_IO_MAX];
|
||||
};
|
||||
|
||||
#define SNAND_OP(_io, _opcode, _dummy) [_io] = { .opcode = (_opcode), \
|
||||
.dummy = (_dummy) }
|
||||
|
||||
#define SNAND_IO_CAP(_name, _caps, ...) \
|
||||
struct snand_io_cap _name = { .caps = (_caps), \
|
||||
.opcodes = { __VA_ARGS__ } }
|
||||
|
||||
#define SNAND_MAX_ID_LEN 4
|
||||
|
||||
enum snand_id_type {
|
||||
SNAND_ID_DYMMY,
|
||||
SNAND_ID_ADDR = SNAND_ID_DYMMY,
|
||||
SNAND_ID_DIRECT,
|
||||
|
||||
__SNAND_ID_TYPE_MAX
|
||||
};
|
||||
|
||||
struct snand_id {
|
||||
uint8_t type; /* enum snand_id_type */
|
||||
uint8_t len;
|
||||
uint8_t id[SNAND_MAX_ID_LEN];
|
||||
};
|
||||
|
||||
#define SNAND_ID(_type, ...) \
|
||||
{ .type = (_type), .id = { __VA_ARGS__ }, \
|
||||
.len = sizeof((uint8_t[]) { __VA_ARGS__ }) }
|
||||
|
||||
struct snand_mem_org {
|
||||
uint16_t pagesize;
|
||||
uint16_t sparesize;
|
||||
uint16_t pages_per_block;
|
||||
uint16_t blocks_per_die;
|
||||
uint16_t planes_per_die;
|
||||
uint16_t ndies;
|
||||
};
|
||||
|
||||
#define SNAND_MEMORG(_ps, _ss, _ppb, _bpd, _ppd, _nd) \
|
||||
{ .pagesize = (_ps), .sparesize = (_ss), .pages_per_block = (_ppb), \
|
||||
.blocks_per_die = (_bpd), .planes_per_die = (_ppd), .ndies = (_nd) }
|
||||
|
||||
typedef int (*snand_select_die_t)(struct mtk_snand *snf, uint32_t dieidx);
|
||||
|
||||
struct snand_flash_info {
|
||||
const char *model;
|
||||
struct snand_id id;
|
||||
const struct snand_mem_org memorg;
|
||||
const struct snand_io_cap *cap_rd;
|
||||
const struct snand_io_cap *cap_pl;
|
||||
snand_select_die_t select_die;
|
||||
};
|
||||
|
||||
#define SNAND_INFO(_model, _id, _memorg, _cap_rd, _cap_pl, ...) \
|
||||
{ .model = (_model), .id = _id, .memorg = _memorg, \
|
||||
.cap_rd = (_cap_rd), .cap_pl = (_cap_pl), __VA_ARGS__ }
|
||||
|
||||
const struct snand_flash_info *snand_flash_id_lookup(enum snand_id_type type,
|
||||
const uint8_t *id);
|
||||
|
||||
struct mtk_snand_soc_data {
|
||||
uint16_t sector_size;
|
||||
uint16_t max_sectors;
|
||||
uint16_t fdm_size;
|
||||
uint16_t fdm_ecc_size;
|
||||
uint16_t fifo_size;
|
||||
|
||||
bool bbm_swap;
|
||||
bool empty_page_check;
|
||||
uint32_t mastersta_mask;
|
||||
|
||||
const uint8_t *spare_sizes;
|
||||
uint32_t num_spare_size;
|
||||
|
||||
uint16_t latch_lat;
|
||||
uint16_t sample_delay;
|
||||
};
|
||||
|
||||
enum mtk_ecc_regs {
|
||||
ECC_DECDONE,
|
||||
};
|
||||
|
||||
struct mtk_ecc_soc_data {
|
||||
const uint8_t *ecc_caps;
|
||||
uint32_t num_ecc_cap;
|
||||
const uint32_t *regs;
|
||||
uint16_t mode_shift;
|
||||
uint8_t errnum_bits;
|
||||
uint8_t errnum_shift;
|
||||
};
|
||||
|
||||
struct mtk_snand {
|
||||
struct mtk_snand_plat_dev *pdev;
|
||||
|
||||
void __iomem *nfi_base;
|
||||
void __iomem *ecc_base;
|
||||
|
||||
enum mtk_snand_soc soc;
|
||||
const struct mtk_snand_soc_data *nfi_soc;
|
||||
const struct mtk_ecc_soc_data *ecc_soc;
|
||||
bool snfi_quad_spi;
|
||||
bool quad_spi_op;
|
||||
|
||||
const char *model;
|
||||
uint64_t size;
|
||||
uint64_t die_size;
|
||||
uint32_t erasesize;
|
||||
uint32_t writesize;
|
||||
uint32_t oobsize;
|
||||
|
||||
uint32_t num_dies;
|
||||
snand_select_die_t select_die;
|
||||
|
||||
uint8_t opcode_rfc;
|
||||
uint8_t opcode_pl;
|
||||
uint8_t dummy_rfc;
|
||||
uint8_t mode_rfc;
|
||||
uint8_t mode_pl;
|
||||
|
||||
uint32_t writesize_mask;
|
||||
uint32_t writesize_shift;
|
||||
uint32_t erasesize_mask;
|
||||
uint32_t erasesize_shift;
|
||||
uint64_t die_mask;
|
||||
uint32_t die_shift;
|
||||
|
||||
uint32_t spare_per_sector;
|
||||
uint32_t raw_sector_size;
|
||||
uint32_t ecc_strength;
|
||||
uint32_t ecc_steps;
|
||||
uint32_t ecc_bytes;
|
||||
uint32_t ecc_parity_bits;
|
||||
|
||||
uint8_t *page_cache; /* Used by read/write page */
|
||||
uint8_t *buf_cache; /* Used by block bad/markbad & auto_oob */
|
||||
int *sect_bf; /* Used by ECC correction */
|
||||
};
|
||||
|
||||
enum mtk_snand_log_category {
|
||||
SNAND_LOG_NFI,
|
||||
SNAND_LOG_SNFI,
|
||||
SNAND_LOG_ECC,
|
||||
SNAND_LOG_CHIP,
|
||||
|
||||
__SNAND_LOG_CAT_MAX
|
||||
};
|
||||
|
||||
int mtk_ecc_setup(struct mtk_snand *snf, void *fmdaddr, uint32_t max_ecc_bytes,
|
||||
uint32_t msg_size);
|
||||
int mtk_snand_ecc_encoder_start(struct mtk_snand *snf);
|
||||
void mtk_snand_ecc_encoder_stop(struct mtk_snand *snf);
|
||||
int mtk_snand_ecc_decoder_start(struct mtk_snand *snf);
|
||||
void mtk_snand_ecc_decoder_stop(struct mtk_snand *snf);
|
||||
int mtk_ecc_wait_decoder_done(struct mtk_snand *snf);
|
||||
int mtk_ecc_check_decode_error(struct mtk_snand *snf);
|
||||
int mtk_ecc_fixup_empty_sector(struct mtk_snand *snf, uint32_t sect);
|
||||
|
||||
int mtk_snand_mac_io(struct mtk_snand *snf, const uint8_t *out, uint32_t outlen,
|
||||
uint8_t *in, uint32_t inlen);
|
||||
int mtk_snand_set_feature(struct mtk_snand *snf, uint32_t addr, uint32_t val);
|
||||
|
||||
int mtk_snand_log(struct mtk_snand_plat_dev *pdev,
|
||||
enum mtk_snand_log_category cat, const char *fmt, ...);
|
||||
|
||||
#define snand_log_nfi(pdev, fmt, ...) \
|
||||
mtk_snand_log(pdev, SNAND_LOG_NFI, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define snand_log_snfi(pdev, fmt, ...) \
|
||||
mtk_snand_log(pdev, SNAND_LOG_SNFI, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define snand_log_ecc(pdev, fmt, ...) \
|
||||
mtk_snand_log(pdev, SNAND_LOG_ECC, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define snand_log_chip(pdev, fmt, ...) \
|
||||
mtk_snand_log(pdev, SNAND_LOG_CHIP, fmt, ##__VA_ARGS__)
|
||||
|
||||
/* ffs64 */
|
||||
static inline int mtk_snand_ffs64(uint64_t x)
|
||||
{
|
||||
if (!x)
|
||||
return 0;
|
||||
|
||||
if (!(x & 0xffffffff))
|
||||
return ffs((uint32_t)(x >> 32)) + 32;
|
||||
|
||||
return ffs((uint32_t)(x & 0xffffffff));
|
||||
}
|
||||
|
||||
/* NFI dummy commands */
|
||||
#define NFI_CMD_DUMMY_READ 0x00
|
||||
#define NFI_CMD_DUMMY_WRITE 0x80
|
||||
|
||||
/* SPI-NAND opcodes */
|
||||
#define SNAND_CMD_RESET 0xff
|
||||
#define SNAND_CMD_BLOCK_ERASE 0xd8
|
||||
#define SNAND_CMD_READ_FROM_CACHE_QUAD 0xeb
|
||||
#define SNAND_CMD_WINBOND_SELECT_DIE 0xc2
|
||||
#define SNAND_CMD_READ_FROM_CACHE_DUAL 0xbb
|
||||
#define SNAND_CMD_READID 0x9f
|
||||
#define SNAND_CMD_READ_FROM_CACHE_X4 0x6b
|
||||
#define SNAND_CMD_READ_FROM_CACHE_X2 0x3b
|
||||
#define SNAND_CMD_PROGRAM_LOAD_X4 0x32
|
||||
#define SNAND_CMD_SET_FEATURE 0x1f
|
||||
#define SNAND_CMD_READ_TO_CACHE 0x13
|
||||
#define SNAND_CMD_PROGRAM_EXECUTE 0x10
|
||||
#define SNAND_CMD_GET_FEATURE 0x0f
|
||||
#define SNAND_CMD_READ_FROM_CACHE 0x0b
|
||||
#define SNAND_CMD_WRITE_ENABLE 0x06
|
||||
#define SNAND_CMD_PROGRAM_LOAD 0x02
|
||||
|
||||
/* SPI-NAND feature addresses */
|
||||
#define SNAND_FEATURE_MICRON_DIE_ADDR 0xd0
|
||||
#define SNAND_MICRON_DIE_SEL_1 BIT(6)
|
||||
|
||||
#define SNAND_FEATURE_STATUS_ADDR 0xc0
|
||||
#define SNAND_STATUS_OIP BIT(0)
|
||||
#define SNAND_STATUS_WEL BIT(1)
|
||||
#define SNAND_STATUS_ERASE_FAIL BIT(2)
|
||||
#define SNAND_STATUS_PROGRAM_FAIL BIT(3)
|
||||
|
||||
#define SNAND_FEATURE_CONFIG_ADDR 0xb0
|
||||
#define SNAND_FEATURE_QUAD_ENABLE BIT(0)
|
||||
#define SNAND_FEATURE_ECC_EN BIT(4)
|
||||
|
||||
#define SNAND_FEATURE_PROTECT_ADDR 0xa0
|
||||
|
||||
#endif /* _MTK_SNAND_DEF_H_ */
|
||||
@@ -0,0 +1,395 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include "mtk-snand-def.h"
|
||||
|
||||
/* ECC registers */
|
||||
#define ECC_ENCCON 0x000
|
||||
#define ENC_EN BIT(0)
|
||||
|
||||
#define ECC_ENCCNFG 0x004
|
||||
#define ENC_MS_S 16
|
||||
#define ENC_BURST_EN BIT(8)
|
||||
#define ENC_TNUM_S 0
|
||||
|
||||
#define ECC_ENCIDLE 0x00c
|
||||
#define ENC_IDLE BIT(0)
|
||||
|
||||
#define ECC_DECCON 0x100
|
||||
#define DEC_EN BIT(0)
|
||||
|
||||
#define ECC_DECCNFG 0x104
|
||||
#define DEC_EMPTY_EN BIT(31)
|
||||
#define DEC_CS_S 16
|
||||
#define DEC_CON_S 12
|
||||
#define DEC_CON_CORRECT 3
|
||||
#define DEC_BURST_EN BIT(8)
|
||||
#define DEC_TNUM_S 0
|
||||
|
||||
#define ECC_DECIDLE 0x10c
|
||||
#define DEC_IDLE BIT(0)
|
||||
|
||||
#define ECC_DECENUM0 0x114
|
||||
#define ECC_DECENUM(n) (ECC_DECENUM0 + (n) * 4)
|
||||
|
||||
/* ECC_ENCIDLE & ECC_DECIDLE */
|
||||
#define ECC_IDLE BIT(0)
|
||||
|
||||
/* ENC_MODE & DEC_MODE */
|
||||
#define ECC_MODE_NFI 1
|
||||
|
||||
#define ECC_TIMEOUT 500000
|
||||
|
||||
static const uint8_t mt7622_ecc_caps[] = { 4, 6, 8, 10, 12 };
|
||||
|
||||
static const uint8_t mt7986_ecc_caps[] = {
|
||||
4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
|
||||
};
|
||||
|
||||
static const uint32_t mt7622_ecc_regs[] = {
|
||||
[ECC_DECDONE] = 0x11c,
|
||||
};
|
||||
|
||||
static const uint32_t mt7986_ecc_regs[] = {
|
||||
[ECC_DECDONE] = 0x124,
|
||||
};
|
||||
|
||||
static const struct mtk_ecc_soc_data mtk_ecc_socs[__SNAND_SOC_MAX] = {
|
||||
[SNAND_SOC_MT7622] = {
|
||||
.ecc_caps = mt7622_ecc_caps,
|
||||
.num_ecc_cap = ARRAY_SIZE(mt7622_ecc_caps),
|
||||
.regs = mt7622_ecc_regs,
|
||||
.mode_shift = 4,
|
||||
.errnum_bits = 5,
|
||||
.errnum_shift = 5,
|
||||
},
|
||||
[SNAND_SOC_MT7629] = {
|
||||
.ecc_caps = mt7622_ecc_caps,
|
||||
.num_ecc_cap = ARRAY_SIZE(mt7622_ecc_caps),
|
||||
.regs = mt7622_ecc_regs,
|
||||
.mode_shift = 4,
|
||||
.errnum_bits = 5,
|
||||
.errnum_shift = 5,
|
||||
},
|
||||
[SNAND_SOC_MT7986] = {
|
||||
.ecc_caps = mt7986_ecc_caps,
|
||||
.num_ecc_cap = ARRAY_SIZE(mt7986_ecc_caps),
|
||||
.regs = mt7986_ecc_regs,
|
||||
.mode_shift = 5,
|
||||
.errnum_bits = 5,
|
||||
.errnum_shift = 8,
|
||||
},
|
||||
};
|
||||
|
||||
static inline uint32_t ecc_read32(struct mtk_snand *snf, uint32_t reg)
|
||||
{
|
||||
return readl(snf->ecc_base + reg);
|
||||
}
|
||||
|
||||
static inline void ecc_write32(struct mtk_snand *snf, uint32_t reg,
|
||||
uint32_t val)
|
||||
{
|
||||
writel(val, snf->ecc_base + reg);
|
||||
}
|
||||
|
||||
static inline void ecc_write16(struct mtk_snand *snf, uint32_t reg,
|
||||
uint16_t val)
|
||||
{
|
||||
writew(val, snf->ecc_base + reg);
|
||||
}
|
||||
|
||||
static int mtk_ecc_poll(struct mtk_snand *snf, uint32_t reg, uint32_t bits)
|
||||
{
|
||||
uint32_t val;
|
||||
|
||||
return read16_poll_timeout(snf->ecc_base + reg, val, (val & bits), 0,
|
||||
ECC_TIMEOUT);
|
||||
}
|
||||
|
||||
static int mtk_ecc_wait_idle(struct mtk_snand *snf, uint32_t reg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mtk_ecc_poll(snf, reg, ECC_IDLE);
|
||||
if (ret) {
|
||||
snand_log_ecc(snf->pdev, "ECC engine is busy\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_ecc_setup(struct mtk_snand *snf, void *fmdaddr, uint32_t max_ecc_bytes,
|
||||
uint32_t msg_size)
|
||||
{
|
||||
uint32_t i, val, ecc_msg_bits, ecc_strength;
|
||||
int ret;
|
||||
|
||||
snf->ecc_soc = &mtk_ecc_socs[snf->soc];
|
||||
|
||||
snf->ecc_parity_bits = fls(1 + 8 * msg_size);
|
||||
ecc_strength = max_ecc_bytes * 8 / snf->ecc_parity_bits;
|
||||
|
||||
for (i = snf->ecc_soc->num_ecc_cap - 1; i >= 0; i--) {
|
||||
if (snf->ecc_soc->ecc_caps[i] <= ecc_strength)
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(i < 0)) {
|
||||
snand_log_ecc(snf->pdev, "Page size %u+%u is not supported\n",
|
||||
snf->writesize, snf->oobsize);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
snf->ecc_strength = snf->ecc_soc->ecc_caps[i];
|
||||
snf->ecc_bytes = DIV_ROUND_UP(snf->ecc_strength * snf->ecc_parity_bits,
|
||||
8);
|
||||
|
||||
/* Encoder config */
|
||||
ecc_write16(snf, ECC_ENCCON, 0);
|
||||
ret = mtk_ecc_wait_idle(snf, ECC_ENCIDLE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ecc_msg_bits = msg_size * 8;
|
||||
val = (ecc_msg_bits << ENC_MS_S) |
|
||||
(ECC_MODE_NFI << snf->ecc_soc->mode_shift) | i;
|
||||
ecc_write32(snf, ECC_ENCCNFG, val);
|
||||
|
||||
/* Decoder config */
|
||||
ecc_write16(snf, ECC_DECCON, 0);
|
||||
ret = mtk_ecc_wait_idle(snf, ECC_DECIDLE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ecc_msg_bits += snf->ecc_strength * snf->ecc_parity_bits;
|
||||
val = DEC_EMPTY_EN | (ecc_msg_bits << DEC_CS_S) |
|
||||
(DEC_CON_CORRECT << DEC_CON_S) |
|
||||
(ECC_MODE_NFI << snf->ecc_soc->mode_shift) | i;
|
||||
ecc_write32(snf, ECC_DECCNFG, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_snand_ecc_encoder_start(struct mtk_snand *snf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mtk_ecc_wait_idle(snf, ECC_ENCIDLE);
|
||||
if (ret) {
|
||||
ecc_write16(snf, ECC_ENCCON, 0);
|
||||
mtk_ecc_wait_idle(snf, ECC_ENCIDLE);
|
||||
}
|
||||
|
||||
ecc_write16(snf, ECC_ENCCON, ENC_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mtk_snand_ecc_encoder_stop(struct mtk_snand *snf)
|
||||
{
|
||||
mtk_ecc_wait_idle(snf, ECC_ENCIDLE);
|
||||
ecc_write16(snf, ECC_ENCCON, 0);
|
||||
}
|
||||
|
||||
int mtk_snand_ecc_decoder_start(struct mtk_snand *snf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mtk_ecc_wait_idle(snf, ECC_DECIDLE);
|
||||
if (ret) {
|
||||
ecc_write16(snf, ECC_DECCON, 0);
|
||||
mtk_ecc_wait_idle(snf, ECC_DECIDLE);
|
||||
}
|
||||
|
||||
ecc_write16(snf, ECC_DECCON, DEC_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mtk_snand_ecc_decoder_stop(struct mtk_snand *snf)
|
||||
{
|
||||
mtk_ecc_wait_idle(snf, ECC_DECIDLE);
|
||||
ecc_write16(snf, ECC_DECCON, 0);
|
||||
}
|
||||
|
||||
int mtk_ecc_wait_decoder_done(struct mtk_snand *snf)
|
||||
{
|
||||
uint16_t val, step_mask = (1 << snf->ecc_steps) - 1;
|
||||
uint32_t reg = snf->ecc_soc->regs[ECC_DECDONE];
|
||||
int ret;
|
||||
|
||||
ret = read16_poll_timeout(snf->ecc_base + reg, val,
|
||||
(val & step_mask) == step_mask, 0,
|
||||
ECC_TIMEOUT);
|
||||
if (ret)
|
||||
snand_log_ecc(snf->pdev, "ECC decoder is busy\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mtk_ecc_check_decode_error(struct mtk_snand *snf)
|
||||
{
|
||||
uint32_t i, regi, fi, errnum;
|
||||
uint32_t errnum_shift = snf->ecc_soc->errnum_shift;
|
||||
uint32_t errnum_mask = (1 << snf->ecc_soc->errnum_bits) - 1;
|
||||
int ret = 0;
|
||||
|
||||
for (i = 0; i < snf->ecc_steps; i++) {
|
||||
regi = i / 4;
|
||||
fi = i % 4;
|
||||
|
||||
errnum = ecc_read32(snf, ECC_DECENUM(regi));
|
||||
errnum = (errnum >> (fi * errnum_shift)) & errnum_mask;
|
||||
|
||||
if (errnum <= snf->ecc_strength) {
|
||||
snf->sect_bf[i] = errnum;
|
||||
} else {
|
||||
snf->sect_bf[i] = -1;
|
||||
ret = -EBADMSG;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_ecc_check_buf_bitflips(struct mtk_snand *snf, const void *buf,
|
||||
size_t len, uint32_t bitflips)
|
||||
{
|
||||
const uint8_t *buf8 = buf;
|
||||
const uint32_t *buf32;
|
||||
uint32_t d, weight;
|
||||
|
||||
while (len && ((uintptr_t)buf8) % sizeof(uint32_t)) {
|
||||
weight = hweight8(*buf8);
|
||||
bitflips += BITS_PER_BYTE - weight;
|
||||
buf8++;
|
||||
len--;
|
||||
|
||||
if (bitflips > snf->ecc_strength)
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
buf32 = (const uint32_t *)buf8;
|
||||
while (len >= sizeof(uint32_t)) {
|
||||
d = *buf32;
|
||||
|
||||
if (d != ~0) {
|
||||
weight = hweight32(d);
|
||||
bitflips += sizeof(uint32_t) * BITS_PER_BYTE - weight;
|
||||
}
|
||||
|
||||
buf32++;
|
||||
len -= sizeof(uint32_t);
|
||||
|
||||
if (bitflips > snf->ecc_strength)
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
buf8 = (const uint8_t *)buf32;
|
||||
while (len) {
|
||||
weight = hweight8(*buf8);
|
||||
bitflips += BITS_PER_BYTE - weight;
|
||||
buf8++;
|
||||
len--;
|
||||
|
||||
if (bitflips > snf->ecc_strength)
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
return bitflips;
|
||||
}
|
||||
|
||||
static int mtk_ecc_check_parity_bitflips(struct mtk_snand *snf, const void *buf,
|
||||
uint32_t bits, uint32_t bitflips)
|
||||
{
|
||||
uint32_t len, i;
|
||||
uint8_t b;
|
||||
int rc;
|
||||
|
||||
len = bits >> 3;
|
||||
bits &= 7;
|
||||
|
||||
rc = mtk_ecc_check_buf_bitflips(snf, buf, len, bitflips);
|
||||
if (!bits || rc < 0)
|
||||
return rc;
|
||||
|
||||
bitflips = rc;
|
||||
|
||||
/* We want a precise count of bits */
|
||||
b = ((const uint8_t *)buf)[len];
|
||||
for (i = 0; i < bits; i++) {
|
||||
if (!(b & BIT(i)))
|
||||
bitflips++;
|
||||
}
|
||||
|
||||
if (bitflips > snf->ecc_strength)
|
||||
return -EBADMSG;
|
||||
|
||||
return bitflips;
|
||||
}
|
||||
|
||||
static void mtk_ecc_reset_parity(void *buf, uint32_t bits)
|
||||
{
|
||||
uint32_t len;
|
||||
|
||||
len = bits >> 3;
|
||||
bits &= 7;
|
||||
|
||||
memset(buf, 0xff, len);
|
||||
|
||||
/* Only reset bits protected by ECC to 1 */
|
||||
if (bits)
|
||||
((uint8_t *)buf)[len] |= GENMASK(bits - 1, 0);
|
||||
}
|
||||
|
||||
int mtk_ecc_fixup_empty_sector(struct mtk_snand *snf, uint32_t sect)
|
||||
{
|
||||
uint32_t ecc_bytes = snf->spare_per_sector - snf->nfi_soc->fdm_size;
|
||||
uint8_t *oob = snf->page_cache + snf->writesize;
|
||||
uint8_t *data_ptr, *fdm_ptr, *ecc_ptr;
|
||||
int bitflips = 0, ecc_bits, parity_bits;
|
||||
|
||||
parity_bits = fls(snf->nfi_soc->sector_size * 8);
|
||||
ecc_bits = snf->ecc_strength * parity_bits;
|
||||
|
||||
data_ptr = snf->page_cache + sect * snf->nfi_soc->sector_size;
|
||||
fdm_ptr = oob + sect * snf->nfi_soc->fdm_size;
|
||||
ecc_ptr = oob + snf->ecc_steps * snf->nfi_soc->fdm_size +
|
||||
sect * ecc_bytes;
|
||||
|
||||
/*
|
||||
* Check whether DATA + FDM + ECC of a sector contains correctable
|
||||
* bitflips
|
||||
*/
|
||||
bitflips = mtk_ecc_check_buf_bitflips(snf, data_ptr,
|
||||
snf->nfi_soc->sector_size,
|
||||
bitflips);
|
||||
if (bitflips < 0)
|
||||
return -EBADMSG;
|
||||
|
||||
bitflips = mtk_ecc_check_buf_bitflips(snf, fdm_ptr,
|
||||
snf->nfi_soc->fdm_ecc_size,
|
||||
bitflips);
|
||||
if (bitflips < 0)
|
||||
return -EBADMSG;
|
||||
|
||||
bitflips = mtk_ecc_check_parity_bitflips(snf, ecc_ptr, ecc_bits,
|
||||
bitflips);
|
||||
if (bitflips < 0)
|
||||
return -EBADMSG;
|
||||
|
||||
if (!bitflips)
|
||||
return 0;
|
||||
|
||||
/* Reset the data of this sector to 0xff */
|
||||
memset(data_ptr, 0xff, snf->nfi_soc->sector_size);
|
||||
memset(fdm_ptr, 0xff, snf->nfi_soc->fdm_ecc_size);
|
||||
mtk_ecc_reset_parity(ecc_ptr, ecc_bits);
|
||||
|
||||
return bitflips;
|
||||
}
|
||||
@@ -0,0 +1,511 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include "mtk-snand-def.h"
|
||||
|
||||
static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx);
|
||||
static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx);
|
||||
|
||||
#define SNAND_MEMORG_512M_2K_64 SNAND_MEMORG(2048, 64, 64, 512, 1, 1)
|
||||
#define SNAND_MEMORG_1G_2K_64 SNAND_MEMORG(2048, 64, 64, 1024, 1, 1)
|
||||
#define SNAND_MEMORG_2G_2K_64 SNAND_MEMORG(2048, 64, 64, 2048, 1, 1)
|
||||
#define SNAND_MEMORG_2G_2K_120 SNAND_MEMORG(2048, 120, 64, 2048, 1, 1)
|
||||
#define SNAND_MEMORG_4G_2K_64 SNAND_MEMORG(2048, 64, 64, 4096, 1, 1)
|
||||
#define SNAND_MEMORG_1G_2K_120 SNAND_MEMORG(2048, 120, 64, 1024, 1, 1)
|
||||
#define SNAND_MEMORG_1G_2K_128 SNAND_MEMORG(2048, 128, 64, 1024, 1, 1)
|
||||
#define SNAND_MEMORG_2G_2K_128 SNAND_MEMORG(2048, 128, 64, 2048, 1, 1)
|
||||
#define SNAND_MEMORG_4G_2K_128 SNAND_MEMORG(2048, 128, 64, 4096, 1, 1)
|
||||
#define SNAND_MEMORG_4G_4K_240 SNAND_MEMORG(4096, 240, 64, 2048, 1, 1)
|
||||
#define SNAND_MEMORG_4G_4K_256 SNAND_MEMORG(4096, 256, 64, 2048, 1, 1)
|
||||
#define SNAND_MEMORG_8G_4K_256 SNAND_MEMORG(4096, 256, 64, 4096, 1, 1)
|
||||
#define SNAND_MEMORG_2G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 2048, 2, 1)
|
||||
#define SNAND_MEMORG_2G_2K_64_2D SNAND_MEMORG(2048, 64, 64, 1024, 1, 2)
|
||||
#define SNAND_MEMORG_2G_2K_128_2P SNAND_MEMORG(2048, 128, 64, 2048, 2, 1)
|
||||
#define SNAND_MEMORG_4G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 4096, 2, 1)
|
||||
#define SNAND_MEMORG_4G_2K_128_2P_2D SNAND_MEMORG(2048, 128, 64, 2048, 2, 2)
|
||||
#define SNAND_MEMORG_8G_4K_256_2D SNAND_MEMORG(4096, 256, 64, 2048, 1, 2)
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_read_from_cache_quad,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
|
||||
SPI_IO_1_4_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
|
||||
SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
|
||||
SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 4));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_q2d,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
|
||||
SPI_IO_1_4_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
|
||||
SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
|
||||
SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 2));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_a8d,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 |
|
||||
SPI_IO_1_4_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
|
||||
SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8),
|
||||
SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 8));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_read_from_cache_x4,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_1_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_read_from_cache_x4_only,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_program_load_x1,
|
||||
SPI_IO_1_1_1,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0));
|
||||
|
||||
static const SNAND_IO_CAP(snand_cap_program_load_x4,
|
||||
SPI_IO_1_1_1 | SPI_IO_1_1_4,
|
||||
SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0),
|
||||
SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_PROGRAM_LOAD_X4, 0));
|
||||
|
||||
static const struct snand_flash_info snand_flash_ids[] = {
|
||||
SNAND_INFO("W25N512GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x20),
|
||||
SNAND_MEMORG_512M_2K_64,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("W25N01GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x21),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("W25M02GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xab, 0x21),
|
||||
SNAND_MEMORG_2G_2K_64_2D,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4,
|
||||
mtk_snand_winbond_select_die),
|
||||
SNAND_INFO("W25N02KV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x22),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("GD5F1GQ4UAWxx", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x10),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F1GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd1),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F1GQ4UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd9),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F1GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf1),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F2GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd2),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F2GQ5UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x32),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_a8d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F2GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf2),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F4GQ4UBxIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd4),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F4GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf4),
|
||||
SNAND_MEMORG_4G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F2GQ5UExxG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x52),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("GD5F4GQ4UCxIG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0xb4),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("MX35LF1GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x12),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF1G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x14),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX31LF1GE4BC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x1e),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF2GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x22),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF2G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x24),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF2GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x26),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF2G14AC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x20),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF4G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x35),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MX35LF4GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x37),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("MT29F1G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x12),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("MT29F1G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x14),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MT29F2G01AAAED", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x9f),
|
||||
SNAND_MEMORG_2G_2K_64_2P,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("MT29F2G01ABAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x24),
|
||||
SNAND_MEMORG_2G_2K_128_2P,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MT29F4G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x32),
|
||||
SNAND_MEMORG_4G_2K_64_2P,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("MT29F4G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x34),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("MT29F4G01ADAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x36),
|
||||
SNAND_MEMORG_4G_2K_128_2P_2D,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4,
|
||||
mtk_snand_micron_select_die),
|
||||
SNAND_INFO("MT29F8G01ADAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x46),
|
||||
SNAND_MEMORG_8G_4K_256_2D,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4,
|
||||
mtk_snand_micron_select_die),
|
||||
|
||||
SNAND_INFO("TC58CVG0S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xc2),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("TC58CVG1S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcb),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("TC58CVG2S0HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcd),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x1),
|
||||
SNAND_INFO("TC58CVG0S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe2),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("TC58CVG1S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xeb),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("TC58CVG2S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xed),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("TH58CVG3S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe4),
|
||||
SNAND_MEMORG_8G_4K_256,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("F50L512M41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x20),
|
||||
SNAND_MEMORG_512M_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("F50L1G41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("F50L1G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x01),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("F50L2G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x0a),
|
||||
SNAND_MEMORG_2G_2K_64_2D,
|
||||
&snand_cap_read_from_cache_quad,
|
||||
&snand_cap_program_load_x4,
|
||||
mtk_snand_winbond_select_die),
|
||||
|
||||
SNAND_INFO("CS11G0T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x00),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G0G0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x10),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G0S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x20),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G1T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x01),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G1S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x21),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G2T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x02),
|
||||
SNAND_MEMORG_4G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("CS11G2S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x22),
|
||||
SNAND_MEMORG_4G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("EM73B044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x01),
|
||||
SNAND_MEMORG_512M_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x11),
|
||||
SNAND_MEMORG_1G_2K_120,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x09),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x18),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x19),
|
||||
SNAND_MEMORG(2048, 64, 128, 512, 1, 1),
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1c),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1e),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044VCC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x22),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044VCF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x25),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x31),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0a),
|
||||
SNAND_MEMORG_2G_2K_120,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x12),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x10),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x13),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x14),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x17),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCH", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1b),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1f),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x20),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCL", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2e),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x32),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x03),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0b),
|
||||
SNAND_MEMORG_4G_4K_240,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x23),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2c),
|
||||
SNAND_MEMORG_4G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2f),
|
||||
SNAND_MEMORG_4G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73F044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x24),
|
||||
SNAND_MEMORG_8G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73F044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2d),
|
||||
SNAND_MEMORG_8G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73E044SNE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0e),
|
||||
SNAND_MEMORG_8G_4K_256,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73C044SNG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0c),
|
||||
SNAND_MEMORG_1G_2K_120,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("EM73D044VCN", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0f),
|
||||
SNAND_MEMORG_2G_2K_64,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY, 0xe5, 0x71),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe1),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("PN26G02A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe2),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("IS37SML01G1", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("ATO25D1GA", SNAND_ID(SNAND_ID_DYMMY, 0x9b, 0x12),
|
||||
SNAND_MEMORG_1G_2K_64,
|
||||
&snand_cap_read_from_cache_x4_only,
|
||||
&snand_cap_program_load_x4),
|
||||
|
||||
SNAND_INFO("HYF1GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x51),
|
||||
SNAND_MEMORG_1G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
SNAND_INFO("HYF2GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x52),
|
||||
SNAND_MEMORG_2G_2K_128,
|
||||
&snand_cap_read_from_cache_quad_q2d,
|
||||
&snand_cap_program_load_x4),
|
||||
};
|
||||
|
||||
static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx)
|
||||
{
|
||||
uint8_t op[2];
|
||||
|
||||
if (dieidx > 1) {
|
||||
snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
op[0] = SNAND_CMD_WINBOND_SELECT_DIE;
|
||||
op[1] = (uint8_t)dieidx;
|
||||
|
||||
return mtk_snand_mac_io(snf, op, sizeof(op), NULL, 0);
|
||||
}
|
||||
|
||||
static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (dieidx > 1) {
|
||||
snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = mtk_snand_set_feature(snf, SNAND_FEATURE_MICRON_DIE_ADDR,
|
||||
SNAND_MICRON_DIE_SEL_1);
|
||||
if (ret) {
|
||||
snand_log_chip(snf->pdev,
|
||||
"Failed to set die selection feature\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct snand_flash_info *snand_flash_id_lookup(enum snand_id_type type,
|
||||
const uint8_t *id)
|
||||
{
|
||||
const struct snand_id *fid;
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(snand_flash_ids); i++) {
|
||||
if (snand_flash_ids[i].id.type != type)
|
||||
continue;
|
||||
|
||||
fid = &snand_flash_ids[i].id;
|
||||
if (memcmp(fid->id, id, fid->len))
|
||||
continue;
|
||||
|
||||
return &snand_flash_ids[i];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,728 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include "mtk-snand.h"
|
||||
#include "mtk-snand-os.h"
|
||||
|
||||
struct mtk_snand_of_id {
|
||||
enum mtk_snand_soc soc;
|
||||
bool en_ecc_clk;
|
||||
bool en_nfi_hclk;
|
||||
};
|
||||
|
||||
struct mtk_snand_mtd {
|
||||
struct mtk_snand_plat_dev pdev;
|
||||
struct mtk_snand_of_id *soc_id;
|
||||
|
||||
struct clk *nfi_clk;
|
||||
struct clk *pad_clk;
|
||||
struct clk *ecc_clk;
|
||||
struct clk *nfi_hclk;
|
||||
|
||||
void __iomem *nfi_regs;
|
||||
void __iomem *ecc_regs;
|
||||
|
||||
int irq;
|
||||
|
||||
bool quad_spi;
|
||||
enum mtk_snand_soc soc;
|
||||
|
||||
struct mtd_info mtd;
|
||||
struct mtk_snand *snf;
|
||||
struct mtk_snand_chip_info cinfo;
|
||||
uint8_t *page_cache;
|
||||
struct mutex lock;
|
||||
};
|
||||
|
||||
#define mtd_to_msm(mtd) container_of(mtd, struct mtk_snand_mtd, mtd)
|
||||
|
||||
static int mtk_snand_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
u64 start_addr, end_addr;
|
||||
int ret;
|
||||
|
||||
/* Do not allow write past end of device */
|
||||
if ((instr->addr + instr->len) > mtd->size) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to erase beyond end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
start_addr = instr->addr & (~mtd->erasesize_mask);
|
||||
end_addr = instr->addr + instr->len;
|
||||
if (end_addr & mtd->erasesize_mask) {
|
||||
end_addr = (end_addr + mtd->erasesize_mask) &
|
||||
(~mtd->erasesize_mask);
|
||||
}
|
||||
|
||||
mutex_lock(&msm->lock);
|
||||
|
||||
while (start_addr < end_addr) {
|
||||
if (mtk_snand_block_isbad(msm->snf, start_addr)) {
|
||||
instr->fail_addr = start_addr;
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = mtk_snand_erase_block(msm->snf, start_addr);
|
||||
if (ret) {
|
||||
instr->fail_addr = start_addr;
|
||||
break;
|
||||
}
|
||||
|
||||
start_addr += mtd->erasesize;
|
||||
}
|
||||
|
||||
mutex_unlock(&msm->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_read_data(struct mtk_snand_mtd *msm, uint64_t addr,
|
||||
struct mtd_oob_ops *ops)
|
||||
{
|
||||
struct mtd_info *mtd = &msm->mtd;
|
||||
size_t len, ooblen, maxooblen, chklen;
|
||||
uint32_t col, ooboffs;
|
||||
uint8_t *datcache, *oobcache;
|
||||
bool ecc_failed = false, raw = ops->mode == MTD_OPS_RAW ? true : false;
|
||||
int ret, max_bitflips = 0;
|
||||
|
||||
col = addr & mtd->writesize_mask;
|
||||
addr &= ~mtd->writesize_mask;
|
||||
maxooblen = mtd_oobavail(mtd, ops);
|
||||
ooboffs = ops->ooboffs;
|
||||
ooblen = ops->ooblen;
|
||||
len = ops->len;
|
||||
|
||||
datcache = len ? msm->page_cache : NULL;
|
||||
oobcache = ooblen ? msm->page_cache + mtd->writesize : NULL;
|
||||
|
||||
ops->oobretlen = 0;
|
||||
ops->retlen = 0;
|
||||
|
||||
while (len || ooblen) {
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
ret = mtk_snand_read_page_auto_oob(msm->snf, addr,
|
||||
datcache, oobcache, maxooblen, NULL, raw);
|
||||
else
|
||||
ret = mtk_snand_read_page(msm->snf, addr, datcache,
|
||||
oobcache, raw);
|
||||
|
||||
if (ret < 0 && ret != -EBADMSG)
|
||||
return ret;
|
||||
|
||||
if (ret == -EBADMSG) {
|
||||
mtd->ecc_stats.failed++;
|
||||
ecc_failed = true;
|
||||
} else {
|
||||
mtd->ecc_stats.corrected += ret;
|
||||
max_bitflips = max_t(int, ret, max_bitflips);
|
||||
}
|
||||
|
||||
if (len) {
|
||||
/* Move data */
|
||||
chklen = mtd->writesize - col;
|
||||
if (chklen > len)
|
||||
chklen = len;
|
||||
|
||||
memcpy(ops->datbuf + ops->retlen, datcache + col,
|
||||
chklen);
|
||||
len -= chklen;
|
||||
col = 0; /* (col + chklen) % */
|
||||
ops->retlen += chklen;
|
||||
}
|
||||
|
||||
if (ooblen) {
|
||||
/* Move oob */
|
||||
chklen = maxooblen - ooboffs;
|
||||
if (chklen > ooblen)
|
||||
chklen = ooblen;
|
||||
|
||||
memcpy(ops->oobbuf + ops->oobretlen, oobcache + ooboffs,
|
||||
chklen);
|
||||
ooblen -= chklen;
|
||||
ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */
|
||||
ops->oobretlen += chklen;
|
||||
}
|
||||
|
||||
addr += mtd->writesize;
|
||||
}
|
||||
|
||||
return ecc_failed ? -EBADMSG : max_bitflips;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_read_oob(struct mtd_info *mtd, loff_t from,
|
||||
struct mtd_oob_ops *ops)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
uint32_t maxooblen;
|
||||
int ret;
|
||||
|
||||
if (!ops->oobbuf && !ops->datbuf) {
|
||||
if (ops->ooblen || ops->len)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (ops->mode) {
|
||||
case MTD_OPS_PLACE_OOB:
|
||||
case MTD_OPS_AUTO_OOB:
|
||||
case MTD_OPS_RAW:
|
||||
break;
|
||||
default:
|
||||
dev_err(msm->pdev.dev, "unsupported oob mode: %u\n", ops->mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
maxooblen = mtd_oobavail(mtd, ops);
|
||||
|
||||
/* Do not allow read past end of device */
|
||||
if (ops->datbuf && (from + ops->len) > mtd->size) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to read beyond end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(ops->ooboffs >= maxooblen)) {
|
||||
dev_err(msm->pdev.dev, "attempt to start read outside oob\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(from >= mtd->size ||
|
||||
ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
|
||||
(from >> mtd->writesize_shift)) * maxooblen)) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to read beyond end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&msm->lock);
|
||||
ret = mtk_snand_mtd_read_data(msm, from, ops);
|
||||
mutex_unlock(&msm->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_write_data(struct mtk_snand_mtd *msm, uint64_t addr,
|
||||
struct mtd_oob_ops *ops)
|
||||
{
|
||||
struct mtd_info *mtd = &msm->mtd;
|
||||
size_t len, ooblen, maxooblen, chklen, oobwrlen;
|
||||
uint32_t col, ooboffs;
|
||||
uint8_t *datcache, *oobcache;
|
||||
bool raw = ops->mode == MTD_OPS_RAW ? true : false;
|
||||
int ret;
|
||||
|
||||
col = addr & mtd->writesize_mask;
|
||||
addr &= ~mtd->writesize_mask;
|
||||
maxooblen = mtd_oobavail(mtd, ops);
|
||||
ooboffs = ops->ooboffs;
|
||||
ooblen = ops->ooblen;
|
||||
len = ops->len;
|
||||
|
||||
datcache = len ? msm->page_cache : NULL;
|
||||
oobcache = ooblen ? msm->page_cache + mtd->writesize : NULL;
|
||||
|
||||
ops->oobretlen = 0;
|
||||
ops->retlen = 0;
|
||||
|
||||
while (len || ooblen) {
|
||||
if (len) {
|
||||
/* Move data */
|
||||
chklen = mtd->writesize - col;
|
||||
if (chklen > len)
|
||||
chklen = len;
|
||||
|
||||
memset(datcache, 0xff, col);
|
||||
memcpy(datcache + col, ops->datbuf + ops->retlen,
|
||||
chklen);
|
||||
memset(datcache + col + chklen, 0xff,
|
||||
mtd->writesize - col - chklen);
|
||||
len -= chklen;
|
||||
col = 0; /* (col + chklen) % */
|
||||
ops->retlen += chklen;
|
||||
}
|
||||
|
||||
oobwrlen = 0;
|
||||
if (ooblen) {
|
||||
/* Move oob */
|
||||
chklen = maxooblen - ooboffs;
|
||||
if (chklen > ooblen)
|
||||
chklen = ooblen;
|
||||
|
||||
memset(oobcache, 0xff, ooboffs);
|
||||
memcpy(oobcache + ooboffs,
|
||||
ops->oobbuf + ops->oobretlen, chklen);
|
||||
memset(oobcache + ooboffs + chklen, 0xff,
|
||||
mtd->oobsize - ooboffs - chklen);
|
||||
oobwrlen = chklen + ooboffs;
|
||||
ooblen -= chklen;
|
||||
ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */
|
||||
ops->oobretlen += chklen;
|
||||
}
|
||||
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
ret = mtk_snand_write_page_auto_oob(msm->snf, addr,
|
||||
datcache, oobcache, oobwrlen, NULL, raw);
|
||||
else
|
||||
ret = mtk_snand_write_page(msm->snf, addr, datcache,
|
||||
oobcache, raw);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
addr += mtd->writesize;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_write_oob(struct mtd_info *mtd, loff_t to,
|
||||
struct mtd_oob_ops *ops)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
uint32_t maxooblen;
|
||||
int ret;
|
||||
|
||||
if (!ops->oobbuf && !ops->datbuf) {
|
||||
if (ops->ooblen || ops->len)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (ops->mode) {
|
||||
case MTD_OPS_PLACE_OOB:
|
||||
case MTD_OPS_AUTO_OOB:
|
||||
case MTD_OPS_RAW:
|
||||
break;
|
||||
default:
|
||||
dev_err(msm->pdev.dev, "unsupported oob mode: %u\n", ops->mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
maxooblen = mtd_oobavail(mtd, ops);
|
||||
|
||||
/* Do not allow write past end of device */
|
||||
if (ops->datbuf && (to + ops->len) > mtd->size) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to write beyond end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(ops->ooboffs >= maxooblen)) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to start write outside oob\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(to >= mtd->size ||
|
||||
ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
|
||||
(to >> mtd->writesize_shift)) * maxooblen)) {
|
||||
dev_err(msm->pdev.dev,
|
||||
"attempt to write beyond end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&msm->lock);
|
||||
ret = mtk_snand_mtd_write_data(msm, to, ops);
|
||||
mutex_unlock(&msm->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_block_isbad(struct mtd_info *mtd, loff_t offs)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&msm->lock);
|
||||
ret = mtk_snand_block_isbad(msm->snf, offs);
|
||||
mutex_unlock(&msm->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_mtd_block_markbad(struct mtd_info *mtd, loff_t offs)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&msm->lock);
|
||||
ret = mtk_snand_block_markbad(msm->snf, offs);
|
||||
mutex_unlock(&msm->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *oobecc)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
|
||||
if (section)
|
||||
return -ERANGE;
|
||||
|
||||
oobecc->offset = msm->cinfo.fdm_size * msm->cinfo.num_sectors;
|
||||
oobecc->length = mtd->oobsize - oobecc->offset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtk_snand_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *oobfree)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = mtd_to_msm(mtd);
|
||||
|
||||
if (section >= msm->cinfo.num_sectors)
|
||||
return -ERANGE;
|
||||
|
||||
oobfree->length = msm->cinfo.fdm_size - 1;
|
||||
oobfree->offset = section * msm->cinfo.fdm_size + 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t mtk_snand_irq(int irq, void *id)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = id;
|
||||
int ret;
|
||||
|
||||
ret = mtk_snand_irq_process(msm->snf);
|
||||
if (ret > 0)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
static int mtk_snand_enable_clk(struct mtk_snand_mtd *msm)
|
||||
{
|
||||
struct mtk_snand_of_id *soc_id = msm->soc_id;
|
||||
int ret;
|
||||
|
||||
ret = clk_prepare_enable(msm->nfi_clk);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "unable to enable nfi clk\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(msm->pad_clk);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "unable to enable pad clk\n");
|
||||
clk_disable_unprepare(msm->nfi_clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (soc_id->en_ecc_clk) {
|
||||
ret = clk_prepare_enable(msm->ecc_clk);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "unable to enable ecc clk\n");
|
||||
clk_disable_unprepare(msm->nfi_clk);
|
||||
clk_disable_unprepare(msm->pad_clk);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (soc_id->en_nfi_hclk) {
|
||||
ret = clk_prepare_enable(msm->nfi_hclk);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "unable to enable nfi hclk\n");
|
||||
clk_disable_unprepare(msm->nfi_clk);
|
||||
clk_disable_unprepare(msm->pad_clk);
|
||||
if (soc_id->en_ecc_clk)
|
||||
clk_disable_unprepare(msm->ecc_clk);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mtk_snand_disable_clk(struct mtk_snand_mtd *msm)
|
||||
{
|
||||
struct mtk_snand_of_id *soc_id = msm->soc_id;
|
||||
|
||||
clk_disable_unprepare(msm->nfi_clk);
|
||||
clk_disable_unprepare(msm->pad_clk);
|
||||
if (soc_id->en_ecc_clk)
|
||||
clk_disable_unprepare(msm->ecc_clk);
|
||||
if (soc_id->en_nfi_hclk)
|
||||
clk_disable_unprepare(msm->nfi_hclk);
|
||||
}
|
||||
|
||||
static const struct mtd_ooblayout_ops mtk_snand_ooblayout = {
|
||||
.ecc = mtk_snand_ooblayout_ecc,
|
||||
.free = mtk_snand_ooblayout_free,
|
||||
};
|
||||
|
||||
static struct mtk_snand_of_id mt7622_soc_id = {
|
||||
.soc = SNAND_SOC_MT7622,
|
||||
.en_ecc_clk = true,
|
||||
.en_nfi_hclk = false
|
||||
};
|
||||
|
||||
static struct mtk_snand_of_id mt7629_soc_id = {
|
||||
.soc = SNAND_SOC_MT7629,
|
||||
.en_ecc_clk = true,
|
||||
.en_nfi_hclk = false
|
||||
};
|
||||
|
||||
static struct mtk_snand_of_id mt7986_soc_id = {
|
||||
.soc = SNAND_SOC_MT7986,
|
||||
.en_ecc_clk = false,
|
||||
.en_nfi_hclk = true
|
||||
};
|
||||
|
||||
static const struct of_device_id mtk_snand_ids[] = {
|
||||
{ .compatible = "mediatek,mt7622-snand", .data = &mt7622_soc_id },
|
||||
{ .compatible = "mediatek,mt7629-snand", .data = &mt7629_soc_id },
|
||||
{ .compatible = "mediatek,mt7986-snand", .data = &mt7986_soc_id },
|
||||
{ },
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, mtk_snand_ids);
|
||||
|
||||
static int mtk_snand_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_snand_platdata mtk_snand_pdata = {};
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_soc_id;
|
||||
struct mtk_snand_mtd *msm;
|
||||
struct mtd_info *mtd;
|
||||
struct resource *r;
|
||||
uint32_t size;
|
||||
int ret;
|
||||
|
||||
of_soc_id = of_match_node(mtk_snand_ids, np);
|
||||
if (!of_soc_id)
|
||||
return -EINVAL;
|
||||
|
||||
msm = devm_kzalloc(&pdev->dev, sizeof(*msm), GFP_KERNEL);
|
||||
if (!msm)
|
||||
return -ENOMEM;
|
||||
|
||||
msm->soc_id = of_soc_id->data;
|
||||
|
||||
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nfi");
|
||||
msm->nfi_regs = devm_ioremap_resource(&pdev->dev, r);
|
||||
if (IS_ERR(msm->nfi_regs)) {
|
||||
ret = PTR_ERR(msm->nfi_regs);
|
||||
goto errout1;
|
||||
}
|
||||
|
||||
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ecc");
|
||||
msm->ecc_regs = devm_ioremap_resource(&pdev->dev, r);
|
||||
if (IS_ERR(msm->ecc_regs)) {
|
||||
ret = PTR_ERR(msm->ecc_regs);
|
||||
goto errout1;
|
||||
}
|
||||
|
||||
msm->pdev.dev = &pdev->dev;
|
||||
msm->quad_spi = of_property_read_bool(np, "mediatek,quad-spi");
|
||||
msm->soc = msm->soc_id->soc;
|
||||
|
||||
msm->nfi_clk = devm_clk_get(msm->pdev.dev, "nfi_clk");
|
||||
if (IS_ERR(msm->nfi_clk)) {
|
||||
ret = PTR_ERR(msm->nfi_clk);
|
||||
dev_err(msm->pdev.dev,
|
||||
"unable to get nfi_clk, err = %d\n", ret);
|
||||
goto errout1;
|
||||
}
|
||||
|
||||
if (msm->soc_id->en_ecc_clk) {
|
||||
msm->ecc_clk = devm_clk_get(msm->pdev.dev, "ecc_clk");
|
||||
if (IS_ERR(msm->ecc_clk)) {
|
||||
ret = PTR_ERR(msm->ecc_clk);
|
||||
dev_err(msm->pdev.dev,
|
||||
"unable to get ecc_clk, err = %d\n", ret);
|
||||
goto errout1;
|
||||
}
|
||||
}
|
||||
|
||||
msm->pad_clk = devm_clk_get(msm->pdev.dev, "pad_clk");
|
||||
if (IS_ERR(msm->pad_clk)) {
|
||||
ret = PTR_ERR(msm->pad_clk);
|
||||
dev_err(msm->pdev.dev,
|
||||
"unable to get pad_clk, err = %d\n", ret);
|
||||
goto errout1;
|
||||
}
|
||||
|
||||
if (msm->soc_id->en_nfi_hclk) {
|
||||
msm->nfi_hclk = devm_clk_get(msm->pdev.dev, "nfi_hclk");
|
||||
if (IS_ERR(msm->nfi_hclk)) {
|
||||
ret = PTR_ERR(msm->nfi_hclk);
|
||||
dev_err(msm->pdev.dev,
|
||||
"unable to get nfi_hclk, err = %d\n", ret);
|
||||
goto errout1;
|
||||
}
|
||||
}
|
||||
|
||||
ret = mtk_snand_enable_clk(msm);
|
||||
if (ret)
|
||||
goto errout1;
|
||||
|
||||
/* Probe SPI-NAND Flash */
|
||||
mtk_snand_pdata.soc = msm->soc;
|
||||
mtk_snand_pdata.quad_spi = msm->quad_spi;
|
||||
mtk_snand_pdata.nfi_base = msm->nfi_regs;
|
||||
mtk_snand_pdata.ecc_base = msm->ecc_regs;
|
||||
|
||||
ret = mtk_snand_init(&msm->pdev, &mtk_snand_pdata, &msm->snf);
|
||||
if (ret)
|
||||
goto errout1;
|
||||
|
||||
msm->irq = platform_get_irq(pdev, 0);
|
||||
if (msm->irq >= 0) {
|
||||
ret = devm_request_irq(msm->pdev.dev, msm->irq, mtk_snand_irq,
|
||||
0x0, "mtk-snand", msm);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "failed to request snfi irq\n");
|
||||
goto errout2;
|
||||
}
|
||||
|
||||
ret = dma_set_mask(msm->pdev.dev, DMA_BIT_MASK(32));
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "failed to set dma mask\n");
|
||||
goto errout3;
|
||||
}
|
||||
}
|
||||
|
||||
mtk_snand_get_chip_info(msm->snf, &msm->cinfo);
|
||||
|
||||
size = msm->cinfo.pagesize + msm->cinfo.sparesize;
|
||||
msm->page_cache = devm_kmalloc(msm->pdev.dev, size, GFP_KERNEL);
|
||||
if (!msm->page_cache) {
|
||||
dev_err(msm->pdev.dev, "failed to allocate page cache\n");
|
||||
ret = -ENOMEM;
|
||||
goto errout3;
|
||||
}
|
||||
|
||||
mutex_init(&msm->lock);
|
||||
|
||||
dev_info(msm->pdev.dev,
|
||||
"chip is %s, size %lluMB, page size %u, oob size %u\n",
|
||||
msm->cinfo.model, msm->cinfo.chipsize >> 20,
|
||||
msm->cinfo.pagesize, msm->cinfo.sparesize);
|
||||
|
||||
/* Initialize mtd for SPI-NAND */
|
||||
mtd = &msm->mtd;
|
||||
|
||||
mtd->owner = THIS_MODULE;
|
||||
mtd->dev.parent = &pdev->dev;
|
||||
mtd->type = MTD_NANDFLASH;
|
||||
mtd->flags = MTD_CAP_NANDFLASH;
|
||||
|
||||
mtd_set_of_node(mtd, np);
|
||||
|
||||
mtd->size = msm->cinfo.chipsize;
|
||||
mtd->erasesize = msm->cinfo.blocksize;
|
||||
mtd->writesize = msm->cinfo.pagesize;
|
||||
mtd->writebufsize = mtd->writesize;
|
||||
mtd->oobsize = msm->cinfo.sparesize;
|
||||
mtd->oobavail = msm->cinfo.num_sectors * (msm->cinfo.fdm_size - 1);
|
||||
|
||||
mtd->erasesize_shift = ffs(mtd->erasesize) - 1;
|
||||
mtd->writesize_shift = ffs(mtd->writesize) - 1;
|
||||
mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1;
|
||||
mtd->writesize_mask = (1 << mtd->writesize_shift) - 1;
|
||||
|
||||
mtd->ooblayout = &mtk_snand_ooblayout;
|
||||
|
||||
mtd->ecc_strength = msm->cinfo.ecc_strength;
|
||||
mtd->bitflip_threshold = (mtd->ecc_strength * 3) / 4;
|
||||
mtd->ecc_step_size = msm->cinfo.sector_size;
|
||||
|
||||
mtd->_erase = mtk_snand_mtd_erase;
|
||||
mtd->_read_oob = mtk_snand_mtd_read_oob;
|
||||
mtd->_write_oob = mtk_snand_mtd_write_oob;
|
||||
mtd->_block_isbad = mtk_snand_mtd_block_isbad;
|
||||
mtd->_block_markbad = mtk_snand_mtd_block_markbad;
|
||||
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(msm->pdev.dev, "failed to register mtd partition\n");
|
||||
goto errout4;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, msm);
|
||||
|
||||
return 0;
|
||||
|
||||
errout4:
|
||||
devm_kfree(msm->pdev.dev, msm->page_cache);
|
||||
|
||||
errout3:
|
||||
if (msm->irq >= 0)
|
||||
devm_free_irq(msm->pdev.dev, msm->irq, msm);
|
||||
|
||||
errout2:
|
||||
mtk_snand_cleanup(msm->snf);
|
||||
|
||||
errout1:
|
||||
devm_kfree(msm->pdev.dev, msm);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_snand_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_snand_mtd *msm = platform_get_drvdata(pdev);
|
||||
struct mtd_info *mtd = &msm->mtd;
|
||||
int ret;
|
||||
|
||||
ret = mtd_device_unregister(mtd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mtk_snand_cleanup(msm->snf);
|
||||
|
||||
if (msm->irq >= 0)
|
||||
devm_free_irq(msm->pdev.dev, msm->irq, msm);
|
||||
|
||||
mtk_snand_disable_clk(msm);
|
||||
|
||||
devm_kfree(msm->pdev.dev, msm->page_cache);
|
||||
devm_kfree(msm->pdev.dev, msm);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver mtk_snand_driver = {
|
||||
.probe = mtk_snand_probe,
|
||||
.remove = mtk_snand_remove,
|
||||
.driver = {
|
||||
.name = "mtk-snand",
|
||||
.of_match_table = mtk_snand_ids,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(mtk_snand_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Weijie Gao <weijie.gao@mediatek.com>");
|
||||
MODULE_DESCRIPTION("MeidaTek SPI-NAND Flash Controller Driver");
|
||||
@@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include "mtk-snand-def.h"
|
||||
|
||||
int mtk_snand_log(struct mtk_snand_plat_dev *pdev,
|
||||
enum mtk_snand_log_category cat, const char *fmt, ...)
|
||||
{
|
||||
const char *catname = "";
|
||||
va_list ap;
|
||||
char *msg;
|
||||
|
||||
switch (cat) {
|
||||
case SNAND_LOG_NFI:
|
||||
catname = "NFI";
|
||||
break;
|
||||
case SNAND_LOG_SNFI:
|
||||
catname = "SNFI";
|
||||
break;
|
||||
case SNAND_LOG_ECC:
|
||||
catname = "ECC";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
msg = kvasprintf(GFP_KERNEL, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (!msg) {
|
||||
dev_warn(pdev->dev, "unable to print log\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*catname)
|
||||
dev_warn(pdev->dev, "%s: %s", catname, msg);
|
||||
else
|
||||
dev_warn(pdev->dev, "%s", msg);
|
||||
|
||||
kfree(msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _MTK_SNAND_OS_H_
|
||||
#define _MTK_SNAND_OS_H_
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
struct mtk_snand_plat_dev {
|
||||
struct device *dev;
|
||||
struct completion done;
|
||||
};
|
||||
|
||||
/* Polling helpers */
|
||||
#define read16_poll_timeout(addr, val, cond, sleep_us, timeout_us) \
|
||||
readw_poll_timeout((addr), (val), (cond), (sleep_us), (timeout_us))
|
||||
|
||||
#define read32_poll_timeout(addr, val, cond, sleep_us, timeout_us) \
|
||||
readl_poll_timeout((addr), (val), (cond), (sleep_us), (timeout_us))
|
||||
|
||||
/* Timer helpers */
|
||||
#define mtk_snand_time_t ktime_t
|
||||
|
||||
static inline mtk_snand_time_t timer_get_ticks(void)
|
||||
{
|
||||
return ktime_get();
|
||||
}
|
||||
|
||||
static inline mtk_snand_time_t timer_time_to_tick(uint32_t timeout_us)
|
||||
{
|
||||
return ktime_add_us(ktime_set(0, 0), timeout_us);
|
||||
}
|
||||
|
||||
static inline bool timer_is_timeout(mtk_snand_time_t start_tick,
|
||||
mtk_snand_time_t timeout_tick)
|
||||
{
|
||||
ktime_t tmo = ktime_add(start_tick, timeout_tick);
|
||||
|
||||
return ktime_compare(ktime_get(), tmo) > 0;
|
||||
}
|
||||
|
||||
/* Memory helpers */
|
||||
static inline void *generic_mem_alloc(struct mtk_snand_plat_dev *pdev,
|
||||
size_t size)
|
||||
{
|
||||
return devm_kzalloc(pdev->dev, size, GFP_KERNEL);
|
||||
}
|
||||
static inline void generic_mem_free(struct mtk_snand_plat_dev *pdev, void *ptr)
|
||||
{
|
||||
devm_kfree(pdev->dev, ptr);
|
||||
}
|
||||
|
||||
static inline void *dma_mem_alloc(struct mtk_snand_plat_dev *pdev, size_t size)
|
||||
{
|
||||
return kzalloc(size, GFP_KERNEL);
|
||||
}
|
||||
static inline void dma_mem_free(struct mtk_snand_plat_dev *pdev, void *ptr)
|
||||
{
|
||||
kfree(ptr);
|
||||
}
|
||||
|
||||
static inline int dma_mem_map(struct mtk_snand_plat_dev *pdev, void *vaddr,
|
||||
uintptr_t *dma_addr, size_t size, bool to_device)
|
||||
{
|
||||
dma_addr_t addr;
|
||||
int ret;
|
||||
|
||||
addr = dma_map_single(pdev->dev, vaddr, size,
|
||||
to_device ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
|
||||
ret = dma_mapping_error(pdev->dev, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*dma_addr = (uintptr_t)addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dma_mem_unmap(struct mtk_snand_plat_dev *pdev,
|
||||
uintptr_t dma_addr, size_t size,
|
||||
bool to_device)
|
||||
{
|
||||
dma_unmap_single(pdev->dev, dma_addr, size,
|
||||
to_device ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
|
||||
}
|
||||
|
||||
/* Interrupt helpers */
|
||||
static inline void irq_completion_done(struct mtk_snand_plat_dev *pdev)
|
||||
{
|
||||
complete(&pdev->done);
|
||||
}
|
||||
|
||||
static inline void irq_completion_init(struct mtk_snand_plat_dev *pdev)
|
||||
{
|
||||
init_completion(&pdev->done);
|
||||
}
|
||||
|
||||
static inline int irq_completion_wait(struct mtk_snand_plat_dev *pdev,
|
||||
void __iomem *reg, uint32_t bit,
|
||||
uint32_t timeout_us)
|
||||
{
|
||||
#if 0
|
||||
uint32_t val;
|
||||
|
||||
return read32_poll_timeout(reg, val, val & bit, 0, timeout_us);
|
||||
#else
|
||||
int ret;
|
||||
|
||||
ret = wait_for_completion_timeout(&pdev->done,
|
||||
usecs_to_jiffies(timeout_us));
|
||||
if (!ret)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* _MTK_SNAND_OS_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _MTK_SNAND_H_
|
||||
#define _MTK_SNAND_H_
|
||||
|
||||
#ifndef PRIVATE_MTK_SNAND_HEADER
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
enum mtk_snand_soc {
|
||||
SNAND_SOC_MT7622,
|
||||
SNAND_SOC_MT7629,
|
||||
SNAND_SOC_MT7986,
|
||||
|
||||
__SNAND_SOC_MAX
|
||||
};
|
||||
|
||||
struct mtk_snand_platdata {
|
||||
void *nfi_base;
|
||||
void *ecc_base;
|
||||
enum mtk_snand_soc soc;
|
||||
bool quad_spi;
|
||||
};
|
||||
|
||||
struct mtk_snand_chip_info {
|
||||
const char *model;
|
||||
uint64_t chipsize;
|
||||
uint32_t blocksize;
|
||||
uint32_t pagesize;
|
||||
uint32_t sparesize;
|
||||
uint32_t spare_per_sector;
|
||||
uint32_t fdm_size;
|
||||
uint32_t fdm_ecc_size;
|
||||
uint32_t num_sectors;
|
||||
uint32_t sector_size;
|
||||
uint32_t ecc_strength;
|
||||
uint32_t ecc_bytes;
|
||||
};
|
||||
|
||||
struct mtk_snand;
|
||||
struct snand_flash_info;
|
||||
|
||||
int mtk_snand_init(void *dev, const struct mtk_snand_platdata *pdata,
|
||||
struct mtk_snand **psnf);
|
||||
int mtk_snand_cleanup(struct mtk_snand *snf);
|
||||
|
||||
int mtk_snand_chip_reset(struct mtk_snand *snf);
|
||||
int mtk_snand_read_page(struct mtk_snand *snf, uint64_t addr, void *buf,
|
||||
void *oob, bool raw);
|
||||
int mtk_snand_write_page(struct mtk_snand *snf, uint64_t addr, const void *buf,
|
||||
const void *oob, bool raw);
|
||||
int mtk_snand_erase_block(struct mtk_snand *snf, uint64_t addr);
|
||||
int mtk_snand_block_isbad(struct mtk_snand *snf, uint64_t addr);
|
||||
int mtk_snand_block_markbad(struct mtk_snand *snf, uint64_t addr);
|
||||
int mtk_snand_fill_oob(struct mtk_snand *snf, uint8_t *oobraw,
|
||||
const uint8_t *oobbuf, size_t ooblen);
|
||||
int mtk_snand_transfer_oob(struct mtk_snand *snf, uint8_t *oobbuf,
|
||||
size_t ooblen, const uint8_t *oobraw);
|
||||
int mtk_snand_read_page_auto_oob(struct mtk_snand *snf, uint64_t addr,
|
||||
void *buf, void *oob, size_t ooblen,
|
||||
size_t *actualooblen, bool raw);
|
||||
int mtk_snand_write_page_auto_oob(struct mtk_snand *snf, uint64_t addr,
|
||||
const void *buf, const void *oob,
|
||||
size_t ooblen, size_t *actualooblen,
|
||||
bool raw);
|
||||
int mtk_snand_get_chip_info(struct mtk_snand *snf,
|
||||
struct mtk_snand_chip_info *info);
|
||||
int mtk_snand_irq_process(struct mtk_snand *snf);
|
||||
|
||||
#endif /* _MTK_SNAND_H_ */
|
||||
@@ -0,0 +1,31 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config NET_VENDOR_MEDIATEK
|
||||
bool "MediaTek ethernet driver"
|
||||
depends on ARCH_MEDIATEK || SOC_MT7621 || SOC_MT7620
|
||||
---help---
|
||||
If you have a Mediatek SoC with ethernet, say Y.
|
||||
|
||||
if NET_VENDOR_MEDIATEK
|
||||
|
||||
config NET_MEDIATEK_SOC
|
||||
tristate "MediaTek SoC Gigabit Ethernet support"
|
||||
select PHYLINK
|
||||
---help---
|
||||
This driver supports the gigabit ethernet MACs in the
|
||||
MediaTek SoC family.
|
||||
|
||||
config MEDIATEK_NETSYS_V2
|
||||
tristate "MediaTek Ethernet NETSYS V2 support"
|
||||
depends on ARCH_MEDIATEK && NET_MEDIATEK_SOC
|
||||
---help---
|
||||
This options enable MTK Ethernet NETSYS V2 support
|
||||
|
||||
config NET_MEDIATEK_HNAT
|
||||
tristate "MediaTek HW NAT support"
|
||||
depends on NET_MEDIATEK_SOC && NF_CONNTRACK && IP_NF_NAT
|
||||
---help---
|
||||
This driver supports the hardward Network Address Translation
|
||||
in the MediaTek MT7986/MT2701/MT7622/MT7629/MT7621 chipset
|
||||
family.
|
||||
|
||||
endif #NET_VENDOR_MEDIATEK
|
||||
@@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Makefile for the Mediatek SoCs built-in ethernet macs
|
||||
#
|
||||
|
||||
obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o
|
||||
mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_eth_dbg.o
|
||||
obj-$(CONFIG_NET_MEDIATEK_HNAT) += mtk_hnat/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,284 @@
|
||||
/*
|
||||
* Copyright (C) 2018 MediaTek Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2009-2016 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2009-2016 Felix Fietkau <nbd@openwrt.org>
|
||||
* Copyright (C) 2013-2016 Michael Lee <igvtee@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef MTK_ETH_DBG_H
|
||||
#define MTK_ETH_DBG_H
|
||||
|
||||
/* Debug Purpose Register */
|
||||
#define MTK_PSE_FQFC_CFG 0x100
|
||||
#define MTK_FE_CDM1_FSM 0x220
|
||||
#define MTK_FE_CDM2_FSM 0x224
|
||||
#define MTK_FE_CDM3_FSM 0x238
|
||||
#define MTK_FE_CDM4_FSM 0x298
|
||||
#define MTK_FE_GDM1_FSM 0x228
|
||||
#define MTK_FE_GDM2_FSM 0x22C
|
||||
#define MTK_FE_PSE_FREE 0x240
|
||||
#define MTK_FE_DROP_FQ 0x244
|
||||
#define MTK_FE_DROP_FC 0x248
|
||||
#define MTK_FE_DROP_PPE 0x24C
|
||||
#define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100))
|
||||
#define MTK_SGMII_FALSE_CARRIER_CNT(x) (0x10060028 + ((x) * 0x10000))
|
||||
#define MTK_SGMII_EFUSE 0x11D008C8
|
||||
#define MTK_WED_RTQM_GLO_CFG 0x15010B00
|
||||
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
#define MTK_PSE_IQ_STA(x) (0x180 + (x) * 0x4)
|
||||
#define MTK_PSE_OQ_STA(x) (0x1A0 + (x) * 0x4)
|
||||
#else
|
||||
#define MTK_PSE_IQ_STA(x) (0x110 + (x) * 0x4)
|
||||
#define MTK_PSE_OQ_STA(x) (0x118 + (x) * 0x4)
|
||||
#endif
|
||||
|
||||
#define MTKETH_MII_READ 0x89F3
|
||||
#define MTKETH_MII_WRITE 0x89F4
|
||||
#define MTKETH_ESW_REG_READ 0x89F1
|
||||
#define MTKETH_ESW_REG_WRITE 0x89F2
|
||||
#define MTKETH_MII_READ_CL45 0x89FC
|
||||
#define MTKETH_MII_WRITE_CL45 0x89FD
|
||||
#define REG_ESW_MAX 0xFC
|
||||
|
||||
#define PROCREG_ESW_CNT "esw_cnt"
|
||||
#define PROCREG_TXRING "tx_ring"
|
||||
#define PROCREG_RXRING "rx_ring"
|
||||
#define PROCREG_DIR "mtketh"
|
||||
#define PROCREG_DBG_REGS "dbg_regs"
|
||||
#define PROCREG_HW_LRO_STATS "hw_lro_stats"
|
||||
#define PROCREG_HW_LRO_AUTO_TLB "hw_lro_auto_tlb"
|
||||
|
||||
/* HW LRO flush reason */
|
||||
#define MTK_HW_LRO_AGG_FLUSH (1)
|
||||
#define MTK_HW_LRO_AGE_FLUSH (2)
|
||||
#define MTK_HW_LRO_NOT_IN_SEQ_FLUSH (3)
|
||||
#define MTK_HW_LRO_TIMESTAMP_FLUSH (4)
|
||||
#define MTK_HW_LRO_NON_RULE_FLUSH (5)
|
||||
|
||||
#define SET_PDMA_RXRING_MAX_AGG_CNT(eth, x, y) \
|
||||
{ \
|
||||
u32 reg_val1 = mtk_r32(eth, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
u32 reg_val2 = mtk_r32(eth, MTK_LRO_CTRL_DW3_CFG(x)); \
|
||||
reg_val1 &= ~MTK_LRO_RING_AGG_CNT_L_MASK; \
|
||||
reg_val2 &= ~MTK_LRO_RING_AGG_CNT_H_MASK; \
|
||||
reg_val1 |= ((y) & 0x3f) << MTK_LRO_RING_AGG_CNT_L_OFFSET; \
|
||||
reg_val2 |= (((y) >> 6) & 0x03) << \
|
||||
MTK_LRO_RING_AGG_CNT_H_OFFSET; \
|
||||
mtk_w32(eth, reg_val1, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
mtk_w32(eth, reg_val2, MTK_LRO_CTRL_DW3_CFG(x)); \
|
||||
}
|
||||
|
||||
#define SET_PDMA_RXRING_AGG_TIME(eth, x, y) \
|
||||
{ \
|
||||
u32 reg_val = mtk_r32(eth, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
reg_val &= ~MTK_LRO_RING_AGG_TIME_MASK; \
|
||||
reg_val |= ((y) & 0xffff) << MTK_LRO_RING_AGG_TIME_OFFSET; \
|
||||
mtk_w32(eth, reg_val, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
}
|
||||
|
||||
#define SET_PDMA_RXRING_AGE_TIME(eth, x, y) \
|
||||
{ \
|
||||
u32 reg_val1 = mtk_r32(eth, MTK_LRO_CTRL_DW1_CFG(x)); \
|
||||
u32 reg_val2 = mtk_r32(eth, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
reg_val1 &= ~MTK_LRO_RING_AGE_TIME_L_MASK; \
|
||||
reg_val2 &= ~MTK_LRO_RING_AGE_TIME_H_MASK; \
|
||||
reg_val1 |= ((y) & 0x3ff) << MTK_LRO_RING_AGE_TIME_L_OFFSET; \
|
||||
reg_val2 |= (((y) >> 10) & 0x03f) << \
|
||||
MTK_LRO_RING_AGE_TIME_H_OFFSET; \
|
||||
mtk_w32(eth, reg_val1, MTK_LRO_CTRL_DW1_CFG(x)); \
|
||||
mtk_w32(eth, reg_val2, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
}
|
||||
|
||||
#define SET_PDMA_LRO_BW_THRESHOLD(eth, x) \
|
||||
{ \
|
||||
u32 reg_val = mtk_r32(eth, MTK_PDMA_LRO_CTRL_DW2); \
|
||||
reg_val = (x); \
|
||||
mtk_w32(eth, reg_val, MTK_PDMA_LRO_CTRL_DW2); \
|
||||
}
|
||||
|
||||
#define SET_PDMA_RXRING_VALID(eth, x, y) \
|
||||
{ \
|
||||
u32 reg_val = mtk_r32(eth, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
reg_val &= ~(0x1 << MTK_RX_PORT_VALID_OFFSET); \
|
||||
reg_val |= ((y) & 0x1) << MTK_RX_PORT_VALID_OFFSET; \
|
||||
mtk_w32(eth, reg_val, MTK_LRO_CTRL_DW2_CFG(x)); \
|
||||
}
|
||||
|
||||
struct mtk_lro_alt_v1_info0 {
|
||||
u32 dtp : 16;
|
||||
u32 stp : 16;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info1 {
|
||||
u32 sip0 : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info2 {
|
||||
u32 sip1 : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info3 {
|
||||
u32 sip2 : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info4 {
|
||||
u32 sip3 : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info5 {
|
||||
u32 vlan_vid0 : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info6 {
|
||||
u32 vlan_vid1 : 16;
|
||||
u32 vlan_vid_vld : 4;
|
||||
u32 cnt : 12;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info7 {
|
||||
u32 dw_len : 32;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1_info8 {
|
||||
u32 dip_id : 2;
|
||||
u32 ipv6 : 1;
|
||||
u32 ipv4 : 1;
|
||||
u32 resv : 27;
|
||||
u32 valid : 1;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v1 {
|
||||
struct mtk_lro_alt_v1_info0 alt_info0;
|
||||
struct mtk_lro_alt_v1_info1 alt_info1;
|
||||
struct mtk_lro_alt_v1_info2 alt_info2;
|
||||
struct mtk_lro_alt_v1_info3 alt_info3;
|
||||
struct mtk_lro_alt_v1_info4 alt_info4;
|
||||
struct mtk_lro_alt_v1_info5 alt_info5;
|
||||
struct mtk_lro_alt_v1_info6 alt_info6;
|
||||
struct mtk_lro_alt_v1_info7 alt_info7;
|
||||
struct mtk_lro_alt_v1_info8 alt_info8;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v2_info0 {
|
||||
u32 v2_id_h:3;
|
||||
u32 v1_id:12;
|
||||
u32 v0_id:12;
|
||||
u32 v3_valid:1;
|
||||
u32 v2_valid:1;
|
||||
u32 v1_valid:1;
|
||||
u32 v0_valid:1;
|
||||
u32 valid:1;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v2_info1 {
|
||||
u32 sip3_h:9;
|
||||
u32 v6_valid:1;
|
||||
u32 v4_valid:1;
|
||||
u32 v3_id:12;
|
||||
u32 v2_id_l:9;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v2_info2 {
|
||||
u32 sip2_h:9;
|
||||
u32 sip3_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info3 {
|
||||
u32 sip1_h:9;
|
||||
u32 sip2_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info4 {
|
||||
u32 sip0_h:9;
|
||||
u32 sip1_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info5 {
|
||||
u32 dip3_h:9;
|
||||
u32 sip0_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info6 {
|
||||
u32 dip2_h:9;
|
||||
u32 dip3_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info7 {
|
||||
u32 dip1_h:9;
|
||||
u32 dip2_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info8 {
|
||||
u32 dip0_h:9;
|
||||
u32 dip1_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info9 {
|
||||
u32 sp_h:9;
|
||||
u32 dip0_l:23;
|
||||
};
|
||||
struct mtk_lro_alt_v2_info10 {
|
||||
u32 resv:9;
|
||||
u32 dp:16;
|
||||
u32 sp_l:7;
|
||||
};
|
||||
|
||||
struct mtk_lro_alt_v2 {
|
||||
struct mtk_lro_alt_v2_info0 alt_info0;
|
||||
struct mtk_lro_alt_v2_info1 alt_info1;
|
||||
struct mtk_lro_alt_v2_info2 alt_info2;
|
||||
struct mtk_lro_alt_v2_info3 alt_info3;
|
||||
struct mtk_lro_alt_v2_info4 alt_info4;
|
||||
struct mtk_lro_alt_v2_info5 alt_info5;
|
||||
struct mtk_lro_alt_v2_info6 alt_info6;
|
||||
struct mtk_lro_alt_v2_info7 alt_info7;
|
||||
struct mtk_lro_alt_v2_info8 alt_info8;
|
||||
struct mtk_lro_alt_v2_info9 alt_info9;
|
||||
struct mtk_lro_alt_v2_info10 alt_info10;
|
||||
};
|
||||
|
||||
struct mtk_esw_reg {
|
||||
unsigned int off;
|
||||
unsigned int val;
|
||||
};
|
||||
|
||||
struct mtk_mii_ioctl_data {
|
||||
u16 phy_id;
|
||||
u16 reg_num;
|
||||
unsigned int val_in;
|
||||
unsigned int val_out;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_NET_DSA_MT7530) || defined(CONFIG_MT753X_GSW)
|
||||
static inline bool mt7530_exist(struct mtk_eth *eth)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static inline bool mt7530_exist(struct mtk_eth *eth)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern u32 _mtk_mdio_read(struct mtk_eth *eth, u16 phy_addr, u16 phy_reg);
|
||||
extern u32 _mtk_mdio_write(struct mtk_eth *eth, u16 phy_addr,
|
||||
u16 phy_register, u16 write_data);
|
||||
|
||||
extern u32 mtk_cl45_ind_read(struct mtk_eth *eth, u16 port, u16 devad, u16 reg, u16 *data);
|
||||
extern u32 mtk_cl45_ind_write(struct mtk_eth *eth, u16 port, u16 devad, u16 reg, u16 data);
|
||||
|
||||
int debug_proc_init(struct mtk_eth *eth);
|
||||
void debug_proc_exit(void);
|
||||
|
||||
int mtketh_debugfs_init(struct mtk_eth *eth);
|
||||
void mtketh_debugfs_exit(struct mtk_eth *eth);
|
||||
int mtk_do_priv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
|
||||
void hw_lro_stats_update(u32 ring_no, struct mtk_rx_dma *rxd);
|
||||
void hw_lro_flush_stats_update(u32 ring_no, struct mtk_rx_dma *rxd);
|
||||
|
||||
#endif /* MTK_ETH_DBG_H */
|
||||
@@ -0,0 +1,297 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (c) 2018-2019 MediaTek Inc.
|
||||
|
||||
/* A library for configuring path from GMAC/GDM to target PHY
|
||||
*
|
||||
* Author: Sean Wang <sean.wang@mediatek.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/phy.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "mtk_eth_soc.h"
|
||||
|
||||
struct mtk_eth_muxc {
|
||||
const char *name;
|
||||
int cap_bit;
|
||||
int (*set_path)(struct mtk_eth *eth, int path);
|
||||
};
|
||||
|
||||
static const char *mtk_eth_path_name(int path)
|
||||
{
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC1_RGMII:
|
||||
return "gmac1_rgmii";
|
||||
case MTK_ETH_PATH_GMAC1_TRGMII:
|
||||
return "gmac1_trgmii";
|
||||
case MTK_ETH_PATH_GMAC1_SGMII:
|
||||
return "gmac1_sgmii";
|
||||
case MTK_ETH_PATH_GMAC2_RGMII:
|
||||
return "gmac2_rgmii";
|
||||
case MTK_ETH_PATH_GMAC2_SGMII:
|
||||
return "gmac2_sgmii";
|
||||
case MTK_ETH_PATH_GMAC2_GEPHY:
|
||||
return "gmac2_gephy";
|
||||
case MTK_ETH_PATH_GDM1_ESW:
|
||||
return "gdm1_esw";
|
||||
default:
|
||||
return "unknown path";
|
||||
}
|
||||
}
|
||||
|
||||
static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path)
|
||||
{
|
||||
bool updated = true;
|
||||
u32 val, mask, set;
|
||||
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC1_SGMII:
|
||||
mask = ~(u32)MTK_MUX_TO_ESW;
|
||||
set = 0;
|
||||
break;
|
||||
case MTK_ETH_PATH_GDM1_ESW:
|
||||
mask = ~(u32)MTK_MUX_TO_ESW;
|
||||
set = MTK_MUX_TO_ESW;
|
||||
break;
|
||||
default:
|
||||
updated = false;
|
||||
break;
|
||||
};
|
||||
|
||||
if (updated) {
|
||||
val = mtk_r32(eth, MTK_MAC_MISC);
|
||||
val = (val & mask) | set;
|
||||
mtk_w32(eth, val, MTK_MAC_MISC);
|
||||
}
|
||||
|
||||
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
|
||||
mtk_eth_path_name(path), __func__, updated);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, int path)
|
||||
{
|
||||
unsigned int val = 0;
|
||||
bool updated = true;
|
||||
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC2_GEPHY:
|
||||
val = ~(u32)GEPHY_MAC_SEL;
|
||||
break;
|
||||
default:
|
||||
updated = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (updated)
|
||||
regmap_update_bits(eth->infra, INFRA_MISC2, GEPHY_MAC_SEL, val);
|
||||
|
||||
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
|
||||
mtk_eth_path_name(path), __func__, updated);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path)
|
||||
{
|
||||
unsigned int val = 0,mask=0,reg=0;
|
||||
bool updated = true;
|
||||
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC2_SGMII:
|
||||
if (MTK_HAS_CAPS(eth->soc->caps, MTK_U3_COPHY_V2)) {
|
||||
reg = USB_PHY_SWITCH_REG;
|
||||
val = SGMII_QPHY_SEL;
|
||||
mask = QPHY_SEL_MASK;
|
||||
} else {
|
||||
reg = INFRA_MISC2;
|
||||
val = CO_QPHY_SEL;
|
||||
mask = val;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
updated = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (updated)
|
||||
regmap_update_bits(eth->infra, reg, mask, val);
|
||||
|
||||
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
|
||||
mtk_eth_path_name(path), __func__, updated);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, int path)
|
||||
{
|
||||
unsigned int val = 0;
|
||||
bool updated = true;
|
||||
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC1_SGMII:
|
||||
val = SYSCFG0_SGMII_GMAC1;
|
||||
break;
|
||||
case MTK_ETH_PATH_GMAC2_SGMII:
|
||||
val = SYSCFG0_SGMII_GMAC2;
|
||||
break;
|
||||
case MTK_ETH_PATH_GMAC1_RGMII:
|
||||
case MTK_ETH_PATH_GMAC2_RGMII:
|
||||
regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val);
|
||||
val &= SYSCFG0_SGMII_MASK;
|
||||
|
||||
if ((path == MTK_GMAC1_RGMII && val == SYSCFG0_SGMII_GMAC1) ||
|
||||
(path == MTK_GMAC2_RGMII && val == SYSCFG0_SGMII_GMAC2))
|
||||
val = 0;
|
||||
else
|
||||
updated = false;
|
||||
break;
|
||||
default:
|
||||
updated = false;
|
||||
break;
|
||||
};
|
||||
|
||||
if (updated)
|
||||
regmap_update_bits(eth->ethsys, ETHSYS_SYSCFG0,
|
||||
SYSCFG0_SGMII_MASK, val);
|
||||
|
||||
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
|
||||
mtk_eth_path_name(path), __func__, updated);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, int path)
|
||||
{
|
||||
unsigned int val = 0;
|
||||
bool updated = true;
|
||||
|
||||
regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val);
|
||||
|
||||
switch (path) {
|
||||
case MTK_ETH_PATH_GMAC1_SGMII:
|
||||
val |= SYSCFG0_SGMII_GMAC1_V2;
|
||||
break;
|
||||
case MTK_ETH_PATH_GMAC2_GEPHY:
|
||||
val &= ~(u32)SYSCFG0_SGMII_GMAC2_V2;
|
||||
break;
|
||||
case MTK_ETH_PATH_GMAC2_SGMII:
|
||||
val |= SYSCFG0_SGMII_GMAC2_V2;
|
||||
break;
|
||||
default:
|
||||
updated = false;
|
||||
};
|
||||
|
||||
if (updated)
|
||||
regmap_update_bits(eth->ethsys, ETHSYS_SYSCFG0,
|
||||
SYSCFG0_SGMII_MASK, val);
|
||||
|
||||
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
|
||||
mtk_eth_path_name(path), __func__, updated);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct mtk_eth_muxc mtk_eth_muxc[] = {
|
||||
{
|
||||
.name = "mux_gdm1_to_gmac1_esw",
|
||||
.cap_bit = MTK_ETH_MUX_GDM1_TO_GMAC1_ESW,
|
||||
.set_path = set_mux_gdm1_to_gmac1_esw,
|
||||
}, {
|
||||
.name = "mux_gmac2_gmac0_to_gephy",
|
||||
.cap_bit = MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY,
|
||||
.set_path = set_mux_gmac2_gmac0_to_gephy,
|
||||
}, {
|
||||
.name = "mux_u3_gmac2_to_qphy",
|
||||
.cap_bit = MTK_ETH_MUX_U3_GMAC2_TO_QPHY,
|
||||
.set_path = set_mux_u3_gmac2_to_qphy,
|
||||
}, {
|
||||
.name = "mux_gmac1_gmac2_to_sgmii_rgmii",
|
||||
.cap_bit = MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII,
|
||||
.set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii,
|
||||
}, {
|
||||
.name = "mux_gmac12_to_gephy_sgmii",
|
||||
.cap_bit = MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII,
|
||||
.set_path = set_mux_gmac12_to_gephy_sgmii,
|
||||
},
|
||||
};
|
||||
|
||||
static int mtk_eth_mux_setup(struct mtk_eth *eth, int path)
|
||||
{
|
||||
int i, err = 0;
|
||||
|
||||
if (!MTK_HAS_CAPS(eth->soc->caps, path)) {
|
||||
dev_err(eth->dev, "path %s isn't support on the SoC\n",
|
||||
mtk_eth_path_name(path));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!MTK_HAS_CAPS(eth->soc->caps, MTK_MUX))
|
||||
return 0;
|
||||
|
||||
/* Setup MUX in path fabric */
|
||||
for (i = 0; i < ARRAY_SIZE(mtk_eth_muxc); i++) {
|
||||
if (MTK_HAS_CAPS(eth->soc->caps, mtk_eth_muxc[i].cap_bit)) {
|
||||
err = mtk_eth_muxc[i].set_path(eth, path);
|
||||
if (err)
|
||||
goto out;
|
||||
} else {
|
||||
dev_dbg(eth->dev, "mux %s isn't present on the SoC\n",
|
||||
mtk_eth_muxc[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id)
|
||||
{
|
||||
int err, path;
|
||||
|
||||
path = (mac_id == 0) ? MTK_ETH_PATH_GMAC1_SGMII :
|
||||
MTK_ETH_PATH_GMAC2_SGMII;
|
||||
|
||||
/* Setup proper MUXes along the path */
|
||||
err = mtk_eth_mux_setup(eth, path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id)
|
||||
{
|
||||
int err, path = 0;
|
||||
|
||||
if (mac_id == 1)
|
||||
path = MTK_ETH_PATH_GMAC2_GEPHY;
|
||||
|
||||
if (!path)
|
||||
return -EINVAL;
|
||||
|
||||
/* Setup proper MUXes along the path */
|
||||
err = mtk_eth_mux_setup(eth, path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id)
|
||||
{
|
||||
int err, path;
|
||||
|
||||
path = (mac_id == 0) ? MTK_ETH_PATH_GMAC1_RGMII :
|
||||
MTK_ETH_PATH_GMAC2_RGMII;
|
||||
|
||||
/* Setup proper MUXes along the path */
|
||||
err = mtk_eth_mux_setup(eth, path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
ccflags-y=-Werror
|
||||
|
||||
obj-$(CONFIG_NET_MEDIATEK_HNAT) += mtkhnat.o
|
||||
mtkhnat-objs := hnat.o hnat_nf_hook.o hnat_debugfs.o hnat_mcast.o
|
||||
mtkhnat-$(CONFIG_NET_DSA_MT7530) += hnat_stag.o
|
||||
@@ -0,0 +1,862 @@
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
|
||||
* Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <net/netlink.h>
|
||||
|
||||
#include "nf_hnat_mtk.h"
|
||||
#include "hnat.h"
|
||||
|
||||
struct mtk_hnat *hnat_priv;
|
||||
static struct socket *_hnat_roam_sock;
|
||||
static struct work_struct _hnat_roam_work;
|
||||
|
||||
int (*ra_sw_nat_hook_rx)(struct sk_buff *skb) = NULL;
|
||||
EXPORT_SYMBOL(ra_sw_nat_hook_rx);
|
||||
int (*ra_sw_nat_hook_tx)(struct sk_buff *skb, int gmac_no) = NULL;
|
||||
EXPORT_SYMBOL(ra_sw_nat_hook_tx);
|
||||
|
||||
void (*ppe_dev_register_hook)(struct net_device *dev) = NULL;
|
||||
EXPORT_SYMBOL(ppe_dev_register_hook);
|
||||
void (*ppe_dev_unregister_hook)(struct net_device *dev) = NULL;
|
||||
EXPORT_SYMBOL(ppe_dev_unregister_hook);
|
||||
|
||||
static void hnat_sma_build_entry(struct timer_list *t)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++)
|
||||
cr_set_field(hnat_priv->ppe_base[i] + PPE_TB_CFG,
|
||||
SMA, SMA_FWD_CPU_BUILD_ENTRY);
|
||||
}
|
||||
|
||||
void hnat_cache_ebl(int enable)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++) {
|
||||
cr_set_field(hnat_priv->ppe_base[i] + PPE_CAH_CTRL, CAH_X_MODE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[i] + PPE_CAH_CTRL, CAH_X_MODE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[i] + PPE_CAH_CTRL, CAH_EN, enable);
|
||||
}
|
||||
}
|
||||
|
||||
static void hnat_reset_timestamp(struct timer_list *t)
|
||||
{
|
||||
struct foe_entry *entry;
|
||||
int hash_index;
|
||||
|
||||
hnat_cache_ebl(0);
|
||||
cr_set_field(hnat_priv->ppe_base[0] + PPE_TB_CFG, TCP_AGE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[0] + PPE_TB_CFG, UDP_AGE, 0);
|
||||
writel(0, hnat_priv->fe_base + 0x0010);
|
||||
|
||||
for (hash_index = 0; hash_index < hnat_priv->foe_etry_num; hash_index++) {
|
||||
entry = hnat_priv->foe_table_cpu[0] + hash_index;
|
||||
if (entry->bfib1.state == BIND)
|
||||
entry->bfib1.time_stamp =
|
||||
readl(hnat_priv->fe_base + 0x0010) & (0xFFFF);
|
||||
}
|
||||
|
||||
cr_set_field(hnat_priv->ppe_base[0] + PPE_TB_CFG, TCP_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[0] + PPE_TB_CFG, UDP_AGE, 1);
|
||||
hnat_cache_ebl(1);
|
||||
|
||||
mod_timer(&hnat_priv->hnat_reset_timestamp_timer, jiffies + 14400 * HZ);
|
||||
}
|
||||
|
||||
static void cr_set_bits(void __iomem *reg, u32 bs)
|
||||
{
|
||||
u32 val = readl(reg);
|
||||
|
||||
val |= bs;
|
||||
writel(val, reg);
|
||||
}
|
||||
|
||||
static void cr_clr_bits(void __iomem *reg, u32 bs)
|
||||
{
|
||||
u32 val = readl(reg);
|
||||
|
||||
val &= ~bs;
|
||||
writel(val, reg);
|
||||
}
|
||||
|
||||
void cr_set_field(void __iomem *reg, u32 field, u32 val)
|
||||
{
|
||||
unsigned int tv = readl(reg);
|
||||
|
||||
tv &= ~field;
|
||||
tv |= ((val) << (ffs((unsigned int)field) - 1));
|
||||
writel(tv, reg);
|
||||
}
|
||||
|
||||
/*boundary entry can't be used to accelerate data flow*/
|
||||
static void exclude_boundary_entry(struct foe_entry *foe_table_cpu)
|
||||
{
|
||||
int entry_base = 0;
|
||||
int bad_entry, i, j;
|
||||
struct foe_entry *foe_entry;
|
||||
/*these entries are boundary every 128 entries*/
|
||||
int boundary_entry_offset[8] = { 12, 25, 38, 51, 76, 89, 102, 115};
|
||||
|
||||
if (!foe_table_cpu)
|
||||
return;
|
||||
|
||||
for (i = 0; entry_base < hnat_priv->foe_etry_num; i++) {
|
||||
/* set boundary entries as static*/
|
||||
for (j = 0; j < 8; j++) {
|
||||
bad_entry = entry_base + boundary_entry_offset[j];
|
||||
foe_entry = &foe_table_cpu[bad_entry];
|
||||
foe_entry->udib1.sta = 1;
|
||||
}
|
||||
entry_base = (i + 1) * 128;
|
||||
}
|
||||
}
|
||||
|
||||
void set_gmac_ppe_fwd(int id, int enable)
|
||||
{
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
|
||||
reg = hnat_priv->fe_base + (id ? GDMA2_FWD_CFG : GDMA1_FWD_CFG);
|
||||
|
||||
if (enable) {
|
||||
cr_set_bits(reg, BITS_GDM_ALL_FRC_P_PPE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*disabled */
|
||||
val = readl(reg);
|
||||
if ((val & GDM_ALL_FRC_MASK) == BITS_GDM_ALL_FRC_P_PPE)
|
||||
cr_set_field(reg, GDM_ALL_FRC_MASK,
|
||||
BITS_GDM_ALL_FRC_P_CPU_PDMA);
|
||||
}
|
||||
|
||||
static int entry_mac_cmp(struct foe_entry *entry, u8 *mac)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if(IS_IPV4_GRP(entry)) {
|
||||
if(((swab32(entry->ipv4_hnapt.dmac_hi) == *(u32 *)mac) &&
|
||||
(swab16(entry->ipv4_hnapt.dmac_lo) == *(u16 *)&mac[4])) ||
|
||||
((swab32(entry->ipv4_hnapt.smac_hi) == *(u32 *)mac) &&
|
||||
(swab16(entry->ipv4_hnapt.smac_lo) == *(u16 *)&mac[4])))
|
||||
ret = 1;
|
||||
} else {
|
||||
if(((swab32(entry->ipv6_5t_route.dmac_hi) == *(u32 *)mac) &&
|
||||
(swab16(entry->ipv6_5t_route.dmac_lo) == *(u16 *)&mac[4])) ||
|
||||
((swab32(entry->ipv6_5t_route.smac_hi) == *(u32 *)mac) &&
|
||||
(swab16(entry->ipv6_5t_route.smac_lo) == *(u16 *)&mac[4])))
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
if (ret && debug_level >= 2)
|
||||
pr_info("mac=%pM\n", mac);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int entry_delete_by_mac(u8 *mac)
|
||||
{
|
||||
struct foe_entry *entry = NULL;
|
||||
int index, i, ret = 0;
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++) {
|
||||
entry = hnat_priv->foe_table_cpu[i];
|
||||
for (index = 0; index < DEF_ETRY_NUM; entry++, index++) {
|
||||
if(entry->bfib1.state == BIND && entry_mac_cmp(entry, mac)) {
|
||||
memset(entry, 0, sizeof(*entry));
|
||||
hnat_cache_ebl(1);
|
||||
if (debug_level >= 2)
|
||||
pr_info("delete entry idx = %d\n", index);
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!ret && debug_level >= 2)
|
||||
pr_info("entry not found\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(entry_delete_by_mac);
|
||||
|
||||
static void hnat_roam_handler(struct work_struct *work)
|
||||
{
|
||||
struct kvec iov;
|
||||
struct msghdr msg;
|
||||
struct nlmsghdr *nlh;
|
||||
struct ndmsg *ndm;
|
||||
struct nlattr *nla;
|
||||
u8 rcv_buf[512];
|
||||
int len;
|
||||
|
||||
if (!_hnat_roam_sock)
|
||||
return;
|
||||
|
||||
iov.iov_base = rcv_buf;
|
||||
iov.iov_len = sizeof(rcv_buf);
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
msg.msg_namelen = sizeof(struct sockaddr_nl);
|
||||
|
||||
len = kernel_recvmsg(_hnat_roam_sock, &msg, &iov, 1, iov.iov_len, 0);
|
||||
if (len <= 0)
|
||||
goto out;
|
||||
|
||||
nlh = (struct nlmsghdr*)rcv_buf;
|
||||
if (!NLMSG_OK(nlh, len) || nlh->nlmsg_type != RTM_NEWNEIGH)
|
||||
goto out;
|
||||
|
||||
len = nlh->nlmsg_len - NLMSG_HDRLEN;
|
||||
ndm = (struct ndmsg *)NLMSG_DATA(nlh);
|
||||
if (ndm->ndm_family != PF_BRIDGE)
|
||||
goto out;
|
||||
|
||||
nla = (struct nlattr *)((u8 *)ndm + sizeof(struct ndmsg));
|
||||
len -= NLMSG_LENGTH(sizeof(struct ndmsg));
|
||||
while (nla_ok(nla, len)) {
|
||||
if (nla_type(nla) == NDA_LLADDR) {
|
||||
entry_delete_by_mac(nla_data(nla));
|
||||
}
|
||||
nla = nla_next(nla, &len);
|
||||
}
|
||||
|
||||
out:
|
||||
schedule_work(&_hnat_roam_work);
|
||||
}
|
||||
|
||||
static int hnat_roaming_enable(void)
|
||||
{
|
||||
struct socket *sock = NULL;
|
||||
struct sockaddr_nl addr;
|
||||
int ret;
|
||||
|
||||
INIT_WORK(&_hnat_roam_work, hnat_roam_handler);
|
||||
|
||||
ret = sock_create_kern(&init_net, AF_NETLINK, SOCK_RAW, NETLINK_ROUTE, &sock);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
_hnat_roam_sock = sock;
|
||||
|
||||
addr.nl_family = AF_NETLINK;
|
||||
addr.nl_pad = 0;
|
||||
addr.nl_pid = 65534;
|
||||
addr.nl_groups = 1 << (RTNLGRP_NEIGH - 1);
|
||||
ret = kernel_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
schedule_work(&_hnat_roam_work);
|
||||
pr_info("hnat roaming work enable\n");
|
||||
|
||||
return 0;
|
||||
out:
|
||||
if (sock)
|
||||
sock_release(sock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void hnat_roaming_disable(void)
|
||||
{
|
||||
if (_hnat_roam_sock)
|
||||
sock_release(_hnat_roam_sock);
|
||||
_hnat_roam_sock = NULL;
|
||||
pr_info("hnat roaming work disable\n");
|
||||
}
|
||||
|
||||
static int hnat_start(u32 ppe_id)
|
||||
{
|
||||
u32 foe_table_sz;
|
||||
u32 foe_mib_tb_sz;
|
||||
int etry_num_cfg;
|
||||
|
||||
if (ppe_id >= CFG_PPE_NUM)
|
||||
return -EINVAL;
|
||||
|
||||
/* mapp the FOE table */
|
||||
for (etry_num_cfg = DEF_ETRY_NUM_CFG ; etry_num_cfg >= 0 ; etry_num_cfg--, hnat_priv->foe_etry_num /= 2) {
|
||||
foe_table_sz = hnat_priv->foe_etry_num * sizeof(struct foe_entry);
|
||||
hnat_priv->foe_table_cpu[ppe_id] = dma_alloc_coherent(
|
||||
hnat_priv->dev, foe_table_sz,
|
||||
&hnat_priv->foe_table_dev[ppe_id], GFP_KERNEL);
|
||||
|
||||
if (hnat_priv->foe_table_cpu[ppe_id])
|
||||
break;
|
||||
}
|
||||
|
||||
if (!hnat_priv->foe_table_cpu[ppe_id])
|
||||
return -1;
|
||||
dev_info(hnat_priv->dev, "PPE%d entry number = %d\n",
|
||||
ppe_id, hnat_priv->foe_etry_num);
|
||||
|
||||
writel(hnat_priv->foe_table_dev[ppe_id], hnat_priv->ppe_base[ppe_id] + PPE_TB_BASE);
|
||||
memset(hnat_priv->foe_table_cpu[ppe_id], 0, foe_table_sz);
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V1)
|
||||
exclude_boundary_entry(hnat_priv->foe_table_cpu[ppe_id]);
|
||||
|
||||
if (hnat_priv->data->per_flow_accounting) {
|
||||
foe_mib_tb_sz = hnat_priv->foe_etry_num * sizeof(struct mib_entry);
|
||||
hnat_priv->foe_mib_cpu[ppe_id] =
|
||||
dma_alloc_coherent(hnat_priv->dev, foe_mib_tb_sz,
|
||||
&hnat_priv->foe_mib_dev[ppe_id], GFP_KERNEL);
|
||||
if (!hnat_priv->foe_mib_cpu[ppe_id])
|
||||
return -1;
|
||||
writel(hnat_priv->foe_mib_dev[ppe_id],
|
||||
hnat_priv->ppe_base[ppe_id] + PPE_MIB_TB_BASE);
|
||||
memset(hnat_priv->foe_mib_cpu[ppe_id], 0, foe_mib_tb_sz);
|
||||
|
||||
hnat_priv->acct[ppe_id] =
|
||||
kzalloc(hnat_priv->foe_etry_num * sizeof(struct hnat_accounting),
|
||||
GFP_KERNEL);
|
||||
if (!hnat_priv->acct[ppe_id])
|
||||
return -1;
|
||||
}
|
||||
/* setup hashing */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, TB_ETRY_NUM, etry_num_cfg);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, HASH_MODE, HASH_MODE_1);
|
||||
writel(HASH_SEED_KEY, hnat_priv->ppe_base[ppe_id] + PPE_HASH_SEED);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, XMODE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, TB_ENTRY_SIZE, ENTRY_80B);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, SMA, SMA_FWD_CPU_BUILD_ENTRY);
|
||||
|
||||
/* set ip proto */
|
||||
writel(0xFFFFFFFF, hnat_priv->ppe_base[ppe_id] + PPE_IP_PROT_CHK);
|
||||
|
||||
/* setup caching */
|
||||
hnat_cache_ebl(1);
|
||||
|
||||
/* enable FOE */
|
||||
cr_set_bits(hnat_priv->ppe_base[ppe_id] + PPE_FLOW_CFG,
|
||||
BIT_UDP_IP4F_NAT_EN | BIT_IPV4_NAT_EN | BIT_IPV4_NAPT_EN |
|
||||
BIT_IPV4_NAT_FRAG_EN | BIT_IPV4_HASH_GREK |
|
||||
BIT_IPV4_DSL_EN | BIT_IPV6_6RD_EN |
|
||||
BIT_IPV6_3T_ROUTE_EN | BIT_IPV6_5T_ROUTE_EN);
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V4)
|
||||
cr_set_bits(hnat_priv->ppe_base[ppe_id] + PPE_FLOW_CFG,
|
||||
BIT_IPV4_MAPE_EN | BIT_IPV4_MAPT_EN);
|
||||
|
||||
/* setup FOE aging */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, NTU_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, UNBD_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_UNB_AGE, UNB_MNP, 1000);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_UNB_AGE, UNB_DLTA, 3);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, TCP_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, UDP_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, FIN_AGE, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BND_AGE_0, UDP_DLTA, 12);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BND_AGE_0, NTU_DLTA, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BND_AGE_1, FIN_DLTA, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BND_AGE_1, TCP_DLTA, 7);
|
||||
|
||||
/* setup FOE ka */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, SCAN_MODE, 2);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, KA_CFG, 3);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_KA, KA_T, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_KA, TCP_KA, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_KA, UDP_KA, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BIND_LMT_1, NTU_KA, 1);
|
||||
|
||||
/* setup FOE rate limit */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BIND_LMT_0, QURT_LMT, 16383);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BIND_LMT_0, HALF_LMT, 16383);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BIND_LMT_1, FULL_LMT, 16383);
|
||||
/* setup binding threshold as 30 packets per second */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_BNDR, BIND_RATE, 0x1E);
|
||||
|
||||
/* setup FOE cf gen */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, PPE_EN, 1);
|
||||
writel(0, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT); /* pdma */
|
||||
/* writel(0x55555555, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT); */ /* qdma */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, TTL0_DRP, 0);
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V4) {
|
||||
writel(0xcb777, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT1);
|
||||
writel(0x7f, hnat_priv->ppe_base[ppe_id] + PPE_SBW_CTRL);
|
||||
}
|
||||
|
||||
/*enable ppe mib counter*/
|
||||
if (hnat_priv->data->per_flow_accounting) {
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MIB_CFG, MIB_EN, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MIB_CFG, MIB_READ_CLEAR, 1);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MIB_CAH_CTRL, MIB_CAH_EN, 1);
|
||||
}
|
||||
|
||||
hnat_priv->g_ppdev = dev_get_by_name(&init_net, hnat_priv->ppd);
|
||||
hnat_priv->g_wandev = dev_get_by_name(&init_net, hnat_priv->wan);
|
||||
|
||||
dev_info(hnat_priv->dev, "PPE%d hwnat start\n", ppe_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ppe_busy_wait(u32 ppe_id)
|
||||
{
|
||||
unsigned long t_start = jiffies;
|
||||
u32 r = 0;
|
||||
|
||||
if (ppe_id >= CFG_PPE_NUM)
|
||||
return -EINVAL;
|
||||
|
||||
while (1) {
|
||||
r = readl((hnat_priv->ppe_base[ppe_id] + 0x0));
|
||||
if (!(r & BIT(31)))
|
||||
return 0;
|
||||
if (time_after(jiffies, t_start + HZ))
|
||||
break;
|
||||
usleep_range(10, 20);
|
||||
}
|
||||
|
||||
dev_notice(hnat_priv->dev, "ppe:%s timeout\n", __func__);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void hnat_stop(u32 ppe_id)
|
||||
{
|
||||
u32 foe_table_sz;
|
||||
u32 foe_mib_tb_sz;
|
||||
struct foe_entry *entry, *end;
|
||||
u32 r1 = 0, r2 = 0;
|
||||
|
||||
if (ppe_id >= CFG_PPE_NUM)
|
||||
return;
|
||||
|
||||
/* send all traffic back to the DMA engine */
|
||||
set_gmac_ppe_fwd(0, 0);
|
||||
set_gmac_ppe_fwd(1, 0);
|
||||
|
||||
dev_info(hnat_priv->dev, "hwnat stop\n");
|
||||
|
||||
if (hnat_priv->foe_table_cpu[ppe_id]) {
|
||||
entry = hnat_priv->foe_table_cpu[ppe_id];
|
||||
end = hnat_priv->foe_table_cpu[ppe_id] + hnat_priv->foe_etry_num;
|
||||
while (entry < end) {
|
||||
entry->bfib1.state = INVALID;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
/* disable caching */
|
||||
hnat_cache_ebl(0);
|
||||
|
||||
/* flush cache has to be ahead of hnat disable --*/
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, PPE_EN, 0);
|
||||
|
||||
/* disable scan mode and keep-alive */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, SCAN_MODE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, KA_CFG, 0);
|
||||
|
||||
ppe_busy_wait(ppe_id);
|
||||
|
||||
/* disable FOE */
|
||||
cr_clr_bits(hnat_priv->ppe_base[ppe_id] + PPE_FLOW_CFG,
|
||||
BIT_IPV4_NAPT_EN | BIT_IPV4_NAT_EN | BIT_IPV4_NAT_FRAG_EN |
|
||||
BIT_IPV6_HASH_GREK | BIT_IPV4_DSL_EN |
|
||||
BIT_IPV6_6RD_EN | BIT_IPV6_3T_ROUTE_EN |
|
||||
BIT_IPV6_5T_ROUTE_EN | BIT_FUC_FOE | BIT_FMC_FOE);
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V4)
|
||||
cr_clr_bits(hnat_priv->ppe_base[ppe_id] + PPE_FLOW_CFG,
|
||||
BIT_IPV4_MAPE_EN | BIT_IPV4_MAPT_EN);
|
||||
|
||||
/* disable FOE aging */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, NTU_AGE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, UNBD_AGE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, TCP_AGE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, UDP_AGE, 0);
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_TB_CFG, FIN_AGE, 0);
|
||||
|
||||
r1 = readl(hnat_priv->fe_base + 0x100);
|
||||
r2 = readl(hnat_priv->fe_base + 0x10c);
|
||||
|
||||
dev_info(hnat_priv->dev, "0x100 = 0x%x, 0x10c = 0x%x\n", r1, r2);
|
||||
|
||||
if (((r1 & 0xff00) >> 0x8) >= (r1 & 0xff) ||
|
||||
((r1 & 0xff00) >> 0x8) >= (r2 & 0xff)) {
|
||||
dev_info(hnat_priv->dev, "reset pse\n");
|
||||
writel(0x1, hnat_priv->fe_base + 0x4);
|
||||
}
|
||||
|
||||
/* free the FOE table */
|
||||
foe_table_sz = hnat_priv->foe_etry_num * sizeof(struct foe_entry);
|
||||
if (hnat_priv->foe_table_cpu[ppe_id])
|
||||
dma_free_coherent(hnat_priv->dev, foe_table_sz,
|
||||
hnat_priv->foe_table_cpu[ppe_id],
|
||||
hnat_priv->foe_table_dev[ppe_id]);
|
||||
writel(0, hnat_priv->ppe_base[ppe_id] + PPE_TB_BASE);
|
||||
|
||||
if (hnat_priv->data->per_flow_accounting) {
|
||||
foe_mib_tb_sz = hnat_priv->foe_etry_num * sizeof(struct mib_entry);
|
||||
if (hnat_priv->foe_mib_cpu[ppe_id])
|
||||
dma_free_coherent(hnat_priv->dev, foe_mib_tb_sz,
|
||||
hnat_priv->foe_mib_cpu[ppe_id],
|
||||
hnat_priv->foe_mib_dev[ppe_id]);
|
||||
writel(0, hnat_priv->ppe_base[ppe_id] + PPE_MIB_TB_BASE);
|
||||
kfree(hnat_priv->acct[ppe_id]);
|
||||
}
|
||||
}
|
||||
|
||||
static void hnat_release_netdev(void)
|
||||
{
|
||||
int i;
|
||||
struct extdev_entry *ext_entry;
|
||||
|
||||
for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) {
|
||||
ext_entry = hnat_priv->ext_if[i];
|
||||
if (ext_entry->dev)
|
||||
dev_put(ext_entry->dev);
|
||||
ext_if_del(ext_entry);
|
||||
kfree(ext_entry);
|
||||
}
|
||||
|
||||
if (hnat_priv->g_ppdev)
|
||||
dev_put(hnat_priv->g_ppdev);
|
||||
|
||||
if (hnat_priv->g_wandev)
|
||||
dev_put(hnat_priv->g_wandev);
|
||||
}
|
||||
|
||||
static struct notifier_block nf_hnat_netdevice_nb __read_mostly = {
|
||||
.notifier_call = nf_hnat_netdevice_event,
|
||||
};
|
||||
|
||||
static struct notifier_block nf_hnat_netevent_nb __read_mostly = {
|
||||
.notifier_call = nf_hnat_netevent_handler,
|
||||
};
|
||||
|
||||
int hnat_enable_hook(void)
|
||||
{
|
||||
/* register hook functions used by WHNAT module.
|
||||
*/
|
||||
if (hnat_priv->data->whnat) {
|
||||
ra_sw_nat_hook_rx =
|
||||
(hnat_priv->data->version == MTK_HNAT_V4) ?
|
||||
mtk_sw_nat_hook_rx : NULL;
|
||||
ra_sw_nat_hook_tx = mtk_sw_nat_hook_tx;
|
||||
ppe_dev_register_hook = mtk_ppe_dev_register_hook;
|
||||
ppe_dev_unregister_hook = mtk_ppe_dev_unregister_hook;
|
||||
}
|
||||
|
||||
if (hnat_register_nf_hooks())
|
||||
return -1;
|
||||
|
||||
hook_toggle = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hnat_disable_hook(void)
|
||||
{
|
||||
int i, hash_index;
|
||||
struct foe_entry *entry;
|
||||
|
||||
ra_sw_nat_hook_tx = NULL;
|
||||
ra_sw_nat_hook_rx = NULL;
|
||||
hnat_unregister_nf_hooks();
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++) {
|
||||
cr_set_field(hnat_priv->ppe_base[i] + PPE_TB_CFG,
|
||||
SMA, SMA_ONLY_FWD_CPU);
|
||||
|
||||
for (hash_index = 0; hash_index < hnat_priv->foe_etry_num; hash_index++) {
|
||||
entry = hnat_priv->foe_table_cpu[i] + hash_index;
|
||||
if (entry->bfib1.state == BIND) {
|
||||
entry->ipv4_hnapt.udib1.state = INVALID;
|
||||
entry->ipv4_hnapt.udib1.time_stamp =
|
||||
readl((hnat_priv->fe_base + 0x0010)) & 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* clear HWNAT cache */
|
||||
hnat_cache_ebl(1);
|
||||
|
||||
mod_timer(&hnat_priv->hnat_sma_build_entry_timer, jiffies + 3 * HZ);
|
||||
hook_toggle = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct packet_type mtk_pack_type __read_mostly = {
|
||||
.type = HQOS_MAGIC_TAG,
|
||||
.func = mtk_hqos_ptype_cb,
|
||||
};
|
||||
|
||||
static int hnat_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
int err = 0;
|
||||
int index = 0;
|
||||
struct resource *res;
|
||||
const char *name;
|
||||
struct device_node *np;
|
||||
unsigned int val;
|
||||
struct property *prop;
|
||||
struct extdev_entry *ext_entry;
|
||||
const struct of_device_id *match;
|
||||
|
||||
hnat_priv = devm_kzalloc(&pdev->dev, sizeof(struct mtk_hnat), GFP_KERNEL);
|
||||
if (!hnat_priv)
|
||||
return -ENOMEM;
|
||||
|
||||
hnat_priv->foe_etry_num = DEF_ETRY_NUM;
|
||||
|
||||
match = of_match_device(of_hnat_match, &pdev->dev);
|
||||
if (unlikely(!match))
|
||||
return -EINVAL;
|
||||
|
||||
hnat_priv->data = (struct mtk_hnat_data *)match->data;
|
||||
|
||||
hnat_priv->dev = &pdev->dev;
|
||||
np = hnat_priv->dev->of_node;
|
||||
|
||||
err = of_property_read_string(np, "mtketh-wan", &name);
|
||||
if (err < 0)
|
||||
return -EINVAL;
|
||||
|
||||
strncpy(hnat_priv->wan, (char *)name, IFNAMSIZ - 1);
|
||||
dev_info(&pdev->dev, "wan = %s\n", hnat_priv->wan);
|
||||
|
||||
err = of_property_read_string(np, "mtketh-lan", &name);
|
||||
if (err < 0)
|
||||
strncpy(hnat_priv->lan, "eth0", IFNAMSIZ);
|
||||
else
|
||||
strncpy(hnat_priv->lan, (char *)name, IFNAMSIZ - 1);
|
||||
dev_info(&pdev->dev, "lan = %s\n", hnat_priv->lan);
|
||||
|
||||
err = of_property_read_string(np, "mtketh-ppd", &name);
|
||||
if (err < 0)
|
||||
strncpy(hnat_priv->ppd, "eth0", IFNAMSIZ);
|
||||
else
|
||||
strncpy(hnat_priv->ppd, (char *)name, IFNAMSIZ - 1);
|
||||
dev_info(&pdev->dev, "ppd = %s\n", hnat_priv->ppd);
|
||||
|
||||
/*get total gmac num in hnat*/
|
||||
err = of_property_read_u32_index(np, "mtketh-max-gmac", 0, &val);
|
||||
|
||||
if (err < 0)
|
||||
return -EINVAL;
|
||||
|
||||
hnat_priv->gmac_num = val;
|
||||
|
||||
dev_info(&pdev->dev, "gmac num = %d\n", hnat_priv->gmac_num);
|
||||
|
||||
err = of_property_read_u32_index(np, "mtkdsa-wan-port", 0, &val);
|
||||
|
||||
if (err < 0) {
|
||||
hnat_priv->wan_dsa_port = NONE_DSA_PORT;
|
||||
} else {
|
||||
hnat_priv->wan_dsa_port = val;
|
||||
dev_info(&pdev->dev, "wan dsa port = %d\n", hnat_priv->wan_dsa_port);
|
||||
}
|
||||
|
||||
err = of_property_read_u32_index(np, "mtketh-ppe-num", 0, &val);
|
||||
|
||||
if (err < 0)
|
||||
hnat_priv->ppe_num = 1;
|
||||
else
|
||||
hnat_priv->ppe_num = val;
|
||||
|
||||
dev_info(&pdev->dev, "ppe num = %d\n", hnat_priv->ppe_num);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -ENOENT;
|
||||
|
||||
hnat_priv->fe_base = devm_ioremap_nocache(&pdev->dev, res->start,
|
||||
res->end - res->start + 1);
|
||||
if (!hnat_priv->fe_base)
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
hnat_priv->ppe_base[0] = hnat_priv->fe_base + 0x2200;
|
||||
|
||||
if (CFG_PPE_NUM > 1)
|
||||
hnat_priv->ppe_base[1] = hnat_priv->fe_base + 0x2600;
|
||||
#else
|
||||
hnat_priv->ppe_base[0] = hnat_priv->fe_base + 0xe00;
|
||||
#endif
|
||||
|
||||
err = hnat_init_debugfs(hnat_priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
prop = of_find_property(np, "ext-devices", NULL);
|
||||
for (name = of_prop_next_string(prop, NULL); name;
|
||||
name = of_prop_next_string(prop, name), index++) {
|
||||
ext_entry = kzalloc(sizeof(*ext_entry), GFP_KERNEL);
|
||||
if (!ext_entry) {
|
||||
err = -ENOMEM;
|
||||
goto err_out1;
|
||||
}
|
||||
strncpy(ext_entry->name, (char *)name, IFNAMSIZ - 1);
|
||||
ext_if_add(ext_entry);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) {
|
||||
ext_entry = hnat_priv->ext_if[i];
|
||||
dev_info(&pdev->dev, "ext devices = %s\n", ext_entry->name);
|
||||
}
|
||||
|
||||
hnat_priv->lvid = 1;
|
||||
hnat_priv->wvid = 2;
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++) {
|
||||
err = hnat_start(i);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (hnat_priv->data->whnat) {
|
||||
err = whnat_adjust_nf_hooks();
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
err = hnat_enable_hook();
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
register_netdevice_notifier(&nf_hnat_netdevice_nb);
|
||||
register_netevent_notifier(&nf_hnat_netevent_nb);
|
||||
|
||||
if (hnat_priv->data->mcast) {
|
||||
for (i = 0; i < CFG_PPE_NUM; i++)
|
||||
hnat_mcast_enable(i);
|
||||
}
|
||||
|
||||
timer_setup(&hnat_priv->hnat_sma_build_entry_timer, hnat_sma_build_entry, 0);
|
||||
if (hnat_priv->data->version == MTK_HNAT_V3) {
|
||||
timer_setup(&hnat_priv->hnat_reset_timestamp_timer, hnat_reset_timestamp, 0);
|
||||
hnat_priv->hnat_reset_timestamp_timer.expires = jiffies;
|
||||
add_timer(&hnat_priv->hnat_reset_timestamp_timer);
|
||||
}
|
||||
|
||||
if (qos_toggle && IS_GMAC1_MODE)
|
||||
dev_add_pack(&mtk_pack_type);
|
||||
|
||||
err = hnat_roaming_enable();
|
||||
if (err)
|
||||
pr_info("hnat roaming work fail\n");
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
for (i = 0; i < CFG_PPE_NUM; i++)
|
||||
hnat_stop(i);
|
||||
err_out1:
|
||||
hnat_deinit_debugfs(hnat_priv);
|
||||
for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) {
|
||||
ext_entry = hnat_priv->ext_if[i];
|
||||
ext_if_del(ext_entry);
|
||||
kfree(ext_entry);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int hnat_remove(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
hnat_roaming_disable();
|
||||
unregister_netdevice_notifier(&nf_hnat_netdevice_nb);
|
||||
unregister_netevent_notifier(&nf_hnat_netevent_nb);
|
||||
hnat_disable_hook();
|
||||
|
||||
if (hnat_priv->data->mcast)
|
||||
hnat_mcast_disable();
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++)
|
||||
hnat_stop(i);
|
||||
|
||||
hnat_deinit_debugfs(hnat_priv);
|
||||
hnat_release_netdev();
|
||||
del_timer_sync(&hnat_priv->hnat_sma_build_entry_timer);
|
||||
if (hnat_priv->data->version == MTK_HNAT_V3)
|
||||
del_timer_sync(&hnat_priv->hnat_reset_timestamp_timer);
|
||||
|
||||
if (qos_toggle && IS_GMAC1_MODE)
|
||||
dev_remove_pack(&mtk_pack_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct mtk_hnat_data hnat_data_v1 = {
|
||||
.num_of_sch = 2,
|
||||
.whnat = false,
|
||||
.per_flow_accounting = false,
|
||||
.mcast = false,
|
||||
.version = MTK_HNAT_V1,
|
||||
};
|
||||
|
||||
static const struct mtk_hnat_data hnat_data_v2 = {
|
||||
.num_of_sch = 2,
|
||||
.whnat = true,
|
||||
.per_flow_accounting = true,
|
||||
.mcast = false,
|
||||
.version = MTK_HNAT_V2,
|
||||
};
|
||||
|
||||
static const struct mtk_hnat_data hnat_data_v3 = {
|
||||
.num_of_sch = 4,
|
||||
.whnat = false,
|
||||
.per_flow_accounting = false,
|
||||
.mcast = false,
|
||||
.version = MTK_HNAT_V3,
|
||||
};
|
||||
|
||||
static const struct mtk_hnat_data hnat_data_v4 = {
|
||||
.num_of_sch = 4,
|
||||
.whnat = true,
|
||||
.per_flow_accounting = true,
|
||||
.mcast = false,
|
||||
.version = MTK_HNAT_V4,
|
||||
};
|
||||
|
||||
const struct of_device_id of_hnat_match[] = {
|
||||
{ .compatible = "mediatek,mtk-hnat", .data = &hnat_data_v3 },
|
||||
{ .compatible = "mediatek,mtk-hnat_v1", .data = &hnat_data_v1 },
|
||||
{ .compatible = "mediatek,mtk-hnat_v2", .data = &hnat_data_v2 },
|
||||
{ .compatible = "mediatek,mtk-hnat_v3", .data = &hnat_data_v3 },
|
||||
{ .compatible = "mediatek,mtk-hnat_v4", .data = &hnat_data_v4 },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_hnat_match);
|
||||
|
||||
static struct platform_driver hnat_driver = {
|
||||
.probe = hnat_probe,
|
||||
.remove = hnat_remove,
|
||||
.driver = {
|
||||
.name = "mediatek_soc_hnat",
|
||||
.of_match_table = of_hnat_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(hnat_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("John Crispin <john@phrozen.org>");
|
||||
MODULE_DESCRIPTION("Mediatek Hardware NAT");
|
||||
@@ -0,0 +1,968 @@
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
|
||||
* Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <net/netevent.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include "hnat_mcast.h"
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* Register Offset*/
|
||||
/*--------------------------------------------------------------------------*/
|
||||
#define PPE_GLO_CFG 0x00
|
||||
#define PPE_FLOW_CFG 0x04
|
||||
#define PPE_IP_PROT_CHK 0x08
|
||||
#define PPE_IP_PROT_0 0x0C
|
||||
#define PPE_IP_PROT_1 0x10
|
||||
#define PPE_IP_PROT_2 0x14
|
||||
#define PPE_IP_PROT_3 0x18
|
||||
#define PPE_TB_CFG 0x1C
|
||||
#define PPE_TB_BASE 0x20
|
||||
#define PPE_TB_USED 0x24
|
||||
#define PPE_BNDR 0x28
|
||||
#define PPE_BIND_LMT_0 0x2C
|
||||
#define PPE_BIND_LMT_1 0x30
|
||||
#define PPE_KA 0x34
|
||||
#define PPE_UNB_AGE 0x38
|
||||
#define PPE_BND_AGE_0 0x3C
|
||||
#define PPE_BND_AGE_1 0x40
|
||||
#define PPE_HASH_SEED 0x44
|
||||
#define PPE_DFT_CPORT 0x48
|
||||
#define PPE_DFT_CPORT1 0x4C
|
||||
#define PPE_MCAST_PPSE 0x84
|
||||
#define PPE_MCAST_L_0 0x88
|
||||
#define PPE_MCAST_H_0 0x8C
|
||||
#define PPE_MCAST_L_1 0x90
|
||||
#define PPE_MCAST_H_1 0x94
|
||||
#define PPE_MCAST_L_2 0x98
|
||||
#define PPE_MCAST_H_2 0x9C
|
||||
#define PPE_MCAST_L_3 0xA0
|
||||
#define PPE_MCAST_H_3 0xA4
|
||||
#define PPE_MCAST_L_4 0xA8
|
||||
#define PPE_MCAST_H_4 0xAC
|
||||
#define PPE_MCAST_L_5 0xB0
|
||||
#define PPE_MCAST_H_5 0xB4
|
||||
#define PPE_MCAST_L_6 0xBC
|
||||
#define PPE_MCAST_H_6 0xC0
|
||||
#define PPE_MCAST_L_7 0xC4
|
||||
#define PPE_MCAST_H_7 0xC8
|
||||
#define PPE_MCAST_L_8 0xCC
|
||||
#define PPE_MCAST_H_8 0xD0
|
||||
#define PPE_MCAST_L_9 0xD4
|
||||
#define PPE_MCAST_H_9 0xD8
|
||||
#define PPE_MCAST_L_A 0xDC
|
||||
#define PPE_MCAST_H_A 0xE0
|
||||
#define PPE_MCAST_L_B 0xE4
|
||||
#define PPE_MCAST_H_B 0xE8
|
||||
#define PPE_MCAST_L_C 0xEC
|
||||
#define PPE_MCAST_H_C 0xF0
|
||||
#define PPE_MCAST_L_D 0xF4
|
||||
#define PPE_MCAST_H_D 0xF8
|
||||
#define PPE_MCAST_L_E 0xFC
|
||||
#define PPE_MCAST_H_E 0xE0
|
||||
#define PPE_MCAST_L_F 0x100
|
||||
#define PPE_MCAST_H_F 0x104
|
||||
#define PPE_MCAST_L_10 0xC00
|
||||
#define PPE_MCAST_H_10 0xC04
|
||||
#define PPE_MTU_DRP 0x108
|
||||
#define PPE_MTU_VLYR_0 0x10C
|
||||
#define PPE_MTU_VLYR_1 0x110
|
||||
#define PPE_MTU_VLYR_2 0x114
|
||||
#define PPE_VPM_TPID 0x118
|
||||
#define PPE_CAH_CTRL 0x120
|
||||
#define PPE_CAH_TAG_SRH 0x124
|
||||
#define PPE_CAH_LINE_RW 0x128
|
||||
#define PPE_CAH_WDATA 0x12C
|
||||
#define PPE_CAH_RDATA 0x130
|
||||
|
||||
#define PPE_MIB_CFG 0X134
|
||||
#define PPE_MIB_TB_BASE 0X138
|
||||
#define PPE_MIB_SER_CR 0X13C
|
||||
#define PPE_MIB_SER_R0 0X140
|
||||
#define PPE_MIB_SER_R1 0X144
|
||||
#define PPE_MIB_SER_R2 0X148
|
||||
#define PPE_MIB_CAH_CTRL 0X150
|
||||
#define PPE_MIB_CAH_TAG_SRH 0X154
|
||||
#define PPE_MIB_CAH_LINE_RW 0X158
|
||||
#define PPE_MIB_CAH_WDATA 0X15C
|
||||
#define PPE_MIB_CAH_RDATA 0X160
|
||||
#define PPE_SBW_CTRL 0x174
|
||||
|
||||
#define GDMA1_FWD_CFG 0x500
|
||||
#define GDMA2_FWD_CFG 0x1500
|
||||
|
||||
/* QDMA Tx queue configuration */
|
||||
#define QTX_CFG(x) (QDMA_BASE + ((x) * 0x10))
|
||||
#define QTX_CFG_HW_RESV_CNT_OFFSET (8)
|
||||
#define QTX_CFG_SW_RESV_CNT_OFFSET (0)
|
||||
|
||||
#define QTX_SCH(x) (QDMA_BASE + 0x4 + ((x) * 0x10))
|
||||
#define QTX_SCH_MIN_RATE_EN BIT(27)
|
||||
#define QTX_SCH_MAX_RATE_EN BIT(11)
|
||||
#define QTX_SCH_MIN_RATE_MAN_OFFSET (20)
|
||||
#define QTX_SCH_MIN_RATE_EXP_OFFSET (16)
|
||||
#define QTX_SCH_MAX_RATE_WGHT_OFFSET (12)
|
||||
#define QTX_SCH_MAX_RATE_MAN_OFFSET (4)
|
||||
#define QTX_SCH_MAX_RATE_EXP_OFFSET (0)
|
||||
|
||||
/* QDMA Tx scheduler configuration */
|
||||
#define QDMA_PAGE (QDMA_BASE + 0x1f0)
|
||||
#define QDMA_TX_2SCH_BASE (QDMA_BASE + 0x214)
|
||||
#define QTX_MIB_IF (QDMA_BASE + 0x2bc)
|
||||
#define QDMA_TX_4SCH_BASE(x) (QDMA_BASE + 0x398 + (((x) >> 1) * 0x4))
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* Register Mask*/
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* PPE_TB_CFG mask */
|
||||
#define TB_ETRY_NUM (0x7 << 0) /* RW */
|
||||
#define TB_ENTRY_SIZE (0x1 << 3) /* RW */
|
||||
#define SMA (0x3 << 4) /* RW */
|
||||
#define NTU_AGE (0x1 << 7) /* RW */
|
||||
#define UNBD_AGE (0x1 << 8) /* RW */
|
||||
#define TCP_AGE (0x1 << 9) /* RW */
|
||||
#define UDP_AGE (0x1 << 10) /* RW */
|
||||
#define FIN_AGE (0x1 << 11) /* RW */
|
||||
#define KA_CFG (0x3 << 12)
|
||||
#define HASH_MODE (0x3 << 14) /* RW */
|
||||
#define SCAN_MODE (0x3 << 16) /* RW */
|
||||
#define XMODE (0x3 << 18) /* RW */
|
||||
|
||||
/*PPE_CAH_CTRL mask*/
|
||||
#define CAH_EN (0x1 << 0) /* RW */
|
||||
#define CAH_X_MODE (0x1 << 9) /* RW */
|
||||
|
||||
/*PPE_UNB_AGE mask*/
|
||||
#define UNB_DLTA (0xff << 0) /* RW */
|
||||
#define UNB_MNP (0xffff << 16) /* RW */
|
||||
|
||||
/*PPE_BND_AGE_0 mask*/
|
||||
#define UDP_DLTA (0xffff << 0) /* RW */
|
||||
#define NTU_DLTA (0xffff << 16) /* RW */
|
||||
|
||||
/*PPE_BND_AGE_1 mask*/
|
||||
#define TCP_DLTA (0xffff << 0) /* RW */
|
||||
#define FIN_DLTA (0xffff << 16) /* RW */
|
||||
|
||||
/*PPE_KA mask*/
|
||||
#define KA_T (0xffff << 0) /* RW */
|
||||
#define TCP_KA (0xff << 16) /* RW */
|
||||
#define UDP_KA (0xff << 24) /* RW */
|
||||
|
||||
/*PPE_BIND_LMT_0 mask*/
|
||||
#define QURT_LMT (0x3ff << 0) /* RW */
|
||||
#define HALF_LMT (0x3ff << 16) /* RW */
|
||||
|
||||
/*PPE_BIND_LMT_1 mask*/
|
||||
#define FULL_LMT (0x3fff << 0) /* RW */
|
||||
#define NTU_KA (0xff << 16) /* RW */
|
||||
|
||||
/*PPE_BNDR mask*/
|
||||
#define BIND_RATE (0xffff << 0) /* RW */
|
||||
#define PBND_RD_PRD (0xffff << 16) /* RW */
|
||||
|
||||
/*PPE_GLO_CFG mask*/
|
||||
#define PPE_EN (0x1 << 0) /* RW */
|
||||
#define TTL0_DRP (0x1 << 4) /* RW */
|
||||
#define MCAST_TB_EN (0x1 << 7) /* RW */
|
||||
#define MCAST_HASH (0x3 << 12) /* RW */
|
||||
|
||||
#define MC_P3_PPSE (0xf << 12) /* RW */
|
||||
#define MC_P2_PPSE (0xf << 8) /* RW */
|
||||
#define MC_P1_PPSE (0xf << 4) /* RW */
|
||||
#define MC_P0_PPSE (0xf << 0) /* RW */
|
||||
|
||||
#define MIB_EN (0x1 << 0) /* RW */
|
||||
#define MIB_READ_CLEAR (0X1 << 1) /* RW */
|
||||
#define MIB_CAH_EN (0X1 << 0) /* RW */
|
||||
|
||||
/*GDMA_FWD_CFG mask */
|
||||
#define GDM_UFRC_MASK (0x7 << 12) /* RW */
|
||||
#define GDM_BFRC_MASK (0x7 << 8) /*RW*/
|
||||
#define GDM_MFRC_MASK (0x7 << 4) /*RW*/
|
||||
#define GDM_OFRC_MASK (0x7 << 0) /*RW*/
|
||||
#define GDM_ALL_FRC_MASK \
|
||||
(GDM_UFRC_MASK | GDM_BFRC_MASK | GDM_MFRC_MASK | GDM_OFRC_MASK)
|
||||
|
||||
/*QDMA_PAGE mask*/
|
||||
#define QTX_CFG_PAGE (0xf << 0) /* RW */
|
||||
|
||||
/*QTX_MIB_IF mask*/
|
||||
#define MIB_ON_QTX_CFG (0x1 << 31) /* RW */
|
||||
#define VQTX_MIB_EN (0x1 << 28) /* RW */
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* Descriptor Structure */
|
||||
/*--------------------------------------------------------------------------*/
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_unbind_info_blk {
|
||||
u32 time_stamp : 8;
|
||||
u32 sp : 4;
|
||||
u32 pcnt : 8;
|
||||
u32 ilgf : 1;
|
||||
u32 mc : 1;
|
||||
u32 preb : 1;
|
||||
u32 pkt_type : 5;
|
||||
u32 state : 2;
|
||||
u32 udp : 1;
|
||||
u32 sta : 1; /* static entry */
|
||||
} __packed;
|
||||
|
||||
struct hnat_bind_info_blk {
|
||||
u32 time_stamp : 8;
|
||||
u32 sp : 4;
|
||||
u32 mc : 1;
|
||||
u32 ka : 1; /* keep alive */
|
||||
u32 vlan_layer : 3;
|
||||
u32 psn : 1; /* egress packet has PPPoE session */
|
||||
u32 vpm : 1; /* 0:ethertype remark, 1:0x8100(CR default) */
|
||||
u32 ps : 1; /* packet sampling */
|
||||
u32 cah : 1; /* cacheable flag */
|
||||
u32 rmt : 1; /* remove tunnel ip header (6rd/dslite only) */
|
||||
u32 ttl : 1;
|
||||
u32 pkt_type : 5;
|
||||
u32 state : 2;
|
||||
u32 udp : 1;
|
||||
u32 sta : 1; /* static entry */
|
||||
} __packed;
|
||||
|
||||
struct hnat_info_blk2 {
|
||||
u32 qid : 7; /* QID in Qos Port */
|
||||
u32 port_mg : 1;
|
||||
u32 fqos : 1; /* force to PSE QoS port */
|
||||
u32 dp : 4; /* force to PSE port x */
|
||||
u32 mcast : 1; /* multicast this packet to CPU */
|
||||
u32 pcpl : 1; /* OSBN */
|
||||
u32 mibf : 1;
|
||||
u32 alen : 1;
|
||||
u32 rxid : 2;
|
||||
u32 winfoi : 1;
|
||||
u32 port_ag : 4;
|
||||
u32 dscp : 8; /* DSCP value */
|
||||
} __packed;
|
||||
|
||||
struct hnat_winfo {
|
||||
u32 bssid : 6; /* WiFi Bssidx */
|
||||
u32 wcid : 10; /* WiFi wtable Idx */
|
||||
} __packed;
|
||||
|
||||
#else
|
||||
struct hnat_unbind_info_blk {
|
||||
u32 time_stamp : 8;
|
||||
u32 pcnt : 16; /* packet count */
|
||||
u32 preb : 1;
|
||||
u32 pkt_type : 3;
|
||||
u32 state : 2;
|
||||
u32 udp : 1;
|
||||
u32 sta : 1; /* static entry */
|
||||
} __packed;
|
||||
|
||||
struct hnat_bind_info_blk {
|
||||
u32 time_stamp : 15;
|
||||
u32 ka : 1; /* keep alive */
|
||||
u32 vlan_layer : 3;
|
||||
u32 psn : 1; /* egress packet has PPPoE session */
|
||||
u32 vpm : 1; /* 0:ethertype remark, 1:0x8100(CR default) */
|
||||
u32 ps : 1; /* packet sampling */
|
||||
u32 cah : 1; /* cacheable flag */
|
||||
u32 rmt : 1; /* remove tunnel ip header (6rd/dslite only) */
|
||||
u32 ttl : 1;
|
||||
u32 pkt_type : 3;
|
||||
u32 state : 2;
|
||||
u32 udp : 1;
|
||||
u32 sta : 1; /* static entry */
|
||||
} __packed;
|
||||
|
||||
struct hnat_info_blk2 {
|
||||
u32 qid : 4; /* QID in Qos Port */
|
||||
u32 fqos : 1; /* force to PSE QoS port */
|
||||
u32 dp : 3; /* force to PSE port x
|
||||
* 0:PSE,1:GSW, 2:GMAC,4:PPE,5:QDMA,7=DROP
|
||||
*/
|
||||
u32 mcast : 1; /* multicast this packet to CPU */
|
||||
u32 pcpl : 1; /* OSBN */
|
||||
u32 mibf : 1; /* 0:off 1:on PPE MIB counter */
|
||||
u32 alen : 1; /* 0:post 1:pre packet length in accounting */
|
||||
u32 port_mg : 6; /* port meter group */
|
||||
u32 port_ag : 6; /* port account group */
|
||||
u32 dscp : 8; /* DSCP value */
|
||||
} __packed;
|
||||
|
||||
struct hnat_winfo {
|
||||
u32 bssid : 6; /* WiFi Bssidx */
|
||||
u32 wcid : 8; /* WiFi wtable Idx */
|
||||
u32 rxid : 2; /* WiFi Ring idx */
|
||||
} __packed;
|
||||
#endif
|
||||
|
||||
/* info blk2 for WHNAT */
|
||||
struct hnat_info_blk2_whnat {
|
||||
u32 qid : 4; /* QID[3:0] in Qos Port */
|
||||
u32 fqos : 1; /* force to PSE QoS port */
|
||||
u32 dp : 3; /* force to PSE port x
|
||||
* 0:PSE,1:GSW, 2:GMAC,4:PPE,5:QDMA,7=DROP
|
||||
*/
|
||||
u32 mcast : 1; /* multicast this packet to CPU */
|
||||
u32 pcpl : 1; /* OSBN */
|
||||
u32 mibf : 1; /* 0:off 1:on PPE MIB counter */
|
||||
u32 alen : 1; /* 0:post 1:pre packet length in accounting */
|
||||
u32 qid2 : 2; /* QID[5:4] in Qos Port */
|
||||
u32 resv : 2;
|
||||
u32 wdmaid : 1; /* 0:to pcie0 dev 1:to pcie1 dev */
|
||||
u32 winfoi : 1; /* 0:off 1:on Wi-Fi hwnat support */
|
||||
u32 port_ag : 6; /* port account group */
|
||||
u32 dscp : 8; /* DSCP value */
|
||||
} __packed;
|
||||
|
||||
struct hnat_ipv4_hnapt {
|
||||
union {
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
u32 info_blk1;
|
||||
};
|
||||
u32 sip;
|
||||
u32 dip;
|
||||
u16 dport;
|
||||
u16 sport;
|
||||
union {
|
||||
struct hnat_info_blk2 iblk2;
|
||||
struct hnat_info_blk2_whnat iblk2w;
|
||||
u32 info_blk2;
|
||||
};
|
||||
u32 new_sip;
|
||||
u32 new_dip;
|
||||
u16 new_dport;
|
||||
u16 new_sport;
|
||||
u16 m_timestamp; /* For mcast*/
|
||||
u16 resv1;
|
||||
u32 resv2;
|
||||
u32 resv3 : 26;
|
||||
u32 act_dp : 6; /* UDF */
|
||||
u16 vlan1;
|
||||
u16 etype;
|
||||
u32 dmac_hi;
|
||||
union {
|
||||
#if !defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
u16 vlan2;
|
||||
};
|
||||
u16 dmac_lo;
|
||||
u32 smac_hi;
|
||||
u16 pppoe_id;
|
||||
u16 smac_lo;
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
u16 minfo;
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct hnat_ipv4_dslite {
|
||||
union {
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
u32 info_blk1;
|
||||
};
|
||||
u32 sip;
|
||||
u32 dip;
|
||||
u16 dport;
|
||||
u16 sport;
|
||||
|
||||
u32 tunnel_sipv6_0;
|
||||
u32 tunnel_sipv6_1;
|
||||
u32 tunnel_sipv6_2;
|
||||
u32 tunnel_sipv6_3;
|
||||
|
||||
u32 tunnel_dipv6_0;
|
||||
u32 tunnel_dipv6_1;
|
||||
u32 tunnel_dipv6_2;
|
||||
u32 tunnel_dipv6_3;
|
||||
|
||||
u8 flow_lbl[3]; /* in order to consist with Linux kernel (should be 20bits) */
|
||||
u8 priority; /* in order to consist with Linux kernel (should be 8bits) */
|
||||
u32 hop_limit : 8;
|
||||
u32 resv2 : 18;
|
||||
u32 act_dp : 6; /* UDF */
|
||||
|
||||
union {
|
||||
struct hnat_info_blk2 iblk2;
|
||||
struct hnat_info_blk2_whnat iblk2w;
|
||||
u32 info_blk2;
|
||||
};
|
||||
|
||||
u16 vlan1;
|
||||
u16 etype;
|
||||
u32 dmac_hi;
|
||||
union {
|
||||
#if !defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
u16 vlan2;
|
||||
};
|
||||
u16 dmac_lo;
|
||||
u32 smac_hi;
|
||||
u16 pppoe_id;
|
||||
u16 smac_lo;
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
u16 minfo;
|
||||
struct hnat_winfo winfo;
|
||||
u32 new_sip;
|
||||
u32 new_dip;
|
||||
u16 new_dport;
|
||||
u16 new_sport;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct hnat_ipv6_3t_route {
|
||||
union {
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
u32 info_blk1;
|
||||
};
|
||||
u32 ipv6_sip0;
|
||||
u32 ipv6_sip1;
|
||||
u32 ipv6_sip2;
|
||||
u32 ipv6_sip3;
|
||||
u32 ipv6_dip0;
|
||||
u32 ipv6_dip1;
|
||||
u32 ipv6_dip2;
|
||||
u32 ipv6_dip3;
|
||||
u32 prot : 8;
|
||||
u32 hph : 24; /* hash placeholder */
|
||||
|
||||
u32 resv1;
|
||||
u32 resv2;
|
||||
u32 resv3;
|
||||
u32 resv4 : 26;
|
||||
u32 act_dp : 6; /* UDF */
|
||||
|
||||
union {
|
||||
struct hnat_info_blk2 iblk2;
|
||||
struct hnat_info_blk2_whnat iblk2w;
|
||||
u32 info_blk2;
|
||||
};
|
||||
u16 vlan1;
|
||||
u16 etype;
|
||||
u32 dmac_hi;
|
||||
union {
|
||||
#if !defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
u16 vlan2;
|
||||
};
|
||||
u16 dmac_lo;
|
||||
u32 smac_hi;
|
||||
u16 pppoe_id;
|
||||
u16 smac_lo;
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
u16 minfo;
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct hnat_ipv6_5t_route {
|
||||
union {
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
u32 info_blk1;
|
||||
};
|
||||
u32 ipv6_sip0;
|
||||
u32 ipv6_sip1;
|
||||
u32 ipv6_sip2;
|
||||
u32 ipv6_sip3;
|
||||
u32 ipv6_dip0;
|
||||
u32 ipv6_dip1;
|
||||
u32 ipv6_dip2;
|
||||
u32 ipv6_dip3;
|
||||
u16 dport;
|
||||
u16 sport;
|
||||
|
||||
u32 resv1;
|
||||
u32 resv2;
|
||||
u32 resv3;
|
||||
u32 resv4 : 26;
|
||||
u32 act_dp : 6; /* UDF */
|
||||
|
||||
union {
|
||||
struct hnat_info_blk2 iblk2;
|
||||
struct hnat_info_blk2_whnat iblk2w;
|
||||
u32 info_blk2;
|
||||
};
|
||||
|
||||
u16 vlan1;
|
||||
u16 etype;
|
||||
u32 dmac_hi;
|
||||
union {
|
||||
#if !defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
u16 vlan2;
|
||||
};
|
||||
u16 dmac_lo;
|
||||
u32 smac_hi;
|
||||
u16 pppoe_id;
|
||||
u16 smac_lo;
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
u16 minfo;
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct hnat_ipv6_6rd {
|
||||
union {
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
u32 info_blk1;
|
||||
};
|
||||
u32 ipv6_sip0;
|
||||
u32 ipv6_sip1;
|
||||
u32 ipv6_sip2;
|
||||
u32 ipv6_sip3;
|
||||
u32 ipv6_dip0;
|
||||
u32 ipv6_dip1;
|
||||
u32 ipv6_dip2;
|
||||
u32 ipv6_dip3;
|
||||
u16 dport;
|
||||
u16 sport;
|
||||
|
||||
u32 tunnel_sipv4;
|
||||
u32 tunnel_dipv4;
|
||||
u32 hdr_chksum : 16;
|
||||
u32 dscp : 8;
|
||||
u32 ttl : 8;
|
||||
u32 flag : 3;
|
||||
u32 resv1 : 13;
|
||||
u32 per_flow_6rd_id : 1;
|
||||
u32 resv2 : 9;
|
||||
u32 act_dp : 6; /* UDF */
|
||||
|
||||
union {
|
||||
struct hnat_info_blk2 iblk2;
|
||||
struct hnat_info_blk2_whnat iblk2w;
|
||||
u32 info_blk2;
|
||||
};
|
||||
|
||||
u16 vlan1;
|
||||
u16 etype;
|
||||
u32 dmac_hi;
|
||||
union {
|
||||
#if !defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_winfo winfo;
|
||||
#endif
|
||||
u16 vlan2;
|
||||
};
|
||||
u16 dmac_lo;
|
||||
u32 smac_hi;
|
||||
u16 pppoe_id;
|
||||
u16 smac_lo;
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
u16 minfo;
|
||||
struct hnat_winfo winfo;
|
||||
u32 resv3;
|
||||
u32 resv4;
|
||||
u16 new_dport;
|
||||
u16 new_sport;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct foe_entry {
|
||||
union {
|
||||
struct hnat_unbind_info_blk udib1;
|
||||
struct hnat_bind_info_blk bfib1;
|
||||
struct hnat_ipv4_hnapt ipv4_hnapt;
|
||||
struct hnat_ipv4_dslite ipv4_dslite;
|
||||
struct hnat_ipv6_3t_route ipv6_3t_route;
|
||||
struct hnat_ipv6_5t_route ipv6_5t_route;
|
||||
struct hnat_ipv6_6rd ipv6_6rd;
|
||||
};
|
||||
};
|
||||
|
||||
/* If user wants to change default FOE entry number, both DEF_ETRY_NUM and
|
||||
* DEF_ETRY_NUM_CFG need to be modified.
|
||||
*/
|
||||
#define DEF_ETRY_NUM 8192
|
||||
/* feasible values : 32768, 16384, 8192, 4096, 2048, 1024 */
|
||||
#define DEF_ETRY_NUM_CFG TABLE_8K
|
||||
/* corresponding values : TABLE_32K, TABLE_16K, TABLE_8K, TABLE_4K, TABLE_2K,
|
||||
* TABLE_1K
|
||||
*/
|
||||
#define MAX_EXT_DEVS (0x3fU)
|
||||
#define MAX_IF_NUM 64
|
||||
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
#define MAX_PPE_NUM 2
|
||||
#else
|
||||
#define MAX_PPE_NUM 1
|
||||
#endif
|
||||
#define CFG_PPE_NUM (hnat_priv->ppe_num)
|
||||
|
||||
struct mib_entry {
|
||||
u32 byt_cnt_l;
|
||||
u16 byt_cnt_h;
|
||||
u32 pkt_cnt_l;
|
||||
u8 pkt_cnt_h;
|
||||
u8 resv0;
|
||||
u32 resv1;
|
||||
} __packed;
|
||||
|
||||
struct hnat_accounting {
|
||||
u64 bytes;
|
||||
u64 packets;
|
||||
};
|
||||
|
||||
enum mtk_hnat_version {
|
||||
MTK_HNAT_V1 = 1, /* version 1: mt7621, mt7623 */
|
||||
MTK_HNAT_V2, /* version 2: mt7622 */
|
||||
MTK_HNAT_V3, /* version 3: mt7629 */
|
||||
MTK_HNAT_V4, /* version 4: mt7986 */
|
||||
};
|
||||
|
||||
struct mtk_hnat_data {
|
||||
u8 num_of_sch;
|
||||
bool whnat;
|
||||
bool per_flow_accounting;
|
||||
bool mcast;
|
||||
enum mtk_hnat_version version;
|
||||
};
|
||||
|
||||
struct mtk_hnat {
|
||||
struct device *dev;
|
||||
void __iomem *fe_base;
|
||||
void __iomem *ppe_base[MAX_PPE_NUM];
|
||||
struct foe_entry *foe_table_cpu[MAX_PPE_NUM];
|
||||
dma_addr_t foe_table_dev[MAX_PPE_NUM];
|
||||
u8 enable;
|
||||
u8 enable1;
|
||||
struct dentry *root;
|
||||
struct debugfs_regset32 *regset[MAX_PPE_NUM];
|
||||
|
||||
struct mib_entry *foe_mib_cpu[MAX_PPE_NUM];
|
||||
dma_addr_t foe_mib_dev[MAX_PPE_NUM];
|
||||
struct hnat_accounting *acct[MAX_PPE_NUM];
|
||||
const struct mtk_hnat_data *data;
|
||||
|
||||
/*devices we plays for*/
|
||||
char wan[IFNAMSIZ];
|
||||
char lan[IFNAMSIZ];
|
||||
char ppd[IFNAMSIZ];
|
||||
u16 lvid;
|
||||
u16 wvid;
|
||||
|
||||
struct reset_control *rstc;
|
||||
|
||||
u8 ppe_num;
|
||||
u8 gmac_num;
|
||||
u8 wan_dsa_port;
|
||||
struct ppe_mcast_table *pmcast;
|
||||
|
||||
u32 foe_etry_num;
|
||||
struct net_device *g_ppdev;
|
||||
struct net_device *g_wandev;
|
||||
struct net_device *wifi_hook_if[MAX_IF_NUM];
|
||||
struct extdev_entry *ext_if[MAX_EXT_DEVS];
|
||||
struct timer_list hnat_sma_build_entry_timer;
|
||||
struct timer_list hnat_reset_timestamp_timer;
|
||||
struct timer_list hnat_mcast_check_timer;
|
||||
bool nf_stat_en;
|
||||
};
|
||||
|
||||
struct extdev_entry {
|
||||
char name[IFNAMSIZ];
|
||||
struct net_device *dev;
|
||||
};
|
||||
|
||||
struct tcpudphdr {
|
||||
__be16 src;
|
||||
__be16 dst;
|
||||
};
|
||||
|
||||
enum FoeEntryState { INVALID = 0, UNBIND = 1, BIND = 2, FIN = 3 };
|
||||
|
||||
enum FoeIpAct {
|
||||
IPV4_HNAPT = 0,
|
||||
IPV4_HNAT = 1,
|
||||
IPV4_DSLITE = 3,
|
||||
IPV6_3T_ROUTE = 4,
|
||||
IPV6_5T_ROUTE = 5,
|
||||
IPV6_6RD = 7,
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
IPV4_MAP_T = 8,
|
||||
IPV4_MAP_E = 9,
|
||||
#else
|
||||
IPV4_MAP_T = 6,
|
||||
IPV4_MAP_E = 6,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* Common Definition*/
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#define HNAT_SW_VER "1.1.0"
|
||||
#define HASH_SEED_KEY 0x12345678
|
||||
|
||||
/*PPE_TB_CFG value*/
|
||||
#define ENTRY_80B 1
|
||||
#define ENTRY_64B 0
|
||||
#define TABLE_1K 0
|
||||
#define TABLE_2K 1
|
||||
#define TABLE_4K 2
|
||||
#define TABLE_8K 3
|
||||
#define TABLE_16K 4
|
||||
#define TABLE_32K 5
|
||||
#define SMA_DROP 0 /* Drop the packet */
|
||||
#define SMA_DROP2 1 /* Drop the packet */
|
||||
#define SMA_ONLY_FWD_CPU 2 /* Only Forward to CPU */
|
||||
#define SMA_FWD_CPU_BUILD_ENTRY 3 /* Forward to CPU and build new FOE entry */
|
||||
#define HASH_MODE_0 0
|
||||
#define HASH_MODE_1 1
|
||||
#define HASH_MODE_2 2
|
||||
#define HASH_MODE_3 3
|
||||
|
||||
/*PPE_FLOW_CFG*/
|
||||
#define BIT_FUC_FOE BIT(2)
|
||||
#define BIT_FMC_FOE BIT(1)
|
||||
#define BIT_FBC_FOE BIT(0)
|
||||
#define BIT_UDP_IP4F_NAT_EN BIT(7) /*Enable IPv4 fragment + UDP packet NAT*/
|
||||
#define BIT_IPV6_3T_ROUTE_EN BIT(8)
|
||||
#define BIT_IPV6_5T_ROUTE_EN BIT(9)
|
||||
#define BIT_IPV6_6RD_EN BIT(10)
|
||||
#define BIT_IPV4_NAT_EN BIT(12)
|
||||
#define BIT_IPV4_NAPT_EN BIT(13)
|
||||
#define BIT_IPV4_DSL_EN BIT(14)
|
||||
#define BIT_MIB_BUSY BIT(16)
|
||||
#define BIT_IPV4_NAT_FRAG_EN BIT(17)
|
||||
#define BIT_IPV4_HASH_GREK BIT(19)
|
||||
#define BIT_IPV6_HASH_GREK BIT(20)
|
||||
#define BIT_IPV4_MAPE_EN BIT(21)
|
||||
#define BIT_IPV4_MAPT_EN BIT(22)
|
||||
|
||||
/*GDMA_FWD_CFG value*/
|
||||
#define BITS_GDM_UFRC_P_PPE (NR_PPE0_PORT << 12)
|
||||
#define BITS_GDM_BFRC_P_PPE (NR_PPE0_PORT << 8)
|
||||
#define BITS_GDM_MFRC_P_PPE (NR_PPE0_PORT << 4)
|
||||
#define BITS_GDM_OFRC_P_PPE (NR_PPE0_PORT << 0)
|
||||
#define BITS_GDM_ALL_FRC_P_PPE \
|
||||
(BITS_GDM_UFRC_P_PPE | BITS_GDM_BFRC_P_PPE | BITS_GDM_MFRC_P_PPE | \
|
||||
BITS_GDM_OFRC_P_PPE)
|
||||
|
||||
#define BITS_GDM_UFRC_P_CPU_PDMA (NR_PDMA_PORT << 12)
|
||||
#define BITS_GDM_BFRC_P_CPU_PDMA (NR_PDMA_PORT << 8)
|
||||
#define BITS_GDM_MFRC_P_CPU_PDMA (NR_PDMA_PORT << 4)
|
||||
#define BITS_GDM_OFRC_P_CPU_PDMA (NR_PDMA_PORT << 0)
|
||||
#define BITS_GDM_ALL_FRC_P_CPU_PDMA \
|
||||
(BITS_GDM_UFRC_P_CPU_PDMA | BITS_GDM_BFRC_P_CPU_PDMA | \
|
||||
BITS_GDM_MFRC_P_CPU_PDMA | BITS_GDM_OFRC_P_CPU_PDMA)
|
||||
|
||||
#define BITS_GDM_UFRC_P_CPU_QDMA (NR_QDMA_PORT << 12)
|
||||
#define BITS_GDM_BFRC_P_CPU_QDMA (NR_QDMA_PORT << 8)
|
||||
#define BITS_GDM_MFRC_P_CPU_QDMA (NR_QDMA_PORT << 4)
|
||||
#define BITS_GDM_OFRC_P_CPU_QDMA (NR_QDMA_PORT << 0)
|
||||
#define BITS_GDM_ALL_FRC_P_CPU_QDMA \
|
||||
(BITS_GDM_UFRC_P_CPU_QDMA | BITS_GDM_BFRC_P_CPU_QDMA | \
|
||||
BITS_GDM_MFRC_P_CPU_QDMA | BITS_GDM_OFRC_P_CPU_QDMA)
|
||||
|
||||
#define BITS_GDM_UFRC_P_DISCARD (NR_DISCARD << 12)
|
||||
#define BITS_GDM_BFRC_P_DISCARD (NR_DISCARD << 8)
|
||||
#define BITS_GDM_MFRC_P_DISCARD (NR_DISCARD << 4)
|
||||
#define BITS_GDM_OFRC_P_DISCARD (NR_DISCARD << 0)
|
||||
#define BITS_GDM_ALL_FRC_P_DISCARD \
|
||||
(BITS_GDM_UFRC_P_DISCARD | BITS_GDM_BFRC_P_DISCARD | \
|
||||
BITS_GDM_MFRC_P_DISCARD | BITS_GDM_OFRC_P_DISCARD)
|
||||
|
||||
#define hnat_is_enabled(hnat_priv) (hnat_priv->enable)
|
||||
#define hnat_enabled(hnat_priv) (hnat_priv->enable = 1)
|
||||
#define hnat_disabled(hnat_priv) (hnat_priv->enable = 0)
|
||||
#define hnat_is_enabled1(hnat_priv) (hnat_priv->enable1)
|
||||
#define hnat_enabled1(hnat_priv) (hnat_priv->enable1 = 1)
|
||||
#define hnat_disabled1(hnat_priv) (hnat_priv->enable1 = 0)
|
||||
|
||||
#define entry_hnat_is_bound(e) (e->bfib1.state == BIND)
|
||||
#define entry_hnat_state(e) (e->bfib1.state)
|
||||
|
||||
#define skb_hnat_is_hashed(skb) \
|
||||
(skb_hnat_entry(skb) != 0x3fff && skb_hnat_entry(skb) < hnat_priv->foe_etry_num)
|
||||
#define FROM_GE_LAN(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_LAN)
|
||||
#define FROM_GE_WAN(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_WAN)
|
||||
#define FROM_GE_PPD(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_PPD)
|
||||
#define FROM_GE_VIRTUAL(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_VIRTUAL)
|
||||
#define FROM_EXT(skb) (skb_hnat_iface(skb) == FOE_MAGIC_EXT)
|
||||
#define FROM_WED(skb) ((skb_hnat_iface(skb) == FOE_MAGIC_WED0) || \
|
||||
(skb_hnat_iface(skb) == FOE_MAGIC_WED1))
|
||||
#define FOE_MAGIC_GE_LAN 0x1
|
||||
#define FOE_MAGIC_GE_WAN 0x2
|
||||
#define FOE_MAGIC_EXT 0x3
|
||||
#define FOE_MAGIC_GE_VIRTUAL 0x4
|
||||
#define FOE_MAGIC_GE_PPD 0x5
|
||||
#define FOE_MAGIC_WED0 0x78
|
||||
#define FOE_MAGIC_WED1 0x79
|
||||
#define FOE_INVALID 0xf
|
||||
#define index6b(i) (0x3fU - i)
|
||||
|
||||
#define IPV4_HNAPT 0
|
||||
#define IPV4_HNAT 1
|
||||
#define IP_FORMAT(addr) \
|
||||
(((unsigned char *)&addr)[3], ((unsigned char *)&addr)[2], \
|
||||
((unsigned char *)&addr)[1], ((unsigned char *)&addr)[0])
|
||||
|
||||
/*PSE Ports*/
|
||||
#define NR_PDMA_PORT 0
|
||||
#define NR_GMAC1_PORT 1
|
||||
#define NR_GMAC2_PORT 2
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
#define NR_WHNAT_WDMA_PORT EINVAL
|
||||
#define NR_PPE0_PORT 3
|
||||
#define NR_PPE1_PORT 4
|
||||
#else
|
||||
#define NR_WHNAT_WDMA_PORT 3
|
||||
#define NR_PPE0_PORT 4
|
||||
#endif
|
||||
#define NR_QDMA_PORT 5
|
||||
#define NR_DISCARD 7
|
||||
#define NR_WDMA0_PORT 8
|
||||
#define NR_WDMA1_PORT 9
|
||||
#define LAN_DEV_NAME hnat_priv->lan
|
||||
#define IS_WAN(dev) \
|
||||
(!strncmp((dev)->name, hnat_priv->wan, strlen(hnat_priv->wan)))
|
||||
#define IS_LAN(dev) (!strncmp(dev->name, LAN_DEV_NAME, strlen(LAN_DEV_NAME)))
|
||||
#define IS_BR(dev) (!strncmp(dev->name, "br", 2))
|
||||
#define IS_WHNAT(dev) \
|
||||
((hnat_priv->data->whnat && \
|
||||
(get_wifi_hook_if_index_from_dev(dev) != 0)) ? 1 : 0)
|
||||
#define IS_EXT(dev) ((get_index_from_dev(dev) != 0) ? 1 : 0)
|
||||
#define IS_PPD(dev) (!strcmp(dev->name, hnat_priv->ppd))
|
||||
#define IS_IPV4_HNAPT(x) (((x)->bfib1.pkt_type == IPV4_HNAPT) ? 1 : 0)
|
||||
#define IS_IPV4_HNAT(x) (((x)->bfib1.pkt_type == IPV4_HNAT) ? 1 : 0)
|
||||
#define IS_IPV4_GRP(x) (IS_IPV4_HNAPT(x) | IS_IPV4_HNAT(x))
|
||||
#define IS_IPV4_DSLITE(x) (((x)->bfib1.pkt_type == IPV4_DSLITE) ? 1 : 0)
|
||||
#define IS_IPV4_MAPE(x) (((x)->bfib1.pkt_type == IPV4_MAP_E) ? 1 : 0)
|
||||
#define IS_IPV4_MAPT(x) (((x)->bfib1.pkt_type == IPV4_MAP_T) ? 1 : 0)
|
||||
#define IS_IPV6_3T_ROUTE(x) (((x)->bfib1.pkt_type == IPV6_3T_ROUTE) ? 1 : 0)
|
||||
#define IS_IPV6_5T_ROUTE(x) (((x)->bfib1.pkt_type == IPV6_5T_ROUTE) ? 1 : 0)
|
||||
#define IS_IPV6_6RD(x) (((x)->bfib1.pkt_type == IPV6_6RD) ? 1 : 0)
|
||||
#define IS_IPV6_GRP(x) \
|
||||
(IS_IPV6_3T_ROUTE(x) | IS_IPV6_5T_ROUTE(x) | IS_IPV6_6RD(x) | \
|
||||
IS_IPV4_DSLITE(x) | IS_IPV4_MAPE(x) | IS_IPV4_MAPT(x))
|
||||
#define IS_BOND_MODE (!strncmp(LAN_DEV_NAME, "bond", 4))
|
||||
#define IS_GMAC1_MODE ((hnat_priv->gmac_num == 1) ? 1 : 0)
|
||||
#define IS_HQOS_MODE (qos_toggle == 1)
|
||||
#define IS_PPPQ_MODE (qos_toggle == 2) /* Per Port Per Queue */
|
||||
#define MAX_PPPQ_PORT_NUM 6
|
||||
|
||||
#define es(entry) (entry_state[entry->bfib1.state])
|
||||
#define ei(entry, end) (hnat_priv->foe_etry_num - (int)(end - entry))
|
||||
#define pt(entry) (packet_type[entry->ipv4_hnapt.bfib1.pkt_type])
|
||||
#define ipv4_smac(mac, e) \
|
||||
({ \
|
||||
mac[0] = e->ipv4_hnapt.smac_hi[3]; \
|
||||
mac[1] = e->ipv4_hnapt.smac_hi[2]; \
|
||||
mac[2] = e->ipv4_hnapt.smac_hi[1]; \
|
||||
mac[3] = e->ipv4_hnapt.smac_hi[0]; \
|
||||
mac[4] = e->ipv4_hnapt.smac_lo[1]; \
|
||||
mac[5] = e->ipv4_hnapt.smac_lo[0]; \
|
||||
})
|
||||
#define ipv4_dmac(mac, e) \
|
||||
({ \
|
||||
mac[0] = e->ipv4_hnapt.dmac_hi[3]; \
|
||||
mac[1] = e->ipv4_hnapt.dmac_hi[2]; \
|
||||
mac[2] = e->ipv4_hnapt.dmac_hi[1]; \
|
||||
mac[3] = e->ipv4_hnapt.dmac_hi[0]; \
|
||||
mac[4] = e->ipv4_hnapt.dmac_lo[1]; \
|
||||
mac[5] = e->ipv4_hnapt.dmac_lo[0]; \
|
||||
})
|
||||
|
||||
#define IS_DSA_LAN(dev) (!strncmp(dev->name, "lan", 3))
|
||||
#define IS_DSA_WAN(dev) (!strncmp(dev->name, "wan", 3))
|
||||
#define NONE_DSA_PORT 0xff
|
||||
#define MAX_CRSN_NUM 32
|
||||
#define IPV6_HDR_LEN 40
|
||||
|
||||
/*QDMA_PAGE value*/
|
||||
#define NUM_OF_Q_PER_PAGE 16
|
||||
|
||||
/*IPv6 Header*/
|
||||
#ifndef NEXTHDR_IPIP
|
||||
#define NEXTHDR_IPIP 4
|
||||
#endif
|
||||
|
||||
extern const struct of_device_id of_hnat_match[];
|
||||
extern struct mtk_hnat *hnat_priv;
|
||||
|
||||
#if defined(CONFIG_NET_DSA_MT7530)
|
||||
u32 hnat_dsa_fill_stag(const struct net_device *netdev,
|
||||
struct foe_entry *entry,
|
||||
struct flow_offload_hw_path *hw_path,
|
||||
u16 eth_proto, int mape);
|
||||
|
||||
static inline bool hnat_dsa_is_enable(struct mtk_hnat *priv)
|
||||
{
|
||||
return (priv->wan_dsa_port != NONE_DSA_PORT);
|
||||
}
|
||||
#else
|
||||
static inline u32 hnat_dsa_fill_stag(const struct net_device *netdev,
|
||||
struct foe_entry *entry,
|
||||
struct flow_offload_hw_path *hw_path,
|
||||
u16 eth_proto, int mape)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool hnat_dsa_is_enable(struct mtk_hnat *priv)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
void hnat_deinit_debugfs(struct mtk_hnat *h);
|
||||
int hnat_init_debugfs(struct mtk_hnat *h);
|
||||
int hnat_register_nf_hooks(void);
|
||||
void hnat_unregister_nf_hooks(void);
|
||||
int whnat_adjust_nf_hooks(void);
|
||||
int mtk_hqos_ptype_cb(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *unused);
|
||||
extern int dbg_cpu_reason;
|
||||
extern int debug_level;
|
||||
extern int hook_toggle;
|
||||
extern int mape_toggle;
|
||||
extern int qos_toggle;
|
||||
|
||||
int ext_if_add(struct extdev_entry *ext_entry);
|
||||
int ext_if_del(struct extdev_entry *ext_entry);
|
||||
void cr_set_field(void __iomem *reg, u32 field, u32 val);
|
||||
int mtk_sw_nat_hook_tx(struct sk_buff *skb, int gmac_no);
|
||||
int mtk_sw_nat_hook_rx(struct sk_buff *skb);
|
||||
void mtk_ppe_dev_register_hook(struct net_device *dev);
|
||||
void mtk_ppe_dev_unregister_hook(struct net_device *dev);
|
||||
int nf_hnat_netdevice_event(struct notifier_block *unused, unsigned long event,
|
||||
void *ptr);
|
||||
int nf_hnat_netevent_handler(struct notifier_block *unused, unsigned long event,
|
||||
void *ptr);
|
||||
uint32_t foe_dump_pkt(struct sk_buff *skb);
|
||||
uint32_t hnat_cpu_reason_cnt(struct sk_buff *skb);
|
||||
int hnat_enable_hook(void);
|
||||
int hnat_disable_hook(void);
|
||||
void hnat_cache_ebl(int enable);
|
||||
void hnat_qos_shaper_ebl(u32 id, u32 enable);
|
||||
void set_gmac_ppe_fwd(int gmac_no, int enable);
|
||||
int entry_detail(u32 ppe_id, int index);
|
||||
int entry_delete_by_mac(u8 *mac);
|
||||
int entry_delete(u32 ppe_id, int index);
|
||||
struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, u32 ppe_id,
|
||||
u32 index, struct hnat_accounting *diff);
|
||||
|
||||
static inline u16 foe_timestamp(struct mtk_hnat *h)
|
||||
{
|
||||
return (readl(hnat_priv->fe_base + 0x0010)) & 0xffff;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,355 @@
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014-2016 Zhiqiang Yang <zhiqiang.yang@mediatek.com>
|
||||
*/
|
||||
#include <net/sock.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/if_bridge.h>
|
||||
#include "hnat.h"
|
||||
|
||||
/* *
|
||||
* mcast_entry_get - Returns the index of an unused entry
|
||||
* or an already existed entry in mtbl
|
||||
*/
|
||||
static int mcast_entry_get(u16 vlan_id, u32 dst_mac)
|
||||
{
|
||||
int index = -1;
|
||||
u8 i;
|
||||
struct ppe_mcast_group *p = hnat_priv->pmcast->mtbl;
|
||||
u8 max = hnat_priv->pmcast->max_entry;
|
||||
|
||||
for (i = 0; i < max; i++) {
|
||||
if ((index == -1) && (!p->valid)) {
|
||||
index = i; /*get the first unused entry index*/
|
||||
continue;
|
||||
}
|
||||
if ((p->vid == vlan_id) && (p->mac_hi == dst_mac)) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
if (index == -1)
|
||||
pr_info("%s:group table is full\n", __func__);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
static void get_mac_from_mdb_entry(struct br_mdb_entry *entry,
|
||||
u32 *mac_hi, u16 *mac_lo)
|
||||
{
|
||||
switch (ntohs(entry->addr.proto)) {
|
||||
case ETH_P_IP:
|
||||
*mac_lo = 0x0100;
|
||||
*mac_hi = swab32((entry->addr.u.ip4 & 0xfffffe00) + 0x5e);
|
||||
break;
|
||||
case ETH_P_IPV6:
|
||||
*mac_lo = 0x3333;
|
||||
*mac_hi = swab32(entry->addr.u.ip6.s6_addr32[3]);
|
||||
break;
|
||||
}
|
||||
trace_printk("%s:group mac_h=0x%08x, mac_l=0x%04x\n",
|
||||
__func__, *mac_hi, *mac_lo);
|
||||
}
|
||||
|
||||
/*set_hnat_mtbl - set ppe multicast register*/
|
||||
static int set_hnat_mtbl(struct ppe_mcast_group *group, u32 ppe_id, int index)
|
||||
{
|
||||
struct ppe_mcast_h mcast_h;
|
||||
struct ppe_mcast_l mcast_l;
|
||||
u16 mac_lo = group->mac_lo;
|
||||
u32 mac_hi = group->mac_hi;
|
||||
u8 mc_port = group->mc_port;
|
||||
void __iomem *reg;
|
||||
|
||||
if (ppe_id >= CFG_PPE_NUM)
|
||||
return -EINVAL;
|
||||
|
||||
mcast_h.u.value = 0;
|
||||
mcast_l.addr = 0;
|
||||
if (mac_lo == 0x0100)
|
||||
mcast_h.u.info.mc_mpre_sel = 0;
|
||||
else if (mac_lo == 0x3333)
|
||||
mcast_h.u.info.mc_mpre_sel = 1;
|
||||
|
||||
mcast_h.u.info.mc_px_en = mc_port;
|
||||
mcast_l.addr = mac_hi;
|
||||
mcast_h.u.info.valid = group->valid;
|
||||
trace_printk("%s:index=%d,group info=0x%x,addr=0x%x\n",
|
||||
__func__, index, mcast_h.u.value, mcast_l.addr);
|
||||
if (index < 0x10) {
|
||||
reg = hnat_priv->ppe_base[ppe_id] + PPE_MCAST_H_0 + ((index) * 8);
|
||||
writel(mcast_h.u.value, reg);
|
||||
reg = hnat_priv->ppe_base[ppe_id] + PPE_MCAST_L_0 + ((index) * 8);
|
||||
writel(mcast_l.addr, reg);
|
||||
} else {
|
||||
index = index - 0x10;
|
||||
reg = hnat_priv->fe_base + PPE_MCAST_H_10 + ((index) * 8);
|
||||
writel(mcast_h.u.value, reg);
|
||||
reg = hnat_priv->fe_base + PPE_MCAST_L_10 + ((index) * 8);
|
||||
writel(mcast_h.u.value, reg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* hnat_mcast_table_update -
|
||||
* 1.get a valid group entry
|
||||
* 2.update group info
|
||||
* a.update eif&oif count
|
||||
* b.eif ==0 & oif == 0,delete it from group table
|
||||
* c.oif != 0,set mc forward port to cpu,else do not forward to cpu
|
||||
* 3.set the group info to ppe register
|
||||
*/
|
||||
static int hnat_mcast_table_update(int type, struct br_mdb_entry *entry)
|
||||
{
|
||||
struct net_device *dev;
|
||||
u32 mac_hi = 0;
|
||||
u16 mac_lo = 0;
|
||||
int i, index;
|
||||
struct ppe_mcast_group *group;
|
||||
|
||||
rcu_read_lock();
|
||||
dev = dev_get_by_index_rcu(&init_net, entry->ifindex);
|
||||
if (!dev) {
|
||||
rcu_read_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
get_mac_from_mdb_entry(entry, &mac_hi, &mac_lo);
|
||||
index = mcast_entry_get(entry->vid, mac_hi);
|
||||
if (index == -1)
|
||||
return -1;
|
||||
|
||||
group = &hnat_priv->pmcast->mtbl[index];
|
||||
group->mac_hi = mac_hi;
|
||||
group->mac_lo = mac_lo;
|
||||
switch (type) {
|
||||
case RTM_NEWMDB:
|
||||
if (IS_LAN(dev) || IS_WAN(dev))
|
||||
group->eif++;
|
||||
else
|
||||
group->oif++;
|
||||
group->vid = entry->vid;
|
||||
group->valid = true;
|
||||
break;
|
||||
case RTM_DELMDB:
|
||||
if (group->valid) {
|
||||
if (IS_LAN(dev) || IS_WAN(dev))
|
||||
group->eif--;
|
||||
else
|
||||
group->oif--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
trace_printk("%s:devname=%s,eif=%d,oif=%d\n", __func__,
|
||||
dev->name, group->eif, group->oif);
|
||||
if (group->valid) {
|
||||
if (group->oif && group->eif)
|
||||
/*eth&wifi both in group,forward to cpu&GDMA1*/
|
||||
group->mc_port = (MCAST_TO_PDMA || MCAST_TO_GDMA1);
|
||||
else if (group->oif)
|
||||
/*only wifi in group,forward to cpu only*/
|
||||
group->mc_port = MCAST_TO_PDMA;
|
||||
else
|
||||
/*only eth in group,forward to GDMA1 only*/
|
||||
group->mc_port = MCAST_TO_GDMA1;
|
||||
if (!group->oif && !group->eif)
|
||||
/*nobody in this group,clear the entry*/
|
||||
memset(group, 0, sizeof(struct ppe_mcast_group));
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++)
|
||||
set_hnat_mtbl(group, i, index);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hnat_mcast_nlmsg_handler(struct work_struct *work)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct nlmsghdr *nlh;
|
||||
struct nlattr *nest, *nest2, *info;
|
||||
struct br_port_msg *bpm;
|
||||
struct br_mdb_entry *entry;
|
||||
struct ppe_mcast_table *pmcast;
|
||||
struct sock *sk;
|
||||
|
||||
pmcast = container_of(work, struct ppe_mcast_table, work);
|
||||
sk = pmcast->msock->sk;
|
||||
|
||||
while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
|
||||
nlh = nlmsg_hdr(skb);
|
||||
if (!nlmsg_ok(nlh, skb->len)) {
|
||||
kfree_skb(skb);
|
||||
continue;
|
||||
}
|
||||
bpm = nlmsg_data(nlh);
|
||||
nest = nlmsg_find_attr(nlh, sizeof(bpm), MDBA_MDB);
|
||||
if (!nest) {
|
||||
kfree_skb(skb);
|
||||
continue;
|
||||
}
|
||||
nest2 = nla_find_nested(nest, MDBA_MDB_ENTRY);
|
||||
if (nest2) {
|
||||
info = nla_find_nested(nest2, MDBA_MDB_ENTRY_INFO);
|
||||
if (!info) {
|
||||
kfree_skb(skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
entry = (struct br_mdb_entry *)nla_data(info);
|
||||
trace_printk("%s:cmd=0x%2x,ifindex=0x%x,state=0x%x",
|
||||
__func__, nlh->nlmsg_type,
|
||||
entry->ifindex, entry->state);
|
||||
trace_printk("vid=0x%x,ip=0x%x,proto=0x%x\n",
|
||||
entry->vid, entry->addr.u.ip4,
|
||||
entry->addr.proto);
|
||||
hnat_mcast_table_update(nlh->nlmsg_type, entry);
|
||||
}
|
||||
kfree_skb(skb);
|
||||
}
|
||||
}
|
||||
|
||||
static void hnat_mcast_nlmsg_rcv(struct sock *sk)
|
||||
{
|
||||
struct ppe_mcast_table *pmcast = hnat_priv->pmcast;
|
||||
struct workqueue_struct *queue = pmcast->queue;
|
||||
struct work_struct *work = &pmcast->work;
|
||||
|
||||
queue_work(queue, work);
|
||||
}
|
||||
|
||||
static struct socket *hnat_mcast_netlink_open(struct net *net)
|
||||
{
|
||||
struct socket *sock = NULL;
|
||||
int ret;
|
||||
struct sockaddr_nl addr;
|
||||
|
||||
ret = sock_create_kern(net, PF_NETLINK, SOCK_RAW, NETLINK_ROUTE, &sock);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
sock->sk->sk_data_ready = hnat_mcast_nlmsg_rcv;
|
||||
addr.nl_family = PF_NETLINK;
|
||||
addr.nl_pid = 65536; /*fix me:how to get an unique id?*/
|
||||
addr.nl_groups = RTMGRP_MDB;
|
||||
ret = sock->ops->bind(sock, (struct sockaddr *)&addr, sizeof(addr));
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
return sock;
|
||||
out:
|
||||
if (sock)
|
||||
sock_release(sock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void hnat_mcast_check_timestamp(struct timer_list *t)
|
||||
{
|
||||
struct foe_entry *entry;
|
||||
int i, hash_index;
|
||||
u16 e_ts, foe_ts;
|
||||
|
||||
for (i = 0; i < CFG_PPE_NUM; i++) {
|
||||
for (hash_index = 0; hash_index < hnat_priv->foe_etry_num; hash_index++) {
|
||||
entry = hnat_priv->foe_table_cpu[i] + hash_index;
|
||||
if (entry->bfib1.sta == 1) {
|
||||
e_ts = (entry->ipv4_hnapt.m_timestamp) & 0xffff;
|
||||
foe_ts = foe_timestamp(hnat_priv);
|
||||
if ((foe_ts - e_ts) > 0x3000)
|
||||
foe_ts = (~(foe_ts)) & 0xffff;
|
||||
if (abs(foe_ts - e_ts) > 20)
|
||||
entry_delete(i, hash_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
mod_timer(&hnat_priv->hnat_mcast_check_timer, jiffies + 10 * HZ);
|
||||
}
|
||||
|
||||
int hnat_mcast_enable(u32 ppe_id)
|
||||
{
|
||||
struct ppe_mcast_table *pmcast;
|
||||
|
||||
if (ppe_id >= CFG_PPE_NUM)
|
||||
return -EINVAL;
|
||||
|
||||
pmcast = kzalloc(sizeof(*pmcast), GFP_KERNEL);
|
||||
if (!pmcast)
|
||||
return -1;
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V1)
|
||||
pmcast->max_entry = 0x10;
|
||||
else
|
||||
pmcast->max_entry = MAX_MCAST_ENTRY;
|
||||
|
||||
INIT_WORK(&pmcast->work, hnat_mcast_nlmsg_handler);
|
||||
pmcast->queue = create_singlethread_workqueue("ppe_mcast");
|
||||
if (!pmcast->queue)
|
||||
goto err;
|
||||
|
||||
pmcast->msock = hnat_mcast_netlink_open(&init_net);
|
||||
if (!pmcast->msock)
|
||||
goto err;
|
||||
|
||||
hnat_priv->pmcast = pmcast;
|
||||
|
||||
/* mt7629 should checkout mcast entry life time manualy */
|
||||
if (hnat_priv->data->version == MTK_HNAT_V3) {
|
||||
timer_setup(&hnat_priv->hnat_mcast_check_timer,
|
||||
hnat_mcast_check_timestamp, 0);
|
||||
hnat_priv->hnat_mcast_check_timer.expires = jiffies;
|
||||
add_timer(&hnat_priv->hnat_mcast_check_timer);
|
||||
}
|
||||
|
||||
/* Enable multicast table lookup */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, MCAST_TB_EN, 1);
|
||||
/* multicast port0 map to PDMA */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MCAST_PPSE, MC_P0_PPSE, 0);
|
||||
/* multicast port1 map to GMAC1 */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MCAST_PPSE, MC_P1_PPSE, 1);
|
||||
/* multicast port2 map to GMAC2 */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MCAST_PPSE, MC_P2_PPSE, 2);
|
||||
/* multicast port3 map to QDMA */
|
||||
cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_MCAST_PPSE, MC_P3_PPSE, 5);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
if (pmcast->queue)
|
||||
destroy_workqueue(pmcast->queue);
|
||||
if (pmcast->msock)
|
||||
sock_release(pmcast->msock);
|
||||
kfree(pmcast);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int hnat_mcast_disable(void)
|
||||
{
|
||||
struct ppe_mcast_table *pmcast = hnat_priv->pmcast;
|
||||
|
||||
if (!pmcast)
|
||||
return -EINVAL;
|
||||
|
||||
if (hnat_priv->data->version == MTK_HNAT_V3)
|
||||
del_timer_sync(&hnat_priv->hnat_mcast_check_timer);
|
||||
|
||||
flush_work(&pmcast->work);
|
||||
destroy_workqueue(pmcast->queue);
|
||||
sock_release(pmcast->msock);
|
||||
kfree(pmcast);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014-2016 Zhiqiang Yang <zhiqiang.yang@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef NF_HNAT_MCAST_H
|
||||
#define NF_HNAT_MCAST_H
|
||||
|
||||
#define RTMGRP_IPV4_MROUTE 0x20
|
||||
#define RTMGRP_MDB 0x2000000
|
||||
|
||||
#define MAX_MCAST_ENTRY 64
|
||||
|
||||
#define MCAST_TO_PDMA (0x1 << 0)
|
||||
#define MCAST_TO_GDMA1 (0x1 << 1)
|
||||
#define MCAST_TO_GDMA2 (0x1 << 2)
|
||||
|
||||
struct ppe_mcast_group {
|
||||
u32 mac_hi; /*multicast mac addr*/
|
||||
u16 mac_lo; /*multicast mac addr*/
|
||||
u16 vid;
|
||||
u8 mc_port; /*1:forward to cpu,2:forward to GDMA1,4:forward to GDMA2*/
|
||||
u8 eif; /*num of eth if added to multi group. */
|
||||
u8 oif; /* num of other if added to multi group ,ex wifi.*/
|
||||
bool valid;
|
||||
};
|
||||
|
||||
struct ppe_mcast_table {
|
||||
struct workqueue_struct *queue;
|
||||
struct work_struct work;
|
||||
struct socket *msock;
|
||||
struct ppe_mcast_group mtbl[MAX_MCAST_ENTRY];
|
||||
u8 max_entry;
|
||||
};
|
||||
|
||||
struct ppe_mcast_h {
|
||||
union {
|
||||
u32 value;
|
||||
struct {
|
||||
u32 mc_vid:12;
|
||||
u32 mc_qos_qid54:2; /* mt7622 only */
|
||||
u32 valid:1;
|
||||
u32 rev1:1;
|
||||
/*0:forward to cpu,1:forward to GDMA1*/
|
||||
u32 mc_px_en:4;
|
||||
u32 mc_mpre_sel:2; /* 0=01:00, 2=33:33 */
|
||||
u32 mc_vid_cmp:1;
|
||||
u32 rev2:1;
|
||||
u32 mc_px_qos_en:4;
|
||||
u32 mc_qos_qid:4;
|
||||
} info;
|
||||
} u;
|
||||
};
|
||||
|
||||
struct ppe_mcast_l {
|
||||
u32 addr;
|
||||
};
|
||||
|
||||
int hnat_mcast_enable(u32 ppe_id);
|
||||
int hnat_mcast_disable(void);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright (c) 2020 MediaTek Inc.
|
||||
* Author: Landen Chao <landen.chao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/of_device.h>
|
||||
#include <net/netfilter/nf_flow_table.h>
|
||||
#include "hnat.h"
|
||||
|
||||
u32 hnat_dsa_fill_stag(const struct net_device *netdev,
|
||||
struct foe_entry *entry,
|
||||
struct flow_offload_hw_path *hw_path,
|
||||
u16 eth_proto,
|
||||
int mape)
|
||||
{
|
||||
const struct net_device *ndev;
|
||||
const unsigned int *port_reg;
|
||||
int port_index;
|
||||
u16 sp_tag;
|
||||
|
||||
if (hw_path->flags & FLOW_OFFLOAD_PATH_VLAN)
|
||||
ndev = hw_path->dev;
|
||||
else
|
||||
ndev = netdev;
|
||||
|
||||
port_reg = of_get_property(ndev->dev.of_node, "reg", NULL);
|
||||
if (unlikely(!port_reg))
|
||||
return -EINVAL;
|
||||
|
||||
port_index = be32_to_cpup(port_reg);
|
||||
sp_tag = BIT(port_index);
|
||||
|
||||
if (!entry->bfib1.vlan_layer)
|
||||
entry->bfib1.vlan_layer = 1;
|
||||
else
|
||||
/* VLAN existence indicator */
|
||||
sp_tag |= BIT(8);
|
||||
entry->bfib1.vpm = 0;
|
||||
|
||||
switch (eth_proto) {
|
||||
case ETH_P_IP:
|
||||
if (entry->ipv4_hnapt.bfib1.pkt_type == IPV4_DSLITE)
|
||||
entry->ipv4_dslite.etype = sp_tag;
|
||||
else
|
||||
entry->ipv4_hnapt.etype = sp_tag;
|
||||
break;
|
||||
case ETH_P_IPV6:
|
||||
/* In the case MAPE LAN --> WAN, binding entry is to CPU.
|
||||
* Do not add special tag.
|
||||
*/
|
||||
if (!mape)
|
||||
/* etype offset of ipv6 entries are the same. */
|
||||
entry->ipv6_5t_route.etype = sp_tag;
|
||||
|
||||
break;
|
||||
default:
|
||||
pr_info("DSA + HNAT unsupport protocol\n");
|
||||
}
|
||||
|
||||
return port_index;
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
|
||||
* Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#ifndef NF_HNAT_MTK_H
|
||||
#define NF_HNAT_MTK_H
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include "../mtk_eth_soc.h"
|
||||
|
||||
#define HNAT_SKB_CB2(__skb) ((struct hnat_skb_cb2 *)&((__skb)->cb[44]))
|
||||
struct hnat_skb_cb2 {
|
||||
__u32 magic;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
|
||||
struct hnat_desc {
|
||||
u32 entry : 15;
|
||||
u32 filled : 3;
|
||||
u32 crsn : 5;
|
||||
u32 resv1 : 3;
|
||||
u32 sport : 4;
|
||||
u32 resv2 : 1;
|
||||
u32 alg : 1;
|
||||
u32 iface : 8;
|
||||
u32 wdmaid : 2;
|
||||
u32 rxid : 2;
|
||||
u32 wcid : 10;
|
||||
u32 bssid : 6;
|
||||
u32 resv5 : 20;
|
||||
u32 magic_tag_protect : 16;
|
||||
} __packed;
|
||||
#else
|
||||
struct hnat_desc {
|
||||
u32 entry : 14;
|
||||
u32 crsn : 5;
|
||||
u32 sport : 4;
|
||||
u32 alg : 1;
|
||||
u32 iface : 4;
|
||||
u32 filled : 3;
|
||||
u32 resv : 1;
|
||||
u32 magic_tag_protect : 16;
|
||||
u32 wdmaid : 8;
|
||||
u32 rxid : 2;
|
||||
u32 wcid : 8;
|
||||
u32 bssid : 6;
|
||||
} __packed;
|
||||
#endif
|
||||
|
||||
#define HQOS_MAGIC_TAG 0x5678
|
||||
#define HAS_HQOS_MAGIC_TAG(skb) (qos_toggle && skb->protocol == HQOS_MAGIC_TAG)
|
||||
|
||||
#define HNAT_MAGIC_TAG 0x6789
|
||||
#define HNAT_INFO_FILLED 0x7
|
||||
#define WIFI_INFO_LEN 3
|
||||
#define FOE_INFO_LEN (10 + WIFI_INFO_LEN)
|
||||
#define IS_SPACE_AVAILABLE_HEAD(skb) \
|
||||
((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
|
||||
|
||||
#define skb_hnat_info(skb) ((struct hnat_desc *)(skb->head))
|
||||
#define skb_hnat_magic(skb) (((struct hnat_desc *)(skb->head))->magic)
|
||||
#define skb_hnat_reason(skb) (((struct hnat_desc *)(skb->head))->crsn)
|
||||
#define skb_hnat_entry(skb) (((struct hnat_desc *)(skb->head))->entry)
|
||||
#define skb_hnat_sport(skb) (((struct hnat_desc *)(skb->head))->sport)
|
||||
#define skb_hnat_alg(skb) (((struct hnat_desc *)(skb->head))->alg)
|
||||
#define skb_hnat_iface(skb) (((struct hnat_desc *)(skb->head))->iface)
|
||||
#define skb_hnat_filled(skb) (((struct hnat_desc *)(skb->head))->filled)
|
||||
#define skb_hnat_magic_tag(skb) (((struct hnat_desc *)((skb)->head))->magic_tag_protect)
|
||||
#define skb_hnat_wdma_id(skb) (((struct hnat_desc *)((skb)->head))->wdmaid)
|
||||
#define skb_hnat_rx_id(skb) (((struct hnat_desc *)((skb)->head))->rxid)
|
||||
#define skb_hnat_wc_id(skb) (((struct hnat_desc *)((skb)->head))->wcid)
|
||||
#define skb_hnat_bss_id(skb) (((struct hnat_desc *)((skb)->head))->bssid)
|
||||
#define skb_hnat_ppe(skb) \
|
||||
((skb_hnat_iface(skb) == FOE_MAGIC_WED1 && CFG_PPE_NUM > 1) ? 1 : 0)
|
||||
#define do_ext2ge_fast_try(dev, skb) \
|
||||
((skb_hnat_iface(skb) == FOE_MAGIC_EXT) && !is_from_extge(skb))
|
||||
#define set_from_extge(skb) (HNAT_SKB_CB2(skb)->magic = 0x78786688)
|
||||
#define clr_from_extge(skb) (HNAT_SKB_CB2(skb)->magic = 0x0)
|
||||
#define set_to_ppe(skb) (HNAT_SKB_CB2(skb)->magic = 0x78681415)
|
||||
#define is_from_extge(skb) (HNAT_SKB_CB2(skb)->magic == 0x78786688)
|
||||
#define is_hnat_info_filled(skb) (skb_hnat_filled(skb) == HNAT_INFO_FILLED)
|
||||
#define is_magic_tag_valid(skb) (skb_hnat_magic_tag(skb) == HNAT_MAGIC_TAG)
|
||||
#define set_from_mape(skb) (HNAT_SKB_CB2(skb)->magic = 0x78787788)
|
||||
#define is_from_mape(skb) (HNAT_SKB_CB2(skb)->magic == 0x78787788)
|
||||
#define is_unreserved_port(hdr) \
|
||||
((ntohs(hdr->source) > 1023) && (ntohs(hdr->dest) > 1023))
|
||||
|
||||
#define TTL_0 0x02
|
||||
#define HAS_OPTION_HEADER 0x03
|
||||
#define NO_FLOW_IS_ASSIGNED 0x07
|
||||
#define IPV4_WITH_FRAGMENT 0x08
|
||||
#define IPV4_HNAPT_DSLITE_WITH_FRAGMENT 0x09
|
||||
#define IPV4_HNAPT_DSLITE_WITHOUT_TCP_UDP 0x0A
|
||||
#define IPV6_5T_6RD_WITHOUT_TCP_UDP 0x0B
|
||||
#define TCP_FIN_SYN_RST \
|
||||
0x0C /* Ingress packet is TCP fin/syn/rst (for IPv4 NAPT/DS-Lite or IPv6 5T-route/6RD) */
|
||||
#define UN_HIT 0x0D /* FOE Un-hit */
|
||||
#define HIT_UNBIND 0x0E /* FOE Hit unbind */
|
||||
#define HIT_UNBIND_RATE_REACH 0x0F
|
||||
#define HIT_BIND_TCP_FIN 0x10
|
||||
#define HIT_BIND_TTL_1 0x11
|
||||
#define HIT_BIND_WITH_VLAN_VIOLATION 0x12
|
||||
#define HIT_BIND_KEEPALIVE_UC_OLD_HDR 0x13
|
||||
#define HIT_BIND_KEEPALIVE_MC_NEW_HDR 0x14
|
||||
#define HIT_BIND_KEEPALIVE_DUP_OLD_HDR 0x15
|
||||
#define HIT_BIND_FORCE_TO_CPU 0x16
|
||||
#define HIT_BIND_WITH_OPTION_HEADER 0x17
|
||||
#define HIT_BIND_MULTICAST_TO_CPU 0x18
|
||||
#define HIT_BIND_MULTICAST_TO_GMAC_CPU 0x19
|
||||
#define HIT_PRE_BIND 0x1A
|
||||
#define HIT_BIND_PACKET_SAMPLING 0x1B
|
||||
#define HIT_BIND_EXCEED_MTU 0x1C
|
||||
|
||||
u32 hnat_tx(struct sk_buff *skb);
|
||||
u32 hnat_set_skb_info(struct sk_buff *skb, u32 *rxd);
|
||||
u32 hnat_reg(struct net_device *, void __iomem *);
|
||||
u32 hnat_unreg(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,137 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (c) 2018-2019 MediaTek Inc.
|
||||
|
||||
/* A library for MediaTek SGMII circuit
|
||||
*
|
||||
* Author: Sean Wang <sean.wang@mediatek.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "mtk_eth_soc.h"
|
||||
|
||||
int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3)
|
||||
{
|
||||
struct device_node *np;
|
||||
int i;
|
||||
|
||||
ss->ana_rgc3 = ana_rgc3;
|
||||
|
||||
for (i = 0; i < MTK_MAX_DEVS; i++) {
|
||||
np = of_parse_phandle(r, "mediatek,sgmiisys", i);
|
||||
if (!np)
|
||||
break;
|
||||
|
||||
ss->regmap[i] = syscon_node_to_regmap(np);
|
||||
if (IS_ERR(ss->regmap[i]))
|
||||
return PTR_ERR(ss->regmap[i]);
|
||||
|
||||
ss->flags[i] &= ~(MTK_SGMII_PN_SWAP);
|
||||
if (of_property_read_bool(np, "pn_swap"))
|
||||
ss->flags[i] |= MTK_SGMII_PN_SWAP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_sgmii_setup_mode_an(struct mtk_sgmii *ss, unsigned int id)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
if (!ss->regmap[id])
|
||||
return -EINVAL;
|
||||
|
||||
/* Setup the link timer and QPHY power up inside SGMIISYS */
|
||||
regmap_write(ss->regmap[id], SGMSYS_PCS_LINK_TIMER,
|
||||
SGMII_LINK_TIMER_DEFAULT);
|
||||
|
||||
regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val);
|
||||
val |= SGMII_REMOTE_FAULT_DIS;
|
||||
regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val);
|
||||
|
||||
regmap_read(ss->regmap[id], SGMSYS_PCS_CONTROL_1, &val);
|
||||
val |= SGMII_AN_RESTART;
|
||||
regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val);
|
||||
|
||||
if(MTK_HAS_FLAGS(ss->flags[id],MTK_SGMII_PN_SWAP))
|
||||
regmap_update_bits(ss->regmap[id], SGMSYS_QPHY_WRAP_CTRL,
|
||||
SGMII_PN_SWAP_MASK, SGMII_PN_SWAP_TX_RX);
|
||||
|
||||
regmap_read(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
|
||||
val &= ~SGMII_PHYA_PWD;
|
||||
regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mtk_sgmii_setup_mode_force(struct mtk_sgmii *ss, unsigned int id,
|
||||
const struct phylink_link_state *state)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
if (!ss->regmap[id])
|
||||
return -EINVAL;
|
||||
|
||||
regmap_read(ss->regmap[id], ss->ana_rgc3, &val);
|
||||
val &= ~RG_PHY_SPEED_MASK;
|
||||
if (state->interface == PHY_INTERFACE_MODE_2500BASEX)
|
||||
val |= RG_PHY_SPEED_3_125G;
|
||||
regmap_write(ss->regmap[id], ss->ana_rgc3, val);
|
||||
|
||||
/* Disable SGMII AN */
|
||||
regmap_read(ss->regmap[id], SGMSYS_PCS_CONTROL_1, &val);
|
||||
val &= ~SGMII_AN_ENABLE;
|
||||
regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val);
|
||||
|
||||
/* SGMII force mode setting */
|
||||
regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val);
|
||||
val &= ~SGMII_IF_MODE_MASK;
|
||||
|
||||
switch (state->speed) {
|
||||
case SPEED_10:
|
||||
val |= SGMII_SPEED_10;
|
||||
break;
|
||||
case SPEED_100:
|
||||
val |= SGMII_SPEED_100;
|
||||
break;
|
||||
case SPEED_2500:
|
||||
case SPEED_1000:
|
||||
val |= SGMII_SPEED_1000;
|
||||
break;
|
||||
};
|
||||
|
||||
if (state->duplex == DUPLEX_FULL)
|
||||
val |= SGMII_DUPLEX_FULL;
|
||||
|
||||
regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val);
|
||||
|
||||
if(MTK_HAS_FLAGS(ss->flags[id],MTK_SGMII_PN_SWAP))
|
||||
regmap_update_bits(ss->regmap[id], SGMSYS_QPHY_WRAP_CTRL,
|
||||
SGMII_PN_SWAP_MASK, SGMII_PN_SWAP_TX_RX);
|
||||
/* Release PHYA power down state */
|
||||
regmap_read(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
|
||||
val &= ~SGMII_PHYA_PWD;
|
||||
regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mtk_sgmii_restart_an(struct mtk_eth *eth, int mac_id)
|
||||
{
|
||||
struct mtk_sgmii *ss = eth->sgmii;
|
||||
unsigned int val, sid;
|
||||
|
||||
/* Decide how GMAC and SGMIISYS be mapped */
|
||||
sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
|
||||
0 : mac_id;
|
||||
|
||||
if (!ss->regmap[sid])
|
||||
return;
|
||||
|
||||
regmap_read(ss->regmap[sid], SGMSYS_PCS_CONTROL_1, &val);
|
||||
val |= SGMII_AN_RESTART;
|
||||
regmap_write(ss->regmap[sid], SGMSYS_PCS_CONTROL_1, val);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
static int gpy211_phy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpy211_phy_probe(struct phy_device *phydev)
|
||||
{
|
||||
int sgmii_reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, 8);
|
||||
|
||||
/* enable 2.5G SGMII rate adaption */
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND1, 8, 0x24e2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpy211_get_features(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = genphy_read_abilities(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* GPY211 with rate adaption supports 100M/1G/2.5G speed. */
|
||||
linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
|
||||
phydev->supported);
|
||||
linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
|
||||
phydev->supported);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT,
|
||||
phydev->supported);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct phy_driver gpy211_phy_driver[] = {
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(0x67c9de0a),
|
||||
.name = "Intel GPY211 PHY",
|
||||
.config_init = gpy211_phy_config_init,
|
||||
.probe = gpy211_phy_probe,
|
||||
.get_features = gpy211_get_features,
|
||||
}
|
||||
};
|
||||
|
||||
module_phy_driver(gpy211_phy_driver);
|
||||
|
||||
static struct mdio_device_id __maybe_unused gpy211_phy_tbl[] = {
|
||||
{ PHY_ID_MATCH_VENDOR(0x67c9de00) },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("Intel GPY211 PHY driver with rate adaption");
|
||||
MODULE_AUTHOR("Landen Chao <landen.chao@mediatek.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, gpy211_phy_tbl);
|
||||
@@ -0,0 +1,880 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvmem-consumer.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#define ANALOG_INTERNAL_OPERATION_MAX_US (20)
|
||||
#define ZCAL_CTRL_MIN (0)
|
||||
#define ZCAL_CTRL_MAX (63)
|
||||
#define TXRESERVE_MIN (0)
|
||||
#define TXRESERVE_MAX (7)
|
||||
|
||||
|
||||
#define MTK_EXT_PAGE_ACCESS 0x1f
|
||||
#define MTK_PHY_PAGE_STANDARD 0x0000
|
||||
#define MTK_PHY_PAGE_EXTENDED 0x0001
|
||||
#define MTK_PHY_PAGE_EXTENDED_2 0x0002
|
||||
#define MTK_PHY_PAGE_EXTENDED_3 0x0003
|
||||
#define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
|
||||
#define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
|
||||
|
||||
/* Registers on MDIO_MMD_VEND1 */
|
||||
#define MTK_PHY_TXVLD_DA_RG (0x12)
|
||||
#define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
|
||||
#define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_A2 (0x16)
|
||||
#define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
|
||||
#define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_B1 (0x17)
|
||||
#define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_B2 (0x18)
|
||||
#define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_C1 (0x19)
|
||||
#define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_C2 (0x20)
|
||||
#define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_D1 (0x21)
|
||||
#define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_TX_I2MPB_TEST_MODE_D2 (0x22)
|
||||
#define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
|
||||
|
||||
|
||||
#define MTK_PHY_RESERVE_RG_0 (0x27)
|
||||
#define MTK_PHY_RESERVE_RG_1 (0x28)
|
||||
|
||||
#define MTK_PHY_RG_ANA_TEST_POWERUP_TX (0x3b)
|
||||
#define MTK_PHY_TANA_CAL_MODE (0xc1)
|
||||
#define MTK_PHY_TANA_CAL_MODE_SHIFT (8)
|
||||
|
||||
#define MTK_PHY_RXADC_CTRL_RG9 (0xc8)
|
||||
#define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
|
||||
#define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
|
||||
#define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
|
||||
#define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
|
||||
|
||||
#define MTK_PHY_RG_ANA_CAL_RG0 (0xdb)
|
||||
#define MTK_PHY_RG_CAL_CKINV BIT(12)
|
||||
#define MTK_PHY_RG_ANA_CALEN BIT(8)
|
||||
#define MTK_PHY_RG_REXT_CALEN BIT(4)
|
||||
#define MTK_PHY_RG_ZCALEN_A BIT(0)
|
||||
|
||||
#define MTK_PHY_RG_ANA_CAL_RG1 (0xdc)
|
||||
#define MTK_PHY_RG_ZCALEN_B BIT(12)
|
||||
#define MTK_PHY_RG_ZCALEN_C BIT(8)
|
||||
#define MTK_PHY_RG_ZCALEN_D BIT(4)
|
||||
#define MTK_PHY_RG_TXVOS_CALEN BIT(0)
|
||||
|
||||
#define MTK_PHY_RG_ANA_CAL_RG2 (0xdd)
|
||||
#define MTK_PHY_RG_TXG_CALEN_A BIT(12)
|
||||
#define MTK_PHY_RG_TXG_CALEN_B BIT(8)
|
||||
#define MTK_PHY_RG_TXG_CALEN_C BIT(4)
|
||||
#define MTK_PHY_RG_TXG_CALEN_D BIT(0)
|
||||
|
||||
#define MTK_PHY_RG_ANA_CAL_RG5 (0xe0)
|
||||
#define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_RG_ZCAL_CTRL_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG172 (0x172)
|
||||
#define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG173 (0x173)
|
||||
#define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG174 (0x174)
|
||||
#define MTK_PHY_RSEL_TX_A_MASK GENMASK(14, 8)
|
||||
#define MTK_PHY_RSEL_TX_B_MASK GENMASK(6, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG175 (0x175)
|
||||
#define MTK_PHY_RSEL_TX_C_MASK GENMASK(14, 8)
|
||||
#define MTK_PHY_RSEL_TX_D_MASK GENMASK(6, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17A (0x17a)
|
||||
#define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17B (0x17b)
|
||||
#define MTK_PHY_DA_CAL_CLK BIT(0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17C (0x17c)
|
||||
#define MTK_PHY_DA_CALIN_FLAG BIT(0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17D (0x17d)
|
||||
#define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17E (0x17e)
|
||||
#define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG17F (0x17f)
|
||||
#define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG180 (0x180)
|
||||
#define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG181 (0x181)
|
||||
#define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG182 (0x182)
|
||||
#define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG183 (0x183)
|
||||
#define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG184 (0x180)
|
||||
#define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG53D (0x53d)
|
||||
#define MTK_PHY_DA_TX_R50_A_NORMAL_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_R50_A_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG53E (0x53e)
|
||||
#define MTK_PHY_DA_TX_R50_B_NORMAL_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_R50_B_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG53F (0x53f)
|
||||
#define MTK_PHY_DA_TX_R50_C_NORMAL_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_R50_C_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
#define MTK_PHY_RG_DEV1E_REG540 (0x540)
|
||||
#define MTK_PHY_DA_TX_R50_D_NORMAL_MASK GENMASK(13, 8)
|
||||
#define MTK_PHY_DA_TX_R50_D_TBT_MASK GENMASK(5, 0)
|
||||
|
||||
|
||||
/* Registers on MDIO_MMD_VEND2 */
|
||||
#define MTK_PHY_ANA_TEST_BUS_CTRL_RG (0x100)
|
||||
#define MTK_PHY_ANA_TEST_MODE_MASK GENMASK(15, 8)
|
||||
|
||||
#define MTK_PHY_RG_DEV1F_REG110 (0x110)
|
||||
#define MTK_PHY_RG_TST_DMY2_MASK GENMASK(5, 0)
|
||||
#define MTK_PHY_RG_TANA_RESERVE_MASK GENMASK(13, 8)
|
||||
|
||||
#define MTK_PHY_RG_DEV1F_REG115 (0x115)
|
||||
#define MTK_PHY_RG_BG_RASEL_MASK GENMASK(2, 0)
|
||||
|
||||
/*
|
||||
* These macro privides efuse parsing for internal phy.
|
||||
*/
|
||||
#define EFS_DA_TX_I2MPB_A(x) (((x) >> 0) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_I2MPB_B(x) (((x) >> 6) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_I2MPB_C(x) (((x) >> 12) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_I2MPB_D(x) (((x) >> 18) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_AMP_OFFSET_A(x) (((x) >> 24) & GENMASK(5, 0))
|
||||
|
||||
#define EFS_DA_TX_AMP_OFFSET_B(x) (((x) >> 0) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_AMP_OFFSET_C(x) (((x) >> 6) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_AMP_OFFSET_D(x) (((x) >> 12) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_R50_A(x) (((x) >> 18) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_R50_B(x) (((x) >> 24) & GENMASK(5, 0))
|
||||
|
||||
#define EFS_DA_TX_R50_C(x) (((x) >> 0) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_R50_D(x) (((x) >> 6) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_R50_A_10M(x) (((x) >> 12) & GENMASK(5, 0))
|
||||
#define EFS_DA_TX_R50_B_10M(x) (((x) >> 18) & GENMASK(5, 0))
|
||||
|
||||
#define EFS_RG_BG_RASEL(x) (((x) >> 4) & GENMASK(2, 0))
|
||||
#define EFS_RG_REXT_TRIM(x) (((x) >> 7) & GENMASK(5, 0))
|
||||
|
||||
typedef enum {
|
||||
PAIR_A,
|
||||
PAIR_B,
|
||||
PAIR_C,
|
||||
PAIR_D,
|
||||
} phy_cal_pair_t;
|
||||
|
||||
const u8 mt798x_zcal_to_r50[64] = {
|
||||
7, 8, 9, 9, 10, 10, 11, 11,
|
||||
12, 13, 13, 14, 14, 15, 16, 16,
|
||||
17, 18, 18, 19, 20, 21, 21, 22,
|
||||
23, 24, 24, 25, 26, 27, 28, 29,
|
||||
30, 31, 32, 33, 34, 35, 36, 37,
|
||||
38, 40, 41, 42, 43, 45, 46, 48,
|
||||
49, 51, 52, 54, 55, 57, 59, 61,
|
||||
62, 63, 63, 63, 63, 63, 63, 63
|
||||
};
|
||||
|
||||
const char pair[4] = {'A', 'B', 'C', 'D'};
|
||||
|
||||
#define CAL_NO_PAIR(cal_item, cal_mode, ...) \
|
||||
cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__);
|
||||
|
||||
#define CAL_PAIR_A_TO_A(cal_item, cal_mode, ...) \
|
||||
for(i=PAIR_A; i<=PAIR_A; i++) { \
|
||||
cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__, i);\
|
||||
if(cal_ret) break; \
|
||||
}
|
||||
|
||||
#define CAL_PAIR_A_TO_D(cal_item, cal_mode, ...) \
|
||||
for(i=PAIR_A; i<=PAIR_D; i++) { \
|
||||
cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__, i);\
|
||||
if(cal_ret) break; \
|
||||
}
|
||||
|
||||
#define SW_CAL(cal_item, cal_mode_get, pair_mode) \
|
||||
CAL_##pair_mode(cal_item, sw) \
|
||||
|
||||
#define SW_EFUSE_CAL(cal_item, cal_mode_get, pair_mode,...) \
|
||||
if (ret || (!ret && strcmp("efuse", cal_mode_get) == 0)) { \
|
||||
CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
|
||||
} else if (!ret && strcmp("sw", cal_mode_get) == 0) { \
|
||||
CAL_##pair_mode(cal_item, sw) \
|
||||
} else { \
|
||||
dev_info(&phydev->mdio.dev, "%s cal mode %s not supported\n", \
|
||||
#cal_item, \
|
||||
cal_mode_get); \
|
||||
}
|
||||
|
||||
#define EFUSE_CAL(cal_item, cal_mode_get, pair_mode, ...) \
|
||||
if ((efs_valid && ret) || \
|
||||
(efs_valid && !ret && strcmp("efuse", cal_mode_get) == 0)) {\
|
||||
CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
|
||||
} else { \
|
||||
dev_info(&phydev->mdio.dev, "%s uses default value, " \
|
||||
"efs-valid: %s, dts: %s\n", \
|
||||
#cal_item, \
|
||||
efs_valid? "yes" : "no", \
|
||||
ret? "empty" : cal_mode_get); \
|
||||
}
|
||||
|
||||
#define CAL_FLOW(cal_item, cal_mode, cal_mode_get, pair_mode,...) \
|
||||
ret = of_property_read_string(phydev->mdio.dev.of_node, \
|
||||
#cal_item, &cal_mode_get); \
|
||||
cal_mode##_CAL(cal_item, cal_mode_get, pair_mode, ##__VA_ARGS__)\
|
||||
if(cal_ret) { \
|
||||
dev_err(&phydev->mdio.dev, "cal_item cal failed\n"); \
|
||||
ret = -EIO; \
|
||||
goto out; \
|
||||
}
|
||||
|
||||
static int mtk_gephy_read_page(struct phy_device *phydev)
|
||||
{
|
||||
return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
|
||||
}
|
||||
|
||||
static int mtk_gephy_write_page(struct phy_device *phydev, int page)
|
||||
{
|
||||
return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
|
||||
}
|
||||
|
||||
/*
|
||||
* One calibration cycle consists of:
|
||||
* 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
|
||||
* until AD_CAL_COMP is ready to output calibration result.
|
||||
* 2.Wait until DA_CAL_CLK is available.
|
||||
* 3.Fetch AD_CAL_COMP_OUT.
|
||||
*/
|
||||
static int cal_cycle(struct phy_device *phydev, int devad,
|
||||
u32 regnum, u16 mask, u16 cal_val)
|
||||
{
|
||||
unsigned long timeout;
|
||||
int reg_val;
|
||||
int ret;
|
||||
|
||||
phy_modify_mmd(phydev, devad, regnum,
|
||||
mask, cal_val);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
|
||||
MTK_PHY_DA_CALIN_FLAG);
|
||||
|
||||
timeout = jiffies + usecs_to_jiffies(ANALOG_INTERNAL_OPERATION_MAX_US);
|
||||
do{
|
||||
reg_val = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17B);
|
||||
} while(time_before(jiffies, timeout) && !(reg_val & BIT(0)));
|
||||
|
||||
if(!(reg_val & BIT(0))) {
|
||||
dev_err(&phydev->mdio.dev, "Calibration cycle timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
|
||||
MTK_PHY_DA_CALIN_FLAG);
|
||||
ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17A) >>
|
||||
MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
|
||||
dev_dbg(&phydev->mdio.dev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rext_fill_result(struct phy_device *phydev, u16 *buf)
|
||||
{
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG115,
|
||||
MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
|
||||
{
|
||||
u16 rext_cal_val[2];
|
||||
|
||||
rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
|
||||
rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
|
||||
rext_fill_result(phydev, rext_cal_val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rext_cal_sw(struct phy_device *phydev)
|
||||
{
|
||||
u8 rg_zcal_ctrl_def;
|
||||
u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
|
||||
u8 lower_ret, upper_ret;
|
||||
u16 rext_cal_val[2];
|
||||
int ret;
|
||||
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
|
||||
MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_TXVOS_CALEN);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
|
||||
MTK_PHY_RG_TST_DMY2_MASK, 0x1);
|
||||
|
||||
rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK;
|
||||
zcal_lower = ZCAL_CTRL_MIN;
|
||||
zcal_upper = ZCAL_CTRL_MAX;
|
||||
|
||||
dev_dbg(&phydev->mdio.dev, "Start REXT SW cal.\n");
|
||||
while((zcal_upper-zcal_lower) > 1) {
|
||||
rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
|
||||
ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
|
||||
if(ret==1)
|
||||
zcal_upper = rg_zcal_ctrl;
|
||||
else if(ret==0)
|
||||
zcal_lower = rg_zcal_ctrl;
|
||||
else
|
||||
goto restore;
|
||||
}
|
||||
|
||||
ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
|
||||
if(lower_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
|
||||
if(upper_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret-lower_ret;
|
||||
if (ret == 1) {
|
||||
rext_cal_val[0] = zcal_upper;
|
||||
rext_cal_val[1] = zcal_upper >> 3;
|
||||
rext_fill_result(phydev, rext_cal_val);
|
||||
dev_info(&phydev->mdio.dev, "REXT SW cal result: 0x%x\n", zcal_upper);
|
||||
ret = 0;
|
||||
} else
|
||||
ret = -EINVAL;
|
||||
|
||||
restore:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
|
||||
MTK_PHY_ANA_TEST_MODE_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
|
||||
MTK_PHY_RG_TST_DMY2_MASK);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
|
||||
{
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
|
||||
MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
|
||||
MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
|
||||
MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
|
||||
MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
|
||||
{
|
||||
u16 tx_offset_cal_val[4];
|
||||
|
||||
tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
|
||||
tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
|
||||
tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
|
||||
tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
|
||||
|
||||
tx_offset_fill_result(phydev, tx_offset_cal_val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
|
||||
{
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
|
||||
MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, buf[0] << 10);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
|
||||
MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0]);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
|
||||
MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, buf[0] << 10);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
|
||||
MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0]);
|
||||
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
|
||||
MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, buf[1] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
|
||||
MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1]);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
|
||||
MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, buf[1] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
|
||||
MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1]);
|
||||
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
|
||||
MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, buf[2] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
|
||||
MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2]);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
|
||||
MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, buf[2] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
|
||||
MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2]);
|
||||
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
|
||||
MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, buf[3] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
|
||||
MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3]);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
|
||||
MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, buf[3] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
|
||||
MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
|
||||
{
|
||||
u16 tx_amp_cal_val[4];
|
||||
|
||||
tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
|
||||
tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
|
||||
tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
|
||||
tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
|
||||
tx_amp_fill_result(phydev, tx_amp_cal_val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_r50_fill_result(struct phy_device *phydev, u16 *buf,
|
||||
phy_cal_pair_t txg_calen_x)
|
||||
{
|
||||
switch(txg_calen_x) {
|
||||
case PAIR_A:
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
|
||||
MTK_PHY_DA_TX_R50_A_NORMAL_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
|
||||
MTK_PHY_DA_TX_R50_A_TBT_MASK, buf[0]);
|
||||
break;
|
||||
case PAIR_B:
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
|
||||
MTK_PHY_DA_TX_R50_B_NORMAL_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
|
||||
MTK_PHY_DA_TX_R50_B_TBT_MASK, buf[0]);
|
||||
break;
|
||||
case PAIR_C:
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
|
||||
MTK_PHY_DA_TX_R50_C_NORMAL_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
|
||||
MTK_PHY_DA_TX_R50_C_TBT_MASK, buf[0]);
|
||||
break;
|
||||
case PAIR_D:
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
|
||||
MTK_PHY_DA_TX_R50_D_NORMAL_MASK, buf[0] << 8);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
|
||||
MTK_PHY_DA_TX_R50_D_TBT_MASK, buf[0]);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
|
||||
phy_cal_pair_t txg_calen_x)
|
||||
{
|
||||
u16 tx_r50_cal_val[1];
|
||||
|
||||
switch(txg_calen_x) {
|
||||
case PAIR_A:
|
||||
tx_r50_cal_val[0] = EFS_DA_TX_R50_A(buf[1]);
|
||||
break;
|
||||
case PAIR_B:
|
||||
tx_r50_cal_val[0] = EFS_DA_TX_R50_B(buf[1]);
|
||||
break;
|
||||
case PAIR_C:
|
||||
tx_r50_cal_val[0] = EFS_DA_TX_R50_C(buf[2]);
|
||||
break;
|
||||
case PAIR_D:
|
||||
tx_r50_cal_val[0] = EFS_DA_TX_R50_D(buf[2]);
|
||||
break;
|
||||
}
|
||||
tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tx_r50_cal_sw(struct phy_device *phydev, phy_cal_pair_t txg_calen_x)
|
||||
{
|
||||
u8 rg_zcal_ctrl_def;
|
||||
u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
|
||||
u8 lower_ret, upper_ret;
|
||||
u16 tx_r50_cal_val[1];
|
||||
int ret;
|
||||
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
|
||||
MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_TXVOS_CALEN);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
|
||||
BIT(txg_calen_x * 4));
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
|
||||
MTK_PHY_RG_TST_DMY2_MASK, 0x1);
|
||||
|
||||
rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK;
|
||||
zcal_lower = ZCAL_CTRL_MIN;
|
||||
zcal_upper = ZCAL_CTRL_MAX;
|
||||
|
||||
dev_dbg(&phydev->mdio.dev, "Start TX-R50 Part%c SW cal.\n", pair[txg_calen_x]);
|
||||
while((zcal_upper-zcal_lower) > 1) {
|
||||
rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
|
||||
ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
|
||||
if(ret==1)
|
||||
zcal_upper = rg_zcal_ctrl;
|
||||
else if(ret==0)
|
||||
zcal_lower = rg_zcal_ctrl;
|
||||
else
|
||||
goto restore;
|
||||
}
|
||||
|
||||
ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
|
||||
if(lower_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
|
||||
if(upper_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret-lower_ret;
|
||||
if (ret == 1) {
|
||||
tx_r50_cal_val[0] = mt798x_zcal_to_r50[zcal_upper];
|
||||
tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
|
||||
dev_info(&phydev->mdio.dev, "TX-R50 Part%c SW cal result: 0x%x\n",
|
||||
pair[txg_calen_x], zcal_lower);
|
||||
ret = 0;
|
||||
} else
|
||||
ret = -EINVAL;
|
||||
|
||||
restore:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
|
||||
MTK_PHY_ANA_TEST_MODE_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
|
||||
BIT(txg_calen_x * 4));
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
|
||||
MTK_PHY_RG_TST_DMY2_MASK);
|
||||
phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
|
||||
MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tx_vcm_cal_sw(struct phy_device *phydev, phy_cal_pair_t rg_txreserve_x)
|
||||
{
|
||||
u8 lower_idx, upper_idx, txreserve_val;
|
||||
u8 lower_ret, upper_ret;
|
||||
int ret;
|
||||
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_ANA_CALEN);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_CAL_CKINV);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_TXVOS_CALEN);
|
||||
|
||||
switch(rg_txreserve_x) {
|
||||
case PAIR_A:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17D,
|
||||
MTK_PHY_DASN_DAC_IN0_A_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG181,
|
||||
MTK_PHY_DASN_DAC_IN1_A_MASK);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_ZCALEN_A);
|
||||
break;
|
||||
case PAIR_B:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17E,
|
||||
MTK_PHY_DASN_DAC_IN0_B_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG182,
|
||||
MTK_PHY_DASN_DAC_IN1_B_MASK);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_ZCALEN_B);
|
||||
break;
|
||||
case PAIR_C:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17F,
|
||||
MTK_PHY_DASN_DAC_IN0_C_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG183,
|
||||
MTK_PHY_DASN_DAC_IN1_C_MASK);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_ZCALEN_C);
|
||||
break;
|
||||
case PAIR_D:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG180,
|
||||
MTK_PHY_DASN_DAC_IN0_D_MASK);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG184,
|
||||
MTK_PHY_DASN_DAC_IN1_D_MASK);
|
||||
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_ZCALEN_D);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto restore;
|
||||
}
|
||||
|
||||
lower_idx = TXRESERVE_MIN;
|
||||
upper_idx = TXRESERVE_MAX;
|
||||
|
||||
dev_dbg(&phydev->mdio.dev, "Start TX-VCM SW cal.\n");
|
||||
while((upper_idx-lower_idx) > 1) {
|
||||
txreserve_val = DIV_ROUND_CLOSEST(lower_idx+upper_idx, 2);
|
||||
ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
|
||||
MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
|
||||
MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
|
||||
txreserve_val << 12 | txreserve_val << 8 |
|
||||
txreserve_val << 4 | txreserve_val);
|
||||
if(ret==1)
|
||||
upper_idx = txreserve_val;
|
||||
else if(ret==0)
|
||||
lower_idx = txreserve_val;
|
||||
else
|
||||
goto restore;
|
||||
}
|
||||
|
||||
/* We calibrate TX-VCM in different logic. Check upper index and then
|
||||
* lower index. If this calibration is valid, apply lower index's result.
|
||||
*/
|
||||
ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
|
||||
MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
|
||||
MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
|
||||
lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
|
||||
if(lower_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
|
||||
MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
|
||||
MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
|
||||
upper_idx << 12 | upper_idx << 8 | upper_idx << 4 | upper_idx);
|
||||
if(upper_ret < 0)
|
||||
goto restore;
|
||||
|
||||
ret = upper_ret-lower_ret;
|
||||
if (ret == 1) {
|
||||
ret = 0;
|
||||
dev_info(&phydev->mdio.dev, "TX-VCM SW cal result: 0x%x\n", upper_idx);
|
||||
} else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 && lower_ret == 1) {
|
||||
ret = 0;
|
||||
cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
|
||||
MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
|
||||
MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
|
||||
lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
|
||||
dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at low margin 0x%x\n", lower_idx);
|
||||
} else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 && lower_ret == 0) {
|
||||
ret = 0;
|
||||
dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at high margin 0x%x\n", upper_idx);
|
||||
} else
|
||||
ret = -EINVAL;
|
||||
|
||||
restore:
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_ANA_CALEN);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_TXVOS_CALEN);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
|
||||
MTK_PHY_RG_ZCALEN_A);
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
|
||||
MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C | MTK_PHY_RG_ZCALEN_D);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mtk_gephy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
/* Disable EEE */
|
||||
phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0);
|
||||
|
||||
/* Enable HW auto downshift */
|
||||
phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED, 0x14, 0, BIT(4));
|
||||
|
||||
/* Increase SlvDPSready time */
|
||||
phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
|
||||
__phy_write(phydev, 0x10, 0xafae);
|
||||
__phy_write(phydev, 0x12, 0x2f);
|
||||
__phy_write(phydev, 0x10, 0x8fae);
|
||||
phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
|
||||
|
||||
/* Adjust 100_mse_threshold */
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x123, 0xffff);
|
||||
|
||||
/* Disable mcc */
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xa6, 0x300);
|
||||
}
|
||||
|
||||
static int mt7530_phy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
mtk_gephy_config_init(phydev);
|
||||
|
||||
/* Increase post_update_timer */
|
||||
phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3, 0x11, 0x4b);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt7531_phy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
if (phydev->interface != PHY_INTERFACE_MODE_INTERNAL)
|
||||
return -EINVAL;
|
||||
|
||||
mtk_gephy_config_init(phydev);
|
||||
|
||||
/* PHY link down power saving enable */
|
||||
phy_set_bits(phydev, 0x17, BIT(4));
|
||||
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 0xc6, 0x300);
|
||||
|
||||
/* Set TX Pair delay selection */
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404);
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt798x_phy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
const char *cal_mode_from_dts;
|
||||
int i, ret, cal_ret;
|
||||
u32 *buf;
|
||||
bool efs_valid = true;
|
||||
size_t len;
|
||||
struct nvmem_cell *cell;
|
||||
|
||||
if (phydev->interface != PHY_INTERFACE_MODE_GMII)
|
||||
return -EINVAL;
|
||||
|
||||
cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
|
||||
if (IS_ERR(cell)) {
|
||||
if (PTR_ERR(cell) == -EPROBE_DEFER)
|
||||
return PTR_ERR(cell);
|
||||
return 0;
|
||||
}
|
||||
|
||||
buf = (u32 *)nvmem_cell_read(cell, &len);
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
nvmem_cell_put(cell);
|
||||
|
||||
if(!buf[0] && !buf[1] && !buf[2] && !buf[3])
|
||||
efs_valid = false;
|
||||
|
||||
if (len < 4 * sizeof(u32)) {
|
||||
dev_err(&phydev->mdio.dev, "invalid calibration data\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
CAL_FLOW(rext, SW_EFUSE, cal_mode_from_dts, NO_PAIR, buf)
|
||||
CAL_FLOW(tx_offset, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
|
||||
CAL_FLOW(tx_amp, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
|
||||
CAL_FLOW(tx_r50, SW_EFUSE, cal_mode_from_dts, PAIR_A_TO_D, buf)
|
||||
CAL_FLOW(tx_vcm, SW, cal_mode_from_dts, PAIR_A_TO_A)
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct phy_driver mtk_gephy_driver[] = {
|
||||
#if 0
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(0x03a29412),
|
||||
.name = "MediaTek MT7530 PHY",
|
||||
.config_init = mt7530_phy_config_init,
|
||||
/* Interrupts are handled by the switch, not the PHY
|
||||
* itself.
|
||||
*/
|
||||
.config_intr = genphy_no_config_intr,
|
||||
.handle_interrupt = genphy_no_ack_interrupt,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_page = mtk_gephy_read_page,
|
||||
.write_page = mtk_gephy_write_page,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(0x03a29441),
|
||||
.name = "MediaTek MT7531 PHY",
|
||||
.config_init = mt7531_phy_config_init,
|
||||
/* Interrupts are handled by the switch, not the PHY
|
||||
* itself.
|
||||
*/
|
||||
.config_intr = genphy_no_config_intr,
|
||||
.handle_interrupt = genphy_no_ack_interrupt,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_page = mtk_gephy_read_page,
|
||||
.write_page = mtk_gephy_write_page,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(0x03a29461),
|
||||
.name = "MediaTek MT798x PHY",
|
||||
.config_init = mt798x_phy_config_init,
|
||||
/* Interrupts are handled by the switch, not the PHY
|
||||
* itself.
|
||||
*/
|
||||
.config_intr = genphy_no_config_intr,
|
||||
.handle_interrupt = genphy_no_ack_interrupt,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_page = mtk_gephy_read_page,
|
||||
.write_page = mtk_gephy_write_page,
|
||||
},
|
||||
};
|
||||
|
||||
module_phy_driver(mtk_gephy_driver);
|
||||
|
||||
static struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = {
|
||||
{ PHY_ID_MATCH_VENDOR(0x03a29400) },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
|
||||
MODULE_AUTHOR("DENG, Qingfang <dqfext@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, mtk_gephy_tbl);
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
config MT753X_GSW
|
||||
tristate "Driver for the MediaTek MT753x switch"
|
||||
@@ -0,0 +1,11 @@
|
||||
#
|
||||
# Makefile for MediaTek MT753x gigabit switch
|
||||
#
|
||||
|
||||
obj-$(CONFIG_MT753X_GSW) += mt753x.o
|
||||
|
||||
mt753x-$(CONFIG_SWCONFIG) += mt753x_swconfig.o
|
||||
|
||||
mt753x-y += mt753x_mdio.o mt7530.o mt7531.o \
|
||||
mt753x_common.o mt753x_vlan.o mt753x_nl.o
|
||||
|
||||
644
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.c
Executable file
644
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt7530.c
Executable file
@@ -0,0 +1,644 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "mt753x.h"
|
||||
#include "mt753x_regs.h"
|
||||
|
||||
/* MT7530 registers */
|
||||
|
||||
/* Unique fields of PMCR for MT7530 */
|
||||
#define FORCE_MODE BIT(15)
|
||||
|
||||
/* Unique fields of GMACCR for MT7530 */
|
||||
#define VLAN_SUPT_NO_S 14
|
||||
#define VLAN_SUPT_NO_M 0x1c000
|
||||
#define LATE_COL_DROP BIT(13)
|
||||
|
||||
/* Unique fields of (M)HWSTRAP for MT7530 */
|
||||
#define BOND_OPTION BIT(24)
|
||||
#define P5_PHY0_SEL BIT(20)
|
||||
#define CHG_TRAP BIT(16)
|
||||
#define LOOPDET_DIS BIT(14)
|
||||
#define P5_INTF_SEL_GMAC5 BIT(13)
|
||||
#define SMI_ADDR_S 11
|
||||
#define SMI_ADDR_M 0x1800
|
||||
#define XTAL_FSEL_S 9
|
||||
#define XTAL_FSEL_M 0x600
|
||||
#define P6_INTF_DIS BIT(8)
|
||||
#define P5_INTF_MODE_RGMII BIT(7)
|
||||
#define P5_INTF_DIS_S BIT(6)
|
||||
#define C_MDIO_BPS_S BIT(5)
|
||||
#define EEPROM_EN_S BIT(4)
|
||||
|
||||
/* PHY EEE Register bitmap of define */
|
||||
#define PHY_DEV07 0x07
|
||||
#define PHY_DEV07_REG_03C 0x3c
|
||||
|
||||
/* PHY Extend Register 0x14 bitmap of define */
|
||||
#define PHY_EXT_REG_14 0x14
|
||||
|
||||
/* Fields of PHY_EXT_REG_14 */
|
||||
#define PHY_EN_DOWN_SHFIT BIT(4)
|
||||
|
||||
/* PHY Token Ring Register 0x10 bitmap of define */
|
||||
#define PHY_TR_REG_10 0x10
|
||||
|
||||
/* PHY Token Ring Register 0x12 bitmap of define */
|
||||
#define PHY_TR_REG_12 0x12
|
||||
|
||||
/* PHY LPI PCS/DSP Control Register bitmap of define */
|
||||
#define PHY_LPI_REG_11 0x11
|
||||
|
||||
/* PHY DEV 0x1e Register bitmap of define */
|
||||
#define PHY_DEV1E 0x1e
|
||||
#define PHY_DEV1E_REG_123 0x123
|
||||
#define PHY_DEV1E_REG_A6 0xa6
|
||||
|
||||
/* Values of XTAL_FSEL */
|
||||
#define XTAL_20MHZ 1
|
||||
#define XTAL_40MHZ 2
|
||||
#define XTAL_25MHZ 3
|
||||
|
||||
/* Top single control CR define */
|
||||
#define TOP_SIG_CTRL 0x7808
|
||||
|
||||
/* TOP_SIG_CTRL Register bitmap of define */
|
||||
#define OUTPUT_INTR_S 16
|
||||
#define OUTPUT_INTR_M 0x30000
|
||||
|
||||
#define P6ECR 0x7830
|
||||
#define P6_INTF_MODE_TRGMII BIT(0)
|
||||
|
||||
#define TRGMII_TXCTRL 0x7a40
|
||||
#define TRAIN_TXEN BIT(31)
|
||||
#define TXC_INV BIT(30)
|
||||
#define TX_DOEO BIT(29)
|
||||
#define TX_RST BIT(28)
|
||||
|
||||
#define TRGMII_TD0_CTRL 0x7a50
|
||||
#define TRGMII_TD1_CTRL 0x7a58
|
||||
#define TRGMII_TD2_CTRL 0x7a60
|
||||
#define TRGMII_TD3_CTRL 0x7a68
|
||||
#define TRGMII_TXCTL_CTRL 0x7a70
|
||||
#define TRGMII_TCK_CTRL 0x7a78
|
||||
#define TRGMII_TD_CTRL(n) (0x7a50 + (n) * 8)
|
||||
#define NUM_TRGMII_CTRL 6
|
||||
#define TX_DMPEDRV BIT(31)
|
||||
#define TX_DM_SR BIT(15)
|
||||
#define TX_DMERODT BIT(14)
|
||||
#define TX_DMOECTL BIT(13)
|
||||
#define TX_TAP_S 8
|
||||
#define TX_TAP_M 0xf00
|
||||
#define TX_TRAIN_WD_S 0
|
||||
#define TX_TRAIN_WD_M 0xff
|
||||
|
||||
#define TRGMII_TD0_ODT 0x7a54
|
||||
#define TRGMII_TD1_ODT 0x7a5c
|
||||
#define TRGMII_TD2_ODT 0x7a64
|
||||
#define TRGMII_TD3_ODT 0x7a6c
|
||||
#define TRGMII_TXCTL_ODT 0x7574
|
||||
#define TRGMII_TCK_ODT 0x757c
|
||||
#define TRGMII_TD_ODT(n) (0x7a54 + (n) * 8)
|
||||
#define NUM_TRGMII_ODT 6
|
||||
#define TX_DM_DRVN_PRE_S 30
|
||||
#define TX_DM_DRVN_PRE_M 0xc0000000
|
||||
#define TX_DM_DRVP_PRE_S 28
|
||||
#define TX_DM_DRVP_PRE_M 0x30000000
|
||||
#define TX_DM_TDSEL_S 24
|
||||
#define TX_DM_TDSEL_M 0xf000000
|
||||
#define TX_ODTEN BIT(23)
|
||||
#define TX_DME_PRE BIT(20)
|
||||
#define TX_DM_DRVNT0 BIT(19)
|
||||
#define TX_DM_DRVPT0 BIT(18)
|
||||
#define TX_DM_DRVNTE BIT(17)
|
||||
#define TX_DM_DRVPTE BIT(16)
|
||||
#define TX_DM_ODTN_S 12
|
||||
#define TX_DM_ODTN_M 0x7000
|
||||
#define TX_DM_ODTP_S 8
|
||||
#define TX_DM_ODTP_M 0x700
|
||||
#define TX_DM_DRVN_S 4
|
||||
#define TX_DM_DRVN_M 0xf0
|
||||
#define TX_DM_DRVP_S 0
|
||||
#define TX_DM_DRVP_M 0x0f
|
||||
|
||||
#define P5RGMIIRXCR 0x7b00
|
||||
#define CSR_RGMII_RCTL_CFG_S 24
|
||||
#define CSR_RGMII_RCTL_CFG_M 0x7000000
|
||||
#define CSR_RGMII_RXD_CFG_S 16
|
||||
#define CSR_RGMII_RXD_CFG_M 0x70000
|
||||
#define CSR_RGMII_EDGE_ALIGN BIT(8)
|
||||
#define CSR_RGMII_RXC_90DEG_CFG_S 4
|
||||
#define CSR_RGMII_RXC_90DEG_CFG_M 0xf0
|
||||
#define CSR_RGMII_RXC_0DEG_CFG_S 0
|
||||
#define CSR_RGMII_RXC_0DEG_CFG_M 0x0f
|
||||
|
||||
#define P5RGMIITXCR 0x7b04
|
||||
#define CSR_RGMII_TXEN_CFG_S 16
|
||||
#define CSR_RGMII_TXEN_CFG_M 0x70000
|
||||
#define CSR_RGMII_TXD_CFG_S 8
|
||||
#define CSR_RGMII_TXD_CFG_M 0x700
|
||||
#define CSR_RGMII_TXC_CFG_S 0
|
||||
#define CSR_RGMII_TXC_CFG_M 0x1f
|
||||
|
||||
#define CHIP_REV 0x7ffc
|
||||
#define CHIP_NAME_S 16
|
||||
#define CHIP_NAME_M 0xffff0000
|
||||
#define CHIP_REV_S 0
|
||||
#define CHIP_REV_M 0x0f
|
||||
|
||||
/* MMD registers */
|
||||
#define CORE_PLL_GROUP2 0x401
|
||||
#define RG_SYSPLL_EN_NORMAL BIT(15)
|
||||
#define RG_SYSPLL_VODEN BIT(14)
|
||||
#define RG_SYSPLL_POSDIV_S 5
|
||||
#define RG_SYSPLL_POSDIV_M 0x60
|
||||
|
||||
#define CORE_PLL_GROUP4 0x403
|
||||
#define RG_SYSPLL_DDSFBK_EN BIT(12)
|
||||
#define RG_SYSPLL_BIAS_EN BIT(11)
|
||||
#define RG_SYSPLL_BIAS_LPF_EN BIT(10)
|
||||
|
||||
#define CORE_PLL_GROUP5 0x404
|
||||
#define RG_LCDDS_PCW_NCPO1_S 0
|
||||
#define RG_LCDDS_PCW_NCPO1_M 0xffff
|
||||
|
||||
#define CORE_PLL_GROUP6 0x405
|
||||
#define RG_LCDDS_PCW_NCPO0_S 0
|
||||
#define RG_LCDDS_PCW_NCPO0_M 0xffff
|
||||
|
||||
#define CORE_PLL_GROUP7 0x406
|
||||
#define RG_LCDDS_PWDB BIT(15)
|
||||
#define RG_LCDDS_ISO_EN BIT(13)
|
||||
#define RG_LCCDS_C_S 4
|
||||
#define RG_LCCDS_C_M 0x70
|
||||
#define RG_LCDDS_PCW_NCPO_CHG BIT(3)
|
||||
|
||||
#define CORE_PLL_GROUP10 0x409
|
||||
#define RG_LCDDS_SSC_DELTA_S 0
|
||||
#define RG_LCDDS_SSC_DELTA_M 0xfff
|
||||
|
||||
#define CORE_PLL_GROUP11 0x40a
|
||||
#define RG_LCDDS_SSC_DELTA1_S 0
|
||||
#define RG_LCDDS_SSC_DELTA1_M 0xfff
|
||||
|
||||
#define CORE_GSWPLL_GCR_1 0x040d
|
||||
#define GSWPLL_PREDIV_S 14
|
||||
#define GSWPLL_PREDIV_M 0xc000
|
||||
#define GSWPLL_POSTDIV_200M_S 12
|
||||
#define GSWPLL_POSTDIV_200M_M 0x3000
|
||||
#define GSWPLL_EN_PRE BIT(11)
|
||||
#define GSWPLL_FBKSEL BIT(10)
|
||||
#define GSWPLL_BP BIT(9)
|
||||
#define GSWPLL_BR BIT(8)
|
||||
#define GSWPLL_FBKDIV_200M_S 0
|
||||
#define GSWPLL_FBKDIV_200M_M 0xff
|
||||
|
||||
#define CORE_GSWPLL_GCR_2 0x040e
|
||||
#define GSWPLL_POSTDIV_500M_S 8
|
||||
#define GSWPLL_POSTDIV_500M_M 0x300
|
||||
#define GSWPLL_FBKDIV_500M_S 0
|
||||
#define GSWPLL_FBKDIV_500M_M 0xff
|
||||
|
||||
#define TRGMII_GSW_CLK_CG 0x0410
|
||||
#define TRGMIICK_EN BIT(1)
|
||||
#define GSWCK_EN BIT(0)
|
||||
|
||||
static int mt7530_mii_read(struct gsw_mt753x *gsw, int phy, int reg)
|
||||
{
|
||||
if (phy < MT753X_NUM_PHYS)
|
||||
phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
|
||||
|
||||
return mdiobus_read(gsw->host_bus, phy, reg);
|
||||
}
|
||||
|
||||
static void mt7530_mii_write(struct gsw_mt753x *gsw, int phy, int reg, u16 val)
|
||||
{
|
||||
if (phy < MT753X_NUM_PHYS)
|
||||
phy = (gsw->phy_base + phy) & MT753X_SMI_ADDR_MASK;
|
||||
|
||||
mdiobus_write(gsw->host_bus, phy, reg, val);
|
||||
}
|
||||
|
||||
static int mt7530_mmd_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
if (addr < MT753X_NUM_PHYS)
|
||||
addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
|
||||
|
||||
mutex_lock(&gsw->host_bus->mdio_lock);
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
|
||||
(MMD_ADDR << MMD_CMD_S) |
|
||||
((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, reg);
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
|
||||
(MMD_DATA << MMD_CMD_S) |
|
||||
((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
|
||||
|
||||
val = gsw->host_bus->read(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG);
|
||||
|
||||
mutex_unlock(&gsw->host_bus->mdio_lock);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void mt7530_mmd_write(struct gsw_mt753x *gsw, int addr, int devad,
|
||||
u16 reg, u16 val)
|
||||
{
|
||||
if (addr < MT753X_NUM_PHYS)
|
||||
addr = (gsw->phy_base + addr) & MT753X_SMI_ADDR_MASK;
|
||||
|
||||
mutex_lock(&gsw->host_bus->mdio_lock);
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
|
||||
(MMD_ADDR << MMD_CMD_S) |
|
||||
((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, reg);
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ACC_CTL_REG,
|
||||
(MMD_DATA << MMD_CMD_S) |
|
||||
((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
|
||||
|
||||
gsw->host_bus->write(gsw->host_bus, addr, MII_MMD_ADDR_DATA_REG, val);
|
||||
|
||||
mutex_unlock(&gsw->host_bus->mdio_lock);
|
||||
}
|
||||
|
||||
static void mt7530_core_reg_write(struct gsw_mt753x *gsw, u32 reg, u32 val)
|
||||
{
|
||||
gsw->mmd_write(gsw, 0, 0x1f, reg, val);
|
||||
}
|
||||
|
||||
static void mt7530_trgmii_setting(struct gsw_mt753x *gsw)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP5, 0x0780);
|
||||
mdelay(1);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP6, 0);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP10, 0x87);
|
||||
mdelay(1);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP11, 0x87);
|
||||
|
||||
/* PLL BIAS enable */
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP4,
|
||||
RG_SYSPLL_DDSFBK_EN | RG_SYSPLL_BIAS_EN);
|
||||
mdelay(1);
|
||||
|
||||
/* PLL LPF enable */
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP4,
|
||||
RG_SYSPLL_DDSFBK_EN |
|
||||
RG_SYSPLL_BIAS_EN | RG_SYSPLL_BIAS_LPF_EN);
|
||||
|
||||
/* sys PLL enable */
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP2,
|
||||
RG_SYSPLL_EN_NORMAL | RG_SYSPLL_VODEN |
|
||||
(1 << RG_SYSPLL_POSDIV_S));
|
||||
|
||||
/* LCDDDS PWDS */
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP7,
|
||||
(3 << RG_LCCDS_C_S) |
|
||||
RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
|
||||
mdelay(1);
|
||||
|
||||
/* Enable MT7530 TRGMII clock */
|
||||
mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, GSWCK_EN | TRGMIICK_EN);
|
||||
|
||||
/* lower Tx Driving */
|
||||
for (i = 0 ; i < NUM_TRGMII_ODT; i++)
|
||||
mt753x_reg_write(gsw, TRGMII_TD_ODT(i),
|
||||
(4 << TX_DM_DRVP_S) | (4 << TX_DM_DRVN_S));
|
||||
}
|
||||
|
||||
static void mt7530_rgmii_setting(struct gsw_mt753x *gsw)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP5, 0x0c80);
|
||||
mdelay(1);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP6, 0);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP10, 0x87);
|
||||
mdelay(1);
|
||||
mt7530_core_reg_write(gsw, CORE_PLL_GROUP11, 0x87);
|
||||
|
||||
val = mt753x_reg_read(gsw, TRGMII_TXCTRL);
|
||||
val &= ~TXC_INV;
|
||||
mt753x_reg_write(gsw, TRGMII_TXCTRL, val);
|
||||
|
||||
mt753x_reg_write(gsw, TRGMII_TCK_CTRL,
|
||||
(8 << TX_TAP_S) | (0x55 << TX_TRAIN_WD_S));
|
||||
}
|
||||
|
||||
static int mt7530_mac_port_setup(struct gsw_mt753x *gsw)
|
||||
{
|
||||
u32 hwstrap, p6ecr = 0, p5mcr, p6mcr, phyad;
|
||||
|
||||
hwstrap = mt753x_reg_read(gsw, MHWSTRAP);
|
||||
hwstrap &= ~(P6_INTF_DIS | P5_INTF_MODE_RGMII | P5_INTF_DIS_S);
|
||||
hwstrap |= P5_INTF_SEL_GMAC5;
|
||||
if (!gsw->port5_cfg.enabled) {
|
||||
p5mcr = FORCE_MODE;
|
||||
hwstrap |= P5_INTF_DIS_S;
|
||||
} else {
|
||||
p5mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
|
||||
MAC_MODE | MAC_TX_EN | MAC_RX_EN |
|
||||
BKOFF_EN | BACKPR_EN;
|
||||
|
||||
if (gsw->port5_cfg.force_link) {
|
||||
p5mcr |= FORCE_MODE | FORCE_LINK | FORCE_RX_FC |
|
||||
FORCE_TX_FC;
|
||||
p5mcr |= gsw->port5_cfg.speed << FORCE_SPD_S;
|
||||
|
||||
if (gsw->port5_cfg.duplex)
|
||||
p5mcr |= FORCE_DPX;
|
||||
}
|
||||
|
||||
switch (gsw->port5_cfg.phy_mode) {
|
||||
case PHY_INTERFACE_MODE_MII:
|
||||
case PHY_INTERFACE_MODE_GMII:
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
hwstrap |= P5_INTF_MODE_RGMII;
|
||||
break;
|
||||
default:
|
||||
dev_info(gsw->dev, "%s is not supported by port5\n",
|
||||
phy_modes(gsw->port5_cfg.phy_mode));
|
||||
p5mcr = FORCE_MODE;
|
||||
hwstrap |= P5_INTF_DIS_S;
|
||||
}
|
||||
|
||||
/* Port5 to PHY direct mode */
|
||||
if (of_property_read_u32(gsw->port5_cfg.np, "phy-address",
|
||||
&phyad))
|
||||
goto parse_p6;
|
||||
|
||||
if (phyad != 0 && phyad != 4) {
|
||||
dev_info(gsw->dev,
|
||||
"Only PHY 0/4 can be connected to Port 5\n");
|
||||
goto parse_p6;
|
||||
}
|
||||
|
||||
hwstrap &= ~P5_INTF_SEL_GMAC5;
|
||||
if (phyad == 0)
|
||||
hwstrap |= P5_PHY0_SEL;
|
||||
else
|
||||
hwstrap &= ~P5_PHY0_SEL;
|
||||
}
|
||||
|
||||
parse_p6:
|
||||
if (!gsw->port6_cfg.enabled) {
|
||||
p6mcr = FORCE_MODE;
|
||||
hwstrap |= P6_INTF_DIS;
|
||||
} else {
|
||||
p6mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
|
||||
MAC_MODE | MAC_TX_EN | MAC_RX_EN |
|
||||
BKOFF_EN | BACKPR_EN;
|
||||
|
||||
if (gsw->port6_cfg.force_link) {
|
||||
p6mcr |= FORCE_MODE | FORCE_LINK | FORCE_RX_FC |
|
||||
FORCE_TX_FC;
|
||||
p6mcr |= gsw->port6_cfg.speed << FORCE_SPD_S;
|
||||
|
||||
if (gsw->port6_cfg.duplex)
|
||||
p6mcr |= FORCE_DPX;
|
||||
}
|
||||
|
||||
switch (gsw->port6_cfg.phy_mode) {
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
p6ecr = BIT(1);
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_TRGMII:
|
||||
/* set MT7530 central align */
|
||||
p6ecr = BIT(0);
|
||||
break;
|
||||
default:
|
||||
dev_info(gsw->dev, "%s is not supported by port6\n",
|
||||
phy_modes(gsw->port6_cfg.phy_mode));
|
||||
p6mcr = FORCE_MODE;
|
||||
hwstrap |= P6_INTF_DIS;
|
||||
}
|
||||
}
|
||||
|
||||
mt753x_reg_write(gsw, MHWSTRAP, hwstrap);
|
||||
mt753x_reg_write(gsw, P6ECR, p6ecr);
|
||||
|
||||
mt753x_reg_write(gsw, PMCR(5), p5mcr);
|
||||
mt753x_reg_write(gsw, PMCR(6), p6mcr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mt7530_core_pll_setup(struct gsw_mt753x *gsw)
|
||||
{
|
||||
u32 hwstrap;
|
||||
|
||||
hwstrap = mt753x_reg_read(gsw, HWSTRAP);
|
||||
|
||||
switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
|
||||
case XTAL_40MHZ:
|
||||
/* Disable MT7530 core clock */
|
||||
mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, 0);
|
||||
|
||||
/* disable MT7530 PLL */
|
||||
mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_1,
|
||||
(2 << GSWPLL_POSTDIV_200M_S) |
|
||||
(32 << GSWPLL_FBKDIV_200M_S));
|
||||
|
||||
/* For MT7530 core clock = 500Mhz */
|
||||
mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_2,
|
||||
(1 << GSWPLL_POSTDIV_500M_S) |
|
||||
(25 << GSWPLL_FBKDIV_500M_S));
|
||||
|
||||
/* Enable MT7530 PLL */
|
||||
mt7530_core_reg_write(gsw, CORE_GSWPLL_GCR_1,
|
||||
(2 << GSWPLL_POSTDIV_200M_S) |
|
||||
(32 << GSWPLL_FBKDIV_200M_S) |
|
||||
GSWPLL_EN_PRE);
|
||||
|
||||
usleep_range(20, 40);
|
||||
|
||||
/* Enable MT7530 core clock */
|
||||
mt7530_core_reg_write(gsw, TRGMII_GSW_CLK_CG, GSWCK_EN);
|
||||
break;
|
||||
default:
|
||||
/* TODO: PLL settings for 20/25MHz */
|
||||
break;
|
||||
}
|
||||
|
||||
hwstrap = mt753x_reg_read(gsw, HWSTRAP);
|
||||
hwstrap |= CHG_TRAP;
|
||||
if (gsw->direct_phy_access)
|
||||
hwstrap &= ~C_MDIO_BPS_S;
|
||||
else
|
||||
hwstrap |= C_MDIO_BPS_S;
|
||||
|
||||
mt753x_reg_write(gsw, MHWSTRAP, hwstrap);
|
||||
|
||||
if (gsw->port6_cfg.enabled &&
|
||||
gsw->port6_cfg.phy_mode == PHY_INTERFACE_MODE_TRGMII) {
|
||||
mt7530_trgmii_setting(gsw);
|
||||
} else {
|
||||
/* RGMII */
|
||||
mt7530_rgmii_setting(gsw);
|
||||
}
|
||||
|
||||
/* delay setting for 10/1000M */
|
||||
mt753x_reg_write(gsw, P5RGMIIRXCR,
|
||||
CSR_RGMII_EDGE_ALIGN |
|
||||
(2 << CSR_RGMII_RXC_0DEG_CFG_S));
|
||||
mt753x_reg_write(gsw, P5RGMIITXCR, 0x14 << CSR_RGMII_TXC_CFG_S);
|
||||
}
|
||||
|
||||
static int mt7530_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
|
||||
{
|
||||
u32 rev;
|
||||
|
||||
rev = mt753x_reg_read(gsw, CHIP_REV);
|
||||
|
||||
if (((rev & CHIP_NAME_M) >> CHIP_NAME_S) == MT7530) {
|
||||
if (crev) {
|
||||
crev->rev = rev & CHIP_REV_M;
|
||||
crev->name = "MT7530";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void mt7530_phy_setting(struct gsw_mt753x *gsw)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
for (i = 0; i < MT753X_NUM_PHYS; i++) {
|
||||
/* Disable EEE */
|
||||
gsw->mmd_write(gsw, i, PHY_DEV07, PHY_DEV07_REG_03C, 0);
|
||||
|
||||
/* Enable HW auto downshift */
|
||||
gsw->mii_write(gsw, i, 0x1f, 0x1);
|
||||
val = gsw->mii_read(gsw, i, PHY_EXT_REG_14);
|
||||
val |= PHY_EN_DOWN_SHFIT;
|
||||
gsw->mii_write(gsw, i, PHY_EXT_REG_14, val);
|
||||
|
||||
/* Increase SlvDPSready time */
|
||||
gsw->mii_write(gsw, i, 0x1f, 0x52b5);
|
||||
gsw->mii_write(gsw, i, PHY_TR_REG_10, 0xafae);
|
||||
gsw->mii_write(gsw, i, PHY_TR_REG_12, 0x2f);
|
||||
gsw->mii_write(gsw, i, PHY_TR_REG_10, 0x8fae);
|
||||
|
||||
/* Increase post_update_timer */
|
||||
gsw->mii_write(gsw, i, 0x1f, 0x3);
|
||||
gsw->mii_write(gsw, i, PHY_LPI_REG_11, 0x4b);
|
||||
gsw->mii_write(gsw, i, 0x1f, 0);
|
||||
|
||||
/* Adjust 100_mse_threshold */
|
||||
gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_123, 0xffff);
|
||||
|
||||
/* Disable mcc */
|
||||
gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_A6, 0x300);
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool get_phy_access_mode(const struct device_node *np)
|
||||
{
|
||||
return of_property_read_bool(np, "mt7530,direct-phy-access");
|
||||
}
|
||||
|
||||
static int mt7530_sw_init(struct gsw_mt753x *gsw)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
gsw->direct_phy_access = get_phy_access_mode(gsw->dev->of_node);
|
||||
|
||||
/* Force MT7530 to use (in)direct PHY access */
|
||||
val = mt753x_reg_read(gsw, HWSTRAP);
|
||||
val |= CHG_TRAP;
|
||||
if (gsw->direct_phy_access)
|
||||
val &= ~C_MDIO_BPS_S;
|
||||
else
|
||||
val |= C_MDIO_BPS_S;
|
||||
mt753x_reg_write(gsw, MHWSTRAP, val);
|
||||
|
||||
/* Read PHY address base from HWSTRAP */
|
||||
gsw->phy_base = (((val & SMI_ADDR_M) >> SMI_ADDR_S) << 3) + 8;
|
||||
gsw->phy_base &= MT753X_SMI_ADDR_MASK;
|
||||
|
||||
if (gsw->direct_phy_access) {
|
||||
gsw->mii_read = mt7530_mii_read;
|
||||
gsw->mii_write = mt7530_mii_write;
|
||||
gsw->mmd_read = mt7530_mmd_read;
|
||||
gsw->mmd_write = mt7530_mmd_write;
|
||||
} else {
|
||||
gsw->mii_read = mt753x_mii_read;
|
||||
gsw->mii_write = mt753x_mii_write;
|
||||
gsw->mmd_read = mt753x_mmd_ind_read;
|
||||
gsw->mmd_write = mt753x_mmd_ind_write;
|
||||
}
|
||||
|
||||
for (i = 0; i < MT753X_NUM_PHYS; i++) {
|
||||
val = gsw->mii_read(gsw, i, MII_BMCR);
|
||||
val |= BMCR_PDOWN;
|
||||
gsw->mii_write(gsw, i, MII_BMCR, val);
|
||||
}
|
||||
|
||||
/* Force MAC link down before reset */
|
||||
mt753x_reg_write(gsw, PMCR(5), FORCE_MODE);
|
||||
mt753x_reg_write(gsw, PMCR(6), FORCE_MODE);
|
||||
|
||||
/* Switch soft reset */
|
||||
/* BUG: sw reset causes gsw int flooding */
|
||||
mt753x_reg_write(gsw, SYS_CTRL, SW_PHY_RST | SW_SYS_RST | SW_REG_RST);
|
||||
usleep_range(10, 20);
|
||||
|
||||
/* global mac control settings configuration */
|
||||
mt753x_reg_write(gsw, GMACCR,
|
||||
LATE_COL_DROP | (15 << MTCC_LMT_S) |
|
||||
(2 << MAX_RX_JUMBO_S) | RX_PKT_LEN_MAX_JUMBO);
|
||||
|
||||
/* Output INTR selected */
|
||||
val = mt753x_reg_read(gsw, TOP_SIG_CTRL);
|
||||
val &= ~OUTPUT_INTR_M;
|
||||
val |= (3 << OUTPUT_INTR_S);
|
||||
mt753x_reg_write(gsw, TOP_SIG_CTRL, val);
|
||||
|
||||
mt7530_core_pll_setup(gsw);
|
||||
mt7530_mac_port_setup(gsw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt7530_sw_post_init(struct gsw_mt753x *gsw)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
mt7530_phy_setting(gsw);
|
||||
|
||||
for (i = 0; i < MT753X_NUM_PHYS; i++) {
|
||||
val = gsw->mii_read(gsw, i, MII_BMCR);
|
||||
val &= ~BMCR_PDOWN;
|
||||
gsw->mii_write(gsw, i, MII_BMCR, val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct mt753x_sw_id mt7530_id = {
|
||||
.model = MT7530,
|
||||
.detect = mt7530_sw_detect,
|
||||
.init = mt7530_sw_init,
|
||||
.post_init = mt7530_sw_post_init
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef _MT7530_H_
|
||||
#define _MT7530_H_
|
||||
|
||||
#include "mt753x.h"
|
||||
|
||||
extern struct mt753x_sw_id mt7530_id;
|
||||
|
||||
#endif /* _MT7530_H_ */
|
||||
1058
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.c
Executable file
1058
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt7531.c
Executable file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef _MT7531_H_
|
||||
#define _MT7531_H_
|
||||
|
||||
#include "mt753x.h"
|
||||
|
||||
extern struct mt753x_sw_id mt7531_id;
|
||||
|
||||
#endif /* _MT7531_H_ */
|
||||
224
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt753x.h
Executable file
224
feeds/mediatek-sdk/mediatek-sdk/files-5.4/drivers/net/phy/mtk/mt753x/mt753x.h
Executable file
@@ -0,0 +1,224 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _MT753X_H_
|
||||
#define _MT753X_H_
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/of_mdio.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#ifdef CONFIG_SWCONFIG
|
||||
#include <linux/switch.h>
|
||||
#endif
|
||||
|
||||
#include "mt753x_vlan.h"
|
||||
|
||||
#define MT753X_DFL_CPU_PORT 6
|
||||
#define MT753X_NUM_PHYS 5
|
||||
|
||||
#define MT753X_DFL_SMI_ADDR 0x1f
|
||||
#define MT753X_SMI_ADDR_MASK 0x1f
|
||||
|
||||
struct gsw_mt753x;
|
||||
|
||||
enum mt753x_model {
|
||||
MT7530 = 0x7530,
|
||||
MT7531 = 0x7531
|
||||
};
|
||||
|
||||
struct mt753x_port_cfg {
|
||||
struct device_node *np;
|
||||
int phy_mode;
|
||||
u32 enabled: 1;
|
||||
u32 force_link: 1;
|
||||
u32 speed: 2;
|
||||
u32 duplex: 1;
|
||||
bool ssc_on;
|
||||
bool stag_on;
|
||||
};
|
||||
|
||||
struct mt753x_phy {
|
||||
struct gsw_mt753x *gsw;
|
||||
struct net_device netdev;
|
||||
struct phy_device *phydev;
|
||||
};
|
||||
|
||||
struct gsw_mt753x {
|
||||
u32 id;
|
||||
|
||||
struct device *dev;
|
||||
struct mii_bus *host_bus;
|
||||
struct mii_bus *gphy_bus;
|
||||
struct mutex mii_lock; /* MII access lock */
|
||||
u32 smi_addr;
|
||||
u32 phy_base;
|
||||
int direct_phy_access;
|
||||
|
||||
enum mt753x_model model;
|
||||
const char *name;
|
||||
|
||||
struct mt753x_port_cfg port5_cfg;
|
||||
struct mt753x_port_cfg port6_cfg;
|
||||
|
||||
bool hw_phy_cal;
|
||||
bool phy_status_poll;
|
||||
struct mt753x_phy phys[MT753X_NUM_PHYS];
|
||||
// int phy_irqs[PHY_MAX_ADDR]; //FIXME
|
||||
|
||||
int phy_link_sts;
|
||||
|
||||
int irq;
|
||||
int reset_pin;
|
||||
struct work_struct irq_worker;
|
||||
|
||||
#ifdef CONFIG_SWCONFIG
|
||||
struct switch_dev swdev;
|
||||
u32 cpu_port;
|
||||
#endif
|
||||
|
||||
int global_vlan_enable;
|
||||
struct mt753x_vlan_entry vlan_entries[MT753X_NUM_VLANS];
|
||||
struct mt753x_port_entry port_entries[MT753X_NUM_PORTS];
|
||||
|
||||
int (*mii_read)(struct gsw_mt753x *gsw, int phy, int reg);
|
||||
void (*mii_write)(struct gsw_mt753x *gsw, int phy, int reg, u16 val);
|
||||
|
||||
int (*mmd_read)(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
|
||||
void (*mmd_write)(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
|
||||
u16 val);
|
||||
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct chip_rev {
|
||||
const char *name;
|
||||
u32 rev;
|
||||
};
|
||||
|
||||
struct mt753x_sw_id {
|
||||
enum mt753x_model model;
|
||||
int (*detect)(struct gsw_mt753x *gsw, struct chip_rev *crev);
|
||||
int (*init)(struct gsw_mt753x *gsw);
|
||||
int (*post_init)(struct gsw_mt753x *gsw);
|
||||
};
|
||||
|
||||
extern struct list_head mt753x_devs;
|
||||
|
||||
struct gsw_mt753x *mt753x_get_gsw(u32 id);
|
||||
struct gsw_mt753x *mt753x_get_first_gsw(void);
|
||||
void mt753x_put_gsw(void);
|
||||
void mt753x_lock_gsw(void);
|
||||
|
||||
u32 mt753x_reg_read(struct gsw_mt753x *gsw, u32 reg);
|
||||
void mt753x_reg_write(struct gsw_mt753x *gsw, u32 reg, u32 val);
|
||||
|
||||
int mt753x_mii_read(struct gsw_mt753x *gsw, int phy, int reg);
|
||||
void mt753x_mii_write(struct gsw_mt753x *gsw, int phy, int reg, u16 val);
|
||||
|
||||
int mt753x_mmd_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
|
||||
void mt753x_mmd_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
|
||||
u16 val);
|
||||
|
||||
int mt753x_mmd_ind_read(struct gsw_mt753x *gsw, int addr, int devad, u16 reg);
|
||||
void mt753x_mmd_ind_write(struct gsw_mt753x *gsw, int addr, int devad, u16 reg,
|
||||
u16 val);
|
||||
|
||||
int mt753x_tr_read(struct gsw_mt753x *gsw, int addr, u8 ch, u8 node, u8 daddr);
|
||||
void mt753x_tr_write(struct gsw_mt753x *gsw, int addr, u8 ch, u8 node, u8 daddr,
|
||||
u32 data);
|
||||
|
||||
void mt753x_irq_worker(struct work_struct *work);
|
||||
void mt753x_irq_enable(struct gsw_mt753x *gsw);
|
||||
|
||||
int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr);
|
||||
int extphy_init(struct gsw_mt753x *gsw, int addr);
|
||||
|
||||
/* MDIO Indirect Access Registers */
|
||||
#define MII_MMD_ACC_CTL_REG 0x0d
|
||||
#define MMD_CMD_S 14
|
||||
#define MMD_CMD_M 0xc000
|
||||
#define MMD_DEVAD_S 0
|
||||
#define MMD_DEVAD_M 0x1f
|
||||
|
||||
/* MMD_CMD: MMD commands */
|
||||
#define MMD_ADDR 0
|
||||
#define MMD_DATA 1
|
||||
|
||||
#define MII_MMD_ADDR_DATA_REG 0x0e
|
||||
|
||||
/* Procedure of MT753x Internal Register Access
|
||||
*
|
||||
* 1. Internal Register Address
|
||||
*
|
||||
* The MT753x has a 16-bit register address and each register is 32-bit.
|
||||
* This means the lowest two bits are not used as the register address is
|
||||
* 4-byte aligned.
|
||||
*
|
||||
* Rest of the valid bits are divided into two parts:
|
||||
* Bit 15..6 is the Page address
|
||||
* Bit 5..2 is the low address
|
||||
*
|
||||
* -------------------------------------------------------------------
|
||||
* | 15 14 13 12 11 10 9 8 7 6 | 5 4 3 2 | 1 0 |
|
||||
* |----------------------------------------|---------------|--------|
|
||||
* | Page Address | Address | Unused |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
* 2. MDIO access timing
|
||||
*
|
||||
* The MT753x uses the following MDIO timing for a single register read
|
||||
*
|
||||
* Phase 1: Write Page Address
|
||||
* -------------------------------------------------------------------
|
||||
* | ST | OP | PHY_ADDR | TYPE | RSVD | TA | RSVD | PAGE_ADDR |
|
||||
* -------------------------------------------------------------------
|
||||
* | 01 | 01 | 11111 | 1 | 1111 | xx | 00000 | REG_ADDR[15..6] |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
* Phase 2: Write low Address & Read low word
|
||||
* -------------------------------------------------------------------
|
||||
* | ST | OP | PHY_ADDR | TYPE | LOW_ADDR | TA | DATA |
|
||||
* -------------------------------------------------------------------
|
||||
* | 01 | 10 | 11111 | 0 | REG_ADDR[5..2] | xx | DATA[15..0] |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
* Phase 3: Read high word
|
||||
* -------------------------------------------------------------------
|
||||
* | ST | OP | PHY_ADDR | TYPE | RSVD | TA | DATA |
|
||||
* -------------------------------------------------------------------
|
||||
* | 01 | 10 | 11111 | 1 | 0000 | xx | DATA[31..16] |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
* The MT753x uses the following MDIO timing for a single register write
|
||||
*
|
||||
* Phase 1: Write Page Address (The same as read)
|
||||
*
|
||||
* Phase 2: Write low Address and low word
|
||||
* -------------------------------------------------------------------
|
||||
* | ST | OP | PHY_ADDR | TYPE | LOW_ADDR | TA | DATA |
|
||||
* -------------------------------------------------------------------
|
||||
* | 01 | 01 | 11111 | 0 | REG_ADDR[5..2] | xx | DATA[15..0] |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
* Phase 3: write high word
|
||||
* -------------------------------------------------------------------
|
||||
* | ST | OP | PHY_ADDR | TYPE | RSVD | TA | DATA |
|
||||
* -------------------------------------------------------------------
|
||||
* | 01 | 01 | 11111 | 1 | 0000 | xx | DATA[31..16] |
|
||||
* -------------------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
|
||||
/* Internal Register Address fields */
|
||||
#define MT753X_REG_PAGE_ADDR_S 6
|
||||
#define MT753X_REG_PAGE_ADDR_M 0xffc0
|
||||
#define MT753X_REG_ADDR_S 2
|
||||
#define MT753X_REG_ADDR_M 0x3c
|
||||
#endif /* _MT753X_H_ */
|
||||
@@ -0,0 +1,90 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2018 MediaTek Inc.
|
||||
* Author: Weijie Gao <weijie.gao@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "mt753x.h"
|
||||
#include "mt753x_regs.h"
|
||||
|
||||
void mt753x_irq_enable(struct gsw_mt753x *gsw)
|
||||
{
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
/* Record initial PHY link status */
|
||||
for (i = 0; i < MT753X_NUM_PHYS; i++) {
|
||||
val = gsw->mii_read(gsw, i, MII_BMSR);
|
||||
if (val & BMSR_LSTATUS)
|
||||
gsw->phy_link_sts |= BIT(i);
|
||||
}
|
||||
|
||||
val = BIT(MT753X_NUM_PHYS) - 1;
|
||||
|
||||
mt753x_reg_write(gsw, SYS_INT_EN, val);
|
||||
}
|
||||
|
||||
static void display_port_link_status(struct gsw_mt753x *gsw, u32 port)
|
||||
{
|
||||
u32 pmsr, speed_bits;
|
||||
const char *speed;
|
||||
|
||||
pmsr = mt753x_reg_read(gsw, PMSR(port));
|
||||
|
||||
speed_bits = (pmsr & MAC_SPD_STS_M) >> MAC_SPD_STS_S;
|
||||
|
||||
switch (speed_bits) {
|
||||
case MAC_SPD_10:
|
||||
speed = "10Mbps";
|
||||
break;
|
||||
case MAC_SPD_100:
|
||||
speed = "100Mbps";
|
||||
break;
|
||||
case MAC_SPD_1000:
|
||||
speed = "1Gbps";
|
||||
break;
|
||||
case MAC_SPD_2500:
|
||||
speed = "2.5Gbps";
|
||||
break;
|
||||
}
|
||||
|
||||
if (pmsr & MAC_LNK_STS) {
|
||||
dev_info(gsw->dev, "Port %d Link is Up - %s/%s\n",
|
||||
port, speed, (pmsr & MAC_DPX_STS) ? "Full" : "Half");
|
||||
} else {
|
||||
dev_info(gsw->dev, "Port %d Link is Down\n", port);
|
||||
}
|
||||
}
|
||||
|
||||
void mt753x_irq_worker(struct work_struct *work)
|
||||
{
|
||||
struct gsw_mt753x *gsw;
|
||||
u32 sts, physts, laststs;
|
||||
int i;
|
||||
|
||||
gsw = container_of(work, struct gsw_mt753x, irq_worker);
|
||||
|
||||
sts = mt753x_reg_read(gsw, SYS_INT_STS);
|
||||
|
||||
/* Check for changed PHY link status */
|
||||
for (i = 0; i < MT753X_NUM_PHYS; i++) {
|
||||
if (!(sts & PHY_LC_INT(i)))
|
||||
continue;
|
||||
|
||||
laststs = gsw->phy_link_sts & BIT(i);
|
||||
physts = !!(gsw->mii_read(gsw, i, MII_BMSR) & BMSR_LSTATUS);
|
||||
physts <<= i;
|
||||
|
||||
if (physts ^ laststs) {
|
||||
gsw->phy_link_sts ^= BIT(i);
|
||||
display_port_link_status(gsw, i);
|
||||
}
|
||||
}
|
||||
|
||||
mt753x_reg_write(gsw, SYS_INT_STS, sts);
|
||||
|
||||
enable_irq(gsw->irq);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user