ath79: add new OF only target for QCA MIPS silicon
This target aims to replace ar71xx mid-term. The big part that is still missing is making the MMIO/AHB wifi work using OF. NAND and mikrotik subtargets will follow. Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		| @@ -90,6 +90,25 @@ endef | ||||
| $(eval $(call KernelPackage,usb-phy-qcom-dwc3)) | ||||
|  | ||||
|  | ||||
| define KernelPackage/phy-ath79-usb | ||||
|   TITLE:=Support for ATH79 USB PHY | ||||
|   KCONFIG:=CONFIG_PHY_AR7100_USB \ | ||||
| 	CONFIG_PHY_AR7200_USB | ||||
|   DEPENDS:=@TARGET_ath79 | ||||
|   HIDDEN:=1 | ||||
|   FILES:=$(LINUX_DIR)/drivers/phy/phy-ar7100-usb.ko \ | ||||
| 	$(LINUX_DIR)/drivers/phy/phy-ar7200-usb.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,21,phy-ar7100-usb phy-ar7200-usb,1) | ||||
|   $(call AddDepends/usb) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/phy-ath79-usb/description | ||||
|   Support for ATH79 USB transceiver | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,phy-ath79-usb)) | ||||
|  | ||||
|  | ||||
| define KernelPackage/usb-gadget | ||||
|   TITLE:=USB Gadget support | ||||
|   KCONFIG:=CONFIG_USB_GADGET | ||||
| @@ -313,6 +332,7 @@ define KernelPackage/usb2 | ||||
| 	+TARGET_brcm47xx:kmod-usb-ssb \ | ||||
| 	+TARGET_bcm53xx:kmod-usb-bcma \ | ||||
| 	+TARGET_bcm53xx:kmod-phy-bcm-ns-usb2 \ | ||||
| 	+TARGET_ath79:kmod-phy-ath79-usb \ | ||||
| 	+kmod-usb-ehci | ||||
|   KCONFIG:=\ | ||||
| 	CONFIG_USB_EHCI_HCD_PLATFORM \ | ||||
| @@ -1492,7 +1512,7 @@ $(eval $(call KernelPackage,usbip-server)) | ||||
|  | ||||
| define KernelPackage/usb-chipidea | ||||
|   TITLE:=Host and device support for Chipidea controllers | ||||
|   DEPENDS:=+USB_GADGET_SUPPORT:kmod-usb-gadget @TARGET_ar71xx +kmod-usb-ehci +kmod-usb-phy-nop | ||||
|   DEPENDS:=+USB_GADGET_SUPPORT:kmod-usb-gadget @TARGET_ar71xx||TARGET_ath79 +kmod-usb-ehci +kmod-usb-phy-nop | ||||
|   KCONFIG:= \ | ||||
| 	CONFIG_EXTCON \ | ||||
| 	CONFIG_USB_CHIPIDEA \ | ||||
| @@ -1513,6 +1533,31 @@ endef | ||||
|  | ||||
| $(eval $(call KernelPackage,usb-chipidea)) | ||||
|  | ||||
|  | ||||
| define KernelPackage/usb-chipidea2 | ||||
|   TITLE:=Host and device support for Chipidea2 controllers | ||||
|   DEPENDS:=+USB_GADGET_SUPPORT:kmod-usb-gadget @TARGET_ar71xx||TARGET_ath79 +kmod-usb-ehci +kmod-usb-phy-nop | ||||
|   KCONFIG:= \ | ||||
| 	CONFIG_EXTCON \ | ||||
| 	CONFIG_USB_CHIPIDEA \ | ||||
| 	CONFIG_USB_CHIPIDEA_HOST=y \ | ||||
| 	CONFIG_USB_CHIPIDEA_UDC=y \ | ||||
| 	CONFIG_USB_CHIPIDEA_DEBUG=y | ||||
|   FILES:= \ | ||||
| 	$(LINUX_DIR)/drivers/extcon/extcon.ko@lt4.9 \ | ||||
| 	$(LINUX_DIR)/drivers/extcon/extcon-core.ko@ge4.9 \ | ||||
| 	$(LINUX_DIR)/drivers/usb/chipidea/ci_hdrc_usb2.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,39,ci_hdrc_usb2,1) | ||||
|   $(call AddDepends/usb) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/usb-chipidea2/description | ||||
|  Kernel support for USB Chipidea controllers | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,usb-chipidea2)) | ||||
|  | ||||
|  | ||||
| define KernelPackage/usbmon | ||||
|   TITLE:=USB traffic monitor | ||||
|   KCONFIG:=CONFIG_USB_MON | ||||
|   | ||||
							
								
								
									
										19
									
								
								target/linux/ath79/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								target/linux/ath79/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| ARCH:=mips | ||||
| BOARD:=ath79 | ||||
| BOARDNAME:=Atheros ATH79 (DTS) | ||||
| CPU_TYPE:=24kc | ||||
| SUBTARGETS:=generic | ||||
|  | ||||
| FEATURES:=ramdisk source-only | ||||
|  | ||||
| KERNEL_PATCHVER:=4.14 | ||||
|  | ||||
| include $(INCLUDE_DIR)/target.mk | ||||
|  | ||||
| DEFAULT_PACKAGES += \ | ||||
| 	kmod-gpio-button-hotplug swconfig \ | ||||
| 	kmod-ath9k wpad-mini uboot-envtools | ||||
|  | ||||
| $(eval $(call BuildTarget)) | ||||
							
								
								
									
										21
									
								
								target/linux/ath79/base-files/etc/board.d/01_leds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								target/linux/ath79/base-files/etc/board.d/01_leds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . /lib/functions/uci-defaults.sh | ||||
|  | ||||
| board_config_update | ||||
|  | ||||
| board=$(board_name) | ||||
|  | ||||
| case "$board" in | ||||
| "glinet,ar150") | ||||
| 	ucidef_set_led_wlan "wlan" "WLAN" "gl-ar150:orange:wlan" "phy0tpt" | ||||
| 	;; | ||||
| "tplink,tl-wr1043nd-v1") | ||||
| 	ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" | ||||
| 	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| board_config_flush | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										44
									
								
								target/linux/ath79/base-files/etc/board.d/02_network
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								target/linux/ath79/base-files/etc/board.d/02_network
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . /lib/functions/system.sh | ||||
| . /lib/functions/uci-defaults.sh | ||||
|  | ||||
| ath79_setup_interfaces() | ||||
| { | ||||
| 	local board="$1" | ||||
|  | ||||
| 	case "$board" in | ||||
| 	"ubnt,unifi") | ||||
| 		ucidef_set_interface_lan "eth0" | ||||
| 		;; | ||||
|  | ||||
| 	"tplink,tl-wr1043nd-v1") | ||||
| 		ucidef_add_switch "switch0" \ | ||||
| 			"1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "5@eth0" | ||||
| 		;; | ||||
| 	"netgear,wndr3800") | ||||
| 		ucidef_set_interfaces_lan_wan "eth0" "eth1" | ||||
| 		ucidef_add_switch "switch0" \ | ||||
| 			"0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "5u@eth0" | ||||
|  | ||||
| 		ucidef_add_switch_attr "switch0" "blinkrate" 2 | ||||
| 		ucidef_add_switch_port_attr "switch0" 1 led 6 | ||||
| 		ucidef_add_switch_port_attr "switch0" 2 led 9 | ||||
| 		ucidef_add_switch_port_attr "switch0" 5 led 2 | ||||
| 		;; | ||||
| 	"buffalo,wzr-hp-g450h") | ||||
| 		ucidef_add_switch "switch0" \ | ||||
| 			"0@eth0" "2:lan" "3:lan" "4:lan" "5:lan" "1:wan" | ||||
| 		;; | ||||
| 	*) | ||||
| 		ucidef_set_interfaces_lan_wan "eth0" "eth1" | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
|  | ||||
| board_config_update | ||||
| board=$(board_name) | ||||
| ath79_setup_interfaces $board | ||||
| board_config_flush | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										38
									
								
								target/linux/ath79/base-files/etc/diag.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								target/linux/ath79/base-files/etc/diag.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . /lib/functions/leds.sh | ||||
|  | ||||
| get_status_led() { | ||||
| 	local board=$(board_name) | ||||
|  | ||||
| 	case $board in | ||||
| 	"glinet,ar150") | ||||
| 		status_led="gl-ar150:orange:wlan" | ||||
| 		;; | ||||
| 	"tplink,tl-wr1043nd-v1") | ||||
| 		status_led="tp-link:green:system" | ||||
| 		;; | ||||
| 	"ubnt,unifi") | ||||
| 		status_led="ubnt:green:dome" | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
|  | ||||
| set_state() { | ||||
| 	get_status_led | ||||
|  | ||||
| 	case "$1" in | ||||
| 	preinit) | ||||
| 		status_led_blink_preinit | ||||
| 		;; | ||||
| 	failsafe) | ||||
| 		status_led_blink_failsafe | ||||
| 		;; | ||||
| 	preinit_regular) | ||||
| 		status_led_blink_preinit_regular | ||||
| 		;; | ||||
| 	done) | ||||
| 		status_led_on | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
| @@ -0,0 +1,40 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| [ -e /lib/firmware/$FIRMWARE ] && exit 0 | ||||
|  | ||||
| . /lib/functions.sh | ||||
| . /lib/functions/system.sh | ||||
|  | ||||
| ath9k_eeprom_die() { | ||||
| 	echo "ath9k eeprom: " "$*" | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| ath9k_eeprom_extract() { | ||||
| 	local part=$1 | ||||
| 	local offset=$2 | ||||
| 	local count=$3 | ||||
| 	local mtd | ||||
|  | ||||
| 	mtd=$(find_mtd_chardev $part) | ||||
| 	[ -n "$mtd" ] || \ | ||||
| 		ath9k_eeprom_die "no mtd device found for partition $part" | ||||
|  | ||||
| 	dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ | ||||
| 		ath9k_eeprom_die "failed to extract from $mtd" | ||||
| } | ||||
|  | ||||
| board=$(board_name) | ||||
|  | ||||
| case "$FIRMWARE" in | ||||
| "ath9k-eeprom-pci-0000:00:00.0.bin") | ||||
| 	case $board in | ||||
| 	"ubnt,unifi") | ||||
| 		ath9k_eeprom_extract "art" 4096 2048 | ||||
| 		;; | ||||
| 	*) | ||||
| 		ath9k_eeprom_die "board $board is not supported yet" | ||||
| 		;; | ||||
| 	esac | ||||
| 	;; | ||||
| esac | ||||
| @@ -0,0 +1,58 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| ath10kcal_die() { | ||||
| 	echo "ath10cal: " "$*" | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| ath10kcal_from_file() { | ||||
| 	local source=$1 | ||||
| 	local offset=$2 | ||||
| 	local count=$3 | ||||
|  | ||||
| 	dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ | ||||
| 		ath10kcal_die "failed to extract calibration data from $source" | ||||
| } | ||||
|  | ||||
| ath10kcal_extract() { | ||||
| 	local part=$1 | ||||
| 	local offset=$2 | ||||
| 	local count=$3 | ||||
| 	local mtd | ||||
|  | ||||
| 	mtd=$(find_mtd_chardev $part) | ||||
| 	[ -n "$mtd" ] || \ | ||||
| 		ath10kcal_die "no mtd device found for partition $part" | ||||
|  | ||||
| 	dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ | ||||
| 		ath10kcal_die "failed to extract calibration data from $mtd" | ||||
| } | ||||
|  | ||||
| ath10kcal_patch_mac() { | ||||
| 	local mac=$1 | ||||
|  | ||||
| 	[ -z "$mac" ] && return | ||||
|  | ||||
| 	macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6 | ||||
| } | ||||
|  | ||||
| [ -e /lib/firmware/$FIRMWARE ] && exit 0 | ||||
|  | ||||
| . /lib/functions.sh | ||||
| . /lib/functions/system.sh | ||||
|  | ||||
| board=$(board_name) | ||||
|  | ||||
| case "$FIRMWARE" in | ||||
| "ath10k/cal-pci-0000:00:00.0.bin") | ||||
| 	case $board in | ||||
| 	openmesh,om5p-ac-v2) | ||||
| 		ath10kcal_extract "ART" 20480 2116 | ||||
| 		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) | ||||
| 		;; | ||||
| 	esac | ||||
| 	;; | ||||
| *) | ||||
| 	exit 1 | ||||
| 	;; | ||||
| esac | ||||
							
								
								
									
										224
									
								
								target/linux/ath79/base-files/lib/upgrade/platform.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								target/linux/ath79/base-files/lib/upgrade/platform.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,224 @@ | ||||
| # | ||||
| # Copyright (C) 2011 OpenWrt.org | ||||
| # | ||||
|  | ||||
| . /lib/functions/system.sh | ||||
|  | ||||
| PART_NAME=firmware | ||||
| RAMFS_COPY_BIN='nandwrite' | ||||
|  | ||||
| CI_BLKSZ=65536 | ||||
| CI_LDADR=0x80060000 | ||||
|  | ||||
| PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0 | ||||
|  | ||||
| platform_find_partitions() { | ||||
| 	local first dev size erasesize name | ||||
| 	while read dev size erasesize name; do | ||||
| 		name=${name#'"'}; name=${name%'"'} | ||||
| 		case "$name" in | ||||
| 			vmlinux.bin.l7|vmlinux|kernel|linux|linux.bin|rootfs|filesystem) | ||||
| 				if [ -z "$first" ]; then | ||||
| 					first="$name" | ||||
| 				else | ||||
| 					echo "$erasesize:$first:$name" | ||||
| 					break | ||||
| 				fi | ||||
| 			;; | ||||
| 		esac | ||||
| 	done < /proc/mtd | ||||
| } | ||||
|  | ||||
| platform_find_kernelpart() { | ||||
| 	local part | ||||
| 	for part in "${1%:*}" "${1#*:}"; do | ||||
| 		case "$part" in | ||||
| 			vmlinux.bin.l7|vmlinux|kernel|linux|linux.bin) | ||||
| 				echo "$part" | ||||
| 				break | ||||
| 			;; | ||||
| 		esac | ||||
| 	done | ||||
| } | ||||
|  | ||||
| platform_find_rootfspart() { | ||||
| 	local part | ||||
| 	for part in "${1%:*}" "${1#*:}"; do | ||||
| 		[ "$part" != "$2" ] && echo "$part" && break | ||||
| 	done | ||||
| } | ||||
|  | ||||
| platform_do_upgrade_combined() { | ||||
| 	local partitions=$(platform_find_partitions) | ||||
| 	local kernelpart=$(platform_find_kernelpart "${partitions#*:}") | ||||
| 	local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}" | ||||
| 	local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null) | ||||
| 	local kern_blocks=$(($kern_length / $CI_BLKSZ)) | ||||
| 	local root_blocks=$((0x$(dd if="$1" bs=2 skip=5 count=4 2>/dev/null) / $CI_BLKSZ)) | ||||
|  | ||||
| 	if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \ | ||||
| 	   [ ${kern_blocks:-0} -gt 0 ] && \ | ||||
| 	   [ ${root_blocks:-0} -gt 0 ] && \ | ||||
| 	   [ ${erase_size:-0} -gt 0 ]; | ||||
| 	then | ||||
| 		local rootfspart=$(platform_find_rootfspart "$partitions" "$kernelpart") | ||||
| 		local append="" | ||||
| 		[ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR" | ||||
|  | ||||
| 		if [ "$PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD" -ne 1 ]; then | ||||
| 		    ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \ | ||||
| 		      dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \ | ||||
| 			    mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions | ||||
| 		elif [ -n "$rootfspart" ]; then | ||||
| 		    dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | \ | ||||
| 			    mtd write - $kernelpart | ||||
| 		    dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \ | ||||
| 			    mtd -r $append write - $rootfspart | ||||
| 		fi | ||||
| 	fi | ||||
| 	PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0 | ||||
| } | ||||
|  | ||||
| tplink_get_image_hwid() { | ||||
| 	get_image "$@" | dd bs=4 count=1 skip=16 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| tplink_get_image_mid() { | ||||
| 	get_image "$@" | dd bs=4 count=1 skip=17 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| tplink_get_image_boot_size() { | ||||
| 	get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| tplink_pharos_check_image() { | ||||
| 	local magic_long="$(get_magic_long "$1")" | ||||
| 	[ "$magic_long" != "7f454c46" ] && { | ||||
| 		echo "Invalid image magic '$magic_long'" | ||||
| 		return 1 | ||||
| 	} | ||||
|  | ||||
| 	local model_string="$(tplink_pharos_get_model_string)" | ||||
| 	local line | ||||
|  | ||||
| 	# Here $1 is given to dd directly instead of get_image as otherwise the skip | ||||
| 	# will take almost a second (as dd can't seek then) | ||||
| 	# | ||||
| 	# This will fail if the image isn't local, but that's fine: as the | ||||
| 	# read loop won't be executed at all, it will return true, so the image | ||||
| 	# is accepted (loading the first 1.5M of a remote image for this check seems | ||||
| 	# a bit extreme) | ||||
| 	dd if="$1" bs=1 skip=1511432 count=1024 2>/dev/null | while read line; do | ||||
| 		[ "$line" = "$model_string" ] && break | ||||
| 	done || { | ||||
| 		echo "Unsupported image (model not in support-list)" | ||||
| 		return 1 | ||||
| 	} | ||||
|  | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| seama_get_type_magic() { | ||||
| 	get_image "$@" | dd bs=1 count=4 skip=53 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| wrgg_get_image_magic() { | ||||
| 	get_image "$@" | dd bs=4 count=1 skip=8 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| cybertan_get_image_magic() { | ||||
| 	get_image "$@" | dd bs=8 count=1 skip=0  2>/dev/null | hexdump -v -n 8 -e '1/1 "%02x"' | ||||
| } | ||||
|  | ||||
| cybertan_check_image() { | ||||
| 	local magic="$(cybertan_get_image_magic "$1")" | ||||
| 	local fw_magic="$(cybertan_get_hw_magic)" | ||||
|  | ||||
| 	[ "$fw_magic" != "$magic" ] && { | ||||
| 		echo "Invalid image, ID mismatch, got:$magic, but need:$fw_magic" | ||||
| 		return 1 | ||||
| 	} | ||||
|  | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| platform_do_upgrade_compex() { | ||||
| 	local fw_file=$1 | ||||
| 	local fw_part=$PART_NAME | ||||
| 	local fw_mtd=$(find_mtd_part $fw_part) | ||||
| 	local fw_length=0x$(dd if="$fw_file" bs=2 skip=1 count=4 2>/dev/null) | ||||
| 	local fw_blocks=$(($fw_length / 65536)) | ||||
|  | ||||
| 	if [ -n "$fw_mtd" ] &&  [ ${fw_blocks:-0} -gt 0 ]; then | ||||
| 		local append="" | ||||
| 		[ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR" | ||||
|  | ||||
| 		sync | ||||
| 		dd if="$fw_file" bs=64k skip=1 count=$fw_blocks 2>/dev/null | \ | ||||
| 			mtd $append write - "$fw_part" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| alfa_check_image() { | ||||
| 	local magic_long="$(get_magic_long "$1")" | ||||
| 	local fw_part_size=$(mtd_get_part_size firmware) | ||||
|  | ||||
| 	case "$magic_long" in | ||||
| 	"27051956") | ||||
| 		[ "$fw_part_size" != "16318464" ] && { | ||||
| 			echo "Invalid image magic \"$magic_long\" for $fw_part_size bytes" | ||||
| 			return 1 | ||||
| 		} | ||||
| 		;; | ||||
| 	"68737173") | ||||
| 		[ "$fw_part_size" != "7929856" ] && { | ||||
| 			echo "Invalid image magic \"$magic_long\" for $fw_part_size bytes" | ||||
| 			return 1 | ||||
| 		} | ||||
| 		;; | ||||
| 	esac | ||||
|  | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| platform_check_image() { | ||||
| 	local board=$(board_name) | ||||
| 	local magic="$(get_magic_word "$1")" | ||||
| 	local magic_long="$(get_magic_long "$1")" | ||||
|  | ||||
| 	[ "$#" -gt 1 ] && return 1 | ||||
|  | ||||
| 	case "$board" in | ||||
| 	"ubnt,unifi") | ||||
| 		[ "$magic" != "2705" ] && { | ||||
| 			echo "Invalid image type." | ||||
| 			return 1 | ||||
| 		} | ||||
|  | ||||
| 		return 0 | ||||
| 		;; | ||||
| 	esac | ||||
|  | ||||
| 	echo "Sysupgrade is not yet supported on $board." | ||||
| 	return 1 | ||||
| } | ||||
|  | ||||
| platform_do_upgrade() { | ||||
| 	local board=$(board_name) | ||||
|  | ||||
| 	case "$board" in | ||||
| 	*) | ||||
| 		default_do_upgrade "$ARGV" | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
|  | ||||
| disable_watchdog() { | ||||
| 	killall watchdog | ||||
| 	( ps | grep -v 'grep' | grep '/dev/watchdog' ) && { | ||||
| 		echo 'Could not disable watchdog' | ||||
| 		return 1 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| append sysupgrade_pre_upgrade disable_watchdog | ||||
							
								
								
									
										247
									
								
								target/linux/ath79/config-4.14
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								target/linux/ath79/config-4.14
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| CONFIG_AG71XX=y | ||||
| # CONFIG_AG71XX_DEBUG is not set | ||||
| CONFIG_AG71XX_DEBUG_FS=y | ||||
| CONFIG_AR8216_PHY=y | ||||
| CONFIG_AR8216_PHY_LEDS=y | ||||
| CONFIG_ARCH_BINFMT_ELF_STATE=y | ||||
| CONFIG_ARCH_CLOCKSOURCE_DATA=y | ||||
| CONFIG_ARCH_DISCARD_MEMBLOCK=y | ||||
| CONFIG_ARCH_HAS_ELF_RANDOMIZE=y | ||||
| # CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set | ||||
| CONFIG_ARCH_HAS_RESET_CONTROLLER=y | ||||
| # CONFIG_ARCH_HAS_SG_CHAIN is not set | ||||
| # CONFIG_ARCH_HAS_STRICT_KERNEL_RWX is not set | ||||
| # CONFIG_ARCH_HAS_STRICT_MODULE_RWX is not set | ||||
| CONFIG_ARCH_HIBERNATION_POSSIBLE=y | ||||
| CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y | ||||
| CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y | ||||
| CONFIG_ARCH_MMAP_RND_BITS_MAX=15 | ||||
| CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15 | ||||
| # CONFIG_ARCH_OPTIONAL_KERNEL_RWX is not set | ||||
| # CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT is not set | ||||
| CONFIG_ARCH_SUPPORTS_UPROBES=y | ||||
| CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||||
| CONFIG_ARCH_USE_BUILTIN_BSWAP=y | ||||
| CONFIG_ARCH_USE_QUEUED_RWLOCKS=y | ||||
| CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y | ||||
| # CONFIG_ARCH_WANTS_THP_SWAP is not set | ||||
| CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y | ||||
| CONFIG_AT803X_PHY=y | ||||
| CONFIG_ATH79=y | ||||
| CONFIG_ATH79_WDT=y | ||||
| CONFIG_CEVT_R4K=y | ||||
| CONFIG_CLKDEV_LOOKUP=y | ||||
| CONFIG_CLONE_BACKWARDS=y | ||||
| CONFIG_CMDLINE="rootfstype=squashfs,jffs2" | ||||
| CONFIG_CMDLINE_BOOL=y | ||||
| # CONFIG_CMDLINE_OVERRIDE is not set | ||||
| CONFIG_COMMON_CLK=y | ||||
| # CONFIG_COMMON_CLK_BOSTON is not set | ||||
| CONFIG_CPU_BIG_ENDIAN=y | ||||
| CONFIG_CPU_GENERIC_DUMP_TLB=y | ||||
| CONFIG_CPU_HAS_PREFETCH=y | ||||
| CONFIG_CPU_HAS_RIXI=y | ||||
| CONFIG_CPU_HAS_SYNC=y | ||||
| CONFIG_CPU_MIPS32=y | ||||
| CONFIG_CPU_MIPS32_R2=y | ||||
| CONFIG_CPU_MIPSR2=y | ||||
| CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y | ||||
| CONFIG_CPU_R4K_CACHE_TLB=y | ||||
| CONFIG_CPU_R4K_FPU=y | ||||
| CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | ||||
| CONFIG_CPU_SUPPORTS_HIGHMEM=y | ||||
| CONFIG_CPU_SUPPORTS_MSA=y | ||||
| CONFIG_CRYPTO_RNG2=y | ||||
| CONFIG_CRYPTO_WORKQUEUE=y | ||||
| CONFIG_CSRC_R4K=y | ||||
| CONFIG_DMA_NONCOHERENT=y | ||||
| # CONFIG_DMA_NOOP_OPS is not set | ||||
| # CONFIG_DMA_VIRT_OPS is not set | ||||
| # CONFIG_DRM_LIB_RANDOM is not set | ||||
| CONFIG_DTC=y | ||||
| CONFIG_EARLY_PRINTK=y | ||||
| CONFIG_ETHERNET_PACKET_MANGLE=y | ||||
| CONFIG_EXPORTFS=y | ||||
| CONFIG_FIXED_PHY=y | ||||
| CONFIG_FUTEX_PI=y | ||||
| CONFIG_GENERIC_ATOMIC64=y | ||||
| CONFIG_GENERIC_CLOCKEVENTS=y | ||||
| CONFIG_GENERIC_CMOS_UPDATE=y | ||||
| CONFIG_GENERIC_CPU_AUTOPROBE=y | ||||
| CONFIG_GENERIC_IO=y | ||||
| CONFIG_GENERIC_IRQ_CHIP=y | ||||
| CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y | ||||
| CONFIG_GENERIC_IRQ_SHOW=y | ||||
| CONFIG_GENERIC_PCI_IOMAP=y | ||||
| CONFIG_GENERIC_PHY=y | ||||
| CONFIG_GENERIC_PINCONF=y | ||||
| CONFIG_GENERIC_PINCTRL_GROUPS=y | ||||
| CONFIG_GENERIC_PINMUX_FUNCTIONS=y | ||||
| CONFIG_GENERIC_SCHED_CLOCK=y | ||||
| CONFIG_GENERIC_SMP_IDLE_THREAD=y | ||||
| CONFIG_GENERIC_TIME_VSYSCALL=y | ||||
| CONFIG_GPIOLIB=y | ||||
| CONFIG_GPIOLIB_IRQCHIP=y | ||||
| CONFIG_GPIO_74X164=y | ||||
| CONFIG_GPIO_ATH79=y | ||||
| CONFIG_GPIO_GENERIC=y | ||||
| CONFIG_GPIO_SYSFS=y | ||||
| # CONFIG_GRO_CELLS is not set | ||||
| CONFIG_HANDLE_DOMAIN_IRQ=y | ||||
| CONFIG_HARDWARE_WATCHPOINTS=y | ||||
| CONFIG_HAS_DMA=y | ||||
| CONFIG_HAS_IOMEM=y | ||||
| CONFIG_HAS_IOPORT_MAP=y | ||||
| # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set | ||||
| # CONFIG_HAVE_ARCH_BITREVERSE is not set | ||||
| CONFIG_HAVE_ARCH_JUMP_LABEL=y | ||||
| CONFIG_HAVE_ARCH_KGDB=y | ||||
| CONFIG_HAVE_ARCH_SECCOMP_FILTER=y | ||||
| CONFIG_HAVE_ARCH_TRACEHOOK=y | ||||
| # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set | ||||
| CONFIG_HAVE_CBPF_JIT=y | ||||
| CONFIG_HAVE_CC_STACKPROTECTOR=y | ||||
| CONFIG_HAVE_CLK=y | ||||
| CONFIG_HAVE_CLK_PREPARE=y | ||||
| CONFIG_HAVE_CONTEXT_TRACKING=y | ||||
| CONFIG_HAVE_COPY_THREAD_TLS=y | ||||
| CONFIG_HAVE_C_RECORDMCOUNT=y | ||||
| CONFIG_HAVE_DEBUG_KMEMLEAK=y | ||||
| CONFIG_HAVE_DEBUG_STACKOVERFLOW=y | ||||
| CONFIG_HAVE_DMA_API_DEBUG=y | ||||
| CONFIG_HAVE_DMA_CONTIGUOUS=y | ||||
| CONFIG_HAVE_DYNAMIC_FTRACE=y | ||||
| CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||||
| CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||||
| CONFIG_HAVE_FUNCTION_TRACER=y | ||||
| CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||||
| CONFIG_HAVE_IDE=y | ||||
| CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y | ||||
| CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y | ||||
| CONFIG_HAVE_KVM=y | ||||
| CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||||
| CONFIG_HAVE_MEMBLOCK=y | ||||
| CONFIG_HAVE_MEMBLOCK_NODE_MAP=y | ||||
| CONFIG_HAVE_MOD_ARCH_SPECIFIC=y | ||||
| CONFIG_HAVE_NET_DSA=y | ||||
| CONFIG_HAVE_OPROFILE=y | ||||
| CONFIG_HAVE_PERF_EVENTS=y | ||||
| CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y | ||||
| CONFIG_HAVE_SYSCALL_TRACEPOINTS=y | ||||
| CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y | ||||
| CONFIG_HW_HAS_PCI=y | ||||
| CONFIG_HZ_PERIODIC=y | ||||
| CONFIG_IMAGE_CMDLINE_HACK=y | ||||
| CONFIG_INITRAMFS_COMPRESSION="" | ||||
| CONFIG_INITRAMFS_ROOT_GID=0 | ||||
| CONFIG_INITRAMFS_ROOT_UID=0 | ||||
| CONFIG_INITRAMFS_SOURCE="../../root" | ||||
| CONFIG_IP17XX_PHY=y | ||||
| CONFIG_IRQCHIP=y | ||||
| CONFIG_IRQ_DOMAIN=y | ||||
| CONFIG_IRQ_FORCED_THREADING=y | ||||
| CONFIG_IRQ_MIPS_CPU=y | ||||
| CONFIG_IRQ_WORK=y | ||||
| CONFIG_LEDS_GPIO=y | ||||
| # CONFIG_LEDS_RESET is not set | ||||
| CONFIG_LIBFDT=y | ||||
| CONFIG_MARVELL_PHY=y | ||||
| CONFIG_MDIO_BITBANG=y | ||||
| CONFIG_MDIO_BUS=y | ||||
| CONFIG_MDIO_DEVICE=y | ||||
| CONFIG_MDIO_GPIO=y | ||||
| CONFIG_MFD_SYSCON=y | ||||
| CONFIG_MICREL_PHY=y | ||||
| CONFIG_MIPS=y | ||||
| CONFIG_MIPS_ASID_BITS=8 | ||||
| CONFIG_MIPS_ASID_SHIFT=0 | ||||
| CONFIG_MIPS_CLOCK_VSYSCALL=y | ||||
| # CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set | ||||
| # CONFIG_MIPS_CMDLINE_DTB_EXTEND is not set | ||||
| # CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set | ||||
| CONFIG_MIPS_CMDLINE_FROM_DTB=y | ||||
| # CONFIG_MIPS_ELF_APPENDED_DTB is not set | ||||
| # CONFIG_MIPS_HUGE_TLB_SUPPORT is not set | ||||
| CONFIG_MIPS_L1_CACHE_SHIFT=5 | ||||
| # CONFIG_MIPS_MACHINE is not set | ||||
| # CONFIG_MIPS_NO_APPENDED_DTB is not set | ||||
| CONFIG_MIPS_RAW_APPENDED_DTB=y | ||||
| CONFIG_MIPS_SPRAM=y | ||||
| CONFIG_MODULES_USE_ELF_REL=y | ||||
| CONFIG_MTD_CFI_ADV_OPTIONS=y | ||||
| CONFIG_MTD_CFI_GEOMETRY=y | ||||
| # CONFIG_MTD_CFI_I2 is not set | ||||
| # CONFIG_MTD_CFI_INTELEXT is not set | ||||
| CONFIG_MTD_CMDLINE_PARTS=y | ||||
| CONFIG_MTD_M25P80=y | ||||
| # CONFIG_MTD_MAP_BANK_WIDTH_1 is not set | ||||
| # CONFIG_MTD_MAP_BANK_WIDTH_4 is not set | ||||
| CONFIG_MTD_PHYSMAP=y | ||||
| CONFIG_MTD_SPI_NOR=y | ||||
| CONFIG_MTD_SPLIT_FIRMWARE=y | ||||
| CONFIG_MTD_SPLIT_LZMA_FW=y | ||||
| CONFIG_MTD_SPLIT_SEAMA_FW=y | ||||
| CONFIG_MTD_SPLIT_UIMAGE_FW=y | ||||
| CONFIG_MTD_SPLIT_WRGG_FW=y | ||||
| CONFIG_MTD_TPLINK_PARTS=y | ||||
| CONFIG_NEED_DMA_MAP_STATE=y | ||||
| CONFIG_NEED_PER_CPU_KM=y | ||||
| CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y | ||||
| # CONFIG_NO_IOPORT_MAP is not set | ||||
| CONFIG_OF=y | ||||
| CONFIG_OF_ADDRESS=y | ||||
| CONFIG_OF_EARLY_FLATTREE=y | ||||
| CONFIG_OF_FLATTREE=y | ||||
| CONFIG_OF_GPIO=y | ||||
| CONFIG_OF_IRQ=y | ||||
| CONFIG_OF_MDIO=y | ||||
| CONFIG_OF_NET=y | ||||
| CONFIG_PCI_DRIVERS_LEGACY=y | ||||
| CONFIG_PERF_USE_VMALLOC=y | ||||
| CONFIG_PGTABLE_LEVELS=2 | ||||
| CONFIG_PHYLIB=y | ||||
| # CONFIG_PHY_AR7100_USB is not set | ||||
| # CONFIG_PHY_AR7200_USB is not set | ||||
| CONFIG_PINCTRL=y | ||||
| CONFIG_RATIONAL=y | ||||
| # CONFIG_RCU_NEED_SEGCBLIST is not set | ||||
| # CONFIG_RCU_STALL_COMMON is not set | ||||
| CONFIG_REGMAP=y | ||||
| CONFIG_REGMAP_MMIO=y | ||||
| CONFIG_RESET_ATH79=y | ||||
| CONFIG_RESET_CONTROLLER=y | ||||
| CONFIG_RTL8366S_PHY=y | ||||
| CONFIG_RTL8366_SMI=y | ||||
| # CONFIG_SCHED_INFO is not set | ||||
| # CONFIG_SCSI_DMA is not set | ||||
| # CONFIG_SERIAL_8250_FSL is not set | ||||
| CONFIG_SERIAL_8250_NR_UARTS=1 | ||||
| CONFIG_SERIAL_8250_RUNTIME_UARTS=1 | ||||
| CONFIG_SERIAL_AR933X=y | ||||
| CONFIG_SERIAL_AR933X_CONSOLE=y | ||||
| CONFIG_SERIAL_AR933X_NR_UARTS=2 | ||||
| CONFIG_SERIAL_OF_PLATFORM=y | ||||
| CONFIG_SPI=y | ||||
| CONFIG_SPI_ATH79=y | ||||
| CONFIG_SPI_BITBANG=y | ||||
| CONFIG_SPI_GPIO=y | ||||
| CONFIG_SPI_MASTER=y | ||||
| # CONFIG_SPI_RB4XX is not set | ||||
| CONFIG_SRCU=y | ||||
| CONFIG_SWCONFIG=y | ||||
| CONFIG_SWCONFIG_LEDS=y | ||||
| CONFIG_SWPHY=y | ||||
| CONFIG_SYSCTL_EXCEPTION_TRACE=y | ||||
| CONFIG_SYS_HAS_CPU_MIPS32_R2=y | ||||
| CONFIG_SYS_HAS_EARLY_PRINTK=y | ||||
| CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y | ||||
| CONFIG_SYS_SUPPORTS_ARBIT_HZ=y | ||||
| CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||||
| CONFIG_SYS_SUPPORTS_MIPS16=y | ||||
| CONFIG_SYS_SUPPORTS_ZBOOT=y | ||||
| CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y | ||||
| CONFIG_THIN_ARCHIVES=y | ||||
| CONFIG_TICK_CPU_ACCOUNTING=y | ||||
| CONFIG_TINY_SRCU=y | ||||
| CONFIG_USB_SUPPORT=y | ||||
| CONFIG_USE_OF=y | ||||
							
								
								
									
										13
									
								
								target/linux/ath79/dts/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								target/linux/ath79/dts/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0 | ||||
| # All DTBs | ||||
| dtb-$(CONFIG_ATH79)			+= ar9132_tl_wr1043nd_v1.dtb | ||||
| dtb-$(CONFIG_ATH79)			+= ar9331_dpt_module.dtb | ||||
| dtb-$(CONFIG_ATH79)			+= ar9331_dragino_ms14.dtb | ||||
| dtb-$(CONFIG_ATH79)			+= ar9331_omega.dtb | ||||
| dtb-$(CONFIG_ATH79)			+= ar9331_tl_mr3020.dtb | ||||
|  | ||||
| # Force kbuild to make empty built-in.o if necessary | ||||
| obj-				+= dummy.o | ||||
|  | ||||
| always				:= $(dtb-y) | ||||
| clean-files			:= *.dtb *.dtb.S | ||||
							
								
								
									
										204
									
								
								target/linux/ath79/dts/ar7100.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								target/linux/ath79/dts/ar7100.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include <dt-bindings/clock/ath79-clk.h> | ||||
| #include "ath79.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,ar7100"; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "mips,mips24Kc"; | ||||
| 			clocks = <&pll ATH79_CLK_CPU>; | ||||
| 			reg = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	ahb { | ||||
| 		apb { | ||||
| 			ddr_ctrl: memory-controller@18000000 { | ||||
| 				compatible = "qca,ar7100-ddr-controller"; | ||||
| 				reg = <0x18000000 0x100>; | ||||
|  | ||||
| 				#qca,ddr-wb-channel-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			uart: uart@18020000 { | ||||
| 				compatible = "ns16550a"; | ||||
| 				reg = <0x18020000 0x20>; | ||||
| 				interrupts = <3>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "uart"; | ||||
|  | ||||
| 				reg-io-width = <4>; | ||||
| 				reg-shift = <2>; | ||||
| 				no-loopback-test; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			usb_phy: usb-phy@18030000 { | ||||
| 				compatible = "qca,ar7100-usb-phy"; | ||||
| 				reg = <0x18030000 0x10>; | ||||
|  | ||||
| 				reset-names = "usb-phy", "usb-host", "usb-ohci-dll"; | ||||
| 				resets = <&rst 4>, <&rst 5>, <&rst 6>; | ||||
|  | ||||
| 				#phy-cells = <0>; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			gpio: gpio@18040000 { | ||||
| 				compatible = "qca,ar7100-gpio"; | ||||
| 				reg = <0x18040000 0x30>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				ngpios = <16>; | ||||
|  | ||||
| 				gpio-controller; | ||||
| 				#gpio-cells = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <2>; | ||||
| 			}; | ||||
|  | ||||
| 			pll: pll-controller@18050000 { | ||||
| 				compatible = "qca,ar7100-pll", "syscon"; | ||||
| 				reg = <0x18050000 0x20>; | ||||
|  | ||||
| 				clock-names = "ref"; | ||||
| 				/* The board must provides the ref clock */ | ||||
|  | ||||
| 				#clock-cells = <1>; | ||||
| 				clock-output-names = "cpu", "ddr", "ahb"; | ||||
| 			}; | ||||
|  | ||||
| 			wdt: wdt@18060008 { | ||||
| 				compatible = "qca,ar7130-wdt"; | ||||
| 				reg = <0x18060008 0x8>; | ||||
|  | ||||
| 				interrupts = <4>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "wdt"; | ||||
| 			}; | ||||
|  | ||||
|  | ||||
| 			rst: reset-controller@18060024 { | ||||
| 				compatible = "qca,ar7100-reset"; | ||||
| 				reg = <0x18060024 0x4>; | ||||
|  | ||||
| 				#reset-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			pcie0: pcie-controller@180c0000 { | ||||
| 				compatible = "qca,ar7100-pci"; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				bus-range = <0x0 0x0>; | ||||
| 				reg = <0x17010000 0x100>; | ||||
| 				reg-names = "cfg_base"; | ||||
| 				ranges = <0x2000000 0 0x10000000 0x10000000 0 0x07000000	/* pci memory */ | ||||
| 					  0x1000000 0 0x00000000 0x0000000 0 0x000001>;		/* io space */ | ||||
| 				interrupt-parent = <&cpuintc>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <1>; | ||||
|  | ||||
| 				interrupt-map-mask = <0 0 0 1>; | ||||
| 				interrupt-map = <0 0 0 0 &pcie0 0>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	usb2: usb@1b000000 { | ||||
| 		compatible = "generic-ehci"; | ||||
| 		reg = <0x1b000000 0x1000>; | ||||
|  | ||||
| 		interrupt-parent = <&cpuintc>; | ||||
| 		interrupts = <3>; | ||||
|  | ||||
| 		phy-names = "usb-phy"; | ||||
| 		phys = <&usb_phy>; | ||||
|  | ||||
| 		has-synopsys-hc-bug; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	usb1: usb@1c000000 { | ||||
| 		compatible = "generic-ohci"; | ||||
| 		reg = <0x1c000000 0x1000>; | ||||
|  | ||||
| 		interrupt-parent = <&miscintc>; | ||||
| 		interrupts = <6>; | ||||
|  | ||||
| 		phy-names = "usb-phy"; | ||||
| 		phys = <&usb_phy>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	spi: spi@1f000000 { | ||||
| 		compatible = "qca,ar7100-spi"; | ||||
| 		reg = <0x1f000000 0x10>; | ||||
|  | ||||
| 		clocks = <&pll ATH79_CLK_AHB>; | ||||
| 		clock-names = "ahb"; | ||||
|  | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &cpuintc { | ||||
| 	qca,ddr-wb-channel-interrupts = <2>, <3>, <4>, <5>; | ||||
| 	qca,ddr-wb-channels = <&ddr_ctrl 3>, <&ddr_ctrl 2>, | ||||
| 				<&ddr_ctrl 0>, <&ddr_ctrl 1>; | ||||
| }; | ||||
|  | ||||
| &miscintc { | ||||
| 	compatible = "qca,ar7100-misc-intc"; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	compatible = "qca,ar7100-eth"; | ||||
| 	reg = <0x19000000 0x200 | ||||
| 		0x18070000 0x4>; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
| 	pll-reg = <0x4 0x10 17>; | ||||
| 	pll-handle = <&pll>; | ||||
| 	phy-mode = "rgmii"; | ||||
|  | ||||
| 	resets = <&rst 8>, <&rst 9>; | ||||
| 	reset-names = "phy", "mac"; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	builtin-switch; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "qca,ar7100-eth"; | ||||
| 	reg = <0x1a000000 0x200 | ||||
| 		0x18070004 0x4>; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
| 	pll-reg = <0x4 0x14 19>; | ||||
| 	pll-handle = <&pll>; | ||||
|  | ||||
| 	phy-mode = "rgmii"; | ||||
|  | ||||
| 	resets = <&rst 12>, <&rst 13>; | ||||
| 	reset-names = "phy", "mac"; | ||||
| }; | ||||
							
								
								
									
										186
									
								
								target/linux/ath79/dts/ar7161_netgear_wndr3800.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								target/linux/ath79/dts/ar7161_netgear_wndr3800.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar7100.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "netgear,wndr3800", "qca,ar7161"; | ||||
| 	model = "Netgear WNDR3800"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x8000000>; | ||||
| 	}; | ||||
|  | ||||
| 	extosc: ref { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-output-names = "ref"; | ||||
| 		clock-frequency = <40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	reset-leds { | ||||
| 		compatible = "reset-leds"; | ||||
|  | ||||
| 		wps { | ||||
| 			label = "netgear:green:usb"; | ||||
| 			resets = <&rst 12>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gpio-leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		wps { | ||||
| 			label = "netgear:orange:wps"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		power_green { | ||||
| 			label = "netgear:green:power"; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		power_orange { | ||||
| 			label = "netgear:orange:power"; | ||||
| 			gpios = <&gpio 2 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wps_green { | ||||
| 			label = "netgear:green:wps"; | ||||
| 			gpios = <&gpio 4 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wan_green { | ||||
| 			label = "netgear:green:wan"; | ||||
| 			gpios = <&gpio 6 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gpio-keys-polled { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "wps"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 3 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 18 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		button@2 { | ||||
| 			label = "wifi"; | ||||
| 			linux,code = <BTN_2>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	rtl8366s { | ||||
| 		compatible = "realtek,rtl8366s"; | ||||
| 		gpio-sda = <&gpio 5 GPIO_ACTIVE_HIGH>; | ||||
| 		gpio-sck = <&gpio 7 GPIO_ACTIVE_HIGH>; | ||||
|  | ||||
| 		mdio-bus { | ||||
| 			status = "okay"; | ||||
|  | ||||
| 			phy-mask = <0x10>; | ||||
|  | ||||
| 			phy4: ethernet-phy@4 { | ||||
| 				reg = <4>; | ||||
| 				phy-mode = "rgmii"; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb1 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb2 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pcie0 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	status = "okay"; | ||||
| 	num-cs = <1>; | ||||
|  | ||||
| 	flash@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "mx25l12805d"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <25000000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x050000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x050000 0x020000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x70000 0xf80000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@3 { | ||||
| 			label = "art"; | ||||
| 			reg = <0xff0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	pll-data = <0x11110000 0x00001099 0x00991099>; | ||||
|  | ||||
| 	fixed-link { | ||||
| 		speed = <1000>; | ||||
| 		full-duplex; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	pll-data = <0x11110000 0x00001099 0x00991099>; | ||||
|  | ||||
| 	resets = <&rst 13>; | ||||
| 	reset-names = "mac"; | ||||
|  | ||||
| 	phy-handle = <&phy4>; | ||||
| }; | ||||
							
								
								
									
										78
									
								
								target/linux/ath79/dts/ar7241.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								target/linux/ath79/dts/ar7241.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
|  | ||||
| #include "ar724x.dtsi" | ||||
|  | ||||
| / { | ||||
| 	usb_phy: usb-phy { | ||||
| 		compatible = "qca,ar7200-usb-phy"; | ||||
|  | ||||
| 		reset-names = "usb-phy", "usb-suspend-override"; | ||||
| 		resets = <&rst 4>, <&rst 3>; | ||||
|  | ||||
| 		#phy-cells = <0>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	ngpios = <20>; | ||||
| }; | ||||
|  | ||||
| &ahb { | ||||
| 	usb: usb@1b000000 { | ||||
| 		compatible = "generic-ehci"; | ||||
| 		reg = <0x1b000000 0x1000>; | ||||
|  | ||||
| 		interrupts = <3>; | ||||
|  | ||||
| 		resets = <&rst 5>; | ||||
| 		reset-names = "usb-host"; | ||||
|  | ||||
| 		has-transaction-translator; | ||||
| 		caps-offset = <0x100>; | ||||
|  | ||||
| 		phy-names = "usb-phy"; | ||||
| 		phys = <&usb_phy>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	regmap = <ð1>; | ||||
| 	builtin-switch; | ||||
| 	resets = <&rst 22>; | ||||
| 	reset-names = "mdio"; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	compatible = "qca,ar7241-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
|  | ||||
| 	resets = <&rst 8>, <&rst 9>; | ||||
| 	reset-names = "mac", "phy"; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	resets = <&rst 23>; | ||||
| 	reset-names = "mdio"; | ||||
| 	builtin-switch; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "qca,ar7241-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
|  | ||||
| 	resets = <&rst 12>, <&rst 13>; | ||||
| 	reset-names = "mac", "phy"; | ||||
|  | ||||
| 	phy-mode = "gmii"; | ||||
|  | ||||
| 	fixed-link { | ||||
| 		speed = <1000>; | ||||
| 		full-duplex; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										13
									
								
								target/linux/ath79/dts/ar7241_ubnt-bullet-m.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								target/linux/ath79/dts/ar7241_ubnt-bullet-m.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include "ar7241_ubnt-xm.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,xm", "qca,ar7241"; | ||||
| 	model = "Ubiquiti Bullet M"; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "syscon"; | ||||
| }; | ||||
							
								
								
									
										9
									
								
								target/linux/ath79/dts/ar7241_ubnt-nano-m.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								target/linux/ath79/dts/ar7241_ubnt-nano-m.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include "ar7241_ubnt-xm.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,nm", "qca,ar7241"; | ||||
| 	model = "Ubiquiti Nanostation M"; | ||||
| }; | ||||
							
								
								
									
										21
									
								
								target/linux/ath79/dts/ar7241_ubnt-rocket-m.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								target/linux/ath79/dts/ar7241_ubnt-rocket-m.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include "ar7241_ubnt-xm.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,rm", "qca,ar7241"; | ||||
| 	model = "Ubiquiti Rocket M"; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "syscon"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	status = "okay"; | ||||
| }; | ||||
							
								
								
									
										135
									
								
								target/linux/ath79/dts/ar7241_ubnt-unifi.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								target/linux/ath79/dts/ar7241_ubnt-unifi.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar7241.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,unifi", "qca,ar7241"; | ||||
| 	model = "Ubiquiti UniFi AP"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	extosc: ref { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-frequency = <40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		poll-interval = <20>; | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 12 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led@0 { | ||||
| 			label = "ubnt:green:dome"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		led@1 { | ||||
| 			label = "ubnt:orange:dome"; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pll { | ||||
| 	clocks = <&extosc>; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	status = "okay"; | ||||
| 	num-cs = <1>; | ||||
|  | ||||
| 	flash@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "mx25l6405d"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <25000000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x040000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x040000 0x010000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x050000 0x750000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@3 { | ||||
| 			label = "board_config"; | ||||
| 			reg = <0x7a0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@4 { | ||||
| 			label = "cfg"; | ||||
| 			reg = <0x7b0000 0x040000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		art: partition@5 { | ||||
| 			label = "art"; | ||||
| 			reg = <0x7f0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pcie { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	ath9k@0000 { | ||||
| 		reg = <0x0000 0 0 0 0>; | ||||
| 		qca,no-eeprom; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy4: ethernet-phy@4 { | ||||
| 		reg = <4>; | ||||
| 		phy-mode = "mii"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x0>; | ||||
| 	phy-handle = <&phy4>; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	compatible = "syscon"; | ||||
| }; | ||||
							
								
								
									
										13
									
								
								target/linux/ath79/dts/ar7241_ubnt-xm.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								target/linux/ath79/dts/ar7241_ubnt-xm.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include "ar7241_ubnt-xm.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,xm", "qca,ar7241"; | ||||
| 	model = "Ubiquiti Networks XM (rev 1.0) board"; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "syscon"; | ||||
| }; | ||||
							
								
								
									
										146
									
								
								target/linux/ath79/dts/ar7241_ubnt-xm.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								target/linux/ath79/dts/ar7241_ubnt-xm.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar7241.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "ubnt,xm", "qca,ar7241"; | ||||
| 	model = "Ubiquiti Networks XM (rev 1.0) board"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x2000000>; | ||||
| 	}; | ||||
|  | ||||
| /*	extosc: ref { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-frequency = <40000000>; | ||||
| 	}; | ||||
| */ | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		poll-interval = <20>; | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 12 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led@0 { | ||||
| 			label = "ubnt:red:link1"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		led@1 { | ||||
| 			label = "ubnt:orange:link2"; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		led@2 { | ||||
| 			label = "ubnt:green:link3"; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		led@3 { | ||||
| 			label = "ubnt:green:link4"; | ||||
| 			gpios = <&gpio 7 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| /*&pll { | ||||
| 	clocks = <&extosc>; | ||||
| };*/ | ||||
|  | ||||
| &spi { | ||||
| 	status = "okay"; | ||||
| 	num-cs = <1>; | ||||
|  | ||||
| 	flash@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "mx25l6405d"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <25000000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x040000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x040000 0x010000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x050000 0x750000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@3 { | ||||
| 			label = "board_config"; | ||||
| 			reg = <0x7a0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@4 { | ||||
| 			label = "cfg"; | ||||
| 			reg = <0x7b0000 0x040000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		art: partition@5 { | ||||
| 			label = "art"; | ||||
| 			reg = <0x7f0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pcie { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	ath9k@0000 { | ||||
| 		reg = <0x0000 0 0 0 0>; | ||||
| 		qca,no-eeprom; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy4: ethernet-phy@4 { | ||||
| 		reg = <4>; | ||||
| 		phy-mode = "mii"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x0>; | ||||
|  | ||||
| 	phy-mode = "mii"; | ||||
| 	phy-handle = <&phy4>; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x6>; | ||||
| }; | ||||
							
								
								
									
										69
									
								
								target/linux/ath79/dts/ar7242.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								target/linux/ath79/dts/ar7242.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
|  | ||||
| #include "ar724x.dtsi" | ||||
|  | ||||
| / { | ||||
| 	usb_phy: usb-phy { | ||||
| 		compatible = "qca,ar7200-usb-phy"; | ||||
|  | ||||
| 		reset-names = "usb-phy", "usb-suspend-override"; | ||||
| 		resets = <&rst 4>, <&rst 3>; | ||||
|  | ||||
| 		#phy-cells = <0>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	ngpios = <20>; | ||||
| }; | ||||
|  | ||||
| &ahb { | ||||
| 	usb: usb@1b000000 { | ||||
| 		compatible = "generic-ehci"; | ||||
| 		reg = <0x1b000000 0x1000>; | ||||
|  | ||||
| 		interrupts = <3>; | ||||
|  | ||||
| 		resets = <&rst 5>; | ||||
| 		reset-names = "usb-host"; | ||||
|  | ||||
| 		has-transaction-translator; | ||||
| 		caps-offset = <0x100>; | ||||
|  | ||||
| 		phy-names = "usb-phy"; | ||||
| 		phys = <&usb_phy>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	resets = <&rst 22>; | ||||
| 	reset-names = "mdio"; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	compatible = "qca,ar7242-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x16000000 0x00000101 0x00001616>; | ||||
| 	pll-reg = <0x4 0x2c 17>; | ||||
| 	pll-handle = <&pll>; | ||||
|  | ||||
| 	resets = <&rst 8>, <&rst 9>; | ||||
| 	reset-names = "mac", "phy"; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	resets = <&rst 23>; | ||||
| 	reset-names = "mdio"; | ||||
| 	builtin-switch; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "qca,ar7242-eth", "syscon"; | ||||
|  | ||||
| 	resets = <&rst 12>, <&rst 13>; | ||||
| 	reset-names = "mac", "phy"; | ||||
| }; | ||||
							
								
								
									
										127
									
								
								target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g450h.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								target/linux/ath79/dts/ar7242_buffalo_wzr-hp-g450h.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar7242.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "buffalo,wzr-hp-g450h", "qca,ar7242"; | ||||
| 	model = "Buffalo WZR-HP-G450H"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		poll-interval = <20>; | ||||
| 		button@0 { | ||||
| 			label = "usb"; | ||||
| 			linux,code = <BTN_2>; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 6 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 		button@2 { | ||||
| 			label = "movie_engine"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 7 GPIO_ACTIVE_HIGH>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 		button@3 { | ||||
| 			label = "aoss"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 8 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 		button@4 { | ||||
| 			label = "router_off"; | ||||
| 			linux,code = <BTN_5>; | ||||
| 			gpios = <&gpio 12 GPIO_ACTIVE_HIGH>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led@0 { | ||||
| 			label = "buffalo:orange:security"; | ||||
| 			gpios = <&gpio 13 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		led@1 { | ||||
| 			label = "buffalo:red:diag"; | ||||
| 			gpios = <&gpio 14 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gpio-export { | ||||
| 		compatible = "gpio-export"; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		gpio_usb_power { | ||||
| 			gpio-export,name = "wzr-hp-g450h:usb-power"; | ||||
| 			gpio-export,output = <1>; | ||||
| 			gpios = <&gpio 16 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	status = "okay"; | ||||
| 	phy-mask = <0x1>; | ||||
|  | ||||
| 	phy0: ethernet-phy@0 { | ||||
| 		reg = <0>; | ||||
| 		phy-mode = "rgmii"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy-mode = "rgmii"; | ||||
| 	pll-data = <0x62000000 0 0>; | ||||
|  | ||||
| 	fixed-link { | ||||
| 		speed = <1000>; | ||||
| 		full-duplex; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pcie { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	ath9k@0000 { | ||||
| 		reg = <0x0000 0 0 0 0>; | ||||
| 		qca,no-eeprom; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										140
									
								
								target/linux/ath79/dts/ar724x.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								target/linux/ath79/dts/ar724x.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include <dt-bindings/clock/ath79-clk.h> | ||||
| #include "ath79.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,ar7240"; | ||||
|  | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyS0,115200"; | ||||
| 	}; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "mips,mips24Kc"; | ||||
| 			clocks = <&pll ATH79_CLK_CPU>; | ||||
| 			reg = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	ahb: ahb { | ||||
| 		apb { | ||||
| 			ddr_ctrl: memory-controller@18000000 { | ||||
| 				compatible = "qca,ar9132-ddr-controller", | ||||
| 						"qca,ar7240-ddr-controller"; | ||||
| 				reg = <0x18000000 0x100>; | ||||
|  | ||||
| 				#qca,ddr-wb-channel-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			uart: uart@18020000 { | ||||
| 				compatible = "ns16550a"; | ||||
| 				reg = <0x18020000 0x20>; | ||||
| 				interrupts = <3>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "uart"; | ||||
|  | ||||
| 				reg-io-width = <4>; | ||||
| 				reg-shift = <2>; | ||||
| 				no-loopback-test; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			gpio: gpio@18040000 { | ||||
| 				compatible = "qca,ar7240-gpio", | ||||
| 						"qca,ar7100-gpio"; | ||||
| 				reg = <0x18040000 0x30>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				ngpios = <18>; | ||||
|  | ||||
| 				gpio-controller; | ||||
| 				#gpio-cells = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <2>; | ||||
| 			}; | ||||
|  | ||||
| 			pll: pll-controller@18050000 { | ||||
| 				compatible = "qca,ar7240-pll", | ||||
| 						"qca,ar7240-pll"; | ||||
| 				reg = <0x18050000 0x20>; | ||||
|  | ||||
| 				clock-names = "ref"; | ||||
| 				/* The board must provides the ref clock */ | ||||
|  | ||||
| 				#clock-cells = <1>; | ||||
| 				clock-output-names = "cpu", "ddr", "ahb"; | ||||
| 			}; | ||||
|  | ||||
| 			wdt: wdt@18060008 { | ||||
| 				compatible = "qca,ar7130-wdt"; | ||||
| 				reg = <0x18060008 0x8>; | ||||
|  | ||||
| 				interrupts = <4>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "wdt"; | ||||
| 			}; | ||||
|  | ||||
| 			rst: reset-controller@1806001c { | ||||
| 				compatible = "qca,ar7240-reset", | ||||
| 						"qca,ar7100-reset"; | ||||
| 				reg = <0x1806001c 0x4>; | ||||
|  | ||||
| 				#reset-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			pcie: pcie-controller@180c0000 { | ||||
| 				compatible = "qcom,ar7240-pci"; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				bus-range = <0x0 0x0>; | ||||
| 				reg = <0x180c0000 0x1000>, /* CRP */ | ||||
| 				      <0x180f0000 0x100>,  /* CTRL */ | ||||
| 				      <0x14000000 0x1000>; /* CFG */ | ||||
| 				reg-names = "crp_base", "ctrl_base", "cfg_base"; | ||||
| 				ranges = <0x2000000 0 0x10000000 0x10000000 0 0x04000000	/* pci memory */ | ||||
| 					  0x1000000 0 0x00000000 0x0000000 0 0x000001>;		/* io space */ | ||||
| 				interrupt-parent = <&cpuintc>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <1>; | ||||
|  | ||||
| 				interrupt-map-mask = <0 0 0 1>; | ||||
| 				interrupt-map = <0 0 0 0 &pcie 0>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		spi: spi@1f000000 { | ||||
| 			compatible = "qca,ar7240-spi", | ||||
| 					"qca,ar7100-spi"; | ||||
| 			reg = <0x1f000000 0x10>; | ||||
|  | ||||
| 			clocks = <&pll ATH79_CLK_AHB>; | ||||
| 			clock-names = "ahb"; | ||||
|  | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &cpuintc { | ||||
| 	qca,ddr-wb-channel-interrupts = <2>, <3>, <4>, <5>; | ||||
| 	qca,ddr-wb-channels = <&ddr_ctrl 3>, <&ddr_ctrl 2>, | ||||
| 				<&ddr_ctrl 0>, <&ddr_ctrl 1>; | ||||
| }; | ||||
							
								
								
									
										171
									
								
								target/linux/ath79/dts/ar9132.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								target/linux/ath79/dts/ar9132.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include <dt-bindings/clock/ath79-clk.h> | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,ar9132"; | ||||
|  | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "mips,mips24Kc"; | ||||
| 			clocks = <&pll ATH79_CLK_CPU>; | ||||
| 			reg = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	cpuintc: interrupt-controller { | ||||
| 		compatible = "qca,ar9132-cpu-intc", "qca,ar7100-cpu-intc"; | ||||
|  | ||||
| 		interrupt-controller; | ||||
| 		#interrupt-cells = <1>; | ||||
|  | ||||
| 		qca,ddr-wb-channel-interrupts = <2>, <3>, <4>, <5>; | ||||
| 		qca,ddr-wb-channels = <&ddr_ctrl 3>, <&ddr_ctrl 2>, | ||||
| 					<&ddr_ctrl 0>, <&ddr_ctrl 1>; | ||||
| 	}; | ||||
|  | ||||
| 	ahb { | ||||
| 		compatible = "simple-bus"; | ||||
| 		ranges; | ||||
|  | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
|  | ||||
| 		interrupt-parent = <&cpuintc>; | ||||
|  | ||||
| 		apb { | ||||
| 			compatible = "simple-bus"; | ||||
| 			ranges; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <1>; | ||||
|  | ||||
| 			interrupt-parent = <&miscintc>; | ||||
|  | ||||
| 			ddr_ctrl: memory-controller@18000000 { | ||||
| 				compatible = "qca,ar9132-ddr-controller", | ||||
| 						"qca,ar7240-ddr-controller"; | ||||
| 				reg = <0x18000000 0x100>; | ||||
|  | ||||
| 				#qca,ddr-wb-channel-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			uart: uart@18020000 { | ||||
| 				compatible = "ns8250"; | ||||
| 				reg = <0x18020000 0x20>; | ||||
| 				interrupts = <3>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "uart"; | ||||
|  | ||||
| 				reg-io-width = <4>; | ||||
| 				reg-shift = <2>; | ||||
| 				no-loopback-test; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			gpio: gpio@18040000 { | ||||
| 				compatible = "qca,ar9132-gpio", | ||||
| 						"qca,ar7100-gpio"; | ||||
| 				reg = <0x18040000 0x30>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				ngpios = <22>; | ||||
|  | ||||
| 				gpio-controller; | ||||
| 				#gpio-cells = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <2>; | ||||
| 			}; | ||||
|  | ||||
| 			pll: pll-controller@18050000 { | ||||
| 				compatible = "qca,ar9132-pll", | ||||
| 						"qca,ar9130-pll"; | ||||
| 				reg = <0x18050000 0x20>; | ||||
|  | ||||
| 				clock-names = "ref"; | ||||
| 				/* The board must provides the ref clock */ | ||||
|  | ||||
| 				#clock-cells = <1>; | ||||
| 				clock-output-names = "cpu", "ddr", "ahb"; | ||||
| 			}; | ||||
|  | ||||
| 			wdt: wdt@18060008 { | ||||
| 				compatible = "qca,ar7130-wdt"; | ||||
| 				reg = <0x18060008 0x8>; | ||||
|  | ||||
| 				interrupts = <4>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "wdt"; | ||||
| 			}; | ||||
|  | ||||
| 			miscintc: interrupt-controller@18060010 { | ||||
| 				compatible = "qca,ar9132-misc-intc", | ||||
| 					   "qca,ar7100-misc-intc"; | ||||
| 				reg = <0x18060010 0x8>; | ||||
|  | ||||
| 				interrupt-parent = <&cpuintc>; | ||||
| 				interrupts = <6>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			rst: reset-controller@1806001c { | ||||
| 				compatible = "qca,ar9132-reset", | ||||
| 						"qca,ar7100-reset"; | ||||
| 				reg = <0x1806001c 0x4>; | ||||
|  | ||||
| 				#reset-cells = <1>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		usb: usb@1b000100 { | ||||
| 			compatible = "qca,ar7100-ehci", "generic-ehci"; | ||||
| 			reg = <0x1b000100 0x100>; | ||||
|  | ||||
| 			interrupts = <3>; | ||||
| 			resets = <&rst 5>; | ||||
|  | ||||
| 			has-transaction-translator; | ||||
|  | ||||
| 			phy-names = "usb"; | ||||
| 			phys = <&usb_phy>; | ||||
|  | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		spi: spi@1f000000 { | ||||
| 			compatible = "qca,ar9132-spi", "qca,ar7100-spi"; | ||||
| 			reg = <0x1f000000 0x10>; | ||||
|  | ||||
| 			clocks = <&pll ATH79_CLK_AHB>; | ||||
| 			clock-names = "ahb"; | ||||
|  | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	usb_phy: usb-phy { | ||||
| 		compatible = "qca,ar7200-usb-phy"; | ||||
|  | ||||
| 		reset-names = "usb-phy", "usb-suspend-override"; | ||||
| 		resets = <&rst 4>, <&rst 3>; | ||||
|  | ||||
| 		#phy-cells = <0>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										113
									
								
								target/linux/ath79/dts/ar9132_tl_wr1043nd_v1.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								target/linux/ath79/dts/ar9132_tl_wr1043nd_v1.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9132.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "tplink,tl-wr1043nd-v1", "qca,ar9132"; | ||||
| 	model = "TP-Link TL-WR1043ND Version 1"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x2000000>; | ||||
| 	}; | ||||
|  | ||||
| 	extosc: ref { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-frequency = <40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		poll-interval = <20>; | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 3 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "qss"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 7 GPIO_ACTIVE_LOW>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
| 		led@0 { | ||||
| 			label = "tp-link:green:usb"; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		led@1 { | ||||
| 			label = "tp-link:green:system"; | ||||
| 			gpios = <&gpio 2 GPIO_ACTIVE_LOW>; | ||||
| 			linux,default-trigger = "heartbeat"; | ||||
| 		}; | ||||
|  | ||||
| 		led@2 { | ||||
| 			label = "tp-link:green:qss"; | ||||
| 			gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		led@3 { | ||||
| 			label = "tp-link:green:wlan"; | ||||
| 			gpios = <&gpio 9 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pll { | ||||
| 	clocks = <&extosc>; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	status = "okay"; | ||||
| 	num-cs = <1>; | ||||
|  | ||||
| 	flash@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "s25sl064a"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <25000000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x020000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x020000 0x7D0000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "art"; | ||||
| 			reg = <0x7F0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										160
									
								
								target/linux/ath79/dts/ar9330.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								target/linux/ath79/dts/ar9330.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include <dt-bindings/clock/ath79-clk.h> | ||||
| #include "ath79.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,ar9330"; | ||||
|  | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "mips,mips24Kc"; | ||||
| 			clocks = <&pll ATH79_CLK_CPU>; | ||||
| 			reg = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyATH0,115200"; | ||||
| 	}; | ||||
|  | ||||
| 	ahb { | ||||
| 		apb { | ||||
| 			ddr_ctrl: memory-controller@18000000 { | ||||
| 				compatible = "qca,ar7240-ddr-controller"; | ||||
| 				reg = <0x18000000 0x100>; | ||||
|  | ||||
| 				#qca,ddr-wb-channel-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			uart: uart@18020000 { | ||||
| 				compatible = "qca,ar9330-uart"; | ||||
| 				reg = <0x18020000 0x14>; | ||||
|  | ||||
| 				interrupts = <3>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_REF>; | ||||
| 				clock-names = "uart"; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			gpio: gpio@18040000 { | ||||
| 				compatible = "qca,ar7100-gpio"; | ||||
| 				reg = <0x18040000 0x34>; | ||||
| 				interrupts = <2>; | ||||
|  | ||||
| 				ngpios = <30>; | ||||
|  | ||||
| 				gpio-controller; | ||||
| 				#gpio-cells = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <2>; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			pll: pll-controller@18050000 { | ||||
| 				compatible = "qca,ar9330-pll"; | ||||
| 				reg = <0x18050000 0x100>; | ||||
|  | ||||
| 				#clock-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			rst: reset-controller@1806001c { | ||||
| 				compatible = "qca,ar7100-reset"; | ||||
| 				reg = <0x1806001c 0x4>; | ||||
|  | ||||
| 				#reset-cells = <1>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		usb: usb@1b000100 { | ||||
| 			compatible = "chipidea,usb2"; | ||||
| 			reg = <0x1b000000 0x200>; | ||||
|  | ||||
| 			interrupts = <3>; | ||||
| 			resets = <&rst 5>; | ||||
| 			reset-names = "usb-host"; | ||||
|  | ||||
| 			phy-names = "usb-phy"; | ||||
| 			phys = <&usb_phy>; | ||||
|  | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		spi: spi@1f000000 { | ||||
| 			compatible = "qca,ar7100-spi"; | ||||
| 			reg = <0x1f000000 0x10>; | ||||
|  | ||||
| 			clocks = <&pll ATH79_CLK_AHB>; | ||||
| 			clock-names = "ahb"; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
|  | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		gmac: gmac@18070000 { | ||||
| 			compatible = "qca,qr9330-gmac"; | ||||
| 			reg = <0x18070000 0x4>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	usb_phy: usb-phy { | ||||
| 		compatible = "qca,ar7200-usb-phy"; | ||||
|  | ||||
| 		reset-names = "usb-phy", "usb-suspend-override"; | ||||
| 		resets = <&rst 4>, <&rst 3>; | ||||
|  | ||||
| 		#phy-cells = <0>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &cpuintc { | ||||
| 	qca,ddr-wb-channel-interrupts = <2>, <3>; | ||||
| 	qca,ddr-wb-channels = <&ddr_ctrl 3>, <&ddr_ctrl 2>; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	compatible = "qca,ar9330-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
|  | ||||
| 	resets = <&rst 9>; | ||||
| 	reset-names = "mac"; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	regmap = <ð1>; | ||||
| 	builtin-switch; | ||||
| 	resets = <&rst 23>; | ||||
| 	reset-names = "mdio"; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	resets = <&rst 23>; | ||||
| 	reset-names = "mdio"; | ||||
|  | ||||
| 	builtin-switch; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "qca,ar9330-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x00110000 0x00001099 0x00991099>; | ||||
| 	phy-mode = "gmii"; | ||||
|  | ||||
| 	resets = <&rst 13>; | ||||
| 	reset-names = "mac"; | ||||
| }; | ||||
							
								
								
									
										156
									
								
								target/linux/ath79/dts/ar9330_gl_ar150.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								target/linux/ath79/dts/ar9330_gl_ar150.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9330.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "GL.iNet GL-AR150"; | ||||
| 	compatible = "glinet,ar150"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		wlan { | ||||
| 			label = "gl-ar150:orange:wlan"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		lan { | ||||
| 			label = "gl-ar150:green:lan"; | ||||
| 			gpios = <&gpio 13 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wan { | ||||
| 			label = "gl-ar150:green:wan"; | ||||
| 			gpios = <&gpio 15 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		manual { | ||||
| 			label = "manual"; | ||||
| 			linux,code = <BTN_7>; | ||||
| 			gpios = <&gpio 7 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		auto { | ||||
| 			label = "auto"; | ||||
| 			linux,code = <BTN_8>; | ||||
| 			gpios = <&gpio 8 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		reset { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| 	gpios = <&gpio 6 GPIO_ACTIVE_HIGH>; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	spiflash { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x040000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x040000 0x010000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x050000 0xfa0000>; | ||||
| 		}; | ||||
|  | ||||
| 		art: partition@3 { | ||||
| 			label = "ART"; | ||||
| 			reg = <0xff0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy4: ethernet-phy@4 { | ||||
| 		reg = <4>; | ||||
| 		phy-mode = "mii"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x0>; | ||||
|  | ||||
| 	phy-handle = <&phy4>; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x0>; | ||||
|  | ||||
| 	fixed-link { | ||||
| 		speed = <1000>; | ||||
| 		full-duplex; | ||||
| 	}; | ||||
|  | ||||
| 	gmac-config { | ||||
| 		device = <&gmac>; | ||||
|  | ||||
| 		switch-phy-addr-swap = <0>; | ||||
| 		switch-phy-swap = <0>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										6
									
								
								target/linux/ath79/dts/ar9331.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								target/linux/ath79/dts/ar9331.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include "ar9330.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,ar9331"; | ||||
| }; | ||||
							
								
								
									
										79
									
								
								target/linux/ath79/dts/ar9331_dpt_module.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								target/linux/ath79/dts/ar9331_dpt_module.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9331.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "DPTechnics DPT-Module"; | ||||
| 	compatible = "dptechnics,dpt-module"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		system { | ||||
| 			label = "dpt-module:green:system"; | ||||
| 			gpios = <&gpio 27 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ref { | ||||
| 	clock-frequency = <25000000>; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	/* Winbond 25Q128FVSG SPI flash */ | ||||
| 	spiflash: w25q128@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "winbond,w25q128", "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										103
									
								
								target/linux/ath79/dts/ar9331_dragino_ms14.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								target/linux/ath79/dts/ar9331_dragino_ms14.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9331.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "Dragino MS14 (Dragino 2)"; | ||||
| 	compatible = "dragino,ms14"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		wlan { | ||||
| 			label = "dragino2:red:wlan"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		lan { | ||||
| 			label = "dragino2:red:lan"; | ||||
| 			gpios = <&gpio 13 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wan { | ||||
| 			label = "dragino2:red:wan"; | ||||
| 			gpios = <&gpio 17 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		system { | ||||
| 			label = "dragino2:red:system"; | ||||
| 			gpios = <&gpio 28 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "jumpstart"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 12 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ref { | ||||
| 	clock-frequency = <25000000>; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	/* Winbond 25Q128BVFG SPI flash */ | ||||
| 	spiflash: w25q128@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "winbond,w25q128", "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										124
									
								
								target/linux/ath79/dts/ar9331_ew_dorin.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								target/linux/ath79/dts/ar9331_ew_dorin.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9331.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "Embedded Wireless Dorin"; | ||||
| 	compatible = "embeddedwireless,dorin"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		status { | ||||
| 			label = "dorin:green:status"; | ||||
| 			gpios = <&gpio 21 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		wps { | ||||
| 			label = "wps"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
|  | ||||
| 		reset { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 6 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	spiflash { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x040000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x040000 0x010000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x050000 0xfa0000>; | ||||
| 		}; | ||||
|  | ||||
| 		art: partition@3 { | ||||
| 			label = "ART"; | ||||
| 			reg = <0xff0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	mtd-mac-address = <&art 0x1002>; | ||||
|  | ||||
| 	fixed-link { | ||||
| 		speed = <1000>; | ||||
| 		full-duplex; | ||||
| 	}; | ||||
|  | ||||
| 	gmac-config { | ||||
| 		device = <&gmac>; | ||||
|  | ||||
| 		switch-phy-addr-swap = <1>; | ||||
| 		switch-phy-swap = <1>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
							
								
								
									
										79
									
								
								target/linux/ath79/dts/ar9331_omega.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								target/linux/ath79/dts/ar9331_omega.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9331.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "Onion Omega"; | ||||
| 	compatible = "onion,omega"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x4000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		system { | ||||
| 			label = "onion:amber:system"; | ||||
| 			gpios = <&gpio 27 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ref { | ||||
| 	clock-frequency = <25000000>; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	/* Winbond 25Q128FVSG SPI flash */ | ||||
| 	spiflash: w25q128@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "winbond,w25q128", "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										119
									
								
								target/linux/ath79/dts/ar9331_tl_mr3020.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								target/linux/ath79/dts/ar9331_tl_mr3020.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "ar9331.dtsi" | ||||
|  | ||||
| / { | ||||
| 	model = "TP-Link TL-MR3020"; | ||||
| 	compatible = "tplink,tl-mr3020"; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &uart; | ||||
| 	}; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x2000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		wlan { | ||||
| 			label = "tp-link:green:wlan"; | ||||
| 			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		lan { | ||||
| 			label = "tp-link:green:lan"; | ||||
| 			gpios = <&gpio 17 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wps { | ||||
| 			label = "tp-link:green:wps"; | ||||
| 			gpios = <&gpio 26 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		led3g { | ||||
| 			label = "tp-link:green:3g"; | ||||
| 			gpios = <&gpio 27 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "wps"; | ||||
| 			linux,code = <KEY_WPS_BUTTON>; | ||||
| 			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "sw1"; | ||||
| 			linux,code = <BTN_0>; | ||||
| 			gpios = <&gpio 18 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
|  | ||||
| 		button@2 { | ||||
| 			label = "sw2"; | ||||
| 			linux,code = <BTN_1>; | ||||
| 			gpios = <&gpio 20 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	reg_usb_vbus: reg_usb_vbus { | ||||
| 		compatible = "regulator-fixed"; | ||||
| 		regulator-name = "usb_vbus"; | ||||
| 		regulator-min-microvolt = <5000000>; | ||||
| 		regulator-max-microvolt = <5000000>; | ||||
| 		gpio = <&gpio 8 GPIO_ACTIVE_HIGH>; | ||||
| 		enable-active-high; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &ref { | ||||
| 	clock-frequency = <25000000>; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &gpio { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb { | ||||
| 	dr_mode = "host"; | ||||
| 	vbus-supply = <®_usb_vbus>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &usb_phy { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	num-chipselects = <1>; | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	/* Spansion S25FL032PIF SPI flash */ | ||||
| 	spiflash: s25sl032p@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "spansion,s25sl032p", "jedec,spi-nor"; | ||||
| 		spi-max-frequency = <104000000>; | ||||
| 		reg = <0>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										81
									
								
								target/linux/ath79/dts/ath79.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								target/linux/ath79/dts/ath79.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
|  | ||||
| / { | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	cpuintc: interrupt-controller { | ||||
| 		compatible = "qca,ar7100-cpu-intc"; | ||||
|  | ||||
| 		interrupt-controller; | ||||
| 		#interrupt-cells = <1>; | ||||
| 	}; | ||||
|  | ||||
| 	ahb { | ||||
| 		compatible = "simple-bus"; | ||||
| 		ranges; | ||||
|  | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
|  | ||||
| 		interrupt-parent = <&cpuintc>; | ||||
|  | ||||
| 		apb { | ||||
| 			compatible = "simple-bus"; | ||||
| 			ranges; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <1>; | ||||
|  | ||||
| 			interrupt-parent = <&miscintc>; | ||||
|  | ||||
| 			miscintc: interrupt-controller@18060010 { | ||||
| 				compatible = "qca,ar7240-misc-intc"; | ||||
| 				reg = <0x18060010 0x4>; | ||||
|  | ||||
| 				interrupt-parent = <&cpuintc>; | ||||
| 				interrupts = <6>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <1>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		eth0: eth@19000000 { | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			compatible = "qca,ath79-eth", "syscon"; | ||||
| 			reg = <0x19000000 0x200>; | ||||
|  | ||||
| 			interrupts = <4>; | ||||
| 			phy-mode = "mii"; | ||||
|  | ||||
| 			mdio0: mdio-bus { | ||||
| 				status = "disabled"; | ||||
|  | ||||
| 				regmap = <ð0>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_MDIO>; | ||||
| 				clock-names = "ref"; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		eth1: eth@1a000000 { | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			compatible = "qca,ath79-eth", "syscon"; | ||||
| 			reg = <0x1a000000 0x200>; | ||||
|  | ||||
| 			interrupts = <5>; | ||||
| 			phy-mode = "mii"; | ||||
|  | ||||
| 			mdio1: mdio-bus { | ||||
| 				status = "disabled"; | ||||
|  | ||||
| 				regmap = <ð1>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_MDIO>; | ||||
| 				clock-names = "ref"; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										201
									
								
								target/linux/ath79/dts/qca9557.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								target/linux/ath79/dts/qca9557.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| #include <dt-bindings/clock/ath79-clk.h> | ||||
| #include "ath79.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "qca,qca9557"; | ||||
|  | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	cpus { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		cpu@0 { | ||||
| 			device_type = "cpu"; | ||||
| 			compatible = "mips,mips24Kc"; | ||||
| 			clocks = <&pll ATH79_CLK_CPU>; | ||||
| 			reg = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	ahb { | ||||
| 		apb { | ||||
| 			ddr_ctrl: memory-controller@18000000 { | ||||
| 				compatible = "qca,ar9557-ddr-controller", | ||||
| 						"qca,ar7240-ddr-controller"; | ||||
| 				reg = <0x18000000 0x100>; | ||||
|  | ||||
| 				#qca,ddr-wb-channel-cells = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			uart: uart@18020000 { | ||||
| 				compatible = "ns16550a"; | ||||
| 				reg = <0x18020000 0x20>; | ||||
|  | ||||
| 				interrupts = <3>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_REF>; | ||||
| 				clock-names = "uart"; | ||||
|  | ||||
| 				reg-io-width = <4>; | ||||
| 				reg-shift = <2>; | ||||
| 				no-loopback-test; | ||||
|  | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | ||||
| 			gpio: gpio@18040000 { | ||||
| 				compatible = "qca,ar9557-gpio", | ||||
| 						"qca,ar9340-gpio"; | ||||
| 				reg = <0x18040000 0x28>; | ||||
|  | ||||
| 				interrupts = <2>; | ||||
| 				ngpios = <24>; | ||||
|  | ||||
| 				gpio-controller; | ||||
| 				#gpio-cells = <2>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <2>; | ||||
| 			}; | ||||
|  | ||||
| 			pinmux: pinmux@1804002c { | ||||
| 				compatible = "pinctrl-single"; | ||||
|  | ||||
| 				reg = <0x1804002c 0x40>; | ||||
|  | ||||
| 				#size-cells = <0>; | ||||
|  | ||||
| 				pinctrl-single,bit-per-mux; | ||||
| 				pinctrl-single,register-width = <32>; | ||||
| 				pinctrl-single,function-mask = <0x1>; | ||||
| 				#pinctrl-cells = <2>; | ||||
|  | ||||
| 				jtag_disable_pins: pinmux_jtag_disable_pins { | ||||
| 					pinctrl-single,bits = <0x40 0x2  0x2>; | ||||
| 				}; | ||||
| 			}; | ||||
|  | ||||
| 			pll: pll-controller@18050000 { | ||||
| 				compatible = "qca,ar9557-pll", | ||||
| 						"qca,qca9550-pll"; | ||||
| 				reg = <0x18050000 0x20>; | ||||
|  | ||||
| 				#clock-cells = <1>; | ||||
| 				clock-output-names = "cpu", "ddr", "ahb"; | ||||
| 			}; | ||||
|  | ||||
| 			wdt: wdt@18060008 { | ||||
| 				compatible = "qca,ar7130-wdt"; | ||||
| 				reg = <0x18060008 0x8>; | ||||
|  | ||||
| 				interrupts = <4>; | ||||
|  | ||||
| 				clocks = <&pll ATH79_CLK_AHB>; | ||||
| 				clock-names = "wdt"; | ||||
| 			}; | ||||
|  | ||||
| 			rst: reset-controller@1806001c { | ||||
| 				compatible = "qca,ar9557-reset", | ||||
| 						"qca,ar7100-reset", | ||||
| 						 "simple-bus"; | ||||
| 				reg = <0x1806001c 0x4>; | ||||
|  | ||||
| 				#reset-cells = <1>; | ||||
| 				interrupt-parent = <&cpuintc>; | ||||
|  | ||||
| 				intc2: interrupt-controller@2 { | ||||
| 					compatible = "qcom,qca9556-intc"; | ||||
|  | ||||
| 					interrupts = <2>; | ||||
|  | ||||
| 					interrupt-controller; | ||||
| 					#interrupt-cells = <1>; | ||||
|  | ||||
| 					qcom,pending-bits = <0x1f0>,	/* pcie rc1 */ | ||||
| 							    <0xf>;	/* wmac */ | ||||
| 				}; | ||||
|  | ||||
| 				intc3: interrupt-controller@3 { | ||||
| 					compatible = "qcom,qca9556-intc"; | ||||
|  | ||||
| 					interrupts = <3>; | ||||
|  | ||||
| 					interrupt-controller; | ||||
| 					#interrupt-cells = <1>; | ||||
|  | ||||
| 					qcom,pending-bits = <0x1f000>,		/* pcie rc2 */ | ||||
| 							    <0x1000000>,	/* usb1 */ | ||||
| 							    <0x10000000>;	/* usb2 */ | ||||
| 				}; | ||||
| 			}; | ||||
|  | ||||
| 			pcie0: pcie-controller@180c0000 { | ||||
| 				compatible = "qcom,ar7240-pci"; | ||||
| 				#address-cells = <3>; | ||||
| 				#size-cells = <2>; | ||||
| 				bus-range = <0x0 0x0>; | ||||
| 				reg = <0x180c0000 0x1000>, /* CRP */ | ||||
| 				      <0x180f0000 0x100>,  /* CTRL */ | ||||
| 				      <0x14000000 0x1000>; /* CFG */ | ||||
| 				reg-names = "crp_base", "ctrl_base", "cfg_base"; | ||||
| 				ranges = <0x2000000 0 0x10000000 0x10000000 0 0x04000000	/* pci memory */ | ||||
| 					  0x1000000 0 0x00000000 0x0000000 0 0x000001>;		/* io space */ | ||||
| 				interrupt-parent = <&intc2>; | ||||
| 				interrupts = <0>; | ||||
|  | ||||
| 				interrupt-controller; | ||||
| 				#interrupt-cells = <1>; | ||||
|  | ||||
| 				interrupt-map-mask = <0 0 0 1>; | ||||
| 				interrupt-map = <0 0 0 0 &pcie0 0>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		spi: spi@1f000000 { | ||||
| 			compatible = "qca,ar9557-spi", "qca,ar7100-spi"; | ||||
| 			reg = <0x1f000000 0x10>; | ||||
|  | ||||
| 			clocks = <&pll ATH79_CLK_AHB>; | ||||
| 			clock-names = "ahb"; | ||||
|  | ||||
| 			status = "disabled"; | ||||
|  | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <0>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	resets = <&rst 22>; | ||||
| 	reset-names = "mdio"; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	compatible = "qca,qca9550-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x82000101 0x80000101 0x80001313>; | ||||
| 	phy-mode = "rgmii"; | ||||
|  | ||||
| 	resets = <&rst 9>; | ||||
| 	reset-names = "mac"; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	resets = <&rst 23>; | ||||
| 	reset-names = "mdio"; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	compatible = "qca,qca9550-eth", "syscon"; | ||||
|  | ||||
| 	pll-data = <0x82000101 0x80000101 0x80001313>; | ||||
| 	phy-mode = "sgmii"; | ||||
|  | ||||
| 	resets = <&rst 13>; | ||||
| 	reset-names = "mac"; | ||||
| }; | ||||
							
								
								
									
										170
									
								
								target/linux/ath79/dts/qca9558_om5p_ac.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								target/linux/ath79/dts/qca9558_om5p_ac.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0 | ||||
| /dts-v1/; | ||||
|  | ||||
| #include <dt-bindings/gpio/gpio.h> | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| #include "qca9557.dtsi" | ||||
|  | ||||
| / { | ||||
| 	compatible = "openmesh,om5p-ac-v2", "qca,qca9557"; | ||||
| 	model = "OpenMesh OM5P-AC V2"; | ||||
|  | ||||
| 	memory@0 { | ||||
| 		device_type = "memory"; | ||||
| 		reg = <0x0 0x8000000>; | ||||
| 	}; | ||||
|  | ||||
| 	extosc: ref { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-output-names = "ref"; | ||||
| 		clock-frequency = <40000000>; | ||||
| 	}; | ||||
|  | ||||
| 	leds { | ||||
| 		compatible = "gpio-leds"; | ||||
|  | ||||
| 		power { | ||||
| 			label = "om5pac:blue:power"; | ||||
| 			gpios = <&gpio 14 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wifi_green { | ||||
| 			label = "om5pac:green:wifi"; | ||||
| 			gpios = <&gpio 13 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wifi_yellow { | ||||
| 			label = "om5pac:yellow:wifi"; | ||||
| 			gpios = <&gpio 15 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
|  | ||||
| 		wifi_red { | ||||
| 			label = "om5pac:red:wifi"; | ||||
| 			gpios = <&gpio 23 GPIO_ACTIVE_LOW>; | ||||
| 			default-state = "off"; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	keys { | ||||
| 		compatible = "gpio-keys-polled"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		poll-interval = <100>; | ||||
|  | ||||
| 		button@0 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	gpio-export { | ||||
| 		compatible = "gpio-export"; | ||||
| 		#size-cells = <0>; | ||||
|  | ||||
| 		gpio_pa_dcdc { | ||||
| 			gpio-export,name = "om5pac:pa_dcdc"; | ||||
| 			gpio-export,output = <1>; | ||||
| 			gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 		gpio_pa_high { | ||||
| 			gpio-export,name = "om5pac:pa_high"; | ||||
| 			gpio-export,output = <1>; | ||||
| 			gpios = <&gpio 16 GPIO_ACTIVE_HIGH>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pinmux { | ||||
| 	pinmux_pa_dcdc_pins { | ||||
| 		pinctrl-single,bits = <0x0 0xff00 0x0>; | ||||
| 	}; | ||||
|  | ||||
| 	pinmux_pa_high_pins { | ||||
| 		pinctrl-single,bits = <0x10 0xff 0x0>; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pcie0 { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &uart { | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
| &pll { | ||||
| 	clocks = <&extosc>; | ||||
| }; | ||||
|  | ||||
| &spi { | ||||
| 	status = "okay"; | ||||
| 	num-cs = <1>; | ||||
|  | ||||
| 	flash@0 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "mx25l12805d"; | ||||
| 		reg = <0>; | ||||
| 		spi-max-frequency = <25000000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "u-boot"; | ||||
| 			reg = <0x000000 0x040000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
|  | ||||
| 		partition@1 { | ||||
| 			label = "u-boot-env"; | ||||
| 			reg = <0x040000 0x010000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@2 { | ||||
| 			label = "firmware"; | ||||
| 			reg = <0x850000 0x7a0000>; | ||||
| 		}; | ||||
|  | ||||
| 		partition@3 { | ||||
| 			label = "ART"; | ||||
| 			reg = <0xff0000 0x010000>; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy4: ethernet-phy@4 { | ||||
| 		reg = <4>; | ||||
| 		phy-mode = "rgmii-id"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &mdio1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy1: ethernet-phy@1 { | ||||
| 		reg = <1>; | ||||
| 		phy-mode = "sgmii"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| ð0 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy-handle = <&phy4>; | ||||
| 	phy-mode = "rgmii"; | ||||
| }; | ||||
|  | ||||
| ð1 { | ||||
| 	status = "okay"; | ||||
|  | ||||
| 	phy-handle = <&phy1>; | ||||
| 	phy-mode = "sgmii"; | ||||
| }; | ||||
							
								
								
									
										126
									
								
								target/linux/ath79/files/arch/mips/ath79/pci-ath9k-fixup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								target/linux/ath79/files/arch/mips/ath79/pci-ath9k-fixup.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| /* | ||||
|  *  Atheros AP94 reference board PCI initialization | ||||
|  * | ||||
|  *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #include <linux/pci.h> | ||||
| #include <linux/delay.h> | ||||
|  | ||||
| #include <asm/mach-ath79/ar71xx_regs.h> | ||||
| #include <asm/mach-ath79/ath79.h> | ||||
|  | ||||
| struct ath9k_fixup { | ||||
| 	u16		*cal_data; | ||||
| 	unsigned	slot; | ||||
| }; | ||||
|  | ||||
| static int ath9k_num_fixups; | ||||
| static struct ath9k_fixup ath9k_fixups[2]; | ||||
|  | ||||
| static void ath9k_pci_fixup(struct pci_dev *dev) | ||||
| { | ||||
| 	void __iomem *mem; | ||||
| 	u16 *cal_data = NULL; | ||||
| 	u16 cmd; | ||||
| 	u32 bar0; | ||||
| 	u32 val; | ||||
| 	unsigned i; | ||||
|  | ||||
| 	for (i = 0; i < ath9k_num_fixups; i++) { | ||||
| 		if (ath9k_fixups[i].cal_data == NULL) | ||||
| 			continue; | ||||
|  | ||||
| 		if (ath9k_fixups[i].slot != PCI_SLOT(dev->devfn)) | ||||
| 			continue; | ||||
|  | ||||
| 		cal_data = ath9k_fixups[i].cal_data; | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	if (cal_data == NULL) | ||||
| 		return; | ||||
|  | ||||
| 	if (*cal_data != 0xa55a) { | ||||
| 		pr_err("pci %s: invalid calibration data\n", pci_name(dev)); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	pr_info("pci %s: fixup device configuration\n", pci_name(dev)); | ||||
|  | ||||
| 	mem = ioremap(AR71XX_PCI_MEM_BASE, 0x10000); | ||||
| 	if (!mem) { | ||||
| 		pr_err("pci %s: ioremap error\n", pci_name(dev)); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); | ||||
|  | ||||
| 	switch (ath79_soc) { | ||||
| 	case ATH79_SOC_AR7161: | ||||
| 		pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, | ||||
| 				       AR71XX_PCI_MEM_BASE); | ||||
| 		break; | ||||
| 	case ATH79_SOC_AR7240: | ||||
| 		pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0xffff); | ||||
| 		break; | ||||
|  | ||||
| 	case ATH79_SOC_AR7241: | ||||
| 	case ATH79_SOC_AR7242: | ||||
| 		pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0x1000ffff); | ||||
| 		break; | ||||
| 	case ATH79_SOC_AR9344: | ||||
| 		pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0x1000ffff); | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | ||||
| 	pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||||
| 	cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; | ||||
| 	pci_write_config_word(dev, PCI_COMMAND, cmd); | ||||
|  | ||||
| 	/* set pointer to first reg address */ | ||||
| 	cal_data += 3; | ||||
| 	while (*cal_data != 0xffff) { | ||||
| 		u32 reg; | ||||
| 		reg = *cal_data++; | ||||
| 		val = *cal_data++; | ||||
| 		val |= (*cal_data++) << 16; | ||||
|  | ||||
| 		__raw_writel(val, mem + reg); | ||||
| 		udelay(100); | ||||
| 	} | ||||
|  | ||||
| 	pci_read_config_dword(dev, PCI_VENDOR_ID, &val); | ||||
| 	dev->vendor = val & 0xffff; | ||||
| 	dev->device = (val >> 16) & 0xffff; | ||||
|  | ||||
| 	pci_read_config_dword(dev, PCI_CLASS_REVISION, &val); | ||||
| 	dev->revision = val & 0xff; | ||||
| 	dev->class = val >> 8; /* upper 3 bytes */ | ||||
|  | ||||
| 	pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||||
| 	cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); | ||||
| 	pci_write_config_word(dev, PCI_COMMAND, cmd); | ||||
|  | ||||
| 	pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0); | ||||
|  | ||||
| 	iounmap(mem); | ||||
| } | ||||
| DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath9k_pci_fixup); | ||||
|  | ||||
| void __init pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) | ||||
| { | ||||
| 	if (ath9k_num_fixups >= ARRAY_SIZE(ath9k_fixups)) | ||||
| 		return; | ||||
|  | ||||
| 	ath9k_fixups[ath9k_num_fixups].slot = slot; | ||||
| 	ath9k_fixups[ath9k_num_fixups].cal_data = cal_data; | ||||
| 	ath9k_num_fixups++; | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| #ifndef _PCI_ATH9K_FIXUP | ||||
| #define _PCI_ATH9K_FIXUP | ||||
|  | ||||
| void pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) __init; | ||||
|  | ||||
| #endif /* _PCI_ATH9K_FIXUP */ | ||||
| @@ -0,0 +1,34 @@ | ||||
| /* | ||||
|  *  Compex's MyLoader specific definitions | ||||
|  * | ||||
|  *  Copyright (C) 2006-2008 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef _ASM_MIPS_FW_MYLOADER_H | ||||
| #define _ASM_MIPS_FW_MYLOADER_H | ||||
|  | ||||
| #include <linux/myloader.h> | ||||
|  | ||||
| struct myloader_info { | ||||
| 	uint32_t	vid; | ||||
| 	uint32_t	did; | ||||
| 	uint32_t	svid; | ||||
| 	uint32_t	sdid; | ||||
| 	uint8_t		macs[MYLO_ETHADDR_COUNT][6]; | ||||
| }; | ||||
|  | ||||
| #ifdef CONFIG_MYLOADER | ||||
| extern struct myloader_info *myloader_get_info(void) __init; | ||||
| #else | ||||
| static inline struct myloader_info *myloader_get_info(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* CONFIG_MYLOADER */ | ||||
|  | ||||
| #endif /* _ASM_MIPS_FW_MYLOADER_H */ | ||||
							
								
								
									
										235
									
								
								target/linux/ath79/files/drivers/mtd/tplinkpart.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								target/linux/ath79/files/drivers/mtd/tplinkpart.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| /* | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/vmalloc.h> | ||||
| #include <linux/magic.h> | ||||
|  | ||||
| #include <linux/mtd/mtd.h> | ||||
| #include <linux/mtd/partitions.h> | ||||
| #include <linux/version.h> | ||||
|  | ||||
| #define TPLINK_NUM_PARTS	5 | ||||
| #define TPLINK_HEADER_V1	0x01000000 | ||||
| #define TPLINK_HEADER_V2	0x02000000 | ||||
| #define MD5SUM_LEN		16 | ||||
|  | ||||
| #define TPLINK_ART_LEN		0x10000 | ||||
| #define TPLINK_KERNEL_OFFS	0x20000 | ||||
| #define TPLINK_64K_KERNEL_OFFS	0x10000 | ||||
|  | ||||
| struct tplink_fw_header { | ||||
| 	uint32_t	version;	/* header version */ | ||||
| 	char		vendor_name[24]; | ||||
| 	char		fw_version[36]; | ||||
| 	uint32_t	hw_id;		/* hardware id */ | ||||
| 	uint32_t	hw_rev;		/* hardware revision */ | ||||
| 	uint32_t	unk1; | ||||
| 	uint8_t		md5sum1[MD5SUM_LEN]; | ||||
| 	uint32_t	unk2; | ||||
| 	uint8_t		md5sum2[MD5SUM_LEN]; | ||||
| 	uint32_t	unk3; | ||||
| 	uint32_t	kernel_la;	/* kernel load address */ | ||||
| 	uint32_t	kernel_ep;	/* kernel entry point */ | ||||
| 	uint32_t	fw_length;	/* total length of the firmware */ | ||||
| 	uint32_t	kernel_ofs;	/* kernel data offset */ | ||||
| 	uint32_t	kernel_len;	/* kernel data length */ | ||||
| 	uint32_t	rootfs_ofs;	/* rootfs data offset */ | ||||
| 	uint32_t	rootfs_len;	/* rootfs data length */ | ||||
| 	uint32_t	boot_ofs;	/* bootloader data offset */ | ||||
| 	uint32_t	boot_len;	/* bootloader data length */ | ||||
| 	uint8_t		pad[360]; | ||||
| } __attribute__ ((packed)); | ||||
|  | ||||
| static struct tplink_fw_header * | ||||
| tplink_read_header(struct mtd_info *mtd, size_t offset) | ||||
| { | ||||
| 	struct tplink_fw_header *header; | ||||
| 	size_t header_len; | ||||
| 	size_t retlen; | ||||
| 	int ret; | ||||
| 	u32 t; | ||||
|  | ||||
| 	header = vmalloc(sizeof(*header)); | ||||
| 	if (!header) | ||||
| 		goto err; | ||||
|  | ||||
| 	header_len = sizeof(struct tplink_fw_header); | ||||
| 	ret = mtd_read(mtd, offset, header_len, &retlen, | ||||
| 		       (unsigned char *) header); | ||||
| 	if (ret) | ||||
| 		goto err_free_header; | ||||
|  | ||||
| 	if (retlen != header_len) | ||||
| 		goto err_free_header; | ||||
|  | ||||
| 	/* sanity checks */ | ||||
| 	t = be32_to_cpu(header->version); | ||||
| 	if ((t != TPLINK_HEADER_V1) && (t != TPLINK_HEADER_V2)) | ||||
| 		goto err_free_header; | ||||
|  | ||||
| 	t = be32_to_cpu(header->kernel_ofs); | ||||
| 	if (t != header_len) | ||||
| 		goto err_free_header; | ||||
|  | ||||
| 	return header; | ||||
|  | ||||
| err_free_header: | ||||
| 	vfree(header); | ||||
| err: | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| static int tplink_check_rootfs_magic(struct mtd_info *mtd, size_t offset) | ||||
| { | ||||
| 	u32 magic; | ||||
| 	size_t retlen; | ||||
| 	int ret; | ||||
|  | ||||
| 	ret = mtd_read(mtd, offset, sizeof(magic), &retlen, | ||||
| 		       (unsigned char *) &magic); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  | ||||
| 	if (retlen != sizeof(magic)) | ||||
| 		return -EIO; | ||||
|  | ||||
| 	if (le32_to_cpu(magic) != SQUASHFS_MAGIC && | ||||
| 	    magic != 0x19852003) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int tplink_parse_partitions_offset(struct mtd_info *master, | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) | ||||
| 				   struct mtd_partition **pparts, | ||||
| #else | ||||
| 				   const struct mtd_partition **pparts, | ||||
| #endif | ||||
| 				   struct mtd_part_parser_data *data, | ||||
| 				   size_t offset) | ||||
| { | ||||
| 	struct mtd_partition *parts; | ||||
| 	struct tplink_fw_header *header; | ||||
| 	int nr_parts; | ||||
| 	size_t art_offset; | ||||
| 	size_t rootfs_offset; | ||||
| 	size_t squashfs_offset; | ||||
| 	int ret; | ||||
|  | ||||
| 	nr_parts = TPLINK_NUM_PARTS; | ||||
| 	parts = kzalloc(nr_parts * sizeof(struct mtd_partition), GFP_KERNEL); | ||||
| 	if (!parts) { | ||||
| 		ret = -ENOMEM; | ||||
| 		goto err; | ||||
| 	} | ||||
|  | ||||
| 	header = tplink_read_header(master, offset); | ||||
| 	if (!header) { | ||||
| 		pr_notice("%s: no TP-Link header found\n", master->name); | ||||
| 		ret = -ENODEV; | ||||
| 		goto err_free_parts; | ||||
| 	} | ||||
|  | ||||
| 	squashfs_offset = offset + sizeof(struct tplink_fw_header) + | ||||
| 			  be32_to_cpu(header->kernel_len); | ||||
|  | ||||
| 	ret = tplink_check_rootfs_magic(master, squashfs_offset); | ||||
| 	if (ret == 0) | ||||
| 		rootfs_offset = squashfs_offset; | ||||
| 	else | ||||
| 		rootfs_offset = offset + be32_to_cpu(header->rootfs_ofs); | ||||
|  | ||||
| 	art_offset = master->size - TPLINK_ART_LEN; | ||||
|  | ||||
| 	parts[0].name = "u-boot"; | ||||
| 	parts[0].offset = 0; | ||||
| 	parts[0].size = offset; | ||||
| 	parts[0].mask_flags = MTD_WRITEABLE; | ||||
|  | ||||
| 	parts[1].name = "kernel"; | ||||
| 	parts[1].offset = offset; | ||||
| 	parts[1].size = rootfs_offset - offset; | ||||
|  | ||||
| 	parts[2].name = "rootfs"; | ||||
| 	parts[2].offset = rootfs_offset; | ||||
| 	parts[2].size = art_offset - rootfs_offset; | ||||
|  | ||||
| 	parts[3].name = "art"; | ||||
| 	parts[3].offset = art_offset; | ||||
| 	parts[3].size = TPLINK_ART_LEN; | ||||
| 	parts[3].mask_flags = MTD_WRITEABLE; | ||||
|  | ||||
| 	parts[4].name = "firmware"; | ||||
| 	parts[4].offset = offset; | ||||
| 	parts[4].size = art_offset - offset; | ||||
|  | ||||
| 	vfree(header); | ||||
|  | ||||
| 	*pparts = parts; | ||||
| 	return nr_parts; | ||||
|  | ||||
| err_free_parts: | ||||
| 	kfree(parts); | ||||
| err: | ||||
| 	*pparts = NULL; | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static int tplink_parse_partitions(struct mtd_info *master, | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) | ||||
| 				   struct mtd_partition **pparts, | ||||
| #else | ||||
| 				   const struct mtd_partition **pparts, | ||||
| #endif | ||||
| 				   struct mtd_part_parser_data *data) | ||||
| { | ||||
| 	return tplink_parse_partitions_offset(master, pparts, data, | ||||
| 		                              TPLINK_KERNEL_OFFS); | ||||
| } | ||||
|  | ||||
| static int tplink_parse_64k_partitions(struct mtd_info *master, | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) | ||||
| 				   struct mtd_partition **pparts, | ||||
| #else | ||||
| 				   const struct mtd_partition **pparts, | ||||
| #endif | ||||
| 				   struct mtd_part_parser_data *data) | ||||
| { | ||||
| 	return tplink_parse_partitions_offset(master, pparts, data, | ||||
| 		                              TPLINK_64K_KERNEL_OFFS); | ||||
| } | ||||
|  | ||||
| static struct mtd_part_parser tplink_parser = { | ||||
| 	.owner		= THIS_MODULE, | ||||
| 	.parse_fn	= tplink_parse_partitions, | ||||
| 	.name		= "tp-link", | ||||
| }; | ||||
|  | ||||
| static struct mtd_part_parser tplink_64k_parser = { | ||||
| 	.owner		= THIS_MODULE, | ||||
| 	.parse_fn	= tplink_parse_64k_partitions, | ||||
| 	.name		= "tp-link-64k", | ||||
| }; | ||||
|  | ||||
| static int __init tplink_parser_init(void) | ||||
| { | ||||
| 	register_mtd_parser(&tplink_parser); | ||||
| 	register_mtd_parser(&tplink_64k_parser); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| module_init(tplink_parser_init); | ||||
|  | ||||
| MODULE_LICENSE("GPL v2"); | ||||
| MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); | ||||
							
								
								
									
										289
									
								
								target/linux/ath79/files/drivers/net/dsa/mv88e6063.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								target/linux/ath79/files/drivers/net/dsa/mv88e6063.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,289 @@ | ||||
| /* | ||||
|  * net/dsa/mv88e6063.c - Driver for Marvell 88e6063 switch chips | ||||
|  * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * This driver was base on: net/dsa/mv88e6060.c | ||||
|  *   net/dsa/mv88e6063.c - Driver for Marvell 88e6060 switch chips | ||||
|  *   Copyright (c) 2008-2009 Marvell Semiconductor | ||||
|  * | ||||
|  * 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; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  */ | ||||
|  | ||||
| #include <linux/version.h> | ||||
| #include <linux/list.h> | ||||
| #include <linux/netdevice.h> | ||||
| #include <linux/phy.h> | ||||
| #include <net/dsa.h> | ||||
| #include <linux/version.h> | ||||
|  | ||||
| #define REG_BASE		0x10 | ||||
| #define REG_PHY(p)		(REG_BASE + (p)) | ||||
| #define REG_PORT(p)		(REG_BASE + 8 + (p)) | ||||
| #define REG_GLOBAL		(REG_BASE + 0x0f) | ||||
| #define NUM_PORTS		7 | ||||
|  | ||||
| static int reg_read(struct dsa_switch *ds, int addr, int reg) | ||||
| { | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) | ||||
| 	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); | ||||
| 	return mdiobus_read(bus, addr, reg); | ||||
| #else | ||||
| 	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->dev); | ||||
| 	return mdiobus_read(bus, addr, reg); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #define REG_READ(addr, reg)					\ | ||||
| 	({							\ | ||||
| 		int __ret;					\ | ||||
| 								\ | ||||
| 		__ret = reg_read(ds, addr, reg);		\ | ||||
| 		if (__ret < 0)					\ | ||||
| 			return __ret;				\ | ||||
| 		__ret;						\ | ||||
| 	}) | ||||
|  | ||||
|  | ||||
| static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) | ||||
| { | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) | ||||
| 	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); | ||||
| 	return mdiobus_write(bus, addr, reg, val); | ||||
| #else | ||||
| 	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->dev); | ||||
| 	return mdiobus_write(bus, addr, reg, val); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,8,0) | ||||
| static enum dsa_tag_protocol mv88e6063_get_tag_protocol(struct dsa_switch *ds) | ||||
| { | ||||
| 	return DSA_TAG_PROTO_TRAILER; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #define REG_WRITE(addr, reg, val)				\ | ||||
| 	({							\ | ||||
| 		int __ret;					\ | ||||
| 								\ | ||||
| 		__ret = reg_write(ds, addr, reg, val);		\ | ||||
| 		if (__ret < 0)					\ | ||||
| 			return __ret;				\ | ||||
| 	}) | ||||
|  | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) | ||||
| static char *mv88e6063_drv_probe(struct device *host_dev, int sw_addr) | ||||
| #else | ||||
| static const char *mv88e6063_drv_probe(struct device *dsa_dev, | ||||
| 				       struct device *host_dev, int sw_addr, | ||||
| 				       void **_priv) | ||||
| #endif | ||||
| { | ||||
| 	struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); | ||||
| 	int ret; | ||||
|  | ||||
| 	if (!bus) | ||||
| 		return NULL; | ||||
|  | ||||
| 	ret = mdiobus_read(bus, REG_PORT(0), 0x03); | ||||
| 	if (ret >= 0) { | ||||
| 		ret &= 0xfff0; | ||||
| 		if (ret == 0x1530) | ||||
| 			return "Marvell 88E6063"; | ||||
| 	} | ||||
|  | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_switch_reset(struct dsa_switch *ds) | ||||
| { | ||||
| 	int i; | ||||
| 	int ret; | ||||
|  | ||||
| 	/* | ||||
| 	 * Set all ports to the disabled state. | ||||
| 	 */ | ||||
| 	for (i = 0; i < NUM_PORTS; i++) { | ||||
| 		ret = REG_READ(REG_PORT(i), 0x04); | ||||
| 		REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Wait for transmit queues to drain. | ||||
| 	 */ | ||||
| 	msleep(2); | ||||
|  | ||||
| 	/* | ||||
| 	 * Reset the switch. | ||||
| 	 */ | ||||
| 	REG_WRITE(REG_GLOBAL, 0x0a, 0xa130); | ||||
|  | ||||
| 	/* | ||||
| 	 * Wait up to one second for reset to complete. | ||||
| 	 */ | ||||
| 	for (i = 0; i < 1000; i++) { | ||||
| 		ret = REG_READ(REG_GLOBAL, 0x00); | ||||
| 		if ((ret & 0x8000) == 0x0000) | ||||
| 			break; | ||||
|  | ||||
| 		msleep(1); | ||||
| 	} | ||||
| 	if (i == 1000) | ||||
| 		return -ETIMEDOUT; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_setup_global(struct dsa_switch *ds) | ||||
| { | ||||
| 	/* | ||||
| 	 * Disable discarding of frames with excessive collisions, | ||||
| 	 * set the maximum frame size to 1536 bytes, and mask all | ||||
| 	 * interrupt sources. | ||||
| 	 */ | ||||
| 	REG_WRITE(REG_GLOBAL, 0x04, 0x0800); | ||||
|  | ||||
| 	/* | ||||
| 	 * Enable automatic address learning, set the address | ||||
| 	 * database size to 1024 entries, and set the default aging | ||||
| 	 * time to 5 minutes. | ||||
| 	 */ | ||||
| 	REG_WRITE(REG_GLOBAL, 0x0a, 0x2130); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_setup_port(struct dsa_switch *ds, int p) | ||||
| { | ||||
| 	int addr = REG_PORT(p); | ||||
|  | ||||
| 	/* | ||||
| 	 * Do not force flow control, disable Ingress and Egress | ||||
| 	 * Header tagging, disable VLAN tunneling, and set the port | ||||
| 	 * state to Forwarding.  Additionally, if this is the CPU | ||||
| 	 * port, enable Ingress and Egress Trailer tagging mode. | ||||
| 	 */ | ||||
| 	REG_WRITE(addr, 0x04, dsa_is_cpu_port(ds, p) ?  0x4103 : 0x0003); | ||||
|  | ||||
| 	/* | ||||
| 	 * Port based VLAN map: give each port its own address | ||||
| 	 * database, allow the CPU port to talk to each of the 'real' | ||||
| 	 * ports, and allow each of the 'real' ports to only talk to | ||||
| 	 * the CPU port. | ||||
| 	 */ | ||||
| 	REG_WRITE(addr, 0x06, | ||||
| 			((p & 0xf) << 12) | | ||||
| 			 (dsa_is_cpu_port(ds, p) ? | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) | ||||
| 				ds->phys_port_mask : | ||||
| #else | ||||
| 				ds->enabled_port_mask : | ||||
| #endif | ||||
| 				(1 << ds->dst->cpu_port))); | ||||
|  | ||||
| 	/* | ||||
| 	 * Port Association Vector: when learning source addresses | ||||
| 	 * of packets, add the address to the address database using | ||||
| 	 * a port bitmap that has only the bit for this port set and | ||||
| 	 * the other bits clear. | ||||
| 	 */ | ||||
| 	REG_WRITE(addr, 0x0b, 1 << p); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_setup(struct dsa_switch *ds) | ||||
| { | ||||
| 	int i; | ||||
| 	int ret; | ||||
|  | ||||
| 	ret = mv88e6063_switch_reset(ds); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
|  | ||||
| 	/* @@@ initialise atu */ | ||||
|  | ||||
| 	ret = mv88e6063_setup_global(ds); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
|  | ||||
| 	for (i = 0; i < NUM_PORTS; i++) { | ||||
| 		ret = mv88e6063_setup_port(ds, i); | ||||
| 		if (ret < 0) | ||||
| 			return ret; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_set_addr(struct dsa_switch *ds, u8 *addr) | ||||
| { | ||||
| 	REG_WRITE(REG_GLOBAL, 0x01, (addr[0] << 8) | addr[1]); | ||||
| 	REG_WRITE(REG_GLOBAL, 0x02, (addr[2] << 8) | addr[3]); | ||||
| 	REG_WRITE(REG_GLOBAL, 0x03, (addr[4] << 8) | addr[5]); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_port_to_phy_addr(int port) | ||||
| { | ||||
| 	if (port >= 0 && port <= NUM_PORTS) | ||||
| 		return REG_PHY(port); | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| static int mv88e6063_phy_read(struct dsa_switch *ds, int port, int regnum) | ||||
| { | ||||
| 	int addr; | ||||
|  | ||||
| 	addr = mv88e6063_port_to_phy_addr(port); | ||||
| 	if (addr == -1) | ||||
| 		return 0xffff; | ||||
|  | ||||
| 	return reg_read(ds, addr, regnum); | ||||
| } | ||||
|  | ||||
| static int | ||||
| mv88e6063_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val) | ||||
| { | ||||
| 	int addr; | ||||
|  | ||||
| 	addr = mv88e6063_port_to_phy_addr(port); | ||||
| 	if (addr == -1) | ||||
| 		return 0xffff; | ||||
|  | ||||
| 	return reg_write(ds, addr, regnum, val); | ||||
| } | ||||
|  | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) | ||||
| static struct dsa_switch_driver mv88e6063_switch_ops = { | ||||
| #else | ||||
| static struct dsa_switch_ops mv88e6063_switch_ops = { | ||||
| #endif | ||||
| #if LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0) | ||||
| 	.tag_protocol	= htons(ETH_P_TRAILER), | ||||
| #else | ||||
| 	.get_tag_protocol = mv88e6063_get_tag_protocol, | ||||
| #endif | ||||
| 	.probe		= mv88e6063_drv_probe, | ||||
| 	.setup		= mv88e6063_setup, | ||||
| 	.set_addr	= mv88e6063_set_addr, | ||||
| 	.phy_read	= mv88e6063_phy_read, | ||||
| 	.phy_write	= mv88e6063_phy_write, | ||||
| }; | ||||
|  | ||||
| static int __init mv88e6063_init(void) | ||||
| { | ||||
| 	register_switch_driver(&mv88e6063_switch_ops); | ||||
| 	return 0; | ||||
| } | ||||
| module_init(mv88e6063_init); | ||||
|  | ||||
| static void __exit mv88e6063_cleanup(void) | ||||
| { | ||||
| 	unregister_switch_driver(&mv88e6063_switch_ops); | ||||
| } | ||||
| module_exit(mv88e6063_cleanup); | ||||
| @@ -0,0 +1,25 @@ | ||||
| config AG71XX | ||||
| 	tristate "Atheros AR7XXX/AR9XXX built-in ethernet mac support" | ||||
| 	depends on ATH79 | ||||
| 	select PHYLIB | ||||
| 	help | ||||
| 	  If you wish to compile a kernel for AR7XXX/91XXX and enable | ||||
| 	  ethernet support, then you should always answer Y to this. | ||||
|  | ||||
| if AG71XX | ||||
|  | ||||
| config AG71XX_DEBUG | ||||
| 	bool "Atheros AR71xx built-in ethernet driver debugging" | ||||
| 	default n | ||||
| 	help | ||||
| 	  Atheros AR71xx built-in ethernet driver debugging messages. | ||||
|  | ||||
| config AG71XX_DEBUG_FS | ||||
| 	bool "Atheros AR71xx built-in ethernet driver debugfs support" | ||||
| 	depends on DEBUG_FS | ||||
| 	default n | ||||
| 	help | ||||
| 	  Say Y, if you need access to various statistics provided by | ||||
| 	  the ag71xx driver. | ||||
|  | ||||
| endif | ||||
| @@ -0,0 +1,14 @@ | ||||
| # | ||||
| # Makefile for the Atheros AR71xx built-in ethernet macs | ||||
| # | ||||
|  | ||||
| ag71xx-y	+= ag71xx_main.o | ||||
| ag71xx-y	+= ag71xx_ethtool.o | ||||
| ag71xx-y	+= ag71xx_phy.o | ||||
| ag71xx-y	+= ag71xx_mdio.o | ||||
| ag71xx-y	+= ag71xx_ar7240.o | ||||
|  | ||||
| ag71xx-$(CONFIG_AG71XX_DEBUG_FS)	+= ag71xx_debugfs.o | ||||
|  | ||||
| obj-$(CONFIG_AG71XX)	+= ag71xx.o | ||||
|  | ||||
| @@ -0,0 +1,453 @@ | ||||
| /* | ||||
|  *  Atheros AR71xx built-in ethernet mac driver | ||||
|  * | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Based on Atheros' AG7100 driver | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #ifndef __AG71XX_H | ||||
| #define __AG71XX_H | ||||
|  | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/random.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/ethtool.h> | ||||
| #include <linux/etherdevice.h> | ||||
| #include <linux/if_vlan.h> | ||||
| #include <linux/phy.h> | ||||
| #include <linux/skbuff.h> | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include <linux/reset.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/mfd/syscon.h> | ||||
| #include <linux/regmap.h> | ||||
|  | ||||
| #include <linux/bitops.h> | ||||
|  | ||||
| #include <asm/mach-ath79/ar71xx_regs.h> | ||||
| #include <asm/mach-ath79/ath79.h> | ||||
|  | ||||
| #define AG71XX_DRV_NAME		"ag71xx" | ||||
|  | ||||
| /* | ||||
|  * For our NAPI weight bigger does *NOT* mean better - it means more | ||||
|  * D-cache misses and lots more wasted cycles than we'll ever | ||||
|  * possibly gain from saving instructions. | ||||
|  */ | ||||
| #define AG71XX_NAPI_WEIGHT	32 | ||||
| #define AG71XX_OOM_REFILL	(1 + HZ/10) | ||||
|  | ||||
| #define AG71XX_INT_ERR	(AG71XX_INT_RX_BE | AG71XX_INT_TX_BE) | ||||
| #define AG71XX_INT_TX	(AG71XX_INT_TX_PS) | ||||
| #define AG71XX_INT_RX	(AG71XX_INT_RX_PR | AG71XX_INT_RX_OF) | ||||
|  | ||||
| #define AG71XX_INT_POLL	(AG71XX_INT_RX | AG71XX_INT_TX) | ||||
| #define AG71XX_INT_INIT	(AG71XX_INT_ERR | AG71XX_INT_POLL) | ||||
|  | ||||
| #define AG71XX_TX_MTU_LEN	1540 | ||||
|  | ||||
| #define AG71XX_TX_RING_SPLIT		512 | ||||
| #define AG71XX_TX_RING_DS_PER_PKT	DIV_ROUND_UP(AG71XX_TX_MTU_LEN, \ | ||||
| 						     AG71XX_TX_RING_SPLIT) | ||||
| #define AG71XX_TX_RING_SIZE_DEFAULT	128 | ||||
| #define AG71XX_RX_RING_SIZE_DEFAULT	256 | ||||
|  | ||||
| #define AG71XX_TX_RING_SIZE_MAX		128 | ||||
| #define AG71XX_RX_RING_SIZE_MAX		256 | ||||
|  | ||||
| #ifdef CONFIG_AG71XX_DEBUG | ||||
| #define DBG(fmt, args...)	pr_debug(fmt, ## args) | ||||
| #else | ||||
| #define DBG(fmt, args...)	do {} while (0) | ||||
| #endif | ||||
|  | ||||
| #define ag71xx_assert(_cond)						\ | ||||
| do {									\ | ||||
| 	if (_cond)							\ | ||||
| 		break;							\ | ||||
| 	printk("%s,%d: assertion failed\n", __FILE__, __LINE__);	\ | ||||
| 	BUG();								\ | ||||
| } while (0) | ||||
|  | ||||
| struct ag71xx_desc { | ||||
| 	u32	data; | ||||
| 	u32	ctrl; | ||||
| #define DESC_EMPTY	BIT(31) | ||||
| #define DESC_MORE	BIT(24) | ||||
| #define DESC_PKTLEN_M	0xfff | ||||
| 	u32	next; | ||||
| 	u32	pad; | ||||
| } __attribute__((aligned(4))); | ||||
|  | ||||
| #define AG71XX_DESC_SIZE	roundup(sizeof(struct ag71xx_desc), \ | ||||
| 					L1_CACHE_BYTES) | ||||
|  | ||||
| struct ag71xx_buf { | ||||
| 	union { | ||||
| 		struct sk_buff	*skb; | ||||
| 		void		*rx_buf; | ||||
| 	}; | ||||
| 	union { | ||||
| 		dma_addr_t	dma_addr; | ||||
| 		unsigned int		len; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| struct ag71xx_ring { | ||||
| 	struct ag71xx_buf	*buf; | ||||
| 	u8			*descs_cpu; | ||||
| 	dma_addr_t		descs_dma; | ||||
| 	u16			desc_split; | ||||
| 	u16			order; | ||||
| 	unsigned int		curr; | ||||
| 	unsigned int		dirty; | ||||
| }; | ||||
|  | ||||
| struct ag71xx_int_stats { | ||||
| 	unsigned long		rx_pr; | ||||
| 	unsigned long		rx_be; | ||||
| 	unsigned long		rx_of; | ||||
| 	unsigned long		tx_ps; | ||||
| 	unsigned long		tx_be; | ||||
| 	unsigned long		tx_ur; | ||||
| 	unsigned long		total; | ||||
| }; | ||||
|  | ||||
| struct ag71xx_napi_stats { | ||||
| 	unsigned long		napi_calls; | ||||
| 	unsigned long		rx_count; | ||||
| 	unsigned long		rx_packets; | ||||
| 	unsigned long		rx_packets_max; | ||||
| 	unsigned long		tx_count; | ||||
| 	unsigned long		tx_packets; | ||||
| 	unsigned long		tx_packets_max; | ||||
|  | ||||
| 	unsigned long		rx[AG71XX_NAPI_WEIGHT + 1]; | ||||
| 	unsigned long		tx[AG71XX_NAPI_WEIGHT + 1]; | ||||
| }; | ||||
|  | ||||
| struct ag71xx_debug { | ||||
| 	struct dentry		*debugfs_dir; | ||||
|  | ||||
| 	struct ag71xx_int_stats int_stats; | ||||
| 	struct ag71xx_napi_stats napi_stats; | ||||
| }; | ||||
|  | ||||
| struct ag71xx { | ||||
| 	/* | ||||
| 	 * Critical data related to the per-packet data path are clustered | ||||
| 	 * early in this structure to help improve the D-cache footprint. | ||||
| 	 */ | ||||
| 	struct ag71xx_ring	rx_ring ____cacheline_aligned; | ||||
| 	struct ag71xx_ring	tx_ring ____cacheline_aligned; | ||||
|  | ||||
| 	u16			desc_pktlen_mask; | ||||
| 	u16			rx_buf_size; | ||||
| 	u8			rx_buf_offset; | ||||
| 	u8			tx_hang_workaround:1; | ||||
|  | ||||
| 	struct net_device	*dev; | ||||
| 	struct platform_device  *pdev; | ||||
| 	spinlock_t		lock; | ||||
| 	struct napi_struct	napi; | ||||
| 	u32			msg_enable; | ||||
|  | ||||
| 	/* | ||||
| 	 * From this point onwards we're not looking at per-packet fields. | ||||
| 	 */ | ||||
| 	void __iomem		*mac_base; | ||||
| 	void __iomem		*mii_base; | ||||
| 	struct regmap		*mii_regmap; | ||||
|  | ||||
| 	struct ag71xx_desc	*stop_desc; | ||||
| 	dma_addr_t		stop_desc_dma; | ||||
|  | ||||
| 	struct mii_bus		*mii_bus; | ||||
| 	struct phy_device	*phy_dev; | ||||
| 	void			*phy_priv; | ||||
| 	int			phy_if_mode; | ||||
|  | ||||
| 	unsigned int		link; | ||||
| 	unsigned int		speed; | ||||
| 	int			duplex; | ||||
|  | ||||
| 	struct delayed_work	restart_work; | ||||
| 	struct timer_list	oom_timer; | ||||
|  | ||||
| 	struct reset_control *mac_reset; | ||||
| 	struct reset_control *phy_reset; | ||||
| 	struct reset_control *mdio_reset; | ||||
|  | ||||
| 	u32			fifodata[3]; | ||||
| 	u32			plldata[3]; | ||||
| 	u32			pllreg[3]; | ||||
| 	struct regmap		*pllregmap; | ||||
|  | ||||
| #ifdef CONFIG_AG71XX_DEBUG_FS | ||||
| 	struct ag71xx_debug	debug; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| extern struct ethtool_ops ag71xx_ethtool_ops; | ||||
| void ag71xx_link_adjust(struct ag71xx *ag); | ||||
|  | ||||
| int ag71xx_phy_connect(struct ag71xx *ag); | ||||
| void ag71xx_phy_disconnect(struct ag71xx *ag); | ||||
|  | ||||
| static inline int ag71xx_desc_empty(struct ag71xx_desc *desc) | ||||
| { | ||||
| 	return (desc->ctrl & DESC_EMPTY) != 0; | ||||
| } | ||||
|  | ||||
| static inline struct ag71xx_desc * | ||||
| ag71xx_ring_desc(struct ag71xx_ring *ring, int idx) | ||||
| { | ||||
| 	return (struct ag71xx_desc *) &ring->descs_cpu[idx * AG71XX_DESC_SIZE]; | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| ag71xx_ring_size_order(int size) | ||||
| { | ||||
| 	return fls(size - 1); | ||||
| } | ||||
|  | ||||
| /* Register offsets */ | ||||
| #define AG71XX_REG_MAC_CFG1	0x0000 | ||||
| #define AG71XX_REG_MAC_CFG2	0x0004 | ||||
| #define AG71XX_REG_MAC_IPG	0x0008 | ||||
| #define AG71XX_REG_MAC_HDX	0x000c | ||||
| #define AG71XX_REG_MAC_MFL	0x0010 | ||||
| #define AG71XX_REG_MII_CFG	0x0020 | ||||
| #define AG71XX_REG_MII_CMD	0x0024 | ||||
| #define AG71XX_REG_MII_ADDR	0x0028 | ||||
| #define AG71XX_REG_MII_CTRL	0x002c | ||||
| #define AG71XX_REG_MII_STATUS	0x0030 | ||||
| #define AG71XX_REG_MII_IND	0x0034 | ||||
| #define AG71XX_REG_MAC_IFCTL	0x0038 | ||||
| #define AG71XX_REG_MAC_ADDR1	0x0040 | ||||
| #define AG71XX_REG_MAC_ADDR2	0x0044 | ||||
| #define AG71XX_REG_FIFO_CFG0	0x0048 | ||||
| #define AG71XX_REG_FIFO_CFG1	0x004c | ||||
| #define AG71XX_REG_FIFO_CFG2	0x0050 | ||||
| #define AG71XX_REG_FIFO_CFG3	0x0054 | ||||
| #define AG71XX_REG_FIFO_CFG4	0x0058 | ||||
| #define AG71XX_REG_FIFO_CFG5	0x005c | ||||
| #define AG71XX_REG_FIFO_RAM0	0x0060 | ||||
| #define AG71XX_REG_FIFO_RAM1	0x0064 | ||||
| #define AG71XX_REG_FIFO_RAM2	0x0068 | ||||
| #define AG71XX_REG_FIFO_RAM3	0x006c | ||||
| #define AG71XX_REG_FIFO_RAM4	0x0070 | ||||
| #define AG71XX_REG_FIFO_RAM5	0x0074 | ||||
| #define AG71XX_REG_FIFO_RAM6	0x0078 | ||||
| #define AG71XX_REG_FIFO_RAM7	0x007c | ||||
|  | ||||
| #define AG71XX_REG_TX_CTRL	0x0180 | ||||
| #define AG71XX_REG_TX_DESC	0x0184 | ||||
| #define AG71XX_REG_TX_STATUS	0x0188 | ||||
| #define AG71XX_REG_RX_CTRL	0x018c | ||||
| #define AG71XX_REG_RX_DESC	0x0190 | ||||
| #define AG71XX_REG_RX_STATUS	0x0194 | ||||
| #define AG71XX_REG_INT_ENABLE	0x0198 | ||||
| #define AG71XX_REG_INT_STATUS	0x019c | ||||
|  | ||||
| #define AG71XX_REG_FIFO_DEPTH	0x01a8 | ||||
| #define AG71XX_REG_RX_SM	0x01b0 | ||||
| #define AG71XX_REG_TX_SM	0x01b4 | ||||
|  | ||||
| #define MAC_CFG1_TXE		BIT(0)	/* Tx Enable */ | ||||
| #define MAC_CFG1_STX		BIT(1)	/* Synchronize Tx Enable */ | ||||
| #define MAC_CFG1_RXE		BIT(2)	/* Rx Enable */ | ||||
| #define MAC_CFG1_SRX		BIT(3)	/* Synchronize Rx Enable */ | ||||
| #define MAC_CFG1_TFC		BIT(4)	/* Tx Flow Control Enable */ | ||||
| #define MAC_CFG1_RFC		BIT(5)	/* Rx Flow Control Enable */ | ||||
| #define MAC_CFG1_LB		BIT(8)	/* Loopback mode */ | ||||
| #define MAC_CFG1_SR		BIT(31)	/* Soft Reset */ | ||||
|  | ||||
| #define MAC_CFG2_FDX		BIT(0) | ||||
| #define MAC_CFG2_CRC_EN		BIT(1) | ||||
| #define MAC_CFG2_PAD_CRC_EN	BIT(2) | ||||
| #define MAC_CFG2_LEN_CHECK	BIT(4) | ||||
| #define MAC_CFG2_HUGE_FRAME_EN	BIT(5) | ||||
| #define MAC_CFG2_IF_1000	BIT(9) | ||||
| #define MAC_CFG2_IF_10_100	BIT(8) | ||||
|  | ||||
| #define FIFO_CFG0_WTM		BIT(0)	/* Watermark Module */ | ||||
| #define FIFO_CFG0_RXS		BIT(1)	/* Rx System Module */ | ||||
| #define FIFO_CFG0_RXF		BIT(2)	/* Rx Fabric Module */ | ||||
| #define FIFO_CFG0_TXS		BIT(3)	/* Tx System Module */ | ||||
| #define FIFO_CFG0_TXF		BIT(4)	/* Tx Fabric Module */ | ||||
| #define FIFO_CFG0_ALL	(FIFO_CFG0_WTM | FIFO_CFG0_RXS | FIFO_CFG0_RXF \ | ||||
| 			| FIFO_CFG0_TXS | FIFO_CFG0_TXF) | ||||
|  | ||||
| #define FIFO_CFG0_ENABLE_SHIFT	8 | ||||
|  | ||||
| #define FIFO_CFG4_DE		BIT(0)	/* Drop Event */ | ||||
| #define FIFO_CFG4_DV		BIT(1)	/* RX_DV Event */ | ||||
| #define FIFO_CFG4_FC		BIT(2)	/* False Carrier */ | ||||
| #define FIFO_CFG4_CE		BIT(3)	/* Code Error */ | ||||
| #define FIFO_CFG4_CR		BIT(4)	/* CRC error */ | ||||
| #define FIFO_CFG4_LM		BIT(5)	/* Length Mismatch */ | ||||
| #define FIFO_CFG4_LO		BIT(6)	/* Length out of range */ | ||||
| #define FIFO_CFG4_OK		BIT(7)	/* Packet is OK */ | ||||
| #define FIFO_CFG4_MC		BIT(8)	/* Multicast Packet */ | ||||
| #define FIFO_CFG4_BC		BIT(9)	/* Broadcast Packet */ | ||||
| #define FIFO_CFG4_DR		BIT(10)	/* Dribble */ | ||||
| #define FIFO_CFG4_LE		BIT(11)	/* Long Event */ | ||||
| #define FIFO_CFG4_CF		BIT(12)	/* Control Frame */ | ||||
| #define FIFO_CFG4_PF		BIT(13)	/* Pause Frame */ | ||||
| #define FIFO_CFG4_UO		BIT(14)	/* Unsupported Opcode */ | ||||
| #define FIFO_CFG4_VT		BIT(15)	/* VLAN tag detected */ | ||||
| #define FIFO_CFG4_FT		BIT(16)	/* Frame Truncated */ | ||||
| #define FIFO_CFG4_UC		BIT(17)	/* Unicast Packet */ | ||||
|  | ||||
| #define FIFO_CFG5_DE		BIT(0)	/* Drop Event */ | ||||
| #define FIFO_CFG5_DV		BIT(1)	/* RX_DV Event */ | ||||
| #define FIFO_CFG5_FC		BIT(2)	/* False Carrier */ | ||||
| #define FIFO_CFG5_CE		BIT(3)	/* Code Error */ | ||||
| #define FIFO_CFG5_LM		BIT(4)	/* Length Mismatch */ | ||||
| #define FIFO_CFG5_LO		BIT(5)	/* Length Out of Range */ | ||||
| #define FIFO_CFG5_OK		BIT(6)	/* Packet is OK */ | ||||
| #define FIFO_CFG5_MC		BIT(7)	/* Multicast Packet */ | ||||
| #define FIFO_CFG5_BC		BIT(8)	/* Broadcast Packet */ | ||||
| #define FIFO_CFG5_DR		BIT(9)	/* Dribble */ | ||||
| #define FIFO_CFG5_CF		BIT(10)	/* Control Frame */ | ||||
| #define FIFO_CFG5_PF		BIT(11)	/* Pause Frame */ | ||||
| #define FIFO_CFG5_UO		BIT(12)	/* Unsupported Opcode */ | ||||
| #define FIFO_CFG5_VT		BIT(13)	/* VLAN tag detected */ | ||||
| #define FIFO_CFG5_LE		BIT(14)	/* Long Event */ | ||||
| #define FIFO_CFG5_FT		BIT(15)	/* Frame Truncated */ | ||||
| #define FIFO_CFG5_16		BIT(16)	/* unknown */ | ||||
| #define FIFO_CFG5_17		BIT(17)	/* unknown */ | ||||
| #define FIFO_CFG5_SF		BIT(18)	/* Short Frame */ | ||||
| #define FIFO_CFG5_BM		BIT(19)	/* Byte Mode */ | ||||
|  | ||||
| #define AG71XX_INT_TX_PS	BIT(0) | ||||
| #define AG71XX_INT_TX_UR	BIT(1) | ||||
| #define AG71XX_INT_TX_BE	BIT(3) | ||||
| #define AG71XX_INT_RX_PR	BIT(4) | ||||
| #define AG71XX_INT_RX_OF	BIT(6) | ||||
| #define AG71XX_INT_RX_BE	BIT(7) | ||||
|  | ||||
| #define MAC_IFCTL_SPEED		BIT(16) | ||||
|  | ||||
| #define MII_CFG_CLK_DIV_4	0 | ||||
| #define MII_CFG_CLK_DIV_6	2 | ||||
| #define MII_CFG_CLK_DIV_8	3 | ||||
| #define MII_CFG_CLK_DIV_10	4 | ||||
| #define MII_CFG_CLK_DIV_14	5 | ||||
| #define MII_CFG_CLK_DIV_20	6 | ||||
| #define MII_CFG_CLK_DIV_28	7 | ||||
| #define MII_CFG_CLK_DIV_34	8 | ||||
| #define MII_CFG_CLK_DIV_42	9 | ||||
| #define MII_CFG_CLK_DIV_50	10 | ||||
| #define MII_CFG_CLK_DIV_58	11 | ||||
| #define MII_CFG_CLK_DIV_66	12 | ||||
| #define MII_CFG_CLK_DIV_74	13 | ||||
| #define MII_CFG_CLK_DIV_82	14 | ||||
| #define MII_CFG_CLK_DIV_98	15 | ||||
| #define MII_CFG_RESET		BIT(31) | ||||
|  | ||||
| #define MII_CMD_WRITE		0x0 | ||||
| #define MII_CMD_READ		0x1 | ||||
| #define MII_ADDR_SHIFT		8 | ||||
| #define MII_IND_BUSY		BIT(0) | ||||
| #define MII_IND_INVALID		BIT(2) | ||||
|  | ||||
| #define TX_CTRL_TXE		BIT(0)	/* Tx Enable */ | ||||
|  | ||||
| #define TX_STATUS_PS		BIT(0)	/* Packet Sent */ | ||||
| #define TX_STATUS_UR		BIT(1)	/* Tx Underrun */ | ||||
| #define TX_STATUS_BE		BIT(3)	/* Bus Error */ | ||||
|  | ||||
| #define RX_CTRL_RXE		BIT(0)	/* Rx Enable */ | ||||
|  | ||||
| #define RX_STATUS_PR		BIT(0)	/* Packet Received */ | ||||
| #define RX_STATUS_OF		BIT(2)	/* Rx Overflow */ | ||||
| #define RX_STATUS_BE		BIT(3)	/* Bus Error */ | ||||
|  | ||||
| static inline void ag71xx_wr(struct ag71xx *ag, unsigned reg, u32 value) | ||||
| { | ||||
| 	__raw_writel(value, ag->mac_base + reg); | ||||
| 	/* flush write */ | ||||
| 	(void) __raw_readl(ag->mac_base + reg); | ||||
| } | ||||
|  | ||||
| static inline u32 ag71xx_rr(struct ag71xx *ag, unsigned reg) | ||||
| { | ||||
| 	return __raw_readl(ag->mac_base + reg); | ||||
| } | ||||
|  | ||||
| static inline void ag71xx_sb(struct ag71xx *ag, unsigned reg, u32 mask) | ||||
| { | ||||
| 	void __iomem *r; | ||||
|  | ||||
| 	r = ag->mac_base + reg; | ||||
| 	__raw_writel(__raw_readl(r) | mask, r); | ||||
| 	/* flush write */ | ||||
| 	(void) __raw_readl(r); | ||||
| } | ||||
|  | ||||
| static inline void ag71xx_cb(struct ag71xx *ag, unsigned reg, u32 mask) | ||||
| { | ||||
| 	void __iomem *r; | ||||
|  | ||||
| 	r = ag->mac_base + reg; | ||||
| 	__raw_writel(__raw_readl(r) & ~mask, r); | ||||
| 	/* flush write */ | ||||
| 	(void) __raw_readl(r); | ||||
| } | ||||
|  | ||||
| static inline void ag71xx_int_enable(struct ag71xx *ag, u32 ints) | ||||
| { | ||||
| 	ag71xx_sb(ag, AG71XX_REG_INT_ENABLE, ints); | ||||
| } | ||||
|  | ||||
| static inline void ag71xx_int_disable(struct ag71xx *ag, u32 ints) | ||||
| { | ||||
| 	ag71xx_cb(ag, AG71XX_REG_INT_ENABLE, ints); | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_AG71XX_DEBUG_FS | ||||
| int ag71xx_debugfs_root_init(void); | ||||
| void ag71xx_debugfs_root_exit(void); | ||||
| int ag71xx_debugfs_init(struct ag71xx *ag); | ||||
| void ag71xx_debugfs_exit(struct ag71xx *ag); | ||||
| void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, u32 status); | ||||
| void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx); | ||||
| #else | ||||
| static inline int ag71xx_debugfs_root_init(void) { return 0; } | ||||
| static inline void ag71xx_debugfs_root_exit(void) {} | ||||
| static inline int ag71xx_debugfs_init(struct ag71xx *ag) { return 0; } | ||||
| static inline void ag71xx_debugfs_exit(struct ag71xx *ag) {} | ||||
| static inline void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, | ||||
| 						   u32 status) {} | ||||
| static inline void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, | ||||
| 						    int rx, int tx) {} | ||||
| #endif /* CONFIG_AG71XX_DEBUG_FS */ | ||||
|  | ||||
| int ag71xx_ar7240_init(struct ag71xx *ag, struct device_node *np); | ||||
| void ag71xx_ar7240_cleanup(struct ag71xx *ag); | ||||
| void ag71xx_ar7240_start(struct ag71xx *ag); | ||||
|  | ||||
| int ag71xx_mdio_init(struct ag71xx *ag); | ||||
| void ag71xx_mdio_cleanup(struct ag71xx *ag); | ||||
| int ag71xx_mdio_mii_read(struct mii_bus *bus, int addr, int reg); | ||||
| int ag71xx_mdio_mii_write(struct mii_bus *bus, int addr, int reg, u16 val); | ||||
|  | ||||
| int ar7240sw_phy_read(struct mii_bus *mii, int addr, int reg); | ||||
| int ar7240sw_phy_write(struct mii_bus *mii, int addr, int reg, u16 val); | ||||
|  | ||||
| #endif /* _AG71XX_H */ | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,285 @@ | ||||
| /* | ||||
|  *  Atheros AR71xx built-in ethernet mac driver | ||||
|  * | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Based on Atheros' AG7100 driver | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #include <linux/debugfs.h> | ||||
|  | ||||
| #include "ag71xx.h" | ||||
|  | ||||
| static struct dentry *ag71xx_debugfs_root; | ||||
|  | ||||
| static int ag71xx_debugfs_generic_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	file->private_data = inode->i_private; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, u32 status) | ||||
| { | ||||
| 	if (status) | ||||
| 		ag->debug.int_stats.total++; | ||||
| 	if (status & AG71XX_INT_TX_PS) | ||||
| 		ag->debug.int_stats.tx_ps++; | ||||
| 	if (status & AG71XX_INT_TX_UR) | ||||
| 		ag->debug.int_stats.tx_ur++; | ||||
| 	if (status & AG71XX_INT_TX_BE) | ||||
| 		ag->debug.int_stats.tx_be++; | ||||
| 	if (status & AG71XX_INT_RX_PR) | ||||
| 		ag->debug.int_stats.rx_pr++; | ||||
| 	if (status & AG71XX_INT_RX_OF) | ||||
| 		ag->debug.int_stats.rx_of++; | ||||
| 	if (status & AG71XX_INT_RX_BE) | ||||
| 		ag->debug.int_stats.rx_be++; | ||||
| } | ||||
|  | ||||
| static ssize_t read_file_int_stats(struct file *file, char __user *user_buf, | ||||
| 				   size_t count, loff_t *ppos) | ||||
| { | ||||
| #define PR_INT_STAT(_label, _field)					\ | ||||
| 	len += snprintf(buf + len, sizeof(buf) - len,			\ | ||||
| 		"%20s: %10lu\n", _label, ag->debug.int_stats._field); | ||||
|  | ||||
| 	struct ag71xx *ag = file->private_data; | ||||
| 	char buf[256]; | ||||
| 	unsigned int len = 0; | ||||
|  | ||||
| 	PR_INT_STAT("TX Packet Sent", tx_ps); | ||||
| 	PR_INT_STAT("TX Underrun", tx_ur); | ||||
| 	PR_INT_STAT("TX Bus Error", tx_be); | ||||
| 	PR_INT_STAT("RX Packet Received", rx_pr); | ||||
| 	PR_INT_STAT("RX Overflow", rx_of); | ||||
| 	PR_INT_STAT("RX Bus Error", rx_be); | ||||
| 	len += snprintf(buf + len, sizeof(buf) - len, "\n"); | ||||
| 	PR_INT_STAT("Total", total); | ||||
|  | ||||
| 	return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||||
| #undef PR_INT_STAT | ||||
| } | ||||
|  | ||||
| static const struct file_operations ag71xx_fops_int_stats = { | ||||
| 	.open	= ag71xx_debugfs_generic_open, | ||||
| 	.read	= read_file_int_stats, | ||||
| 	.owner	= THIS_MODULE | ||||
| }; | ||||
|  | ||||
| void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx) | ||||
| { | ||||
| 	struct ag71xx_napi_stats *stats = &ag->debug.napi_stats; | ||||
|  | ||||
| 	if (rx) { | ||||
| 		stats->rx_count++; | ||||
| 		stats->rx_packets += rx; | ||||
| 		if (rx <= AG71XX_NAPI_WEIGHT) | ||||
| 			stats->rx[rx]++; | ||||
| 		if (rx > stats->rx_packets_max) | ||||
| 			stats->rx_packets_max = rx; | ||||
| 	} | ||||
|  | ||||
| 	if (tx) { | ||||
| 		stats->tx_count++; | ||||
| 		stats->tx_packets += tx; | ||||
| 		if (tx <= AG71XX_NAPI_WEIGHT) | ||||
| 			stats->tx[tx]++; | ||||
| 		if (tx > stats->tx_packets_max) | ||||
| 			stats->tx_packets_max = tx; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static ssize_t read_file_napi_stats(struct file *file, char __user *user_buf, | ||||
| 				    size_t count, loff_t *ppos) | ||||
| { | ||||
| 	struct ag71xx *ag = file->private_data; | ||||
| 	struct ag71xx_napi_stats *stats = &ag->debug.napi_stats; | ||||
| 	char *buf; | ||||
| 	unsigned int buflen; | ||||
| 	unsigned int len = 0; | ||||
| 	unsigned long rx_avg = 0; | ||||
| 	unsigned long tx_avg = 0; | ||||
| 	int ret; | ||||
| 	int i; | ||||
|  | ||||
| 	buflen = 2048; | ||||
| 	buf = kmalloc(buflen, GFP_KERNEL); | ||||
| 	if (!buf) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| 	if (stats->rx_count) | ||||
| 		rx_avg = stats->rx_packets / stats->rx_count; | ||||
|  | ||||
| 	if (stats->tx_count) | ||||
| 		tx_avg = stats->tx_packets / stats->tx_count; | ||||
|  | ||||
| 	len += snprintf(buf + len, buflen - len, "%3s  %10s %10s\n", | ||||
| 			"len", "rx", "tx"); | ||||
|  | ||||
| 	for (i = 1; i <= AG71XX_NAPI_WEIGHT; i++) | ||||
| 		len += snprintf(buf + len, buflen - len, | ||||
| 				"%3d: %10lu %10lu\n", | ||||
| 				i, stats->rx[i], stats->tx[i]); | ||||
|  | ||||
| 	len += snprintf(buf + len, buflen - len, "\n"); | ||||
|  | ||||
| 	len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", | ||||
| 			"sum", stats->rx_count, stats->tx_count); | ||||
| 	len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", | ||||
| 			"avg", rx_avg, tx_avg); | ||||
| 	len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", | ||||
| 			"max", stats->rx_packets_max, stats->tx_packets_max); | ||||
| 	len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", | ||||
| 			"pkt", stats->rx_packets, stats->tx_packets); | ||||
|  | ||||
| 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||||
| 	kfree(buf); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static const struct file_operations ag71xx_fops_napi_stats = { | ||||
| 	.open	= ag71xx_debugfs_generic_open, | ||||
| 	.read	= read_file_napi_stats, | ||||
| 	.owner	= THIS_MODULE | ||||
| }; | ||||
|  | ||||
| #define DESC_PRINT_LEN	64 | ||||
|  | ||||
| static ssize_t read_file_ring(struct file *file, char __user *user_buf, | ||||
| 			      size_t count, loff_t *ppos, | ||||
| 			      struct ag71xx *ag, | ||||
| 			      struct ag71xx_ring *ring, | ||||
| 			      unsigned desc_reg) | ||||
| { | ||||
| 	int ring_size = BIT(ring->order); | ||||
| 	int ring_mask = ring_size - 1; | ||||
| 	char *buf; | ||||
| 	unsigned int buflen; | ||||
| 	unsigned int len = 0; | ||||
| 	unsigned long flags; | ||||
| 	ssize_t ret; | ||||
| 	int curr; | ||||
| 	int dirty; | ||||
| 	u32 desc_hw; | ||||
| 	int i; | ||||
|  | ||||
| 	buflen = (ring_size * DESC_PRINT_LEN); | ||||
| 	buf = kmalloc(buflen, GFP_KERNEL); | ||||
| 	if (!buf) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| 	len += snprintf(buf + len, buflen - len, | ||||
| 			"Idx ... %-8s %-8s %-8s %-8s .\n", | ||||
| 			"desc", "next", "data", "ctrl"); | ||||
|  | ||||
| 	spin_lock_irqsave(&ag->lock, flags); | ||||
|  | ||||
| 	curr = (ring->curr & ring_mask); | ||||
| 	dirty = (ring->dirty & ring_mask); | ||||
| 	desc_hw = ag71xx_rr(ag, desc_reg); | ||||
| 	for (i = 0; i < ring_size; i++) { | ||||
| 		struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); | ||||
| 		u32 desc_dma = ((u32) ring->descs_dma) + i * AG71XX_DESC_SIZE; | ||||
|  | ||||
| 		len += snprintf(buf + len, buflen - len, | ||||
| 			"%3d %c%c%c %08x %08x %08x %08x %c\n", | ||||
| 			i, | ||||
| 			(i == curr) ? 'C' : ' ', | ||||
| 			(i == dirty) ? 'D' : ' ', | ||||
| 			(desc_hw == desc_dma) ? 'H' : ' ', | ||||
| 			desc_dma, | ||||
| 			desc->next, | ||||
| 			desc->data, | ||||
| 			desc->ctrl, | ||||
| 			(desc->ctrl & DESC_EMPTY) ? 'E' : '*'); | ||||
| 	} | ||||
|  | ||||
| 	spin_unlock_irqrestore(&ag->lock, flags); | ||||
|  | ||||
| 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||||
| 	kfree(buf); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static ssize_t read_file_tx_ring(struct file *file, char __user *user_buf, | ||||
| 				 size_t count, loff_t *ppos) | ||||
| { | ||||
| 	struct ag71xx *ag = file->private_data; | ||||
|  | ||||
| 	return read_file_ring(file, user_buf, count, ppos, ag, &ag->tx_ring, | ||||
| 			      AG71XX_REG_TX_DESC); | ||||
| } | ||||
|  | ||||
| static const struct file_operations ag71xx_fops_tx_ring = { | ||||
| 	.open	= ag71xx_debugfs_generic_open, | ||||
| 	.read	= read_file_tx_ring, | ||||
| 	.owner	= THIS_MODULE | ||||
| }; | ||||
|  | ||||
| static ssize_t read_file_rx_ring(struct file *file, char __user *user_buf, | ||||
| 				 size_t count, loff_t *ppos) | ||||
| { | ||||
| 	struct ag71xx *ag = file->private_data; | ||||
|  | ||||
| 	return read_file_ring(file, user_buf, count, ppos, ag, &ag->rx_ring, | ||||
| 			      AG71XX_REG_RX_DESC); | ||||
| } | ||||
|  | ||||
| static const struct file_operations ag71xx_fops_rx_ring = { | ||||
| 	.open	= ag71xx_debugfs_generic_open, | ||||
| 	.read	= read_file_rx_ring, | ||||
| 	.owner	= THIS_MODULE | ||||
| }; | ||||
|  | ||||
| void ag71xx_debugfs_exit(struct ag71xx *ag) | ||||
| { | ||||
| 	debugfs_remove_recursive(ag->debug.debugfs_dir); | ||||
| } | ||||
|  | ||||
| int ag71xx_debugfs_init(struct ag71xx *ag) | ||||
| { | ||||
| 	struct device *dev = &ag->pdev->dev; | ||||
|  | ||||
| 	ag->debug.debugfs_dir = debugfs_create_dir(dev_name(dev), | ||||
| 						   ag71xx_debugfs_root); | ||||
| 	if (!ag->debug.debugfs_dir) { | ||||
| 		dev_err(dev, "unable to create debugfs directory\n"); | ||||
| 		return -ENOENT; | ||||
| 	} | ||||
|  | ||||
| 	debugfs_create_file("int_stats", S_IRUGO, ag->debug.debugfs_dir, | ||||
| 			    ag, &ag71xx_fops_int_stats); | ||||
| 	debugfs_create_file("napi_stats", S_IRUGO, ag->debug.debugfs_dir, | ||||
| 			    ag, &ag71xx_fops_napi_stats); | ||||
| 	debugfs_create_file("tx_ring", S_IRUGO, ag->debug.debugfs_dir, | ||||
| 			    ag, &ag71xx_fops_tx_ring); | ||||
| 	debugfs_create_file("rx_ring", S_IRUGO, ag->debug.debugfs_dir, | ||||
| 			    ag, &ag71xx_fops_rx_ring); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int ag71xx_debugfs_root_init(void) | ||||
| { | ||||
| 	if (ag71xx_debugfs_root) | ||||
| 		return -EBUSY; | ||||
|  | ||||
| 	ag71xx_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL); | ||||
| 	if (!ag71xx_debugfs_root) | ||||
| 		return -ENOENT; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void ag71xx_debugfs_root_exit(void) | ||||
| { | ||||
| 	debugfs_remove(ag71xx_debugfs_root); | ||||
| 	ag71xx_debugfs_root = NULL; | ||||
| } | ||||
| @@ -0,0 +1,120 @@ | ||||
| /* | ||||
|  *  Atheros AR71xx built-in ethernet mac driver | ||||
|  * | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Based on Atheros' AG7100 driver | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #include "ag71xx.h" | ||||
|  | ||||
| static int ag71xx_ethtool_get_settings(struct net_device *dev, | ||||
| 				       struct ethtool_cmd *cmd) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
| 	struct phy_device *phydev = ag->phy_dev; | ||||
|  | ||||
| 	if (!phydev) | ||||
| 		return -ENODEV; | ||||
|  | ||||
| 	return phy_ethtool_ioctl(phydev, cmd); | ||||
| } | ||||
|  | ||||
| static int ag71xx_ethtool_set_settings(struct net_device *dev, | ||||
| 				       struct ethtool_cmd *cmd) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
| 	struct phy_device *phydev = ag->phy_dev; | ||||
|  | ||||
| 	if (!phydev) | ||||
| 		return -ENODEV; | ||||
|  | ||||
| 	return phy_ethtool_ioctl(phydev, cmd); | ||||
| } | ||||
|  | ||||
| static u32 ag71xx_ethtool_get_msglevel(struct net_device *dev) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
|  | ||||
| 	return ag->msg_enable; | ||||
| } | ||||
|  | ||||
| static void ag71xx_ethtool_set_msglevel(struct net_device *dev, u32 msg_level) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
|  | ||||
| 	ag->msg_enable = msg_level; | ||||
| } | ||||
|  | ||||
| static void ag71xx_ethtool_get_ringparam(struct net_device *dev, | ||||
| 					 struct ethtool_ringparam *er) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
|  | ||||
| 	er->tx_max_pending = AG71XX_TX_RING_SIZE_MAX; | ||||
| 	er->rx_max_pending = AG71XX_RX_RING_SIZE_MAX; | ||||
| 	er->rx_mini_max_pending = 0; | ||||
| 	er->rx_jumbo_max_pending = 0; | ||||
|  | ||||
| 	er->tx_pending = BIT(ag->tx_ring.order); | ||||
| 	er->rx_pending = BIT(ag->rx_ring.order); | ||||
| 	er->rx_mini_pending = 0; | ||||
| 	er->rx_jumbo_pending = 0; | ||||
|  | ||||
| 	if (ag->tx_ring.desc_split) | ||||
| 		er->tx_pending /= AG71XX_TX_RING_DS_PER_PKT; | ||||
| } | ||||
|  | ||||
| static int ag71xx_ethtool_set_ringparam(struct net_device *dev, | ||||
| 					struct ethtool_ringparam *er) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
| 	unsigned tx_size; | ||||
| 	unsigned rx_size; | ||||
| 	int err = 0; | ||||
|  | ||||
| 	if (er->rx_mini_pending != 0|| | ||||
| 	    er->rx_jumbo_pending != 0 || | ||||
| 	    er->rx_pending == 0 || | ||||
| 	    er->tx_pending == 0) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	tx_size = er->tx_pending < AG71XX_TX_RING_SIZE_MAX ? | ||||
| 		  er->tx_pending : AG71XX_TX_RING_SIZE_MAX; | ||||
|  | ||||
| 	rx_size = er->rx_pending < AG71XX_RX_RING_SIZE_MAX ? | ||||
| 		  er->rx_pending : AG71XX_RX_RING_SIZE_MAX; | ||||
|  | ||||
| 	if (netif_running(dev)) { | ||||
| 		err = dev->netdev_ops->ndo_stop(dev); | ||||
| 		if (err) | ||||
| 			return err; | ||||
| 	} | ||||
|  | ||||
| 	if (ag->tx_ring.desc_split) | ||||
| 		tx_size *= AG71XX_TX_RING_DS_PER_PKT; | ||||
|  | ||||
| 	ag->tx_ring.order = ag71xx_ring_size_order(tx_size); | ||||
| 	ag->rx_ring.order = ag71xx_ring_size_order(rx_size); | ||||
|  | ||||
| 	if (netif_running(dev)) | ||||
| 		err = dev->netdev_ops->ndo_open(dev); | ||||
|  | ||||
| 	return err; | ||||
| } | ||||
|  | ||||
| struct ethtool_ops ag71xx_ethtool_ops = { | ||||
| 	.set_settings	= ag71xx_ethtool_set_settings, | ||||
| 	.get_settings	= ag71xx_ethtool_get_settings, | ||||
| 	.get_msglevel	= ag71xx_ethtool_get_msglevel, | ||||
| 	.set_msglevel	= ag71xx_ethtool_set_msglevel, | ||||
| 	.get_ringparam	= ag71xx_ethtool_get_ringparam, | ||||
| 	.set_ringparam	= ag71xx_ethtool_set_ringparam, | ||||
| 	.get_link	= ethtool_op_get_link, | ||||
| 	.get_ts_info	= ethtool_op_get_ts_info, | ||||
| }; | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,218 @@ | ||||
| /* | ||||
|  *  Atheros AR71xx built-in ethernet mac driver | ||||
|  * | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Based on Atheros' AG7100 driver | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #include <linux/clk.h> | ||||
| #include <linux/of_mdio.h> | ||||
| #include "ag71xx.h" | ||||
|  | ||||
| #define AG71XX_MDIO_RETRY	1000 | ||||
| #define AG71XX_MDIO_DELAY	5 | ||||
|  | ||||
| static int bus_count; | ||||
|  | ||||
| static int ag71xx_mdio_wait_busy(struct ag71xx *ag) | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < AG71XX_MDIO_RETRY; i++) { | ||||
| 		u32 busy; | ||||
|  | ||||
| 		udelay(AG71XX_MDIO_DELAY); | ||||
|  | ||||
| 		regmap_read(ag->mii_regmap, AG71XX_REG_MII_IND, &busy); | ||||
| 		if (!busy) | ||||
| 			return 0; | ||||
|  | ||||
| 		udelay(AG71XX_MDIO_DELAY); | ||||
| 	} | ||||
|  | ||||
| 	pr_err("%s: MDIO operation timed out\n", ag->mii_bus->name); | ||||
|  | ||||
| 	return -ETIMEDOUT; | ||||
| } | ||||
|  | ||||
| int ag71xx_mdio_mii_read(struct mii_bus *bus, int addr, int reg) | ||||
| { | ||||
| 	struct ag71xx *ag = bus->priv; | ||||
| 	int err; | ||||
| 	int ret; | ||||
|  | ||||
| 	err = ag71xx_mdio_wait_busy(ag); | ||||
| 	if (err) | ||||
| 		return 0xffff; | ||||
|  | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CMD, MII_CMD_WRITE); | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_ADDR, | ||||
| 			((addr & 0xff) << MII_ADDR_SHIFT) | (reg & 0xff)); | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CMD, MII_CMD_READ); | ||||
|  | ||||
| 	err = ag71xx_mdio_wait_busy(ag); | ||||
| 	if (err) | ||||
| 		return 0xffff; | ||||
|  | ||||
| 	regmap_read(ag->mii_regmap, AG71XX_REG_MII_STATUS, &ret); | ||||
| 	ret &= 0xffff; | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CMD, MII_CMD_WRITE); | ||||
|  | ||||
| 	DBG("mii_read: addr=%04x, reg=%04x, value=%04x\n", addr, reg, ret); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| int ag71xx_mdio_mii_write(struct mii_bus *bus, int addr, int reg, u16 val) | ||||
| { | ||||
| 	struct ag71xx *ag = bus->priv; | ||||
|  | ||||
| 	DBG("mii_write: addr=%04x, reg=%04x, value=%04x\n", addr, reg, val); | ||||
|  | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_ADDR, | ||||
| 			((addr & 0xff) << MII_ADDR_SHIFT) | (reg & 0xff)); | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CTRL, val); | ||||
|  | ||||
| 	ag71xx_mdio_wait_busy(ag); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int ar934x_mdio_clock_div(unsigned int rate) | ||||
| { | ||||
| 	if (rate == 100 * 1000 * 1000) | ||||
| 		return 6; /* 100 MHz clock divided by 20 => 5 MHz */ | ||||
| 	else if (rate == 25 * 1000 * 1000) | ||||
| 		return 0; /* 25 MHz clock divided by 4 => 6.25 MHz */ | ||||
| 	else | ||||
| 		return 3; /* 40 MHz clock divided by 8 => 5 MHz */ | ||||
| } | ||||
|  | ||||
| static int ag71xx_mdio_reset(struct mii_bus *bus) | ||||
| { | ||||
| 	struct device_node *np = bus->dev.of_node; | ||||
| 	struct ag71xx *ag = bus->priv; | ||||
| 	struct device_node *np_ag = ag->pdev->dev.of_node; | ||||
| 	bool builtin_switch; | ||||
| 	u32 t; | ||||
|  | ||||
| 	builtin_switch = of_property_read_bool(np, "builtin-switch"); | ||||
|  | ||||
| 	if (of_device_is_compatible(np_ag, "qca,ar7240-eth")) | ||||
| 		t = MII_CFG_CLK_DIV_6; | ||||
| 	else if (of_device_is_compatible(np_ag, "qca,ar9340-eth")) | ||||
| 		t = MII_CFG_CLK_DIV_58; | ||||
| 	else if (builtin_switch) | ||||
| 		t = MII_CFG_CLK_DIV_10; | ||||
| 	else | ||||
| 		t = MII_CFG_CLK_DIV_28; | ||||
|  | ||||
| 	if (builtin_switch && of_device_is_compatible(np_ag, "qca,ar9340-eth")) { | ||||
| 		struct clk *ref_clk = of_clk_get(np, 0); | ||||
| 		int clock_rate; | ||||
|  | ||||
| 		if (WARN_ON_ONCE(!ref_clk)) | ||||
| 			clock_rate = 40 * 1000 * 1000; | ||||
| 		else | ||||
| 			clock_rate = clk_get_rate(ref_clk); | ||||
|  | ||||
| 		t = ar934x_mdio_clock_div(clock_rate); | ||||
| 		clk_put(ref_clk); | ||||
| 	} | ||||
|  | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CFG, t | MII_CFG_RESET); | ||||
| 	udelay(100); | ||||
|  | ||||
| 	regmap_write(ag->mii_regmap, AG71XX_REG_MII_CFG, t); | ||||
| 	udelay(100); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int ag71xx_mdio_init(struct ag71xx *ag) | ||||
| { | ||||
| 	struct device *parent = &ag->pdev->dev; | ||||
| 	struct device_node *np; | ||||
| 	struct mii_bus *mii_bus; | ||||
| 	bool builtin_switch; | ||||
| 	int i, err; | ||||
|  | ||||
| 	np = of_get_child_by_name(parent->of_node, "mdio-bus"); | ||||
| 	if (!np) | ||||
| 		return -ENODEV; | ||||
|  | ||||
| 	if (!of_device_is_available(np)) { | ||||
| 		err = 0; | ||||
| 		goto err_out; | ||||
| 	} | ||||
|  | ||||
| 	ag->mii_regmap = syscon_regmap_lookup_by_phandle(np, "regmap"); | ||||
| 	if (!ag->mii_regmap) | ||||
| 		return -ENOENT; | ||||
|  | ||||
| 	mii_bus = devm_mdiobus_alloc(parent); | ||||
| 	if (!mii_bus) { | ||||
| 		err = -ENOMEM; | ||||
| 		goto err_out; | ||||
| 	} | ||||
|  | ||||
| 	ag->mdio_reset = of_reset_control_get_exclusive(np, "mdio"); | ||||
| 	builtin_switch = of_property_read_bool(np, "builtin-switch"); | ||||
|  | ||||
| 	mii_bus->name = "mdio"; | ||||
| 	if (builtin_switch) { | ||||
| 		mii_bus->read = ar7240sw_phy_read; | ||||
| 		mii_bus->write = ar7240sw_phy_write; | ||||
| 	} else { | ||||
| 		mii_bus->read = ag71xx_mdio_mii_read; | ||||
| 		mii_bus->write = ag71xx_mdio_mii_write; | ||||
| 	} | ||||
| 	mii_bus->reset = ag71xx_mdio_reset; | ||||
| 	mii_bus->priv = ag; | ||||
| 	mii_bus->parent = parent; | ||||
| 	snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s.%d", np->name, bus_count++); | ||||
|  | ||||
| 	if (!builtin_switch && | ||||
| 	    of_property_read_u32(np, "phy-mask", &mii_bus->phy_mask)) | ||||
| 		mii_bus->phy_mask = 0; | ||||
|  | ||||
| 	for (i = 0; i < PHY_MAX_ADDR; i++) | ||||
| 		mii_bus->irq[i] = PHY_POLL; | ||||
|  | ||||
| 	if (!IS_ERR(ag->mdio_reset)) { | ||||
| 		reset_control_assert(ag->mdio_reset); | ||||
| 		msleep(100); | ||||
| 		reset_control_deassert(ag->mdio_reset); | ||||
| 		msleep(200); | ||||
| 	} | ||||
|  | ||||
| 	err = of_mdiobus_register(mii_bus, np); | ||||
| 	if (err) | ||||
| 		goto err_out; | ||||
|  | ||||
| 	ag->mii_bus = mii_bus; | ||||
|  | ||||
| 	if (builtin_switch) | ||||
| 		ag71xx_ar7240_init(ag, np); | ||||
|  | ||||
| 	return 0; | ||||
|  | ||||
| err_out: | ||||
| 	of_node_put(np); | ||||
| 	return err; | ||||
| } | ||||
|  | ||||
| void ag71xx_mdio_cleanup(struct ag71xx *ag) | ||||
| { | ||||
| 	if (!ag->mii_bus) | ||||
| 		return; | ||||
|  | ||||
| 	ag71xx_ar7240_cleanup(ag); | ||||
| 	mdiobus_unregister(ag->mii_bus); | ||||
| } | ||||
| @@ -0,0 +1,92 @@ | ||||
| /* | ||||
|  *  Atheros AR71xx built-in ethernet mac driver | ||||
|  * | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Based on Atheros' AG7100 driver | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #include <linux/of_mdio.h> | ||||
| #include "ag71xx.h" | ||||
|  | ||||
| static void ag71xx_phy_link_adjust(struct net_device *dev) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
| 	struct phy_device *phydev = ag->phy_dev; | ||||
| 	unsigned long flags; | ||||
| 	int status_change = 0; | ||||
|  | ||||
| 	spin_lock_irqsave(&ag->lock, flags); | ||||
|  | ||||
| 	if (phydev->link) { | ||||
| 		if (ag->duplex != phydev->duplex | ||||
| 		    || ag->speed != phydev->speed) { | ||||
| 			status_change = 1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (phydev->link != ag->link) | ||||
| 		status_change = 1; | ||||
|  | ||||
| 	ag->link = phydev->link; | ||||
| 	ag->duplex = phydev->duplex; | ||||
| 	ag->speed = phydev->speed; | ||||
|  | ||||
| 	if (status_change) | ||||
| 		ag71xx_link_adjust(ag); | ||||
|  | ||||
| 	spin_unlock_irqrestore(&ag->lock, flags); | ||||
| } | ||||
|  | ||||
| int ag71xx_phy_connect(struct ag71xx *ag) | ||||
| { | ||||
| 	struct device_node *np = ag->pdev->dev.of_node; | ||||
| 	struct device_node *phy_node; | ||||
| 	int ret; | ||||
|  | ||||
| 	if (of_phy_is_fixed_link(np)) { | ||||
| 		ret = of_phy_register_fixed_link(np); | ||||
| 		if (ret < 0) { | ||||
| 			dev_err(&ag->pdev->dev, | ||||
| 				"Failed to register fixed PHY link: %d\n", ret); | ||||
| 			return ret; | ||||
| 		} | ||||
|  | ||||
| 		phy_node = of_node_get(np); | ||||
| 	} else { | ||||
| 		phy_node = of_parse_phandle(np, "phy-handle", 0); | ||||
| 	} | ||||
|  | ||||
| 	if (!phy_node) { | ||||
| 		dev_err(&ag->pdev->dev, | ||||
| 			"Could not find valid phy node\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
|  | ||||
| 	ag->phy_dev = of_phy_connect(ag->dev, phy_node, ag71xx_phy_link_adjust, | ||||
| 				     0, ag->phy_if_mode); | ||||
|  | ||||
| 	of_node_put(phy_node); | ||||
|  | ||||
| 	if (!ag->phy_dev) { | ||||
| 		dev_err(&ag->pdev->dev, | ||||
| 			"Could not connect to PHY device\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
|  | ||||
| 	dev_info(&ag->pdev->dev, "connected to PHY at %s [uid=%08x, driver=%s]\n", | ||||
| 		    phydev_name(ag->phy_dev), | ||||
| 		    ag->phy_dev->phy_id, ag->phy_dev->drv->name); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void ag71xx_phy_disconnect(struct ag71xx *ag) | ||||
| { | ||||
| 	phy_disconnect(ag->phy_dev); | ||||
| } | ||||
							
								
								
									
										16
									
								
								target/linux/ath79/generic/config-default
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								target/linux/ath79/generic/config-default
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| CONFIG_BLK_MQ_PCI=y | ||||
| CONFIG_HW_HAS_PCI=y | ||||
| CONFIG_LEDS_RESET=y | ||||
| # CONFIG_MIPS_MACHINE is not set | ||||
| CONFIG_OF_ADDRESS_PCI=y | ||||
| CONFIG_OF_PCI=y | ||||
| CONFIG_OF_PCI_IRQ=y | ||||
| CONFIG_PCI=y | ||||
| CONFIG_PCI_AR71XX=y | ||||
| CONFIG_PCI_AR724X=y | ||||
| CONFIG_PCI_DISABLE_COMMON_QUIRKS=y | ||||
| CONFIG_PCI_DOMAINS=y | ||||
| CONFIG_PHY_AR7100_USB=y | ||||
| CONFIG_PHY_AR7200_USB=y | ||||
| # CONFIG_WIRELESS is not set | ||||
| # CONFIG_WLAN is not set | ||||
							
								
								
									
										16
									
								
								target/linux/ath79/generic/profiles/00-default.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								target/linux/ath79/generic/profiles/00-default.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| # | ||||
| # Copyright (C) 2009 OpenWrt.org | ||||
| # | ||||
| # This is free software, licensed under the GNU General Public License v2. | ||||
| # See /LICENSE for more information. | ||||
| # | ||||
|  | ||||
| define Profile/Default | ||||
| 	NAME:=Default Profile (all drivers) | ||||
| 	PRIORITY := 1 | ||||
| endef | ||||
|  | ||||
| define Profile/Default/Description | ||||
| 	Default package set compatible with most boards. | ||||
| endef | ||||
| $(eval $(call Profile,Default)) | ||||
							
								
								
									
										8
									
								
								target/linux/ath79/generic/target.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								target/linux/ath79/generic/target.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| BOARDNAME:=Generic | ||||
| FEATURES += squashfs | ||||
|  | ||||
| define Target/Description | ||||
| 	Build firmware images for generic Atheros AR71xx/AR913x/AR934x based boards. | ||||
| endef | ||||
|  | ||||
|  | ||||
							
								
								
									
										66
									
								
								target/linux/ath79/image/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								target/linux/ath79/image/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/image.mk | ||||
|  | ||||
| KERNEL_LOADADDR = 0x80060000 | ||||
|  | ||||
| DEVICE_VARS += CMDLINE CONSOLE IMAGE_SIZE BOARDNAME LOADER_FLASH_OFFS LOADER_TYPE ATH_SOC | ||||
|  | ||||
| define Build/loader-common | ||||
| 	rm -rf $@.src | ||||
| 	$(MAKE) -C lzma-loader \ | ||||
| 		PKG_BUILD_DIR="$@.src" \ | ||||
| 		TARGET_DIR="$(dir $@)" LOADER_NAME="$(notdir $@)" \ | ||||
| 		BOARD="$(BOARDNAME)" \ | ||||
| 		LZMA_TEXT_START=0x80a00000 LOADADDR=0x80060000 \ | ||||
| 		$(1) compile loader.$(LOADER_TYPE) | ||||
| 	mv "$@.$(LOADER_TYPE)" "$@" | ||||
| 	rm -rf $@.src | ||||
| endef | ||||
|  | ||||
| define Build/loader-kernel | ||||
| 	$(call Build/loader-common,LOADER_DATA="$@") | ||||
| endef | ||||
|  | ||||
| define Build/loader-kernel-cmdline | ||||
| 	$(call Build/loader-common,LOADER_DATA="$@" KERNEL_CMDLINE="$(CMDLINE)") | ||||
| endef | ||||
|  | ||||
|  | ||||
| define Build/loader-okli-compile | ||||
| 	$(call Build/loader-common,FLASH_OFFS=$(LOADER_FLASH_OFFS) FLASH_MAX=0 KERNEL_CMDLINE="$(CMDLINE)") | ||||
| endef | ||||
|  | ||||
| define Build/loader-okli | ||||
| 	dd if=$(KDIR)/loader-$(1).gz bs=7680 conv=sync of="$@.new" | ||||
| 	cat "$@" >> "$@.new" | ||||
| 	mv "$@.new" "$@" | ||||
| endef | ||||
|  | ||||
| define Build/copy-file | ||||
| 	cat "$(1)" > "$@" | ||||
| endef | ||||
|  | ||||
| define Device/Default | ||||
|   ATH_SOC := | ||||
|   BOARDNAME := | ||||
|   DEVICE_PROFILE = $$(BOARDNAME) | ||||
|   DEVICE_DTS_DIR := ../dts | ||||
|   DEVICE_DTS = $$(ATH_SOC)_$(1) | ||||
|   PROFILES = Default Minimal $$(DEVICE_PROFILE) | ||||
|   MTDPARTS := | ||||
|   BLOCKSIZE := 64k | ||||
|   CONSOLE = ttyS0,115200 | ||||
|   CMDLINE = $$(if $$(BOARDNAME),board=$$(BOARDNAME)) $$(if $$(MTDPARTS),mtdparts=$$(MTDPARTS)) $$(if $$(CONSOLE),console=$$(CONSOLE)) | ||||
|   KERNEL := kernel-bin | append-dtb | lzma | uImage lzma | ||||
|   KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | uImage lzma | ||||
|   COMPILE := | ||||
|   IMAGES := sysupgrade.bin | ||||
|   IMAGE/sysupgrade.bin = append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | ||||
| endef | ||||
|  | ||||
| ifeq ($(SUBTARGET),generic) | ||||
| include ./tp-link.mk | ||||
| include ./generic.mk | ||||
| include ./generic-ubnt.mk | ||||
| endif | ||||
| $(eval $(call BuildImage)) | ||||
							
								
								
									
										274
									
								
								target/linux/ath79/image/generic-ubnt.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								target/linux/ath79/image/generic-ubnt.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,274 @@ | ||||
| DEVICE_VARS += UBNT_BOARD UBNT_CHIP UBNT_TYPE | ||||
|  | ||||
| # mkubntimage is using the kernel image direct | ||||
| # routerboard creates partitions out of the ubnt header | ||||
| define Build/mkubntimage | ||||
| 	-$(STAGING_DIR_HOST)/bin/mkfwimage \ | ||||
| 		-B $(UBNT_BOARD) -v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \ | ||||
| 		-k $(IMAGE_KERNEL) \ | ||||
| 		-r $@ \ | ||||
| 		-o $@ | ||||
| endef | ||||
|  | ||||
| # all UBNT XM device expect the kernel image to have 1024k while flash, when | ||||
| # booting the image, the size doesn't matter. | ||||
| define Build/mkubntimage-split | ||||
| 	-[ -f $@ ] && ( \ | ||||
| 	dd if=$@ of=$@.old1 bs=1024k count=1; \ | ||||
| 	dd if=$@ of=$@.old2 bs=1024k skip=1; \ | ||||
| 	$(STAGING_DIR_HOST)/bin/mkfwimage \ | ||||
| 		-B $(UBNT_BOARD) -v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \ | ||||
| 		-k $@.old1 \ | ||||
| 		-r $@.old2 \ | ||||
| 		-o $@; \ | ||||
| 	rm $@.old1 $@.old2 ) | ||||
| endef | ||||
|  | ||||
| define Build/mkubntimage2 | ||||
| 	-$(STAGING_DIR_HOST)/bin/mkfwimage2 -f 0x9f000000 \ | ||||
| 		-v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \ | ||||
| 		-p jffs2:0x50000:0xf60000:0:0:$@ \ | ||||
| 		-o $@.new | ||||
| 	@mv $@.new $@ | ||||
| endef | ||||
|  | ||||
|  | ||||
| # UBNT_BOARD e.g. one of (XS2, XS5, RS, XM) | ||||
| # UBNT_TYPE e.g. one of (BZ, XM, XW) | ||||
| # UBNT_CHIP e.g. one of (ar7240, ar933x, ar934x) | ||||
| define Device/ubnt | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 | ||||
|   DEVICE_PROFILE := UBNT | ||||
|   IMAGE_SIZE := 7552k | ||||
|   UBNT_BOARD := XM | ||||
|   IMAGES := sysupgrade.bin factory.bin | ||||
|   IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | check-size $$$$(IMAGE_SIZE) | ||||
|   IMAGE/factory.bin := $$(IMAGE/sysupgrade.bin) | mkubntimage-split | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-xm | ||||
|   $(Device/ubnt) | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ohci | ||||
|   UBNT_TYPE := XM | ||||
|   UBNT_CHIP := ar7240 | ||||
|   ATH_SOC := ar7241 | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-xw | ||||
|   $(Device/ubnt) | ||||
|   UBNT_TYPE := XW | ||||
|   UBNT_CHIP := ar934x | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-bz | ||||
|   $(Device/ubnt) | ||||
|   UBNT_TYPE := BZ | ||||
|   UBNT_CHIP := ar7240 | ||||
| endef | ||||
|  | ||||
| define Device/rw2458n | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti RW2458N | ||||
|   BOARDNAME := RW2458N | ||||
| endef | ||||
| #TARGET_DEVICES += rw2458n | ||||
|  | ||||
| define Device/ubnt-airrouter | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti AirRouter | ||||
|   BOARDNAME := UBNT-AR | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-airrouter | ||||
|  | ||||
| define Device/ubnt-bullet-m | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti Bullet-M | ||||
|   BOARDNAME := UBNT-BM | ||||
| endef | ||||
| TARGET_DEVICES += ubnt-bullet-m | ||||
|  | ||||
| define Device/ubnt-rocket-m | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti Rocket-M | ||||
|   BOARDNAME := UBNT-RM | ||||
| endef | ||||
| TARGET_DEVICES += ubnt-rocket-m | ||||
|  | ||||
| define Device/ubnt-nano-m | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti Nano-M | ||||
|   BOARDNAME := UBNT-NM | ||||
| endef | ||||
| TARGET_DEVICES += ubnt-nano-m | ||||
|  | ||||
| define Device/ubnt-unifi | ||||
|   $(Device/ubnt-bz) | ||||
|   ATH_SOC := ar7241 | ||||
|   DEVICE_TITLE := Ubiquiti UniFi | ||||
|   BOARDNAME := UBNT-UF | ||||
|   DEVICE_PROFILE += UBNTUNIFI | ||||
| endef | ||||
| TARGET_DEVICES += ubnt-unifi | ||||
|  | ||||
| define Device/ubnt-unifiac | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 | ||||
|   DEVICE_PROFILE := UBNT | ||||
|   IMAGE_SIZE := 7744k | ||||
|   MTDPARTS := spi0.0:384k(u-boot)ro,64k(u-boot-env)ro,7744k(firmware),7744k(ubnt-airos)ro,128k(bs),256k(cfg)ro,64k(EEPROM)ro | ||||
|   IMAGES := sysupgrade.bin | ||||
|   IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | check-size $$$$(IMAGE_SIZE) | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-unifiac-lite | ||||
|   $(Device/ubnt-unifiac) | ||||
|   DEVICE_TITLE := Ubiquiti UniFi AC-Lite | ||||
|   DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca988x | ||||
|   DEVICE_PROFILE += UBNTUNIFIACLITE | ||||
|   BOARDNAME := UBNT-UF-AC-LITE | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-unifiac-lite | ||||
|  | ||||
| define Device/ubnt-unifiac-mesh | ||||
|   $(Device/ubnt-unifiac-lite) | ||||
|   DEVICE_TITLE := Ubiquiti UniFi AC-Mesh | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-unifiac-mesh | ||||
|  | ||||
| define Device/ubnt-unifiac-pro | ||||
|   $(Device/ubnt-unifiac) | ||||
|   DEVICE_TITLE := Ubiquiti UniFi AC-Pro | ||||
|   DEVICE_PACKAGES += kmod-ath10k ath10k-firmware-qca988x | ||||
|   DEVICE_PROFILE += UBNTUNIFIACPRO | ||||
|   BOARDNAME := UBNT-UF-AC-PRO | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-unifiac-pro | ||||
|  | ||||
| define Device/ubnt-unifi-outdoor | ||||
|   $(Device/ubnt-bz) | ||||
|   DEVICE_TITLE := Ubiquiti UniFi Outdoor | ||||
|   BOARDNAME := UBNT-U20 | ||||
|   DEVICE_PROFILE += UBNTUNIFIOUTDOOR | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-unifi-outdoor | ||||
|  | ||||
| define Device/ubnt-nano-m-xw | ||||
|   $(Device/ubnt-xw) | ||||
|   DEVICE_TITLE := Ubiquiti Nano M XW | ||||
|   BOARDNAME := UBNT-NM-XW | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-nano-m-xw | ||||
|  | ||||
| define Device/ubnt-loco-m-xw | ||||
|   $(Device/ubnt-xw) | ||||
|   DEVICE_TITLE := Ubiquiti Loco XW | ||||
|   BOARDNAME := UBNT-LOCO-XW | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-loco-m-xw | ||||
|  | ||||
| define Device/ubnt-rocket-m-xw | ||||
|   $(Device/ubnt-xw) | ||||
|   DEVICE_TITLE := Ubiquiti Rocket M XW | ||||
|   BOARDNAME := UBNT-RM-XW | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-rocket-m-xw | ||||
|  | ||||
| define Device/ubnt-rocket-m-ti | ||||
|   $(Device/ubnt-xw) | ||||
|   DEVICE_TITLE := Ubiquiti Rocket M TI | ||||
|   BOARDNAME := UBNT-RM-TI | ||||
|   UBNT_TYPE := TI | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-rocket-m-ti | ||||
|  | ||||
| define Device/ubnt-air-gateway | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti Air Gateway | ||||
|   BOARDNAME := UBNT-AGW | ||||
|   UBNT_TYPE := AirGW | ||||
|   UBNT_CHIP := ar933x | ||||
|   CONSOLE := ttyATH0,115200 | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-air-gateway | ||||
|  | ||||
| define Device/ubnt-air-gateway-pro | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti Air Gateway Pro | ||||
|   BOARDNAME := UBNT-AGWP | ||||
|   UBNT_TYPE := AirGWP | ||||
|   UBNT_CHIP := ar934x | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-air-gateway-pro | ||||
|  | ||||
| define Device/ubdev01 | ||||
|   $(Device/ubnt-xm) | ||||
|   DEVICE_TITLE := Ubiquiti ubDEV01 | ||||
|   MTDPARTS := spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,7488k(firmware),64k(certs),256k(cfg)ro,64k(EEPROM)ro | ||||
|   BOARDNAME := UBNT-UF | ||||
|   UBNT_BOARD := UBDEV01 | ||||
| endef | ||||
| #TARGET_DEVICES += ubdev01 | ||||
|  | ||||
| define Device/ubnt-routerstation | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb-ohci kmod-usb2 | ||||
|   DEVICE_PROFILE := UBNT | ||||
|   IMAGE_SIZE := 16128k | ||||
|   IMAGES := sysupgrade.bin factory.bin | ||||
|   IMAGE/factory.bin := append-rootfs | pad-rootfs | mkubntimage | ||||
|   IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | combined-image | check-size $$$$(IMAGE_SIZE) | ||||
|   KERNEL := kernel-bin | patch-cmdline | lzma | pad-to $$(BLOCKSIZE) | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-rs | ||||
|   $(Device/ubnt-routerstation) | ||||
|   DEVICE_TITLE := Ubiquiti RouterStation | ||||
|   BOARDNAME := UBNT-RS | ||||
|   DEVICE_PROFILE += UBNTRS | ||||
|   UBNT_BOARD := RS | ||||
|   UBNT_TYPE := RSx | ||||
|   UBNT_CHIP := ar7100 | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-rs | ||||
|  | ||||
| define Device/ubnt-rspro | ||||
|   $(Device/ubnt-routerstation) | ||||
|   DEVICE_TITLE := Ubiquiti RouterStation Pro | ||||
|   BOARDNAME := UBNT-RSPRO | ||||
|   DEVICE_PROFILE += UBNTRSPRO | ||||
|   UBNT_BOARD := RSPRO | ||||
|   UBNT_TYPE := RSPRO | ||||
|   UBNT_CHIP := ar7100pro | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-rspro | ||||
|  | ||||
| define Device/ubnt-ls-sr71 | ||||
|   $(Device/ubnt-routerstation) | ||||
|   DEVICE_TITLE := Ubiquiti LS-SR71 | ||||
|   BOARDNAME := UBNT-LS-SR71 | ||||
|   UBNT_BOARD := LS-SR71 | ||||
|   UBNT_TYPE := LS-SR71 | ||||
|   UBNT_CHIP := ar7100 | ||||
| endef | ||||
| #TARGET_DEVICES += ubnt-ls-sr71 | ||||
|  | ||||
| define Device/ubnt-uap-pro | ||||
|   DEVICE_TITLE := Ubiquiti UAP Pro | ||||
|   KERNEL_SIZE := 1536k | ||||
|   IMAGE_SIZE := 15744k | ||||
|   MTDPARTS := spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,1536k(kernel),14208k(rootfs),256k(cfg)ro,64k(EEPROM)ro,15744k@0x50000(firmware) | ||||
|   UBNT_TYPE := BZ | ||||
|   UBNT_CHIP := ar934x | ||||
|   BOARDNAME := UAP-PRO | ||||
|   DEVICE_PROFILE := UBNT UAPPRO | ||||
|   KERNEL := kernel-bin | patch-cmdline | lzma | uImage lzma | jffs2 kernel0 | ||||
|   IMAGES := sysupgrade.bin factory.bin | ||||
|   IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-rootfs | pad-rootfs | check-size $$$$(IMAGE_SIZE) | ||||
|   IMAGE/factory.bin := $$(IMAGE/sysupgrade.bin) | mkubntimage2 | ||||
| endef | ||||
|  | ||||
| define Device/ubnt-unifi-outdoor-plus | ||||
|   $(Device/ubnt-uap-pro) | ||||
|   DEVICE_TITLE := Ubiquiti UniFi Outdoor Plus | ||||
|   UBNT_CHIP := ar7240 | ||||
|   BOARDNAME := UBNT-UOP | ||||
|   DEVICE_PROFILE := UBNT | ||||
| endef | ||||
							
								
								
									
										93
									
								
								target/linux/ath79/image/generic.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								target/linux/ath79/image/generic.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| define Build/netgear-squashfs | ||||
| 	rm -rf $@.fs $@.squashfs | ||||
| 	mkdir -p $@.fs/image | ||||
| 	cp $@ $@.fs/image/uImage | ||||
| 	$(STAGING_DIR_HOST)/bin/mksquashfs-lzma \ | ||||
| 		$@.fs $@.squashfs \ | ||||
| 		-noappend -root-owned -be -b 65536 \ | ||||
| 		$(if $(SOURCE_DATE_EPOCH),-fixed-time $(SOURCE_DATE_EPOCH)) | ||||
|  | ||||
| 	dd if=/dev/zero bs=1k count=1 >> $@.squashfs | ||||
| 	mkimage \ | ||||
| 		-A mips -O linux -T filesystem -C none \ | ||||
| 		-M $(NETGEAR_KERNEL_MAGIC) \ | ||||
| 		-a 0xbf070000 -e 0xbf070000 \ | ||||
| 		-n 'MIPS $(VERSION_DIST) Linux-$(LINUX_VERSION)' \ | ||||
| 		-d $@.squashfs $@ | ||||
| 	rm -rf $@.squashfs $@.fs | ||||
| endef | ||||
|  | ||||
| define Build/netgear-uImage | ||||
| 	$(call Build/uImage,$(1) -M $(NETGEAR_KERNEL_MAGIC)) | ||||
| endef | ||||
|  | ||||
| define Device/ew_dorin | ||||
|   ATH_SOC := ar9331 | ||||
|   DEVICE_TITLE := Embedded Wireless Dorin | ||||
|   DEVICE_PACKAGES := kmod-usb-chipidea2 | ||||
| endef | ||||
|  | ||||
| TARGET_DEVICES += ew_dorin | ||||
|  | ||||
| define Device/gl_ar150 | ||||
|   ATH_SOC := ar9330 | ||||
|   DEVICE_TITLE := GL.iNet GL-AR150 | ||||
|   DEVICE_PACKAGES := kmod-usb-chipidea2 | ||||
|   IMAGE_SIZE := 16000k | ||||
| endef | ||||
| TARGET_DEVICES += gl_ar150 | ||||
|  | ||||
| define Device/om5p_ac | ||||
|   ATH_SOC := qca9558 | ||||
|   DEVICE_TITLE := OpenMesh OM5P-AC | ||||
|   DEVICE_PROFILE := OM5P-AC | ||||
|   DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca988x om-watchdog | ||||
| endef | ||||
|  | ||||
| TARGET_DEVICES += om5p_ac | ||||
|  | ||||
| define Device/netgear_wndr3700 | ||||
|   ATH_SOC:=ar7100 | ||||
|   DEVICE_TITLE := NETGEAR WNDR3700 | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport kmod-leds-reset | ||||
|   NETGEAR_KERNEL_MAGIC := 0x33373030 | ||||
|   NETGEAR_BOARD_ID := WNDR3700 | ||||
|   IMAGE_SIZE := 7680k | ||||
|   IMAGES := sysupgrade.bin factory.img factory-NA.img | ||||
|   KERNEL := kernel-bin | append-dtb | lzma -d20 | netgear-uImage lzma | ||||
|   KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma -d20 | netgear-uImage lzma | ||||
|   IMAGE/default := append-kernel | pad-to $$$$(BLOCKSIZE) | netgear-squashfs | append-rootfs | pad-rootfs | ||||
|   IMAGE/sysupgrade.bin := $$(IMAGE/default) | check-size $$$$(IMAGE_SIZE) | ||||
|   IMAGE/factory.img := $$(IMAGE/default) | netgear-dni | check-size $$$$(IMAGE_SIZE) | ||||
|   IMAGE/factory-NA.img := $$(IMAGE/default) | netgear-dni NA | check-size $$$$(IMAGE_SIZE) | ||||
| endef | ||||
| #TARGET_DEVICES += netgear_wndr3700 | ||||
|  | ||||
| define Device/netgear_wndr3700v2 | ||||
|   $(Device/netgear_wndr3700) | ||||
|   DEVICE_TITLE := NETGEAR WNDR3700 v2 | ||||
|   NETGEAR_BOARD_ID := WNDR3700v2 | ||||
|   NETGEAR_KERNEL_MAGIC := 0x33373031 | ||||
|   NETGEAR_HW_ID := 29763654+16+64 | ||||
|   IMAGE_SIZE := 15872k | ||||
|   IMAGES := sysupgrade.bin factory.img | ||||
| endef | ||||
| #TARGET_DEVICES += netgear_wndr3700v2 | ||||
|  | ||||
| define Device/netgear_wndr3800 | ||||
|   $(Device/netgear_wndr3700v2) | ||||
|   ATH_SOC := ar7161 | ||||
|   DEVICE_TITLE := NETGEAR WNDR3800 | ||||
|   NETGEAR_BOARD_ID := WNDR3800 | ||||
|   NETGEAR_HW_ID := 29763654+16+128 | ||||
| endef | ||||
| TARGET_DEVICES += netgear_wndr3800 | ||||
|  | ||||
| define Device/buffalo_wzr-hp-g450h | ||||
|   ATH_SOC := ar7242 | ||||
|   DEVICE_TITLE := Buffalo WZR-HP-G450H | ||||
|   DEVICE_PROFILE := WZR-HP-G450H | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport | ||||
| endef | ||||
|  | ||||
| TARGET_DEVICES += buffalo_wzr-hp-g450h | ||||
							
								
								
									
										1058
									
								
								target/linux/ath79/image/legacy.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1058
									
								
								target/linux/ath79/image/legacy.mk
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										66
									
								
								target/linux/ath79/image/lzma-loader/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								target/linux/ath79/image/lzma-loader/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| # | ||||
| # Copyright (C) 2011 OpenWrt.org | ||||
| # Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
| # | ||||
| # This is free software, licensed under the GNU General Public License v2. | ||||
| # See /LICENSE for more information. | ||||
| # | ||||
|  | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| LZMA_TEXT_START	:= 0x80a00000 | ||||
| LOADADDR	:= 0x80060000 | ||||
| LOADER		:= loader.bin | ||||
| LOADER_NAME	:= $(basename $(notdir $(LOADER))) | ||||
| LOADER_DATA 	:= | ||||
| TARGET_DIR	:= | ||||
| FLASH_OFFS	:= | ||||
| FLASH_MAX	:= | ||||
| BOARD		:= | ||||
|  | ||||
| ifeq ($(TARGET_DIR),) | ||||
| TARGET_DIR	:= $(KDIR) | ||||
| endif | ||||
|  | ||||
| LOADER_BIN	:= $(TARGET_DIR)/$(LOADER_NAME).bin | ||||
| LOADER_GZ	:= $(TARGET_DIR)/$(LOADER_NAME).gz | ||||
| LOADER_ELF	:= $(TARGET_DIR)/$(LOADER_NAME).elf | ||||
|  | ||||
| PKG_NAME := lzma-loader | ||||
| PKG_BUILD_DIR := $(KDIR)/$(PKG_NAME) | ||||
|  | ||||
| .PHONY : loader-compile loader.bin loader.elf loader.gz | ||||
|  | ||||
| $(PKG_BUILD_DIR)/.prepared: | ||||
| 	mkdir $(PKG_BUILD_DIR) | ||||
| 	$(CP) ./src/* $(PKG_BUILD_DIR)/ | ||||
| 	touch $@ | ||||
|  | ||||
| loader-compile: $(PKG_BUILD_DIR)/.prepared | ||||
| 	$(MAKE) -C $(PKG_BUILD_DIR) CROSS_COMPILE="$(TARGET_CROSS)" \ | ||||
| 		LZMA_TEXT_START=$(LZMA_TEXT_START) \ | ||||
| 		LOADADDR=$(LOADADDR) \ | ||||
| 		LOADER_DATA=$(LOADER_DATA) \ | ||||
| 		FLASH_OFFS=$(FLASH_OFFS) \ | ||||
| 		FLASH_MAX=$(FLASH_MAX) \ | ||||
| 		BOARD="$(BOARD)" \ | ||||
| 		clean all | ||||
|  | ||||
| loader.gz: $(PKG_BUILD_DIR)/loader.bin | ||||
| 	gzip -nc9 $< > $(LOADER_GZ) | ||||
|  | ||||
| loader.elf: $(PKG_BUILD_DIR)/loader.elf | ||||
| 	$(CP) $< $(LOADER_ELF) | ||||
|  | ||||
| loader.bin: $(PKG_BUILD_DIR)/loader.bin | ||||
| 	$(CP) $< $(LOADER_BIN) | ||||
|  | ||||
| download: | ||||
| prepare: $(PKG_BUILD_DIR)/.prepared | ||||
| compile: loader-compile | ||||
|  | ||||
| install: | ||||
|  | ||||
| clean: | ||||
| 	rm -rf $(PKG_BUILD_DIR) | ||||
|  | ||||
							
								
								
									
										584
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaDecode.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										584
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaDecode.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,584 @@ | ||||
| /* | ||||
|   LzmaDecode.c | ||||
|   LZMA Decoder (optimized for Speed version) | ||||
|    | ||||
|   LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) | ||||
|   http://www.7-zip.org/ | ||||
|  | ||||
|   LZMA SDK is licensed under two licenses: | ||||
|   1) GNU Lesser General Public License (GNU LGPL) | ||||
|   2) Common Public License (CPL) | ||||
|   It means that you can select one of these two licenses and  | ||||
|   follow rules of that license. | ||||
|  | ||||
|   SPECIAL EXCEPTION: | ||||
|   Igor Pavlov, as the author of this Code, expressly permits you to  | ||||
|   statically or dynamically link your Code (or bind by name) to the  | ||||
|   interfaces of this file without subjecting your linked Code to the  | ||||
|   terms of the CPL or GNU LGPL. Any modifications or additions  | ||||
|   to this file, however, are subject to the LGPL or CPL terms. | ||||
| */ | ||||
|  | ||||
| #include "LzmaDecode.h" | ||||
|  | ||||
| #define kNumTopBits 24 | ||||
| #define kTopValue ((UInt32)1 << kNumTopBits) | ||||
|  | ||||
| #define kNumBitModelTotalBits 11 | ||||
| #define kBitModelTotal (1 << kNumBitModelTotalBits) | ||||
| #define kNumMoveBits 5 | ||||
|  | ||||
| #define RC_READ_BYTE (*Buffer++) | ||||
|  | ||||
| #define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \ | ||||
|   { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }} | ||||
|  | ||||
| #ifdef _LZMA_IN_CB | ||||
|  | ||||
| #define RC_TEST { if (Buffer == BufferLim) \ | ||||
|   { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \ | ||||
|   BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }} | ||||
|  | ||||
| #define RC_INIT Buffer = BufferLim = 0; RC_INIT2 | ||||
|  | ||||
| #else | ||||
|  | ||||
| #define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; } | ||||
|  | ||||
| #define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2 | ||||
|   | ||||
| #endif | ||||
|  | ||||
| #define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } | ||||
|  | ||||
| #define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) | ||||
| #define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; | ||||
| #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; | ||||
|  | ||||
| #define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ | ||||
|   { UpdateBit0(p); mi <<= 1; A0; } else \ | ||||
|   { UpdateBit1(p); mi = (mi + mi) + 1; A1; }  | ||||
|    | ||||
| #define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)                | ||||
|  | ||||
| #define RangeDecoderBitTreeDecode(probs, numLevels, res) \ | ||||
|   { int i = numLevels; res = 1; \ | ||||
|   do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ | ||||
|   res -= (1 << numLevels); } | ||||
|  | ||||
|  | ||||
| #define kNumPosBitsMax 4 | ||||
| #define kNumPosStatesMax (1 << kNumPosBitsMax) | ||||
|  | ||||
| #define kLenNumLowBits 3 | ||||
| #define kLenNumLowSymbols (1 << kLenNumLowBits) | ||||
| #define kLenNumMidBits 3 | ||||
| #define kLenNumMidSymbols (1 << kLenNumMidBits) | ||||
| #define kLenNumHighBits 8 | ||||
| #define kLenNumHighSymbols (1 << kLenNumHighBits) | ||||
|  | ||||
| #define LenChoice 0 | ||||
| #define LenChoice2 (LenChoice + 1) | ||||
| #define LenLow (LenChoice2 + 1) | ||||
| #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) | ||||
| #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) | ||||
| #define kNumLenProbs (LenHigh + kLenNumHighSymbols)  | ||||
|  | ||||
|  | ||||
| #define kNumStates 12 | ||||
| #define kNumLitStates 7 | ||||
|  | ||||
| #define kStartPosModelIndex 4 | ||||
| #define kEndPosModelIndex 14 | ||||
| #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) | ||||
|  | ||||
| #define kNumPosSlotBits 6 | ||||
| #define kNumLenToPosStates 4 | ||||
|  | ||||
| #define kNumAlignBits 4 | ||||
| #define kAlignTableSize (1 << kNumAlignBits) | ||||
|  | ||||
| #define kMatchMinLen 2 | ||||
|  | ||||
| #define IsMatch 0 | ||||
| #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) | ||||
| #define IsRepG0 (IsRep + kNumStates) | ||||
| #define IsRepG1 (IsRepG0 + kNumStates) | ||||
| #define IsRepG2 (IsRepG1 + kNumStates) | ||||
| #define IsRep0Long (IsRepG2 + kNumStates) | ||||
| #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) | ||||
| #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) | ||||
| #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) | ||||
| #define LenCoder (Align + kAlignTableSize) | ||||
| #define RepLenCoder (LenCoder + kNumLenProbs) | ||||
| #define Literal (RepLenCoder + kNumLenProbs) | ||||
|  | ||||
| #if Literal != LZMA_BASE_SIZE | ||||
| StopCompilingDueBUG | ||||
| #endif | ||||
|  | ||||
| int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) | ||||
| { | ||||
|   unsigned char prop0; | ||||
|   if (size < LZMA_PROPERTIES_SIZE) | ||||
|     return LZMA_RESULT_DATA_ERROR; | ||||
|   prop0 = propsData[0]; | ||||
|   if (prop0 >= (9 * 5 * 5)) | ||||
|     return LZMA_RESULT_DATA_ERROR; | ||||
|   { | ||||
|     for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); | ||||
|     for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); | ||||
|     propsRes->lc = prop0; | ||||
|     /* | ||||
|     unsigned char remainder = (unsigned char)(prop0 / 9); | ||||
|     propsRes->lc = prop0 % 9; | ||||
|     propsRes->pb = remainder / 5; | ||||
|     propsRes->lp = remainder % 5; | ||||
|     */ | ||||
|   } | ||||
|  | ||||
|   #ifdef _LZMA_OUT_READ | ||||
|   { | ||||
|     int i; | ||||
|     propsRes->DictionarySize = 0; | ||||
|     for (i = 0; i < 4; i++) | ||||
|       propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); | ||||
|     if (propsRes->DictionarySize == 0) | ||||
|       propsRes->DictionarySize = 1; | ||||
|   } | ||||
|   #endif | ||||
|   return LZMA_RESULT_OK; | ||||
| } | ||||
|  | ||||
| #define kLzmaStreamWasFinishedId (-1) | ||||
|  | ||||
| int LzmaDecode(CLzmaDecoderState *vs, | ||||
|     #ifdef _LZMA_IN_CB | ||||
|     ILzmaInCallback *InCallback, | ||||
|     #else | ||||
|     const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, | ||||
|     #endif | ||||
|     unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed) | ||||
| { | ||||
|   CProb *p = vs->Probs; | ||||
|   SizeT nowPos = 0; | ||||
|   Byte previousByte = 0; | ||||
|   UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; | ||||
|   UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; | ||||
|   int lc = vs->Properties.lc; | ||||
|  | ||||
|   #ifdef _LZMA_OUT_READ | ||||
|    | ||||
|   UInt32 Range = vs->Range; | ||||
|   UInt32 Code = vs->Code; | ||||
|   #ifdef _LZMA_IN_CB | ||||
|   const Byte *Buffer = vs->Buffer; | ||||
|   const Byte *BufferLim = vs->BufferLim; | ||||
|   #else | ||||
|   const Byte *Buffer = inStream; | ||||
|   const Byte *BufferLim = inStream + inSize; | ||||
|   #endif | ||||
|   int state = vs->State; | ||||
|   UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; | ||||
|   int len = vs->RemainLen; | ||||
|   UInt32 globalPos = vs->GlobalPos; | ||||
|   UInt32 distanceLimit = vs->DistanceLimit; | ||||
|  | ||||
|   Byte *dictionary = vs->Dictionary; | ||||
|   UInt32 dictionarySize = vs->Properties.DictionarySize; | ||||
|   UInt32 dictionaryPos = vs->DictionaryPos; | ||||
|  | ||||
|   Byte tempDictionary[4]; | ||||
|  | ||||
|   #ifndef _LZMA_IN_CB | ||||
|   *inSizeProcessed = 0; | ||||
|   #endif | ||||
|   *outSizeProcessed = 0; | ||||
|   if (len == kLzmaStreamWasFinishedId) | ||||
|     return LZMA_RESULT_OK; | ||||
|  | ||||
|   if (dictionarySize == 0) | ||||
|   { | ||||
|     dictionary = tempDictionary; | ||||
|     dictionarySize = 1; | ||||
|     tempDictionary[0] = vs->TempDictionary[0]; | ||||
|   } | ||||
|  | ||||
|   if (len == kLzmaNeedInitId) | ||||
|   { | ||||
|     { | ||||
|       UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); | ||||
|       UInt32 i; | ||||
|       for (i = 0; i < numProbs; i++) | ||||
|         p[i] = kBitModelTotal >> 1;  | ||||
|       rep0 = rep1 = rep2 = rep3 = 1; | ||||
|       state = 0; | ||||
|       globalPos = 0; | ||||
|       distanceLimit = 0; | ||||
|       dictionaryPos = 0; | ||||
|       dictionary[dictionarySize - 1] = 0; | ||||
|       #ifdef _LZMA_IN_CB | ||||
|       RC_INIT; | ||||
|       #else | ||||
|       RC_INIT(inStream, inSize); | ||||
|       #endif | ||||
|     } | ||||
|     len = 0; | ||||
|   } | ||||
|   while(len != 0 && nowPos < outSize) | ||||
|   { | ||||
|     UInt32 pos = dictionaryPos - rep0; | ||||
|     if (pos >= dictionarySize) | ||||
|       pos += dictionarySize; | ||||
|     outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; | ||||
|     if (++dictionaryPos == dictionarySize) | ||||
|       dictionaryPos = 0; | ||||
|     len--; | ||||
|   } | ||||
|   if (dictionaryPos == 0) | ||||
|     previousByte = dictionary[dictionarySize - 1]; | ||||
|   else | ||||
|     previousByte = dictionary[dictionaryPos - 1]; | ||||
|  | ||||
|   #else /* if !_LZMA_OUT_READ */ | ||||
|  | ||||
|   int state = 0; | ||||
|   UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; | ||||
|   int len = 0; | ||||
|   const Byte *Buffer; | ||||
|   const Byte *BufferLim; | ||||
|   UInt32 Range; | ||||
|   UInt32 Code; | ||||
|  | ||||
|   #ifndef _LZMA_IN_CB | ||||
|   *inSizeProcessed = 0; | ||||
|   #endif | ||||
|   *outSizeProcessed = 0; | ||||
|  | ||||
|   { | ||||
|     UInt32 i; | ||||
|     UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); | ||||
|     for (i = 0; i < numProbs; i++) | ||||
|       p[i] = kBitModelTotal >> 1; | ||||
|   } | ||||
|    | ||||
|   #ifdef _LZMA_IN_CB | ||||
|   RC_INIT; | ||||
|   #else | ||||
|   RC_INIT(inStream, inSize); | ||||
|   #endif | ||||
|  | ||||
|   #endif /* _LZMA_OUT_READ */ | ||||
|  | ||||
|   while(nowPos < outSize) | ||||
|   { | ||||
|     CProb *prob; | ||||
|     UInt32 bound; | ||||
|     int posState = (int)( | ||||
|         (nowPos  | ||||
|         #ifdef _LZMA_OUT_READ | ||||
|         + globalPos | ||||
|         #endif | ||||
|         ) | ||||
|         & posStateMask); | ||||
|  | ||||
|     prob = p + IsMatch + (state << kNumPosBitsMax) + posState; | ||||
|     IfBit0(prob) | ||||
|     { | ||||
|       int symbol = 1; | ||||
|       UpdateBit0(prob) | ||||
|       prob = p + Literal + (LZMA_LIT_SIZE *  | ||||
|         ((( | ||||
|         (nowPos  | ||||
|         #ifdef _LZMA_OUT_READ | ||||
|         + globalPos | ||||
|         #endif | ||||
|         ) | ||||
|         & literalPosMask) << lc) + (previousByte >> (8 - lc)))); | ||||
|  | ||||
|       if (state >= kNumLitStates) | ||||
|       { | ||||
|         int matchByte; | ||||
|         #ifdef _LZMA_OUT_READ | ||||
|         UInt32 pos = dictionaryPos - rep0; | ||||
|         if (pos >= dictionarySize) | ||||
|           pos += dictionarySize; | ||||
|         matchByte = dictionary[pos]; | ||||
|         #else | ||||
|         matchByte = outStream[nowPos - rep0]; | ||||
|         #endif | ||||
|         do | ||||
|         { | ||||
|           int bit; | ||||
|           CProb *probLit; | ||||
|           matchByte <<= 1; | ||||
|           bit = (matchByte & 0x100); | ||||
|           probLit = prob + 0x100 + bit + symbol; | ||||
|           RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break) | ||||
|         } | ||||
|         while (symbol < 0x100); | ||||
|       } | ||||
|       while (symbol < 0x100) | ||||
|       { | ||||
|         CProb *probLit = prob + symbol; | ||||
|         RC_GET_BIT(probLit, symbol) | ||||
|       } | ||||
|       previousByte = (Byte)symbol; | ||||
|  | ||||
|       outStream[nowPos++] = previousByte; | ||||
|       #ifdef _LZMA_OUT_READ | ||||
|       if (distanceLimit < dictionarySize) | ||||
|         distanceLimit++; | ||||
|  | ||||
|       dictionary[dictionaryPos] = previousByte; | ||||
|       if (++dictionaryPos == dictionarySize) | ||||
|         dictionaryPos = 0; | ||||
|       #endif | ||||
|       if (state < 4) state = 0; | ||||
|       else if (state < 10) state -= 3; | ||||
|       else state -= 6; | ||||
|     } | ||||
|     else              | ||||
|     { | ||||
|       UpdateBit1(prob); | ||||
|       prob = p + IsRep + state; | ||||
|       IfBit0(prob) | ||||
|       { | ||||
|         UpdateBit0(prob); | ||||
|         rep3 = rep2; | ||||
|         rep2 = rep1; | ||||
|         rep1 = rep0; | ||||
|         state = state < kNumLitStates ? 0 : 3; | ||||
|         prob = p + LenCoder; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         UpdateBit1(prob); | ||||
|         prob = p + IsRepG0 + state; | ||||
|         IfBit0(prob) | ||||
|         { | ||||
|           UpdateBit0(prob); | ||||
|           prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState; | ||||
|           IfBit0(prob) | ||||
|           { | ||||
|             #ifdef _LZMA_OUT_READ | ||||
|             UInt32 pos; | ||||
|             #endif | ||||
|             UpdateBit0(prob); | ||||
|              | ||||
|             #ifdef _LZMA_OUT_READ | ||||
|             if (distanceLimit == 0) | ||||
|             #else | ||||
|             if (nowPos == 0) | ||||
|             #endif | ||||
|               return LZMA_RESULT_DATA_ERROR; | ||||
|              | ||||
|             state = state < kNumLitStates ? 9 : 11; | ||||
|             #ifdef _LZMA_OUT_READ | ||||
|             pos = dictionaryPos - rep0; | ||||
|             if (pos >= dictionarySize) | ||||
|               pos += dictionarySize; | ||||
|             previousByte = dictionary[pos]; | ||||
|             dictionary[dictionaryPos] = previousByte; | ||||
|             if (++dictionaryPos == dictionarySize) | ||||
|               dictionaryPos = 0; | ||||
|             #else | ||||
|             previousByte = outStream[nowPos - rep0]; | ||||
|             #endif | ||||
|             outStream[nowPos++] = previousByte; | ||||
|             #ifdef _LZMA_OUT_READ | ||||
|             if (distanceLimit < dictionarySize) | ||||
|               distanceLimit++; | ||||
|             #endif | ||||
|  | ||||
|             continue; | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             UpdateBit1(prob); | ||||
|           } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           UInt32 distance; | ||||
|           UpdateBit1(prob); | ||||
|           prob = p + IsRepG1 + state; | ||||
|           IfBit0(prob) | ||||
|           { | ||||
|             UpdateBit0(prob); | ||||
|             distance = rep1; | ||||
|           } | ||||
|           else  | ||||
|           { | ||||
|             UpdateBit1(prob); | ||||
|             prob = p + IsRepG2 + state; | ||||
|             IfBit0(prob) | ||||
|             { | ||||
|               UpdateBit0(prob); | ||||
|               distance = rep2; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|               UpdateBit1(prob); | ||||
|               distance = rep3; | ||||
|               rep3 = rep2; | ||||
|             } | ||||
|             rep2 = rep1; | ||||
|           } | ||||
|           rep1 = rep0; | ||||
|           rep0 = distance; | ||||
|         } | ||||
|         state = state < kNumLitStates ? 8 : 11; | ||||
|         prob = p + RepLenCoder; | ||||
|       } | ||||
|       { | ||||
|         int numBits, offset; | ||||
|         CProb *probLen = prob + LenChoice; | ||||
|         IfBit0(probLen) | ||||
|         { | ||||
|           UpdateBit0(probLen); | ||||
|           probLen = prob + LenLow + (posState << kLenNumLowBits); | ||||
|           offset = 0; | ||||
|           numBits = kLenNumLowBits; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           UpdateBit1(probLen); | ||||
|           probLen = prob + LenChoice2; | ||||
|           IfBit0(probLen) | ||||
|           { | ||||
|             UpdateBit0(probLen); | ||||
|             probLen = prob + LenMid + (posState << kLenNumMidBits); | ||||
|             offset = kLenNumLowSymbols; | ||||
|             numBits = kLenNumMidBits; | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             UpdateBit1(probLen); | ||||
|             probLen = prob + LenHigh; | ||||
|             offset = kLenNumLowSymbols + kLenNumMidSymbols; | ||||
|             numBits = kLenNumHighBits; | ||||
|           } | ||||
|         } | ||||
|         RangeDecoderBitTreeDecode(probLen, numBits, len); | ||||
|         len += offset; | ||||
|       } | ||||
|  | ||||
|       if (state < 4) | ||||
|       { | ||||
|         int posSlot; | ||||
|         state += kNumLitStates; | ||||
|         prob = p + PosSlot + | ||||
|             ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<  | ||||
|             kNumPosSlotBits); | ||||
|         RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot); | ||||
|         if (posSlot >= kStartPosModelIndex) | ||||
|         { | ||||
|           int numDirectBits = ((posSlot >> 1) - 1); | ||||
|           rep0 = (2 | ((UInt32)posSlot & 1)); | ||||
|           if (posSlot < kEndPosModelIndex) | ||||
|           { | ||||
|             rep0 <<= numDirectBits; | ||||
|             prob = p + SpecPos + rep0 - posSlot - 1; | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             numDirectBits -= kNumAlignBits; | ||||
|             do | ||||
|             { | ||||
|               RC_NORMALIZE | ||||
|               Range >>= 1; | ||||
|               rep0 <<= 1; | ||||
|               if (Code >= Range) | ||||
|               { | ||||
|                 Code -= Range; | ||||
|                 rep0 |= 1; | ||||
|               } | ||||
|             } | ||||
|             while (--numDirectBits != 0); | ||||
|             prob = p + Align; | ||||
|             rep0 <<= kNumAlignBits; | ||||
|             numDirectBits = kNumAlignBits; | ||||
|           } | ||||
|           { | ||||
|             int i = 1; | ||||
|             int mi = 1; | ||||
|             do | ||||
|             { | ||||
|               CProb *prob3 = prob + mi; | ||||
|               RC_GET_BIT2(prob3, mi, ; , rep0 |= i); | ||||
|               i <<= 1; | ||||
|             } | ||||
|             while(--numDirectBits != 0); | ||||
|           } | ||||
|         } | ||||
|         else | ||||
|           rep0 = posSlot; | ||||
|         if (++rep0 == (UInt32)(0)) | ||||
|         { | ||||
|           /* it's for stream version */ | ||||
|           len = kLzmaStreamWasFinishedId; | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       len += kMatchMinLen; | ||||
|       #ifdef _LZMA_OUT_READ | ||||
|       if (rep0 > distanceLimit)  | ||||
|       #else | ||||
|       if (rep0 > nowPos) | ||||
|       #endif | ||||
|         return LZMA_RESULT_DATA_ERROR; | ||||
|  | ||||
|       #ifdef _LZMA_OUT_READ | ||||
|       if (dictionarySize - distanceLimit > (UInt32)len) | ||||
|         distanceLimit += len; | ||||
|       else | ||||
|         distanceLimit = dictionarySize; | ||||
|       #endif | ||||
|  | ||||
|       do | ||||
|       { | ||||
|         #ifdef _LZMA_OUT_READ | ||||
|         UInt32 pos = dictionaryPos - rep0; | ||||
|         if (pos >= dictionarySize) | ||||
|           pos += dictionarySize; | ||||
|         previousByte = dictionary[pos]; | ||||
|         dictionary[dictionaryPos] = previousByte; | ||||
|         if (++dictionaryPos == dictionarySize) | ||||
|           dictionaryPos = 0; | ||||
|         #else | ||||
|         previousByte = outStream[nowPos - rep0]; | ||||
|         #endif | ||||
|         len--; | ||||
|         outStream[nowPos++] = previousByte; | ||||
|       } | ||||
|       while(len != 0 && nowPos < outSize); | ||||
|     } | ||||
|   } | ||||
|   RC_NORMALIZE; | ||||
|  | ||||
|   #ifdef _LZMA_OUT_READ | ||||
|   vs->Range = Range; | ||||
|   vs->Code = Code; | ||||
|   vs->DictionaryPos = dictionaryPos; | ||||
|   vs->GlobalPos = globalPos + (UInt32)nowPos; | ||||
|   vs->DistanceLimit = distanceLimit; | ||||
|   vs->Reps[0] = rep0; | ||||
|   vs->Reps[1] = rep1; | ||||
|   vs->Reps[2] = rep2; | ||||
|   vs->Reps[3] = rep3; | ||||
|   vs->State = state; | ||||
|   vs->RemainLen = len; | ||||
|   vs->TempDictionary[0] = tempDictionary[0]; | ||||
|   #endif | ||||
|  | ||||
|   #ifdef _LZMA_IN_CB | ||||
|   vs->Buffer = Buffer; | ||||
|   vs->BufferLim = BufferLim; | ||||
|   #else | ||||
|   *inSizeProcessed = (SizeT)(Buffer - inStream); | ||||
|   #endif | ||||
|   *outSizeProcessed = nowPos; | ||||
|   return LZMA_RESULT_OK; | ||||
| } | ||||
							
								
								
									
										113
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaDecode.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaDecode.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| /*  | ||||
|   LzmaDecode.h | ||||
|   LZMA Decoder interface | ||||
|  | ||||
|   LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) | ||||
|   http://www.7-zip.org/ | ||||
|  | ||||
|   LZMA SDK is licensed under two licenses: | ||||
|   1) GNU Lesser General Public License (GNU LGPL) | ||||
|   2) Common Public License (CPL) | ||||
|   It means that you can select one of these two licenses and  | ||||
|   follow rules of that license. | ||||
|  | ||||
|   SPECIAL EXCEPTION: | ||||
|   Igor Pavlov, as the author of this code, expressly permits you to  | ||||
|   statically or dynamically link your code (or bind by name) to the  | ||||
|   interfaces of this file without subjecting your linked code to the  | ||||
|   terms of the CPL or GNU LGPL. Any modifications or additions  | ||||
|   to this file, however, are subject to the LGPL or CPL terms. | ||||
| */ | ||||
|  | ||||
| #ifndef __LZMADECODE_H | ||||
| #define __LZMADECODE_H | ||||
|  | ||||
| #include "LzmaTypes.h" | ||||
|  | ||||
| /* #define _LZMA_IN_CB */ | ||||
| /* Use callback for input data */ | ||||
|  | ||||
| /* #define _LZMA_OUT_READ */ | ||||
| /* Use read function for output data */ | ||||
|  | ||||
| /* #define _LZMA_PROB32 */ | ||||
| /* It can increase speed on some 32-bit CPUs,  | ||||
|    but memory usage will be doubled in that case */ | ||||
|  | ||||
| /* #define _LZMA_LOC_OPT */ | ||||
| /* Enable local speed optimizations inside code */ | ||||
|  | ||||
| #ifdef _LZMA_PROB32 | ||||
| #define CProb UInt32 | ||||
| #else | ||||
| #define CProb UInt16 | ||||
| #endif | ||||
|  | ||||
| #define LZMA_RESULT_OK 0 | ||||
| #define LZMA_RESULT_DATA_ERROR 1 | ||||
|  | ||||
| #ifdef _LZMA_IN_CB | ||||
| typedef struct _ILzmaInCallback | ||||
| { | ||||
|   int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize); | ||||
| } ILzmaInCallback; | ||||
| #endif | ||||
|  | ||||
| #define LZMA_BASE_SIZE 1846 | ||||
| #define LZMA_LIT_SIZE 768 | ||||
|  | ||||
| #define LZMA_PROPERTIES_SIZE 5 | ||||
|  | ||||
| typedef struct _CLzmaProperties | ||||
| { | ||||
|   int lc; | ||||
|   int lp; | ||||
|   int pb; | ||||
|   #ifdef _LZMA_OUT_READ | ||||
|   UInt32 DictionarySize; | ||||
|   #endif | ||||
| }CLzmaProperties; | ||||
|  | ||||
| int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size); | ||||
|  | ||||
| #define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp))) | ||||
|  | ||||
| #define kLzmaNeedInitId (-2) | ||||
|  | ||||
| typedef struct _CLzmaDecoderState | ||||
| { | ||||
|   CLzmaProperties Properties; | ||||
|   CProb *Probs; | ||||
|  | ||||
|   #ifdef _LZMA_IN_CB | ||||
|   const unsigned char *Buffer; | ||||
|   const unsigned char *BufferLim; | ||||
|   #endif | ||||
|  | ||||
|   #ifdef _LZMA_OUT_READ | ||||
|   unsigned char *Dictionary; | ||||
|   UInt32 Range; | ||||
|   UInt32 Code; | ||||
|   UInt32 DictionaryPos; | ||||
|   UInt32 GlobalPos; | ||||
|   UInt32 DistanceLimit; | ||||
|   UInt32 Reps[4]; | ||||
|   int State; | ||||
|   int RemainLen; | ||||
|   unsigned char TempDictionary[4]; | ||||
|   #endif | ||||
| } CLzmaDecoderState; | ||||
|  | ||||
| #ifdef _LZMA_OUT_READ | ||||
| #define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; } | ||||
| #endif | ||||
|  | ||||
| int LzmaDecode(CLzmaDecoderState *vs, | ||||
|     #ifdef _LZMA_IN_CB | ||||
|     ILzmaInCallback *inCallback, | ||||
|     #else | ||||
|     const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, | ||||
|     #endif | ||||
|     unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										45
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaTypes.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								target/linux/ath79/image/lzma-loader/src/LzmaTypes.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /*  | ||||
| LzmaTypes.h  | ||||
|  | ||||
| Types for LZMA Decoder | ||||
|  | ||||
| This file written and distributed to public domain by Igor Pavlov. | ||||
| This file is part of LZMA SDK 4.40 (2006-05-01) | ||||
| */ | ||||
|  | ||||
| #ifndef __LZMATYPES_H | ||||
| #define __LZMATYPES_H | ||||
|  | ||||
| #ifndef _7ZIP_BYTE_DEFINED | ||||
| #define _7ZIP_BYTE_DEFINED | ||||
| typedef unsigned char Byte; | ||||
| #endif  | ||||
|  | ||||
| #ifndef _7ZIP_UINT16_DEFINED | ||||
| #define _7ZIP_UINT16_DEFINED | ||||
| typedef unsigned short UInt16; | ||||
| #endif  | ||||
|  | ||||
| #ifndef _7ZIP_UINT32_DEFINED | ||||
| #define _7ZIP_UINT32_DEFINED | ||||
| #ifdef _LZMA_UINT32_IS_ULONG | ||||
| typedef unsigned long UInt32; | ||||
| #else | ||||
| typedef unsigned int UInt32; | ||||
| #endif | ||||
| #endif  | ||||
|  | ||||
| /* #define _LZMA_NO_SYSTEM_SIZE_T */ | ||||
| /* You can use it, if you don't want <stddef.h> */ | ||||
|  | ||||
| #ifndef _7ZIP_SIZET_DEFINED | ||||
| #define _7ZIP_SIZET_DEFINED | ||||
| #ifdef _LZMA_NO_SYSTEM_SIZE_T | ||||
| typedef UInt32 SizeT; | ||||
| #else | ||||
| #include <stddef.h> | ||||
| typedef size_t SizeT; | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										106
									
								
								target/linux/ath79/image/lzma-loader/src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								target/linux/ath79/image/lzma-loader/src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| # | ||||
| # Makefile for the LZMA compressed kernel loader for | ||||
| # Atheros AR7XXX/AR9XXX based boards | ||||
| # | ||||
| # Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
| # | ||||
| # Some parts of this file was based on the OpenWrt specific lzma-loader | ||||
| # for the BCM47xx and ADM5120 based boards: | ||||
| #	Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) | ||||
| #	Copyright (C) 2005 Mineharu Takahara <mtakahar@yahoo.com> | ||||
| #	Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> | ||||
| # | ||||
| # 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. | ||||
| # | ||||
|  | ||||
| LOADADDR	:= | ||||
| LZMA_TEXT_START	:= 0x80a00000 | ||||
| LOADER_DATA	:= | ||||
| BOARD		:= | ||||
| FLASH_OFFS	:= | ||||
| FLASH_MAX	:= | ||||
|  | ||||
| CC		:= $(CROSS_COMPILE)gcc | ||||
| LD		:= $(CROSS_COMPILE)ld | ||||
| OBJCOPY		:= $(CROSS_COMPILE)objcopy | ||||
| OBJDUMP		:= $(CROSS_COMPILE)objdump | ||||
|  | ||||
| BIN_FLAGS	:= -O binary -R .reginfo -R .note -R .comment -R .mdebug \ | ||||
| 		   -R .MIPS.abiflags -S | ||||
|  | ||||
| CFLAGS		= -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \ | ||||
| 		  -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 \ | ||||
| 		  -mno-abicalls -fno-pic -ffunction-sections -pipe -mlong-calls \ | ||||
| 		  -fno-common -ffreestanding -fhonour-copts \ | ||||
| 		  -mabi=32 -march=mips32r2 \ | ||||
| 		  -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap | ||||
| CFLAGS		+= -D_LZMA_PROB32 | ||||
|  | ||||
| ASFLAGS		= $(CFLAGS) -D__ASSEMBLY__ | ||||
|  | ||||
| LDFLAGS		= -static --gc-sections -no-warn-mismatch | ||||
| LDFLAGS		+= -e startup -T loader.lds -Ttext $(LZMA_TEXT_START) | ||||
|  | ||||
| O_FORMAT 	= $(shell $(OBJDUMP) -i | head -2 | grep elf32) | ||||
|  | ||||
| OBJECTS		:= head.o loader.o cache.o board.o printf.o LzmaDecode.o | ||||
|  | ||||
| ifneq ($(strip $(LOADER_DATA)),) | ||||
| OBJECTS		+= data.o | ||||
| CFLAGS		+= -DLZMA_WRAPPER=1 -DLOADADDR=$(LOADADDR) | ||||
| endif | ||||
|  | ||||
| ifneq ($(strip $(KERNEL_CMDLINE)),) | ||||
| CFLAGS		+= -DCONFIG_KERNEL_CMDLINE='"$(KERNEL_CMDLINE)"' | ||||
| endif | ||||
|  | ||||
| ifneq ($(strip $(FLASH_OFFS)),) | ||||
| CFLAGS		+= -DCONFIG_FLASH_OFFS=$(FLASH_OFFS) | ||||
| endif | ||||
|  | ||||
| ifneq ($(strip $(FLASH_MAX)),) | ||||
| CFLAGS		+= -DCONFIG_FLASH_MAX=$(FLASH_MAX) | ||||
| endif | ||||
|  | ||||
| BOARD_DEF := $(shell echo $(strip $(BOARD)) | tr a-z A-Z | tr - _) | ||||
| ifneq ($(BOARD_DEF),) | ||||
| CFLAGS		+= -DCONFIG_BOARD_$(BOARD_DEF) | ||||
| endif | ||||
|  | ||||
| all: loader.elf | ||||
|  | ||||
| # Don't build dependencies, this may die if $(CC) isn't gcc | ||||
| dep: | ||||
|  | ||||
| install: | ||||
|  | ||||
| %.o : %.c | ||||
| 	$(CC) $(CFLAGS) -c -o $@ $< | ||||
|  | ||||
| %.o : %.S | ||||
| 	$(CC) $(ASFLAGS) -c -o $@ $< | ||||
|  | ||||
| data.o: $(LOADER_DATA) | ||||
| 	$(LD) -r -b binary --oformat $(O_FORMAT) -T lzma-data.lds -o $@ $< | ||||
|  | ||||
| loader: $(OBJECTS) | ||||
| 	$(LD) $(LDFLAGS) -o $@ $(OBJECTS) | ||||
|  | ||||
| loader.bin: loader | ||||
| 	$(OBJCOPY) $(BIN_FLAGS) $< $@ | ||||
|  | ||||
| loader2.o: loader.bin | ||||
| 	$(LD) -r -b binary --oformat $(O_FORMAT) -o $@ $< | ||||
|  | ||||
| loader.elf: loader2.o | ||||
| 	$(LD) -e startup -T loader2.lds -Ttext $(LOADADDR) -o $@ $< | ||||
|  | ||||
| mrproper: clean | ||||
|  | ||||
| clean: | ||||
| 	rm -f loader *.elf *.bin *.o | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										725
									
								
								target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										725
									
								
								target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,725 @@ | ||||
| /* | ||||
|  *  Atheros AR71XX/AR724X/AR913X SoC register definitions | ||||
|  * | ||||
|  *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com> | ||||
|  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
|  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
|  * | ||||
|  *  Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP | ||||
|  * | ||||
|  *  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. | ||||
|  */ | ||||
|  | ||||
| #ifndef __ASM_MACH_AR71XX_REGS_H | ||||
| #define __ASM_MACH_AR71XX_REGS_H | ||||
|  | ||||
| #define BIT(_x)			(1UL << (_x)) | ||||
|  | ||||
| #define AR71XX_APB_BASE		0x18000000 | ||||
| #define AR71XX_GE0_BASE		0x19000000 | ||||
| #define AR71XX_GE0_SIZE		0x10000 | ||||
| #define AR71XX_GE1_BASE		0x1a000000 | ||||
| #define AR71XX_GE1_SIZE		0x10000 | ||||
| #define AR71XX_EHCI_BASE	0x1b000000 | ||||
| #define AR71XX_EHCI_SIZE	0x1000 | ||||
| #define AR71XX_OHCI_BASE	0x1c000000 | ||||
| #define AR71XX_OHCI_SIZE	0x1000 | ||||
| #define AR71XX_SPI_BASE		0x1f000000 | ||||
| #define AR71XX_SPI_SIZE		0x01000000 | ||||
|  | ||||
| #define AR71XX_DDR_CTRL_BASE	(AR71XX_APB_BASE + 0x00000000) | ||||
| #define AR71XX_DDR_CTRL_SIZE	0x100 | ||||
| #define AR71XX_UART_BASE	(AR71XX_APB_BASE + 0x00020000) | ||||
| #define AR71XX_UART_SIZE	0x100 | ||||
| #define AR71XX_USB_CTRL_BASE	(AR71XX_APB_BASE + 0x00030000) | ||||
| #define AR71XX_USB_CTRL_SIZE	0x100 | ||||
| #define AR71XX_GPIO_BASE        (AR71XX_APB_BASE + 0x00040000) | ||||
| #define AR71XX_GPIO_SIZE        0x100 | ||||
| #define AR71XX_PLL_BASE		(AR71XX_APB_BASE + 0x00050000) | ||||
| #define AR71XX_PLL_SIZE		0x100 | ||||
| #define AR71XX_RESET_BASE	(AR71XX_APB_BASE + 0x00060000) | ||||
| #define AR71XX_RESET_SIZE	0x100 | ||||
| #define AR71XX_MII_BASE		(AR71XX_APB_BASE + 0x00070000) | ||||
| #define AR71XX_MII_SIZE		0x100 | ||||
|  | ||||
| #define AR71XX_PCI_MEM_BASE	0x10000000 | ||||
| #define AR71XX_PCI_MEM_SIZE	0x07000000 | ||||
|  | ||||
| #define AR71XX_PCI_WIN0_OFFS	0x10000000 | ||||
| #define AR71XX_PCI_WIN1_OFFS	0x11000000 | ||||
| #define AR71XX_PCI_WIN2_OFFS	0x12000000 | ||||
| #define AR71XX_PCI_WIN3_OFFS	0x13000000 | ||||
| #define AR71XX_PCI_WIN4_OFFS	0x14000000 | ||||
| #define AR71XX_PCI_WIN5_OFFS	0x15000000 | ||||
| #define AR71XX_PCI_WIN6_OFFS	0x16000000 | ||||
| #define AR71XX_PCI_WIN7_OFFS	0x07000000 | ||||
|  | ||||
| #define AR71XX_PCI_CFG_BASE	\ | ||||
| 	(AR71XX_PCI_MEM_BASE + AR71XX_PCI_WIN7_OFFS + 0x10000) | ||||
| #define AR71XX_PCI_CFG_SIZE	0x100 | ||||
|  | ||||
| #define AR7240_USB_CTRL_BASE	(AR71XX_APB_BASE + 0x00030000) | ||||
| #define AR7240_USB_CTRL_SIZE	0x100 | ||||
| #define AR7240_OHCI_BASE	0x1b000000 | ||||
| #define AR7240_OHCI_SIZE	0x1000 | ||||
|  | ||||
| #define AR724X_PCI_MEM_BASE	0x10000000 | ||||
| #define AR724X_PCI_MEM_SIZE	0x04000000 | ||||
|  | ||||
| #define AR724X_PCI_CFG_BASE	0x14000000 | ||||
| #define AR724X_PCI_CFG_SIZE	0x1000 | ||||
| #define AR724X_PCI_CRP_BASE	(AR71XX_APB_BASE + 0x000c0000) | ||||
| #define AR724X_PCI_CRP_SIZE	0x1000 | ||||
| #define AR724X_PCI_CTRL_BASE	(AR71XX_APB_BASE + 0x000f0000) | ||||
| #define AR724X_PCI_CTRL_SIZE	0x100 | ||||
|  | ||||
| #define AR724X_EHCI_BASE	0x1b000000 | ||||
| #define AR724X_EHCI_SIZE	0x1000 | ||||
|  | ||||
| #define AR913X_EHCI_BASE	0x1b000000 | ||||
| #define AR913X_EHCI_SIZE	0x1000 | ||||
| #define AR913X_WMAC_BASE	(AR71XX_APB_BASE + 0x000C0000) | ||||
| #define AR913X_WMAC_SIZE	0x30000 | ||||
|  | ||||
| #define AR933X_UART_BASE	(AR71XX_APB_BASE + 0x00020000) | ||||
| #define AR933X_UART_SIZE	0x14 | ||||
| #define AR933X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| #define AR933X_GMAC_SIZE	0x04 | ||||
| #define AR933X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
| #define AR933X_WMAC_SIZE	0x20000 | ||||
| #define AR933X_EHCI_BASE	0x1b000000 | ||||
| #define AR933X_EHCI_SIZE	0x1000 | ||||
|  | ||||
| #define AR934X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| #define AR934X_GMAC_SIZE	0x14 | ||||
| #define AR934X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
| #define AR934X_WMAC_SIZE	0x20000 | ||||
| #define AR934X_EHCI_BASE	0x1b000000 | ||||
| #define AR934X_EHCI_SIZE	0x200 | ||||
|  | ||||
| #define QCA955X_PCI_MEM_BASE0	0x10000000 | ||||
| #define QCA955X_PCI_MEM_BASE1	0x12000000 | ||||
| #define QCA955X_PCI_MEM_SIZE	0x02000000 | ||||
| #define QCA955X_PCI_CFG_BASE0	0x14000000 | ||||
| #define QCA955X_PCI_CFG_BASE1	0x16000000 | ||||
| #define QCA955X_PCI_CFG_SIZE	0x1000 | ||||
| #define QCA955X_PCI_CRP_BASE0	(AR71XX_APB_BASE + 0x000c0000) | ||||
| #define QCA955X_PCI_CRP_BASE1	(AR71XX_APB_BASE + 0x00250000) | ||||
| #define QCA955X_PCI_CRP_SIZE	0x1000 | ||||
| #define QCA955X_PCI_CTRL_BASE0	(AR71XX_APB_BASE + 0x000f0000) | ||||
| #define QCA955X_PCI_CTRL_BASE1	(AR71XX_APB_BASE + 0x00280000) | ||||
| #define QCA955X_PCI_CTRL_SIZE	0x100 | ||||
|  | ||||
| #define QCA955X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
| #define QCA955X_WMAC_SIZE	0x20000 | ||||
| #define QCA955X_EHCI0_BASE	0x1b000000 | ||||
| #define QCA955X_EHCI1_BASE	0x1b400000 | ||||
| #define QCA955X_EHCI_SIZE	0x1000 | ||||
| #define QCA955X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| #define QCA955X_GMAC_SIZE	0x40 | ||||
|  | ||||
| #define AR9300_OTP_BASE		0x14000 | ||||
| #define AR9300_OTP_STATUS	0x15f18 | ||||
| #define AR9300_OTP_STATUS_TYPE		0x7 | ||||
| #define AR9300_OTP_STATUS_VALID		0x4 | ||||
| #define AR9300_OTP_STATUS_ACCESS_BUSY	0x2 | ||||
| #define AR9300_OTP_STATUS_SM_BUSY	0x1 | ||||
| #define AR9300_OTP_READ_DATA	0x15f1c | ||||
|  | ||||
| /* | ||||
|  * DDR_CTRL block | ||||
|  */ | ||||
| #define AR71XX_DDR_REG_PCI_WIN0		0x7c | ||||
| #define AR71XX_DDR_REG_PCI_WIN1		0x80 | ||||
| #define AR71XX_DDR_REG_PCI_WIN2		0x84 | ||||
| #define AR71XX_DDR_REG_PCI_WIN3		0x88 | ||||
| #define AR71XX_DDR_REG_PCI_WIN4		0x8c | ||||
| #define AR71XX_DDR_REG_PCI_WIN5		0x90 | ||||
| #define AR71XX_DDR_REG_PCI_WIN6		0x94 | ||||
| #define AR71XX_DDR_REG_PCI_WIN7		0x98 | ||||
| #define AR71XX_DDR_REG_FLUSH_GE0	0x9c | ||||
| #define AR71XX_DDR_REG_FLUSH_GE1	0xa0 | ||||
| #define AR71XX_DDR_REG_FLUSH_USB	0xa4 | ||||
| #define AR71XX_DDR_REG_FLUSH_PCI	0xa8 | ||||
|  | ||||
| #define AR724X_DDR_REG_FLUSH_GE0	0x7c | ||||
| #define AR724X_DDR_REG_FLUSH_GE1	0x80 | ||||
| #define AR724X_DDR_REG_FLUSH_USB	0x84 | ||||
| #define AR724X_DDR_REG_FLUSH_PCIE	0x88 | ||||
|  | ||||
| #define AR913X_DDR_REG_FLUSH_GE0	0x7c | ||||
| #define AR913X_DDR_REG_FLUSH_GE1	0x80 | ||||
| #define AR913X_DDR_REG_FLUSH_USB	0x84 | ||||
| #define AR913X_DDR_REG_FLUSH_WMAC	0x88 | ||||
|  | ||||
| #define AR933X_DDR_REG_FLUSH_GE0	0x7c | ||||
| #define AR933X_DDR_REG_FLUSH_GE1	0x80 | ||||
| #define AR933X_DDR_REG_FLUSH_USB	0x84 | ||||
| #define AR933X_DDR_REG_FLUSH_WMAC	0x88 | ||||
|  | ||||
| #define AR934X_DDR_REG_FLUSH_GE0	0x9c | ||||
| #define AR934X_DDR_REG_FLUSH_GE1	0xa0 | ||||
| #define AR934X_DDR_REG_FLUSH_USB	0xa4 | ||||
| #define AR934X_DDR_REG_FLUSH_PCIE	0xa8 | ||||
| #define AR934X_DDR_REG_FLUSH_WMAC	0xac | ||||
|  | ||||
| /* | ||||
|  * PLL block | ||||
|  */ | ||||
| #define AR71XX_PLL_REG_CPU_CONFIG	0x00 | ||||
| #define AR71XX_PLL_REG_SEC_CONFIG	0x04 | ||||
| #define AR71XX_PLL_REG_ETH0_INT_CLOCK	0x10 | ||||
| #define AR71XX_PLL_REG_ETH1_INT_CLOCK	0x14 | ||||
|  | ||||
| #define AR71XX_PLL_DIV_SHIFT		3 | ||||
| #define AR71XX_PLL_DIV_MASK		0x1f | ||||
| #define AR71XX_CPU_DIV_SHIFT		16 | ||||
| #define AR71XX_CPU_DIV_MASK		0x3 | ||||
| #define AR71XX_DDR_DIV_SHIFT		18 | ||||
| #define AR71XX_DDR_DIV_MASK		0x3 | ||||
| #define AR71XX_AHB_DIV_SHIFT		20 | ||||
| #define AR71XX_AHB_DIV_MASK		0x7 | ||||
|  | ||||
| #define AR71XX_ETH0_PLL_SHIFT		17 | ||||
| #define AR71XX_ETH1_PLL_SHIFT		19 | ||||
|  | ||||
| #define AR724X_PLL_REG_CPU_CONFIG	0x00 | ||||
| #define AR724X_PLL_REG_PCIE_CONFIG	0x18 | ||||
|  | ||||
| #define AR724X_PLL_DIV_SHIFT		0 | ||||
| #define AR724X_PLL_DIV_MASK		0x3ff | ||||
| #define AR724X_PLL_REF_DIV_SHIFT	10 | ||||
| #define AR724X_PLL_REF_DIV_MASK		0xf | ||||
| #define AR724X_AHB_DIV_SHIFT		19 | ||||
| #define AR724X_AHB_DIV_MASK		0x1 | ||||
| #define AR724X_DDR_DIV_SHIFT		22 | ||||
| #define AR724X_DDR_DIV_MASK		0x3 | ||||
|  | ||||
| #define AR7242_PLL_REG_ETH0_INT_CLOCK	0x2c | ||||
|  | ||||
| #define AR913X_PLL_REG_CPU_CONFIG	0x00 | ||||
| #define AR913X_PLL_REG_ETH_CONFIG	0x04 | ||||
| #define AR913X_PLL_REG_ETH0_INT_CLOCK	0x14 | ||||
| #define AR913X_PLL_REG_ETH1_INT_CLOCK	0x18 | ||||
|  | ||||
| #define AR913X_PLL_DIV_SHIFT		0 | ||||
| #define AR913X_PLL_DIV_MASK		0x3ff | ||||
| #define AR913X_DDR_DIV_SHIFT		22 | ||||
| #define AR913X_DDR_DIV_MASK		0x3 | ||||
| #define AR913X_AHB_DIV_SHIFT		19 | ||||
| #define AR913X_AHB_DIV_MASK		0x1 | ||||
|  | ||||
| #define AR913X_ETH0_PLL_SHIFT		20 | ||||
| #define AR913X_ETH1_PLL_SHIFT		22 | ||||
|  | ||||
| #define AR933X_PLL_CPU_CONFIG_REG	0x00 | ||||
| #define AR933X_PLL_CLOCK_CTRL_REG	0x08 | ||||
|  | ||||
| #define AR933X_PLL_CPU_CONFIG_NINT_SHIFT	10 | ||||
| #define AR933X_PLL_CPU_CONFIG_NINT_MASK		0x3f | ||||
| #define AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT	16 | ||||
| #define AR933X_PLL_CPU_CONFIG_REFDIV_MASK	0x1f | ||||
| #define AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT	23 | ||||
| #define AR933X_PLL_CPU_CONFIG_OUTDIV_MASK	0x7 | ||||
|  | ||||
| #define AR933X_PLL_CLOCK_CTRL_BYPASS		BIT(2) | ||||
| #define AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT	5 | ||||
| #define AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK	0x3 | ||||
| #define AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT	10 | ||||
| #define AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK	0x3 | ||||
| #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT	15 | ||||
| #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK	0x7 | ||||
|  | ||||
| #define AR934X_PLL_CPU_CONFIG_REG		0x00 | ||||
| #define AR934X_PLL_DDR_CONFIG_REG		0x04 | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_REG		0x08 | ||||
| #define AR934X_PLL_ETH_XMII_CONTROL_REG		0x2c | ||||
|  | ||||
| #define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT	0 | ||||
| #define AR934X_PLL_CPU_CONFIG_NFRAC_MASK	0x3f | ||||
| #define AR934X_PLL_CPU_CONFIG_NINT_SHIFT	6 | ||||
| #define AR934X_PLL_CPU_CONFIG_NINT_MASK		0x3f | ||||
| #define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT	12 | ||||
| #define AR934X_PLL_CPU_CONFIG_REFDIV_MASK	0x1f | ||||
| #define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT	19 | ||||
| #define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK	0x3 | ||||
|  | ||||
| #define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT	0 | ||||
| #define AR934X_PLL_DDR_CONFIG_NFRAC_MASK	0x3ff | ||||
| #define AR934X_PLL_DDR_CONFIG_NINT_SHIFT	10 | ||||
| #define AR934X_PLL_DDR_CONFIG_NINT_MASK		0x3f | ||||
| #define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT	16 | ||||
| #define AR934X_PLL_DDR_CONFIG_REFDIV_MASK	0x1f | ||||
| #define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT	23 | ||||
| #define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK	0x7 | ||||
|  | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS	BIT(2) | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS	BIT(3) | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS	BIT(4) | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT	5 | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK	0x1f | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT	10 | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK	0x1f | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT	15 | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK	0x1f | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL	BIT(20) | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL	BIT(21) | ||||
| #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL	BIT(24) | ||||
|  | ||||
| #define QCA955X_PLL_CPU_CONFIG_REG		0x00 | ||||
| #define QCA955X_PLL_DDR_CONFIG_REG		0x04 | ||||
| #define QCA955X_PLL_CLK_CTRL_REG		0x08 | ||||
|  | ||||
| #define QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT	0 | ||||
| #define QCA955X_PLL_CPU_CONFIG_NFRAC_MASK	0x3f | ||||
| #define QCA955X_PLL_CPU_CONFIG_NINT_SHIFT	6 | ||||
| #define QCA955X_PLL_CPU_CONFIG_NINT_MASK	0x3f | ||||
| #define QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT	12 | ||||
| #define QCA955X_PLL_CPU_CONFIG_REFDIV_MASK	0x1f | ||||
| #define QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT	19 | ||||
| #define QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK	0x3 | ||||
|  | ||||
| #define QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT	0 | ||||
| #define QCA955X_PLL_DDR_CONFIG_NFRAC_MASK	0x3ff | ||||
| #define QCA955X_PLL_DDR_CONFIG_NINT_SHIFT	10 | ||||
| #define QCA955X_PLL_DDR_CONFIG_NINT_MASK	0x3f | ||||
| #define QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT	16 | ||||
| #define QCA955X_PLL_DDR_CONFIG_REFDIV_MASK	0x1f | ||||
| #define QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT	23 | ||||
| #define QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK	0x7 | ||||
|  | ||||
| #define QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2) | ||||
| #define QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3) | ||||
| #define QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4) | ||||
| #define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5 | ||||
| #define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f | ||||
| #define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10 | ||||
| #define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f | ||||
| #define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15 | ||||
| #define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f | ||||
| #define QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL		BIT(20) | ||||
| #define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21) | ||||
| #define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24) | ||||
|  | ||||
| /* | ||||
|  * USB_CONFIG block | ||||
|  */ | ||||
| #define AR71XX_USB_CTRL_REG_FLADJ	0x00 | ||||
| #define AR71XX_USB_CTRL_REG_CONFIG	0x04 | ||||
|  | ||||
| /* | ||||
|  * RESET block | ||||
|  */ | ||||
| #define AR71XX_RESET_REG_TIMER			0x00 | ||||
| #define AR71XX_RESET_REG_TIMER_RELOAD		0x04 | ||||
| #define AR71XX_RESET_REG_WDOG_CTRL		0x08 | ||||
| #define AR71XX_RESET_REG_WDOG			0x0c | ||||
| #define AR71XX_RESET_REG_MISC_INT_STATUS	0x10 | ||||
| #define AR71XX_RESET_REG_MISC_INT_ENABLE	0x14 | ||||
| #define AR71XX_RESET_REG_PCI_INT_STATUS		0x18 | ||||
| #define AR71XX_RESET_REG_PCI_INT_ENABLE		0x1c | ||||
| #define AR71XX_RESET_REG_GLOBAL_INT_STATUS	0x20 | ||||
| #define AR71XX_RESET_REG_RESET_MODULE		0x24 | ||||
| #define AR71XX_RESET_REG_PERFC_CTRL		0x2c | ||||
| #define AR71XX_RESET_REG_PERFC0			0x30 | ||||
| #define AR71XX_RESET_REG_PERFC1			0x34 | ||||
| #define AR71XX_RESET_REG_REV_ID			0x90 | ||||
|  | ||||
| #define AR913X_RESET_REG_GLOBAL_INT_STATUS	0x18 | ||||
| #define AR913X_RESET_REG_RESET_MODULE		0x1c | ||||
| #define AR913X_RESET_REG_PERF_CTRL		0x20 | ||||
| #define AR913X_RESET_REG_PERFC0			0x24 | ||||
| #define AR913X_RESET_REG_PERFC1			0x28 | ||||
|  | ||||
| #define AR724X_RESET_REG_RESET_MODULE		0x1c | ||||
|  | ||||
| #define AR933X_RESET_REG_RESET_MODULE		0x1c | ||||
| #define AR933X_RESET_REG_BOOTSTRAP		0xac | ||||
|  | ||||
| #define AR934X_RESET_REG_RESET_MODULE		0x1c | ||||
| #define AR934X_RESET_REG_BOOTSTRAP		0xb0 | ||||
| #define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS	0xac | ||||
|  | ||||
| #define QCA955X_RESET_REG_BOOTSTRAP		0xb0 | ||||
| #define QCA955X_RESET_REG_EXT_INT_STATUS	0xac | ||||
|  | ||||
| #define MISC_INT_ETHSW			BIT(12) | ||||
| #define MISC_INT_TIMER4			BIT(10) | ||||
| #define MISC_INT_TIMER3			BIT(9) | ||||
| #define MISC_INT_TIMER2			BIT(8) | ||||
| #define MISC_INT_DMA			BIT(7) | ||||
| #define MISC_INT_OHCI			BIT(6) | ||||
| #define MISC_INT_PERFC			BIT(5) | ||||
| #define MISC_INT_WDOG			BIT(4) | ||||
| #define MISC_INT_UART			BIT(3) | ||||
| #define MISC_INT_GPIO			BIT(2) | ||||
| #define MISC_INT_ERROR			BIT(1) | ||||
| #define MISC_INT_TIMER			BIT(0) | ||||
|  | ||||
| #define AR71XX_RESET_EXTERNAL		BIT(28) | ||||
| #define AR71XX_RESET_FULL_CHIP		BIT(24) | ||||
| #define AR71XX_RESET_CPU_NMI		BIT(21) | ||||
| #define AR71XX_RESET_CPU_COLD		BIT(20) | ||||
| #define AR71XX_RESET_DMA		BIT(19) | ||||
| #define AR71XX_RESET_SLIC		BIT(18) | ||||
| #define AR71XX_RESET_STEREO		BIT(17) | ||||
| #define AR71XX_RESET_DDR		BIT(16) | ||||
| #define AR71XX_RESET_GE1_MAC		BIT(13) | ||||
| #define AR71XX_RESET_GE1_PHY		BIT(12) | ||||
| #define AR71XX_RESET_USBSUS_OVERRIDE	BIT(10) | ||||
| #define AR71XX_RESET_GE0_MAC		BIT(9) | ||||
| #define AR71XX_RESET_GE0_PHY		BIT(8) | ||||
| #define AR71XX_RESET_USB_OHCI_DLL	BIT(6) | ||||
| #define AR71XX_RESET_USB_HOST		BIT(5) | ||||
| #define AR71XX_RESET_USB_PHY		BIT(4) | ||||
| #define AR71XX_RESET_PCI_BUS		BIT(1) | ||||
| #define AR71XX_RESET_PCI_CORE		BIT(0) | ||||
|  | ||||
| #define AR7240_RESET_USB_HOST		BIT(5) | ||||
| #define AR7240_RESET_OHCI_DLL		BIT(3) | ||||
|  | ||||
| #define AR724X_RESET_GE1_MDIO		BIT(23) | ||||
| #define AR724X_RESET_GE0_MDIO		BIT(22) | ||||
| #define AR724X_RESET_PCIE_PHY_SERIAL	BIT(10) | ||||
| #define AR724X_RESET_PCIE_PHY		BIT(7) | ||||
| #define AR724X_RESET_PCIE		BIT(6) | ||||
| #define AR724X_RESET_USB_HOST		BIT(5) | ||||
| #define AR724X_RESET_USB_PHY		BIT(4) | ||||
| #define AR724X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
|  | ||||
| #define AR913X_RESET_AMBA2WMAC		BIT(22) | ||||
| #define AR913X_RESET_USBSUS_OVERRIDE	BIT(10) | ||||
| #define AR913X_RESET_USB_HOST		BIT(5) | ||||
| #define AR913X_RESET_USB_PHY		BIT(4) | ||||
|  | ||||
| #define AR933X_RESET_GE1_MDIO		BIT(23) | ||||
| #define AR933X_RESET_GE0_MDIO		BIT(22) | ||||
| #define AR933X_RESET_GE1_MAC		BIT(13) | ||||
| #define AR933X_RESET_WMAC		BIT(11) | ||||
| #define AR933X_RESET_GE0_MAC		BIT(9) | ||||
| #define AR933X_RESET_USB_HOST		BIT(5) | ||||
| #define AR933X_RESET_USB_PHY		BIT(4) | ||||
| #define AR933X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
|  | ||||
| #define AR934X_RESET_HOST		BIT(31) | ||||
| #define AR934X_RESET_SLIC		BIT(30) | ||||
| #define AR934X_RESET_HDMA		BIT(29) | ||||
| #define AR934X_RESET_EXTERNAL		BIT(28) | ||||
| #define AR934X_RESET_RTC		BIT(27) | ||||
| #define AR934X_RESET_PCIE_EP_INT	BIT(26) | ||||
| #define AR934X_RESET_CHKSUM_ACC		BIT(25) | ||||
| #define AR934X_RESET_FULL_CHIP		BIT(24) | ||||
| #define AR934X_RESET_GE1_MDIO		BIT(23) | ||||
| #define AR934X_RESET_GE0_MDIO		BIT(22) | ||||
| #define AR934X_RESET_CPU_NMI		BIT(21) | ||||
| #define AR934X_RESET_CPU_COLD		BIT(20) | ||||
| #define AR934X_RESET_HOST_RESET_INT	BIT(19) | ||||
| #define AR934X_RESET_PCIE_EP		BIT(18) | ||||
| #define AR934X_RESET_UART1		BIT(17) | ||||
| #define AR934X_RESET_DDR		BIT(16) | ||||
| #define AR934X_RESET_USB_PHY_PLL_PWD_EXT BIT(15) | ||||
| #define AR934X_RESET_NANDF		BIT(14) | ||||
| #define AR934X_RESET_GE1_MAC		BIT(13) | ||||
| #define AR934X_RESET_ETH_SWITCH_ANALOG	BIT(12) | ||||
| #define AR934X_RESET_USB_PHY_ANALOG	BIT(11) | ||||
| #define AR934X_RESET_HOST_DMA_INT	BIT(10) | ||||
| #define AR934X_RESET_GE0_MAC		BIT(9) | ||||
| #define AR934X_RESET_ETH_SWITCH		BIT(8) | ||||
| #define AR934X_RESET_PCIE_PHY		BIT(7) | ||||
| #define AR934X_RESET_PCIE		BIT(6) | ||||
| #define AR934X_RESET_USB_HOST		BIT(5) | ||||
| #define AR934X_RESET_USB_PHY		BIT(4) | ||||
| #define AR934X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
| #define AR934X_RESET_LUT		BIT(2) | ||||
| #define AR934X_RESET_MBOX		BIT(1) | ||||
| #define AR934X_RESET_I2S		BIT(0) | ||||
|  | ||||
| #define AR933X_BOOTSTRAP_MDIO_GPIO_EN	BIT(18) | ||||
| #define AR933X_BOOTSTRAP_EEPBUSY	BIT(4) | ||||
| #define AR933X_BOOTSTRAP_REF_CLK_40	BIT(0) | ||||
|  | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION8	BIT(23) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION7	BIT(22) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION6	BIT(21) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION5	BIT(20) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION4	BIT(19) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION3	BIT(18) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION2	BIT(17) | ||||
| #define AR934X_BOOTSTRAP_SW_OPTION1	BIT(16) | ||||
| #define AR934X_BOOTSTRAP_USB_MODE_DEVICE BIT(7) | ||||
| #define AR934X_BOOTSTRAP_PCIE_RC	BIT(6) | ||||
| #define AR934X_BOOTSTRAP_EJTAG_MODE	BIT(5) | ||||
| #define AR934X_BOOTSTRAP_REF_CLK_40	BIT(4) | ||||
| #define AR934X_BOOTSTRAP_BOOT_FROM_SPI	BIT(2) | ||||
| #define AR934X_BOOTSTRAP_SDRAM_DISABLED	BIT(1) | ||||
| #define AR934X_BOOTSTRAP_DDR1		BIT(0) | ||||
|  | ||||
| #define QCA955X_BOOTSTRAP_REF_CLK_40	BIT(4) | ||||
|  | ||||
| #define AR934X_PCIE_WMAC_INT_WMAC_MISC		BIT(0) | ||||
| #define AR934X_PCIE_WMAC_INT_WMAC_TX		BIT(1) | ||||
| #define AR934X_PCIE_WMAC_INT_WMAC_RXLP		BIT(2) | ||||
| #define AR934X_PCIE_WMAC_INT_WMAC_RXHP		BIT(3) | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_RC		BIT(4) | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_RC0		BIT(5) | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_RC1		BIT(6) | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_RC2		BIT(7) | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_RC3		BIT(8) | ||||
| #define AR934X_PCIE_WMAC_INT_WMAC_ALL \ | ||||
| 	(AR934X_PCIE_WMAC_INT_WMAC_MISC | AR934X_PCIE_WMAC_INT_WMAC_TX | \ | ||||
| 	 AR934X_PCIE_WMAC_INT_WMAC_RXLP | AR934X_PCIE_WMAC_INT_WMAC_RXHP) | ||||
|  | ||||
| #define AR934X_PCIE_WMAC_INT_PCIE_ALL \ | ||||
| 	(AR934X_PCIE_WMAC_INT_PCIE_RC | AR934X_PCIE_WMAC_INT_PCIE_RC0 | \ | ||||
| 	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \ | ||||
| 	 AR934X_PCIE_WMAC_INT_PCIE_RC3) | ||||
|  | ||||
| #define QCA955X_EXT_INT_WMAC_MISC		BIT(0) | ||||
| #define QCA955X_EXT_INT_WMAC_TX			BIT(1) | ||||
| #define QCA955X_EXT_INT_WMAC_RXLP		BIT(2) | ||||
| #define QCA955X_EXT_INT_WMAC_RXHP		BIT(3) | ||||
| #define QCA955X_EXT_INT_PCIE_RC1		BIT(4) | ||||
| #define QCA955X_EXT_INT_PCIE_RC1_INT0		BIT(5) | ||||
| #define QCA955X_EXT_INT_PCIE_RC1_INT1		BIT(6) | ||||
| #define QCA955X_EXT_INT_PCIE_RC1_INT2		BIT(7) | ||||
| #define QCA955X_EXT_INT_PCIE_RC1_INT3		BIT(8) | ||||
| #define QCA955X_EXT_INT_PCIE_RC2		BIT(12) | ||||
| #define QCA955X_EXT_INT_PCIE_RC2_INT0		BIT(13) | ||||
| #define QCA955X_EXT_INT_PCIE_RC2_INT1		BIT(14) | ||||
| #define QCA955X_EXT_INT_PCIE_RC2_INT2		BIT(15) | ||||
| #define QCA955X_EXT_INT_PCIE_RC2_INT3		BIT(16) | ||||
| #define QCA955X_EXT_INT_USB1			BIT(24) | ||||
| #define QCA955X_EXT_INT_USB2			BIT(28) | ||||
|  | ||||
| #define QCA955X_EXT_INT_WMAC_ALL \ | ||||
| 	(QCA955X_EXT_INT_WMAC_MISC | QCA955X_EXT_INT_WMAC_TX | \ | ||||
| 	 QCA955X_EXT_INT_WMAC_RXLP | QCA955X_EXT_INT_WMAC_RXHP) | ||||
|  | ||||
| #define QCA955X_EXT_INT_PCIE_RC1_ALL \ | ||||
| 	(QCA955X_EXT_INT_PCIE_RC1 | QCA955X_EXT_INT_PCIE_RC1_INT0 | \ | ||||
| 	 QCA955X_EXT_INT_PCIE_RC1_INT1 | QCA955X_EXT_INT_PCIE_RC1_INT2 | \ | ||||
| 	 QCA955X_EXT_INT_PCIE_RC1_INT3) | ||||
|  | ||||
| #define QCA955X_EXT_INT_PCIE_RC2_ALL \ | ||||
| 	(QCA955X_EXT_INT_PCIE_RC2 | QCA955X_EXT_INT_PCIE_RC2_INT0 | \ | ||||
| 	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \ | ||||
| 	 QCA955X_EXT_INT_PCIE_RC2_INT3) | ||||
|  | ||||
| #define REV_ID_MAJOR_MASK		0xfff0 | ||||
| #define REV_ID_MAJOR_AR71XX		0x00a0 | ||||
| #define REV_ID_MAJOR_AR913X		0x00b0 | ||||
| #define REV_ID_MAJOR_AR7240		0x00c0 | ||||
| #define REV_ID_MAJOR_AR7241		0x0100 | ||||
| #define REV_ID_MAJOR_AR7242		0x1100 | ||||
| #define REV_ID_MAJOR_AR9330		0x0110 | ||||
| #define REV_ID_MAJOR_AR9331		0x1110 | ||||
| #define REV_ID_MAJOR_AR9341		0x0120 | ||||
| #define REV_ID_MAJOR_AR9342		0x1120 | ||||
| #define REV_ID_MAJOR_AR9344		0x2120 | ||||
| #define REV_ID_MAJOR_QCA9558		0x1130 | ||||
|  | ||||
| #define AR71XX_REV_ID_MINOR_MASK	0x3 | ||||
| #define AR71XX_REV_ID_MINOR_AR7130	0x0 | ||||
| #define AR71XX_REV_ID_MINOR_AR7141	0x1 | ||||
| #define AR71XX_REV_ID_MINOR_AR7161	0x2 | ||||
| #define AR71XX_REV_ID_REVISION_MASK	0x3 | ||||
| #define AR71XX_REV_ID_REVISION_SHIFT	2 | ||||
|  | ||||
| #define AR913X_REV_ID_MINOR_MASK	0x3 | ||||
| #define AR913X_REV_ID_MINOR_AR9130	0x0 | ||||
| #define AR913X_REV_ID_MINOR_AR9132	0x1 | ||||
| #define AR913X_REV_ID_REVISION_MASK	0x3 | ||||
| #define AR913X_REV_ID_REVISION_SHIFT	2 | ||||
|  | ||||
| #define AR933X_REV_ID_REVISION_MASK	0x3 | ||||
|  | ||||
| #define AR724X_REV_ID_REVISION_MASK	0x3 | ||||
|  | ||||
| #define AR934X_REV_ID_REVISION_MASK     0xf | ||||
|  | ||||
| #define AR944X_REV_ID_REVISION_MASK	0xf | ||||
|  | ||||
| /* | ||||
|  * SPI block | ||||
|  */ | ||||
| #define AR71XX_SPI_REG_FS	0x00	/* Function Select */ | ||||
| #define AR71XX_SPI_REG_CTRL	0x04	/* SPI Control */ | ||||
| #define AR71XX_SPI_REG_IOC	0x08	/* SPI I/O Control */ | ||||
| #define AR71XX_SPI_REG_RDS	0x0c	/* Read Data Shift */ | ||||
|  | ||||
| #define AR71XX_SPI_FS_GPIO	BIT(0)	/* Enable GPIO mode */ | ||||
|  | ||||
| #define AR71XX_SPI_CTRL_RD	BIT(6)	/* Remap Disable */ | ||||
| #define AR71XX_SPI_CTRL_DIV_MASK 0x3f | ||||
|  | ||||
| #define AR71XX_SPI_IOC_DO	BIT(0)	/* Data Out pin */ | ||||
| #define AR71XX_SPI_IOC_CLK	BIT(8)	/* CLK pin */ | ||||
| #define AR71XX_SPI_IOC_CS(n)	BIT(16 + (n)) | ||||
| #define AR71XX_SPI_IOC_CS0	AR71XX_SPI_IOC_CS(0) | ||||
| #define AR71XX_SPI_IOC_CS1	AR71XX_SPI_IOC_CS(1) | ||||
| #define AR71XX_SPI_IOC_CS2	AR71XX_SPI_IOC_CS(2) | ||||
| #define AR71XX_SPI_IOC_CS_ALL	(AR71XX_SPI_IOC_CS0 | AR71XX_SPI_IOC_CS1 | \ | ||||
| 				 AR71XX_SPI_IOC_CS2) | ||||
|  | ||||
| /* | ||||
|  * GPIO block | ||||
|  */ | ||||
| #define AR71XX_GPIO_REG_OE		0x00 | ||||
| #define AR71XX_GPIO_REG_IN		0x04 | ||||
| #define AR71XX_GPIO_REG_OUT		0x08 | ||||
| #define AR71XX_GPIO_REG_SET		0x0c | ||||
| #define AR71XX_GPIO_REG_CLEAR		0x10 | ||||
| #define AR71XX_GPIO_REG_INT_MODE	0x14 | ||||
| #define AR71XX_GPIO_REG_INT_TYPE	0x18 | ||||
| #define AR71XX_GPIO_REG_INT_POLARITY	0x1c | ||||
| #define AR71XX_GPIO_REG_INT_PENDING	0x20 | ||||
| #define AR71XX_GPIO_REG_INT_ENABLE	0x24 | ||||
| #define AR71XX_GPIO_REG_FUNC		0x28 | ||||
|  | ||||
| #define AR934X_GPIO_REG_OUT_FUNC0	0x2c | ||||
| #define AR934X_GPIO_REG_OUT_FUNC1	0x30 | ||||
| #define AR934X_GPIO_REG_OUT_FUNC2	0x34 | ||||
| #define AR934X_GPIO_REG_OUT_FUNC3	0x38 | ||||
| #define AR934X_GPIO_REG_OUT_FUNC4	0x3c | ||||
| #define AR934X_GPIO_REG_OUT_FUNC5	0x40 | ||||
| #define AR934X_GPIO_REG_FUNC		0x6c | ||||
|  | ||||
| #define AR71XX_GPIO_COUNT		16 | ||||
| #define AR724X_GPIO_COUNT		18 | ||||
| #define AR913X_GPIO_COUNT		22 | ||||
| #define AR933X_GPIO_COUNT		30 | ||||
| #define AR934X_GPIO_COUNT		23 | ||||
| #define QCA955X_GPIO_COUNT		24 | ||||
|  | ||||
| #define AR71XX_GPIO_FUNC_STEREO_EN		BIT(17) | ||||
| #define AR71XX_GPIO_FUNC_SLIC_EN		BIT(16) | ||||
| #define AR71XX_GPIO_FUNC_SPI_CS2_EN		BIT(13) | ||||
| #define AR71XX_GPIO_FUNC_SPI_CS1_EN		BIT(12) | ||||
| #define AR71XX_GPIO_FUNC_UART_EN		BIT(8) | ||||
| #define AR71XX_GPIO_FUNC_USB_OC_EN		BIT(4) | ||||
| #define AR71XX_GPIO_FUNC_USB_CLK_EN		BIT(0) | ||||
|  | ||||
| #define AR724X_GPIO_FUNC_GE0_MII_CLK_EN		BIT(19) | ||||
| #define AR724X_GPIO_FUNC_SPI_EN			BIT(18) | ||||
| #define AR724X_GPIO_FUNC_SPI_CS_EN2		BIT(14) | ||||
| #define AR724X_GPIO_FUNC_SPI_CS_EN1		BIT(13) | ||||
| #define AR724X_GPIO_FUNC_CLK_OBS5_EN		BIT(12) | ||||
| #define AR724X_GPIO_FUNC_CLK_OBS4_EN		BIT(11) | ||||
| #define AR724X_GPIO_FUNC_CLK_OBS3_EN		BIT(10) | ||||
| #define AR724X_GPIO_FUNC_CLK_OBS2_EN		BIT(9) | ||||
| #define AR724X_GPIO_FUNC_CLK_OBS1_EN		BIT(8) | ||||
| #define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN	BIT(7) | ||||
| #define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN	BIT(6) | ||||
| #define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN	BIT(5) | ||||
| #define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN	BIT(4) | ||||
| #define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN	BIT(3) | ||||
| #define AR724X_GPIO_FUNC_UART_RTS_CTS_EN	BIT(2) | ||||
| #define AR724X_GPIO_FUNC_UART_EN		BIT(1) | ||||
| #define AR724X_GPIO_FUNC_JTAG_DISABLE		BIT(0) | ||||
|  | ||||
| #define AR913X_GPIO_FUNC_WMAC_LED_EN		BIT(22) | ||||
| #define AR913X_GPIO_FUNC_EXP_PORT_CS_EN		BIT(21) | ||||
| #define AR913X_GPIO_FUNC_I2S_REFCLKEN		BIT(20) | ||||
| #define AR913X_GPIO_FUNC_I2S_MCKEN		BIT(19) | ||||
| #define AR913X_GPIO_FUNC_I2S1_EN		BIT(18) | ||||
| #define AR913X_GPIO_FUNC_I2S0_EN		BIT(17) | ||||
| #define AR913X_GPIO_FUNC_SLIC_EN		BIT(16) | ||||
| #define AR913X_GPIO_FUNC_UART_RTSCTS_EN		BIT(9) | ||||
| #define AR913X_GPIO_FUNC_UART_EN		BIT(8) | ||||
| #define AR913X_GPIO_FUNC_USB_CLK_EN		BIT(4) | ||||
|  | ||||
| #define AR933X_GPIO_FUNC_SPDIF2TCK		BIT(31) | ||||
| #define AR933X_GPIO_FUNC_SPDIF_EN		BIT(30) | ||||
| #define AR933X_GPIO_FUNC_I2SO_22_18_EN		BIT(29) | ||||
| #define AR933X_GPIO_FUNC_I2S_MCK_EN		BIT(27) | ||||
| #define AR933X_GPIO_FUNC_I2SO_EN		BIT(26) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED_DUPL	BIT(25) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED_COLL	BIT(24) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED_ACT	BIT(23) | ||||
| #define AR933X_GPIO_FUNC_SPI_EN			BIT(18) | ||||
| #define AR933X_GPIO_FUNC_SPI_CS_EN2		BIT(14) | ||||
| #define AR933X_GPIO_FUNC_SPI_CS_EN1		BIT(13) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN	BIT(7) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN	BIT(6) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN	BIT(5) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN	BIT(4) | ||||
| #define AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN	BIT(3) | ||||
| #define AR933X_GPIO_FUNC_UART_RTS_CTS_EN	BIT(2) | ||||
| #define AR933X_GPIO_FUNC_UART_EN		BIT(1) | ||||
| #define AR933X_GPIO_FUNC_JTAG_DISABLE		BIT(0) | ||||
|  | ||||
| #define AR934X_GPIO_FUNC_DDR_DQOE_EN	BIT(17) | ||||
| #define AR934X_GPIO_FUNC_SPI_CS_1_EN	BIT(14) | ||||
| #define AR934X_GPIO_FUNC_SPI_CS_0_EN	BIT(13) | ||||
|  | ||||
| #define AR934X_GPIO_OUT_GPIO		0x00 | ||||
|  | ||||
| /* | ||||
|  * MII_CTRL block | ||||
|  */ | ||||
| #define AR71XX_MII_REG_MII0_CTRL	0x00 | ||||
| #define AR71XX_MII_REG_MII1_CTRL	0x04 | ||||
|  | ||||
| #define AR71XX_MII_CTRL_IF_MASK		3 | ||||
| #define AR71XX_MII_CTRL_SPEED_SHIFT	4 | ||||
| #define AR71XX_MII_CTRL_SPEED_MASK	3 | ||||
| #define AR71XX_MII_CTRL_SPEED_10	0 | ||||
| #define AR71XX_MII_CTRL_SPEED_100	1 | ||||
| #define AR71XX_MII_CTRL_SPEED_1000	2 | ||||
|  | ||||
| #define AR71XX_MII0_CTRL_IF_GMII	0 | ||||
| #define AR71XX_MII0_CTRL_IF_MII		1 | ||||
| #define AR71XX_MII0_CTRL_IF_RGMII	2 | ||||
| #define AR71XX_MII0_CTRL_IF_RMII	3 | ||||
|  | ||||
| #define AR71XX_MII1_CTRL_IF_RGMII	0 | ||||
| #define AR71XX_MII1_CTRL_IF_RMII	1 | ||||
|  | ||||
| /* | ||||
|  * AR933X GMAC interface | ||||
|  */ | ||||
| #define AR933X_GMAC_REG_ETH_CFG		0x00 | ||||
|  | ||||
| #define AR933X_ETH_CFG_RGMII_GE0	BIT(0) | ||||
| #define AR933X_ETH_CFG_MII_GE0		BIT(1) | ||||
| #define AR933X_ETH_CFG_GMII_GE0		BIT(2) | ||||
| #define AR933X_ETH_CFG_MII_GE0_MASTER	BIT(3) | ||||
| #define AR933X_ETH_CFG_MII_GE0_SLAVE	BIT(4) | ||||
| #define AR933X_ETH_CFG_MII_GE0_ERR_EN	BIT(5) | ||||
| #define AR933X_ETH_CFG_SW_PHY_SWAP	BIT(7) | ||||
| #define AR933X_ETH_CFG_SW_PHY_ADDR_SWAP	BIT(8) | ||||
| #define AR933X_ETH_CFG_RMII_GE0		BIT(9) | ||||
| #define AR933X_ETH_CFG_RMII_GE0_SPD_10	0 | ||||
| #define AR933X_ETH_CFG_RMII_GE0_SPD_100	BIT(10) | ||||
|  | ||||
| /* | ||||
|  * AR934X GMAC Interface | ||||
|  */ | ||||
| #define AR934X_GMAC_REG_ETH_CFG		0x00 | ||||
|  | ||||
| #define AR934X_ETH_CFG_RGMII_GMAC0	BIT(0) | ||||
| #define AR934X_ETH_CFG_MII_GMAC0	BIT(1) | ||||
| #define AR934X_ETH_CFG_GMII_GMAC0	BIT(2) | ||||
| #define AR934X_ETH_CFG_MII_GMAC0_MASTER	BIT(3) | ||||
| #define AR934X_ETH_CFG_MII_GMAC0_SLAVE	BIT(4) | ||||
| #define AR934X_ETH_CFG_MII_GMAC0_ERR_EN	BIT(5) | ||||
| #define AR934X_ETH_CFG_SW_ONLY_MODE	BIT(6) | ||||
| #define AR934X_ETH_CFG_SW_PHY_SWAP	BIT(7) | ||||
| #define AR934X_ETH_CFG_SW_APB_ACCESS	BIT(9) | ||||
| #define AR934X_ETH_CFG_RMII_GMAC0	BIT(10) | ||||
| #define AR933X_ETH_CFG_MII_CNTL_SPEED	BIT(11) | ||||
| #define AR934X_ETH_CFG_RMII_GMAC0_MASTER BIT(12) | ||||
| #define AR933X_ETH_CFG_SW_ACC_MSB_FIRST	BIT(13) | ||||
|  | ||||
| /* | ||||
|  * QCA955X GMAC Interface | ||||
|  */ | ||||
|  | ||||
| #define QCA955X_GMAC_REG_ETH_CFG	0x00 | ||||
|  | ||||
| #define QCA955X_ETH_CFG_RGMII_GMAC0	BIT(0) | ||||
| #define QCA955X_ETH_CFG_SGMII_GMAC0	BIT(6) | ||||
|  | ||||
| #endif /* __ASM_MACH_AR71XX_REGS_H */ | ||||
							
								
								
									
										56
									
								
								target/linux/ath79/image/lzma-loader/src/board.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								target/linux/ath79/image/lzma-loader/src/board.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include "config.h" | ||||
| #include "ar71xx_regs.h" | ||||
|  | ||||
| #define READREG(r)	*(volatile unsigned int *)(r) | ||||
| #define WRITEREG(r,v)	*(volatile unsigned int *)(r) = v | ||||
|  | ||||
| #define KSEG1ADDR(_x)	(((_x) & 0x1fffffff) | 0xa0000000) | ||||
|  | ||||
| #define UART_BASE	0xb8020000 | ||||
|  | ||||
| #define UART_TX		0 | ||||
| #define UART_LSR	5 | ||||
|  | ||||
| #define UART_LSR_THRE   0x20 | ||||
|  | ||||
| #define UART_READ(r)		READREG(UART_BASE + 4 * (r)) | ||||
| #define UART_WRITE(r,v)		WRITEREG(UART_BASE + 4 * (r), (v)) | ||||
|  | ||||
| void board_putc(int ch) | ||||
| { | ||||
| 	while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0); | ||||
| 	UART_WRITE(UART_TX, ch); | ||||
| 	while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0); | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_BOARD_TL_WR1043ND_V1 | ||||
| static void tlwr1043nd_init(void) | ||||
| { | ||||
| 	unsigned int reg = KSEG1ADDR(AR71XX_RESET_BASE); | ||||
| 	unsigned int t; | ||||
|  | ||||
| 	t = READREG(reg + AR913X_RESET_REG_RESET_MODULE); | ||||
| 	t |= AR71XX_RESET_GE0_PHY; | ||||
| 	WRITEREG(reg + AR913X_RESET_REG_RESET_MODULE, t); | ||||
| 	/* flush write */ | ||||
| 	t = READREG(reg + AR913X_RESET_REG_RESET_MODULE); | ||||
| } | ||||
| #else | ||||
| static inline void tlwr1043nd_init(void) {} | ||||
| #endif | ||||
|  | ||||
| void board_init(void) | ||||
| { | ||||
| 	tlwr1043nd_init(); | ||||
| } | ||||
							
								
								
									
										43
									
								
								target/linux/ath79/image/lzma-loader/src/cache.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								target/linux/ath79/image/lzma-loader/src/cache.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * The cache manipulation routine has been taken from the U-Boot project. | ||||
|  *	(C) Copyright 2003 | ||||
|  *	Wolfgang Denk, DENX Software Engineering, <wd@denx.de> | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "cache.h" | ||||
| #include "cacheops.h" | ||||
| #include "config.h" | ||||
|  | ||||
| #define cache_op(op,addr)						\ | ||||
| 	__asm__ __volatile__(						\ | ||||
| 	"	.set	push					\n"	\ | ||||
| 	"	.set	noreorder				\n"	\ | ||||
| 	"	.set	mips3\n\t				\n"	\ | ||||
| 	"	cache	%0, %1					\n"	\ | ||||
| 	"	.set	pop					\n"	\ | ||||
| 	:								\ | ||||
| 	: "i" (op), "R" (*(unsigned char *)(addr))) | ||||
|  | ||||
| void flush_cache(unsigned long start_addr, unsigned long size) | ||||
| { | ||||
| 	unsigned long lsize = CONFIG_CACHELINE_SIZE; | ||||
| 	unsigned long addr = start_addr & ~(lsize - 1); | ||||
| 	unsigned long aend = (start_addr + size - 1) & ~(lsize - 1); | ||||
|  | ||||
| 	while (1) { | ||||
| 		cache_op(Hit_Writeback_Inv_D, addr); | ||||
| 		cache_op(Hit_Invalidate_I, addr); | ||||
| 		if (addr == aend) | ||||
| 			break; | ||||
| 		addr += lsize; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								target/linux/ath79/image/lzma-loader/src/cache.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								target/linux/ath79/image/lzma-loader/src/cache.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef __CACHE_H | ||||
| #define __CACHE_H | ||||
|  | ||||
| void flush_cache(unsigned long start_addr, unsigned long size); | ||||
|  | ||||
| #endif /* __CACHE_H */ | ||||
							
								
								
									
										85
									
								
								target/linux/ath79/image/lzma-loader/src/cacheops.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								target/linux/ath79/image/lzma-loader/src/cacheops.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| /* | ||||
|  * Cache operations for the cache instruction. | ||||
|  * | ||||
|  * This file is subject to the terms and conditions of the GNU General Public | ||||
|  * License.  See the file "COPYING" in the main directory of this archive | ||||
|  * for more details. | ||||
|  * | ||||
|  * (C) Copyright 1996, 97, 99, 2002, 03 Ralf Baechle | ||||
|  * (C) Copyright 1999 Silicon Graphics, Inc. | ||||
|  */ | ||||
| #ifndef	__ASM_CACHEOPS_H | ||||
| #define	__ASM_CACHEOPS_H | ||||
|  | ||||
| /* | ||||
|  * Cache Operations available on all MIPS processors with R4000-style caches | ||||
|  */ | ||||
| #define Index_Invalidate_I      0x00 | ||||
| #define Index_Writeback_Inv_D   0x01 | ||||
| #define Index_Load_Tag_I	0x04 | ||||
| #define Index_Load_Tag_D	0x05 | ||||
| #define Index_Store_Tag_I	0x08 | ||||
| #define Index_Store_Tag_D	0x09 | ||||
| #if defined(CONFIG_CPU_LOONGSON2) | ||||
| #define Hit_Invalidate_I	0x00 | ||||
| #else | ||||
| #define Hit_Invalidate_I	0x10 | ||||
| #endif | ||||
| #define Hit_Invalidate_D	0x11 | ||||
| #define Hit_Writeback_Inv_D	0x15 | ||||
|  | ||||
| /* | ||||
|  * R4000-specific cacheops | ||||
|  */ | ||||
| #define Create_Dirty_Excl_D	0x0d | ||||
| #define Fill			0x14 | ||||
| #define Hit_Writeback_I		0x18 | ||||
| #define Hit_Writeback_D		0x19 | ||||
|  | ||||
| /* | ||||
|  * R4000SC and R4400SC-specific cacheops | ||||
|  */ | ||||
| #define Index_Invalidate_SI     0x02 | ||||
| #define Index_Writeback_Inv_SD  0x03 | ||||
| #define Index_Load_Tag_SI	0x06 | ||||
| #define Index_Load_Tag_SD	0x07 | ||||
| #define Index_Store_Tag_SI	0x0A | ||||
| #define Index_Store_Tag_SD	0x0B | ||||
| #define Create_Dirty_Excl_SD	0x0f | ||||
| #define Hit_Invalidate_SI	0x12 | ||||
| #define Hit_Invalidate_SD	0x13 | ||||
| #define Hit_Writeback_Inv_SD	0x17 | ||||
| #define Hit_Writeback_SD	0x1b | ||||
| #define Hit_Set_Virtual_SI	0x1e | ||||
| #define Hit_Set_Virtual_SD	0x1f | ||||
|  | ||||
| /* | ||||
|  * R5000-specific cacheops | ||||
|  */ | ||||
| #define R5K_Page_Invalidate_S	0x17 | ||||
|  | ||||
| /* | ||||
|  * RM7000-specific cacheops | ||||
|  */ | ||||
| #define Page_Invalidate_T	0x16 | ||||
|  | ||||
| /* | ||||
|  * R10000-specific cacheops | ||||
|  * | ||||
|  * Cacheops 0x02, 0x06, 0x0a, 0x0c-0x0e, 0x16, 0x1a and 0x1e are unused. | ||||
|  * Most of the _S cacheops are identical to the R4000SC _SD cacheops. | ||||
|  */ | ||||
| #define Index_Writeback_Inv_S	0x03 | ||||
| #define Index_Load_Tag_S	0x07 | ||||
| #define Index_Store_Tag_S	0x0B | ||||
| #define Hit_Invalidate_S	0x13 | ||||
| #define Cache_Barrier		0x14 | ||||
| #define Hit_Writeback_Inv_S	0x17 | ||||
| #define Index_Load_Data_I	0x18 | ||||
| #define Index_Load_Data_D	0x19 | ||||
| #define Index_Load_Data_S	0x1b | ||||
| #define Index_Store_Data_I	0x1c | ||||
| #define Index_Store_Data_D	0x1d | ||||
| #define Index_Store_Data_S	0x1f | ||||
|  | ||||
| #endif	/* __ASM_CACHEOPS_H */ | ||||
							
								
								
									
										31
									
								
								target/linux/ath79/image/lzma-loader/src/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								target/linux/ath79/image/lzma-loader/src/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef _CONFIG_H_ | ||||
| #define _CONFIG_H_ | ||||
|  | ||||
| #define CONFIG_ICACHE_SIZE	(32 * 1024) | ||||
| #define CONFIG_DCACHE_SIZE	(64 * 1024) | ||||
| #define CONFIG_CACHELINE_SIZE	32 | ||||
|  | ||||
| #ifndef CONFIG_FLASH_OFFS | ||||
| #define CONFIG_FLASH_OFFS	0 | ||||
| #endif | ||||
|  | ||||
| #ifndef CONFIG_FLASH_MAX | ||||
| #define CONFIG_FLASH_MAX	0 | ||||
| #endif | ||||
|  | ||||
| #ifndef CONFIG_FLASH_STEP | ||||
| #define CONFIG_FLASH_STEP	0x1000 | ||||
| #endif | ||||
|  | ||||
| #endif /* _CONFIG_H_ */ | ||||
							
								
								
									
										39
									
								
								target/linux/ath79/image/lzma-loader/src/cp0regdef.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								target/linux/ath79/image/lzma-loader/src/cp0regdef.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001 by Ralf Baechle | ||||
|  * | ||||
|  * Copyright (C) 2001, Monta Vista Software | ||||
|  * Author: jsun@mvista.com or jsun@junsun.net | ||||
|  */ | ||||
| #ifndef _cp0regdef_h_ | ||||
| #define _cp0regdef_h_ | ||||
|  | ||||
| #define CP0_INDEX $0 | ||||
| #define CP0_RANDOM $1 | ||||
| #define CP0_ENTRYLO0 $2 | ||||
| #define CP0_ENTRYLO1 $3 | ||||
| #define CP0_CONTEXT $4 | ||||
| #define CP0_PAGEMASK $5 | ||||
| #define CP0_WIRED $6 | ||||
| #define CP0_BADVADDR $8 | ||||
| #define CP0_COUNT $9 | ||||
| #define CP0_ENTRYHI $10 | ||||
| #define CP0_COMPARE $11 | ||||
| #define CP0_STATUS $12 | ||||
| #define CP0_CAUSE $13 | ||||
| #define CP0_EPC $14 | ||||
| #define CP0_PRID $15 | ||||
| #define CP0_CONFIG $16 | ||||
| #define CP0_LLADDR $17 | ||||
| #define CP0_WATCHLO $18 | ||||
| #define CP0_WATCHHI $19 | ||||
| #define CP0_XCONTEXT $20 | ||||
| #define CP0_FRAMEMASK $21 | ||||
| #define CP0_DIAGNOSTIC $22 | ||||
| #define CP0_PERFORMANCE $25 | ||||
| #define CP0_ECC $26 | ||||
| #define CP0_CACHEERR $27 | ||||
| #define CP0_TAGLO $28 | ||||
| #define CP0_TAGHI $29 | ||||
| #define CP0_ERROREPC $30 | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										121
									
								
								target/linux/ath79/image/lzma-loader/src/head.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								target/linux/ath79/image/lzma-loader/src/head.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * Some parts of this code was based on the OpenWrt specific lzma-loader | ||||
|  * for the BCM47xx and ADM5120 based boards: | ||||
|  *	Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) | ||||
|  *	Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #include <asm/asm.h> | ||||
| #include <asm/regdef.h> | ||||
| #include "cp0regdef.h" | ||||
| #include "cacheops.h" | ||||
| #include "config.h" | ||||
|  | ||||
| #define KSEG0		0x80000000 | ||||
|  | ||||
| 	.macro	ehb | ||||
| 	sll     zero, 3 | ||||
| 	.endm | ||||
|  | ||||
| 	.text | ||||
|  | ||||
| LEAF(startup) | ||||
| 	.set noreorder | ||||
| 	.set mips32 | ||||
|  | ||||
| 	mtc0	zero, CP0_WATCHLO	# clear watch registers | ||||
| 	mtc0	zero, CP0_WATCHHI | ||||
| 	mtc0	zero, CP0_CAUSE		# clear before writing status register | ||||
|  | ||||
| 	mfc0	t0, CP0_STATUS | ||||
| 	li	t1, 0x1000001f | ||||
| 	or	t0, t1 | ||||
| 	xori	t0, 0x1f | ||||
| 	mtc0	t0, CP0_STATUS | ||||
| 	ehb | ||||
|  | ||||
| 	mtc0	zero, CP0_COUNT | ||||
| 	mtc0	zero, CP0_COMPARE | ||||
| 	ehb | ||||
|  | ||||
| 	la	t0, __reloc_label	# get linked address of label | ||||
| 	bal	__reloc_label		# branch and link to label to | ||||
| 	nop				# get actual address | ||||
| __reloc_label: | ||||
| 	subu	t0, ra, t0		# get reloc_delta | ||||
|  | ||||
| 	beqz	t0, __reloc_done         # if delta is 0 we are in the right place | ||||
| 	nop | ||||
|  | ||||
| 	/* Copy our code to the right place */ | ||||
| 	la	t1, _code_start		# get linked address of _code_start | ||||
| 	la	t2, _code_end		# get linked address of _code_end | ||||
| 	addu	t0, t0, t1		# calculate actual address of _code_start | ||||
|  | ||||
| __reloc_copy: | ||||
| 	lw	t3, 0(t0) | ||||
| 	sw	t3, 0(t1) | ||||
| 	add	t1, 4 | ||||
| 	blt	t1, t2, __reloc_copy | ||||
| 	add	t0, 4 | ||||
|  | ||||
| 	/* flush cache */ | ||||
| 	la	t0, _code_start | ||||
| 	la	t1, _code_end | ||||
|  | ||||
| 	li	t2, ~(CONFIG_CACHELINE_SIZE - 1) | ||||
| 	and	t0, t2 | ||||
| 	and	t1, t2 | ||||
| 	li	t2, CONFIG_CACHELINE_SIZE | ||||
|  | ||||
| 	b	__flush_check | ||||
| 	nop | ||||
|  | ||||
| __flush_line: | ||||
| 	cache	Hit_Writeback_Inv_D, 0(t0) | ||||
| 	cache	Hit_Invalidate_I, 0(t0) | ||||
| 	add	t0, t2 | ||||
|  | ||||
| __flush_check: | ||||
| 	bne	t0, t1, __flush_line | ||||
| 	nop | ||||
|  | ||||
| 	sync | ||||
|  | ||||
| __reloc_done: | ||||
|  | ||||
| 	/* clear bss */ | ||||
| 	la	t0, _bss_start | ||||
| 	la	t1, _bss_end | ||||
| 	b	__bss_check | ||||
| 	nop | ||||
|  | ||||
| __bss_fill: | ||||
| 	sw	zero, 0(t0) | ||||
| 	addi	t0, 4 | ||||
|  | ||||
| __bss_check: | ||||
| 	bne	t0, t1, __bss_fill | ||||
| 	nop | ||||
|  | ||||
| 	/* Setup new "C" stack */ | ||||
| 	la	sp, _stack | ||||
|  | ||||
| 	/* reserve stack space for a0-a3 registers */ | ||||
| 	subu	sp, 16 | ||||
|  | ||||
| 	/* jump to the decompressor routine */ | ||||
| 	la	t0, loader_main | ||||
| 	jr	t0 | ||||
| 	nop | ||||
|  | ||||
| 	.set reorder | ||||
| END(startup) | ||||
							
								
								
									
										264
									
								
								target/linux/ath79/image/lzma-loader/src/loader.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								target/linux/ath79/image/lzma-loader/src/loader.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,264 @@ | ||||
| /* | ||||
|  * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards | ||||
|  * | ||||
|  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
|  * | ||||
|  * Some parts of this code was based on the OpenWrt specific lzma-loader | ||||
|  * for the BCM47xx and ADM5120 based boards: | ||||
|  *	Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) | ||||
|  *	Copyright (C) 2005 Mineharu Takahara <mtakahar@yahoo.com> | ||||
|  *	Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> | ||||
|  * | ||||
|  * The image_header structure has been taken from the U-Boot project. | ||||
|  *	(C) Copyright 2008 Semihalf | ||||
|  *	(C) Copyright 2000-2005 | ||||
|  *	Wolfgang Denk, DENX Software Engineering, wd@denx.de. | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "config.h" | ||||
| #include "cache.h" | ||||
| #include "printf.h" | ||||
| #include "LzmaDecode.h" | ||||
|  | ||||
| #define AR71XX_FLASH_START	0x1f000000 | ||||
| #define AR71XX_FLASH_END	0x1fe00000 | ||||
|  | ||||
| #define KSEG0			0x80000000 | ||||
| #define KSEG1			0xa0000000 | ||||
|  | ||||
| #define KSEG1ADDR(a)		((((unsigned)(a)) & 0x1fffffffU) | KSEG1) | ||||
|  | ||||
| #undef LZMA_DEBUG | ||||
|  | ||||
| #ifdef LZMA_DEBUG | ||||
| #  define DBG(f, a...)	printf(f, ## a) | ||||
| #else | ||||
| #  define DBG(f, a...)	do {} while (0) | ||||
| #endif | ||||
|  | ||||
| #define IH_MAGIC_OKLI		0x4f4b4c49	/* 'OKLI' */ | ||||
|  | ||||
| #define IH_NMLEN		32	/* Image Name Length		*/ | ||||
|  | ||||
| typedef struct image_header { | ||||
| 	uint32_t	ih_magic;	/* Image Header Magic Number	*/ | ||||
| 	uint32_t	ih_hcrc;	/* Image Header CRC Checksum	*/ | ||||
| 	uint32_t	ih_time;	/* Image Creation Timestamp	*/ | ||||
| 	uint32_t	ih_size;	/* Image Data Size		*/ | ||||
| 	uint32_t	ih_load;	/* Data	 Load  Address		*/ | ||||
| 	uint32_t	ih_ep;		/* Entry Point Address		*/ | ||||
| 	uint32_t	ih_dcrc;	/* Image Data CRC Checksum	*/ | ||||
| 	uint8_t		ih_os;		/* Operating System		*/ | ||||
| 	uint8_t		ih_arch;	/* CPU architecture		*/ | ||||
| 	uint8_t		ih_type;	/* Image Type			*/ | ||||
| 	uint8_t		ih_comp;	/* Compression Type		*/ | ||||
| 	uint8_t		ih_name[IH_NMLEN];	/* Image Name		*/ | ||||
| } image_header_t; | ||||
|  | ||||
| /* beyond the image end, size not known in advance */ | ||||
| extern unsigned char workspace[]; | ||||
| extern void board_init(void); | ||||
|  | ||||
| static CLzmaDecoderState lzma_state; | ||||
| static unsigned char *lzma_data; | ||||
| static unsigned long lzma_datasize; | ||||
| static unsigned long lzma_outsize; | ||||
| static unsigned long kernel_la; | ||||
|  | ||||
| #ifdef CONFIG_KERNEL_CMDLINE | ||||
| #define kernel_argc	2 | ||||
| static const char kernel_cmdline[] = CONFIG_KERNEL_CMDLINE; | ||||
| static const char *kernel_argv[] = { | ||||
| 	NULL, | ||||
| 	kernel_cmdline, | ||||
| 	NULL, | ||||
| }; | ||||
| #endif /* CONFIG_KERNEL_CMDLINE */ | ||||
|  | ||||
| static void halt(void) | ||||
| { | ||||
| 	printf("\nSystem halted!\n"); | ||||
| 	for(;;); | ||||
| } | ||||
|  | ||||
| static __inline__ unsigned long get_be32(void *buf) | ||||
| { | ||||
| 	unsigned char *p = buf; | ||||
|  | ||||
| 	return (((unsigned long) p[0] << 24) + | ||||
| 	        ((unsigned long) p[1] << 16) + | ||||
| 	        ((unsigned long) p[2] << 8) + | ||||
| 	        (unsigned long) p[3]); | ||||
| } | ||||
|  | ||||
| static __inline__ unsigned char lzma_get_byte(void) | ||||
| { | ||||
| 	unsigned char c; | ||||
|  | ||||
| 	lzma_datasize--; | ||||
| 	c = *lzma_data++; | ||||
|  | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
| static int lzma_init_props(void) | ||||
| { | ||||
| 	unsigned char props[LZMA_PROPERTIES_SIZE]; | ||||
| 	int res; | ||||
| 	int i; | ||||
|  | ||||
| 	/* read lzma properties */ | ||||
| 	for (i = 0; i < LZMA_PROPERTIES_SIZE; i++) | ||||
| 		props[i] = lzma_get_byte(); | ||||
|  | ||||
| 	/* read the lower half of uncompressed size in the header */ | ||||
| 	lzma_outsize = ((SizeT) lzma_get_byte()) + | ||||
| 		       ((SizeT) lzma_get_byte() << 8) + | ||||
| 		       ((SizeT) lzma_get_byte() << 16) + | ||||
| 		       ((SizeT) lzma_get_byte() << 24); | ||||
|  | ||||
| 	/* skip rest of the header (upper half of uncompressed size) */ | ||||
| 	for (i = 0; i < 4; i++) | ||||
| 		lzma_get_byte(); | ||||
|  | ||||
| 	res = LzmaDecodeProperties(&lzma_state.Properties, props, | ||||
| 					LZMA_PROPERTIES_SIZE); | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| static int lzma_decompress(unsigned char *outStream) | ||||
| { | ||||
| 	SizeT ip, op; | ||||
| 	int ret; | ||||
|  | ||||
| 	lzma_state.Probs = (CProb *) workspace; | ||||
|  | ||||
| 	ret = LzmaDecode(&lzma_state, lzma_data, lzma_datasize, &ip, outStream, | ||||
| 			 lzma_outsize, &op); | ||||
|  | ||||
| 	if (ret != LZMA_RESULT_OK) { | ||||
| 		int i; | ||||
|  | ||||
| 		DBG("LzmaDecode error %d at %08x, osize:%d ip:%d op:%d\n", | ||||
| 		    ret, lzma_data + ip, lzma_outsize, ip, op); | ||||
|  | ||||
| 		for (i = 0; i < 16; i++) | ||||
| 			DBG("%02x ", lzma_data[ip + i]); | ||||
|  | ||||
| 		DBG("\n"); | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| #if (LZMA_WRAPPER) | ||||
| static void lzma_init_data(void) | ||||
| { | ||||
| 	extern unsigned char _lzma_data_start[]; | ||||
| 	extern unsigned char _lzma_data_end[]; | ||||
|  | ||||
| 	kernel_la = LOADADDR; | ||||
| 	lzma_data = _lzma_data_start; | ||||
| 	lzma_datasize = _lzma_data_end - _lzma_data_start; | ||||
| } | ||||
| #else | ||||
| static void lzma_init_data(void) | ||||
| { | ||||
| 	struct image_header *hdr = NULL; | ||||
| 	unsigned char *flash_base; | ||||
| 	unsigned long flash_ofs; | ||||
| 	unsigned long kernel_ofs; | ||||
| 	unsigned long kernel_size; | ||||
|  | ||||
| 	flash_base = (unsigned char *) KSEG1ADDR(AR71XX_FLASH_START); | ||||
|  | ||||
| 	printf("Looking for OpenWrt image... "); | ||||
|  | ||||
| 	for (flash_ofs = CONFIG_FLASH_OFFS; | ||||
| 	     flash_ofs <= (CONFIG_FLASH_OFFS + CONFIG_FLASH_MAX); | ||||
| 	     flash_ofs += CONFIG_FLASH_STEP) { | ||||
| 		unsigned long magic; | ||||
| 		unsigned char *p; | ||||
|  | ||||
| 		p = flash_base + flash_ofs; | ||||
| 		magic = get_be32(p); | ||||
| 		if (magic == IH_MAGIC_OKLI) { | ||||
| 			hdr = (struct image_header *) p; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (hdr == NULL) { | ||||
| 		printf("not found!\n"); | ||||
| 		halt(); | ||||
| 	} | ||||
|  | ||||
| 	printf("found at 0x%08x\n", flash_base + flash_ofs); | ||||
|  | ||||
| 	kernel_ofs = sizeof(struct image_header); | ||||
| 	kernel_size = get_be32(&hdr->ih_size); | ||||
| 	kernel_la = get_be32(&hdr->ih_load); | ||||
|  | ||||
| 	lzma_data = flash_base + flash_ofs + kernel_ofs; | ||||
| 	lzma_datasize = kernel_size; | ||||
| } | ||||
| #endif /* (LZMA_WRAPPER) */ | ||||
|  | ||||
| void loader_main(unsigned long reg_a0, unsigned long reg_a1, | ||||
| 		 unsigned long reg_a2, unsigned long reg_a3) | ||||
| { | ||||
| 	void (*kernel_entry) (unsigned long, unsigned long, unsigned long, | ||||
| 			      unsigned long); | ||||
| 	int res; | ||||
|  | ||||
| 	board_init(); | ||||
|  | ||||
| 	printf("\n\nOpenWrt kernel loader for AR7XXX/AR9XXX\n"); | ||||
| 	printf("Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>\n"); | ||||
|  | ||||
| 	lzma_init_data(); | ||||
|  | ||||
| 	res = lzma_init_props(); | ||||
| 	if (res != LZMA_RESULT_OK) { | ||||
| 		printf("Incorrect LZMA stream properties!\n"); | ||||
| 		halt(); | ||||
| 	} | ||||
|  | ||||
| 	printf("Decompressing kernel... "); | ||||
|  | ||||
| 	res = lzma_decompress((unsigned char *) kernel_la); | ||||
| 	if (res != LZMA_RESULT_OK) { | ||||
| 		printf("failed, "); | ||||
| 		switch (res) { | ||||
| 		case LZMA_RESULT_DATA_ERROR: | ||||
| 			printf("data error!\n"); | ||||
| 			break; | ||||
| 		default: | ||||
| 			printf("unknown error %d!\n", res); | ||||
| 		} | ||||
| 		halt(); | ||||
| 	} else { | ||||
| 		printf("done!\n"); | ||||
| 	} | ||||
|  | ||||
| 	flush_cache(kernel_la, lzma_outsize); | ||||
|  | ||||
| 	printf("Starting kernel at %08x...\n\n", kernel_la); | ||||
|  | ||||
| #ifdef CONFIG_KERNEL_CMDLINE | ||||
| 	reg_a0 = kernel_argc; | ||||
| 	reg_a1 = (unsigned long) kernel_argv; | ||||
| 	reg_a2 = 0; | ||||
| 	reg_a3 = 0; | ||||
| #endif | ||||
|  | ||||
| 	kernel_entry = (void *) kernel_la; | ||||
| 	kernel_entry(reg_a0, reg_a1, reg_a2, reg_a3); | ||||
| } | ||||
							
								
								
									
										35
									
								
								target/linux/ath79/image/lzma-loader/src/loader.lds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								target/linux/ath79/image/lzma-loader/src/loader.lds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| OUTPUT_ARCH(mips) | ||||
| SECTIONS { | ||||
| 	.text : { | ||||
| 		_code_start = .; | ||||
| 		*(.text) | ||||
| 		*(.text.*) | ||||
| 		*(.rodata) | ||||
| 		*(.rodata.*) | ||||
| 		*(.data.lzma) | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(32); | ||||
| 	.data : { | ||||
| 		*(.data) | ||||
| 		*(.data.*) | ||||
| 		. = . + 524288;		/* workaround for buggy bootloaders */ | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(32); | ||||
| 	_code_end = .; | ||||
|  | ||||
| 	_bss_start = .; | ||||
| 	.bss : { | ||||
| 		*(.bss) | ||||
| 		*(.bss.*) | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(32); | ||||
| 	_bss_end = .; | ||||
|  | ||||
| 	. = . + 8192; | ||||
| 	_stack = .; | ||||
|  | ||||
| 	workspace = .; | ||||
| } | ||||
							
								
								
									
										10
									
								
								target/linux/ath79/image/lzma-loader/src/loader2.lds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								target/linux/ath79/image/lzma-loader/src/loader2.lds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| OUTPUT_ARCH(mips) | ||||
| SECTIONS { | ||||
| 	.text : { | ||||
| 		startup = .; | ||||
| 		*(.text) | ||||
| 		*(.text.*) | ||||
| 		*(.data) | ||||
| 		*(.data.*) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										8
									
								
								target/linux/ath79/image/lzma-loader/src/lzma-data.lds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								target/linux/ath79/image/lzma-loader/src/lzma-data.lds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| OUTPUT_ARCH(mips) | ||||
| SECTIONS { | ||||
| 	.data.lzma : { | ||||
| 		_lzma_data_start = .; | ||||
| 		*(.data) | ||||
| 		_lzma_data_end = .; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										350
									
								
								target/linux/ath79/image/lzma-loader/src/printf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								target/linux/ath79/image/lzma-loader/src/printf.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,350 @@ | ||||
| /* | ||||
|  * Copyright (C) 2001 MontaVista Software Inc. | ||||
|  * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net | ||||
|  * | ||||
|  * 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;  either version 2 of the  License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include	"printf.h" | ||||
|  | ||||
| extern void board_putc(int ch); | ||||
|  | ||||
| /* this is the maximum width for a variable */ | ||||
| #define		LP_MAX_BUF	256 | ||||
|  | ||||
| /* macros */ | ||||
| #define		IsDigit(x)	( ((x) >= '0') && ((x) <= '9') ) | ||||
| #define		Ctod(x)		( (x) - '0') | ||||
|  | ||||
| /* forward declaration */ | ||||
| static int PrintChar(char *, char, int, int); | ||||
| static int PrintString(char *, char *, int, int); | ||||
| static int PrintNum(char *, unsigned long, int, int, int, int, char, int); | ||||
|  | ||||
| /* private variable */ | ||||
| static const char theFatalMsg[] = "fatal error in lp_Print!"; | ||||
|  | ||||
| /* -*- | ||||
|  * A low level printf() function. | ||||
|  */ | ||||
| static void | ||||
| lp_Print(void (*output)(void *, char *, int), | ||||
| 	 void * arg, | ||||
| 	 char *fmt, | ||||
| 	 va_list ap) | ||||
| { | ||||
|  | ||||
| #define 	OUTPUT(arg, s, l)  \ | ||||
|   { if (((l) < 0) || ((l) > LP_MAX_BUF)) { \ | ||||
|        (*output)(arg, (char*)theFatalMsg, sizeof(theFatalMsg)-1); for(;;); \ | ||||
|     } else { \ | ||||
|       (*output)(arg, s, l); \ | ||||
|     } \ | ||||
|   } | ||||
|  | ||||
|     char buf[LP_MAX_BUF]; | ||||
|  | ||||
|     char c; | ||||
|     char *s; | ||||
|     long int num; | ||||
|  | ||||
|     int longFlag; | ||||
|     int negFlag; | ||||
|     int width; | ||||
|     int prec; | ||||
|     int ladjust; | ||||
|     char padc; | ||||
|  | ||||
|     int length; | ||||
|  | ||||
|     for(;;) { | ||||
| 	{ | ||||
| 	    /* scan for the next '%' */ | ||||
| 	    char *fmtStart = fmt; | ||||
| 	    while ( (*fmt != '\0') && (*fmt != '%')) { | ||||
| 		fmt ++; | ||||
| 	    } | ||||
|  | ||||
| 	    /* flush the string found so far */ | ||||
| 	    OUTPUT(arg, fmtStart, fmt-fmtStart); | ||||
|  | ||||
| 	    /* are we hitting the end? */ | ||||
| 	    if (*fmt == '\0') break; | ||||
| 	} | ||||
|  | ||||
| 	/* we found a '%' */ | ||||
| 	fmt ++; | ||||
|  | ||||
| 	/* check for long */ | ||||
| 	if (*fmt == 'l') { | ||||
| 	    longFlag = 1; | ||||
| 	    fmt ++; | ||||
| 	} else { | ||||
| 	    longFlag = 0; | ||||
| 	} | ||||
|  | ||||
| 	/* check for other prefixes */ | ||||
| 	width = 0; | ||||
| 	prec = -1; | ||||
| 	ladjust = 0; | ||||
| 	padc = ' '; | ||||
|  | ||||
| 	if (*fmt == '-') { | ||||
| 	    ladjust = 1; | ||||
| 	    fmt ++; | ||||
| 	} | ||||
|  | ||||
| 	if (*fmt == '0') { | ||||
| 	    padc = '0'; | ||||
| 	    fmt++; | ||||
| 	} | ||||
|  | ||||
| 	if (IsDigit(*fmt)) { | ||||
| 	    while (IsDigit(*fmt)) { | ||||
| 		width = 10 * width + Ctod(*fmt++); | ||||
| 	    } | ||||
| 	} | ||||
|  | ||||
| 	if (*fmt == '.') { | ||||
| 	    fmt ++; | ||||
| 	    if (IsDigit(*fmt)) { | ||||
| 		prec = 0; | ||||
| 		while (IsDigit(*fmt)) { | ||||
| 		    prec = prec*10 + Ctod(*fmt++); | ||||
| 		} | ||||
| 	    } | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/* check format flag */ | ||||
| 	negFlag = 0; | ||||
| 	switch (*fmt) { | ||||
| 	 case 'b': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 2, 0, width, ladjust, padc, 0); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'd': | ||||
| 	 case 'D': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    if (num < 0) { | ||||
| 		num = - num; | ||||
| 		negFlag = 1; | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 10, negFlag, width, ladjust, padc, 0); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'o': | ||||
| 	 case 'O': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 8, 0, width, ladjust, padc, 0); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'u': | ||||
| 	 case 'U': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 10, 0, width, ladjust, padc, 0); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'x': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 16, 0, width, ladjust, padc, 0); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'X': | ||||
| 	    if (longFlag) { | ||||
| 		num = va_arg(ap, long int); | ||||
| 	    } else { | ||||
| 		num = va_arg(ap, int); | ||||
| 	    } | ||||
| 	    length = PrintNum(buf, num, 16, 0, width, ladjust, padc, 1); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 'c': | ||||
| 	    c = (char)va_arg(ap, int); | ||||
| 	    length = PrintChar(buf, c, width, ladjust); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case 's': | ||||
| 	    s = (char*)va_arg(ap, char *); | ||||
| 	    length = PrintString(buf, s, width, ladjust); | ||||
| 	    OUTPUT(arg, buf, length); | ||||
| 	    break; | ||||
|  | ||||
| 	 case '\0': | ||||
| 	    fmt --; | ||||
| 	    break; | ||||
|  | ||||
| 	 default: | ||||
| 	    /* output this char as it is */ | ||||
| 	    OUTPUT(arg, fmt, 1); | ||||
| 	}	/* switch (*fmt) */ | ||||
|  | ||||
| 	fmt ++; | ||||
|     }		/* for(;;) */ | ||||
|  | ||||
|     /* special termination call */ | ||||
|     OUTPUT(arg, "\0", 1); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* --------------- local help functions --------------------- */ | ||||
| static int | ||||
| PrintChar(char * buf, char c, int length, int ladjust) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     if (length < 1) length = 1; | ||||
|     if (ladjust) { | ||||
| 	*buf = c; | ||||
| 	for (i=1; i< length; i++) buf[i] = ' '; | ||||
|     } else { | ||||
| 	for (i=0; i< length-1; i++) buf[i] = ' '; | ||||
| 	buf[length - 1] = c; | ||||
|     } | ||||
|     return length; | ||||
| } | ||||
|  | ||||
| static int | ||||
| PrintString(char * buf, char* s, int length, int ladjust) | ||||
| { | ||||
|     int i; | ||||
|     int len=0; | ||||
|     char* s1 = s; | ||||
|     while (*s1++) len++; | ||||
|     if (length < len) length = len; | ||||
|  | ||||
|     if (ladjust) { | ||||
| 	for (i=0; i< len; i++) buf[i] = s[i]; | ||||
| 	for (i=len; i< length; i++) buf[i] = ' '; | ||||
|     } else { | ||||
| 	for (i=0; i< length-len; i++) buf[i] = ' '; | ||||
| 	for (i=length-len; i < length; i++) buf[i] = s[i-length+len]; | ||||
|     } | ||||
|     return length; | ||||
| } | ||||
|  | ||||
| static int | ||||
| PrintNum(char * buf, unsigned long u, int base, int negFlag, | ||||
| 	 int length, int ladjust, char padc, int upcase) | ||||
| { | ||||
|     /* algorithm : | ||||
|      *  1. prints the number from left to right in reverse form. | ||||
|      *  2. fill the remaining spaces with padc if length is longer than | ||||
|      *     the actual length | ||||
|      *     TRICKY : if left adjusted, no "0" padding. | ||||
|      *		    if negtive, insert  "0" padding between "0" and number. | ||||
|      *  3. if (!ladjust) we reverse the whole string including paddings | ||||
|      *  4. otherwise we only reverse the actual string representing the num. | ||||
|      */ | ||||
|  | ||||
|     int actualLength =0; | ||||
|     char *p = buf; | ||||
|     int i; | ||||
|  | ||||
|     do { | ||||
| 	int tmp = u %base; | ||||
| 	if (tmp <= 9) { | ||||
| 	    *p++ = '0' + tmp; | ||||
| 	} else if (upcase) { | ||||
| 	    *p++ = 'A' + tmp - 10; | ||||
| 	} else { | ||||
| 	    *p++ = 'a' + tmp - 10; | ||||
| 	} | ||||
| 	u /= base; | ||||
|     } while (u != 0); | ||||
|  | ||||
|     if (negFlag) { | ||||
| 	*p++ = '-'; | ||||
|     } | ||||
|  | ||||
|     /* figure out actual length and adjust the maximum length */ | ||||
|     actualLength = p - buf; | ||||
|     if (length < actualLength) length = actualLength; | ||||
|  | ||||
|     /* add padding */ | ||||
|     if (ladjust) { | ||||
| 	padc = ' '; | ||||
|     } | ||||
|     if (negFlag && !ladjust && (padc == '0')) { | ||||
| 	for (i = actualLength-1; i< length-1; i++) buf[i] = padc; | ||||
| 	buf[length -1] = '-'; | ||||
|     } else { | ||||
| 	for (i = actualLength; i< length; i++) buf[i] = padc; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /* prepare to reverse the string */ | ||||
|     { | ||||
| 	int begin = 0; | ||||
| 	int end; | ||||
| 	if (ladjust) { | ||||
| 	    end = actualLength - 1; | ||||
| 	} else { | ||||
| 	    end = length -1; | ||||
| 	} | ||||
|  | ||||
| 	while (end > begin) { | ||||
| 	    char tmp = buf[begin]; | ||||
| 	    buf[begin] = buf[end]; | ||||
| 	    buf[end] = tmp; | ||||
| 	    begin ++; | ||||
| 	    end --; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     /* adjust the string pointer */ | ||||
|     return length; | ||||
| } | ||||
|  | ||||
| static void printf_output(void *arg, char *s, int l) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     // special termination call | ||||
|     if ((l==1) && (s[0] == '\0')) return; | ||||
|  | ||||
|     for (i=0; i< l; i++) { | ||||
| 	board_putc(s[i]); | ||||
| 	if (s[i] == '\n') board_putc('\r'); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void printf(char *fmt, ...) | ||||
| { | ||||
|     va_list ap; | ||||
|     va_start(ap, fmt); | ||||
|     lp_Print(printf_output, 0, fmt, ap); | ||||
|     va_end(ap); | ||||
| } | ||||
							
								
								
									
										18
									
								
								target/linux/ath79/image/lzma-loader/src/printf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								target/linux/ath79/image/lzma-loader/src/printf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| /* | ||||
|  * Copyright (C) 2001 MontaVista Software Inc. | ||||
|  * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net | ||||
|  * | ||||
|  * 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;  either version 2 of the  License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef _printf_h_ | ||||
| #define _printf_h_ | ||||
|  | ||||
| #include <stdarg.h> | ||||
| void printf(char *fmt, ...); | ||||
|  | ||||
| #endif /* _printf_h_ */ | ||||
							
								
								
									
										119
									
								
								target/linux/ath79/image/tp-link.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								target/linux/ath79/image/tp-link.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| DEVICE_VARS += TPLINK_HWID TPLINK_HWREV TPLINK_FLASHLAYOUT TPLINK_HEADER_VERSION TPLINK_BOARD_NAME | ||||
|  | ||||
| # combine kernel and rootfs into one image | ||||
| # mktplinkfw <type> <optional extra arguments to mktplinkfw binary> | ||||
| # <type> is "sysupgrade" or "factory" | ||||
| # | ||||
| # -a align the rootfs start on an <align> bytes boundary | ||||
| # -j add jffs2 end-of-filesystem markers | ||||
| # -s strip padding from end of the image | ||||
| # -X reserve <size> bytes in the firmware image (hexval prefixed with 0x) | ||||
| define Build/mktplinkfw | ||||
| 	-$(STAGING_DIR_HOST)/bin/mktplinkfw \ | ||||
| 		-H $(TPLINK_HWID) -W $(TPLINK_HWREV) -F $(TPLINK_FLASHLAYOUT) -N OpenWrt -V $(REVISION) \ | ||||
| 		-m $(TPLINK_HEADER_VERSION) \ | ||||
| 		-k $(IMAGE_KERNEL) \ | ||||
| 		-r $@ \ | ||||
| 		-o $@.new \ | ||||
| 		-j -X 0x40000 \ | ||||
| 		-a $(call rootfs_align,$(FILESYSTEM)) \ | ||||
| 		$(wordlist 2,$(words $(1)),$(1)) \ | ||||
| 		$(if $(findstring sysupgrade,$(word 1,$(1))),-s) && mv $@.new $@ || rm -f $@ | ||||
| endef | ||||
|  | ||||
| # mktplinkfw-combined | ||||
| # | ||||
| # -c combined image | ||||
| define Build/mktplinkfw-combined | ||||
| 	$(STAGING_DIR_HOST)/bin/mktplinkfw \ | ||||
| 		-H $(TPLINK_HWID) -W $(TPLINK_HWREV) -F $(TPLINK_FLASHLAYOUT) -N OpenWrt -V $(REVISION) $(1) \ | ||||
| 		-m $(TPLINK_HEADER_VERSION) \ | ||||
| 		-k $@ \ | ||||
| 		-o $@.new \ | ||||
| 		-s -S \ | ||||
| 		-c | ||||
| 	@mv $@.new $@ | ||||
| endef | ||||
|  | ||||
| # add RE450 and similar header to the kernel image | ||||
| define Build/mktplinkfw-kernel | ||||
| 	$(STAGING_DIR_HOST)/bin/mktplinkfw-kernel \ | ||||
| 		-H $(TPLINK_HWID) -N OpenWrt -V $(REVISION) \ | ||||
| 		-L $(KERNEL_LOADADDR) -E $(KERNEL_LOADADDR) \ | ||||
| 		-k $@ \ | ||||
| 		-o $@.new | ||||
| 	@mv $@.new $@ | ||||
| endef | ||||
|  | ||||
| define Build/uImageArcher | ||||
| 	mkimage -A $(LINUX_KARCH) \ | ||||
| 		-O linux -T kernel \ | ||||
| 		-C $(1) -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ | ||||
| 		-n '$(call toupper,$(LINUX_KARCH)) LEDE Linux-$(LINUX_VERSION)' -d $@ $@.new | ||||
| 	@mv $@.new $@ | ||||
| endef | ||||
|  | ||||
|  | ||||
| define Device/tplink | ||||
|   TPLINK_HWREV := 0x1 | ||||
|   TPLINK_HEADER_VERSION := 1 | ||||
|   LOADER_TYPE := gz | ||||
|   KERNEL := kernel-bin | patch-cmdline | lzma | ||||
|   KERNEL_INITRAMFS := kernel-bin | patch-cmdline | lzma | mktplinkfw-combined | ||||
| #  IMAGES := sysupgrade.bin | ||||
|   IMAGES := sysupgrade.bin factory.bin | ||||
|   IMAGE/sysupgrade.bin := append-rootfs | mktplinkfw sysupgrade | ||||
| #  IMAGE/factory.bin := append-rootfs | mktplinkfw factory | a | ||||
| endef | ||||
|  | ||||
| define Device/tplink-nolzma | ||||
| $(Device/tplink) | ||||
|   LOADER_FLASH_OFFS := 0x22000 | ||||
|   COMPILE := loader-$(1).gz | ||||
|   COMPILE/loader-$(1).gz := loader-okli-compile | ||||
|   #KERNEL := copy-file $(KDIR)/vmlinux.bin.lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) | ||||
|   KERNEL:= kernel-bin | append-dtb | lzma |uImage lzma -M 0x4f4b4c49 | loader-okli $(1) | ||||
|   KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux-initramfs.bin.lzma | loader-kernel-cmdline | mktplinkfw-combined | ||||
| endef | ||||
|  | ||||
| define Device/tplink-4m | ||||
| $(Device/tplink-nolzma) | ||||
|   TPLINK_FLASHLAYOUT := 4M | ||||
|   IMAGE_SIZE := 3904k | ||||
| endef | ||||
|  | ||||
| define Device/tplink-8m | ||||
| $(Device/tplink-nolzma) | ||||
|   TPLINK_FLASHLAYOUT := 8M | ||||
|   IMAGE_SIZE := 7936k | ||||
| endef | ||||
|  | ||||
| define Device/tplink-4mlzma | ||||
| $(Device/tplink) | ||||
|   TPLINK_FLASHLAYOUT := 4Mlzma | ||||
|   IMAGE_SIZE := 3904k | ||||
| endef | ||||
|  | ||||
| define Device/tplink-8mlzma | ||||
| $(Device/tplink) | ||||
|   TPLINK_FLASHLAYOUT := 8Mlzma | ||||
|   IMAGE_SIZE := 7936k | ||||
| endef | ||||
|  | ||||
| define Device/tplink-16mlzma | ||||
| $(Device/tplink) | ||||
|   TPLINK_FLASHLAYOUT := 16Mlzma | ||||
|   IMAGE_SIZE := 15872k | ||||
| endef | ||||
|  | ||||
| define Device/tl_wr1043nd_v1 | ||||
|   $(Device/tplink-8m) | ||||
|   ATH_SOC := ar9132 | ||||
|   DEVICE_TITLE := TP-LINK TL-WR1043N/ND v1 | ||||
|   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport | ||||
|   BOARDNAME := TL-WR1043ND | ||||
|   DEVICE_PROFILE := TLWR1043 | ||||
|   TPLINK_HWID := 0x10430001 | ||||
| endef | ||||
|  | ||||
| #TARGET_DEVICES += tl_wr1043nd_v1 | ||||
							
								
								
									
										16
									
								
								target/linux/ath79/modules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								target/linux/ath79/modules.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| LEDS_MENU:=LED modules | ||||
|  | ||||
| define KernelPackage/leds-reset | ||||
|   SUBMENU:=$(LEDS_MENU) | ||||
|   TITLE:=reset controller LED support | ||||
|   DEPENDS:= @TARGET_ath79 | ||||
|   KCONFIG:=CONFIG_LEDS_RESET=m | ||||
|   FILES:=$(LINUX_DIR)/drivers/leds/leds-reset.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,60,leds-reset,1) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/leds-reset/description | ||||
|  Kernel module for LEDs on reset lines | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,leds-reset)) | ||||
| @@ -0,0 +1,26 @@ | ||||
| From 58812f6d0f1e11b03ed266038ed3b7274ab6f121 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:26:32 +0100 | ||||
| Subject: [PATCH 01/27] tty: serial: drop QCA pecific SoC symbols | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/tty/serial/Kconfig | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
|  | ||||
| diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig | ||||
| index 3682fd3e960c..c92bd969bbf9 100644 | ||||
| --- a/drivers/tty/serial/Kconfig | ||||
| +++ b/drivers/tty/serial/Kconfig | ||||
| @@ -1469,7 +1469,7 @@ config SERIAL_XILINX_PS_UART_CONSOLE | ||||
|   | ||||
|  config SERIAL_AR933X | ||||
|  	tristate "AR933X serial port support" | ||||
| -	depends on HAVE_CLK && SOC_AR933X | ||||
| +	depends on HAVE_CLK && ATH79 | ||||
|  	select SERIAL_CORE | ||||
|  	help | ||||
|  	  If you have an Atheros AR933X SOC based board and want to use the | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,37 @@ | ||||
| From 5f5c9858af167f842ee8df053920b98387a71af1 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Mon, 5 Mar 2018 11:41:25 +0100 | ||||
| Subject: [PATCH 02/27] watchdog: ath79: fix maximum timeout | ||||
|  | ||||
| If the userland tries to set a timeout higher than the max_timeout, | ||||
| then we should fallback to max_timeout. | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/watchdog/ath79_wdt.c | 8 ++++++-- | ||||
|  1 file changed, 6 insertions(+), 2 deletions(-) | ||||
|  | ||||
| diff --git a/drivers/watchdog/ath79_wdt.c b/drivers/watchdog/ath79_wdt.c | ||||
| index e2209bf5fa8a..c2fc6c3d0092 100644 | ||||
| --- a/drivers/watchdog/ath79_wdt.c | ||||
| +++ b/drivers/watchdog/ath79_wdt.c | ||||
| @@ -115,10 +115,14 @@ static inline void ath79_wdt_disable(void) | ||||
|   | ||||
|  static int ath79_wdt_set_timeout(int val) | ||||
|  { | ||||
| -	if (val < 1 || val > max_timeout) | ||||
| +	if (val < 1) | ||||
|  		return -EINVAL; | ||||
|   | ||||
| -	timeout = val; | ||||
| +	if (val > max_timeout) | ||||
| +		timeout = max_timeout; | ||||
| +	else | ||||
| +		timeout = val; | ||||
| + | ||||
|  	ath79_wdt_keepalive(); | ||||
|   | ||||
|  	return 0; | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,189 @@ | ||||
| From ecbd9c87f073f097d9fe56390353e64e963e866a Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:03:03 +0100 | ||||
| Subject: [PATCH 03/27] leds: add reset-controller based driver | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/leds/Kconfig      |  11 ++++ | ||||
|  drivers/leds/Makefile     |   1 + | ||||
|  drivers/leds/leds-reset.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  3 files changed, 149 insertions(+) | ||||
|  create mode 100644 drivers/leds/leds-reset.c | ||||
|  | ||||
| Index: linux-4.14.32/drivers/leds/Kconfig | ||||
| =================================================================== | ||||
| --- linux-4.14.32.orig/drivers/leds/Kconfig | ||||
| +++ linux-4.14.32/drivers/leds/Kconfig | ||||
| @@ -696,6 +696,17 @@ config LEDS_NIC78BX | ||||
|  	  To compile this driver as a module, choose M here: the module | ||||
|  	  will be called leds-nic78bx. | ||||
|   | ||||
| +config LEDS_RESET | ||||
| +	tristate "LED support for reset-controller API" | ||||
| +	depends on LEDS_CLASS | ||||
| +	depends on RESET_CONTROLLER | ||||
| +	help | ||||
| +	  This option enables support for LEDs connected to pins driven by reset | ||||
| +	  controllers. Yes, DNI actual built HW like that. | ||||
| + | ||||
| +	  To compile this driver as a module, choose M here: the module | ||||
| +	  will be called leds-reset. | ||||
| + | ||||
|  comment "LED Triggers" | ||||
|  source "drivers/leds/trigger/Kconfig" | ||||
|   | ||||
| Index: linux-4.14.32/drivers/leds/leds-reset.c | ||||
| =================================================================== | ||||
| --- /dev/null | ||||
| +++ linux-4.14.32/drivers/leds/leds-reset.c | ||||
| @@ -0,0 +1,137 @@ | ||||
| +/* | ||||
| + * Copyright (C) 2018 John Crispin <john@phrozen.org> | ||||
| + * | ||||
| + * 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. | ||||
| + * | ||||
| + */ | ||||
| +#include <linux/err.h> | ||||
| +#include <linux/reset.h> | ||||
| +#include <linux/kernel.h> | ||||
| +#include <linux/leds.h> | ||||
| +#include <linux/module.h> | ||||
| +#include <linux/of.h> | ||||
| +#include <linux/platform_device.h> | ||||
| +#include <linux/reset.h> | ||||
| + | ||||
| +struct reset_led_data { | ||||
| +	struct led_classdev cdev; | ||||
| +	struct reset_control *rst; | ||||
| +}; | ||||
| + | ||||
| +static inline struct reset_led_data * | ||||
| +			cdev_to_reset_led_data(struct led_classdev *led_cdev) | ||||
| +{ | ||||
| +	return container_of(led_cdev, struct reset_led_data, cdev); | ||||
| +} | ||||
| + | ||||
| +static void reset_led_set(struct led_classdev *led_cdev, | ||||
| +	enum led_brightness value) | ||||
| +{ | ||||
| +	struct reset_led_data *led_dat = cdev_to_reset_led_data(led_cdev); | ||||
| + | ||||
| +	if (value == LED_OFF) | ||||
| +		reset_control_assert(led_dat->rst); | ||||
| +	else | ||||
| +		reset_control_deassert(led_dat->rst); | ||||
| +} | ||||
| + | ||||
| +struct reset_leds_priv { | ||||
| +	int num_leds; | ||||
| +	struct reset_led_data leds[]; | ||||
| +}; | ||||
| + | ||||
| +static inline int sizeof_reset_leds_priv(int num_leds) | ||||
| +{ | ||||
| +	return sizeof(struct reset_leds_priv) + | ||||
| +		(sizeof(struct reset_led_data) * num_leds); | ||||
| +} | ||||
| + | ||||
| +static struct reset_leds_priv *reset_leds_create(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct device *dev = &pdev->dev; | ||||
| +	struct fwnode_handle *child; | ||||
| +	struct reset_leds_priv *priv; | ||||
| +	int count, ret; | ||||
| + | ||||
| +	count = device_get_child_node_count(dev); | ||||
| +	if (!count) | ||||
| +		return ERR_PTR(-ENODEV); | ||||
| + | ||||
| +	priv = devm_kzalloc(dev, sizeof_reset_leds_priv(count), GFP_KERNEL); | ||||
| +	if (!priv) | ||||
| +		return ERR_PTR(-ENOMEM); | ||||
| + | ||||
| +	device_for_each_child_node(dev, child) { | ||||
| +		struct reset_led_data *led = &priv->leds[priv->num_leds]; | ||||
| +		struct device_node *np = to_of_node(child); | ||||
| + | ||||
| +		ret = fwnode_property_read_string(child, "label", &led->cdev.name); | ||||
| +		if (!led->cdev.name) { | ||||
| +			fwnode_handle_put(child); | ||||
| +			return ERR_PTR(-EINVAL); | ||||
| +		} | ||||
| +		led->rst = __of_reset_control_get(np, NULL, 0, 0, 0); | ||||
| +		if (IS_ERR(led->rst)) | ||||
| +			return ERR_PTR(-EINVAL); | ||||
| + | ||||
| +		led->cdev.brightness_set = reset_led_set; | ||||
| +		ret = devm_of_led_classdev_register(&pdev->dev, np, &led->cdev); | ||||
| +		if (ret < 0) | ||||
| +			return ERR_PTR(ret); | ||||
| +		led->cdev.dev->of_node = np; | ||||
| +		priv->num_leds++; | ||||
| +	} | ||||
| + | ||||
| +	return priv; | ||||
| +} | ||||
| + | ||||
| +static const struct of_device_id of_reset_leds_match[] = { | ||||
| +	{ .compatible = "reset-leds", }, | ||||
| +	{}, | ||||
| +}; | ||||
| + | ||||
| +MODULE_DEVICE_TABLE(of, of_reset_leds_match); | ||||
| + | ||||
| +static int reset_led_probe(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct reset_leds_priv *priv; | ||||
| + | ||||
| +	priv = reset_leds_create(pdev); | ||||
| +	if (IS_ERR(priv)) | ||||
| +		return PTR_ERR(priv); | ||||
| + | ||||
| +	platform_set_drvdata(pdev, priv); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static void reset_led_shutdown(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct reset_leds_priv *priv = platform_get_drvdata(pdev); | ||||
| +	int i; | ||||
| + | ||||
| +	for (i = 0; i < priv->num_leds; i++) { | ||||
| +		struct reset_led_data *led = &priv->leds[i]; | ||||
| + | ||||
| +		if (!(led->cdev.flags & LED_RETAIN_AT_SHUTDOWN)) | ||||
| +			reset_led_set(&led->cdev, LED_OFF); | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static struct platform_driver reset_led_driver = { | ||||
| +	.probe		= reset_led_probe, | ||||
| +	.shutdown	= reset_led_shutdown, | ||||
| +	.driver		= { | ||||
| +		.name	= "leds-reset", | ||||
| +		.of_match_table = of_reset_leds_match, | ||||
| +	}, | ||||
| +}; | ||||
| + | ||||
| +module_platform_driver(reset_led_driver); | ||||
| + | ||||
| +MODULE_AUTHOR("John Crispin <john@phrozen.org>"); | ||||
| +MODULE_DESCRIPTION("reset controller LED driver"); | ||||
| +MODULE_LICENSE("GPL"); | ||||
| +MODULE_ALIAS("platform:leds-reset"); | ||||
| Index: linux-4.14.32/drivers/leds/Makefile | ||||
| =================================================================== | ||||
| --- linux-4.14.32.orig/drivers/leds/Makefile | ||||
| +++ linux-4.14.32/drivers/leds/Makefile | ||||
| @@ -73,6 +73,7 @@ obj-$(CONFIG_LEDS_PM8058)		+= leds-pm805 | ||||
|  obj-$(CONFIG_LEDS_MLXCPLD)		+= leds-mlxcpld.o | ||||
|  obj-$(CONFIG_LEDS_NIC78BX)		+= leds-nic78bx.o | ||||
|  obj-$(CONFIG_LEDS_MT6323)		+= leds-mt6323.o | ||||
| +obj-$(CONFIG_LEDS_RESET)		+= leds-reset.o | ||||
|   | ||||
|  # LED SPI Drivers | ||||
|  obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o | ||||
| @@ -0,0 +1,328 @@ | ||||
| From 08c9d6ceef01893678a5d2e8a15517c745417f21 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:04:05 +0100 | ||||
| Subject: [PATCH 04/27] phy: add ath79 usb phys | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/phy/Kconfig          |  16 ++++++ | ||||
|  drivers/phy/Makefile         |   2 + | ||||
|  drivers/phy/phy-ar7100-usb.c | 124 +++++++++++++++++++++++++++++++++++++++++++ | ||||
|  drivers/phy/phy-ar7200-usb.c | 108 +++++++++++++++++++++++++++++++++++++ | ||||
|  4 files changed, 250 insertions(+) | ||||
|  create mode 100644 drivers/phy/phy-ar7100-usb.c | ||||
|  create mode 100644 drivers/phy/phy-ar7200-usb.c | ||||
|  | ||||
| Index: linux-4.14.37/drivers/phy/Kconfig | ||||
| =================================================================== | ||||
| --- linux-4.14.37.orig/drivers/phy/Kconfig | ||||
| +++ linux-4.14.37/drivers/phy/Kconfig | ||||
| @@ -15,6 +15,22 @@ config GENERIC_PHY | ||||
|  	  phy users can obtain reference to the PHY. All the users of this | ||||
|  	  framework should select this config. | ||||
|   | ||||
| +config PHY_AR7100_USB | ||||
| +	tristate "Atheros AR7100 USB PHY driver" | ||||
| +	depends on ATH79 || COMPILE_TEST | ||||
| +	default y if USB_EHCI_HCD_PLATFORM | ||||
| +	select PHY_SIMPLE | ||||
| +	help | ||||
| +	  Enable this to support the USB PHY on Atheros AR7100 SoCs. | ||||
| + | ||||
| +config PHY_AR7200_USB | ||||
| +	tristate "Atheros AR7200 USB PHY driver" | ||||
| +	depends on ATH79 || COMPILE_TEST | ||||
| +	default y if USB_EHCI_HCD_PLATFORM | ||||
| +	select PHY_SIMPLE | ||||
| +	help | ||||
| +	  Enable this to support the USB PHY on Atheros AR7200 SoCs. | ||||
| + | ||||
|  config PHY_LPC18XX_USB_OTG | ||||
|  	tristate "NXP LPC18xx/43xx SoC USB OTG PHY driver" | ||||
|  	depends on OF && (ARCH_LPC18XX || COMPILE_TEST) | ||||
| Index: linux-4.14.37/drivers/phy/Makefile | ||||
| =================================================================== | ||||
| --- linux-4.14.37.orig/drivers/phy/Makefile | ||||
| +++ linux-4.14.37/drivers/phy/Makefile | ||||
| @@ -4,6 +4,8 @@ | ||||
|  # | ||||
|   | ||||
|  obj-$(CONFIG_GENERIC_PHY)		+= phy-core.o | ||||
| +obj-$(CONFIG_PHY_AR7100_USB)		+= phy-ar7100-usb.o | ||||
| +obj-$(CONFIG_PHY_AR7200_USB)		+= phy-ar7200-usb.o | ||||
|  obj-$(CONFIG_PHY_LPC18XX_USB_OTG)	+= phy-lpc18xx-usb-otg.o | ||||
|  obj-$(CONFIG_PHY_XGENE)			+= phy-xgene.o | ||||
|  obj-$(CONFIG_PHY_PISTACHIO_USB)		+= phy-pistachio-usb.o | ||||
| Index: linux-4.14.37/drivers/phy/phy-ar7100-usb.c | ||||
| =================================================================== | ||||
| --- /dev/null | ||||
| +++ linux-4.14.37/drivers/phy/phy-ar7100-usb.c | ||||
| @@ -0,0 +1,140 @@ | ||||
| +/* | ||||
| + * Copyright (C) 2018 John Crispin <john@phrozen.org> | ||||
| + * | ||||
| + * 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; either version 2 of the License, or | ||||
| + * (at your option) any later version. | ||||
| + */ | ||||
| + | ||||
| +#include <linux/module.h> | ||||
| +#include <linux/platform_device.h> | ||||
| +#include <linux/phy/phy.h> | ||||
| +#include <linux/delay.h> | ||||
| +#include <linux/reset.h> | ||||
| +#include <linux/of_gpio.h> | ||||
| + | ||||
| +#include <asm/mach-ath79/ath79.h> | ||||
| +#include <asm/mach-ath79/ar71xx_regs.h> | ||||
| + | ||||
| +struct ar7100_usb_phy { | ||||
| +	struct reset_control	*rst_phy; | ||||
| +	struct reset_control	*rst_host; | ||||
| +	struct reset_control	*rst_ohci_dll; | ||||
| +	void __iomem		*io_base; | ||||
| +	struct phy		*phy; | ||||
| +	int			gpio; | ||||
| +}; | ||||
| + | ||||
| +static int ar7100_usb_phy_power_off(struct phy *phy) | ||||
| +{ | ||||
| +	struct ar7100_usb_phy *priv = phy_get_drvdata(phy); | ||||
| +	int err = 0; | ||||
| + | ||||
| +	err |= reset_control_assert(priv->rst_host); | ||||
| +	err |= reset_control_assert(priv->rst_phy); | ||||
| +	err |= reset_control_assert(priv->rst_ohci_dll); | ||||
| + | ||||
| +	return err; | ||||
| +} | ||||
| + | ||||
| +static int ar7100_usb_phy_power_on(struct phy *phy) | ||||
| +{ | ||||
| +	struct ar7100_usb_phy *priv = phy_get_drvdata(phy); | ||||
| +	int err = 0; | ||||
| + | ||||
| +	err |= ar7100_usb_phy_power_off(phy); | ||||
| +	mdelay(100); | ||||
| +	err |= reset_control_deassert(priv->rst_ohci_dll); | ||||
| +	err |= reset_control_deassert(priv->rst_phy); | ||||
| +	err |= reset_control_deassert(priv->rst_host); | ||||
| +	mdelay(500); | ||||
| +	iowrite32(0xf0000, priv->io_base + AR71XX_USB_CTRL_REG_CONFIG); | ||||
| +	iowrite32(0x20c00, priv->io_base + AR71XX_USB_CTRL_REG_FLADJ); | ||||
| + | ||||
| +	return err; | ||||
| +} | ||||
| + | ||||
| +static const struct phy_ops ar7100_usb_phy_ops = { | ||||
| +	.power_on	= ar7100_usb_phy_power_on, | ||||
| +	.power_off	= ar7100_usb_phy_power_off, | ||||
| +	.owner		= THIS_MODULE, | ||||
| +}; | ||||
| + | ||||
| +static int ar7100_usb_phy_probe(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct phy_provider *phy_provider; | ||||
| +	struct resource *res; | ||||
| +	struct ar7100_usb_phy *priv; | ||||
| + | ||||
| +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | ||||
| +	if (!priv) | ||||
| +		return -ENOMEM; | ||||
| + | ||||
| +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||||
| +	priv->io_base = devm_ioremap_resource(&pdev->dev, res); | ||||
| +	if (IS_ERR(priv->io_base)) | ||||
| +		return PTR_ERR(priv->io_base); | ||||
| + | ||||
| +	priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); | ||||
| +	if (IS_ERR(priv->rst_phy)) { | ||||
| +		dev_err(&pdev->dev, "phy reset is missing\n"); | ||||
| +		return PTR_ERR(priv->rst_phy); | ||||
| +	} | ||||
| + | ||||
| +	priv->rst_host = devm_reset_control_get(&pdev->dev, "usb-host"); | ||||
| +	if (IS_ERR(priv->rst_host)) { | ||||
| +		dev_err(&pdev->dev, "host reset is missing\n"); | ||||
| +		return PTR_ERR(priv->rst_host); | ||||
| +	} | ||||
| + | ||||
| +	priv->rst_ohci_dll = devm_reset_control_get(&pdev->dev, "usb-ohci-dll"); | ||||
| +	if (IS_ERR(priv->rst_ohci_dll)) { | ||||
| +		dev_err(&pdev->dev, "ohci-dll reset is missing\n"); | ||||
| +		return PTR_ERR(priv->rst_host); | ||||
| +	} | ||||
| + | ||||
| +	priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7100_usb_phy_ops); | ||||
| +	if (IS_ERR(priv->phy)) { | ||||
| +		dev_err(&pdev->dev, "failed to create PHY\n"); | ||||
| +		return PTR_ERR(priv->phy); | ||||
| +	} | ||||
| + | ||||
| +	priv->gpio = of_get_gpio(pdev->dev.of_node, 0); | ||||
| +	if (priv->gpio >= 0) { | ||||
| +		int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); | ||||
| + | ||||
| +		if (ret) { | ||||
| +			dev_err(&pdev->dev, "failed to request gpio\n"); | ||||
| +			return ret; | ||||
| +		} | ||||
| +		gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); | ||||
| +		gpio_set_value(priv->gpio, 1); | ||||
| +	} | ||||
| + | ||||
| +	phy_set_drvdata(priv->phy, priv); | ||||
| + | ||||
| +	phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); | ||||
| + | ||||
| + | ||||
| +	return PTR_ERR_OR_ZERO(phy_provider); | ||||
| +} | ||||
| + | ||||
| +static const struct of_device_id ar7100_usb_phy_of_match[] = { | ||||
| +	{ .compatible = "qca,ar7100-usb-phy" }, | ||||
| +	{} | ||||
| +}; | ||||
| +MODULE_DEVICE_TABLE(of, ar7100_usb_phy_of_match); | ||||
| + | ||||
| +static struct platform_driver ar7100_usb_phy_driver = { | ||||
| +	.probe	= ar7100_usb_phy_probe, | ||||
| +	.driver = { | ||||
| +		.of_match_table	= ar7100_usb_phy_of_match, | ||||
| +		.name		= "ar7100-usb-phy", | ||||
| +	} | ||||
| +}; | ||||
| +module_platform_driver(ar7100_usb_phy_driver); | ||||
| + | ||||
| +MODULE_DESCRIPTION("ATH79 USB PHY driver"); | ||||
| +MODULE_AUTHOR("Alban Bedel <albeu@free.fr>"); | ||||
| +MODULE_LICENSE("GPL"); | ||||
| Index: linux-4.14.37/drivers/phy/phy-ar7200-usb.c | ||||
| =================================================================== | ||||
| --- /dev/null | ||||
| +++ linux-4.14.37/drivers/phy/phy-ar7200-usb.c | ||||
| @@ -0,0 +1,123 @@ | ||||
| +/* | ||||
| + * Copyright (C) 2015 Alban Bedel <albeu@free.fr> | ||||
| + * | ||||
| + * 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; either version 2 of the License, or | ||||
| + * (at your option) any later version. | ||||
| + */ | ||||
| + | ||||
| +#include <linux/module.h> | ||||
| +#include <linux/platform_device.h> | ||||
| +#include <linux/phy/phy.h> | ||||
| +#include <linux/reset.h> | ||||
| +#include <linux/of_gpio.h> | ||||
| + | ||||
| +struct ar7200_usb_phy { | ||||
| +	struct reset_control	*rst_phy; | ||||
| +	struct reset_control	*suspend_override; | ||||
| +	struct phy		*phy; | ||||
| +	int			gpio; | ||||
| +}; | ||||
| + | ||||
| +static int ar7200_usb_phy_power_on(struct phy *phy) | ||||
| +{ | ||||
| +	struct ar7200_usb_phy *priv = phy_get_drvdata(phy); | ||||
| +	int err = 0; | ||||
| + | ||||
| +	if (priv->rst_phy) | ||||
| +		err = reset_control_deassert(priv->rst_phy); | ||||
| +	if (!err && priv->suspend_override) | ||||
| +		err = reset_control_assert(priv->suspend_override); | ||||
| +	if (err && priv->rst_phy) | ||||
| +		err = reset_control_assert(priv->rst_phy); | ||||
| + | ||||
| +	return err; | ||||
| +} | ||||
| + | ||||
| +static int ar7200_usb_phy_power_off(struct phy *phy) | ||||
| +{ | ||||
| +	struct ar7200_usb_phy *priv = phy_get_drvdata(phy); | ||||
| +	int err = 0; | ||||
| + | ||||
| +	if (priv->suspend_override) | ||||
| +		err = reset_control_deassert(priv->suspend_override); | ||||
| +	if (priv->rst_phy) | ||||
| +		err |= reset_control_assert(priv->rst_phy); | ||||
| + | ||||
| +	return err; | ||||
| +} | ||||
| + | ||||
| +static const struct phy_ops ar7200_usb_phy_ops = { | ||||
| +	.power_on	= ar7200_usb_phy_power_on, | ||||
| +	.power_off	= ar7200_usb_phy_power_off, | ||||
| +	.owner		= THIS_MODULE, | ||||
| +}; | ||||
| + | ||||
| +static int ar7200_usb_phy_probe(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct phy_provider *phy_provider; | ||||
| +	struct ar7200_usb_phy *priv; | ||||
| + | ||||
| +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | ||||
| +	if (!priv) | ||||
| +		return -ENOMEM; | ||||
| + | ||||
| +	priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy"); | ||||
| +	if (IS_ERR(priv->rst_phy)) { | ||||
| +		dev_err(&pdev->dev, "phy reset is missing\n"); | ||||
| +		return PTR_ERR(priv->rst_phy); | ||||
| +	} | ||||
| + | ||||
| +	priv->suspend_override = devm_reset_control_get_optional( | ||||
| +		&pdev->dev, "usb-suspend-override"); | ||||
| +	if (IS_ERR(priv->suspend_override)) { | ||||
| +		if (PTR_ERR(priv->suspend_override) == -ENOENT) | ||||
| +			priv->suspend_override = NULL; | ||||
| +		else | ||||
| +			return PTR_ERR(priv->suspend_override); | ||||
| +	} | ||||
| + | ||||
| +	priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7200_usb_phy_ops); | ||||
| +	if (IS_ERR(priv->phy)) { | ||||
| +		dev_err(&pdev->dev, "failed to create PHY\n"); | ||||
| +		return PTR_ERR(priv->phy); | ||||
| +	} | ||||
| + | ||||
| +	priv->gpio = of_get_gpio(pdev->dev.of_node, 0); | ||||
| +	if (priv->gpio >= 0) { | ||||
| +		int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev)); | ||||
| + | ||||
| +		if (ret) { | ||||
| +			dev_err(&pdev->dev, "failed to request gpio\n"); | ||||
| +			return ret; | ||||
| +		} | ||||
| +		gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev)); | ||||
| +		gpio_set_value(priv->gpio, 1); | ||||
| +	} | ||||
| + | ||||
| +	phy_set_drvdata(priv->phy, priv); | ||||
| + | ||||
| +	phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); | ||||
| + | ||||
| +	return PTR_ERR_OR_ZERO(phy_provider); | ||||
| +} | ||||
| + | ||||
| +static const struct of_device_id ar7200_usb_phy_of_match[] = { | ||||
| +	{ .compatible = "qca,ar7200-usb-phy" }, | ||||
| +	{} | ||||
| +}; | ||||
| +MODULE_DEVICE_TABLE(of, ar7200_usb_phy_of_match); | ||||
| + | ||||
| +static struct platform_driver ar7200_usb_phy_driver = { | ||||
| +	.probe	= ar7200_usb_phy_probe, | ||||
| +	.driver = { | ||||
| +		.of_match_table	= ar7200_usb_phy_of_match, | ||||
| +		.name		= "ar7200-usb-phy", | ||||
| +	} | ||||
| +}; | ||||
| +module_platform_driver(ar7200_usb_phy_driver); | ||||
| + | ||||
| +MODULE_DESCRIPTION("ATH79 USB PHY driver"); | ||||
| +MODULE_AUTHOR("Alban Bedel <albeu@free.fr>"); | ||||
| +MODULE_LICENSE("GPL"); | ||||
| @@ -0,0 +1,29 @@ | ||||
| From 2201818e5bd33f389beceb3943fdfcf5a698fc5b Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:01:43 +0100 | ||||
| Subject: [PATCH 05/27] usb: add more OF/quirk properties | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/usb/host/ehci-platform.c | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
|  | ||||
| diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c | ||||
| index b065a960adc2..b1cc841b5399 100644 | ||||
| --- a/drivers/usb/host/ehci-platform.c | ||||
| +++ b/drivers/usb/host/ehci-platform.c | ||||
| @@ -185,6 +185,11 @@ static int ehci_platform_probe(struct platform_device *dev) | ||||
|  	ehci = hcd_to_ehci(hcd); | ||||
|   | ||||
|  	if (pdata == &ehci_platform_defaults && dev->dev.of_node) { | ||||
| +		of_property_read_u32(dev->dev.of_node, "caps-offset", &pdata->caps_offset); | ||||
| + | ||||
| +		if (of_property_read_bool(dev->dev.of_node, "has-synopsys-hc-bug")) | ||||
| +			pdata->has_synopsys_hc_bug = 1; | ||||
| + | ||||
|  		if (of_property_read_bool(dev->dev.of_node, "big-endian-regs")) | ||||
|  			ehci->big_endian_mmio = 1; | ||||
|   | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,56 @@ | ||||
| From bd17da5b6297e0e52b787049292d076ad415362a Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:04:54 +0100 | ||||
| Subject: [PATCH 06/27] usb: drop deprecated symbols | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/usb/host/Kconfig | 25 ------------------------- | ||||
|  1 file changed, 25 deletions(-) | ||||
|  | ||||
| diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig | ||||
| index 4fcfb3084b36..55b45dcd7a4b 100644 | ||||
| --- a/drivers/usb/host/Kconfig | ||||
| +++ b/drivers/usb/host/Kconfig | ||||
| @@ -293,19 +293,6 @@ config USB_CNS3XXX_EHCI | ||||
|  	  It is needed for high-speed (480Mbit/sec) USB 2.0 device | ||||
|  	  support. | ||||
|   | ||||
| -config USB_EHCI_ATH79 | ||||
| -	bool "EHCI support for AR7XXX/AR9XXX SoCs (DEPRECATED)" | ||||
| -	depends on (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X) | ||||
| -	select USB_EHCI_ROOT_HUB_TT | ||||
| -	select USB_EHCI_HCD_PLATFORM | ||||
| -	default y | ||||
| -	---help--- | ||||
| -	  This option is deprecated now and the driver was removed, use | ||||
| -	  USB_EHCI_HCD_PLATFORM instead. | ||||
| - | ||||
| -	  Enables support for the built-in EHCI controller present | ||||
| -	  on the Atheros AR7XXX/AR9XXX SoCs. | ||||
| - | ||||
|  config USB_EHCI_HCD_PLATFORM | ||||
|  	tristate "Generic EHCI driver for a platform device" | ||||
|  	default n | ||||
| @@ -489,18 +476,6 @@ config USB_OHCI_HCD_DAVINCI | ||||
|  	  controller. This driver cannot currently be a loadable | ||||
|  	  module because it lacks a proper PHY abstraction. | ||||
|   | ||||
| -config USB_OHCI_ATH79 | ||||
| -	bool "USB OHCI support for the Atheros AR71XX/AR7240 SoCs (DEPRECATED)" | ||||
| -	depends on (SOC_AR71XX || SOC_AR724X) | ||||
| -	select USB_OHCI_HCD_PLATFORM | ||||
| -	default y | ||||
| -	help | ||||
| -	  This option is deprecated now and the driver was removed, use | ||||
| -	  USB_OHCI_HCD_PLATFORM instead. | ||||
| - | ||||
| -	  Enables support for the built-in OHCI controller present on the | ||||
| -	  Atheros AR71XX/AR7240 SoCs. | ||||
| - | ||||
|  config USB_OHCI_HCD_PPC_OF_BE | ||||
|  	bool "OHCI support for OF platform bus (big endian)" | ||||
|  	depends on PPC | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,138 @@ | ||||
| From cb376159800b9b44be76949c3aee89eb06d29faa Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:55:13 +0100 | ||||
| Subject: [PATCH 07/27] irqchip/irq-ath79-intc: add irq cascade driver for | ||||
|  QCA9556 SoCs | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/irqchip/Makefile         |   1 + | ||||
|  drivers/irqchip/irq-ath79-intc.c | 104 +++++++++++++++++++++++++++++++++++++++ | ||||
|  2 files changed, 105 insertions(+) | ||||
|  create mode 100644 drivers/irqchip/irq-ath79-intc.c | ||||
|  | ||||
| diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile | ||||
| index d27e3e3619e0..f63c94a92e25 100644 | ||||
| --- a/drivers/irqchip/Makefile | ||||
| +++ b/drivers/irqchip/Makefile | ||||
| @@ -3,6 +3,7 @@ obj-$(CONFIG_IRQCHIP)			+= irqchip.o | ||||
|   | ||||
|  obj-$(CONFIG_ALPINE_MSI)		+= irq-alpine-msi.o | ||||
|  obj-$(CONFIG_ATH79)			+= irq-ath79-cpu.o | ||||
| +obj-$(CONFIG_ATH79)			+= irq-ath79-intc.o | ||||
|  obj-$(CONFIG_ATH79)			+= irq-ath79-misc.o | ||||
|  obj-$(CONFIG_ARCH_BCM2835)		+= irq-bcm2835.o | ||||
|  obj-$(CONFIG_ARCH_BCM2835)		+= irq-bcm2836.o | ||||
| diff --git a/drivers/irqchip/irq-ath79-intc.c b/drivers/irqchip/irq-ath79-intc.c | ||||
| new file mode 100644 | ||||
| index 000000000000..a26d3efe6e10 | ||||
| --- /dev/null | ||||
| +++ b/drivers/irqchip/irq-ath79-intc.c | ||||
| @@ -0,0 +1,104 @@ | ||||
| +/* | ||||
| + *  Atheros AR71xx/AR724x/AR913x specific interrupt handling | ||||
| + * | ||||
| + *  Copyright (C) 2018 John Crispin <john@phrozen.org> | ||||
| + * | ||||
| + *  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. | ||||
| + */ | ||||
| + | ||||
| +#include <linux/interrupt.h> | ||||
| +#include <linux/irqchip.h> | ||||
| +#include <linux/of.h> | ||||
| +#include <linux/of_irq.h> | ||||
| +#include <linux/irqdomain.h> | ||||
| + | ||||
| +#include <asm/irq_cpu.h> | ||||
| +#include <asm/mach-ath79/ath79.h> | ||||
| +#include <asm/mach-ath79/ar71xx_regs.h> | ||||
| + | ||||
| +#define ATH79_MAX_INTC_CASCADE	3 | ||||
| + | ||||
| +struct ath79_intc { | ||||
| +	struct irq_chip chip; | ||||
| +	u32 irq; | ||||
| +	u32 pending_mask; | ||||
| +	u32 irq_mask[ATH79_MAX_INTC_CASCADE]; | ||||
| +}; | ||||
| + | ||||
| +static void ath79_intc_irq_handler(struct irq_desc *desc) | ||||
| +{ | ||||
| +	struct irq_domain *domain = irq_desc_get_handler_data(desc); | ||||
| +	struct ath79_intc *intc = domain->host_data; | ||||
| +	u32 pending; | ||||
| + | ||||
| +	pending = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS); | ||||
| +	pending &= intc->pending_mask; | ||||
| + | ||||
| +	if (pending) { | ||||
| +		int i; | ||||
| + | ||||
| +		for (i = 0; i < domain->hwirq_max; i++) | ||||
| +			if (pending & intc->irq_mask[i]) | ||||
| +				generic_handle_irq(irq_find_mapping(domain, i)); | ||||
| +	} else { | ||||
| +		spurious_interrupt(); | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static void ath79_intc_irq_unmask(struct irq_data *d) | ||||
| +{ | ||||
| +} | ||||
| + | ||||
| +static void ath79_intc_irq_mask(struct irq_data *d) | ||||
| +{ | ||||
| +} | ||||
| + | ||||
| +static int ath79_intc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) | ||||
| +{ | ||||
| +	struct ath79_intc *intc = d->host_data; | ||||
| + | ||||
| +	irq_set_chip_and_handler(irq, &intc->chip, handle_level_irq); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static const struct irq_domain_ops ath79_irq_domain_ops = { | ||||
| +	.xlate = irq_domain_xlate_onecell, | ||||
| +	.map = ath79_intc_map, | ||||
| +}; | ||||
| + | ||||
| +static int __init qca9556_intc_of_init( | ||||
| +	struct device_node *node, struct device_node *parent) | ||||
| +{ | ||||
| +	struct irq_domain *domain; | ||||
| +	struct ath79_intc *intc; | ||||
| +	int cnt, i; | ||||
| + | ||||
| +	cnt = of_property_count_u32_elems(node, "qcom,pending-bits"); | ||||
| +	if (cnt > ATH79_MAX_INTC_CASCADE) | ||||
| +		panic("Too many INTC pending bits\n"); | ||||
| + | ||||
| +	intc = kzalloc(sizeof(*intc), GFP_KERNEL); | ||||
| +	if (!intc) | ||||
| +		panic("Failed to allocate INTC memory\n"); | ||||
| +	intc->chip.name = "INTC"; | ||||
| +	intc->chip.irq_unmask = ath79_intc_irq_unmask, | ||||
| +	intc->chip.irq_mask = ath79_intc_irq_mask, | ||||
| + | ||||
| +	of_property_read_u32_array(node, "qcom,pending-bits", intc->irq_mask, cnt); | ||||
| +	for (i = 0; i < cnt; i++) | ||||
| +		intc->pending_mask |= intc->irq_mask[i]; | ||||
| + | ||||
| +	intc->irq = irq_of_parse_and_map(node, 0); | ||||
| +	if (!intc->irq) | ||||
| +		panic("Failed to get INTC IRQ"); | ||||
| + | ||||
| +	domain = irq_domain_add_linear(node, cnt, &ath79_irq_domain_ops, intc); | ||||
| +	irq_set_chained_handler_and_data(intc->irq, ath79_intc_irq_handler, domain); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| +IRQCHIP_DECLARE(qca9556_intc, "qcom,qca9556-intc", | ||||
| +		qca9556_intc_of_init); | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,28 @@ | ||||
| From f711421eb5f6f790f1ebc09a13ae4aed8ba5f67b Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:58:19 +0100 | ||||
| Subject: [PATCH 08/27] irqchip/irq-ath79-cpu: drop !OF init helper | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  drivers/irqchip/irq-ath79-cpu.c | 7 ------- | ||||
|  1 file changed, 7 deletions(-) | ||||
|  | ||||
| diff --git a/drivers/irqchip/irq-ath79-cpu.c b/drivers/irqchip/irq-ath79-cpu.c | ||||
| index befe93c5a51a..f29cb9c933f5 100644 | ||||
| --- a/drivers/irqchip/irq-ath79-cpu.c | ||||
| +++ b/drivers/irqchip/irq-ath79-cpu.c | ||||
| @@ -88,10 +88,3 @@ static int __init ar79_cpu_intc_of_init( | ||||
|  } | ||||
|  IRQCHIP_DECLARE(ar79_cpu_intc, "qca,ar7100-cpu-intc", | ||||
|  		ar79_cpu_intc_of_init); | ||||
| - | ||||
| -void __init ath79_cpu_irq_init(unsigned irq_wb_chan2, unsigned irq_wb_chan3) | ||||
| -{ | ||||
| -	irq_wb_chan[2] = irq_wb_chan2; | ||||
| -	irq_wb_chan[3] = irq_wb_chan3; | ||||
| -	mips_cpu_irq_init(); | ||||
| -} | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,977 @@ | ||||
| From 3ea2bff4ed3ce74dc4303aa20f5e906e78352f6b Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:06:10 +0100 | ||||
| Subject: [PATCH 09/27] MIPS: ath79: add lots of missing registers | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/include/asm/mach-ath79/ar71xx_regs.h | 773 ++++++++++++++++++++++++- | ||||
|  1 file changed, 771 insertions(+), 2 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | ||||
| index aa3800c82332..284b4fa23e03 100644 | ||||
| --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | ||||
| +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | ||||
| @@ -20,6 +20,10 @@ | ||||
|  #include <linux/bitops.h> | ||||
|   | ||||
|  #define AR71XX_APB_BASE		0x18000000 | ||||
| +#define AR71XX_GE0_BASE		0x19000000 | ||||
| +#define AR71XX_GE0_SIZE		0x10000 | ||||
| +#define AR71XX_GE1_BASE		0x1a000000 | ||||
| +#define AR71XX_GE1_SIZE		0x10000 | ||||
|  #define AR71XX_EHCI_BASE	0x1b000000 | ||||
|  #define AR71XX_EHCI_SIZE	0x1000 | ||||
|  #define AR71XX_OHCI_BASE	0x1c000000 | ||||
| @@ -39,6 +43,8 @@ | ||||
|  #define AR71XX_PLL_SIZE		0x100 | ||||
|  #define AR71XX_RESET_BASE	(AR71XX_APB_BASE + 0x00060000) | ||||
|  #define AR71XX_RESET_SIZE	0x100 | ||||
| +#define AR71XX_MII_BASE		(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define AR71XX_MII_SIZE		0x100 | ||||
|   | ||||
|  #define AR71XX_PCI_MEM_BASE	0x10000000 | ||||
|  #define AR71XX_PCI_MEM_SIZE	0x07000000 | ||||
| @@ -81,18 +87,39 @@ | ||||
|   | ||||
|  #define AR933X_UART_BASE	(AR71XX_APB_BASE + 0x00020000) | ||||
|  #define AR933X_UART_SIZE	0x14 | ||||
| +#define AR933X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define AR933X_GMAC_SIZE	0x04 | ||||
|  #define AR933X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
|  #define AR933X_WMAC_SIZE	0x20000 | ||||
|  #define AR933X_EHCI_BASE	0x1b000000 | ||||
|  #define AR933X_EHCI_SIZE	0x1000 | ||||
|   | ||||
| +#define AR934X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define AR934X_GMAC_SIZE	0x14 | ||||
|  #define AR934X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
|  #define AR934X_WMAC_SIZE	0x20000 | ||||
|  #define AR934X_EHCI_BASE	0x1b000000 | ||||
|  #define AR934X_EHCI_SIZE	0x200 | ||||
| +#define AR934X_NFC_BASE		0x1b000200 | ||||
| +#define AR934X_NFC_SIZE		0xb8 | ||||
|  #define AR934X_SRIF_BASE	(AR71XX_APB_BASE + 0x00116000) | ||||
|  #define AR934X_SRIF_SIZE	0x1000 | ||||
|   | ||||
| +#define QCA953X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define QCA953X_GMAC_SIZE	0x14 | ||||
| +#define QCA953X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
| +#define QCA953X_WMAC_SIZE	0x20000 | ||||
| +#define QCA953X_EHCI_BASE	0x1b000000 | ||||
| +#define QCA953X_EHCI_SIZE	0x200 | ||||
| +#define QCA953X_SRIF_BASE	(AR71XX_APB_BASE + 0x00116000) | ||||
| +#define QCA953X_SRIF_SIZE	0x1000 | ||||
| + | ||||
| +#define QCA953X_PCI_CFG_BASE0	0x14000000 | ||||
| +#define QCA953X_PCI_CTRL_BASE0	(AR71XX_APB_BASE + 0x000f0000) | ||||
| +#define QCA953X_PCI_CRP_BASE0	(AR71XX_APB_BASE + 0x000c0000) | ||||
| +#define QCA953X_PCI_MEM_BASE0	0x10000000 | ||||
| +#define QCA953X_PCI_MEM_SIZE	0x02000000 | ||||
| + | ||||
|  #define QCA955X_PCI_MEM_BASE0	0x10000000 | ||||
|  #define QCA955X_PCI_MEM_BASE1	0x12000000 | ||||
|  #define QCA955X_PCI_MEM_SIZE	0x02000000 | ||||
| @@ -106,11 +133,72 @@ | ||||
|  #define QCA955X_PCI_CTRL_BASE1	(AR71XX_APB_BASE + 0x00280000) | ||||
|  #define QCA955X_PCI_CTRL_SIZE	0x100 | ||||
|   | ||||
| +#define QCA955X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define QCA955X_GMAC_SIZE	0x40 | ||||
|  #define QCA955X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
|  #define QCA955X_WMAC_SIZE	0x20000 | ||||
|  #define QCA955X_EHCI0_BASE	0x1b000000 | ||||
|  #define QCA955X_EHCI1_BASE	0x1b400000 | ||||
|  #define QCA955X_EHCI_SIZE	0x1000 | ||||
| +#define QCA955X_NFC_BASE	0x1b800200 | ||||
| +#define QCA955X_NFC_SIZE	0xb8 | ||||
| + | ||||
| +#define QCA956X_PCI_MEM_BASE1	0x12000000 | ||||
| +#define QCA956X_PCI_MEM_SIZE	0x02000000 | ||||
| +#define QCA956X_PCI_CFG_BASE1	0x16000000 | ||||
| +#define QCA956X_PCI_CFG_SIZE	0x1000 | ||||
| +#define QCA956X_PCI_CRP_BASE1	(AR71XX_APB_BASE + 0x00250000) | ||||
| +#define QCA956X_PCI_CRP_SIZE	0x1000 | ||||
| +#define QCA956X_PCI_CTRL_BASE1	(AR71XX_APB_BASE + 0x00280000) | ||||
| +#define QCA956X_PCI_CTRL_SIZE	0x100 | ||||
| + | ||||
| +#define QCA956X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000) | ||||
| +#define QCA956X_WMAC_SIZE	0x20000 | ||||
| +#define QCA956X_EHCI0_BASE	0x1b000000 | ||||
| +#define QCA956X_EHCI1_BASE	0x1b400000 | ||||
| +#define QCA956X_EHCI_SIZE	0x200 | ||||
| +#define QCA956X_GMAC_SGMII_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define QCA956X_GMAC_SGMII_SIZE	0x64 | ||||
| +#define QCA956X_PLL_BASE	(AR71XX_APB_BASE + 0x00050000) | ||||
| +#define QCA956X_PLL_SIZE	0x50 | ||||
| +#define QCA956X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000) | ||||
| +#define QCA956X_GMAC_SIZE	0x64 | ||||
| + | ||||
| +/* | ||||
| + * Hidden Registers | ||||
| + */ | ||||
| +#define QCA956X_MAC_CFG_BASE		0xb9000000 | ||||
| +#define QCA956X_MAC_CFG_SIZE		0x64 | ||||
| + | ||||
| +#define QCA956X_MAC_CFG1_REG		0x00 | ||||
| +#define QCA956X_MAC_CFG1_SOFT_RST	BIT(31) | ||||
| +#define QCA956X_MAC_CFG1_RX_RST		BIT(19) | ||||
| +#define QCA956X_MAC_CFG1_TX_RST		BIT(18) | ||||
| +#define QCA956X_MAC_CFG1_LOOPBACK	BIT(8) | ||||
| +#define QCA956X_MAC_CFG1_RX_EN		BIT(2) | ||||
| +#define QCA956X_MAC_CFG1_TX_EN		BIT(0) | ||||
| + | ||||
| +#define QCA956X_MAC_CFG2_REG		0x04 | ||||
| +#define QCA956X_MAC_CFG2_IF_1000	BIT(9) | ||||
| +#define QCA956X_MAC_CFG2_IF_10_100	BIT(8) | ||||
| +#define QCA956X_MAC_CFG2_HUGE_FRAME_EN	BIT(5) | ||||
| +#define QCA956X_MAC_CFG2_LEN_CHECK	BIT(4) | ||||
| +#define QCA956X_MAC_CFG2_PAD_CRC_EN	BIT(2) | ||||
| +#define QCA956X_MAC_CFG2_FDX		BIT(0) | ||||
| + | ||||
| +#define QCA956X_MAC_MII_MGMT_CFG_REG	0x20 | ||||
| +#define QCA956X_MGMT_CFG_CLK_DIV_20	0x07 | ||||
| + | ||||
| +#define QCA956X_MAC_FIFO_CFG0_REG	0x48 | ||||
| +#define QCA956X_MAC_FIFO_CFG1_REG	0x4c | ||||
| +#define QCA956X_MAC_FIFO_CFG2_REG	0x50 | ||||
| +#define QCA956X_MAC_FIFO_CFG3_REG	0x54 | ||||
| +#define QCA956X_MAC_FIFO_CFG4_REG	0x58 | ||||
| +#define QCA956X_MAC_FIFO_CFG5_REG	0x5c | ||||
| + | ||||
| +#define QCA956X_DAM_RESET_OFFSET	0xb90001bc | ||||
| +#define QCA956X_DAM_RESET_SIZE		0x4 | ||||
| +#define QCA956X_INLINE_CHKSUM_ENG	BIT(27) | ||||
|   | ||||
|  /* | ||||
|   * DDR_CTRL block | ||||
| @@ -149,6 +237,12 @@ | ||||
|  #define AR934X_DDR_REG_FLUSH_PCIE	0xa8 | ||||
|  #define AR934X_DDR_REG_FLUSH_WMAC	0xac | ||||
|   | ||||
| +#define QCA953X_DDR_REG_FLUSH_GE0	0x9c | ||||
| +#define QCA953X_DDR_REG_FLUSH_GE1	0xa0 | ||||
| +#define QCA953X_DDR_REG_FLUSH_USB	0xa4 | ||||
| +#define QCA953X_DDR_REG_FLUSH_PCIE	0xa8 | ||||
| +#define QCA953X_DDR_REG_FLUSH_WMAC	0xac | ||||
| + | ||||
|  /* | ||||
|   * PLL block | ||||
|   */ | ||||
| @@ -166,8 +260,14 @@ | ||||
|  #define AR71XX_AHB_DIV_SHIFT		20 | ||||
|  #define AR71XX_AHB_DIV_MASK		0x7 | ||||
|   | ||||
| +#define AR71XX_ETH0_PLL_SHIFT		17 | ||||
| +#define AR71XX_ETH1_PLL_SHIFT		19 | ||||
| + | ||||
|  #define AR724X_PLL_REG_CPU_CONFIG	0x00 | ||||
| -#define AR724X_PLL_REG_PCIE_CONFIG	0x18 | ||||
| +#define AR724X_PLL_REG_PCIE_CONFIG	0x10 | ||||
| + | ||||
| +#define AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS	BIT(16) | ||||
| +#define AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET	BIT(25) | ||||
|   | ||||
|  #define AR724X_PLL_FB_SHIFT		0 | ||||
|  #define AR724X_PLL_FB_MASK		0x3ff | ||||
| @@ -178,6 +278,8 @@ | ||||
|  #define AR724X_DDR_DIV_SHIFT		22 | ||||
|  #define AR724X_DDR_DIV_MASK		0x3 | ||||
|   | ||||
| +#define AR7242_PLL_REG_ETH0_INT_CLOCK	0x2c | ||||
| + | ||||
|  #define AR913X_PLL_REG_CPU_CONFIG	0x00 | ||||
|  #define AR913X_PLL_REG_ETH_CONFIG	0x04 | ||||
|  #define AR913X_PLL_REG_ETH0_INT_CLOCK	0x14 | ||||
| @@ -190,6 +292,9 @@ | ||||
|  #define AR913X_AHB_DIV_SHIFT		19 | ||||
|  #define AR913X_AHB_DIV_MASK		0x1 | ||||
|   | ||||
| +#define AR913X_ETH0_PLL_SHIFT		20 | ||||
| +#define AR913X_ETH1_PLL_SHIFT		22 | ||||
| + | ||||
|  #define AR933X_PLL_CPU_CONFIG_REG	0x00 | ||||
|  #define AR933X_PLL_CLOCK_CTRL_REG	0x08 | ||||
|   | ||||
| @@ -211,6 +316,8 @@ | ||||
|  #define AR934X_PLL_CPU_CONFIG_REG		0x00 | ||||
|  #define AR934X_PLL_DDR_CONFIG_REG		0x04 | ||||
|  #define AR934X_PLL_CPU_DDR_CLK_CTRL_REG		0x08 | ||||
| +#define AR934X_PLL_SWITCH_CLOCK_CONTROL_REG	0x24 | ||||
| +#define AR934X_PLL_ETH_XMII_CONTROL_REG		0x2c | ||||
|   | ||||
|  #define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT	0 | ||||
|  #define AR934X_PLL_CPU_CONFIG_NFRAC_MASK	0x3f | ||||
| @@ -243,9 +350,52 @@ | ||||
|  #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL	BIT(21) | ||||
|  #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL	BIT(24) | ||||
|   | ||||
| +#define AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL	BIT(6) | ||||
| + | ||||
| +#define QCA953X_PLL_CPU_CONFIG_REG		0x00 | ||||
| +#define QCA953X_PLL_DDR_CONFIG_REG		0x04 | ||||
| +#define QCA953X_PLL_CLK_CTRL_REG		0x08 | ||||
| +#define QCA953X_PLL_SWITCH_CLOCK_CONTROL_REG	0x24 | ||||
| +#define QCA953X_PLL_ETH_XMII_CONTROL_REG	0x2c | ||||
| +#define QCA953X_PLL_ETH_SGMII_CONTROL_REG	0x48 | ||||
| + | ||||
| +#define QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT	0 | ||||
| +#define QCA953X_PLL_CPU_CONFIG_NFRAC_MASK	0x3f | ||||
| +#define QCA953X_PLL_CPU_CONFIG_NINT_SHIFT	6 | ||||
| +#define QCA953X_PLL_CPU_CONFIG_NINT_MASK	0x3f | ||||
| +#define QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT	12 | ||||
| +#define QCA953X_PLL_CPU_CONFIG_REFDIV_MASK	0x1f | ||||
| +#define QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT	19 | ||||
| +#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK	0x7 | ||||
| + | ||||
| +#define QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT	0 | ||||
| +#define QCA953X_PLL_DDR_CONFIG_NFRAC_MASK	0x3ff | ||||
| +#define QCA953X_PLL_DDR_CONFIG_NINT_SHIFT	10 | ||||
| +#define QCA953X_PLL_DDR_CONFIG_NINT_MASK	0x3f | ||||
| +#define QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT	16 | ||||
| +#define QCA953X_PLL_DDR_CONFIG_REFDIV_MASK	0x1f | ||||
| +#define QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT	23 | ||||
| +#define QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK	0x7 | ||||
| + | ||||
| +#define QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2) | ||||
| +#define QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3) | ||||
| +#define QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4) | ||||
| +#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5 | ||||
| +#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f | ||||
| +#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10 | ||||
| +#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f | ||||
| +#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15 | ||||
| +#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f | ||||
| +#define QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL		BIT(20) | ||||
| +#define QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21) | ||||
| +#define QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24) | ||||
| + | ||||
|  #define QCA955X_PLL_CPU_CONFIG_REG		0x00 | ||||
|  #define QCA955X_PLL_DDR_CONFIG_REG		0x04 | ||||
|  #define QCA955X_PLL_CLK_CTRL_REG		0x08 | ||||
| +#define QCA955X_PLL_ETH_XMII_CONTROL_REG	0x28 | ||||
| +#define QCA955X_PLL_ETH_SGMII_CONTROL_REG	0x48 | ||||
| +#define QCA955X_PLL_ETH_SGMII_SERDES_REG	0x4c | ||||
|   | ||||
|  #define QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT	0 | ||||
|  #define QCA955X_PLL_CPU_CONFIG_NFRAC_MASK	0x3f | ||||
| @@ -278,6 +428,81 @@ | ||||
|  #define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21) | ||||
|  #define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24) | ||||
|   | ||||
| +#define QCA955X_PLL_ETH_SGMII_SERDES_LOCK_DETECT	BIT(2) | ||||
| +#define QCA955X_PLL_ETH_SGMII_SERDES_PLL_REFCLK		BIT(1) | ||||
| +#define QCA955X_PLL_ETH_SGMII_SERDES_EN_PLL		BIT(0) | ||||
| + | ||||
| +#define QCA956X_PLL_CPU_CONFIG_REG			0x00 | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_REG			0x04 | ||||
| +#define QCA956X_PLL_DDR_CONFIG_REG			0x08 | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_REG			0x0c | ||||
| +#define QCA956X_PLL_CLK_CTRL_REG			0x10 | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_CONTROL_REG		0x28 | ||||
| +#define QCA956X_PLL_ETH_XMII_CONTROL_REG		0x30 | ||||
| +#define QCA956X_PLL_ETH_SGMII_SERDES_REG		0x4c | ||||
| + | ||||
| +#define QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT		12 | ||||
| +#define QCA956X_PLL_CPU_CONFIG_REFDIV_MASK		0x1f | ||||
| +#define QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT		19 | ||||
| +#define QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK		0x7 | ||||
| + | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT		0 | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK		0x1f | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT		5 | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK		0x1fff | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT		18 | ||||
| +#define QCA956X_PLL_CPU_CONFIG1_NINT_MASK		0x1ff | ||||
| + | ||||
| +#define QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT		16 | ||||
| +#define QCA956X_PLL_DDR_CONFIG_REFDIV_MASK		0x1f | ||||
| +#define QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT		23 | ||||
| +#define QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK		0x7 | ||||
| + | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT		0 | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK		0x1f | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT		5 | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK		0x1fff | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT		18 | ||||
| +#define QCA956X_PLL_DDR_CONFIG1_NINT_MASK		0x1ff | ||||
| + | ||||
| +#define QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS		BIT(2) | ||||
| +#define QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS		BIT(3) | ||||
| +#define QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS		BIT(4) | ||||
| +#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT		5 | ||||
| +#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK		0x1f | ||||
| +#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT		10 | ||||
| +#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK		0x1f | ||||
| +#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT		15 | ||||
| +#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK		0x1f | ||||
| +#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL	BIT(20) | ||||
| +#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL	BIT(21) | ||||
| +#define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24) | ||||
| + | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_I2C_CLK_SELB		BIT(5) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL0_1		BIT(6) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_UART1_CLK_SEL		BIT(7) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_USB_REFCLK_FREQ_SEL_SHIFT 8 | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_USB_REFCLK_FREQ_SEL_MASK	 0xf | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_EN_PLL_TOP		BIT(12) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL0_2		BIT(13) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL1_1		BIT(14) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL1_2		BIT(15) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_SWITCH_FUNC_TST_MODE	BIT(16) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_EEE_ENABLE		BIT(17) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_OEN_CLK125M_PLL		BIT(18) | ||||
| +#define QCA956X_PLL_SWITCH_CLOCK_SPARE_SWITCHCLK_SEL		BIT(19) | ||||
| + | ||||
| +#define QCA956X_PLL_ETH_XMII_TX_INVERT			BIT(1) | ||||
| +#define QCA956X_PLL_ETH_XMII_GIGE			BIT(25) | ||||
| +#define QCA956X_PLL_ETH_XMII_RX_DELAY_SHIFT		28 | ||||
| +#define QCA956X_PLL_ETH_XMII_RX_DELAY_MASK		0x3 | ||||
| +#define QCA956X_PLL_ETH_XMII_TX_DELAY_SHIFT		26 | ||||
| +#define QCA956X_PLL_ETH_XMII_TX_DELAY_MASK		3 | ||||
| + | ||||
| +#define QCA956X_PLL_ETH_SGMII_SERDES_LOCK_DETECT		BIT(2) | ||||
| +#define QCA956X_PLL_ETH_SGMII_SERDES_PLL_REFCLK			BIT(1) | ||||
| +#define QCA956X_PLL_ETH_SGMII_SERDES_EN_PLL			BIT(0) | ||||
| + | ||||
|  /* | ||||
|   * USB_CONFIG block | ||||
|   */ | ||||
| @@ -317,10 +542,19 @@ | ||||
|  #define AR934X_RESET_REG_BOOTSTRAP		0xb0 | ||||
|  #define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS	0xac | ||||
|   | ||||
| +#define QCA953X_RESET_REG_RESET_MODULE		0x1c | ||||
| +#define QCA953X_RESET_REG_BOOTSTRAP		0xb0 | ||||
| +#define QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS	0xac | ||||
| + | ||||
|  #define QCA955X_RESET_REG_RESET_MODULE		0x1c | ||||
|  #define QCA955X_RESET_REG_BOOTSTRAP		0xb0 | ||||
|  #define QCA955X_RESET_REG_EXT_INT_STATUS	0xac | ||||
|   | ||||
| +#define QCA956X_RESET_REG_RESET_MODULE		0x1c | ||||
| +#define QCA956X_RESET_REG_BOOTSTRAP		0xb0 | ||||
| +#define QCA956X_RESET_REG_EXT_INT_STATUS	0xac | ||||
| + | ||||
| +#define MISC_INT_MIPS_SI_TIMERINT_MASK	BIT(28) | ||||
|  #define MISC_INT_ETHSW			BIT(12) | ||||
|  #define MISC_INT_TIMER4			BIT(10) | ||||
|  #define MISC_INT_TIMER3			BIT(9) | ||||
| @@ -370,16 +604,123 @@ | ||||
|  #define AR913X_RESET_USB_HOST		BIT(5) | ||||
|  #define AR913X_RESET_USB_PHY		BIT(4) | ||||
|   | ||||
| +#define AR933X_RESET_GE1_MDIO		BIT(23) | ||||
| +#define AR933X_RESET_GE0_MDIO		BIT(22) | ||||
| +#define AR933X_RESET_GE1_MAC		BIT(13) | ||||
|  #define AR933X_RESET_WMAC		BIT(11) | ||||
| +#define AR933X_RESET_GE0_MAC		BIT(9) | ||||
|  #define AR933X_RESET_USB_HOST		BIT(5) | ||||
|  #define AR933X_RESET_USB_PHY		BIT(4) | ||||
|  #define AR933X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
|   | ||||
| +#define AR934X_RESET_HOST		BIT(31) | ||||
| +#define AR934X_RESET_SLIC		BIT(30) | ||||
| +#define AR934X_RESET_HDMA		BIT(29) | ||||
| +#define AR934X_RESET_EXTERNAL		BIT(28) | ||||
| +#define AR934X_RESET_RTC		BIT(27) | ||||
| +#define AR934X_RESET_PCIE_EP_INT	BIT(26) | ||||
| +#define AR934X_RESET_CHKSUM_ACC		BIT(25) | ||||
| +#define AR934X_RESET_FULL_CHIP		BIT(24) | ||||
| +#define AR934X_RESET_GE1_MDIO		BIT(23) | ||||
| +#define AR934X_RESET_GE0_MDIO		BIT(22) | ||||
| +#define AR934X_RESET_CPU_NMI		BIT(21) | ||||
| +#define AR934X_RESET_CPU_COLD		BIT(20) | ||||
| +#define AR934X_RESET_HOST_RESET_INT	BIT(19) | ||||
| +#define AR934X_RESET_PCIE_EP		BIT(18) | ||||
| +#define AR934X_RESET_UART1		BIT(17) | ||||
| +#define AR934X_RESET_DDR		BIT(16) | ||||
| +#define AR934X_RESET_USB_PHY_PLL_PWD_EXT BIT(15) | ||||
| +#define AR934X_RESET_NANDF		BIT(14) | ||||
| +#define AR934X_RESET_GE1_MAC		BIT(13) | ||||
| +#define AR934X_RESET_ETH_SWITCH_ANALOG	BIT(12) | ||||
|  #define AR934X_RESET_USB_PHY_ANALOG	BIT(11) | ||||
| +#define AR934X_RESET_HOST_DMA_INT	BIT(10) | ||||
| +#define AR934X_RESET_GE0_MAC		BIT(9) | ||||
| +#define AR934X_RESET_ETH_SWITCH		BIT(8) | ||||
| +#define AR934X_RESET_PCIE_PHY		BIT(7) | ||||
| +#define AR934X_RESET_PCIE		BIT(6) | ||||
|  #define AR934X_RESET_USB_HOST		BIT(5) | ||||
|  #define AR934X_RESET_USB_PHY		BIT(4) | ||||
|  #define AR934X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
| - | ||||
| +#define AR934X_RESET_LUT		BIT(2) | ||||
| +#define AR934X_RESET_MBOX		BIT(1) | ||||
| +#define AR934X_RESET_I2S		BIT(0) | ||||
| + | ||||
| +#define QCA953X_RESET_USB_EXT_PWR	BIT(29) | ||||
| +#define QCA953X_RESET_EXTERNAL		BIT(28) | ||||
| +#define QCA953X_RESET_RTC		BIT(27) | ||||
| +#define QCA953X_RESET_FULL_CHIP		BIT(24) | ||||
| +#define QCA953X_RESET_GE1_MDIO		BIT(23) | ||||
| +#define QCA953X_RESET_GE0_MDIO		BIT(22) | ||||
| +#define QCA953X_RESET_CPU_NMI		BIT(21) | ||||
| +#define QCA953X_RESET_CPU_COLD		BIT(20) | ||||
| +#define QCA953X_RESET_DDR		BIT(16) | ||||
| +#define QCA953X_RESET_USB_PHY_PLL_PWD_EXT BIT(15) | ||||
| +#define QCA953X_RESET_GE1_MAC		BIT(13) | ||||
| +#define QCA953X_RESET_ETH_SWITCH_ANALOG	BIT(12) | ||||
| +#define QCA953X_RESET_USB_PHY_ANALOG	BIT(11) | ||||
| +#define QCA953X_RESET_GE0_MAC		BIT(9) | ||||
| +#define QCA953X_RESET_ETH_SWITCH	BIT(8) | ||||
| +#define QCA953X_RESET_PCIE_PHY		BIT(7) | ||||
| +#define QCA953X_RESET_PCIE		BIT(6) | ||||
| +#define QCA953X_RESET_USB_HOST		BIT(5) | ||||
| +#define QCA953X_RESET_USB_PHY		BIT(4) | ||||
| +#define QCA953X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
| + | ||||
| +#define QCA955X_RESET_HOST		BIT(31) | ||||
| +#define QCA955X_RESET_SLIC		BIT(30) | ||||
| +#define QCA955X_RESET_HDMA		BIT(29) | ||||
| +#define QCA955X_RESET_EXTERNAL		BIT(28) | ||||
| +#define QCA955X_RESET_RTC		BIT(27) | ||||
| +#define QCA955X_RESET_PCIE_EP_INT	BIT(26) | ||||
| +#define QCA955X_RESET_CHKSUM_ACC	BIT(25) | ||||
| +#define QCA955X_RESET_FULL_CHIP		BIT(24) | ||||
| +#define QCA955X_RESET_GE1_MDIO		BIT(23) | ||||
| +#define QCA955X_RESET_GE0_MDIO		BIT(22) | ||||
| +#define QCA955X_RESET_CPU_NMI		BIT(21) | ||||
| +#define QCA955X_RESET_CPU_COLD		BIT(20) | ||||
| +#define QCA955X_RESET_HOST_RESET_INT	BIT(19) | ||||
| +#define QCA955X_RESET_PCIE_EP		BIT(18) | ||||
| +#define QCA955X_RESET_UART1		BIT(17) | ||||
| +#define QCA955X_RESET_DDR		BIT(16) | ||||
| +#define QCA955X_RESET_USB_PHY_PLL_PWD_EXT BIT(15) | ||||
| +#define QCA955X_RESET_NANDF		BIT(14) | ||||
| +#define QCA955X_RESET_GE1_MAC		BIT(13) | ||||
| +#define QCA955X_RESET_SGMII_ANALOG	BIT(12) | ||||
| +#define QCA955X_RESET_USB_PHY_ANALOG	BIT(11) | ||||
| +#define QCA955X_RESET_HOST_DMA_INT	BIT(10) | ||||
| +#define QCA955X_RESET_GE0_MAC		BIT(9) | ||||
| +#define QCA955X_RESET_SGMII		BIT(8) | ||||
| +#define QCA955X_RESET_PCIE_PHY		BIT(7) | ||||
| +#define QCA955X_RESET_PCIE		BIT(6) | ||||
| +#define QCA955X_RESET_USB_HOST		BIT(5) | ||||
| +#define QCA955X_RESET_USB_PHY		BIT(4) | ||||
| +#define QCA955X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
| +#define QCA955X_RESET_LUT		BIT(2) | ||||
| +#define QCA955X_RESET_MBOX		BIT(1) | ||||
| +#define QCA955X_RESET_I2S		BIT(0) | ||||
| + | ||||
| +#define QCA956X_RESET_EXTERNAL		BIT(28) | ||||
| +#define QCA956X_RESET_FULL_CHIP		BIT(24) | ||||
| +#define QCA956X_RESET_GE1_MDIO		BIT(23) | ||||
| +#define QCA956X_RESET_GE0_MDIO		BIT(22) | ||||
| +#define QCA956X_RESET_CPU_NMI		BIT(21) | ||||
| +#define QCA956X_RESET_CPU_COLD		BIT(20) | ||||
| +#define QCA956X_RESET_DMA		BIT(19) | ||||
| +#define QCA956X_RESET_DDR		BIT(16) | ||||
| +#define QCA956X_RESET_GE1_MAC		BIT(13) | ||||
| +#define QCA956X_RESET_SGMII_ANALOG	BIT(12) | ||||
| +#define QCA956X_RESET_USB_PHY_ANALOG	BIT(11) | ||||
| +#define QCA956X_RESET_GE0_MAC		BIT(9) | ||||
| +#define QCA956X_RESET_SGMII		BIT(8) | ||||
| +#define QCA956X_RESET_USB_HOST		BIT(5) | ||||
| +#define QCA956X_RESET_USB_PHY		BIT(4) | ||||
| +#define QCA956X_RESET_USBSUS_OVERRIDE	BIT(3) | ||||
| +#define QCA956X_RESET_SWITCH_ANALOG	BIT(2) | ||||
| +#define QCA956X_RESET_SWITCH		BIT(0) | ||||
| + | ||||
| +#define AR933X_BOOTSTRAP_MDIO_GPIO_EN	BIT(18) | ||||
| +#define AR933X_BOOTSTRAP_EEPBUSY	BIT(4) | ||||
|  #define AR933X_BOOTSTRAP_REF_CLK_40	BIT(0) | ||||
|   | ||||
|  #define AR934X_BOOTSTRAP_SW_OPTION8	BIT(23) | ||||
| @@ -398,8 +739,17 @@ | ||||
|  #define AR934X_BOOTSTRAP_SDRAM_DISABLED BIT(1) | ||||
|  #define AR934X_BOOTSTRAP_DDR1		BIT(0) | ||||
|   | ||||
| +#define QCA953X_BOOTSTRAP_SW_OPTION2	BIT(12) | ||||
| +#define QCA953X_BOOTSTRAP_SW_OPTION1	BIT(11) | ||||
| +#define QCA953X_BOOTSTRAP_EJTAG_MODE	BIT(5) | ||||
| +#define QCA953X_BOOTSTRAP_REF_CLK_40	BIT(4) | ||||
| +#define QCA953X_BOOTSTRAP_SDRAM_DISABLED BIT(1) | ||||
| +#define QCA953X_BOOTSTRAP_DDR1		BIT(0) | ||||
| + | ||||
|  #define QCA955X_BOOTSTRAP_REF_CLK_40	BIT(4) | ||||
|   | ||||
| +#define QCA956X_BOOTSTRAP_REF_CLK_40	BIT(2) | ||||
| + | ||||
|  #define AR934X_PCIE_WMAC_INT_WMAC_MISC		BIT(0) | ||||
|  #define AR934X_PCIE_WMAC_INT_WMAC_TX		BIT(1) | ||||
|  #define AR934X_PCIE_WMAC_INT_WMAC_RXLP		BIT(2) | ||||
| @@ -418,6 +768,24 @@ | ||||
|  	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \ | ||||
|  	 AR934X_PCIE_WMAC_INT_PCIE_RC3) | ||||
|   | ||||
| +#define QCA953X_PCIE_WMAC_INT_WMAC_MISC		BIT(0) | ||||
| +#define QCA953X_PCIE_WMAC_INT_WMAC_TX		BIT(1) | ||||
| +#define QCA953X_PCIE_WMAC_INT_WMAC_RXLP		BIT(2) | ||||
| +#define QCA953X_PCIE_WMAC_INT_WMAC_RXHP		BIT(3) | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_RC		BIT(4) | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_RC0		BIT(5) | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_RC1		BIT(6) | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_RC2		BIT(7) | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_RC3		BIT(8) | ||||
| +#define QCA953X_PCIE_WMAC_INT_WMAC_ALL \ | ||||
| +	(QCA953X_PCIE_WMAC_INT_WMAC_MISC | QCA953X_PCIE_WMAC_INT_WMAC_TX | \ | ||||
| +	 QCA953X_PCIE_WMAC_INT_WMAC_RXLP | QCA953X_PCIE_WMAC_INT_WMAC_RXHP) | ||||
| + | ||||
| +#define QCA953X_PCIE_WMAC_INT_PCIE_ALL \ | ||||
| +	(QCA953X_PCIE_WMAC_INT_PCIE_RC | QCA953X_PCIE_WMAC_INT_PCIE_RC0 | \ | ||||
| +	 QCA953X_PCIE_WMAC_INT_PCIE_RC1 | QCA953X_PCIE_WMAC_INT_PCIE_RC2 | \ | ||||
| +	 QCA953X_PCIE_WMAC_INT_PCIE_RC3) | ||||
| + | ||||
|  #define QCA955X_EXT_INT_WMAC_MISC		BIT(0) | ||||
|  #define QCA955X_EXT_INT_WMAC_TX			BIT(1) | ||||
|  #define QCA955X_EXT_INT_WMAC_RXLP		BIT(2) | ||||
| @@ -449,6 +817,37 @@ | ||||
|  	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \ | ||||
|  	 QCA955X_EXT_INT_PCIE_RC2_INT3) | ||||
|   | ||||
| +#define QCA956X_EXT_INT_WMAC_MISC		BIT(0) | ||||
| +#define QCA956X_EXT_INT_WMAC_TX			BIT(1) | ||||
| +#define QCA956X_EXT_INT_WMAC_RXLP		BIT(2) | ||||
| +#define QCA956X_EXT_INT_WMAC_RXHP		BIT(3) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1		BIT(4) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1_INT0		BIT(5) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1_INT1		BIT(6) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1_INT2		BIT(7) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1_INT3		BIT(8) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2		BIT(12) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2_INT0		BIT(13) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2_INT1		BIT(14) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2_INT2		BIT(15) | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2_INT3		BIT(16) | ||||
| +#define QCA956X_EXT_INT_USB1			BIT(24) | ||||
| +#define QCA956X_EXT_INT_USB2			BIT(28) | ||||
| + | ||||
| +#define QCA956X_EXT_INT_WMAC_ALL \ | ||||
| +	(QCA956X_EXT_INT_WMAC_MISC | QCA956X_EXT_INT_WMAC_TX | \ | ||||
| +	 QCA956X_EXT_INT_WMAC_RXLP | QCA956X_EXT_INT_WMAC_RXHP) | ||||
| + | ||||
| +#define QCA956X_EXT_INT_PCIE_RC1_ALL \ | ||||
| +	(QCA956X_EXT_INT_PCIE_RC1 | QCA956X_EXT_INT_PCIE_RC1_INT0 | \ | ||||
| +	 QCA956X_EXT_INT_PCIE_RC1_INT1 | QCA956X_EXT_INT_PCIE_RC1_INT2 | \ | ||||
| +	 QCA956X_EXT_INT_PCIE_RC1_INT3) | ||||
| + | ||||
| +#define QCA956X_EXT_INT_PCIE_RC2_ALL \ | ||||
| +	(QCA956X_EXT_INT_PCIE_RC2 | QCA956X_EXT_INT_PCIE_RC2_INT0 | \ | ||||
| +	 QCA956X_EXT_INT_PCIE_RC2_INT1 | QCA956X_EXT_INT_PCIE_RC2_INT2 | \ | ||||
| +	 QCA956X_EXT_INT_PCIE_RC2_INT3) | ||||
| + | ||||
|  #define REV_ID_MAJOR_MASK		0xfff0 | ||||
|  #define REV_ID_MAJOR_AR71XX		0x00a0 | ||||
|  #define REV_ID_MAJOR_AR913X		0x00b0 | ||||
| @@ -460,8 +859,12 @@ | ||||
|  #define REV_ID_MAJOR_AR9341		0x0120 | ||||
|  #define REV_ID_MAJOR_AR9342		0x1120 | ||||
|  #define REV_ID_MAJOR_AR9344		0x2120 | ||||
| +#define REV_ID_MAJOR_QCA9533		0x0140 | ||||
| +#define REV_ID_MAJOR_QCA9533_V2		0x0160 | ||||
|  #define REV_ID_MAJOR_QCA9556		0x0130 | ||||
|  #define REV_ID_MAJOR_QCA9558		0x1130 | ||||
| +#define REV_ID_MAJOR_TP9343		0x0150 | ||||
| +#define REV_ID_MAJOR_QCA956X		0x1150 | ||||
|   | ||||
|  #define AR71XX_REV_ID_MINOR_MASK	0x3 | ||||
|  #define AR71XX_REV_ID_MINOR_AR7130	0x0 | ||||
| @@ -482,8 +885,12 @@ | ||||
|   | ||||
|  #define AR934X_REV_ID_REVISION_MASK	0xf | ||||
|   | ||||
| +#define QCA953X_REV_ID_REVISION_MASK	0xf | ||||
| + | ||||
|  #define QCA955X_REV_ID_REVISION_MASK	0xf | ||||
|   | ||||
| +#define QCA956X_REV_ID_REVISION_MASK	0xf | ||||
| + | ||||
|  /* | ||||
|   * SPI block | ||||
|   */ | ||||
| @@ -521,15 +928,63 @@ | ||||
|  #define AR71XX_GPIO_REG_INT_ENABLE	0x24 | ||||
|  #define AR71XX_GPIO_REG_FUNC		0x28 | ||||
|   | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC0	0x2c | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC1	0x30 | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC2	0x34 | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC3	0x38 | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC4	0x3c | ||||
| +#define AR934X_GPIO_REG_OUT_FUNC5	0x40 | ||||
|  #define AR934X_GPIO_REG_FUNC		0x6c | ||||
|   | ||||
| +#define QCA953X_GPIO_REG_OUT_FUNC0	0x2c | ||||
| +#define QCA953X_GPIO_REG_OUT_FUNC1	0x30 | ||||
| +#define QCA953X_GPIO_REG_OUT_FUNC2	0x34 | ||||
| +#define QCA953X_GPIO_REG_OUT_FUNC3	0x38 | ||||
| +#define QCA953X_GPIO_REG_OUT_FUNC4	0x3c | ||||
| +#define QCA953X_GPIO_REG_IN_ENABLE0	0x44 | ||||
| +#define QCA953X_GPIO_REG_FUNC		0x6c | ||||
| + | ||||
| +#define QCA953X_GPIO_OUT_MUX_SPI_CS1		10 | ||||
| +#define QCA953X_GPIO_OUT_MUX_SPI_CS2		11 | ||||
| +#define QCA953X_GPIO_OUT_MUX_SPI_CS0		9 | ||||
| +#define QCA953X_GPIO_OUT_MUX_SPI_CLK		8 | ||||
| +#define QCA953X_GPIO_OUT_MUX_SPI_MOSI		12 | ||||
| +#define QCA953X_GPIO_OUT_MUX_LED_LINK1		41 | ||||
| +#define QCA953X_GPIO_OUT_MUX_LED_LINK2		42 | ||||
| +#define QCA953X_GPIO_OUT_MUX_LED_LINK3		43 | ||||
| +#define QCA953X_GPIO_OUT_MUX_LED_LINK4		44 | ||||
| +#define QCA953X_GPIO_OUT_MUX_LED_LINK5		45 | ||||
| + | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC0	0x2c | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC1	0x30 | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC2	0x34 | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC3	0x38 | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC4	0x3c | ||||
| +#define QCA955X_GPIO_REG_OUT_FUNC5	0x40 | ||||
| +#define QCA955X_GPIO_REG_FUNC		0x6c | ||||
| + | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC0	0x2c | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC1	0x30 | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC2	0x34 | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC3	0x38 | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC4	0x3c | ||||
| +#define QCA956X_GPIO_REG_OUT_FUNC5	0x40 | ||||
| +#define QCA956X_GPIO_REG_IN_ENABLE0	0x44 | ||||
| +#define QCA956X_GPIO_REG_IN_ENABLE3	0x50 | ||||
| +#define QCA956X_GPIO_REG_FUNC		0x6c | ||||
| + | ||||
| +#define QCA956X_GPIO_OUT_MUX_GE0_MDO	32 | ||||
| +#define QCA956X_GPIO_OUT_MUX_GE0_MDC	33 | ||||
| + | ||||
|  #define AR71XX_GPIO_COUNT		16 | ||||
|  #define AR7240_GPIO_COUNT		18 | ||||
|  #define AR7241_GPIO_COUNT		20 | ||||
|  #define AR913X_GPIO_COUNT		22 | ||||
|  #define AR933X_GPIO_COUNT		30 | ||||
|  #define AR934X_GPIO_COUNT		23 | ||||
| +#define QCA953X_GPIO_COUNT		18 | ||||
|  #define QCA955X_GPIO_COUNT		24 | ||||
| +#define QCA956X_GPIO_COUNT		23 | ||||
|   | ||||
|  /* | ||||
|   * SRIF block | ||||
| @@ -552,4 +1007,318 @@ | ||||
|  #define AR934X_SRIF_DPLL2_OUTDIV_SHIFT	13 | ||||
|  #define AR934X_SRIF_DPLL2_OUTDIV_MASK	0x7 | ||||
|   | ||||
| +#define QCA953X_SRIF_CPU_DPLL1_REG	0x1c0 | ||||
| +#define QCA953X_SRIF_CPU_DPLL2_REG	0x1c4 | ||||
| +#define QCA953X_SRIF_CPU_DPLL3_REG	0x1c8 | ||||
| + | ||||
| +#define QCA953X_SRIF_DDR_DPLL1_REG	0x240 | ||||
| +#define QCA953X_SRIF_DDR_DPLL2_REG	0x244 | ||||
| +#define QCA953X_SRIF_DDR_DPLL3_REG	0x248 | ||||
| + | ||||
| +#define QCA953X_SRIF_DPLL1_REFDIV_SHIFT	27 | ||||
| +#define QCA953X_SRIF_DPLL1_REFDIV_MASK	0x1f | ||||
| +#define QCA953X_SRIF_DPLL1_NINT_SHIFT	18 | ||||
| +#define QCA953X_SRIF_DPLL1_NINT_MASK	0x1ff | ||||
| +#define QCA953X_SRIF_DPLL1_NFRAC_MASK	0x0003ffff | ||||
| + | ||||
| +#define QCA953X_SRIF_DPLL2_LOCAL_PLL	BIT(30) | ||||
| +#define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT	13 | ||||
| +#define QCA953X_SRIF_DPLL2_OUTDIV_MASK	0x7 | ||||
| + | ||||
| +#define AR71XX_GPIO_FUNC_STEREO_EN		BIT(17) | ||||
| +#define AR71XX_GPIO_FUNC_SLIC_EN		BIT(16) | ||||
| +#define AR71XX_GPIO_FUNC_SPI_CS2_EN		BIT(13) | ||||
| +#define AR71XX_GPIO_FUNC_SPI_CS1_EN		BIT(12) | ||||
| +#define AR71XX_GPIO_FUNC_UART_EN		BIT(8) | ||||
| +#define AR71XX_GPIO_FUNC_USB_OC_EN		BIT(4) | ||||
| +#define AR71XX_GPIO_FUNC_USB_CLK_EN		BIT(0) | ||||
| + | ||||
| +#define AR724X_GPIO_FUNC_GE0_MII_CLK_EN		BIT(19) | ||||
| +#define AR724X_GPIO_FUNC_SPI_EN			BIT(18) | ||||
| +#define AR724X_GPIO_FUNC_SPI_CS_EN2		BIT(14) | ||||
| +#define AR724X_GPIO_FUNC_SPI_CS_EN1		BIT(13) | ||||
| +#define AR724X_GPIO_FUNC_CLK_OBS5_EN		BIT(12) | ||||
| +#define AR724X_GPIO_FUNC_CLK_OBS4_EN		BIT(11) | ||||
| +#define AR724X_GPIO_FUNC_CLK_OBS3_EN		BIT(10) | ||||
| +#define AR724X_GPIO_FUNC_CLK_OBS2_EN		BIT(9) | ||||
| +#define AR724X_GPIO_FUNC_CLK_OBS1_EN		BIT(8) | ||||
| +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN	BIT(7) | ||||
| +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN	BIT(6) | ||||
| +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN	BIT(5) | ||||
| +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN	BIT(4) | ||||
| +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN	BIT(3) | ||||
| +#define AR724X_GPIO_FUNC_UART_RTS_CTS_EN	BIT(2) | ||||
| +#define AR724X_GPIO_FUNC_UART_EN		BIT(1) | ||||
| +#define AR724X_GPIO_FUNC_JTAG_DISABLE		BIT(0) | ||||
| + | ||||
| +#define AR913X_GPIO_FUNC_WMAC_LED_EN		BIT(22) | ||||
| +#define AR913X_GPIO_FUNC_EXP_PORT_CS_EN		BIT(21) | ||||
| +#define AR913X_GPIO_FUNC_I2S_REFCLKEN		BIT(20) | ||||
| +#define AR913X_GPIO_FUNC_I2S_MCKEN		BIT(19) | ||||
| +#define AR913X_GPIO_FUNC_I2S1_EN		BIT(18) | ||||
| +#define AR913X_GPIO_FUNC_I2S0_EN		BIT(17) | ||||
| +#define AR913X_GPIO_FUNC_SLIC_EN		BIT(16) | ||||
| +#define AR913X_GPIO_FUNC_UART_RTSCTS_EN		BIT(9) | ||||
| +#define AR913X_GPIO_FUNC_UART_EN		BIT(8) | ||||
| +#define AR913X_GPIO_FUNC_USB_CLK_EN		BIT(4) | ||||
| + | ||||
| +#define AR933X_GPIO_FUNC_SPDIF2TCK		BIT(31) | ||||
| +#define AR933X_GPIO_FUNC_SPDIF_EN		BIT(30) | ||||
| +#define AR933X_GPIO_FUNC_I2SO_22_18_EN		BIT(29) | ||||
| +#define AR933X_GPIO_FUNC_I2S_MCK_EN		BIT(27) | ||||
| +#define AR933X_GPIO_FUNC_I2SO_EN		BIT(26) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_DUPL	BIT(25) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_COLL	BIT(24) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_ACT	BIT(23) | ||||
| +#define AR933X_GPIO_FUNC_SPI_EN			BIT(18) | ||||
| +#define AR933X_GPIO_FUNC_SPI_CS_EN2		BIT(14) | ||||
| +#define AR933X_GPIO_FUNC_SPI_CS_EN1		BIT(13) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN	BIT(7) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN	BIT(6) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN	BIT(5) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN	BIT(4) | ||||
| +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN	BIT(3) | ||||
| +#define AR933X_GPIO_FUNC_UART_RTS_CTS_EN	BIT(2) | ||||
| +#define AR933X_GPIO_FUNC_UART_EN		BIT(1) | ||||
| +#define AR933X_GPIO_FUNC_JTAG_DISABLE		BIT(0) | ||||
| + | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS7_EN		BIT(9) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS6_EN		BIT(8) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS5_EN		BIT(7) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS4_EN		BIT(6) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS3_EN		BIT(5) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS2_EN		BIT(4) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS1_EN		BIT(3) | ||||
| +#define AR934X_GPIO_FUNC_CLK_OBS0_EN		BIT(2) | ||||
| +#define AR934X_GPIO_FUNC_JTAG_DISABLE		BIT(1) | ||||
| + | ||||
| +#define AR934X_GPIO_OUT_GPIO		0 | ||||
| +#define AR934X_GPIO_OUT_SPI_CS1	7 | ||||
| +#define AR934X_GPIO_OUT_LED_LINK0	41 | ||||
| +#define AR934X_GPIO_OUT_LED_LINK1	42 | ||||
| +#define AR934X_GPIO_OUT_LED_LINK2	43 | ||||
| +#define AR934X_GPIO_OUT_LED_LINK3	44 | ||||
| +#define AR934X_GPIO_OUT_LED_LINK4	45 | ||||
| +#define AR934X_GPIO_OUT_EXT_LNA0	46 | ||||
| +#define AR934X_GPIO_OUT_EXT_LNA1	47 | ||||
| + | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS7_EN		BIT(9) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS6_EN		BIT(8) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS5_EN		BIT(7) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS4_EN		BIT(6) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS3_EN		BIT(5) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS2_EN		BIT(4) | ||||
| +#define QCA955X_GPIO_FUNC_CLK_OBS1_EN		BIT(3) | ||||
| +#define QCA955X_GPIO_FUNC_JTAG_DISABLE		BIT(1) | ||||
| + | ||||
| +#define QCA955X_GPIO_OUT_GPIO		0 | ||||
| +#define QCA955X_MII_EXT_MDI		1 | ||||
| +#define QCA955X_SLIC_DATA_OUT		3 | ||||
| +#define QCA955X_SLIC_PCM_FS		4 | ||||
| +#define QCA955X_SLIC_PCM_CLK		5 | ||||
| +#define QCA955X_SPI_CLK			8 | ||||
| +#define QCA955X_SPI_CS_0		9 | ||||
| +#define QCA955X_SPI_CS_1		10 | ||||
| +#define QCA955X_SPI_CS_2		11 | ||||
| +#define QCA955X_SPI_MISO		12 | ||||
| +#define QCA955X_I2S_CLK			13 | ||||
| +#define QCA955X_I2S_WS			14 | ||||
| +#define QCA955X_I2S_SD			15 | ||||
| +#define QCA955X_I2S_MCK			16 | ||||
| +#define QCA955X_SPDIF_OUT		17 | ||||
| +#define QCA955X_UART1_TD		18 | ||||
| +#define QCA955X_UART1_RTS		19 | ||||
| +#define QCA955X_UART1_RD		20 | ||||
| +#define QCA955X_UART1_CTS		21 | ||||
| +#define QCA955X_UART0_SOUT		22 | ||||
| +#define QCA955X_SPDIF2_OUT		23 | ||||
| +#define QCA955X_LED_SGMII_SPEED0	24 | ||||
| +#define QCA955X_LED_SGMII_SPEED1	25 | ||||
| +#define QCA955X_LED_SGMII_DUPLEX	26 | ||||
| +#define QCA955X_LED_SGMII_LINK_UP	27 | ||||
| +#define QCA955X_SGMII_SPEED0_INVERT	28 | ||||
| +#define QCA955X_SGMII_SPEED1_INVERT	29 | ||||
| +#define QCA955X_SGMII_DUPLEX_INVERT	30 | ||||
| +#define QCA955X_SGMII_LINK_UP_INVERT	31 | ||||
| +#define QCA955X_GE1_MII_MDO		32 | ||||
| +#define QCA955X_GE1_MII_MDC		33 | ||||
| +#define QCA955X_SWCOM2			38 | ||||
| +#define QCA955X_SWCOM3			39 | ||||
| +#define QCA955X_MAC2_GPIO		40 | ||||
| +#define QCA955X_MAC3_GPIO		41 | ||||
| +#define QCA955X_ATT_LED			42 | ||||
| +#define QCA955X_PWR_LED			43 | ||||
| +#define QCA955X_TX_FRAME		44 | ||||
| +#define QCA955X_RX_CLEAR_EXTERNAL	45 | ||||
| +#define QCA955X_LED_NETWORK_EN		46 | ||||
| +#define QCA955X_LED_POWER_EN		47 | ||||
| +#define QCA955X_WMAC_GLUE_WOW		68 | ||||
| +#define QCA955X_RX_CLEAR_EXTENSION	70 | ||||
| +#define QCA955X_CP_NAND_CS1		73 | ||||
| +#define QCA955X_USB_SUSPEND		74 | ||||
| +#define QCA955X_ETH_TX_ERR		75 | ||||
| +#define QCA955X_DDR_DQ_OE		76 | ||||
| +#define QCA955X_CLKREQ_N_EP		77 | ||||
| +#define QCA955X_CLKREQ_N_RC		78 | ||||
| +#define QCA955X_CLK_OBS0		79 | ||||
| +#define QCA955X_CLK_OBS1		80 | ||||
| +#define QCA955X_CLK_OBS2		81 | ||||
| +#define QCA955X_CLK_OBS3		82 | ||||
| +#define QCA955X_CLK_OBS4		83 | ||||
| +#define QCA955X_CLK_OBS5		84 | ||||
| + | ||||
| +/* | ||||
| + * MII_CTRL block | ||||
| + */ | ||||
| +#define AR71XX_MII_REG_MII0_CTRL	0x00 | ||||
| +#define AR71XX_MII_REG_MII1_CTRL	0x04 | ||||
| + | ||||
| +#define AR71XX_MII_CTRL_IF_MASK		3 | ||||
| +#define AR71XX_MII_CTRL_SPEED_SHIFT	4 | ||||
| +#define AR71XX_MII_CTRL_SPEED_MASK	3 | ||||
| +#define AR71XX_MII_CTRL_SPEED_10	0 | ||||
| +#define AR71XX_MII_CTRL_SPEED_100	1 | ||||
| +#define AR71XX_MII_CTRL_SPEED_1000	2 | ||||
| + | ||||
| +#define AR71XX_MII0_CTRL_IF_GMII	0 | ||||
| +#define AR71XX_MII0_CTRL_IF_MII		1 | ||||
| +#define AR71XX_MII0_CTRL_IF_RGMII	2 | ||||
| +#define AR71XX_MII0_CTRL_IF_RMII	3 | ||||
| + | ||||
| +#define AR71XX_MII1_CTRL_IF_RGMII	0 | ||||
| +#define AR71XX_MII1_CTRL_IF_RMII	1 | ||||
| + | ||||
| +/* | ||||
| + * AR933X GMAC interface | ||||
| + */ | ||||
| +#define AR933X_GMAC_REG_ETH_CFG		0x00 | ||||
| + | ||||
| +#define AR933X_ETH_CFG_RGMII_GE0	BIT(0) | ||||
| +#define AR933X_ETH_CFG_MII_GE0		BIT(1) | ||||
| +#define AR933X_ETH_CFG_GMII_GE0		BIT(2) | ||||
| +#define AR933X_ETH_CFG_MII_GE0_MASTER	BIT(3) | ||||
| +#define AR933X_ETH_CFG_MII_GE0_SLAVE	BIT(4) | ||||
| +#define AR933X_ETH_CFG_MII_GE0_ERR_EN	BIT(5) | ||||
| +#define AR933X_ETH_CFG_SW_PHY_SWAP	BIT(7) | ||||
| +#define AR933X_ETH_CFG_SW_PHY_ADDR_SWAP	BIT(8) | ||||
| +#define AR933X_ETH_CFG_RMII_GE0		BIT(9) | ||||
| +#define AR933X_ETH_CFG_RMII_GE0_SPD_10	0 | ||||
| +#define AR933X_ETH_CFG_RMII_GE0_SPD_100	BIT(10) | ||||
| + | ||||
| +/* | ||||
| + * AR934X GMAC Interface | ||||
| + */ | ||||
| +#define AR934X_GMAC_REG_ETH_CFG		0x00 | ||||
| + | ||||
| +#define AR934X_ETH_CFG_RGMII_GMAC0	BIT(0) | ||||
| +#define AR934X_ETH_CFG_MII_GMAC0	BIT(1) | ||||
| +#define AR934X_ETH_CFG_GMII_GMAC0	BIT(2) | ||||
| +#define AR934X_ETH_CFG_MII_GMAC0_MASTER	BIT(3) | ||||
| +#define AR934X_ETH_CFG_MII_GMAC0_SLAVE	BIT(4) | ||||
| +#define AR934X_ETH_CFG_MII_GMAC0_ERR_EN	BIT(5) | ||||
| +#define AR934X_ETH_CFG_SW_ONLY_MODE	BIT(6) | ||||
| +#define AR934X_ETH_CFG_SW_PHY_SWAP	BIT(7) | ||||
| +#define AR934X_ETH_CFG_SW_APB_ACCESS	BIT(9) | ||||
| +#define AR934X_ETH_CFG_RMII_GMAC0	BIT(10) | ||||
| +#define AR933X_ETH_CFG_MII_CNTL_SPEED	BIT(11) | ||||
| +#define AR934X_ETH_CFG_RMII_GMAC0_MASTER BIT(12) | ||||
| +#define AR933X_ETH_CFG_SW_ACC_MSB_FIRST	BIT(13) | ||||
| +#define AR934X_ETH_CFG_RXD_DELAY        BIT(14) | ||||
| +#define AR934X_ETH_CFG_RXD_DELAY_MASK   0x3 | ||||
| +#define AR934X_ETH_CFG_RXD_DELAY_SHIFT  14 | ||||
| +#define AR934X_ETH_CFG_RDV_DELAY        BIT(16) | ||||
| +#define AR934X_ETH_CFG_RDV_DELAY_MASK   0x3 | ||||
| +#define AR934X_ETH_CFG_RDV_DELAY_SHIFT  16 | ||||
| + | ||||
| +/* | ||||
| + * QCA953X GMAC Interface | ||||
| + */ | ||||
| +#define QCA953X_GMAC_REG_ETH_CFG		0x00 | ||||
| + | ||||
| +#define QCA953X_ETH_CFG_SW_ONLY_MODE		BIT(6) | ||||
| +#define QCA953X_ETH_CFG_SW_PHY_SWAP		BIT(7) | ||||
| +#define QCA953X_ETH_CFG_SW_APB_ACCESS		BIT(9) | ||||
| +#define QCA953X_ETH_CFG_SW_ACC_MSB_FIRST	BIT(13) | ||||
| + | ||||
| +/* | ||||
| + * QCA955X GMAC Interface | ||||
| + */ | ||||
| + | ||||
| +#define QCA955X_GMAC_REG_ETH_CFG	0x00 | ||||
| +#define QCA955X_GMAC_REG_SGMII_SERDES	0x18 | ||||
| + | ||||
| +#define QCA955X_ETH_CFG_RGMII_EN	BIT(0) | ||||
| +#define QCA955X_ETH_CFG_MII_GE0		BIT(1) | ||||
| +#define QCA955X_ETH_CFG_GMII_GE0	BIT(2) | ||||
| +#define QCA955X_ETH_CFG_MII_GE0_MASTER	BIT(3) | ||||
| +#define QCA955X_ETH_CFG_MII_GE0_SLAVE	BIT(4) | ||||
| +#define QCA955X_ETH_CFG_GE0_ERR_EN	BIT(5) | ||||
| +#define QCA955X_ETH_CFG_GE0_SGMII	BIT(6) | ||||
| +#define QCA955X_ETH_CFG_RMII_GE0	BIT(10) | ||||
| +#define QCA955X_ETH_CFG_MII_CNTL_SPEED	BIT(11) | ||||
| +#define QCA955X_ETH_CFG_RMII_GE0_MASTER	BIT(12) | ||||
| +#define QCA955X_ETH_CFG_RXD_DELAY_MASK	0x3 | ||||
| +#define QCA955X_ETH_CFG_RXD_DELAY_SHIFT	14 | ||||
| +#define QCA955X_ETH_CFG_RDV_DELAY	BIT(16) | ||||
| +#define QCA955X_ETH_CFG_RDV_DELAY_MASK	0x3 | ||||
| +#define QCA955X_ETH_CFG_RDV_DELAY_SHIFT	16 | ||||
| +#define QCA955X_ETH_CFG_TXD_DELAY_MASK	0x3 | ||||
| +#define QCA955X_ETH_CFG_TXD_DELAY_SHIFT	18 | ||||
| +#define QCA955X_ETH_CFG_TXE_DELAY_MASK	0x3 | ||||
| +#define QCA955X_ETH_CFG_TXE_DELAY_SHIFT	20 | ||||
| + | ||||
| +#define QCA955X_SGMII_SERDES_LOCK_DETECT_STATUS	BIT(15) | ||||
| +#define QCA955X_SGMII_SERDES_RES_CALIBRATION_SHIFT 23 | ||||
| +#define QCA955X_SGMII_SERDES_RES_CALIBRATION_MASK 0xf | ||||
| +/* | ||||
| + * QCA956X GMAC Interface | ||||
| + */ | ||||
| + | ||||
| +#define QCA956X_GMAC_REG_ETH_CFG	0x00 | ||||
| +#define QCA956X_GMAC_REG_SGMII_RESET	0x14 | ||||
| +#define QCA956X_GMAC_REG_SGMII_SERDES	0x18 | ||||
| +#define QCA956X_GMAC_REG_MR_AN_CONTROL	0x1c | ||||
| +#define QCA956X_GMAC_REG_SGMII_CONFIG	0x34 | ||||
| +#define QCA956X_GMAC_REG_SGMII_DEBUG	0x58 | ||||
| + | ||||
| +#define QCA956X_ETH_CFG_RGMII_EN		BIT(0) | ||||
| +#define QCA956X_ETH_CFG_GE0_SGMII		BIT(6) | ||||
| +#define QCA956X_ETH_CFG_SW_ONLY_MODE		BIT(7) | ||||
| +#define QCA956X_ETH_CFG_SW_PHY_SWAP		BIT(8) | ||||
| +#define QCA956X_ETH_CFG_SW_PHY_ADDR_SWAP	BIT(9) | ||||
| +#define QCA956X_ETH_CFG_SW_APB_ACCESS		BIT(10) | ||||
| +#define QCA956X_ETH_CFG_SW_ACC_MSB_FIRST	BIT(13) | ||||
| +#define QCA956X_ETH_CFG_RXD_DELAY_MASK		0x3 | ||||
| +#define QCA956X_ETH_CFG_RXD_DELAY_SHIFT		14 | ||||
| +#define QCA956X_ETH_CFG_RDV_DELAY_MASK		0x3 | ||||
| +#define QCA956X_ETH_CFG_RDV_DELAY_SHIFT		16 | ||||
| + | ||||
| +#define QCA956X_SGMII_RESET_RX_CLK_N_RESET	0x0 | ||||
| +#define QCA956X_SGMII_RESET_RX_CLK_N		BIT(0) | ||||
| +#define QCA956X_SGMII_RESET_TX_CLK_N		BIT(1) | ||||
| +#define QCA956X_SGMII_RESET_RX_125M_N		BIT(2) | ||||
| +#define QCA956X_SGMII_RESET_TX_125M_N		BIT(3) | ||||
| +#define QCA956X_SGMII_RESET_HW_RX_125M_N	BIT(4) | ||||
| + | ||||
| +#define QCA956X_SGMII_SERDES_CDR_BW_MASK	0x3 | ||||
| +#define QCA956X_SGMII_SERDES_CDR_BW_SHIFT	1 | ||||
| +#define QCA956X_SGMII_SERDES_TX_DR_CTRL_MASK	0x7 | ||||
| +#define QCA956X_SGMII_SERDES_TX_DR_CTRL_SHIFT	4 | ||||
| +#define QCA956X_SGMII_SERDES_PLL_BW		BIT(8) | ||||
| +#define QCA956X_SGMII_SERDES_VCO_FAST		BIT(9) | ||||
| +#define QCA956X_SGMII_SERDES_VCO_SLOW		BIT(10) | ||||
| +#define QCA956X_SGMII_SERDES_LOCK_DETECT_STATUS	BIT(15) | ||||
| +#define QCA956X_SGMII_SERDES_EN_SIGNAL_DETECT	BIT(16) | ||||
| +#define QCA956X_SGMII_SERDES_FIBER_SDO		BIT(17) | ||||
| +#define QCA956X_SGMII_SERDES_RES_CALIBRATION_SHIFT 23 | ||||
| +#define QCA956X_SGMII_SERDES_RES_CALIBRATION_MASK 0xf | ||||
| +#define QCA956X_SGMII_SERDES_VCO_REG_SHIFT	27 | ||||
| +#define QCA956X_SGMII_SERDES_VCO_REG_MASK	0xf | ||||
| + | ||||
| +#define QCA956X_MR_AN_CONTROL_AN_ENABLE		BIT(12) | ||||
| +#define QCA956X_MR_AN_CONTROL_PHY_RESET		BIT(15) | ||||
| + | ||||
| +#define QCA956X_SGMII_CONFIG_MODE_CTRL_SHIFT	0 | ||||
| +#define QCA956X_SGMII_CONFIG_MODE_CTRL_MASK	0x7 | ||||
| + | ||||
|  #endif /* __ASM_MACH_AR71XX_REGS_H */ | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,25 @@ | ||||
| From f3d5027255ef0752ed12b65c3bf7eb363fc3c096 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 10:00:55 +0100 | ||||
| Subject: [PATCH 10/27] MIPS: ath79: select the PINCTRL subsystem | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/Kconfig | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
|  | ||||
| diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig | ||||
| index 8128c3b68d6b..922a53cb1b3d 100644 | ||||
| --- a/arch/mips/Kconfig | ||||
| +++ b/arch/mips/Kconfig | ||||
| @@ -188,6 +188,7 @@ config ATH79 | ||||
|  	select CSRC_R4K | ||||
|  	select DMA_NONCOHERENT | ||||
|  	select GPIOLIB | ||||
| +	select PINCTRL | ||||
|  	select HAVE_CLK | ||||
|  	select COMMON_CLK | ||||
|  	select CLKDEV_LOOKUP | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,32 @@ | ||||
| From 54204ef3edbb1aa2390cabba61fe185a12cc39f0 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Tue, 6 Mar 2018 08:35:44 +0100 | ||||
| Subject: [PATCH 11/27] MIPS: ath79: fix register address in | ||||
|  ath79_ddr_wb_flush() | ||||
|  | ||||
| ath79_ddr_wb_flush_base has the type void __iomem *, so register offsets | ||||
| need to be a multiple of 4. | ||||
|  | ||||
| Cc: Alban Bedel <albeu@free.fr> | ||||
| Fixes: 24b0e3e84fbf ("MIPS: ath79: Improve the DDR controller interface") | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
|  arch/mips/ath79/common.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c | ||||
| index 10a405d593df..c782b10ddf50 100644 | ||||
| --- a/arch/mips/ath79/common.c | ||||
| +++ b/arch/mips/ath79/common.c | ||||
| @@ -58,7 +58,7 @@ EXPORT_SYMBOL_GPL(ath79_ddr_ctrl_init); | ||||
|   | ||||
|  void ath79_ddr_wb_flush(u32 reg) | ||||
|  { | ||||
| -	void __iomem *flush_reg = ath79_ddr_wb_flush_base + reg; | ||||
| +	void __iomem *flush_reg = ath79_ddr_wb_flush_base + (reg * 4); | ||||
|   | ||||
|  	/* Flush the DDR write buffer. */ | ||||
|  	__raw_writel(0x1, flush_reg); | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,47 @@ | ||||
| From ac3a5ee699f3baa7654c93a3ffda46be82443344 Mon Sep 17 00:00:00 2001 | ||||
| From: Markos Chandras <markos.chandras@imgtec.com> | ||||
| Date: Wed, 21 Aug 2013 11:47:22 +0100 | ||||
| Subject: [PATCH 12/27] MIPS: ath79: Avoid using unitialized 'reg' variable | ||||
|  | ||||
| Fixes the following build error: | ||||
| arch/mips/include/asm/mach-ath79/ath79.h:139:20: error: 'reg' may be used | ||||
| uninitialized in this function [-Werror=maybe-uninitialized] | ||||
| arch/mips/ath79/common.c:62:6: note: 'reg' was declared here | ||||
| In file included from arch/mips/ath79/common.c:20:0: | ||||
| arch/mips/ath79/common.c: In function 'ath79_device_reset_clear': | ||||
| arch/mips/include/asm/mach-ath79/ath79.h:139:20: | ||||
| error: 'reg' may be used uninitialized in this function | ||||
| [-Werror=maybe-uninitialized] | ||||
| arch/mips/ath79/common.c:90:6: note: 'reg' was declared here | ||||
|  | ||||
| Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> | ||||
| Acked-by: Gabor Juhos <juhosg@openwrt.org> | ||||
| --- | ||||
|  arch/mips/ath79/common.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c | ||||
| index c782b10ddf50..a32a9181a296 100644 | ||||
| --- a/arch/mips/ath79/common.c | ||||
| +++ b/arch/mips/ath79/common.c | ||||
| @@ -106,7 +106,7 @@ void ath79_device_reset_set(u32 mask) | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
| -		BUG(); | ||||
| +		panic("Reset register not defined for this SOC"); | ||||
|   | ||||
|  	spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||||
|  	t = ath79_reset_rr(reg); | ||||
| @@ -134,7 +134,7 @@ void ath79_device_reset_clear(u32 mask) | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
| -		BUG(); | ||||
| +		panic("Reset register not defined for this SOC"); | ||||
|   | ||||
|  	spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||||
|  	t = ath79_reset_rr(reg); | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,39 @@ | ||||
| From 11562939754b8f877562d9a137854022eb521716 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Mon, 5 Mar 2018 11:33:54 +0100 | ||||
| Subject: [PATCH 13/27] MIPS: ath79: fix system restart | ||||
|  | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/ath79/setup.c                  | 1 + | ||||
|  arch/mips/include/asm/mach-ath79/ath79.h | 1 + | ||||
|  2 files changed, 2 insertions(+) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c | ||||
| index f206dafbb0a3..26a058d58d37 100644 | ||||
| --- a/arch/mips/ath79/setup.c | ||||
| +++ b/arch/mips/ath79/setup.c | ||||
| @@ -40,6 +40,7 @@ static char ath79_sys_type[ATH79_SYS_TYPE_LEN]; | ||||
|   | ||||
|  static void ath79_restart(char *command) | ||||
|  { | ||||
| +	local_irq_disable(); | ||||
|  	ath79_device_reset_set(AR71XX_RESET_FULL_CHIP); | ||||
|  	for (;;) | ||||
|  		if (cpu_wait) | ||||
| diff --git a/arch/mips/include/asm/mach-ath79/ath79.h b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| index 441faa92c3cd..6e6c0fead776 100644 | ||||
| --- a/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| +++ b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| @@ -134,6 +134,7 @@ static inline u32 ath79_pll_rr(unsigned reg) | ||||
|  static inline void ath79_reset_wr(unsigned reg, u32 val) | ||||
|  { | ||||
|  	__raw_writel(val, ath79_reset_base + reg); | ||||
| +	(void) __raw_readl(ath79_reset_base + reg); /* flush */ | ||||
|  } | ||||
|   | ||||
|  static inline u32 ath79_reset_rr(unsigned reg) | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,43 @@ | ||||
| From 5a8496923bafc4350f51b26964fdc3252a09fd79 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Mon, 5 Mar 2018 11:35:29 +0100 | ||||
| Subject: [PATCH 14/27] MIPS: ath79: finetune cpu-overrides | ||||
|  | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
|  arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
|  | ||||
| diff --git a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | ||||
| index 0089a740e5ae..026ad90c8ac0 100644 | ||||
| --- a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | ||||
| +++ b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | ||||
| @@ -36,6 +36,7 @@ | ||||
|  #define cpu_has_mdmx		0 | ||||
|  #define cpu_has_mips3d		0 | ||||
|  #define cpu_has_smartmips	0 | ||||
| +#define cpu_has_rixi		0 | ||||
|   | ||||
|  #define cpu_has_mips32r1	1 | ||||
|  #define cpu_has_mips32r2	1 | ||||
| @@ -43,6 +44,7 @@ | ||||
|  #define cpu_has_mips64r2	0 | ||||
|   | ||||
|  #define cpu_has_mipsmt		0 | ||||
| +#define cpu_has_userlocal	0 | ||||
|   | ||||
|  #define cpu_has_64bits		0 | ||||
|  #define cpu_has_64bit_zero_reg	0 | ||||
| @@ -51,5 +53,9 @@ | ||||
|   | ||||
|  #define cpu_dcache_line_size()	32 | ||||
|  #define cpu_icache_line_size()	32 | ||||
| +#define cpu_has_vtag_icache	0 | ||||
| +#define cpu_has_dc_aliases	1 | ||||
| +#define cpu_has_ic_fills_f_dc	0 | ||||
| +#define cpu_has_pindexed_dcache	0 | ||||
|   | ||||
|  #endif /* __ASM_MACH_ATH79_CPU_FEATURE_OVERRIDES_H */ | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,76 @@ | ||||
| From b14f8260724abec6c82970085dece6a143d3a0db Mon Sep 17 00:00:00 2001 | ||||
| From: Gabor Juhos <juhosg@openwrt.org> | ||||
| Date: Mon, 5 Mar 2018 11:38:21 +0100 | ||||
| Subject: [PATCH 15/27] MIPS: ath79: enable uart during early_prink | ||||
|  | ||||
| Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | ||||
| --- | ||||
|  arch/mips/ath79/early_printk.c | 44 +++++++++++++++++++++++++++++++++++++++++- | ||||
|  1 file changed, 43 insertions(+), 1 deletion(-) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/early_printk.c b/arch/mips/ath79/early_printk.c | ||||
| index d1adc59af5bf..ec3978678653 100644 | ||||
| --- a/arch/mips/ath79/early_printk.c | ||||
| +++ b/arch/mips/ath79/early_printk.c | ||||
| @@ -58,6 +58,46 @@ static void prom_putchar_dummy(unsigned char ch) | ||||
|  	/* nothing to do */ | ||||
|  } | ||||
|   | ||||
| +static void prom_enable_uart(u32 id) | ||||
| +{ | ||||
| +	void __iomem *gpio_base; | ||||
| +	u32 uart_en; | ||||
| +	u32 t; | ||||
| + | ||||
| +	switch (id) { | ||||
| +	case REV_ID_MAJOR_AR71XX: | ||||
| +		uart_en = AR71XX_GPIO_FUNC_UART_EN; | ||||
| +		break; | ||||
| + | ||||
| +	case REV_ID_MAJOR_AR7240: | ||||
| +	case REV_ID_MAJOR_AR7241: | ||||
| +	case REV_ID_MAJOR_AR7242: | ||||
| +		uart_en = AR724X_GPIO_FUNC_UART_EN; | ||||
| +		break; | ||||
| + | ||||
| +	case REV_ID_MAJOR_AR913X: | ||||
| +		uart_en = AR913X_GPIO_FUNC_UART_EN; | ||||
| +		break; | ||||
| + | ||||
| +	case REV_ID_MAJOR_AR9330: | ||||
| +	case REV_ID_MAJOR_AR9331: | ||||
| +		uart_en = AR933X_GPIO_FUNC_UART_EN; | ||||
| +		break; | ||||
| + | ||||
| +	case REV_ID_MAJOR_AR9341: | ||||
| +	case REV_ID_MAJOR_AR9342: | ||||
| +	case REV_ID_MAJOR_AR9344: | ||||
| +		/* TODO */ | ||||
| +	default: | ||||
| +		return; | ||||
| +	} | ||||
| + | ||||
| +	gpio_base = (void __iomem *)(KSEG1ADDR(AR71XX_GPIO_BASE)); | ||||
| +	t = __raw_readl(gpio_base + AR71XX_GPIO_REG_FUNC); | ||||
| +	t |= uart_en; | ||||
| +	__raw_writel(t, gpio_base + AR71XX_GPIO_REG_FUNC); | ||||
| +} | ||||
| + | ||||
|  static void prom_putchar_init(void) | ||||
|  { | ||||
|  	void __iomem *base; | ||||
| @@ -88,8 +128,10 @@ static void prom_putchar_init(void) | ||||
|   | ||||
|  	default: | ||||
|  		_prom_putchar = prom_putchar_dummy; | ||||
| -		break; | ||||
| +		return; | ||||
|  	} | ||||
| + | ||||
| +	prom_enable_uart(id); | ||||
|  } | ||||
|   | ||||
|  void prom_putchar(unsigned char ch) | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,350 @@ | ||||
| From cff23ba486e3c5d17c4d7e446f5eddead855c101 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 08:45:55 +0100 | ||||
| Subject: [PATCH 16/27] MIPS: ath79: add support for QCA953x SoC | ||||
|  | ||||
| Note that the clock calculation looks very similar to the QCA955x, but the | ||||
| meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed. | ||||
|  | ||||
| Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| --- | ||||
|  arch/mips/ath79/Kconfig                  |  6 ++- | ||||
|  arch/mips/ath79/clock.c                  | 87 ++++++++++++++++++++++++++++++++ | ||||
|  arch/mips/ath79/common.c                 |  4 ++ | ||||
|  arch/mips/ath79/dev-common.c             |  4 ++ | ||||
|  arch/mips/ath79/early_printk.c           |  2 + | ||||
|  arch/mips/ath79/irq.c                    | 33 +++++++++++- | ||||
|  arch/mips/ath79/setup.c                  | 21 ++++++-- | ||||
|  arch/mips/include/asm/mach-ath79/ath79.h | 11 ++++ | ||||
|  8 files changed, 162 insertions(+), 6 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig | ||||
| index 9547cf1ea38d..b03f5c8b9d1e 100644 | ||||
| --- a/arch/mips/ath79/Kconfig | ||||
| +++ b/arch/mips/ath79/Kconfig | ||||
| @@ -94,6 +94,10 @@ config SOC_AR934X | ||||
|  	select PCI_AR724X if PCI | ||||
|  	def_bool n | ||||
|   | ||||
| +config SOC_QCA953X | ||||
| +	select USB_ARCH_HAS_EHCI | ||||
| +	def_bool n | ||||
| + | ||||
|  config SOC_QCA955X | ||||
|  	select HW_HAS_PCI | ||||
|  	select PCI_AR724X if PCI | ||||
| @@ -115,7 +119,7 @@ config ATH79_DEV_USB | ||||
|  	def_bool n | ||||
|   | ||||
|  config ATH79_DEV_WMAC | ||||
| -	depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X) | ||||
| +	depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA953X || SOC_QCA955X) | ||||
|  	def_bool n | ||||
|   | ||||
|  endif | ||||
| diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c | ||||
| index 6b1000b6a6a6..b9595b2d1b65 100644 | ||||
| --- a/arch/mips/ath79/clock.c | ||||
| +++ b/arch/mips/ath79/clock.c | ||||
| @@ -355,6 +355,91 @@ static void __init ar934x_clocks_init(void) | ||||
|  	iounmap(dpll_base); | ||||
|  } | ||||
|   | ||||
| +static void __init qca953x_clocks_init(void) | ||||
| +{ | ||||
| +	unsigned long ref_rate; | ||||
| +	unsigned long cpu_rate; | ||||
| +	unsigned long ddr_rate; | ||||
| +	unsigned long ahb_rate; | ||||
| +	u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv; | ||||
| +	u32 cpu_pll, ddr_pll; | ||||
| +	u32 bootstrap; | ||||
| + | ||||
| +	bootstrap = ath79_reset_rr(QCA953X_RESET_REG_BOOTSTRAP); | ||||
| +	if (bootstrap &	QCA953X_BOOTSTRAP_REF_CLK_40) | ||||
| +		ref_rate = 40 * 1000 * 1000; | ||||
| +	else | ||||
| +		ref_rate = 25 * 1000 * 1000; | ||||
| + | ||||
| +	pll = ath79_pll_rr(QCA953X_PLL_CPU_CONFIG_REG); | ||||
| +	out_div = (pll >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & | ||||
| +		  QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK; | ||||
| +	ref_div = (pll >> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT) & | ||||
| +		  QCA953X_PLL_CPU_CONFIG_REFDIV_MASK; | ||||
| +	nint = (pll >> QCA953X_PLL_CPU_CONFIG_NINT_SHIFT) & | ||||
| +	       QCA953X_PLL_CPU_CONFIG_NINT_MASK; | ||||
| +	frac = (pll >> QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT) & | ||||
| +	       QCA953X_PLL_CPU_CONFIG_NFRAC_MASK; | ||||
| + | ||||
| +	cpu_pll = nint * ref_rate / ref_div; | ||||
| +	cpu_pll += frac * (ref_rate >> 6) / ref_div; | ||||
| +	cpu_pll /= (1 << out_div); | ||||
| + | ||||
| +	pll = ath79_pll_rr(QCA953X_PLL_DDR_CONFIG_REG); | ||||
| +	out_div = (pll >> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT) & | ||||
| +		  QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK; | ||||
| +	ref_div = (pll >> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT) & | ||||
| +		  QCA953X_PLL_DDR_CONFIG_REFDIV_MASK; | ||||
| +	nint = (pll >> QCA953X_PLL_DDR_CONFIG_NINT_SHIFT) & | ||||
| +	       QCA953X_PLL_DDR_CONFIG_NINT_MASK; | ||||
| +	frac = (pll >> QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT) & | ||||
| +	       QCA953X_PLL_DDR_CONFIG_NFRAC_MASK; | ||||
| + | ||||
| +	ddr_pll = nint * ref_rate / ref_div; | ||||
| +	ddr_pll += frac * (ref_rate >> 6) / (ref_div << 4); | ||||
| +	ddr_pll /= (1 << out_div); | ||||
| + | ||||
| +	clk_ctrl = ath79_pll_rr(QCA953X_PLL_CLK_CTRL_REG); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) & | ||||
| +		  QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS) | ||||
| +		cpu_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL) | ||||
| +		cpu_rate = cpu_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		cpu_rate = ddr_pll / (postdiv + 1); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) & | ||||
| +		  QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS) | ||||
| +		ddr_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL) | ||||
| +		ddr_rate = ddr_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		ddr_rate = cpu_pll / (postdiv + 1); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) & | ||||
| +		  QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS) | ||||
| +		ahb_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL) | ||||
| +		ahb_rate = ddr_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		ahb_rate = cpu_pll / (postdiv + 1); | ||||
| + | ||||
| +	ath79_add_sys_clkdev("ref", ref_rate); | ||||
| +	ath79_add_sys_clkdev("cpu", cpu_rate); | ||||
| +	ath79_add_sys_clkdev("ddr", ddr_rate); | ||||
| +	ath79_add_sys_clkdev("ahb", ahb_rate); | ||||
| + | ||||
| +	clk_add_alias("wdt", NULL, "ref", NULL); | ||||
| +	clk_add_alias("uart", NULL, "ref", NULL); | ||||
| +} | ||||
| + | ||||
|  static void __init qca955x_clocks_init(void) | ||||
|  { | ||||
|  	unsigned long ref_rate; | ||||
| @@ -450,6 +535,8 @@ void __init ath79_clocks_init(void) | ||||
|  		ar933x_clocks_init(); | ||||
|  	else if (soc_is_ar934x()) | ||||
|  		ar934x_clocks_init(); | ||||
| +	else if (soc_is_qca953x()) | ||||
| +		qca953x_clocks_init(); | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		qca955x_clocks_init(); | ||||
|  	else | ||||
| diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c | ||||
| index a32a9181a296..a485a7c35b9b 100644 | ||||
| --- a/arch/mips/ath79/common.c | ||||
| +++ b/arch/mips/ath79/common.c | ||||
| @@ -103,6 +103,8 @@ void ath79_device_reset_set(u32 mask) | ||||
|  		reg = AR933X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_ar934x()) | ||||
|  		reg = AR934X_RESET_REG_RESET_MODULE; | ||||
| +	else if (soc_is_qca953x()) | ||||
| +		reg = QCA953X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
| @@ -131,6 +133,8 @@ void ath79_device_reset_clear(u32 mask) | ||||
|  		reg = AR933X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_ar934x()) | ||||
|  		reg = AR934X_RESET_REG_RESET_MODULE; | ||||
| +	else if (soc_is_qca953x()) | ||||
| +		reg = QCA953X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
| diff --git a/arch/mips/ath79/dev-common.c b/arch/mips/ath79/dev-common.c | ||||
| index 9d0172a4dc69..99d8b88f1e6d 100644 | ||||
| --- a/arch/mips/ath79/dev-common.c | ||||
| +++ b/arch/mips/ath79/dev-common.c | ||||
| @@ -85,6 +85,7 @@ void __init ath79_register_uart(void) | ||||
|  	    soc_is_ar724x() || | ||||
|  	    soc_is_ar913x() || | ||||
|  	    soc_is_ar934x() || | ||||
| +	    soc_is_qca953x() || | ||||
|  	    soc_is_qca955x()) { | ||||
|  		ath79_uart_data[0].uartclk = uart_clk_rate; | ||||
|  		platform_device_register(&ath79_uart_device); | ||||
| @@ -148,6 +149,9 @@ void __init ath79_gpio_init(void) | ||||
|  	} else if (soc_is_ar934x()) { | ||||
|  		ath79_gpio_pdata.ngpios = AR934X_GPIO_COUNT; | ||||
|  		ath79_gpio_pdata.oe_inverted = 1; | ||||
| +	} else if (soc_is_qca953x()) { | ||||
| +		ath79_gpio_pdata.ngpios = QCA953X_GPIO_COUNT; | ||||
| +		ath79_gpio_pdata.oe_inverted = 1; | ||||
|  	} else if (soc_is_qca955x()) { | ||||
|  		ath79_gpio_pdata.ngpios = QCA955X_GPIO_COUNT; | ||||
|  		ath79_gpio_pdata.oe_inverted = 1; | ||||
| diff --git a/arch/mips/ath79/early_printk.c b/arch/mips/ath79/early_printk.c | ||||
| index ec3978678653..cc00839b7181 100644 | ||||
| --- a/arch/mips/ath79/early_printk.c | ||||
| +++ b/arch/mips/ath79/early_printk.c | ||||
| @@ -116,6 +116,8 @@ static void prom_putchar_init(void) | ||||
|  	case REV_ID_MAJOR_AR9341: | ||||
|  	case REV_ID_MAJOR_AR9342: | ||||
|  	case REV_ID_MAJOR_AR9344: | ||||
| +	case REV_ID_MAJOR_QCA9533: | ||||
| +	case REV_ID_MAJOR_QCA9533_V2: | ||||
|  	case REV_ID_MAJOR_QCA9556: | ||||
|  	case REV_ID_MAJOR_QCA9558: | ||||
|  		_prom_putchar = prom_putchar_ar71xx; | ||||
| diff --git a/arch/mips/ath79/irq.c b/arch/mips/ath79/irq.c | ||||
| index 2dfff1f19004..756b5aee3500 100644 | ||||
| --- a/arch/mips/ath79/irq.c | ||||
| +++ b/arch/mips/ath79/irq.c | ||||
| @@ -56,6 +56,34 @@ static void ar934x_ip2_irq_init(void) | ||||
|  	irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch); | ||||
|  } | ||||
|   | ||||
| +static void qca953x_ip2_irq_dispatch(struct irq_desc *desc) | ||||
| +{ | ||||
| +	u32 status; | ||||
| + | ||||
| +	status = ath79_reset_rr(QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS); | ||||
| + | ||||
| +	if (status & QCA953X_PCIE_WMAC_INT_PCIE_ALL) { | ||||
| +		ath79_ddr_wb_flush(3); | ||||
| +		generic_handle_irq(ATH79_IP2_IRQ(0)); | ||||
| +	} else if (status & QCA953X_PCIE_WMAC_INT_WMAC_ALL) { | ||||
| +		ath79_ddr_wb_flush(4); | ||||
| +		generic_handle_irq(ATH79_IP2_IRQ(1)); | ||||
| +	} else { | ||||
| +		spurious_interrupt(); | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static void qca953x_irq_init(void) | ||||
| +{ | ||||
| +	int i; | ||||
| + | ||||
| +	for (i = ATH79_IP2_IRQ_BASE; | ||||
| +	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++) | ||||
| +		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq); | ||||
| + | ||||
| +	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca953x_ip2_irq_dispatch); | ||||
| +} | ||||
| + | ||||
|  static void qca955x_ip2_irq_dispatch(struct irq_desc *desc) | ||||
|  { | ||||
|  	u32 status; | ||||
| @@ -143,7 +171,7 @@ void __init arch_init_irq(void) | ||||
|  	    soc_is_ar913x() || soc_is_ar933x()) { | ||||
|  		irq_wb_chan2 = 3; | ||||
|  		irq_wb_chan3 = 2; | ||||
| -	} else if (soc_is_ar934x()) { | ||||
| +	} else if (soc_is_ar934x() || soc_is_qca953x()) { | ||||
|  		irq_wb_chan3 = 2; | ||||
|  	} | ||||
|   | ||||
| @@ -154,6 +182,7 @@ void __init arch_init_irq(void) | ||||
|  	else if (soc_is_ar724x() || | ||||
|  		 soc_is_ar933x() || | ||||
|  		 soc_is_ar934x() || | ||||
| +		 soc_is_qca953x() || | ||||
|  		 soc_is_qca955x()) | ||||
|  		misc_is_ar71xx = false; | ||||
|  	else | ||||
| @@ -164,6 +193,8 @@ void __init arch_init_irq(void) | ||||
|   | ||||
|  	if (soc_is_ar934x()) | ||||
|  		ar934x_ip2_irq_init(); | ||||
| +	else if (soc_is_qca953x()) | ||||
| +		qca953x_irq_init(); | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		qca955x_irq_init(); | ||||
|  } | ||||
| diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c | ||||
| index 26a058d58d37..f782ae6c77d6 100644 | ||||
| --- a/arch/mips/ath79/setup.c | ||||
| +++ b/arch/mips/ath79/setup.c | ||||
| @@ -60,6 +60,7 @@ static void __init ath79_detect_sys_type(void) | ||||
|  	u32 major; | ||||
|  	u32 minor; | ||||
|  	u32 rev = 0; | ||||
| +	u32 ver = 1; | ||||
|   | ||||
|  	id = ath79_reset_rr(AR71XX_RESET_REG_REV_ID); | ||||
|  	major = id & REV_ID_MAJOR_MASK; | ||||
| @@ -152,6 +153,17 @@ static void __init ath79_detect_sys_type(void) | ||||
|  		rev = id & AR934X_REV_ID_REVISION_MASK; | ||||
|  		break; | ||||
|   | ||||
| +	case REV_ID_MAJOR_QCA9533_V2: | ||||
| +		ver = 2; | ||||
| +		ath79_soc_rev = 2; | ||||
| +		/* drop through */ | ||||
| + | ||||
| +	case REV_ID_MAJOR_QCA9533: | ||||
| +		ath79_soc = ATH79_SOC_QCA9533; | ||||
| +		chip = "9533"; | ||||
| +		rev = id & QCA953X_REV_ID_REVISION_MASK; | ||||
| +		break; | ||||
| + | ||||
|  	case REV_ID_MAJOR_QCA9556: | ||||
|  		ath79_soc = ATH79_SOC_QCA9556; | ||||
|  		chip = "9556"; | ||||
| @@ -168,11 +180,12 @@ static void __init ath79_detect_sys_type(void) | ||||
|  		panic("ath79: unknown SoC, id:0x%08x", id); | ||||
|  	} | ||||
|   | ||||
| -	ath79_soc_rev = rev; | ||||
| +	if (ver == 1) | ||||
| +		ath79_soc_rev = rev; | ||||
|   | ||||
| -	if (soc_is_qca955x()) | ||||
| -		sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s rev %u", | ||||
| -			chip, rev); | ||||
| +	if (soc_is_qca953x() || soc_is_qca955x()) | ||||
| +		sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s ver %u rev %u", | ||||
| +			chip, ver, rev); | ||||
|  	else | ||||
|  		sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev); | ||||
|  	pr_info("SoC: %s\n", ath79_sys_type); | ||||
| diff --git a/arch/mips/include/asm/mach-ath79/ath79.h b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| index 6e6c0fead776..98a7ccf3d358 100644 | ||||
| --- a/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| +++ b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| @@ -32,6 +32,7 @@ enum ath79_soc_type { | ||||
|  	ATH79_SOC_AR9341, | ||||
|  	ATH79_SOC_AR9342, | ||||
|  	ATH79_SOC_AR9344, | ||||
| +	ATH79_SOC_QCA9533, | ||||
|  	ATH79_SOC_QCA9556, | ||||
|  	ATH79_SOC_QCA9558, | ||||
|  }; | ||||
| @@ -100,6 +101,16 @@ static inline int soc_is_ar934x(void) | ||||
|  	return soc_is_ar9341() || soc_is_ar9342() || soc_is_ar9344(); | ||||
|  } | ||||
|   | ||||
| +static inline int soc_is_qca9533(void) | ||||
| +{ | ||||
| +	return ath79_soc == ATH79_SOC_QCA9533; | ||||
| +} | ||||
| + | ||||
| +static inline int soc_is_qca953x(void) | ||||
| +{ | ||||
| +	return soc_is_qca9533(); | ||||
| +} | ||||
| + | ||||
|  static inline int soc_is_qca9556(void) | ||||
|  { | ||||
|  	return ath79_soc == ATH79_SOC_QCA9556; | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,431 @@ | ||||
| From 6aeb24b9508bbe91f89cd4eb21d0d7582d971146 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <hackpascal@gmail.com> | ||||
| Date: Tue, 6 Mar 2018 08:48:31 +0100 | ||||
| Subject: [PATCH 17/27] MIPS: ath79: add support for qca956x soc | ||||
|  | ||||
| This patch adds soc support for QCA9561 and TP9343. | ||||
| TP9343 is a reduced version of QCA9561, which can be found in TP-LINK routers in China. | ||||
| The qca956x_wmac has not yet been supported by ath9k. | ||||
|  | ||||
| tested on TL-WDR6500 and TL-WR882N v1 (Chinese version) | ||||
|  | ||||
| Signed-off-by: Weijie Gao <hackpascal@gmail.com> | ||||
| --- | ||||
|  arch/mips/ath79/Kconfig                  |  2 +- | ||||
|  arch/mips/ath79/clock.c                  | 96 ++++++++++++++++++++++++++++++++ | ||||
|  arch/mips/ath79/common.c                 |  4 ++ | ||||
|  arch/mips/ath79/dev-common.c             |  7 ++- | ||||
|  arch/mips/ath79/early_printk.c           |  2 + | ||||
|  arch/mips/ath79/irq.c                    | 87 ++++++++++++++++++++++++++++- | ||||
|  arch/mips/ath79/pci.c                    | 12 ++++ | ||||
|  arch/mips/ath79/setup.c                  | 17 +++++- | ||||
|  arch/mips/include/asm/mach-ath79/ath79.h | 22 ++++++++ | ||||
|  9 files changed, 245 insertions(+), 4 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig | ||||
| index b03f5c8b9d1e..ad56cdbc8abd 100644 | ||||
| --- a/arch/mips/ath79/Kconfig | ||||
| +++ b/arch/mips/ath79/Kconfig | ||||
| @@ -119,7 +119,7 @@ config ATH79_DEV_USB | ||||
|  	def_bool n | ||||
|   | ||||
|  config ATH79_DEV_WMAC | ||||
| -	depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA953X || SOC_QCA955X) | ||||
| +	depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA953X || SOC_QCA955X || SOC_QCA956X) | ||||
|  	def_bool n | ||||
|   | ||||
|  endif | ||||
| diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c | ||||
| index b9595b2d1b65..65701b45fb1b 100644 | ||||
| --- a/arch/mips/ath79/clock.c | ||||
| +++ b/arch/mips/ath79/clock.c | ||||
| @@ -525,6 +525,100 @@ static void __init qca955x_clocks_init(void) | ||||
|  	clk_add_alias("uart", NULL, "ref", NULL); | ||||
|  } | ||||
|   | ||||
| +static void __init qca956x_clocks_init(void) | ||||
| +{ | ||||
| +	unsigned long ref_rate; | ||||
| +	unsigned long cpu_rate; | ||||
| +	unsigned long ddr_rate; | ||||
| +	unsigned long ahb_rate; | ||||
| +	u32 pll, out_div, ref_div, nint, hfrac, lfrac, clk_ctrl, postdiv; | ||||
| +	u32 cpu_pll, ddr_pll; | ||||
| +	u32 bootstrap; | ||||
| + | ||||
| +	bootstrap = ath79_reset_rr(QCA956X_RESET_REG_BOOTSTRAP); | ||||
| +	if (bootstrap &	QCA956X_BOOTSTRAP_REF_CLK_40) | ||||
| +		ref_rate = 40 * 1000 * 1000; | ||||
| +	else | ||||
| +		ref_rate = 25 * 1000 * 1000; | ||||
| + | ||||
| +	pll = ath79_pll_rr(QCA956X_PLL_CPU_CONFIG_REG); | ||||
| +	out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & | ||||
| +		  QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK; | ||||
| +	ref_div = (pll >> QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT) & | ||||
| +		  QCA956X_PLL_CPU_CONFIG_REFDIV_MASK; | ||||
| + | ||||
| +	pll = ath79_pll_rr(QCA956X_PLL_CPU_CONFIG1_REG); | ||||
| +	nint = (pll >> QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT) & | ||||
| +	       QCA956X_PLL_CPU_CONFIG1_NINT_MASK; | ||||
| +	hfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT) & | ||||
| +	       QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK; | ||||
| +	lfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT) & | ||||
| +	       QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK; | ||||
| + | ||||
| +	cpu_pll = nint * ref_rate / ref_div; | ||||
| +	cpu_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13); | ||||
| +	cpu_pll += (hfrac >> 13) * ref_rate / ref_div; | ||||
| +	cpu_pll /= (1 << out_div); | ||||
| + | ||||
| +	pll = ath79_pll_rr(QCA956X_PLL_DDR_CONFIG_REG); | ||||
| +	out_div = (pll >> QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT) & | ||||
| +		  QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK; | ||||
| +	ref_div = (pll >> QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT) & | ||||
| +		  QCA956X_PLL_DDR_CONFIG_REFDIV_MASK; | ||||
| +	pll = ath79_pll_rr(QCA956X_PLL_DDR_CONFIG1_REG); | ||||
| +	nint = (pll >> QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT) & | ||||
| +	       QCA956X_PLL_DDR_CONFIG1_NINT_MASK; | ||||
| +	hfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT) & | ||||
| +	       QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK; | ||||
| +	lfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT) & | ||||
| +	       QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK; | ||||
| + | ||||
| +	ddr_pll = nint * ref_rate / ref_div; | ||||
| +	ddr_pll += (lfrac * ref_rate) / ((ref_div * 25) << 13); | ||||
| +	ddr_pll += (hfrac >> 13) * ref_rate / ref_div; | ||||
| +	ddr_pll /= (1 << out_div); | ||||
| + | ||||
| +	clk_ctrl = ath79_pll_rr(QCA956X_PLL_CLK_CTRL_REG); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) & | ||||
| +		  QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS) | ||||
| +		cpu_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL) | ||||
| +		cpu_rate = ddr_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		cpu_rate = cpu_pll / (postdiv + 1); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) & | ||||
| +		  QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS) | ||||
| +		ddr_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL) | ||||
| +		ddr_rate = cpu_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		ddr_rate = ddr_pll / (postdiv + 1); | ||||
| + | ||||
| +	postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) & | ||||
| +		  QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK; | ||||
| + | ||||
| +	if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS) | ||||
| +		ahb_rate = ref_rate; | ||||
| +	else if (clk_ctrl & QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL) | ||||
| +		ahb_rate = ddr_pll / (postdiv + 1); | ||||
| +	else | ||||
| +		ahb_rate = cpu_pll / (postdiv + 1); | ||||
| + | ||||
| +	ath79_add_sys_clkdev("ref", ref_rate); | ||||
| +	ath79_add_sys_clkdev("cpu", cpu_rate); | ||||
| +	ath79_add_sys_clkdev("ddr", ddr_rate); | ||||
| +	ath79_add_sys_clkdev("ahb", ahb_rate); | ||||
| + | ||||
| +	clk_add_alias("wdt", NULL, "ref", NULL); | ||||
| +	clk_add_alias("uart", NULL, "ref", NULL); | ||||
| +} | ||||
| + | ||||
|  void __init ath79_clocks_init(void) | ||||
|  { | ||||
|  	if (soc_is_ar71xx()) | ||||
| @@ -539,6 +633,8 @@ void __init ath79_clocks_init(void) | ||||
|  		qca953x_clocks_init(); | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		qca955x_clocks_init(); | ||||
| +	else if (soc_is_qca956x() || soc_is_tp9343()) | ||||
| +		qca956x_clocks_init(); | ||||
|  	else | ||||
|  		BUG(); | ||||
|  } | ||||
| diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c | ||||
| index a485a7c35b9b..fc3438150b3e 100644 | ||||
| --- a/arch/mips/ath79/common.c | ||||
| +++ b/arch/mips/ath79/common.c | ||||
| @@ -107,6 +107,8 @@ void ath79_device_reset_set(u32 mask) | ||||
|  		reg = QCA953X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
| +	else if (soc_is_qca956x() || soc_is_tp9343()) | ||||
| +		reg = QCA956X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
|  		panic("Reset register not defined for this SOC"); | ||||
|   | ||||
| @@ -137,6 +139,8 @@ void ath79_device_reset_clear(u32 mask) | ||||
|  		reg = QCA953X_RESET_REG_RESET_MODULE; | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		reg = QCA955X_RESET_REG_RESET_MODULE; | ||||
| +	else if (soc_is_qca956x() || soc_is_tp9343()) | ||||
| +		reg = QCA956X_RESET_REG_RESET_MODULE; | ||||
|  	else | ||||
|  		panic("Reset register not defined for this SOC"); | ||||
|   | ||||
| diff --git a/arch/mips/ath79/dev-common.c b/arch/mips/ath79/dev-common.c | ||||
| index 99d8b88f1e6d..ac8bfe86b656 100644 | ||||
| --- a/arch/mips/ath79/dev-common.c | ||||
| +++ b/arch/mips/ath79/dev-common.c | ||||
| @@ -86,7 +86,9 @@ void __init ath79_register_uart(void) | ||||
|  	    soc_is_ar913x() || | ||||
|  	    soc_is_ar934x() || | ||||
|  	    soc_is_qca953x() || | ||||
| -	    soc_is_qca955x()) { | ||||
| +	    soc_is_qca955x() || | ||||
| +	    soc_is_qca956x() || | ||||
| +	    soc_is_tp9343()) { | ||||
|  		ath79_uart_data[0].uartclk = uart_clk_rate; | ||||
|  		platform_device_register(&ath79_uart_device); | ||||
|  	} else if (soc_is_ar933x()) { | ||||
| @@ -155,6 +157,9 @@ void __init ath79_gpio_init(void) | ||||
|  	} else if (soc_is_qca955x()) { | ||||
|  		ath79_gpio_pdata.ngpios = QCA955X_GPIO_COUNT; | ||||
|  		ath79_gpio_pdata.oe_inverted = 1; | ||||
| +	} else if (soc_is_qca956x() || soc_is_tp9343()) { | ||||
| +		ath79_gpio_pdata.ngpios = QCA956X_GPIO_COUNT; | ||||
| +		ath79_gpio_pdata.oe_inverted = 1; | ||||
|  	} else { | ||||
|  		BUG(); | ||||
|  	} | ||||
| diff --git a/arch/mips/ath79/early_printk.c b/arch/mips/ath79/early_printk.c | ||||
| index cc00839b7181..2024a0bb9144 100644 | ||||
| --- a/arch/mips/ath79/early_printk.c | ||||
| +++ b/arch/mips/ath79/early_printk.c | ||||
| @@ -120,6 +120,8 @@ static void prom_putchar_init(void) | ||||
|  	case REV_ID_MAJOR_QCA9533_V2: | ||||
|  	case REV_ID_MAJOR_QCA9556: | ||||
|  	case REV_ID_MAJOR_QCA9558: | ||||
| +	case REV_ID_MAJOR_TP9343: | ||||
| +	case REV_ID_MAJOR_QCA956X: | ||||
|  		_prom_putchar = prom_putchar_ar71xx; | ||||
|  		break; | ||||
|   | ||||
| diff --git a/arch/mips/ath79/irq.c b/arch/mips/ath79/irq.c | ||||
| index 756b5aee3500..58d17ef6f58f 100644 | ||||
| --- a/arch/mips/ath79/irq.c | ||||
| +++ b/arch/mips/ath79/irq.c | ||||
| @@ -156,6 +156,87 @@ static void qca955x_irq_init(void) | ||||
|  	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch); | ||||
|  } | ||||
|   | ||||
| +static void qca956x_ip2_irq_dispatch(struct irq_desc *desc) | ||||
| +{ | ||||
| +	u32 status; | ||||
| + | ||||
| +	status = ath79_reset_rr(QCA956X_RESET_REG_EXT_INT_STATUS); | ||||
| +	status &= QCA956X_EXT_INT_PCIE_RC1_ALL | QCA956X_EXT_INT_WMAC_ALL; | ||||
| + | ||||
| +	if (status == 0) { | ||||
| +		spurious_interrupt(); | ||||
| +		return; | ||||
| +	} | ||||
| + | ||||
| +	if (status & QCA956X_EXT_INT_PCIE_RC1_ALL) { | ||||
| +		/* TODO: flush DDR? */ | ||||
| +		generic_handle_irq(ATH79_IP2_IRQ(0)); | ||||
| +	} | ||||
| + | ||||
| +	if (status & QCA956X_EXT_INT_WMAC_ALL) { | ||||
| +		/* TODO: flsuh DDR? */ | ||||
| +		generic_handle_irq(ATH79_IP2_IRQ(1)); | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static void qca956x_ip3_irq_dispatch(struct irq_desc *desc) | ||||
| +{ | ||||
| +	u32 status; | ||||
| + | ||||
| +	status = ath79_reset_rr(QCA956X_RESET_REG_EXT_INT_STATUS); | ||||
| +	status &= QCA956X_EXT_INT_PCIE_RC2_ALL | | ||||
| +		  QCA956X_EXT_INT_USB1 | QCA956X_EXT_INT_USB2; | ||||
| + | ||||
| +	if (status == 0) { | ||||
| +		spurious_interrupt(); | ||||
| +		return; | ||||
| +	} | ||||
| + | ||||
| +	if (status & QCA956X_EXT_INT_USB1) { | ||||
| +		/* TODO: flush DDR? */ | ||||
| +		generic_handle_irq(ATH79_IP3_IRQ(0)); | ||||
| +	} | ||||
| + | ||||
| +	if (status & QCA956X_EXT_INT_USB2) { | ||||
| +		/* TODO: flush DDR? */ | ||||
| +		generic_handle_irq(ATH79_IP3_IRQ(1)); | ||||
| +	} | ||||
| + | ||||
| +	if (status & QCA956X_EXT_INT_PCIE_RC2_ALL) { | ||||
| +		/* TODO: flush DDR? */ | ||||
| +		generic_handle_irq(ATH79_IP3_IRQ(2)); | ||||
| +	} | ||||
| +} | ||||
| + | ||||
| +static void qca956x_enable_timer_cb(void) { | ||||
| +	u32 misc; | ||||
| + | ||||
| +	misc = ath79_reset_rr(AR71XX_RESET_REG_MISC_INT_ENABLE); | ||||
| +	misc |= MISC_INT_MIPS_SI_TIMERINT_MASK; | ||||
| +	ath79_reset_wr(AR71XX_RESET_REG_MISC_INT_ENABLE, misc); | ||||
| +} | ||||
| + | ||||
| +static void qca956x_irq_init(void) | ||||
| +{ | ||||
| +	int i; | ||||
| + | ||||
| +	for (i = ATH79_IP2_IRQ_BASE; | ||||
| +	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++) | ||||
| +		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq); | ||||
| + | ||||
| +	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca956x_ip2_irq_dispatch); | ||||
| + | ||||
| +	for (i = ATH79_IP3_IRQ_BASE; | ||||
| +	     i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++) | ||||
| +		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq); | ||||
| + | ||||
| +	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca956x_ip3_irq_dispatch); | ||||
| + | ||||
| +	/* QCA956x timer init workaround has to be applied right before setting | ||||
| +	 * up the clock. Else, there will be no jiffies */ | ||||
| +	late_time_init = &qca956x_enable_timer_cb; | ||||
| +} | ||||
| + | ||||
|  void __init arch_init_irq(void) | ||||
|  { | ||||
|  	unsigned irq_wb_chan2 = -1; | ||||
| @@ -183,7 +264,9 @@ void __init arch_init_irq(void) | ||||
|  		 soc_is_ar933x() || | ||||
|  		 soc_is_ar934x() || | ||||
|  		 soc_is_qca953x() || | ||||
| -		 soc_is_qca955x()) | ||||
| +		 soc_is_qca955x() || | ||||
| +		 soc_is_qca956x() || | ||||
| +		 soc_is_tp9343()) | ||||
|  		misc_is_ar71xx = false; | ||||
|  	else | ||||
|  		BUG(); | ||||
| @@ -197,4 +280,6 @@ void __init arch_init_irq(void) | ||||
|  		qca953x_irq_init(); | ||||
|  	else if (soc_is_qca955x()) | ||||
|  		qca955x_irq_init(); | ||||
| +	else if (soc_is_qca956x() || soc_is_tp9343()) | ||||
| +		qca956x_irq_init(); | ||||
|  } | ||||
| diff --git a/arch/mips/ath79/pci.c b/arch/mips/ath79/pci.c | ||||
| index b816cb4a25ff..d905a67e1a07 100644 | ||||
| --- a/arch/mips/ath79/pci.c | ||||
| +++ b/arch/mips/ath79/pci.c | ||||
| @@ -82,6 +82,9 @@ int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin) | ||||
|  		} else if (soc_is_qca955x()) { | ||||
|  			ath79_pci_irq_map = qca955x_pci_irq_map; | ||||
|  			ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map); | ||||
| +		} else if (soc_is_qca956x()) { | ||||
| +			ath79_pci_irq_map = qca956x_pci_irq_map; | ||||
| +			ath79_pci_nr_irqs = ARRAY_SIZE(qca956x_pci_irq_map); | ||||
|  		} else { | ||||
|  			pr_crit("pci %s: invalid irq map\n", | ||||
|  				pci_name((struct pci_dev *) dev)); | ||||
| @@ -261,6 +264,15 @@ int __init ath79_register_pci(void) | ||||
|  						 QCA955X_PCI_MEM_SIZE, | ||||
|  						 1, | ||||
|  						 ATH79_IP3_IRQ(2)); | ||||
| +	} else if (soc_is_qca956x()) { | ||||
| +		pdev = ath79_register_pci_ar724x(0, | ||||
| +						 QCA956X_PCI_CFG_BASE1, | ||||
| +						 QCA956X_PCI_CTRL_BASE1, | ||||
| +						 QCA956X_PCI_CRP_BASE1, | ||||
| +						 QCA956X_PCI_MEM_BASE1, | ||||
| +						 QCA956X_PCI_MEM_SIZE, | ||||
| +						 1, | ||||
| +						 ATH79_IP3_IRQ(2)); | ||||
|  	} else { | ||||
|  		/* No PCI support */ | ||||
|  		return -ENODEV; | ||||
| diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c | ||||
| index f782ae6c77d6..4c7a93f4039a 100644 | ||||
| --- a/arch/mips/ath79/setup.c | ||||
| +++ b/arch/mips/ath79/setup.c | ||||
| @@ -176,6 +176,18 @@ static void __init ath79_detect_sys_type(void) | ||||
|  		rev = id & QCA955X_REV_ID_REVISION_MASK; | ||||
|  		break; | ||||
|   | ||||
| +	case REV_ID_MAJOR_QCA956X: | ||||
| +		ath79_soc = ATH79_SOC_QCA956X; | ||||
| +		chip = "956X"; | ||||
| +		rev = id & QCA956X_REV_ID_REVISION_MASK; | ||||
| +		break; | ||||
| + | ||||
| +	case REV_ID_MAJOR_TP9343: | ||||
| +		ath79_soc = ATH79_SOC_TP9343; | ||||
| +		chip = "9343"; | ||||
| +		rev = id & QCA956X_REV_ID_REVISION_MASK; | ||||
| +		break; | ||||
| + | ||||
|  	default: | ||||
|  		panic("ath79: unknown SoC, id:0x%08x", id); | ||||
|  	} | ||||
| @@ -183,9 +195,12 @@ static void __init ath79_detect_sys_type(void) | ||||
|  	if (ver == 1) | ||||
|  		ath79_soc_rev = rev; | ||||
|   | ||||
| -	if (soc_is_qca953x() || soc_is_qca955x()) | ||||
| +	if (soc_is_qca953x() || soc_is_qca955x() || soc_is_qca956x()) | ||||
|  		sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s ver %u rev %u", | ||||
|  			chip, ver, rev); | ||||
| +	else if (soc_is_tp9343()) | ||||
| +		sprintf(ath79_sys_type, "Qualcomm Atheros TP%s rev %u", | ||||
| +			chip, rev); | ||||
|  	else | ||||
|  		sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev); | ||||
|  	pr_info("SoC: %s\n", ath79_sys_type); | ||||
| diff --git a/arch/mips/include/asm/mach-ath79/ath79.h b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| index 98a7ccf3d358..73dcd63b8243 100644 | ||||
| --- a/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| +++ b/arch/mips/include/asm/mach-ath79/ath79.h | ||||
| @@ -35,6 +35,8 @@ enum ath79_soc_type { | ||||
|  	ATH79_SOC_QCA9533, | ||||
|  	ATH79_SOC_QCA9556, | ||||
|  	ATH79_SOC_QCA9558, | ||||
| +	ATH79_SOC_TP9343, | ||||
| +	ATH79_SOC_QCA956X, | ||||
|  }; | ||||
|   | ||||
|  extern enum ath79_soc_type ath79_soc; | ||||
| @@ -126,6 +128,26 @@ static inline int soc_is_qca955x(void) | ||||
|  	return soc_is_qca9556() || soc_is_qca9558(); | ||||
|  } | ||||
|   | ||||
| +static inline int soc_is_tp9343(void) | ||||
| +{ | ||||
| +	return ath79_soc == ATH79_SOC_TP9343; | ||||
| +} | ||||
| + | ||||
| +static inline int soc_is_qca9561(void) | ||||
| +{ | ||||
| +	return ath79_soc == ATH79_SOC_QCA956X; | ||||
| +} | ||||
| + | ||||
| +static inline int soc_is_qca9563(void) | ||||
| +{ | ||||
| +	return ath79_soc == ATH79_SOC_QCA956X; | ||||
| +} | ||||
| + | ||||
| +static inline int soc_is_qca956x(void) | ||||
| +{ | ||||
| +	return soc_is_qca9561() || soc_is_qca9563(); | ||||
| +} | ||||
| + | ||||
|  void ath79_ddr_wb_flush(unsigned int reg); | ||||
|  void ath79_ddr_set_pci_windows(void); | ||||
|   | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,105 @@ | ||||
| From 308c2ef9c4f1be2e1cee699042671eb973b51803 Mon Sep 17 00:00:00 2001 | ||||
| From: Mathias Kresin <dev@kresin.me> | ||||
| Date: Tue, 6 Mar 2018 08:37:43 +0100 | ||||
| Subject: [PATCH 19/27] MIPS: ath79: get PCIe controller out of reset | ||||
|  | ||||
| The ar724x pci driver expects the PCIe controller to be brought out of | ||||
| reset by the bootloader. | ||||
|  | ||||
| At least the AVM Fritz 300E bootloader doesn't take care of releasing | ||||
| the different PCIe controller related resets which causes an endless | ||||
| hang as soon as either the PCIE Reset register (0x180f0018) or the PCI | ||||
| Application Control register (0x180f0000) is read from. | ||||
|  | ||||
| Do the full "PCIE Root Complex Initialization Sequence" if the PCIe | ||||
| host controller is still in reset during probing. | ||||
|  | ||||
| The QCA u-boot sleeps 10ms after the PCIE Application Control bit is | ||||
| set to ready. It has been shown that 10ms might not be enough time if | ||||
| PCIe should be used right after setting the bit. During my tests it | ||||
| took up to 20ms till the link was up. Giving the link up to 100ms | ||||
| should work for all cases. | ||||
|  | ||||
| Signed-off-by: Mathias Kresin <dev@kresin.me> | ||||
| --- | ||||
|  arch/mips/pci/pci-ar724x.c | 42 ++++++++++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 42 insertions(+) | ||||
|  | ||||
| diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c | ||||
| index 1e23c8d587bd..64b58cc48a91 100644 | ||||
| --- a/arch/mips/pci/pci-ar724x.c | ||||
| +++ b/arch/mips/pci/pci-ar724x.c | ||||
| @@ -12,14 +12,18 @@ | ||||
|  #include <linux/irq.h> | ||||
|  #include <linux/pci.h> | ||||
|  #include <linux/init.h> | ||||
| +#include <linux/delay.h> | ||||
|  #include <linux/platform_device.h> | ||||
|  #include <asm/mach-ath79/ath79.h> | ||||
|  #include <asm/mach-ath79/ar71xx_regs.h> | ||||
|   | ||||
| +#define AR724X_PCI_REG_APP		0x00 | ||||
|  #define AR724X_PCI_REG_RESET		0x18 | ||||
|  #define AR724X_PCI_REG_INT_STATUS	0x4c | ||||
|  #define AR724X_PCI_REG_INT_MASK		0x50 | ||||
|   | ||||
| +#define AR724X_PCI_APP_LTSSM_ENABLE	BIT(0) | ||||
| + | ||||
|  #define AR724X_PCI_RESET_LINK_UP	BIT(0) | ||||
|   | ||||
|  #define AR724X_PCI_INT_DEV0		BIT(14) | ||||
| @@ -325,6 +329,37 @@ static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc, | ||||
|  					 apc); | ||||
|  } | ||||
|   | ||||
| +static void ar724x_pci_hw_init(struct ar724x_pci_controller *apc) | ||||
| +{ | ||||
| +	u32 ppl, app; | ||||
| +	int wait = 0; | ||||
| + | ||||
| +	/* deassert PCIe host controller and PCIe PHY reset */ | ||||
| +	ath79_device_reset_clear(AR724X_RESET_PCIE); | ||||
| +	ath79_device_reset_clear(AR724X_RESET_PCIE_PHY); | ||||
| + | ||||
| +	/* remove the reset of the PCIE PLL */ | ||||
| +	ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); | ||||
| +	ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET; | ||||
| +	ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); | ||||
| + | ||||
| +	/* deassert bypass for the PCIE PLL */ | ||||
| +	ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG); | ||||
| +	ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS; | ||||
| +	ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl); | ||||
| + | ||||
| +	/* set PCIE Application Control to ready */ | ||||
| +	app = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_APP); | ||||
| +	app |= AR724X_PCI_APP_LTSSM_ENABLE; | ||||
| +	__raw_writel(app, apc->ctrl_base + AR724X_PCI_REG_APP); | ||||
| + | ||||
| +	/* wait up to 100ms for PHY link up */ | ||||
| +	do { | ||||
| +		mdelay(10); | ||||
| +		wait++; | ||||
| +	} while (wait < 10 && !ar724x_pci_check_link(apc)); | ||||
| +} | ||||
| + | ||||
|  static int ar724x_pci_probe(struct platform_device *pdev) | ||||
|  { | ||||
|  	struct ar724x_pci_controller *apc; | ||||
| @@ -383,6 +418,13 @@ static int ar724x_pci_probe(struct platform_device *pdev) | ||||
|  	apc->pci_controller.io_resource = &apc->io_res; | ||||
|  	apc->pci_controller.mem_resource = &apc->mem_res; | ||||
|   | ||||
| +	/* | ||||
| +	 * Do the full PCIE Root Complex Initialization Sequence if the PCIe | ||||
| +	 * host controller is in reset. | ||||
| +	 */ | ||||
| +	if (ath79_reset_rr(AR724X_RESET_REG_RESET_MODULE) & AR724X_RESET_PCIE) | ||||
| +		ar724x_pci_hw_init(apc); | ||||
| + | ||||
|  	apc->link_up = ar724x_pci_check_link(apc); | ||||
|  	if (!apc->link_up) | ||||
|  		dev_warn(&pdev->dev, "PCIe link is down\n"); | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,202 @@ | ||||
| From cc5a306038b7956b5736a70696dddaaf3792df76 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:22:49 +0100 | ||||
| Subject: [PATCH 20/27] MIPS: ath79: turn pci-ar71xx driver into a pure OF | ||||
|  driver | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/pci/pci-ar71xx.c | 81 +++++++++++++++++++++++----------------------- | ||||
|  1 file changed, 40 insertions(+), 41 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/pci/pci-ar71xx.c b/arch/mips/pci/pci-ar71xx.c | ||||
| index bdf87b43633f..1dc9f01a495d 100644 | ||||
| --- a/arch/mips/pci/pci-ar71xx.c | ||||
| +++ b/arch/mips/pci/pci-ar71xx.c | ||||
| @@ -18,8 +18,11 @@ | ||||
|  #include <linux/pci.h> | ||||
|  #include <linux/pci_regs.h> | ||||
|  #include <linux/interrupt.h> | ||||
| +#include <linux/irqchip/chained_irq.h> | ||||
|  #include <linux/init.h> | ||||
|  #include <linux/platform_device.h> | ||||
| +#include <linux/of_irq.h> | ||||
| +#include <linux/of_pci.h> | ||||
|   | ||||
|  #include <asm/mach-ath79/ar71xx_regs.h> | ||||
|  #include <asm/mach-ath79/ath79.h> | ||||
| @@ -49,12 +52,13 @@ | ||||
|  #define AR71XX_PCI_IRQ_COUNT		5 | ||||
|   | ||||
|  struct ar71xx_pci_controller { | ||||
| +	struct device_node *np; | ||||
|  	void __iomem *cfg_base; | ||||
|  	int irq; | ||||
| -	int irq_base; | ||||
|  	struct pci_controller pci_ctrl; | ||||
|  	struct resource io_res; | ||||
|  	struct resource mem_res; | ||||
| +	struct irq_domain *domain; | ||||
|  }; | ||||
|   | ||||
|  /* Byte lane enable bits */ | ||||
| @@ -228,29 +232,30 @@ static struct pci_ops ar71xx_pci_ops = { | ||||
|   | ||||
|  static void ar71xx_pci_irq_handler(struct irq_desc *desc) | ||||
|  { | ||||
| -	struct ar71xx_pci_controller *apc; | ||||
|  	void __iomem *base = ath79_reset_base; | ||||
| +	struct irq_chip *chip = irq_desc_get_chip(desc); | ||||
| +	struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc); | ||||
|  	u32 pending; | ||||
|   | ||||
| -	apc = irq_desc_get_handler_data(desc); | ||||
| - | ||||
| +	chained_irq_enter(chip, desc); | ||||
|  	pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & | ||||
|  		  __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
|   | ||||
|  	if (pending & AR71XX_PCI_INT_DEV0) | ||||
| -		generic_handle_irq(apc->irq_base + 0); | ||||
| +		generic_handle_irq(irq_linear_revmap(apc->domain, 1)); | ||||
|   | ||||
|  	else if (pending & AR71XX_PCI_INT_DEV1) | ||||
| -		generic_handle_irq(apc->irq_base + 1); | ||||
| +		generic_handle_irq(irq_linear_revmap(apc->domain, 2)); | ||||
|   | ||||
|  	else if (pending & AR71XX_PCI_INT_DEV2) | ||||
| -		generic_handle_irq(apc->irq_base + 2); | ||||
| +		generic_handle_irq(irq_linear_revmap(apc->domain, 3)); | ||||
|   | ||||
|  	else if (pending & AR71XX_PCI_INT_CORE) | ||||
| -		generic_handle_irq(apc->irq_base + 4); | ||||
| +		generic_handle_irq(irq_linear_revmap(apc->domain, 4)); | ||||
|   | ||||
|  	else | ||||
|  		spurious_interrupt(); | ||||
| +	chained_irq_exit(chip, desc); | ||||
|  } | ||||
|   | ||||
|  static void ar71xx_pci_irq_unmask(struct irq_data *d) | ||||
| @@ -261,7 +266,7 @@ static void ar71xx_pci_irq_unmask(struct irq_data *d) | ||||
|  	u32 t; | ||||
|   | ||||
|  	apc = irq_data_get_irq_chip_data(d); | ||||
| -	irq = d->irq - apc->irq_base; | ||||
| +	irq = irq_linear_revmap(apc->domain, d->irq); | ||||
|   | ||||
|  	t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
|  	__raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
| @@ -278,7 +283,7 @@ static void ar71xx_pci_irq_mask(struct irq_data *d) | ||||
|  	u32 t; | ||||
|   | ||||
|  	apc = irq_data_get_irq_chip_data(d); | ||||
| -	irq = d->irq - apc->irq_base; | ||||
| +	irq = irq_linear_revmap(apc->domain, d->irq); | ||||
|   | ||||
|  	t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
|  	__raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
| @@ -294,24 +299,30 @@ static struct irq_chip ar71xx_pci_irq_chip = { | ||||
|  	.irq_mask_ack	= ar71xx_pci_irq_mask, | ||||
|  }; | ||||
|   | ||||
| +static int ar71xx_pci_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) | ||||
| +{ | ||||
| +	struct ar71xx_pci_controller *apc = d->host_data; | ||||
| + | ||||
| +	irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq); | ||||
| +	irq_set_chip_data(irq, apc); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static const struct irq_domain_ops ar71xx_pci_domain_ops = { | ||||
| +	.xlate = irq_domain_xlate_onecell, | ||||
| +	.map = ar71xx_pci_irq_map, | ||||
| +}; | ||||
| + | ||||
|  static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc) | ||||
|  { | ||||
|  	void __iomem *base = ath79_reset_base; | ||||
| -	int i; | ||||
|   | ||||
|  	__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); | ||||
|  	__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); | ||||
|   | ||||
| -	BUILD_BUG_ON(ATH79_PCI_IRQ_COUNT < AR71XX_PCI_IRQ_COUNT); | ||||
| - | ||||
| -	apc->irq_base = ATH79_PCI_IRQ_BASE; | ||||
| -	for (i = apc->irq_base; | ||||
| -	     i < apc->irq_base + AR71XX_PCI_IRQ_COUNT; i++) { | ||||
| -		irq_set_chip_and_handler(i, &ar71xx_pci_irq_chip, | ||||
| -					 handle_level_irq); | ||||
| -		irq_set_chip_data(i, apc); | ||||
| -	} | ||||
| - | ||||
| +	apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT, | ||||
| +					    &ar71xx_pci_domain_ops, apc); | ||||
|  	irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler, | ||||
|  					 apc); | ||||
|  } | ||||
| @@ -328,6 +339,11 @@ static void ar71xx_pci_reset(void) | ||||
|  	mdelay(100); | ||||
|  } | ||||
|   | ||||
| +static const struct of_device_id ar71xx_pci_ids[] = { | ||||
| +	{ .compatible = "qca,ar7100-pci" }, | ||||
| +	{}, | ||||
| +}; | ||||
| + | ||||
|  static int ar71xx_pci_probe(struct platform_device *pdev) | ||||
|  { | ||||
|  	struct ar71xx_pci_controller *apc; | ||||
| @@ -348,26 +364,6 @@ static int ar71xx_pci_probe(struct platform_device *pdev) | ||||
|  	if (apc->irq < 0) | ||||
|  		return -EINVAL; | ||||
|   | ||||
| -	res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); | ||||
| -	if (!res) | ||||
| -		return -EINVAL; | ||||
| - | ||||
| -	apc->io_res.parent = res; | ||||
| -	apc->io_res.name = "PCI IO space"; | ||||
| -	apc->io_res.start = res->start; | ||||
| -	apc->io_res.end = res->end; | ||||
| -	apc->io_res.flags = IORESOURCE_IO; | ||||
| - | ||||
| -	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); | ||||
| -	if (!res) | ||||
| -		return -EINVAL; | ||||
| - | ||||
| -	apc->mem_res.parent = res; | ||||
| -	apc->mem_res.name = "PCI memory space"; | ||||
| -	apc->mem_res.start = res->start; | ||||
| -	apc->mem_res.end = res->end; | ||||
| -	apc->mem_res.flags = IORESOURCE_MEM; | ||||
| - | ||||
|  	ar71xx_pci_reset(); | ||||
|   | ||||
|  	/* setup COMMAND register */ | ||||
| @@ -380,9 +376,11 @@ static int ar71xx_pci_probe(struct platform_device *pdev) | ||||
|   | ||||
|  	ar71xx_pci_irq_init(apc); | ||||
|   | ||||
| +	apc->np = pdev->dev.of_node; | ||||
|  	apc->pci_ctrl.pci_ops = &ar71xx_pci_ops; | ||||
|  	apc->pci_ctrl.mem_resource = &apc->mem_res; | ||||
|  	apc->pci_ctrl.io_resource = &apc->io_res; | ||||
| +	pci_load_of_ranges(&apc->pci_ctrl, pdev->dev.of_node); | ||||
|   | ||||
|  	register_pci_controller(&apc->pci_ctrl); | ||||
|   | ||||
| @@ -393,6 +391,7 @@ static struct platform_driver ar71xx_pci_driver = { | ||||
|  	.probe = ar71xx_pci_probe, | ||||
|  	.driver = { | ||||
|  		.name = "ar71xx-pci", | ||||
| +		.of_match_table = of_match_ptr(ar71xx_pci_ids), | ||||
|  	}, | ||||
|  }; | ||||
|   | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
| @@ -0,0 +1,204 @@ | ||||
| From 0e7f36bfd68401e8c42933e7f770f270497bb9a8 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:23:25 +0100 | ||||
| Subject: [PATCH 21/27] MIPS: ath79: turn pci-ar724x driver into a pure OF | ||||
|  driver | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/pci/pci-ar724x.c | 86 +++++++++++++++++++++------------------------- | ||||
|  1 file changed, 40 insertions(+), 46 deletions(-) | ||||
|  | ||||
| diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c | ||||
| index 64b58cc48a91..7eb9b0999c8c 100644 | ||||
| --- a/arch/mips/pci/pci-ar724x.c | ||||
| +++ b/arch/mips/pci/pci-ar724x.c | ||||
| @@ -14,8 +14,11 @@ | ||||
|  #include <linux/init.h> | ||||
|  #include <linux/delay.h> | ||||
|  #include <linux/platform_device.h> | ||||
| +#include <linux/irqchip/chained_irq.h> | ||||
|  #include <asm/mach-ath79/ath79.h> | ||||
|  #include <asm/mach-ath79/ar71xx_regs.h> | ||||
| +#include <linux/of_irq.h> | ||||
| +#include <linux/of_pci.h> | ||||
|   | ||||
|  #define AR724X_PCI_REG_APP		0x00 | ||||
|  #define AR724X_PCI_REG_RESET		0x18 | ||||
| @@ -45,17 +48,20 @@ struct ar724x_pci_controller { | ||||
|  	void __iomem *crp_base; | ||||
|   | ||||
|  	int irq; | ||||
| -	int irq_base; | ||||
|   | ||||
|  	bool link_up; | ||||
|  	bool bar0_is_cached; | ||||
|  	u32  bar0_value; | ||||
|   | ||||
| +	struct device_node *np; | ||||
|  	struct pci_controller pci_controller; | ||||
| +	struct irq_domain *domain; | ||||
|  	struct resource io_res; | ||||
|  	struct resource mem_res; | ||||
|  }; | ||||
|   | ||||
| +static struct irq_chip ar724x_pci_irq_chip; | ||||
| + | ||||
|  static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc) | ||||
|  { | ||||
|  	u32 reset; | ||||
| @@ -231,35 +237,31 @@ static struct pci_ops ar724x_pci_ops = { | ||||
|   | ||||
|  static void ar724x_pci_irq_handler(struct irq_desc *desc) | ||||
|  { | ||||
| -	struct ar724x_pci_controller *apc; | ||||
| -	void __iomem *base; | ||||
| +	struct irq_chip *chip = irq_desc_get_chip(desc); | ||||
| +	struct ar724x_pci_controller *apc = irq_desc_get_handler_data(desc); | ||||
|  	u32 pending; | ||||
|   | ||||
| -	apc = irq_desc_get_handler_data(desc); | ||||
| -	base = apc->ctrl_base; | ||||
| - | ||||
| -	pending = __raw_readl(base + AR724X_PCI_REG_INT_STATUS) & | ||||
| -		  __raw_readl(base + AR724X_PCI_REG_INT_MASK); | ||||
| +	chained_irq_enter(chip, desc); | ||||
| +	pending = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_STATUS) & | ||||
| +		  __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_MASK); | ||||
|   | ||||
|  	if (pending & AR724X_PCI_INT_DEV0) | ||||
| -		generic_handle_irq(apc->irq_base + 0); | ||||
| - | ||||
| +		generic_handle_irq(irq_linear_revmap(apc->domain, 1)); | ||||
|  	else | ||||
|  		spurious_interrupt(); | ||||
| +	chained_irq_exit(chip, desc); | ||||
|  } | ||||
|   | ||||
|  static void ar724x_pci_irq_unmask(struct irq_data *d) | ||||
|  { | ||||
|  	struct ar724x_pci_controller *apc; | ||||
|  	void __iomem *base; | ||||
| -	int offset; | ||||
|  	u32 t; | ||||
|   | ||||
|  	apc = irq_data_get_irq_chip_data(d); | ||||
|  	base = apc->ctrl_base; | ||||
| -	offset = apc->irq_base - d->irq; | ||||
|   | ||||
| -	switch (offset) { | ||||
| +	switch (irq_linear_revmap(apc->domain, d->irq)) { | ||||
|  	case 0: | ||||
|  		t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); | ||||
|  		__raw_writel(t | AR724X_PCI_INT_DEV0, | ||||
| @@ -273,14 +275,12 @@ static void ar724x_pci_irq_mask(struct irq_data *d) | ||||
|  { | ||||
|  	struct ar724x_pci_controller *apc; | ||||
|  	void __iomem *base; | ||||
| -	int offset; | ||||
|  	u32 t; | ||||
|   | ||||
|  	apc = irq_data_get_irq_chip_data(d); | ||||
|  	base = apc->ctrl_base; | ||||
| -	offset = apc->irq_base - d->irq; | ||||
|   | ||||
| -	switch (offset) { | ||||
| +	switch (irq_linear_revmap(apc->domain, d->irq)) { | ||||
|  	case 0: | ||||
|  		t = __raw_readl(base + AR724X_PCI_REG_INT_MASK); | ||||
|  		__raw_writel(t & ~AR724X_PCI_INT_DEV0, | ||||
| @@ -305,26 +305,32 @@ static struct irq_chip ar724x_pci_irq_chip = { | ||||
|  	.irq_mask_ack	= ar724x_pci_irq_mask, | ||||
|  }; | ||||
|   | ||||
| +static int ar724x_pci_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) | ||||
| +{ | ||||
| +	struct ar724x_pci_controller *apc = d->host_data; | ||||
| + | ||||
| +	irq_set_chip_and_handler(irq, &ar724x_pci_irq_chip, handle_level_irq); | ||||
| +	irq_set_chip_data(irq, apc); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static const struct irq_domain_ops ar724x_pci_domain_ops = { | ||||
| +	.xlate = irq_domain_xlate_onecell, | ||||
| +	.map = ar724x_pci_irq_map, | ||||
| +}; | ||||
| + | ||||
|  static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc, | ||||
|  				int id) | ||||
|  { | ||||
|  	void __iomem *base; | ||||
| -	int i; | ||||
|   | ||||
|  	base = apc->ctrl_base; | ||||
|   | ||||
|  	__raw_writel(0, base + AR724X_PCI_REG_INT_MASK); | ||||
|  	__raw_writel(0, base + AR724X_PCI_REG_INT_STATUS); | ||||
|   | ||||
| -	apc->irq_base = ATH79_PCI_IRQ_BASE + (id * AR724X_PCI_IRQ_COUNT); | ||||
| - | ||||
| -	for (i = apc->irq_base; | ||||
| -	     i < apc->irq_base + AR724X_PCI_IRQ_COUNT; i++) { | ||||
| -		irq_set_chip_and_handler(i, &ar724x_pci_irq_chip, | ||||
| -					 handle_level_irq); | ||||
| -		irq_set_chip_data(i, apc); | ||||
| -	} | ||||
| - | ||||
| +	apc->domain = irq_domain_add_linear(apc->np, 2, &ar724x_pci_domain_ops, apc); | ||||
|  	irq_set_chained_handler_and_data(apc->irq, ar724x_pci_irq_handler, | ||||
|  					 apc); | ||||
|  } | ||||
| @@ -394,29 +400,11 @@ static int ar724x_pci_probe(struct platform_device *pdev) | ||||
|  	if (apc->irq < 0) | ||||
|  		return -EINVAL; | ||||
|   | ||||
| -	res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base"); | ||||
| -	if (!res) | ||||
| -		return -EINVAL; | ||||
| - | ||||
| -	apc->io_res.parent = res; | ||||
| -	apc->io_res.name = "PCI IO space"; | ||||
| -	apc->io_res.start = res->start; | ||||
| -	apc->io_res.end = res->end; | ||||
| -	apc->io_res.flags = IORESOURCE_IO; | ||||
| - | ||||
| -	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base"); | ||||
| -	if (!res) | ||||
| -		return -EINVAL; | ||||
| - | ||||
| -	apc->mem_res.parent = res; | ||||
| -	apc->mem_res.name = "PCI memory space"; | ||||
| -	apc->mem_res.start = res->start; | ||||
| -	apc->mem_res.end = res->end; | ||||
| -	apc->mem_res.flags = IORESOURCE_MEM; | ||||
| - | ||||
| +	apc->np = pdev->dev.of_node; | ||||
|  	apc->pci_controller.pci_ops = &ar724x_pci_ops; | ||||
|  	apc->pci_controller.io_resource = &apc->io_res; | ||||
|  	apc->pci_controller.mem_resource = &apc->mem_res; | ||||
| +	pci_load_of_ranges(&apc->pci_controller, pdev->dev.of_node); | ||||
|   | ||||
|  	/* | ||||
|  	 * Do the full PCIE Root Complex Initialization Sequence if the PCIe | ||||
| @@ -438,10 +426,16 @@ static int ar724x_pci_probe(struct platform_device *pdev) | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static const struct of_device_id ar724x_pci_ids[] = { | ||||
| +	{ .compatible = "qcom,ar7240-pci" }, | ||||
| +	{}, | ||||
| +}; | ||||
| + | ||||
|  static struct platform_driver ar724x_pci_driver = { | ||||
|  	.probe = ar724x_pci_probe, | ||||
|  	.driver = { | ||||
|  		.name = "ar724x-pci", | ||||
| +		.of_match_table = of_match_ptr(ar724x_pci_ids), | ||||
|  	}, | ||||
|  }; | ||||
|   | ||||
| --  | ||||
| 2.11.0 | ||||
|  | ||||
							
								
								
									
										358
									
								
								target/linux/ath79/patches-4.14/0022-MIPS-ath79-drop-pci.c.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								target/linux/ath79/patches-4.14/0022-MIPS-ath79-drop-pci.c.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,358 @@ | ||||
| From f4128f3224df2309262ef8d1275d928717ebefd0 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:21:46 +0100 | ||||
| Subject: [PATCH 22/27] MIPS: ath79: drop pci.c | ||||
|  | ||||
| This patch drops pci.c fromt he ath79 folder and moves the the pcibios | ||||
| callbacks to a new fixup file. | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/ath79/Makefile    |   1 - | ||||
|  arch/mips/ath79/pci.c       | 285 -------------------------------------------- | ||||
|  arch/mips/pci/Makefile      |   1 + | ||||
|  arch/mips/pci/fixup-ath79.c |  21 ++++ | ||||
|  4 files changed, 22 insertions(+), 286 deletions(-) | ||||
|  delete mode 100644 arch/mips/ath79/pci.c | ||||
|  create mode 100644 arch/mips/pci/fixup-ath79.c | ||||
|  | ||||
| Index: linux-4.14.25/arch/mips/ath79/Makefile | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/Makefile | ||||
| +++ linux-4.14.25/arch/mips/ath79/Makefile | ||||
| @@ -11,7 +11,6 @@ | ||||
|  obj-y	:= prom.o setup.o irq.o common.o clock.o | ||||
|   | ||||
|  obj-$(CONFIG_EARLY_PRINTK)		+= early_printk.o | ||||
| -obj-$(CONFIG_PCI)			+= pci.o | ||||
|   | ||||
|  # | ||||
|  # Devices | ||||
| Index: linux-4.14.25/arch/mips/ath79/pci.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/pci.c | ||||
| +++ /dev/null | ||||
| @@ -1,285 +0,0 @@ | ||||
| -/* | ||||
| - *  Atheros AR71XX/AR724X specific PCI setup code | ||||
| - * | ||||
| - *  Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com> | ||||
| - *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||||
| - *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||||
| - * | ||||
| - *  Parts of this file are based on Atheros' 2.6.15 BSP | ||||
| - * | ||||
| - *  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. | ||||
| - */ | ||||
| - | ||||
| -#include <linux/init.h> | ||||
| -#include <linux/pci.h> | ||||
| -#include <linux/resource.h> | ||||
| -#include <linux/platform_device.h> | ||||
| -#include <asm/mach-ath79/ar71xx_regs.h> | ||||
| -#include <asm/mach-ath79/ath79.h> | ||||
| -#include <asm/mach-ath79/irq.h> | ||||
| -#include "pci.h" | ||||
| - | ||||
| -static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev); | ||||
| -static const struct ath79_pci_irq *ath79_pci_irq_map; | ||||
| -static unsigned ath79_pci_nr_irqs; | ||||
| - | ||||
| -static const struct ath79_pci_irq ar71xx_pci_irq_map[] = { | ||||
| -	{ | ||||
| -		.slot	= 17, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(0), | ||||
| -	}, { | ||||
| -		.slot	= 18, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(1), | ||||
| -	}, { | ||||
| -		.slot	= 19, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(2), | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static const struct ath79_pci_irq ar724x_pci_irq_map[] = { | ||||
| -	{ | ||||
| -		.slot	= 0, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(0), | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static const struct ath79_pci_irq qca955x_pci_irq_map[] = { | ||||
| -	{ | ||||
| -		.bus	= 0, | ||||
| -		.slot	= 0, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(0), | ||||
| -	}, | ||||
| -	{ | ||||
| -		.bus	= 1, | ||||
| -		.slot	= 0, | ||||
| -		.pin	= 1, | ||||
| -		.irq	= ATH79_PCI_IRQ(1), | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin) | ||||
| -{ | ||||
| -	int irq = -1; | ||||
| -	int i; | ||||
| - | ||||
| -	if (ath79_pci_nr_irqs == 0 || | ||||
| -	    ath79_pci_irq_map == NULL) { | ||||
| -		if (soc_is_ar71xx()) { | ||||
| -			ath79_pci_irq_map = ar71xx_pci_irq_map; | ||||
| -			ath79_pci_nr_irqs = ARRAY_SIZE(ar71xx_pci_irq_map); | ||||
| -		} else if (soc_is_ar724x() || | ||||
| -			   soc_is_ar9342() || | ||||
| -			   soc_is_ar9344()) { | ||||
| -			ath79_pci_irq_map = ar724x_pci_irq_map; | ||||
| -			ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map); | ||||
| -		} else if (soc_is_qca955x()) { | ||||
| -			ath79_pci_irq_map = qca955x_pci_irq_map; | ||||
| -			ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map); | ||||
| -		} else if (soc_is_qca956x()) { | ||||
| -			ath79_pci_irq_map = qca956x_pci_irq_map; | ||||
| -			ath79_pci_nr_irqs = ARRAY_SIZE(qca956x_pci_irq_map); | ||||
| -		} else { | ||||
| -			pr_crit("pci %s: invalid irq map\n", | ||||
| -				pci_name((struct pci_dev *) dev)); | ||||
| -			return irq; | ||||
| -		} | ||||
| -	} | ||||
| - | ||||
| -	for (i = 0; i < ath79_pci_nr_irqs; i++) { | ||||
| -		const struct ath79_pci_irq *entry; | ||||
| - | ||||
| -		entry = &ath79_pci_irq_map[i]; | ||||
| -		if (entry->bus == dev->bus->number && | ||||
| -		    entry->slot == slot && | ||||
| -		    entry->pin == pin) { | ||||
| -			irq = entry->irq; | ||||
| -			break; | ||||
| -		} | ||||
| -	} | ||||
| - | ||||
| -	if (irq < 0) | ||||
| -		pr_crit("pci %s: no irq found for pin %u\n", | ||||
| -			pci_name((struct pci_dev *) dev), pin); | ||||
| -	else | ||||
| -		pr_info("pci %s: using irq %d for pin %u\n", | ||||
| -			pci_name((struct pci_dev *) dev), irq, pin); | ||||
| - | ||||
| -	return irq; | ||||
| -} | ||||
| - | ||||
| -int pcibios_plat_dev_init(struct pci_dev *dev) | ||||
| -{ | ||||
| -	if (ath79_pci_plat_dev_init) | ||||
| -		return ath79_pci_plat_dev_init(dev); | ||||
| - | ||||
| -	return 0; | ||||
| -} | ||||
| - | ||||
| -void __init ath79_pci_set_irq_map(unsigned nr_irqs, | ||||
| -				  const struct ath79_pci_irq *map) | ||||
| -{ | ||||
| -	ath79_pci_nr_irqs = nr_irqs; | ||||
| -	ath79_pci_irq_map = map; | ||||
| -} | ||||
| - | ||||
| -void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)) | ||||
| -{ | ||||
| -	ath79_pci_plat_dev_init = func; | ||||
| -} | ||||
| - | ||||
| -static struct platform_device * | ||||
| -ath79_register_pci_ar71xx(void) | ||||
| -{ | ||||
| -	struct platform_device *pdev; | ||||
| -	struct resource res[4]; | ||||
| - | ||||
| -	memset(res, 0, sizeof(res)); | ||||
| - | ||||
| -	res[0].name = "cfg_base"; | ||||
| -	res[0].flags = IORESOURCE_MEM; | ||||
| -	res[0].start = AR71XX_PCI_CFG_BASE; | ||||
| -	res[0].end = AR71XX_PCI_CFG_BASE + AR71XX_PCI_CFG_SIZE - 1; | ||||
| - | ||||
| -	res[1].flags = IORESOURCE_IRQ; | ||||
| -	res[1].start = ATH79_CPU_IRQ(2); | ||||
| -	res[1].end = ATH79_CPU_IRQ(2); | ||||
| - | ||||
| -	res[2].name = "io_base"; | ||||
| -	res[2].flags = IORESOURCE_IO; | ||||
| -	res[2].start = 0; | ||||
| -	res[2].end = 0; | ||||
| - | ||||
| -	res[3].name = "mem_base"; | ||||
| -	res[3].flags = IORESOURCE_MEM; | ||||
| -	res[3].start = AR71XX_PCI_MEM_BASE; | ||||
| -	res[3].end = AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE - 1; | ||||
| - | ||||
| -	pdev = platform_device_register_simple("ar71xx-pci", -1, | ||||
| -					       res, ARRAY_SIZE(res)); | ||||
| -	return pdev; | ||||
| -} | ||||
| - | ||||
| -static struct platform_device * | ||||
| -ath79_register_pci_ar724x(int id, | ||||
| -			  unsigned long cfg_base, | ||||
| -			  unsigned long ctrl_base, | ||||
| -			  unsigned long crp_base, | ||||
| -			  unsigned long mem_base, | ||||
| -			  unsigned long mem_size, | ||||
| -			  unsigned long io_base, | ||||
| -			  int irq) | ||||
| -{ | ||||
| -	struct platform_device *pdev; | ||||
| -	struct resource res[6]; | ||||
| - | ||||
| -	memset(res, 0, sizeof(res)); | ||||
| - | ||||
| -	res[0].name = "cfg_base"; | ||||
| -	res[0].flags = IORESOURCE_MEM; | ||||
| -	res[0].start = cfg_base; | ||||
| -	res[0].end = cfg_base + AR724X_PCI_CFG_SIZE - 1; | ||||
| - | ||||
| -	res[1].name = "ctrl_base"; | ||||
| -	res[1].flags = IORESOURCE_MEM; | ||||
| -	res[1].start = ctrl_base; | ||||
| -	res[1].end = ctrl_base + AR724X_PCI_CTRL_SIZE - 1; | ||||
| - | ||||
| -	res[2].flags = IORESOURCE_IRQ; | ||||
| -	res[2].start = irq; | ||||
| -	res[2].end = irq; | ||||
| - | ||||
| -	res[3].name = "mem_base"; | ||||
| -	res[3].flags = IORESOURCE_MEM; | ||||
| -	res[3].start = mem_base; | ||||
| -	res[3].end = mem_base + mem_size - 1; | ||||
| - | ||||
| -	res[4].name = "io_base"; | ||||
| -	res[4].flags = IORESOURCE_IO; | ||||
| -	res[4].start = io_base; | ||||
| -	res[4].end = io_base; | ||||
| - | ||||
| -	res[5].name = "crp_base"; | ||||
| -	res[5].flags = IORESOURCE_MEM; | ||||
| -	res[5].start = crp_base; | ||||
| -	res[5].end = crp_base + AR724X_PCI_CRP_SIZE - 1; | ||||
| - | ||||
| -	pdev = platform_device_register_simple("ar724x-pci", id, | ||||
| -					       res, ARRAY_SIZE(res)); | ||||
| -	return pdev; | ||||
| -} | ||||
| - | ||||
| -int __init ath79_register_pci(void) | ||||
| -{ | ||||
| -	struct platform_device *pdev = NULL; | ||||
| - | ||||
| -	if (soc_is_ar71xx()) { | ||||
| -		pdev = ath79_register_pci_ar71xx(); | ||||
| -	} else if (soc_is_ar724x()) { | ||||
| -		pdev = ath79_register_pci_ar724x(-1, | ||||
| -						 AR724X_PCI_CFG_BASE, | ||||
| -						 AR724X_PCI_CTRL_BASE, | ||||
| -						 AR724X_PCI_CRP_BASE, | ||||
| -						 AR724X_PCI_MEM_BASE, | ||||
| -						 AR724X_PCI_MEM_SIZE, | ||||
| -						 0, | ||||
| -						 ATH79_CPU_IRQ(2)); | ||||
| -	} else if (soc_is_ar9342() || | ||||
| -		   soc_is_ar9344()) { | ||||
| -		u32 bootstrap; | ||||
| - | ||||
| -		bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP); | ||||
| -		if ((bootstrap & AR934X_BOOTSTRAP_PCIE_RC) == 0) | ||||
| -			return -ENODEV; | ||||
| - | ||||
| -		pdev = ath79_register_pci_ar724x(-1, | ||||
| -						 AR724X_PCI_CFG_BASE, | ||||
| -						 AR724X_PCI_CTRL_BASE, | ||||
| -						 AR724X_PCI_CRP_BASE, | ||||
| -						 AR724X_PCI_MEM_BASE, | ||||
| -						 AR724X_PCI_MEM_SIZE, | ||||
| -						 0, | ||||
| -						 ATH79_IP2_IRQ(0)); | ||||
| -	} else if (soc_is_qca9558()) { | ||||
| -		pdev = ath79_register_pci_ar724x(0, | ||||
| -						 QCA955X_PCI_CFG_BASE0, | ||||
| -						 QCA955X_PCI_CTRL_BASE0, | ||||
| -						 QCA955X_PCI_CRP_BASE0, | ||||
| -						 QCA955X_PCI_MEM_BASE0, | ||||
| -						 QCA955X_PCI_MEM_SIZE, | ||||
| -						 0, | ||||
| -						 ATH79_IP2_IRQ(0)); | ||||
| - | ||||
| -		pdev = ath79_register_pci_ar724x(1, | ||||
| -						 QCA955X_PCI_CFG_BASE1, | ||||
| -						 QCA955X_PCI_CTRL_BASE1, | ||||
| -						 QCA955X_PCI_CRP_BASE1, | ||||
| -						 QCA955X_PCI_MEM_BASE1, | ||||
| -						 QCA955X_PCI_MEM_SIZE, | ||||
| -						 1, | ||||
| -						 ATH79_IP3_IRQ(2)); | ||||
| -	} else if (soc_is_qca956x()) { | ||||
| -		pdev = ath79_register_pci_ar724x(0, | ||||
| -						 QCA956X_PCI_CFG_BASE1, | ||||
| -						 QCA956X_PCI_CTRL_BASE1, | ||||
| -						 QCA956X_PCI_CRP_BASE1, | ||||
| -						 QCA956X_PCI_MEM_BASE1, | ||||
| -						 QCA956X_PCI_MEM_SIZE, | ||||
| -						 1, | ||||
| -						 ATH79_IP3_IRQ(2)); | ||||
| -	} else { | ||||
| -		/* No PCI support */ | ||||
| -		return -ENODEV; | ||||
| -	} | ||||
| - | ||||
| -	if (!pdev) | ||||
| -		pr_err("unable to register PCI controller device\n"); | ||||
| - | ||||
| -	return pdev ? 0 : -ENODEV; | ||||
| -} | ||||
| Index: linux-4.14.25/arch/mips/pci/Makefile | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/pci/Makefile | ||||
| +++ linux-4.14.25/arch/mips/pci/Makefile | ||||
| @@ -29,6 +29,7 @@ obj-$(CONFIG_MIPS_PCI_VIRTIO)	+= pci-vir | ||||
|  # | ||||
|  # These are still pretty much in the old state, watch, go blind. | ||||
|  # | ||||
| +obj-$(CONFIG_ATH79)		+= fixup-ath79.o | ||||
|  obj-$(CONFIG_LASAT)		+= pci-lasat.o | ||||
|  obj-$(CONFIG_MIPS_COBALT)	+= fixup-cobalt.o | ||||
|  obj-$(CONFIG_LEMOTE_FULOONG2E)	+= fixup-fuloong2e.o ops-loongson2.o | ||||
| Index: linux-4.14.25/arch/mips/pci/fixup-ath79.c | ||||
| =================================================================== | ||||
| --- /dev/null | ||||
| +++ linux-4.14.25/arch/mips/pci/fixup-ath79.c | ||||
| @@ -0,0 +1,21 @@ | ||||
| +/* | ||||
| + *  Copyright (C) 2018 John Crispin <john@phrozen.org> | ||||
| + * | ||||
| + *  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. | ||||
| + */ | ||||
| + | ||||
| +#include <linux/pci.h> | ||||
| +//#include <linux/of_irq.h> | ||||
| +#include <linux/of_pci.h> | ||||
| + | ||||
| +int pcibios_plat_dev_init(struct pci_dev *dev) | ||||
| +{ | ||||
| +	return PCIBIOS_SUCCESSFUL; | ||||
| +} | ||||
| + | ||||
| +int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||||
| +{ | ||||
| +	return of_irq_parse_and_map_pci(dev, slot, pin); | ||||
| +} | ||||
| @@ -0,0 +1,756 @@ | ||||
| From 6e38a86d50dba5cc1da9bfd07969d76dd3ac2dda Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 6 Mar 2018 09:28:13 +0100 | ||||
| Subject: [PATCH 23/27] MIPS: ath79: drop mach files | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  arch/mips/ath79/Kconfig        |  73 ------------------- | ||||
|  arch/mips/ath79/Makefile       |  10 --- | ||||
|  arch/mips/ath79/mach-ap121.c   |  92 ------------------------ | ||||
|  arch/mips/ath79/mach-ap136.c   | 156 ----------------------------------------- | ||||
|  arch/mips/ath79/mach-ap81.c    | 100 -------------------------- | ||||
|  arch/mips/ath79/mach-db120.c   | 136 ----------------------------------- | ||||
|  arch/mips/ath79/mach-pb44.c    | 128 --------------------------------- | ||||
|  arch/mips/ath79/mach-ubnt-xm.c | 126 --------------------------------- | ||||
|  8 files changed, 821 deletions(-) | ||||
|  delete mode 100644 arch/mips/ath79/mach-ap121.c | ||||
|  delete mode 100644 arch/mips/ath79/mach-ap136.c | ||||
|  delete mode 100644 arch/mips/ath79/mach-ap81.c | ||||
|  delete mode 100644 arch/mips/ath79/mach-db120.c | ||||
|  delete mode 100644 arch/mips/ath79/mach-pb44.c | ||||
|  delete mode 100644 arch/mips/ath79/mach-ubnt-xm.c | ||||
|  | ||||
| Index: linux-4.14.25/arch/mips/ath79/Kconfig | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/Kconfig | ||||
| +++ linux-4.14.25/arch/mips/ath79/Kconfig | ||||
| @@ -1,79 +1,6 @@ | ||||
|  # SPDX-License-Identifier: GPL-2.0 | ||||
|  if ATH79 | ||||
|   | ||||
| -menu "Atheros AR71XX/AR724X/AR913X machine selection" | ||||
| - | ||||
| -config ATH79_MACH_AP121 | ||||
| -	bool "Atheros AP121 reference board" | ||||
| -	select SOC_AR933X | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	select ATH79_DEV_USB | ||||
| -	select ATH79_DEV_WMAC | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Atheros AP121 reference board. | ||||
| - | ||||
| -config ATH79_MACH_AP136 | ||||
| -	bool "Atheros AP136 reference board" | ||||
| -	select SOC_QCA955X | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	select ATH79_DEV_USB | ||||
| -	select ATH79_DEV_WMAC | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Atheros AP136 reference board. | ||||
| - | ||||
| -config ATH79_MACH_AP81 | ||||
| -	bool "Atheros AP81 reference board" | ||||
| -	select SOC_AR913X | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	select ATH79_DEV_USB | ||||
| -	select ATH79_DEV_WMAC | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Atheros AP81 reference board. | ||||
| - | ||||
| -config ATH79_MACH_DB120 | ||||
| -	bool "Atheros DB120 reference board" | ||||
| -	select SOC_AR934X | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	select ATH79_DEV_USB | ||||
| -	select ATH79_DEV_WMAC | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Atheros DB120 reference board. | ||||
| - | ||||
| -config ATH79_MACH_PB44 | ||||
| -	bool "Atheros PB44 reference board" | ||||
| -	select SOC_AR71XX | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	select ATH79_DEV_USB | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Atheros PB44 reference board. | ||||
| - | ||||
| -config ATH79_MACH_UBNT_XM | ||||
| -	bool "Ubiquiti Networks XM (rev 1.0) board" | ||||
| -	select SOC_AR724X | ||||
| -	select ATH79_DEV_GPIO_BUTTONS | ||||
| -	select ATH79_DEV_LEDS_GPIO | ||||
| -	select ATH79_DEV_SPI | ||||
| -	help | ||||
| -	  Say 'Y' here if you want your kernel to support the | ||||
| -	  Ubiquiti Networks XM (rev 1.0) board. | ||||
| - | ||||
| -endmenu | ||||
| - | ||||
|  config SOC_AR71XX | ||||
|  	select HW_HAS_PCI | ||||
|  	def_bool n | ||||
| Index: linux-4.14.25/arch/mips/ath79/Makefile | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/Makefile | ||||
| +++ linux-4.14.25/arch/mips/ath79/Makefile | ||||
| @@ -21,13 +21,3 @@ obj-$(CONFIG_ATH79_DEV_LEDS_GPIO)	+= dev | ||||
|  obj-$(CONFIG_ATH79_DEV_SPI)		+= dev-spi.o | ||||
|  obj-$(CONFIG_ATH79_DEV_USB)		+= dev-usb.o | ||||
|  obj-$(CONFIG_ATH79_DEV_WMAC)		+= dev-wmac.o | ||||
| - | ||||
| -# | ||||
| -# Machines | ||||
| -# | ||||
| -obj-$(CONFIG_ATH79_MACH_AP121)		+= mach-ap121.o | ||||
| -obj-$(CONFIG_ATH79_MACH_AP136)		+= mach-ap136.o | ||||
| -obj-$(CONFIG_ATH79_MACH_AP81)		+= mach-ap81.o | ||||
| -obj-$(CONFIG_ATH79_MACH_DB120)		+= mach-db120.o | ||||
| -obj-$(CONFIG_ATH79_MACH_PB44)		+= mach-pb44.o | ||||
| -obj-$(CONFIG_ATH79_MACH_UBNT_XM)	+= mach-ubnt-xm.o | ||||
| Index: linux-4.14.25/arch/mips/ath79/mach-ap121.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/mach-ap121.c | ||||
| +++ /dev/null | ||||
| @@ -1,92 +0,0 @@ | ||||
| -/* | ||||
| - *  Atheros AP121 board support | ||||
| - * | ||||
| - *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
| - * | ||||
| - *  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. | ||||
| - */ | ||||
| - | ||||
| -#include "machtypes.h" | ||||
| -#include "dev-gpio-buttons.h" | ||||
| -#include "dev-leds-gpio.h" | ||||
| -#include "dev-spi.h" | ||||
| -#include "dev-usb.h" | ||||
| -#include "dev-wmac.h" | ||||
| - | ||||
| -#define AP121_GPIO_LED_WLAN		0 | ||||
| -#define AP121_GPIO_LED_USB		1 | ||||
| - | ||||
| -#define AP121_GPIO_BTN_JUMPSTART	11 | ||||
| -#define AP121_GPIO_BTN_RESET		12 | ||||
| - | ||||
| -#define AP121_KEYS_POLL_INTERVAL	20	/* msecs */ | ||||
| -#define AP121_KEYS_DEBOUNCE_INTERVAL	(3 * AP121_KEYS_POLL_INTERVAL) | ||||
| - | ||||
| -#define AP121_CAL_DATA_ADDR	0x1fff1000 | ||||
| - | ||||
| -static struct gpio_led ap121_leds_gpio[] __initdata = { | ||||
| -	{ | ||||
| -		.name		= "ap121:green:usb", | ||||
| -		.gpio		= AP121_GPIO_LED_USB, | ||||
| -		.active_low	= 0, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "ap121:green:wlan", | ||||
| -		.gpio		= AP121_GPIO_LED_WLAN, | ||||
| -		.active_low	= 0, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_keys_button ap121_gpio_keys[] __initdata = { | ||||
| -	{ | ||||
| -		.desc		= "jumpstart button", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_WPS_BUTTON, | ||||
| -		.debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP121_GPIO_BTN_JUMPSTART, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.desc		= "reset button", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_RESTART, | ||||
| -		.debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP121_GPIO_BTN_RESET, | ||||
| -		.active_low	= 1, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct spi_board_info ap121_spi_info[] = { | ||||
| -	{ | ||||
| -		.bus_num	= 0, | ||||
| -		.chip_select	= 0, | ||||
| -		.max_speed_hz	= 25000000, | ||||
| -		.modalias	= "mx25l1606e", | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct ath79_spi_platform_data ap121_spi_data = { | ||||
| -	.bus_num	= 0, | ||||
| -	.num_chipselect = 1, | ||||
| -}; | ||||
| - | ||||
| -static void __init ap121_setup(void) | ||||
| -{ | ||||
| -	u8 *cal_data = (u8 *) KSEG1ADDR(AP121_CAL_DATA_ADDR); | ||||
| - | ||||
| -	ath79_register_leds_gpio(-1, ARRAY_SIZE(ap121_leds_gpio), | ||||
| -				 ap121_leds_gpio); | ||||
| -	ath79_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL, | ||||
| -					ARRAY_SIZE(ap121_gpio_keys), | ||||
| -					ap121_gpio_keys); | ||||
| - | ||||
| -	ath79_register_spi(&ap121_spi_data, ap121_spi_info, | ||||
| -			   ARRAY_SIZE(ap121_spi_info)); | ||||
| -	ath79_register_usb(); | ||||
| -	ath79_register_wmac(cal_data); | ||||
| -} | ||||
| - | ||||
| -MIPS_MACHINE(ATH79_MACH_AP121, "AP121", "Atheros AP121 reference board", | ||||
| -	     ap121_setup); | ||||
| Index: linux-4.14.25/arch/mips/ath79/mach-ap136.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/mach-ap136.c | ||||
| +++ /dev/null | ||||
| @@ -1,156 +0,0 @@ | ||||
| -/* | ||||
| - * Qualcomm Atheros AP136 reference board support | ||||
| - * | ||||
| - * Copyright (c) 2012 Qualcomm Atheros | ||||
| - * Copyright (c) 2012-2013 Gabor Juhos <juhosg@openwrt.org> | ||||
| - * | ||||
| - * Permission to use, copy, modify, and/or distribute this software for any | ||||
| - * purpose with or without fee is hereby granted, provided that the above | ||||
| - * copyright notice and this permission notice appear in all copies. | ||||
| - * | ||||
| - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
| - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
| - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
| - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
| - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
| - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| - * | ||||
| - */ | ||||
| - | ||||
| -#include <linux/pci.h> | ||||
| -#include <linux/ath9k_platform.h> | ||||
| - | ||||
| -#include "machtypes.h" | ||||
| -#include "dev-gpio-buttons.h" | ||||
| -#include "dev-leds-gpio.h" | ||||
| -#include "dev-spi.h" | ||||
| -#include "dev-usb.h" | ||||
| -#include "dev-wmac.h" | ||||
| -#include "pci.h" | ||||
| - | ||||
| -#define AP136_GPIO_LED_STATUS_RED	14 | ||||
| -#define AP136_GPIO_LED_STATUS_GREEN	19 | ||||
| -#define AP136_GPIO_LED_USB		4 | ||||
| -#define AP136_GPIO_LED_WLAN_2G		13 | ||||
| -#define AP136_GPIO_LED_WLAN_5G		12 | ||||
| -#define AP136_GPIO_LED_WPS_RED		15 | ||||
| -#define AP136_GPIO_LED_WPS_GREEN	20 | ||||
| - | ||||
| -#define AP136_GPIO_BTN_WPS		16 | ||||
| -#define AP136_GPIO_BTN_RFKILL		21 | ||||
| - | ||||
| -#define AP136_KEYS_POLL_INTERVAL	20	/* msecs */ | ||||
| -#define AP136_KEYS_DEBOUNCE_INTERVAL	(3 * AP136_KEYS_POLL_INTERVAL) | ||||
| - | ||||
| -#define AP136_WMAC_CALDATA_OFFSET 0x1000 | ||||
| -#define AP136_PCIE_CALDATA_OFFSET 0x5000 | ||||
| - | ||||
| -static struct gpio_led ap136_leds_gpio[] __initdata = { | ||||
| -	{ | ||||
| -		.name		= "qca:green:status", | ||||
| -		.gpio		= AP136_GPIO_LED_STATUS_GREEN, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "qca:red:status", | ||||
| -		.gpio		= AP136_GPIO_LED_STATUS_RED, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "qca:green:wps", | ||||
| -		.gpio		= AP136_GPIO_LED_WPS_GREEN, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "qca:red:wps", | ||||
| -		.gpio		= AP136_GPIO_LED_WPS_RED, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "qca:red:wlan-2g", | ||||
| -		.gpio		= AP136_GPIO_LED_WLAN_2G, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "qca:red:usb", | ||||
| -		.gpio		= AP136_GPIO_LED_USB, | ||||
| -		.active_low	= 1, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_keys_button ap136_gpio_keys[] __initdata = { | ||||
| -	{ | ||||
| -		.desc		= "WPS button", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_WPS_BUTTON, | ||||
| -		.debounce_interval = AP136_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP136_GPIO_BTN_WPS, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.desc		= "RFKILL button", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_RFKILL, | ||||
| -		.debounce_interval = AP136_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP136_GPIO_BTN_RFKILL, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct spi_board_info ap136_spi_info[] = { | ||||
| -	{ | ||||
| -		.bus_num	= 0, | ||||
| -		.chip_select	= 0, | ||||
| -		.max_speed_hz	= 25000000, | ||||
| -		.modalias	= "mx25l6405d", | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct ath79_spi_platform_data ap136_spi_data = { | ||||
| -	.bus_num	= 0, | ||||
| -	.num_chipselect	= 1, | ||||
| -}; | ||||
| - | ||||
| -#ifdef CONFIG_PCI | ||||
| -static struct ath9k_platform_data ap136_ath9k_data; | ||||
| - | ||||
| -static int ap136_pci_plat_dev_init(struct pci_dev *dev) | ||||
| -{ | ||||
| -	if (dev->bus->number == 1 && (PCI_SLOT(dev->devfn)) == 0) | ||||
| -		dev->dev.platform_data = &ap136_ath9k_data; | ||||
| - | ||||
| -	return 0; | ||||
| -} | ||||
| - | ||||
| -static void __init ap136_pci_init(u8 *eeprom) | ||||
| -{ | ||||
| -	memcpy(ap136_ath9k_data.eeprom_data, eeprom, | ||||
| -	       sizeof(ap136_ath9k_data.eeprom_data)); | ||||
| - | ||||
| -	ath79_pci_set_plat_dev_init(ap136_pci_plat_dev_init); | ||||
| -	ath79_register_pci(); | ||||
| -} | ||||
| -#else | ||||
| -static inline void ap136_pci_init(u8 *eeprom) {} | ||||
| -#endif /* CONFIG_PCI */ | ||||
| - | ||||
| -static void __init ap136_setup(void) | ||||
| -{ | ||||
| -	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); | ||||
| - | ||||
| -	ath79_register_leds_gpio(-1, ARRAY_SIZE(ap136_leds_gpio), | ||||
| -				 ap136_leds_gpio); | ||||
| -	ath79_register_gpio_keys_polled(-1, AP136_KEYS_POLL_INTERVAL, | ||||
| -					ARRAY_SIZE(ap136_gpio_keys), | ||||
| -					ap136_gpio_keys); | ||||
| -	ath79_register_spi(&ap136_spi_data, ap136_spi_info, | ||||
| -			   ARRAY_SIZE(ap136_spi_info)); | ||||
| -	ath79_register_usb(); | ||||
| -	ath79_register_wmac(art + AP136_WMAC_CALDATA_OFFSET); | ||||
| -	ap136_pci_init(art + AP136_PCIE_CALDATA_OFFSET); | ||||
| -} | ||||
| - | ||||
| -MIPS_MACHINE(ATH79_MACH_AP136_010, "AP136-010", | ||||
| -	     "Atheros AP136-010 reference board", | ||||
| -	     ap136_setup); | ||||
| Index: linux-4.14.25/arch/mips/ath79/mach-ap81.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/mach-ap81.c | ||||
| +++ /dev/null | ||||
| @@ -1,100 +0,0 @@ | ||||
| -/* | ||||
| - *  Atheros AP81 board support | ||||
| - * | ||||
| - *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
| - *  Copyright (C) 2009 Imre Kaloz <kaloz@openwrt.org> | ||||
| - * | ||||
| - *  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. | ||||
| - */ | ||||
| - | ||||
| -#include "machtypes.h" | ||||
| -#include "dev-wmac.h" | ||||
| -#include "dev-gpio-buttons.h" | ||||
| -#include "dev-leds-gpio.h" | ||||
| -#include "dev-spi.h" | ||||
| -#include "dev-usb.h" | ||||
| - | ||||
| -#define AP81_GPIO_LED_STATUS	1 | ||||
| -#define AP81_GPIO_LED_AOSS	3 | ||||
| -#define AP81_GPIO_LED_WLAN	6 | ||||
| -#define AP81_GPIO_LED_POWER	14 | ||||
| - | ||||
| -#define AP81_GPIO_BTN_SW4	12 | ||||
| -#define AP81_GPIO_BTN_SW1	21 | ||||
| - | ||||
| -#define AP81_KEYS_POLL_INTERVAL		20	/* msecs */ | ||||
| -#define AP81_KEYS_DEBOUNCE_INTERVAL	(3 * AP81_KEYS_POLL_INTERVAL) | ||||
| - | ||||
| -#define AP81_CAL_DATA_ADDR	0x1fff1000 | ||||
| - | ||||
| -static struct gpio_led ap81_leds_gpio[] __initdata = { | ||||
| -	{ | ||||
| -		.name		= "ap81:green:status", | ||||
| -		.gpio		= AP81_GPIO_LED_STATUS, | ||||
| -		.active_low	= 1, | ||||
| -	}, { | ||||
| -		.name		= "ap81:amber:aoss", | ||||
| -		.gpio		= AP81_GPIO_LED_AOSS, | ||||
| -		.active_low	= 1, | ||||
| -	}, { | ||||
| -		.name		= "ap81:green:wlan", | ||||
| -		.gpio		= AP81_GPIO_LED_WLAN, | ||||
| -		.active_low	= 1, | ||||
| -	}, { | ||||
| -		.name		= "ap81:green:power", | ||||
| -		.gpio		= AP81_GPIO_LED_POWER, | ||||
| -		.active_low	= 1, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_keys_button ap81_gpio_keys[] __initdata = { | ||||
| -	{ | ||||
| -		.desc		= "sw1", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= BTN_0, | ||||
| -		.debounce_interval = AP81_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP81_GPIO_BTN_SW1, | ||||
| -		.active_low	= 1, | ||||
| -	} , { | ||||
| -		.desc		= "sw4", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= BTN_1, | ||||
| -		.debounce_interval = AP81_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= AP81_GPIO_BTN_SW4, | ||||
| -		.active_low	= 1, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct spi_board_info ap81_spi_info[] = { | ||||
| -	{ | ||||
| -		.bus_num	= 0, | ||||
| -		.chip_select	= 0, | ||||
| -		.max_speed_hz	= 25000000, | ||||
| -		.modalias	= "m25p64", | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct ath79_spi_platform_data ap81_spi_data = { | ||||
| -	.bus_num	= 0, | ||||
| -	.num_chipselect = 1, | ||||
| -}; | ||||
| - | ||||
| -static void __init ap81_setup(void) | ||||
| -{ | ||||
| -	u8 *cal_data = (u8 *) KSEG1ADDR(AP81_CAL_DATA_ADDR); | ||||
| - | ||||
| -	ath79_register_leds_gpio(-1, ARRAY_SIZE(ap81_leds_gpio), | ||||
| -				 ap81_leds_gpio); | ||||
| -	ath79_register_gpio_keys_polled(-1, AP81_KEYS_POLL_INTERVAL, | ||||
| -					ARRAY_SIZE(ap81_gpio_keys), | ||||
| -					ap81_gpio_keys); | ||||
| -	ath79_register_spi(&ap81_spi_data, ap81_spi_info, | ||||
| -			   ARRAY_SIZE(ap81_spi_info)); | ||||
| -	ath79_register_wmac(cal_data); | ||||
| -	ath79_register_usb(); | ||||
| -} | ||||
| - | ||||
| -MIPS_MACHINE(ATH79_MACH_AP81, "AP81", "Atheros AP81 reference board", | ||||
| -	     ap81_setup); | ||||
| Index: linux-4.14.25/arch/mips/ath79/mach-db120.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/mach-db120.c | ||||
| +++ /dev/null | ||||
| @@ -1,136 +0,0 @@ | ||||
| -/* | ||||
| - * Atheros DB120 reference board support | ||||
| - * | ||||
| - * Copyright (c) 2011 Qualcomm Atheros | ||||
| - * Copyright (c) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||
| - * | ||||
| - * Permission to use, copy, modify, and/or distribute this software for any | ||||
| - * purpose with or without fee is hereby granted, provided that the above | ||||
| - * copyright notice and this permission notice appear in all copies. | ||||
| - * | ||||
| - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
| - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
| - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
| - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
| - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
| - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| - * | ||||
| - */ | ||||
| - | ||||
| -#include <linux/pci.h> | ||||
| -#include <linux/ath9k_platform.h> | ||||
| - | ||||
| -#include "machtypes.h" | ||||
| -#include "dev-gpio-buttons.h" | ||||
| -#include "dev-leds-gpio.h" | ||||
| -#include "dev-spi.h" | ||||
| -#include "dev-usb.h" | ||||
| -#include "dev-wmac.h" | ||||
| -#include "pci.h" | ||||
| - | ||||
| -#define DB120_GPIO_LED_WLAN_5G		12 | ||||
| -#define DB120_GPIO_LED_WLAN_2G		13 | ||||
| -#define DB120_GPIO_LED_STATUS		14 | ||||
| -#define DB120_GPIO_LED_WPS		15 | ||||
| - | ||||
| -#define DB120_GPIO_BTN_WPS		16 | ||||
| - | ||||
| -#define DB120_KEYS_POLL_INTERVAL	20	/* msecs */ | ||||
| -#define DB120_KEYS_DEBOUNCE_INTERVAL	(3 * DB120_KEYS_POLL_INTERVAL) | ||||
| - | ||||
| -#define DB120_WMAC_CALDATA_OFFSET 0x1000 | ||||
| -#define DB120_PCIE_CALDATA_OFFSET 0x5000 | ||||
| - | ||||
| -static struct gpio_led db120_leds_gpio[] __initdata = { | ||||
| -	{ | ||||
| -		.name		= "db120:green:status", | ||||
| -		.gpio		= DB120_GPIO_LED_STATUS, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "db120:green:wps", | ||||
| -		.gpio		= DB120_GPIO_LED_WPS, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "db120:green:wlan-5g", | ||||
| -		.gpio		= DB120_GPIO_LED_WLAN_5G, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -	{ | ||||
| -		.name		= "db120:green:wlan-2g", | ||||
| -		.gpio		= DB120_GPIO_LED_WLAN_2G, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_keys_button db120_gpio_keys[] __initdata = { | ||||
| -	{ | ||||
| -		.desc		= "WPS button", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_WPS_BUTTON, | ||||
| -		.debounce_interval = DB120_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= DB120_GPIO_BTN_WPS, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct spi_board_info db120_spi_info[] = { | ||||
| -	{ | ||||
| -		.bus_num	= 0, | ||||
| -		.chip_select	= 0, | ||||
| -		.max_speed_hz	= 25000000, | ||||
| -		.modalias	= "s25sl064a", | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct ath79_spi_platform_data db120_spi_data = { | ||||
| -	.bus_num	= 0, | ||||
| -	.num_chipselect = 1, | ||||
| -}; | ||||
| - | ||||
| -#ifdef CONFIG_PCI | ||||
| -static struct ath9k_platform_data db120_ath9k_data; | ||||
| - | ||||
| -static int db120_pci_plat_dev_init(struct pci_dev *dev) | ||||
| -{ | ||||
| -	switch (PCI_SLOT(dev->devfn)) { | ||||
| -	case 0: | ||||
| -		dev->dev.platform_data = &db120_ath9k_data; | ||||
| -		break; | ||||
| -	} | ||||
| - | ||||
| -	return 0; | ||||
| -} | ||||
| - | ||||
| -static void __init db120_pci_init(u8 *eeprom) | ||||
| -{ | ||||
| -	memcpy(db120_ath9k_data.eeprom_data, eeprom, | ||||
| -	       sizeof(db120_ath9k_data.eeprom_data)); | ||||
| - | ||||
| -	ath79_pci_set_plat_dev_init(db120_pci_plat_dev_init); | ||||
| -	ath79_register_pci(); | ||||
| -} | ||||
| -#else | ||||
| -static inline void db120_pci_init(u8 *eeprom) {} | ||||
| -#endif /* CONFIG_PCI */ | ||||
| - | ||||
| -static void __init db120_setup(void) | ||||
| -{ | ||||
| -	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); | ||||
| - | ||||
| -	ath79_register_leds_gpio(-1, ARRAY_SIZE(db120_leds_gpio), | ||||
| -				 db120_leds_gpio); | ||||
| -	ath79_register_gpio_keys_polled(-1, DB120_KEYS_POLL_INTERVAL, | ||||
| -					ARRAY_SIZE(db120_gpio_keys), | ||||
| -					db120_gpio_keys); | ||||
| -	ath79_register_spi(&db120_spi_data, db120_spi_info, | ||||
| -			   ARRAY_SIZE(db120_spi_info)); | ||||
| -	ath79_register_usb(); | ||||
| -	ath79_register_wmac(art + DB120_WMAC_CALDATA_OFFSET); | ||||
| -	db120_pci_init(art + DB120_PCIE_CALDATA_OFFSET); | ||||
| -} | ||||
| - | ||||
| -MIPS_MACHINE(ATH79_MACH_DB120, "DB120", "Atheros DB120 reference board", | ||||
| -	     db120_setup); | ||||
| Index: linux-4.14.25/arch/mips/ath79/mach-pb44.c | ||||
| =================================================================== | ||||
| --- linux-4.14.25.orig/arch/mips/ath79/mach-pb44.c | ||||
| +++ /dev/null | ||||
| @@ -1,122 +0,0 @@ | ||||
| -/* | ||||
| - *  Atheros PB44 reference board support | ||||
| - * | ||||
| - *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> | ||||
| - * | ||||
| - *  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. | ||||
| - */ | ||||
| - | ||||
| -#include <linux/init.h> | ||||
| -#include <linux/platform_device.h> | ||||
| -#include <linux/i2c.h> | ||||
| -#include <linux/i2c-gpio.h> | ||||
| -#include <linux/platform_data/pcf857x.h> | ||||
| - | ||||
| -#include "machtypes.h" | ||||
| -#include "dev-gpio-buttons.h" | ||||
| -#include "dev-leds-gpio.h" | ||||
| -#include "dev-spi.h" | ||||
| -#include "dev-usb.h" | ||||
| -#include "pci.h" | ||||
| - | ||||
| -#define PB44_GPIO_I2C_SCL	0 | ||||
| -#define PB44_GPIO_I2C_SDA	1 | ||||
| - | ||||
| -#define PB44_GPIO_EXP_BASE	16 | ||||
| -#define PB44_GPIO_SW_RESET	(PB44_GPIO_EXP_BASE + 6) | ||||
| -#define PB44_GPIO_SW_JUMP	(PB44_GPIO_EXP_BASE + 8) | ||||
| -#define PB44_GPIO_LED_JUMP1	(PB44_GPIO_EXP_BASE + 9) | ||||
| -#define PB44_GPIO_LED_JUMP2	(PB44_GPIO_EXP_BASE + 10) | ||||
| - | ||||
| -#define PB44_KEYS_POLL_INTERVAL		20	/* msecs */ | ||||
| -#define PB44_KEYS_DEBOUNCE_INTERVAL	(3 * PB44_KEYS_POLL_INTERVAL) | ||||
| - | ||||
| -static struct i2c_gpio_platform_data pb44_i2c_gpio_data = { | ||||
| -	.sda_pin	= PB44_GPIO_I2C_SDA, | ||||
| -	.scl_pin	= PB44_GPIO_I2C_SCL, | ||||
| -}; | ||||
| - | ||||
| -static struct platform_device pb44_i2c_gpio_device = { | ||||
| -	.name		= "i2c-gpio", | ||||
| -	.id		= 0, | ||||
| -	.dev = { | ||||
| -		.platform_data	= &pb44_i2c_gpio_data, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct pcf857x_platform_data pb44_pcf857x_data = { | ||||
| -	.gpio_base	= PB44_GPIO_EXP_BASE, | ||||
| -}; | ||||
| - | ||||
| -static struct i2c_board_info pb44_i2c_board_info[] __initdata = { | ||||
| -	{ | ||||
| -		I2C_BOARD_INFO("pcf8575", 0x20), | ||||
| -		.platform_data	= &pb44_pcf857x_data, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_led pb44_leds_gpio[] __initdata = { | ||||
| -	{ | ||||
| -		.name		= "pb44:amber:jump1", | ||||
| -		.gpio		= PB44_GPIO_LED_JUMP1, | ||||
| -		.active_low	= 1, | ||||
| -	}, { | ||||
| -		.name		= "pb44:green:jump2", | ||||
| -		.gpio		= PB44_GPIO_LED_JUMP2, | ||||
| -		.active_low	= 1, | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct gpio_keys_button pb44_gpio_keys[] __initdata = { | ||||
| -	{ | ||||
| -		.desc		= "soft_reset", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_RESTART, | ||||
| -		.debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= PB44_GPIO_SW_RESET, | ||||
| -		.active_low	= 1, | ||||
| -	} , { | ||||
| -		.desc		= "jumpstart", | ||||
| -		.type		= EV_KEY, | ||||
| -		.code		= KEY_WPS_BUTTON, | ||||
| -		.debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||||
| -		.gpio		= PB44_GPIO_SW_JUMP, | ||||
| -		.active_low	= 1, | ||||
| -	} | ||||
| -}; | ||||
| - | ||||
| -static struct spi_board_info pb44_spi_info[] = { | ||||
| -	{ | ||||
| -		.bus_num	= 0, | ||||
| -		.chip_select	= 0, | ||||
| -		.max_speed_hz	= 25000000, | ||||
| -		.modalias	= "m25p64", | ||||
| -	}, | ||||
| -}; | ||||
| - | ||||
| -static struct ath79_spi_platform_data pb44_spi_data = { | ||||
| -	.bus_num		= 0, | ||||
| -	.num_chipselect		= 1, | ||||
| -}; | ||||
| - | ||||
| -static void __init pb44_init(void) | ||||
| -{ | ||||
| -	i2c_register_board_info(0, pb44_i2c_board_info, | ||||
| -				ARRAY_SIZE(pb44_i2c_board_info)); | ||||
| -	platform_device_register(&pb44_i2c_gpio_device); | ||||
| - | ||||
| -	ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio), | ||||
| -				 pb44_leds_gpio); | ||||
| -	ath79_register_gpio_keys_polled(-1, PB44_KEYS_POLL_INTERVAL, | ||||
| -					ARRAY_SIZE(pb44_gpio_keys), | ||||
| -					pb44_gpio_keys); | ||||
| -	ath79_register_spi(&pb44_spi_data, pb44_spi_info, | ||||
| -			   ARRAY_SIZE(pb44_spi_info)); | ||||
| -	ath79_register_usb(); | ||||
| -	ath79_register_pci(); | ||||
| -} | ||||
| - | ||||
| -MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board", | ||||
| -	     pb44_init); | ||||
| @@ -0,0 +1,166 @@ | ||||
| From 4267880319bc1a2270d352e0ded6d6386242a7ef Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <blogic@openwrt.org> | ||||
| Date: Tue, 12 Aug 2014 20:49:27 +0200 | ||||
| Subject: [PATCH 24/53] GPIO: add named gpio exports | ||||
|  | ||||
| Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
| --- | ||||
|  drivers/gpio/gpiolib-of.c     |   68 +++++++++++++++++++++++++++++++++++++++++ | ||||
|  drivers/gpio/gpiolib-sysfs.c  |   10 +++++- | ||||
|  include/asm-generic/gpio.h    |    6 ++++ | ||||
|  include/linux/gpio/consumer.h |    8 +++++ | ||||
|  4 files changed, 91 insertions(+), 1 deletion(-) | ||||
|  | ||||
| --- a/drivers/gpio/gpiolib-of.c | ||||
| +++ b/drivers/gpio/gpiolib-of.c | ||||
| @@ -23,6 +23,8 @@ | ||||
|  #include <linux/pinctrl/pinctrl.h> | ||||
|  #include <linux/slab.h> | ||||
|  #include <linux/gpio/machine.h> | ||||
| +#include <linux/init.h> | ||||
| +#include <linux/platform_device.h> | ||||
|   | ||||
|  #include "gpiolib.h" | ||||
|   | ||||
| @@ -506,3 +508,69 @@ void of_gpiochip_remove(struct gpio_chip | ||||
|  	gpiochip_remove_pin_ranges(chip); | ||||
|  	of_node_put(chip->of_node); | ||||
|  } | ||||
| + | ||||
| +static struct of_device_id gpio_export_ids[] = { | ||||
| +	{ .compatible = "gpio-export" }, | ||||
| +	{ /* sentinel */ } | ||||
| +}; | ||||
| + | ||||
| +static int __init of_gpio_export_probe(struct platform_device *pdev) | ||||
| +{ | ||||
| +	struct device_node *np = pdev->dev.of_node; | ||||
| +	struct device_node *cnp; | ||||
| +	u32 val; | ||||
| +	int nb = 0; | ||||
| + | ||||
| +	for_each_child_of_node(np, cnp) { | ||||
| +		const char *name = NULL; | ||||
| +		int gpio; | ||||
| +		bool dmc; | ||||
| +		int max_gpio = 1; | ||||
| +		int i; | ||||
| + | ||||
| +		of_property_read_string(cnp, "gpio-export,name", &name); | ||||
| + | ||||
| +		if (!name) | ||||
| +			max_gpio = of_gpio_count(cnp); | ||||
| + | ||||
| +		for (i = 0; i < max_gpio; i++) { | ||||
| +			unsigned flags = 0; | ||||
| +			enum of_gpio_flags of_flags; | ||||
| + | ||||
| +			gpio = of_get_gpio_flags(cnp, i, &of_flags); | ||||
| + | ||||
| +			if (of_flags == OF_GPIO_ACTIVE_LOW) | ||||
| +				flags |= GPIOF_ACTIVE_LOW; | ||||
| + | ||||
| +			if (!of_property_read_u32(cnp, "gpio-export,output", &val)) | ||||
| +				flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; | ||||
| +			else | ||||
| +				flags |= GPIOF_IN; | ||||
| + | ||||
| +			if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np))) | ||||
| +				continue; | ||||
| + | ||||
| +			dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change"); | ||||
| +			gpio_export_with_name(gpio, dmc, name); | ||||
| +			nb++; | ||||
| +		} | ||||
| +	} | ||||
| + | ||||
| +	dev_info(&pdev->dev, "%d gpio(s) exported\n", nb); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static struct platform_driver gpio_export_driver = { | ||||
| +	.driver		= { | ||||
| +		.name		= "gpio-export", | ||||
| +		.owner	= THIS_MODULE, | ||||
| +		.of_match_table	= of_match_ptr(gpio_export_ids), | ||||
| +	}, | ||||
| +}; | ||||
| + | ||||
| +static int __init of_gpio_export_init(void) | ||||
| +{ | ||||
| +	return platform_driver_probe(&gpio_export_driver, of_gpio_export_probe); | ||||
| +} | ||||
| +device_initcall(of_gpio_export_init); | ||||
| --- a/drivers/gpio/gpiolib-sysfs.c | ||||
| +++ b/drivers/gpio/gpiolib-sysfs.c | ||||
| @@ -553,7 +553,7 @@ static struct class gpio_class = { | ||||
|   * | ||||
|   * Returns zero on success, else an error. | ||||
|   */ | ||||
| -int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | ||||
| +int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name) | ||||
|  { | ||||
|  	struct gpio_chip	*chip; | ||||
|  	struct gpio_device	*gdev; | ||||
| @@ -615,6 +615,8 @@ int gpiod_export(struct gpio_desc *desc, | ||||
|  	offset = gpio_chip_hwgpio(desc); | ||||
|  	if (chip->names && chip->names[offset]) | ||||
|  		ioname = chip->names[offset]; | ||||
| +	if (name) | ||||
| +		ioname = name; | ||||
|   | ||||
|  	dev = device_create_with_groups(&gpio_class, &gdev->dev, | ||||
|  					MKDEV(0, 0), data, gpio_groups, | ||||
| @@ -636,6 +638,12 @@ err_unlock: | ||||
|  	gpiod_dbg(desc, "%s: status %d\n", __func__, status); | ||||
|  	return status; | ||||
|  } | ||||
| +EXPORT_SYMBOL_GPL(__gpiod_export); | ||||
| + | ||||
| +int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | ||||
| +{ | ||||
| +	return __gpiod_export(desc, direction_may_change, NULL); | ||||
| +} | ||||
|  EXPORT_SYMBOL_GPL(gpiod_export); | ||||
|   | ||||
|  static int match_export(struct device *dev, const void *desc) | ||||
| --- a/include/asm-generic/gpio.h | ||||
| +++ b/include/asm-generic/gpio.h | ||||
| @@ -127,6 +127,12 @@ static inline int gpio_export(unsigned g | ||||
|  	return gpiod_export(gpio_to_desc(gpio), direction_may_change); | ||||
|  } | ||||
|   | ||||
| +int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); | ||||
| +static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name) | ||||
| +{ | ||||
| +	return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name); | ||||
| +} | ||||
| + | ||||
|  static inline int gpio_export_link(struct device *dev, const char *name, | ||||
|  				   unsigned gpio) | ||||
|  { | ||||
| --- a/include/linux/gpio/consumer.h | ||||
| +++ b/include/linux/gpio/consumer.h | ||||
| @@ -451,6 +451,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_ | ||||
|   | ||||
|  #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) | ||||
|   | ||||
| +int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); | ||||
|  int gpiod_export(struct gpio_desc *desc, bool direction_may_change); | ||||
|  int gpiod_export_link(struct device *dev, const char *name, | ||||
|  		      struct gpio_desc *desc); | ||||
| @@ -458,6 +459,13 @@ void gpiod_unexport(struct gpio_desc *de | ||||
|   | ||||
|  #else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ | ||||
|   | ||||
| +static inline int _gpiod_export(struct gpio_desc *desc, | ||||
| +			       bool direction_may_change, | ||||
| +			       const char *name) | ||||
| +{ | ||||
| +	return -ENOSYS; | ||||
| +} | ||||
| + | ||||
|  static inline int gpiod_export(struct gpio_desc *desc, | ||||
|  			       bool direction_may_change) | ||||
|  { | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin