* update patches to 3.0
* add basic vr9 support * backport 3.1 fixes * backport 3.2 queue (falcon) SVN-Revision: 28405
This commit is contained in:
parent
1359fe4fcf
commit
0a866293bd
100 changed files with 8778 additions and 6148 deletions
|
@ -12,7 +12,7 @@ BOARDNAME:=Lantiq GPON/XWAY
|
|||
FEATURES:=squashfs jffs2
|
||||
DEFAULT_SUBTARGET:=danube
|
||||
|
||||
LINUX_VERSION:=2.6.39.4
|
||||
LINUX_VERSION:=3.0.3
|
||||
|
||||
CFLAGS=-Os -pipe -mips32r2 -mtune=mips32r2 -fno-caller-saves
|
||||
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
CONFIG_ADM6996_PHY=y
|
||||
CONFIG_AR8216_PHY=y
|
||||
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
# CONFIG_ATH79 is not set
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=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_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HW_HAS_PCI=y
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_GPIO_BUTTONS is not set
|
||||
CONFIG_INPUT_POLLDEV=y
|
||||
# CONFIG_ISDN is not set
|
||||
CONFIG_LANTIQ_ETOP=y
|
||||
# CONFIG_LANTIQ_MACH_ARV45XX is not set
|
||||
# CONFIG_LANTIQ_MACH_EASY50712 is not set
|
||||
CONFIG_LANTIQ_MACH_NETGEAR=y
|
||||
# CONFIG_LANTIQ_MACH_GIGASX76X is not set
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_RTL8306_PHY=y
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
CONFIG_SOC_XWAY=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
# CONFIG_SPI_GPIO is not set
|
||||
CONFIG_SPI_LANTIQ=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_XZ_DEC=y
|
|
@ -27,8 +27,8 @@ CONFIG_LANTIQ_ETOP=y
|
|||
# CONFIG_LANTIQ_MACH_ARV45XX is not set
|
||||
# CONFIG_LANTIQ_MACH_EASY50712 is not set
|
||||
CONFIG_LANTIQ_MACH_NETGEAR=y
|
||||
# CONFIG_LANTIQ_MACH_GIGASX76X is not set
|
||||
CONFIG_LANTIQ_MACH_WBMR=y
|
||||
# CONFIG_LANTIQ_MACH_GIGASX76X is not set
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
|
@ -40,6 +40,7 @@ CONFIG_PERF_USE_VMALLOC=y
|
|||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_RTL8306_PHY=y
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
# CONFIG_SOC_VR9 is not set
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
CONFIG_SOC_XWAY=y
|
||||
|
@ -50,3 +51,4 @@ CONFIG_SPI_LANTIQ=y
|
|||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_SPI_XWAY=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
define Profile/WBMR
|
||||
NAME:=WBMR - Buffalo WBMR-HP-G300H
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio \
|
||||
kmod-ltq-dsl-firmware-b kmod-ledtrig-usbdev
|
||||
kmod-ltq-dsl-firmware-b-ar9 kmod-ledtrig-usbdev
|
||||
endef
|
||||
|
||||
define Profile/WBMR/Description
|
||||
|
|
|
@ -3,7 +3,7 @@ SUBTARGET:=ar9
|
|||
BOARDNAME:=AR9
|
||||
FEATURES:=squashfs jffs2 atm
|
||||
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-ar9 ltq-dsl-app swconfig
|
||||
|
||||
define Target/Description
|
||||
Lantiq XWAY (danube/twinpass/ar9)
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
# CONFIG_ATH79 is not set
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=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_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_GPIO_BUTTONS is not set
|
||||
CONFIG_INPUT_POLLDEV=y
|
||||
# CONFIG_ISDN is not set
|
||||
CONFIG_LANTIQ_ETOP=y
|
||||
CONFIG_LANTIQ_MACH_EASY50601=y
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
# CONFIG_MTD_LATCH_ADDR is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_SOC_AMAZON_SE=y
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
# CONFIG_SOC_XWAY is not set
|
||||
CONFIG_XZ_DEC=y
|
|
@ -31,7 +31,9 @@ CONFIG_PERF_USE_VMALLOC=y
|
|||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_SOC_AMAZON_SE=y
|
||||
# CONFIG_SOC_VR9 is not set
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
# CONFIG_SOC_XWAY is not set
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_SPI_XWAY=y
|
||||
|
|
|
@ -3,7 +3,7 @@ SUBTARGET:=ase
|
|||
BOARDNAME:=Amazon-SE
|
||||
FEATURES:=squashfs jffs2 atm
|
||||
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-ase ltq-dsl-app
|
||||
|
||||
define Target/Description
|
||||
Lantiq ASE
|
||||
|
|
|
@ -1,112 +0,0 @@
|
|||
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_ARCH_SUPPORTS_OPROFILE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_ATH79 is not set
|
||||
CONFIG_BCMA_POSSIBLE=y
|
||||
# CONFIG_BRCMUTIL is not set
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CEVT_R4K_LIB=y
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_CPU_MIPS32=y
|
||||
# CONFIG_CPU_MIPS32_R1 is not set
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
CONFIG_CPU_MIPSR2=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_CSRC_R4K_LIB=y
|
||||
CONFIG_DECOMPRESS_LZMA=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
# CONFIG_FSNOTIFY is not set
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=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_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
CONFIG_IFX_UDP_REDIRECT=y
|
||||
CONFIG_IMAGE_CMDLINE_HACK=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQ_CPU=y
|
||||
CONFIG_LANTIQ=y
|
||||
CONFIG_LANTIQ_MACH_95C3AM1=y
|
||||
CONFIG_LANTIQ_MACH_EASY98000=y
|
||||
CONFIG_LANTIQ_MACH_EASY98020=y
|
||||
CONFIG_LANTIQ_WDT=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
CONFIG_MIPS_MACHINE=y
|
||||
CONFIG_MIPS_MT_DISABLED=y
|
||||
# CONFIG_MIPS_MT_SMP is not set
|
||||
# CONFIG_MIPS_MT_SMTC is not set
|
||||
# CONFIG_MIPS_VPE_LOADER is not set
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_GEOMETRY=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_LANTIQ=y
|
||||
CONFIG_MTD_UIMAGE_SPLIT=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
CONFIG_RTL8366RB_PHY=y
|
||||
CONFIG_RTL8366_SMI=y
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
CONFIG_SERIAL_LANTIQ=y
|
||||
CONFIG_SWAP_IO_SPACE=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R1=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_MULTITHREADING=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
|
@ -1,70 +1,62 @@
|
|||
# CONFIG_64BIT is not set
|
||||
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_ARCH_SUPPORTS_OPROFILE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_ATH79 is not set
|
||||
CONFIG_BCMA_POSSIBLE=y
|
||||
# CONFIG_BRCMUTIL is not set
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CEVT_R4K_LIB=y
|
||||
CONFIG_CFG80211_DEFAULT_PS_VALUE=0
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
# CONFIG_CPU_CAVIUM_OCTEON is not set
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
# CONFIG_CPU_LITTLE_ENDIAN is not set
|
||||
# CONFIG_CPU_LOONGSON2E is not set
|
||||
CONFIG_CPU_MIPS32=y
|
||||
# CONFIG_CPU_MIPS32_R1 is not set
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
# CONFIG_CPU_MIPS64_R1 is not set
|
||||
# CONFIG_CPU_MIPS64_R2 is not set
|
||||
CONFIG_CPU_MIPSR2=y
|
||||
# CONFIG_CPU_NEVADA is not set
|
||||
# CONFIG_CPU_R10000 is not set
|
||||
# CONFIG_CPU_R3000 is not set
|
||||
# CONFIG_CPU_R4300 is not set
|
||||
# CONFIG_CPU_R4X00 is not set
|
||||
# CONFIG_CPU_R5000 is not set
|
||||
# CONFIG_CPU_R5432 is not set
|
||||
# CONFIG_CPU_R5500 is not set
|
||||
# CONFIG_CPU_R6000 is not set
|
||||
# CONFIG_CPU_R8000 is not set
|
||||
# CONFIG_CPU_RM7000 is not set
|
||||
# CONFIG_CPU_RM9000 is not set
|
||||
# CONFIG_CPU_SB1 is not set
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
# CONFIG_CPU_TX39XX is not set
|
||||
# CONFIG_CPU_TX49XX is not set
|
||||
# CONFIG_CPU_VR41XX is not set
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_CSRC_R4K_LIB=y
|
||||
CONFIG_DECOMPRESS_LZMA=y
|
||||
CONFIG_DMA_NEED_PCI_MAP_STATE=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
# CONFIG_FSNOTIFY is not set
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_FIND_LAST_BIT=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=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_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_HZ_100 is not set
|
||||
|
@ -74,9 +66,13 @@ CONFIG_IMAGE_CMDLINE_HACK=y
|
|||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQ_CPU=y
|
||||
CONFIG_LANTIQ=y
|
||||
CONFIG_LANTIQ_MACH_95C3AM1=y
|
||||
CONFIG_LANTIQ_MACH_EASY98000=y
|
||||
CONFIG_LANTIQ_MACH_EASY98020=y
|
||||
CONFIG_LANTIQ_WDT=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
# CONFIG_MACH_ALCHEMY is not set
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
CONFIG_MIPS_MACHINE=y
|
||||
|
@ -89,9 +85,15 @@ CONFIG_MTD_CFI_GEOMETRY=y
|
|||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_LANTIQ=y
|
||||
CONFIG_MTD_UIMAGE_SPLIT=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_RTL8366RB_PHY=y
|
||||
CONFIG_RTL8366_SMI=y
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
CONFIG_SERIAL_LANTIQ=y
|
||||
|
@ -104,5 +106,5 @@ CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
|||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_MULTITHREADING=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
|
|
|
@ -27,8 +27,8 @@ CONFIG_LANTIQ_ETOP=y
|
|||
CONFIG_LANTIQ_MACH_ARV45XX=y
|
||||
CONFIG_LANTIQ_MACH_EASY50712=y
|
||||
# CONFIG_LANTIQ_MACH_NETGEAR is not set
|
||||
CONFIG_LANTIQ_MACH_GIGASX76X=y
|
||||
# CONFIG_LANTIQ_MACH_WBMR is not set
|
||||
CONFIG_LANTIQ_MACH_GIGASX76X=y
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
|
@ -41,6 +41,7 @@ CONFIG_PERF_USE_VMALLOC=y
|
|||
CONFIG_RTL8306_PHY=y
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
# CONFIG_SOC_VR9 is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
CONFIG_SOC_XWAY=y
|
||||
CONFIG_SPI=y
|
||||
|
@ -50,3 +51,4 @@ CONFIG_SPI_LANTIQ=y
|
|||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_SPI_XWAY=y
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
define Profile/ARV3527P
|
||||
NAME:=ARV3527P - Arcor Easybox 401
|
||||
PACKAGES:=kmod-ledtrig-netdev kmod-leds-gpio kmod-button-hotplug kmod-ltq-dsl-firmware-b
|
||||
PACKAGES:=kmod-ledtrig-netdev kmod-leds-gpio kmod-button-hotplug kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV3527P/Description
|
||||
|
@ -13,7 +13,7 @@ define Profile/ARV4510PW
|
|||
NAME:=ARV4510PW - Wippies Homebox
|
||||
PACKAGES:= kmod-usb-core \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-a
|
||||
kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-a-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV4510PW/Description
|
||||
|
@ -26,7 +26,7 @@ define Profile/ARV4518PW
|
|||
NAME:=ARV4518PW - SMC7908A
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-a
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-a-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV4518PW/Description
|
||||
|
@ -39,7 +39,7 @@ define Profile/ARV4520PW
|
|||
NAME:=ARV4520PW - Arcor Easybox 800
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-b
|
||||
kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV4520PW/Description
|
||||
|
@ -52,7 +52,7 @@ define Profile/ARV4525PW
|
|||
NAME:=ARV4525PW - Speedport W502V
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV4525PW/Description
|
||||
|
@ -65,7 +65,7 @@ define Profile/ARV7525PW
|
|||
NAME:=ARV7525PW - Speedport W303V Typ A
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-rt2800-pci wpad-mini kmod-ltq-dsl-firmware-b
|
||||
kmod-rt2800-pci wpad-mini kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV4525PW/Description
|
||||
|
@ -78,7 +78,7 @@ define Profile/ARV452CPW
|
|||
NAME:=ARV452CPW - Arcor Easybox 801
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b
|
||||
kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV452CPW/Description
|
||||
|
@ -91,7 +91,7 @@ define Profile/ARV752DPW
|
|||
NAME:=ARV752DPW - Arcor Easybox 802
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-rt2800-pci kmod-ltq-dsl-firmware-b
|
||||
kmod-rt2800-pci kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV752DPW/Description
|
||||
|
@ -104,7 +104,7 @@ define Profile/ARV752DPW22
|
|||
NAME:=ARV752DPW22 - Arcor Easybox 803
|
||||
PACKAGES:= kmod-usb-core kmod-usb2 kmod-usb-uhci kmod-usb-dwc-otg \
|
||||
kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
|
||||
kmod-ltq-dsl-firmware-b
|
||||
kmod-ltq-dsl-firmware-b-danube
|
||||
endef
|
||||
|
||||
define Profile/ARV752DPW22/Description
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
define Profile/GIGASX76X
|
||||
NAME:=GIGASX76X - Gigaset SX761,SX762,SX763
|
||||
PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio \
|
||||
kmod-ltq-dsl-firmware-b kmod-ledtrig-usbdev
|
||||
kmod-ltq-dsl-firmware-b-danube kmod-ledtrig-usbdev
|
||||
endef
|
||||
|
||||
define Profile/GIGASX76X/Description
|
||||
|
|
|
@ -3,7 +3,7 @@ SUBTARGET:=danube
|
|||
BOARDNAME:=Danube
|
||||
FEATURES:=squashfs jffs2 atm
|
||||
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-danube ltq-dsl-app swconfig
|
||||
|
||||
define Target/Description
|
||||
Lantiq Danube/Twinpass
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
CONFIG_CPU_MIPSR2_IRQ_EI=y
|
||||
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
||||
CONFIG_IFX_VPE_CACHE_SPLIT=y
|
||||
CONFIG_IFX_VPE_EXT=y
|
||||
CONFIG_M25PXX_USE_FAST_READ=y
|
||||
CONFIG_MIPS_MT=y
|
||||
# CONFIG_MIPS_VPE_APSP_API is not set
|
||||
CONFIG_MIPS_VPE_LOADER=y
|
||||
CONFIG_MIPS_VPE_LOADER_TOM=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_PLATFORM=y
|
||||
# CONFIG_MTD_SM_COMMON is not set
|
||||
CONFIG_MTSCHED=y
|
||||
# CONFIG_PERFCTRS is not set
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
CONFIG_SOC_FALCON=y
|
||||
# CONFIG_SOC_TYPE_XWAY is not set
|
||||
# CONFIG_SOC_XWAY is not set
|
||||
CONFIG_SPI=y
|
||||
# CONFIG_SPI_BITBANG is not set
|
||||
CONFIG_SPI_FALCON=y
|
||||
# CONFIG_SPI_GPIO is not set
|
||||
CONFIG_SPI_MASTER=y
|
||||
# CONFIG_I2C_DESIGNWARE is not set
|
||||
|
|
@ -1,31 +1,8 @@
|
|||
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
# CONFIG_ATH79 is not set
|
||||
CONFIG_CPU_MIPSR2_IRQ_EI=y
|
||||
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_ATTRS=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_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_IFX_VPE_CACHE_SPLIT=y
|
||||
CONFIG_IFX_VPE_EXT=y
|
||||
CONFIG_LANTIQ_MACH_95C3AM1=y
|
||||
CONFIG_LANTIQ_MACH_EASY98000=y
|
||||
CONFIG_LANTIQ_MACH_EASY98020=y
|
||||
CONFIG_M25PXX_USE_FAST_READ=y
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MFD_MAX8997 is not set
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_MIPS_MT=y
|
||||
# CONFIG_MIPS_VPE_APSP_API is not set
|
||||
CONFIG_MIPS_VPE_LOADER=y
|
||||
|
@ -33,24 +10,19 @@ CONFIG_MIPS_VPE_LOADER_TOM=y
|
|||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
# CONFIG_MTD_NAND_ECC_BCH is not set
|
||||
CONFIG_MTD_NAND_PLATFORM=y
|
||||
# CONFIG_MTD_SM_COMMON is not set
|
||||
CONFIG_MTSCHED=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
# CONFIG_PERFCTRS is not set
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_QUOTACTL is not set
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
CONFIG_SOC_FALCON=y
|
||||
# CONFIG_SOC_TYPE_XWAY is not set
|
||||
# CONFIG_SOC_XWAY is not set
|
||||
# CONFIG_SOC_VR9 is not set
|
||||
CONFIG_SPI=y
|
||||
# CONFIG_SPI_BITBANG is not set
|
||||
CONFIG_SPI_FALCON=y
|
||||
# CONFIG_SPI_GPIO is not set
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_XZ_DEC=y
|
||||
# CONFIG_I2C_DESIGNWARE is not set
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Lantiq GPIO LED device support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 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.
|
||||
*/
|
||||
|
||||
#ifndef _LANTIQ_DEV_LEDS_GPIO_H
|
||||
#define _LANTIQ_DEV_LEDS_GPIO_H
|
||||
|
||||
#include <linux/leds.h>
|
||||
|
||||
void ltq_add_device_leds_gpio(int id,
|
||||
unsigned num_leds,
|
||||
struct gpio_led *leds) __init;
|
||||
|
||||
#endif /* _LANTIQ_DEV_LEDS_GPIO_H */
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Lantiq GPIO button support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 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 "linux/init.h"
|
||||
#include "linux/slab.h"
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "dev-gpio-buttons.h"
|
||||
|
||||
void __init ltq_register_gpio_keys_polled(int id,
|
||||
unsigned poll_interval,
|
||||
unsigned nbuttons,
|
||||
struct gpio_keys_button *buttons)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct gpio_keys_platform_data pdata;
|
||||
struct gpio_keys_button *p;
|
||||
int err;
|
||||
|
||||
p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL);
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
memcpy(p, buttons, nbuttons * sizeof(*p));
|
||||
|
||||
pdev = platform_device_alloc("gpio-keys-polled", id);
|
||||
if (!pdev)
|
||||
goto err_free_buttons;
|
||||
|
||||
memset(&pdata, 0, sizeof(pdata));
|
||||
pdata.poll_interval = poll_interval;
|
||||
pdata.nbuttons = nbuttons;
|
||||
pdata.buttons = p;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
return;
|
||||
|
||||
err_put_pdev:
|
||||
platform_device_put(pdev);
|
||||
|
||||
err_free_buttons:
|
||||
kfree(p);
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Lantiq GPIO button support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 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.
|
||||
*/
|
||||
|
||||
#ifndef _LANTIQ_DEV_GPIO_BUTTONS_H
|
||||
#define _LANTIQ_DEV_GPIO_BUTTONS_H
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
||||
#define LTQ_KEYS_POLL_INTERVAL 20 /* msecs */
|
||||
#define LTQ_KEYS_DEBOUNCE_INTERVAL (3 * LTQ_KEYS_POLL_INTERVAL)
|
||||
|
||||
void ltq_register_gpio_keys_polled(int id,
|
||||
unsigned poll_interval,
|
||||
unsigned nbuttons,
|
||||
struct gpio_keys_button *buttons);
|
||||
|
||||
#endif /* _LANTIQ_DEV_GPIO_BUTTONS_H */
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Lantiq GPIO LED device support
|
||||
*
|
||||
* Copyright (C) 2008-2009 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/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "dev-leds-gpio.h"
|
||||
|
||||
void __init ltq_add_device_leds_gpio(int id, unsigned num_leds,
|
||||
struct gpio_led *leds)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct gpio_led_platform_data pdata;
|
||||
struct gpio_led *p;
|
||||
int err;
|
||||
|
||||
p = kmalloc(num_leds * sizeof(*p), GFP_KERNEL);
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
memcpy(p, leds, num_leds * sizeof(*p));
|
||||
|
||||
pdev = platform_device_alloc("leds-gpio", id);
|
||||
if (!pdev)
|
||||
goto err_free_leds;
|
||||
|
||||
memset(&pdata, 0, sizeof(pdata));
|
||||
pdata.num_leds = num_leds;
|
||||
pdata.leds = p;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
return;
|
||||
|
||||
err_put_pdev:
|
||||
platform_device_put(pdev);
|
||||
|
||||
err_free_leds:
|
||||
kfree(p);
|
||||
}
|
|
@ -0,0 +1,212 @@
|
|||
/*
|
||||
* EASY98000 CPLD Addon driver
|
||||
*
|
||||
* Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
struct easy98000_reg_cpld {
|
||||
u16 cmdreg1; /* 0x1 */
|
||||
u16 cmdreg0; /* 0x0 */
|
||||
u16 idreg0; /* 0x3 */
|
||||
u16 resreg; /* 0x2 */
|
||||
u16 intreg; /* 0x5 */
|
||||
u16 idreg1; /* 0x4 */
|
||||
u16 ledreg; /* 0x7 */
|
||||
u16 pcmconconfig; /* 0x6 */
|
||||
u16 res0; /* 0x9 */
|
||||
u16 ethledreg; /* 0x8 */
|
||||
u16 res1[4]; /* 0xa-0xd */
|
||||
u16 cpld1v; /* 0xf */
|
||||
u16 cpld2v; /* 0xe */
|
||||
};
|
||||
static struct easy98000_reg_cpld * const cpld =
|
||||
(struct easy98000_reg_cpld *)(KSEG1 | 0x17c00000);
|
||||
#define cpld_r8(reg) (__raw_readw(&cpld->reg) & 0xFF)
|
||||
#define cpld_w8(val, reg) __raw_writew((val) & 0xFF, &cpld->reg)
|
||||
|
||||
int easy98000_addon_has_dm9000(void)
|
||||
{
|
||||
if ((cpld_r8(idreg0) & 0xF) == 1)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PROC_FS)
|
||||
typedef void (*cpld_dump) (struct seq_file *s);
|
||||
struct proc_entry {
|
||||
char *name;
|
||||
void *callback;
|
||||
};
|
||||
|
||||
static int cpld_proc_show ( struct seq_file *s, void *p )
|
||||
{
|
||||
cpld_dump dump = s->private;
|
||||
|
||||
if ( dump != NULL )
|
||||
dump(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpld_proc_open ( struct inode *inode, struct file *file )
|
||||
{
|
||||
return single_open ( file, cpld_proc_show, PDE(inode)->data );
|
||||
}
|
||||
|
||||
static void cpld_versions_get ( struct seq_file *s )
|
||||
{
|
||||
seq_printf(s, "CPLD1: V%d\n", cpld_r8(cpld1v));
|
||||
seq_printf(s, "CPLD2: V%d\n", cpld_r8(cpld2v));
|
||||
}
|
||||
|
||||
static void cpld_ebu_module_get ( struct seq_file *s )
|
||||
{
|
||||
u8 addon_id;
|
||||
|
||||
addon_id = cpld_r8(idreg0) & 0xF;
|
||||
switch (addon_id) {
|
||||
case 0xF: /* nothing connected */
|
||||
break;
|
||||
case 1:
|
||||
seq_printf(s, "Ethernet Controller module (dm9000)\n");
|
||||
break;
|
||||
default:
|
||||
seq_printf(s, "Unknown EBU module (EBU_ID=0x%02X)\n", addon_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void cpld_xmii_module_get ( struct seq_file *s )
|
||||
{
|
||||
u8 addon_id;
|
||||
char *mod = NULL;
|
||||
|
||||
addon_id = cpld_r8(idreg1) & 0xF;
|
||||
switch (addon_id) {
|
||||
case 0xF:
|
||||
mod = "no module";
|
||||
break;
|
||||
case 0x1:
|
||||
mod = "RGMII module";
|
||||
break;
|
||||
case 0x4:
|
||||
mod = "GMII MAC Mode (XWAY TANTOS-3G)";
|
||||
break;
|
||||
case 0x6:
|
||||
mod = "TMII MAC Mode (XWAY TANTOS-3G)";
|
||||
break;
|
||||
case 0x8:
|
||||
mod = "GMII PHY module";
|
||||
break;
|
||||
case 0x9:
|
||||
mod = "MII PHY module";
|
||||
break;
|
||||
case 0xA:
|
||||
mod = "RMII PHY module";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (mod)
|
||||
seq_printf(s, "%s\n", mod);
|
||||
else
|
||||
seq_printf(s, "unknown xMII module (xMII_ID=0x%02X)\n", addon_id);
|
||||
}
|
||||
|
||||
static struct proc_entry proc_entries[] = {
|
||||
{"versions", cpld_versions_get},
|
||||
{"ebu", cpld_ebu_module_get},
|
||||
{"xmii", cpld_xmii_module_get},
|
||||
};
|
||||
|
||||
static struct file_operations ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = cpld_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static void cpld_proc_entry_create(struct proc_dir_entry *parent_node,
|
||||
struct proc_entry *proc_entry)
|
||||
{
|
||||
proc_create_data ( proc_entry->name, (S_IFREG | S_IRUGO), parent_node,
|
||||
&ops, proc_entry->callback);
|
||||
}
|
||||
|
||||
static int cpld_proc_install(void)
|
||||
{
|
||||
struct proc_dir_entry *driver_proc_node;
|
||||
|
||||
driver_proc_node = proc_mkdir("cpld", NULL);
|
||||
if (driver_proc_node != NULL) {
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(proc_entries); i++)
|
||||
cpld_proc_entry_create(driver_proc_node,
|
||||
&proc_entries[i]);
|
||||
} else {
|
||||
printk("cannot create proc entry");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int cpld_proc_install(void) {}
|
||||
#endif
|
||||
|
||||
static int easy98000_addon_probe(struct platform_device *pdev)
|
||||
{
|
||||
return cpld_proc_install();
|
||||
}
|
||||
|
||||
static int easy98000_addon_remove(struct platform_device *pdev)
|
||||
{
|
||||
#if defined(CONFIG_PROC_FS)
|
||||
char buf[64];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sizeof(proc_entries) / sizeof(proc_entries[0]); i++) {
|
||||
sprintf(buf, "cpld/%s", proc_entries[i].name);
|
||||
remove_proc_entry(buf, 0);
|
||||
}
|
||||
remove_proc_entry("cpld", 0);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver easy98000_addon_driver = {
|
||||
.probe = easy98000_addon_probe,
|
||||
.remove = __devexit_p(easy98000_addon_remove),
|
||||
.driver = {
|
||||
.name = "easy98000_addon",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
int __init easy98000_addon_init(void)
|
||||
{
|
||||
return platform_driver_register(&easy98000_addon_driver);
|
||||
}
|
||||
|
||||
void __exit easy98000_addon_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&easy98000_addon_driver);
|
||||
}
|
||||
|
||||
module_init(easy98000_addon_init);
|
||||
module_exit(easy98000_addon_exit);
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* EASY98000 CPLD LED driver
|
||||
*
|
||||
* Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "dev-leds-easy98000-cpld.h"
|
||||
|
||||
const char *led_name[8] = {
|
||||
"ge0_act",
|
||||
"ge0_link",
|
||||
"ge1_act",
|
||||
"ge1_link",
|
||||
"fe2_act",
|
||||
"fe2_link",
|
||||
"fe3_act",
|
||||
"fe3_link"
|
||||
};
|
||||
|
||||
#define cpld_base7 ((u16 *)(KSEG1 | 0x17c0000c))
|
||||
#define cpld_base8 ((u16 *)(KSEG1 | 0x17c00012))
|
||||
|
||||
#define ltq_r16(reg) __raw_readw(reg)
|
||||
#define ltq_w16(val, reg) __raw_writew(val, reg)
|
||||
|
||||
struct cpld_led_dev {
|
||||
struct led_classdev cdev;
|
||||
u8 mask;
|
||||
u16 *base;
|
||||
};
|
||||
|
||||
struct cpld_led_drvdata {
|
||||
struct cpld_led_dev *led_devs;
|
||||
int num_leds;
|
||||
};
|
||||
|
||||
void led_set(u8 mask, u16 *base)
|
||||
{
|
||||
ltq_w16(ltq_r16(base) | mask, base);
|
||||
}
|
||||
|
||||
void led_clear(u8 mask, u16 *base)
|
||||
{
|
||||
ltq_w16(ltq_r16(base) & (~mask), base);
|
||||
}
|
||||
|
||||
void led_blink_clear(u8 mask, u16 *base)
|
||||
{
|
||||
led_clear(mask, base);
|
||||
}
|
||||
|
||||
static void led_brightness(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
struct cpld_led_dev *led_dev =
|
||||
container_of(led_cdev, struct cpld_led_dev, cdev);
|
||||
|
||||
if (value)
|
||||
led_set(led_dev->mask, led_dev->base);
|
||||
else
|
||||
led_clear(led_dev->mask, led_dev->base);
|
||||
}
|
||||
|
||||
static int led_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
char name[32];
|
||||
struct cpld_led_drvdata *drvdata;
|
||||
int ret = 0;
|
||||
|
||||
drvdata = kzalloc(sizeof(struct cpld_led_drvdata) +
|
||||
sizeof(struct cpld_led_dev) * MAX_LED,
|
||||
GFP_KERNEL);
|
||||
if (!drvdata)
|
||||
return -ENOMEM;
|
||||
|
||||
drvdata->led_devs = (struct cpld_led_dev *) &drvdata[1];
|
||||
|
||||
for (i = 0; i < MAX_LED; i++) {
|
||||
struct cpld_led_dev *led_dev = &drvdata->led_devs[i];
|
||||
led_dev->cdev.brightness_set = led_brightness;
|
||||
led_dev->cdev.default_trigger = NULL;
|
||||
led_dev->mask = 1 << (i % 8);
|
||||
if(i < 8) {
|
||||
sprintf(name, "easy98000-cpld:%s", led_name[i]);
|
||||
led_dev->base = cpld_base8;
|
||||
} else {
|
||||
sprintf(name, "easy98000-cpld:red:%d", i-8);
|
||||
led_dev->base = cpld_base7;
|
||||
}
|
||||
led_dev->cdev.name = name;
|
||||
ret = led_classdev_register(&pdev->dev, &led_dev->cdev);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
platform_set_drvdata(pdev, drvdata);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
printk("led_probe: 3\n");
|
||||
for (i = i - 1; i >= 0; i--)
|
||||
led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
|
||||
kfree(drvdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int led_remove(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
struct cpld_led_drvdata *drvdata = platform_get_drvdata(pdev);
|
||||
for (i = 0; i < MAX_LED; i++)
|
||||
led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
kfree(drvdata);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver led_driver = {
|
||||
.probe = led_probe,
|
||||
.remove = __devexit_p(led_remove),
|
||||
.driver = {
|
||||
.name = LED_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
int __init easy98000_cpld_led_init(void)
|
||||
{
|
||||
pr_info(LED_DESC ", Version " LED_VERSION
|
||||
" (c) Copyright 2011, Lantiq Deutschland GmbH\n");
|
||||
return platform_driver_register(&led_driver);
|
||||
}
|
||||
|
||||
void __exit easy98000_cpld_led_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&led_driver);
|
||||
}
|
||||
|
||||
module_init(easy98000_cpld_led_init);
|
||||
module_exit(easy98000_cpld_led_exit);
|
||||
|
||||
MODULE_DESCRIPTION(LED_NAME);
|
||||
MODULE_DESCRIPTION(LED_DESC);
|
||||
MODULE_AUTHOR("Ralph Hempel <ralph.hempel@lantiq.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* EASY98000 CPLD LED driver
|
||||
*
|
||||
* Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
#ifndef _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
#define _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
|
||||
#define LED_NAME "easy98000_cpld_led"
|
||||
#define LED_DESC "EASY98000 LED driver"
|
||||
#define LED_VERSION "1.0.0"
|
||||
|
||||
#define MAX_LED 16
|
||||
|
||||
#endif /* _INCLUDE_EASY98000_CPLD_LED_H_ */
|
|
@ -0,0 +1,95 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include "../machtypes.h"
|
||||
|
||||
#include "devices.h"
|
||||
#include "dev-leds-gpio.h"
|
||||
|
||||
#define BOARD_95C3AM1_GPIO_LED_0 10
|
||||
#define BOARD_95C3AM1_GPIO_LED_1 11
|
||||
#define BOARD_95C3AM1_GPIO_LED_2 12
|
||||
#define BOARD_95C3AM1_GPIO_LED_3 13
|
||||
|
||||
extern unsigned char ltq_ethaddr[6];
|
||||
|
||||
static struct mtd_partition board_95C3AM1_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x40000, /* 2 sectors for redundant env. */
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x80000,
|
||||
.size = 0xF80000, /* map only 16 MiB */
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data board_95C3AM1_flash_platform_data = {
|
||||
.name = "sflash",
|
||||
.parts = board_95C3AM1_partitions,
|
||||
.nr_parts = ARRAY_SIZE(board_95C3AM1_partitions)
|
||||
};
|
||||
|
||||
static struct spi_board_info board_95C3AM1_flash_data __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.platform_data = &board_95C3AM1_flash_platform_data
|
||||
};
|
||||
|
||||
static struct gpio_led board_95C3AM1_leds_gpio[] __initdata = {
|
||||
{
|
||||
.name = "power",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_0,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "optical",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_1,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "lan",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_2,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "update",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_3,
|
||||
.active_low = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static struct i2c_gpio_platform_data board_95C3AM1_i2c_gpio_data = {
|
||||
.sda_pin = 107,
|
||||
.scl_pin = 108,
|
||||
};
|
||||
|
||||
static struct platform_device board_95C3AM1_i2c_gpio_device = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &board_95C3AM1_i2c_gpio_data,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init board_95C3AM1_init(void)
|
||||
{
|
||||
falcon_register_i2c();
|
||||
falcon_register_spi_flash(&board_95C3AM1_flash_data);
|
||||
platform_device_register(&board_95C3AM1_i2c_gpio_device);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(board_95C3AM1_leds_gpio),
|
||||
board_95C3AM1_leds_gpio);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_95C3AM1,
|
||||
"95C3AM1",
|
||||
"95C3AM1 Board",
|
||||
board_95C3AM1_init);
|
|
@ -0,0 +1,119 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-leds-gpio.h"
|
||||
|
||||
#define EASY98020_GPIO_LED_0 9
|
||||
#define EASY98020_GPIO_LED_1 10
|
||||
#define EASY98020_GPIO_LED_2 11
|
||||
#define EASY98020_GPIO_LED_3 12
|
||||
#define EASY98020_GPIO_LED_GE0_ACT 110
|
||||
#define EASY98020_GPIO_LED_GE0_LINK 109
|
||||
#define EASY98020_GPIO_LED_GE1_ACT 106
|
||||
#define EASY98020_GPIO_LED_GE1_LINK 105
|
||||
|
||||
extern unsigned char ltq_ethaddr[6];
|
||||
|
||||
static struct mtd_partition easy98020_spi_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x40000, /* 2 sectors for redundant env. */
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x80000,
|
||||
.size = 0xF80000, /* map only 16 MiB */
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data easy98020_spi_flash_platform_data = {
|
||||
.name = "sflash",
|
||||
.parts = easy98020_spi_partitions,
|
||||
.nr_parts = ARRAY_SIZE(easy98020_spi_partitions)
|
||||
};
|
||||
|
||||
static struct spi_board_info easy98020_spi_flash_data __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.platform_data = &easy98020_spi_flash_platform_data
|
||||
};
|
||||
|
||||
static struct gpio_led easy98020_leds_gpio[] __initdata = {
|
||||
{
|
||||
.name = "easy98020:green:0",
|
||||
.gpio = EASY98020_GPIO_LED_0,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:1",
|
||||
.gpio = EASY98020_GPIO_LED_1,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:2",
|
||||
.gpio = EASY98020_GPIO_LED_2,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:3",
|
||||
.gpio = EASY98020_GPIO_LED_3,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge0_act",
|
||||
.gpio = EASY98020_GPIO_LED_GE0_ACT,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge0_link",
|
||||
.gpio = EASY98020_GPIO_LED_GE0_LINK,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge1_act",
|
||||
.gpio = EASY98020_GPIO_LED_GE1_ACT,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge1_link",
|
||||
.gpio = EASY98020_GPIO_LED_GE1_LINK,
|
||||
.active_low = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init easy98020_init(void)
|
||||
{
|
||||
falcon_register_i2c();
|
||||
falcon_register_spi_flash(&easy98020_spi_flash_data);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(easy98020_leds_gpio),
|
||||
easy98020_leds_gpio);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020,
|
||||
"EASY98020",
|
||||
"EASY98020 Eval Board",
|
||||
easy98020_init);
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020_1LAN,
|
||||
"EASY98020_1LAN",
|
||||
"EASY98020 Eval Board (1 LAN port)",
|
||||
easy98020_init);
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020_2LAN,
|
||||
"EASY98020_2LAN",
|
||||
"EASY98020 Eval Board (2 LAN ports)",
|
||||
easy98020_init);
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_irq.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
#define LTQ_USB_IOMEM_BASE 0x1e101000
|
||||
#define LTQ_USB_IOMEM_SIZE 0x00001000
|
||||
|
||||
static struct resource resources[] =
|
||||
{
|
||||
[0] = {
|
||||
.name = "dwc_otg_membase",
|
||||
.start = LTQ_USB_IOMEM_BASE,
|
||||
.end = LTQ_USB_IOMEM_BASE + LTQ_USB_IOMEM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "dwc_otg_irq",
|
||||
.start = LTQ_USB_INT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 dwc_dmamask = (u32)0x1fffffff;
|
||||
|
||||
static struct platform_device platform_dev = {
|
||||
.name = "dwc_otg",
|
||||
.dev = {
|
||||
.dma_mask = &dwc_dmamask,
|
||||
},
|
||||
.resource = resources,
|
||||
.num_resources = ARRAY_SIZE(resources),
|
||||
};
|
||||
|
||||
int __init
|
||||
xway_register_dwc(int pin)
|
||||
{
|
||||
struct irq_data d;
|
||||
d.irq = resources[1].start;
|
||||
ltq_enable_irq(&d);
|
||||
platform_dev.dev.platform_data = (void*) pin;
|
||||
return platform_device_register(&platform_dev);
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#ifndef _LTQ_DEV_DWC_H__
|
||||
#define _LTQ_DEV_DWC_H__
|
||||
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
extern void __init xway_register_dwc(int pin);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,495 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ath5k_platform.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "../dev-leds-gpio.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static struct mtd_partition arv4510_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x20000,
|
||||
.size = 0x120000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x40000,
|
||||
.size = 0xfa0000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0xfe0000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition arv45xx_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x20000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x30000,
|
||||
.size = 0x3c0000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0x3f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition arv75xx_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x7d0000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0x7f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv4510_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv4510_partitions),
|
||||
.parts = arv4510_partitions,
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv45xx_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv45xx_partitions),
|
||||
.parts = arv45xx_partitions,
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv75xx_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv75xx_partitions),
|
||||
.parts = arv75xx_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_EXT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4510pw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:green:foo", .gpio = 4, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4518pw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:green:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wlan", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:fail", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:usb", .gpio = 19, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:voip", .gpio = 100, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs1", .gpio = 101, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs2", .gpio = 102, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_button
|
||||
arv4518pw_gpio_buttons[] __initdata = {
|
||||
{ .desc = "wlan", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 28, .active_low = 1, },
|
||||
{ .desc = "wps", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 29, .active_low = 1, },
|
||||
{ .desc = "reset", .type = EV_KEY, .code = BTN_2, .threshold = 3, .gpio = 30, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4520pw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, },
|
||||
{ .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:blue:internet", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, },
|
||||
{ .name = "soc:red:wps", .gpio = 9, .active_low = 1, },
|
||||
{ .name = "soc:blue:voip", .gpio = 100, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxs1", .gpio = 101, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxs2", .gpio = 102, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxo", .gpio = 103, .active_low = 1, },
|
||||
{ .name = "soc:blue:voice", .gpio = 104, .active_low = 1, },
|
||||
{ .name = "soc:blue:usb", .gpio = 105, .active_low = 1, },
|
||||
{ .name = "soc:blue:wlan", .gpio = 106, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv452cpw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:isdn", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:wps", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxs1", .gpio = 100, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxs2", .gpio = 101, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wps", .gpio = 102, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:voice", .gpio = 104, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:usb", .gpio = 105, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wlan", .gpio = 106, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:internet", .gpio = 108, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:internet", .gpio = 109, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4525pw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:green:festnetz", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:dsl", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wlan", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:online", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv752dpw22_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:wps", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:voice", .gpio = 104, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:usb", .gpio = 105, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wlan", .gpio = 106, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wlan1", .gpio = 107, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wlan", .gpio = 108, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wlan1", .gpio = 109, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth1", .gpio = 111, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth2", .gpio = 112, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth3", .gpio = 113, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth4", .gpio = 114, .active_low = 1, .default_trigger = "default-on", },
|
||||
};
|
||||
|
||||
static struct gpio_button
|
||||
arv752dpw22_gpio_buttons[] __initdata = {
|
||||
{ .desc = "btn0", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 12, .active_low = 1, },
|
||||
{ .desc = "btn1", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 13, .active_low = 1, },
|
||||
{ .desc = "btn2", .type = EV_KEY, .code = BTN_2, .threshold = 3, .gpio = 28, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv7518pw_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:green:power", .gpio = 2, .active_low = 1, },
|
||||
{ .name = "soc:green:adsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:green:wlan", .gpio = 6, .active_low = 1, },
|
||||
{ .name = "soc:red:internet", .gpio = 8, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 19, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_button
|
||||
arv7518pw_gpio_buttons[] __initdata = {
|
||||
{ .desc = "reset", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 23, .active_low = 1, },
|
||||
{ .desc = "wlan", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 25, .active_low = 1, },
|
||||
};
|
||||
|
||||
static void
|
||||
arv45xx_register_ethernet(void)
|
||||
{
|
||||
#define ARV45XX_BRN_MAC 0x3f0016
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_MAC), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
static void
|
||||
arv75xx_register_ethernet(void)
|
||||
{
|
||||
#define ARV75XX_BRN_MAC 0x7f0016
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ARV75XX_BRN_MAC), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
static void
|
||||
bewan_register_ethernet(void)
|
||||
{
|
||||
#define BEWAN_BRN_MAC 0x3f0014
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + BEWAN_BRN_MAC), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
static u16 arv45xx_ath5k_eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS];
|
||||
static struct ath5k_platform_data arv45xx_ath5k_platform_data;
|
||||
|
||||
/*static int arv45xx_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
dev->dev.platform_data = &arv45xx_ath5k_platform_data;
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
void __init
|
||||
arv45xx_register_ath5k(void)
|
||||
{
|
||||
#define ARV45XX_BRN_ATH 0x3f0478
|
||||
int i;
|
||||
unsigned char eeprom_mac[6];
|
||||
static u16 eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS];
|
||||
u32 *p = (u32*)arv45xx_ath5k_eeprom_data;
|
||||
|
||||
memcpy_fromio(eeprom_mac,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_MAC), 6);
|
||||
eeprom_mac[5]++;
|
||||
memcpy_fromio(arv45xx_ath5k_eeprom_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_ATH), ATH5K_PLAT_EEP_MAX_WORDS);
|
||||
// swap eeprom bytes
|
||||
for (i = 0; i < ATH5K_PLAT_EEP_MAX_WORDS>>1; i++){
|
||||
//arv4518_ath5k_eeprom_data[i] = ((eeprom_data[i]&0xff)<<8)|((eeprom_data[i]&0xff00)>>8);
|
||||
p[i] = ((eeprom_data[(i<<1)+1]&0xff)<<24)|((eeprom_data[(i<<1)+1]&0xff00)<<8)|((eeprom_data[i<<1]&0xff)<<8)|((eeprom_data[i<<1]&0xff00)>>8);
|
||||
if (i == 0xbf>>1){
|
||||
// printk ("regdomain: 0x%x --> 0x%x\n", p[i], (p[i] & 0xffff0000)|0x67);
|
||||
/* regdomain is invalid?? how did original fw convert
|
||||
* value to 0x82d4 ??
|
||||
* for now, force to 0x67 */
|
||||
p[i] &= 0xffff0000;
|
||||
p[i] |= 0x67;
|
||||
}
|
||||
}
|
||||
arv45xx_ath5k_platform_data.eeprom_data = arv45xx_ath5k_eeprom_data;
|
||||
arv45xx_ath5k_platform_data.macaddr = eeprom_mac;
|
||||
//lqpci_plat_dev_init = arv45xx_pci_plat_dev_init;
|
||||
}
|
||||
|
||||
static void __init
|
||||
arv3527p_init(void)
|
||||
{
|
||||
ltq_register_gpio_stp();
|
||||
//ltq_add_device_leds_gpio(arv3527p_leds_gpio, ARRAY_SIZE(arv3527p_leds_gpio));
|
||||
ltq_register_nor(&arv45xx_flash_data);
|
||||
arv45xx_register_ethernet();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV3527P,
|
||||
"ARV3527P",
|
||||
"ARV3527P - Arcor Easybox 401",
|
||||
arv3527p_init);
|
||||
|
||||
static void __init
|
||||
arv4510pw_init(void)
|
||||
{
|
||||
ltq_register_gpio_stp();
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4510pw_leds_gpio), arv4510pw_leds_gpio);
|
||||
ltq_register_nor(&arv4510_flash_data);
|
||||
ltq_pci_data.irq[12] = (INT_NUM_IM2_IRL0 + 31);
|
||||
ltq_pci_data.irq[15] = (INT_NUM_IM0_IRL0 + 26);
|
||||
ltq_pci_data.gpio |= PCI_EXIN2 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
bewan_register_ethernet();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4510PW,
|
||||
"ARV4510PW",
|
||||
"ARV4510PW - Wippies Homebox",
|
||||
arv4510pw_init);
|
||||
|
||||
static void __init
|
||||
arv4518pw_init(void)
|
||||
{
|
||||
#define ARV4518PW_EBU 0
|
||||
#define ARV4518PW_USB 14
|
||||
#define ARV4518PW_SWITCH_RESET 13
|
||||
|
||||
ltq_register_gpio_ebu(ARV4518PW_EBU);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4518pw_leds_gpio), arv4518pw_leds_gpio);
|
||||
ltq_register_gpio_buttons(arv4518pw_gpio_buttons, ARRAY_SIZE(arv4518pw_gpio_buttons));
|
||||
ltq_register_nor(&arv45xx_flash_data);
|
||||
ltq_pci_data.gpio = PCI_GNT2 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_madwifi_eep();
|
||||
xway_register_dwc(ARV4518PW_USB);
|
||||
arv45xx_register_ethernet();
|
||||
arv45xx_register_ath5k();
|
||||
|
||||
gpio_request(ARV4518PW_SWITCH_RESET, "switch");
|
||||
gpio_direction_output(ARV4518PW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV4518PW_SWITCH_RESET, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4518PW,
|
||||
"ARV4518PW",
|
||||
"ARV4518PW - SMC7908A-ISP, Airties WAV-221",
|
||||
arv4518pw_init);
|
||||
|
||||
static void __init
|
||||
arv4520pw_init(void)
|
||||
{
|
||||
#define ARV4520PW_EBU 0x400
|
||||
#define ARV4520PW_USB 28
|
||||
#define ARV4520PW_SWITCH_RESET 110
|
||||
|
||||
ltq_register_gpio_ebu(ARV4520PW_EBU);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4520pw_leds_gpio), arv4520pw_leds_gpio);
|
||||
ltq_register_nor(&arv45xx_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
arv45xx_register_ethernet();
|
||||
xway_register_dwc(ARV4520PW_USB);
|
||||
|
||||
gpio_request(ARV4520PW_SWITCH_RESET, "switch");
|
||||
gpio_set_value(ARV4520PW_SWITCH_RESET, 1);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4520PW,
|
||||
"ARV4520PW",
|
||||
"ARV4520PW - Airties WAV-281, Arcor A800",
|
||||
arv4520pw_init);
|
||||
|
||||
static void __init
|
||||
arv452Cpw_init(void)
|
||||
{
|
||||
#define ARV452CPW_EBU 0x77f
|
||||
#define ARV452CPW_USB 28
|
||||
#define ARV452CPW_RELAY1 31
|
||||
#define ARV452CPW_RELAY2 107
|
||||
#define ARV452CPW_SWITCH_RESET 110
|
||||
|
||||
ltq_register_gpio_ebu(ARV452CPW_EBU);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv452cpw_leds_gpio), arv452cpw_leds_gpio);
|
||||
ltq_register_nor(&arv45xx_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_madwifi_eep();
|
||||
xway_register_dwc(ARV452CPW_USB);
|
||||
arv45xx_register_ethernet();
|
||||
arv45xx_register_ath5k();
|
||||
|
||||
gpio_request(ARV452CPW_SWITCH_RESET, "switch");
|
||||
gpio_set_value(ARV452CPW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV452CPW_SWITCH_RESET, 0);
|
||||
|
||||
gpio_request(ARV452CPW_RELAY1, "relay1");
|
||||
gpio_direction_output(ARV452CPW_RELAY1, 1);
|
||||
gpio_export(ARV452CPW_RELAY1, 0);
|
||||
|
||||
gpio_request(ARV452CPW_RELAY2, "relay2");
|
||||
gpio_set_value(ARV452CPW_RELAY2, 1);
|
||||
gpio_export(ARV452CPW_RELAY2, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV452CPW,
|
||||
"ARV452CPW",
|
||||
"ARV452CPW - Arcor A801",
|
||||
arv452Cpw_init);
|
||||
|
||||
static void __init
|
||||
arv4525pw_init(void)
|
||||
{
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4525pw_leds_gpio), arv4525pw_leds_gpio);
|
||||
ltq_register_nor(&arv45xx_flash_data);
|
||||
ltq_pci_data.clock = PCI_CLOCK_INT;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_madwifi_eep();
|
||||
ltq_eth_data.mii_mode = PHY_INTERFACE_MODE_MII;
|
||||
arv45xx_register_ethernet();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4525PW,
|
||||
"ARV4525PW",
|
||||
"ARV4525PW - Speedport W502V",
|
||||
arv4525pw_init);
|
||||
|
||||
static void __init
|
||||
arv7518pw_init(void)
|
||||
{
|
||||
#define ARV7518PW_EBU 0x2
|
||||
#define ARV7518PW_USB 14
|
||||
|
||||
ltq_register_gpio_ebu(ARV7518PW_EBU);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv7518pw_leds_gpio), arv7518pw_leds_gpio);
|
||||
ltq_register_gpio_buttons(arv7518pw_gpio_buttons, ARRAY_SIZE(arv7518pw_gpio_buttons));
|
||||
ltq_register_nor(&arv75xx_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
xway_register_dwc(ARV7518PW_USB);
|
||||
arv75xx_register_ethernet();
|
||||
//arv7518_register_ath9k(mac);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV7518PW,
|
||||
"ARV7518PW",
|
||||
"ARV7518PW - ASTORIA",
|
||||
arv7518pw_init);
|
||||
|
||||
static void __init
|
||||
arv752dpw22_init(void)
|
||||
{
|
||||
#define ARV752DPW22_EBU 0x2
|
||||
#define ARV752DPW22_USB 100
|
||||
#define ARV752DPW22_RELAY 101
|
||||
|
||||
ltq_register_gpio_ebu(ARV752DPW22_EBU);
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv752dpw22_leds_gpio), arv752dpw22_leds_gpio);
|
||||
ltq_register_gpio_buttons(arv752dpw22_gpio_buttons, ARRAY_SIZE(arv752dpw22_gpio_buttons));
|
||||
ltq_register_nor(&arv75xx_flash_data);
|
||||
ltq_pci_data.irq[15] = (INT_NUM_IM3_IRL0 + 31);
|
||||
ltq_pci_data.gpio |= PCI_EXIN1 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV752DPW22_USB);
|
||||
arv75xx_register_ethernet();
|
||||
|
||||
gpio_request(ARV752DPW22_RELAY, "relay");
|
||||
gpio_set_value(ARV752DPW22_RELAY, 1);
|
||||
gpio_export(ARV752DPW22_RELAY, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV752DPW22,
|
||||
"ARV752DPW22",
|
||||
"ARV752DPW22 - Arcor A803",
|
||||
arv752dpw22_init);
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <lantiq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
static struct mtd_partition easy50601_partitions[] = {
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data easy50601_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(easy50601_partitions),
|
||||
.parts = easy50601_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = -1, /* use EPHY */
|
||||
};
|
||||
|
||||
static void __init easy50601_init(void)
|
||||
{
|
||||
ltq_register_nor(&easy50601_flash_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LTQ_MACH_EASY50601,
|
||||
"EASY50601",
|
||||
"EASY50601 Eval Board",
|
||||
easy50601_init);
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
static struct mtd_partition easy50712_partitions[] = {
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data easy50712_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(easy50712_partitions),
|
||||
.parts = easy50712_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static void __init easy50712_init(void)
|
||||
{
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&easy50712_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
ltq_register_tapi();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LTQ_MACH_EASY50712,
|
||||
"EASY50712",
|
||||
"EASY50712 Eval Board",
|
||||
easy50712_init);
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
/*static struct mtd_partition fritz3370_partitions[] = {
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0xe0000,
|
||||
},
|
||||
{
|
||||
.name = "rootfs",
|
||||
.offset = 0x100000,
|
||||
.size = 0x300000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data fritz3370_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(fritz3370_partitions),
|
||||
.parts = fritz3370_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
*/
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
extern void xway_register_nand(void);
|
||||
|
||||
static void __init fritz3370_init(void)
|
||||
{
|
||||
// ltq_register_gpio_stp();
|
||||
// ltq_register_nor(&fritz3370_flash_data);
|
||||
// ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
xway_register_nand();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_FRITZ3370,
|
||||
"FRITZ3370",
|
||||
"FRITZ!BOX 3370",
|
||||
fritz3370_init);
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2011 Andrej Vlašić
|
||||
* Copyright (C) 2011 Luka Perkov
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/ath5k_platform.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <irq.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "../dev-leds-gpio.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static struct mtd_partition gigasx76x_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "secondary_env",
|
||||
.offset = 0xe000,
|
||||
.size = 0x2000,
|
||||
},
|
||||
{
|
||||
.name = "secondary_boot",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x20000,
|
||||
.size = 0x30000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x50000,
|
||||
.size = 0x7a0000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0x7f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
gigasx76x_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:green:usb", .gpio = 202, },
|
||||
{ .name = "soc:green:wlan", .gpio = 203, },
|
||||
{ .name = "soc:green:phone2", .gpio = 204, },
|
||||
{ .name = "soc:green:phone1", .gpio = 205, },
|
||||
{ .name = "soc:green:line", .gpio = 206, },
|
||||
{ .name = "soc:green:online", .gpio = 207, },
|
||||
};
|
||||
|
||||
|
||||
static struct physmap_flash_data gigasx76x_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(gigasx76x_partitions),
|
||||
.parts = gigasx76x_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
gigasx76x_init(void)
|
||||
{
|
||||
#define GIGASX76X_USB 29
|
||||
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&gigasx76x_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
xway_register_dwc(GIGASX76X_USB);
|
||||
ltq_register_tapi();
|
||||
ltq_register_madwifi_eep();
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(gigasx76x_leds_gpio), gigasx76x_leds_gpio);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_GIGASX76X,
|
||||
"GIGASX76X",
|
||||
"GIGASX76X - Gigaset SX761,SX762,SX763",
|
||||
gigasx76x_init);
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
struct spi_board_info spi_info = {
|
||||
.bus_num = 0,
|
||||
.chip_select = 3,
|
||||
.max_speed_hz = 25000000,
|
||||
.modalias = "mx25l12805d",
|
||||
};
|
||||
|
||||
struct ltq_spi_platform_data ltq_spi_data = {
|
||||
.num_chipselect = 4,
|
||||
};
|
||||
|
||||
static void __init dgn3500_init(void)
|
||||
{
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
ltq_register_spi(<q_spi_data, &spi_info, 1);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_DGN3500B,
|
||||
"DGN3500B",
|
||||
"Netgear DGN3500B",
|
||||
dgn3500_init);
|
120
target/linux/lantiq/files-3.0/arch/mips/lantiq/xway/mach-wbmr.c
Normal file
120
target/linux/lantiq/files-3.0/arch/mips/lantiq/xway/mach-wbmr.c
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "../dev-leds-gpio.h"
|
||||
#include "../dev-gpio-buttons.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static struct mtd_partition wbmr_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot-env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x60000,
|
||||
.size = 0x1f20000,
|
||||
},
|
||||
{
|
||||
.name = "calibration",
|
||||
.offset = 0x1fe0000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data wbmr_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(wbmr_partitions),
|
||||
.parts = wbmr_partitions,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
wbmr_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:blue:movie", .gpio = 20, .active_low = 1, },
|
||||
{ .name = "soc:red:internet", .gpio = 18, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 17, .active_low = 1, },
|
||||
{ .name = "soc:green:adsl", .gpio = 16, .active_low = 1, },
|
||||
{ .name = "soc:green:wlan", .gpio = 15, .active_low = 1, },
|
||||
{ .name = "soc:red:security", .gpio = 14, .active_low = 1, },
|
||||
{ .name = "soc:green:power", .gpio = 1, .active_low = 1, },
|
||||
{ .name = "soc:red:power", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 28, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
wbmr_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "aoss",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 0,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 37,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RGMII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
wbmr_init(void)
|
||||
{
|
||||
#define WMBR_BRN_MAC 0x1fd0024
|
||||
|
||||
ltq_add_device_leds_gpio(-1, ARRAY_SIZE(wbmr_leds_gpio), wbmr_leds_gpio);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(wbmr_gpio_keys), wbmr_gpio_keys);
|
||||
ltq_register_nor(&wbmr_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + WMBR_BRN_MAC), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
xway_register_dwc(36);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_WBMR,
|
||||
"WBMR",
|
||||
"WBMR",
|
||||
wbmr_init);
|
|
@ -29,7 +29,7 @@ USB_MENU:=USB Support
|
|||
define KernelPackage/usb-dwc-otg
|
||||
TITLE:=Synopsis DWC_OTG support
|
||||
SUBMENU:=$(USB_MENU)
|
||||
DEPENDS+=@TARGET_lantiq_danube +kmod-usb-core
|
||||
DEPENDS+=@(TARGET_lantiq_danube||TARGET_lantiq_ar9||TARGET_lantiq_vr9) +kmod-usb-core
|
||||
KCONFIG:=CONFIG_DWC_OTG \
|
||||
CONFIG_DWC_OTG_DEBUG=n \
|
||||
CONFIG_DWC_OTG_LANTIQ=y \
|
||||
|
@ -51,7 +51,7 @@ I2C_FALCON_MODULES:= \
|
|||
define KernelPackage/i2c-falcon-lantiq
|
||||
TITLE:=Falcon I2C controller
|
||||
$(call i2c_defaults,$(I2C_FALCON_MODULES),52)
|
||||
DEPENDS:=kmod-i2c-core @TARGET_lantiq
|
||||
DEPENDS:=kmod-i2c-core @(TARGET_lantiq_falcon||TARGET_lantiq_falcon_stable)
|
||||
endef
|
||||
|
||||
define KernelPackage/i2c-falcon-lantiq/description
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/gpio_ebu.c
|
||||
+++ b/arch/mips/lantiq/xway/gpio_ebu.c
|
||||
@@ -63,7 +63,6 @@ static struct gpio_chip ltq_ebu_chip = {
|
||||
.set = ltq_ebu_set,
|
||||
.base = 72,
|
||||
.ngpio = 16,
|
||||
- .can_sleep = 1,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
--- a/arch/mips/lantiq/xway/gpio_stp.c
|
||||
+++ b/arch/mips/lantiq/xway/gpio_stp.c
|
||||
@@ -72,7 +72,6 @@ static struct gpio_chip ltq_stp_chip = {
|
||||
.set = ltq_stp_set,
|
||||
.base = 48,
|
||||
.ngpio = 24,
|
||||
- .can_sleep = 1,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
From 91f8d0c8fbb9ea70bf78a291e312157177be8ee3 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sat, 20 Aug 2011 18:55:13 +0200
|
||||
Subject: [PATCH 01/24] MIPS: lantiq: fix early printk
|
||||
|
||||
The code was using a 32bit write operation in the early_printk code. This
|
||||
resulted in 3 zero bytes also being written to the serial port. Change the
|
||||
memory access to 8bit.
|
||||
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 4 ++++
|
||||
arch/mips/lantiq/early_printk.c | 14 ++++++++------
|
||||
2 files changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
index 8a3c6be..e6d1ca0 100644
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
@@ -34,6 +34,10 @@
|
||||
#define LTQ_ASC1_BASE_ADDR 0x1E100C00
|
||||
#define LTQ_ASC_SIZE 0x400
|
||||
|
||||
+/* during early_printk no ioremap is possible
|
||||
+ lets use KSEG1 instead */
|
||||
+#define LTQ_EARLY_ASC KSEG1ADDR(LTQ_ASC1_BASE_ADDR)
|
||||
+
|
||||
/* RCU - reset control unit */
|
||||
#define LTQ_RCU_BASE_ADDR 0x1F203000
|
||||
#define LTQ_RCU_SIZE 0x1000
|
||||
diff --git a/arch/mips/lantiq/early_printk.c b/arch/mips/lantiq/early_printk.c
|
||||
index 972e05f..5089075 100644
|
||||
--- a/arch/mips/lantiq/early_printk.c
|
||||
+++ b/arch/mips/lantiq/early_printk.c
|
||||
@@ -12,11 +12,13 @@
|
||||
#include <lantiq.h>
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
-/* no ioremap possible at this early stage, lets use KSEG1 instead */
|
||||
-#define LTQ_ASC_BASE KSEG1ADDR(LTQ_ASC1_BASE_ADDR)
|
||||
#define ASC_BUF 1024
|
||||
-#define LTQ_ASC_FSTAT ((u32 *)(LTQ_ASC_BASE + 0x0048))
|
||||
-#define LTQ_ASC_TBUF ((u32 *)(LTQ_ASC_BASE + 0x0020))
|
||||
+#define LTQ_ASC_FSTAT ((u32 *)(LTQ_EARLY_ASC + 0x0048))
|
||||
+#ifdef __BIG_ENDIAN
|
||||
+#define LTQ_ASC_TBUF ((u32 *)(LTQ_EARLY_ASC + 0x0020 + 3))
|
||||
+#else
|
||||
+#define LTQ_ASC_TBUF ((u32 *)(LTQ_EARLY_ASC + 0x0020))
|
||||
+#endif
|
||||
#define TXMASK 0x3F00
|
||||
#define TXOFFSET 8
|
||||
|
||||
@@ -27,7 +29,7 @@ void prom_putchar(char c)
|
||||
local_irq_save(flags);
|
||||
do { } while ((ltq_r32(LTQ_ASC_FSTAT) & TXMASK) >> TXOFFSET);
|
||||
if (c == '\n')
|
||||
- ltq_w32('\r', LTQ_ASC_TBUF);
|
||||
- ltq_w32(c, LTQ_ASC_TBUF);
|
||||
+ ltq_w8('\r', LTQ_ASC_TBUF);
|
||||
+ ltq_w8(c, LTQ_ASC_TBUF);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
From b85d5204f2fe8c3b5e6172f7cc1741ad6e849334 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 12 Aug 2011 16:27:38 +0200
|
||||
Subject: [PATCH 02/24] MIPS: lantiq: fix cmdline parsing
|
||||
|
||||
The code tested if the KSEG1 mapped address of argv was != 0. We need to use
|
||||
CPHYSADDR instead to make the conditional actually work.
|
||||
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/lantiq/prom.c | 6 ++++--
|
||||
1 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/lantiq/prom.c b/arch/mips/lantiq/prom.c
|
||||
index 56ba007..5035c10 100644
|
||||
--- a/arch/mips/lantiq/prom.c
|
||||
+++ b/arch/mips/lantiq/prom.c
|
||||
@@ -45,10 +45,12 @@ static void __init prom_init_cmdline(void)
|
||||
char **argv = (char **) KSEG1ADDR(fw_arg1);
|
||||
int i;
|
||||
|
||||
+ arcs_cmdline[0] = '\0';
|
||||
+
|
||||
for (i = 0; i < argc; i++) {
|
||||
- char *p = (char *) KSEG1ADDR(argv[i]);
|
||||
+ char *p = (char *) KSEG1ADDR(argv[i]);
|
||||
|
||||
- if (p && *p) {
|
||||
+ if (CPHYSADDR(p) && *p) {
|
||||
strlcat(arcs_cmdline, p, sizeof(arcs_cmdline));
|
||||
strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline));
|
||||
}
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From 14ea48a5f5702ddc97425cbe520600e187e14e4a Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 11 Aug 2011 13:58:39 +0200
|
||||
Subject: [PATCH 03/16] MIPS: lantiq: fix watchdogs timeout handling
|
||||
Subject: [PATCH 03/24] MIPS: lantiq: fix watchdogs timeout handling
|
||||
|
||||
The enable function was using the global timeout variable for local operations.
|
||||
This resulted in the value of the global variable being corrupted, thus
|
||||
|
@ -15,6 +15,8 @@ Cc: linux-mips@linux-mips.org
|
|||
drivers/watchdog/lantiq_wdt.c | 8 ++++----
|
||||
1 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c
|
||||
index 7d82ada..102aed0 100644
|
||||
--- a/drivers/watchdog/lantiq_wdt.c
|
||||
+++ b/drivers/watchdog/lantiq_wdt.c
|
||||
@@ -51,16 +51,16 @@ static int ltq_wdt_ok_to_close;
|
||||
|
@ -38,3 +40,6 @@ Cc: linux-mips@linux-mips.org
|
|||
}
|
||||
|
||||
static void
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,883 @@
|
|||
From d90739a8962b541969b4c5f7ef1df8fec9c7f153 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 10 Aug 2011 14:57:04 +0200
|
||||
Subject: [PATCH 04/24] MIPS: lantiq: reorganize xway code
|
||||
|
||||
Inside the folder arch/mips/lantiq/xway, there were alot of small files with
|
||||
lots of duplicated code. This patch adds a wrapper function for inserting and
|
||||
requesting resources and unifies the small files into one bigger file.
|
||||
|
||||
This patch makes the xway code consistent with the falcon support added later
|
||||
in this series.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/include/asm/mach-lantiq/lantiq.h | 14 +---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 14 ++++
|
||||
arch/mips/lantiq/clk.c | 25 +------
|
||||
arch/mips/lantiq/devices.c | 30 ++------
|
||||
arch/mips/lantiq/devices.h | 4 +
|
||||
arch/mips/lantiq/prom.c | 50 +++++++++++--
|
||||
arch/mips/lantiq/prom.h | 4 +
|
||||
arch/mips/lantiq/xway/Makefile | 6 +-
|
||||
arch/mips/lantiq/xway/devices.c | 42 ++---------
|
||||
arch/mips/lantiq/xway/dma.c | 21 ++----
|
||||
arch/mips/lantiq/xway/ebu.c | 53 --------------
|
||||
arch/mips/lantiq/xway/pmu.c | 70 ------------------
|
||||
arch/mips/lantiq/xway/prom-ase.c | 9 +++
|
||||
arch/mips/lantiq/xway/prom-xway.c | 10 +++
|
||||
arch/mips/lantiq/xway/reset.c | 21 ++----
|
||||
arch/mips/lantiq/xway/setup-ase.c | 19 -----
|
||||
arch/mips/lantiq/xway/setup-xway.c | 20 -----
|
||||
arch/mips/lantiq/xway/sysctrl.c | 77 ++++++++++++++++++++
|
||||
drivers/watchdog/lantiq_wdt.c | 2 +-
|
||||
19 files changed, 197 insertions(+), 294 deletions(-)
|
||||
delete mode 100644 arch/mips/lantiq/xway/ebu.c
|
||||
delete mode 100644 arch/mips/lantiq/xway/pmu.c
|
||||
delete mode 100644 arch/mips/lantiq/xway/setup-ase.c
|
||||
delete mode 100644 arch/mips/lantiq/xway/setup-xway.c
|
||||
create mode 100644 arch/mips/lantiq/xway/sysctrl.c
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/lantiq.h b/arch/mips/include/asm/mach-lantiq/lantiq.h
|
||||
index ce2f029..66d7300 100644
|
||||
--- a/arch/mips/include/asm/mach-lantiq/lantiq.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/lantiq.h
|
||||
@@ -9,6 +9,7 @@
|
||||
#define _LANTIQ_H__
|
||||
|
||||
#include <linux/irq.h>
|
||||
+#include <linux/ioport.h>
|
||||
|
||||
/* generic reg access functions */
|
||||
#define ltq_r32(reg) __raw_readl(reg)
|
||||
@@ -18,15 +19,6 @@
|
||||
#define ltq_r8(reg) __raw_readb(reg)
|
||||
#define ltq_w8(val, reg) __raw_writeb(val, reg)
|
||||
|
||||
-/* register access macros for EBU and CGU */
|
||||
-#define ltq_ebu_w32(x, y) ltq_w32((x), ltq_ebu_membase + (y))
|
||||
-#define ltq_ebu_r32(x) ltq_r32(ltq_ebu_membase + (x))
|
||||
-#define ltq_cgu_w32(x, y) ltq_w32((x), ltq_cgu_membase + (y))
|
||||
-#define ltq_cgu_r32(x) ltq_r32(ltq_cgu_membase + (x))
|
||||
-
|
||||
-extern __iomem void *ltq_ebu_membase;
|
||||
-extern __iomem void *ltq_cgu_membase;
|
||||
-
|
||||
extern unsigned int ltq_get_cpu_ver(void);
|
||||
extern unsigned int ltq_get_soc_type(void);
|
||||
|
||||
@@ -51,7 +43,9 @@ extern void ltq_enable_irq(struct irq_data *data);
|
||||
|
||||
/* find out what caused the last cpu reset */
|
||||
extern int ltq_reset_cause(void);
|
||||
-#define LTQ_RST_CAUSE_WDTRST 0x20
|
||||
+
|
||||
+/* helper for requesting and remapping resources */
|
||||
+extern void __iomem *ltq_remap_resource(struct resource *res);
|
||||
|
||||
#define IOPORT_RESOURCE_START 0x10000000
|
||||
#define IOPORT_RESOURCE_END 0xffffffff
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
index e6d1ca0..da8ff95 100644
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
@@ -65,6 +65,8 @@
|
||||
#define LTQ_CGU_BASE_ADDR 0x1F103000
|
||||
#define LTQ_CGU_SIZE 0x1000
|
||||
|
||||
+#define CGU_EPHY 0x10
|
||||
+
|
||||
/* ICU - interrupt control unit */
|
||||
#define LTQ_ICU_BASE_ADDR 0x1F880200
|
||||
#define LTQ_ICU_SIZE 0x100
|
||||
@@ -101,6 +103,8 @@
|
||||
#define LTQ_WDT_BASE_ADDR 0x1F8803F0
|
||||
#define LTQ_WDT_SIZE 0x10
|
||||
|
||||
+#define LTQ_RST_CAUSE_WDTRST 0x20
|
||||
+
|
||||
/* STP - serial to parallel conversion unit */
|
||||
#define LTQ_STP_BASE_ADDR 0x1E100BB0
|
||||
#define LTQ_STP_SIZE 0x40
|
||||
@@ -125,11 +129,21 @@
|
||||
#define LTQ_MPS_BASE_ADDR (KSEG1 + 0x1F107000)
|
||||
#define LTQ_MPS_CHIPID ((u32 *)(LTQ_MPS_BASE_ADDR + 0x0344))
|
||||
|
||||
+/* register access macros for EBU and CGU */
|
||||
+#define ltq_ebu_w32(x, y) ltq_w32((x), ltq_ebu_membase + (y))
|
||||
+#define ltq_ebu_r32(x) ltq_r32(ltq_ebu_membase + (x))
|
||||
+#define ltq_cgu_w32(x, y) ltq_w32((x), ltq_cgu_membase + (y))
|
||||
+#define ltq_cgu_r32(x) ltq_r32(ltq_cgu_membase + (x))
|
||||
+
|
||||
+extern __iomem void *ltq_ebu_membase;
|
||||
+extern __iomem void *ltq_cgu_membase;
|
||||
+
|
||||
/* request a non-gpio and set the PIO config */
|
||||
extern int ltq_gpio_request(unsigned int pin, unsigned int alt0,
|
||||
unsigned int alt1, unsigned int dir, const char *name);
|
||||
extern void ltq_pmu_enable(unsigned int module);
|
||||
extern void ltq_pmu_disable(unsigned int module);
|
||||
+extern void ltq_cgu_enable(unsigned int clk);
|
||||
|
||||
static inline int ltq_is_ar9(void)
|
||||
{
|
||||
diff --git a/arch/mips/lantiq/clk.c b/arch/mips/lantiq/clk.c
|
||||
index 7e9c0ff..4254f08 100644
|
||||
--- a/arch/mips/lantiq/clk.c
|
||||
+++ b/arch/mips/lantiq/clk.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
#include "clk.h"
|
||||
+#include "prom.h"
|
||||
|
||||
struct clk {
|
||||
const char *name;
|
||||
@@ -46,16 +47,6 @@ static struct clk cpu_clk_generic[] = {
|
||||
},
|
||||
};
|
||||
|
||||
-static struct resource ltq_cgu_resource = {
|
||||
- .name = "cgu",
|
||||
- .start = LTQ_CGU_BASE_ADDR,
|
||||
- .end = LTQ_CGU_BASE_ADDR + LTQ_CGU_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
-
|
||||
-/* remapped clock register range */
|
||||
-void __iomem *ltq_cgu_membase;
|
||||
-
|
||||
void clk_init(void)
|
||||
{
|
||||
cpu_clk = cpu_clk_generic;
|
||||
@@ -133,21 +124,11 @@ void __init plat_time_init(void)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
||||
- if (insert_resource(&iomem_resource, <q_cgu_resource) < 0)
|
||||
- panic("Failed to insert cgu memory\n");
|
||||
-
|
||||
- if (request_mem_region(ltq_cgu_resource.start,
|
||||
- resource_size(<q_cgu_resource), "cgu") < 0)
|
||||
- panic("Failed to request cgu memory\n");
|
||||
+ ltq_soc_init();
|
||||
|
||||
- ltq_cgu_membase = ioremap_nocache(ltq_cgu_resource.start,
|
||||
- resource_size(<q_cgu_resource));
|
||||
- if (!ltq_cgu_membase) {
|
||||
- pr_err("Failed to remap cgu memory\n");
|
||||
- unreachable();
|
||||
- }
|
||||
clk = clk_get(0, "cpu");
|
||||
mips_hpt_frequency = clk_get_rate(clk) / ltq_get_counter_resolution();
|
||||
write_c0_compare(read_c0_count());
|
||||
+ pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000);
|
||||
clk_put(clk);
|
||||
}
|
||||
diff --git a/arch/mips/lantiq/devices.c b/arch/mips/lantiq/devices.c
|
||||
index 44a3677..81c7aab 100644
|
||||
--- a/arch/mips/lantiq/devices.c
|
||||
+++ b/arch/mips/lantiq/devices.c
|
||||
@@ -27,12 +27,8 @@
|
||||
#include "devices.h"
|
||||
|
||||
/* nor flash */
|
||||
-static struct resource ltq_nor_resource = {
|
||||
- .name = "nor",
|
||||
- .start = LTQ_FLASH_START,
|
||||
- .end = LTQ_FLASH_START + LTQ_FLASH_MAX - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_nor_resource =
|
||||
+ MEM_RES("nor", LTQ_FLASH_START, LTQ_FLASH_MAX);
|
||||
|
||||
static struct platform_device ltq_nor = {
|
||||
.name = "ltq_nor",
|
||||
@@ -47,12 +43,8 @@ void __init ltq_register_nor(struct physmap_flash_data *data)
|
||||
}
|
||||
|
||||
/* watchdog */
|
||||
-static struct resource ltq_wdt_resource = {
|
||||
- .name = "watchdog",
|
||||
- .start = LTQ_WDT_BASE_ADDR,
|
||||
- .end = LTQ_WDT_BASE_ADDR + LTQ_WDT_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_wdt_resource =
|
||||
+ MEM_RES("watchdog", LTQ_WDT_BASE_ADDR, LTQ_WDT_SIZE);
|
||||
|
||||
void __init ltq_register_wdt(void)
|
||||
{
|
||||
@@ -61,24 +53,14 @@ void __init ltq_register_wdt(void)
|
||||
|
||||
/* asc ports */
|
||||
static struct resource ltq_asc0_resources[] = {
|
||||
- {
|
||||
- .name = "asc0",
|
||||
- .start = LTQ_ASC0_BASE_ADDR,
|
||||
- .end = LTQ_ASC0_BASE_ADDR + LTQ_ASC_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
+ MEM_RES("asc0", LTQ_ASC0_BASE_ADDR, LTQ_ASC_SIZE),
|
||||
IRQ_RES(tx, LTQ_ASC_TIR(0)),
|
||||
IRQ_RES(rx, LTQ_ASC_RIR(0)),
|
||||
IRQ_RES(err, LTQ_ASC_EIR(0)),
|
||||
};
|
||||
|
||||
static struct resource ltq_asc1_resources[] = {
|
||||
- {
|
||||
- .name = "asc1",
|
||||
- .start = LTQ_ASC1_BASE_ADDR,
|
||||
- .end = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
+ MEM_RES("asc1", LTQ_ASC1_BASE_ADDR, LTQ_ASC_SIZE),
|
||||
IRQ_RES(tx, LTQ_ASC_TIR(1)),
|
||||
IRQ_RES(rx, LTQ_ASC_RIR(1)),
|
||||
IRQ_RES(err, LTQ_ASC_EIR(1)),
|
||||
diff --git a/arch/mips/lantiq/devices.h b/arch/mips/lantiq/devices.h
|
||||
index 2947bb1..a03c23f 100644
|
||||
--- a/arch/mips/lantiq/devices.h
|
||||
+++ b/arch/mips/lantiq/devices.h
|
||||
@@ -14,6 +14,10 @@
|
||||
|
||||
#define IRQ_RES(resname, irq) \
|
||||
{.name = #resname, .start = (irq), .flags = IORESOURCE_IRQ}
|
||||
+#define MEM_RES(resname, adr_start, adr_size) \
|
||||
+ { .name = resname, .flags = IORESOURCE_MEM, \
|
||||
+ .start = ((adr_start) & ~KSEG1), \
|
||||
+ .end = ((adr_start + adr_size - 1) & ~KSEG1) }
|
||||
|
||||
extern void ltq_register_nor(struct physmap_flash_data *data);
|
||||
extern void ltq_register_wdt(void);
|
||||
diff --git a/arch/mips/lantiq/prom.c b/arch/mips/lantiq/prom.c
|
||||
index 5035c10..fead2cc 100644
|
||||
--- a/arch/mips/lantiq/prom.c
|
||||
+++ b/arch/mips/lantiq/prom.c
|
||||
@@ -16,6 +16,10 @@
|
||||
#include "prom.h"
|
||||
#include "clk.h"
|
||||
|
||||
+/* access to the ebu needs to be locked between different drivers */
|
||||
+DEFINE_SPINLOCK(ebu_lock);
|
||||
+EXPORT_SYMBOL_GPL(ebu_lock);
|
||||
+
|
||||
static struct ltq_soc_info soc_info;
|
||||
|
||||
unsigned int ltq_get_cpu_ver(void)
|
||||
@@ -57,16 +61,50 @@ static void __init prom_init_cmdline(void)
|
||||
}
|
||||
}
|
||||
|
||||
-void __init prom_init(void)
|
||||
+void __iomem *ltq_remap_resource(struct resource *res)
|
||||
{
|
||||
- struct clk *clk;
|
||||
+ __iomem void *ret = NULL;
|
||||
+ struct resource *lookup = lookup_resource(&iomem_resource, res->start);
|
||||
+
|
||||
+ if (lookup && strcmp(lookup->name, res->name)) {
|
||||
+ panic("conflicting memory range %s\n", res->name);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ if (!lookup) {
|
||||
+ if (insert_resource(&iomem_resource, res) < 0) {
|
||||
+ panic("Failed to insert %s memory\n", res->name);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ if (request_mem_region(res->start,
|
||||
+ resource_size(res), res->name) < 0) {
|
||||
+ panic("Failed to request %s memory\n", res->name);
|
||||
+ goto err_res;
|
||||
+ }
|
||||
|
||||
+ ret = ioremap_nocache(res->start, resource_size(res));
|
||||
+ if (!ret)
|
||||
+ goto err_mem;
|
||||
+
|
||||
+ pr_debug("remap: 0x%08X-0x%08X : \"%s\"\n",
|
||||
+ res->start, res->end, res->name);
|
||||
+ return ret;
|
||||
+
|
||||
+err_mem:
|
||||
+ panic("Failed to remap %s memory\n", res->name);
|
||||
+ release_mem_region(res->start, resource_size(res));
|
||||
+
|
||||
+err_res:
|
||||
+ release_resource(res);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+void __init prom_init(void)
|
||||
+{
|
||||
ltq_soc_detect(&soc_info);
|
||||
clk_init();
|
||||
- clk = clk_get(0, "cpu");
|
||||
- snprintf(soc_info.sys_type, LTQ_SYS_TYPE_LEN - 1, "%s rev1.%d",
|
||||
- soc_info.name, soc_info.rev);
|
||||
- clk_put(clk);
|
||||
+ snprintf(soc_info.sys_type, LTQ_SYS_TYPE_LEN - 1, "%s rev %s",
|
||||
+ soc_info.name, soc_info.rev_type);
|
||||
soc_info.sys_type[LTQ_SYS_TYPE_LEN - 1] = '\0';
|
||||
pr_info("SoC: %s\n", soc_info.sys_type);
|
||||
prom_init_cmdline();
|
||||
diff --git a/arch/mips/lantiq/prom.h b/arch/mips/lantiq/prom.h
|
||||
index b4229d9..51dba1b 100644
|
||||
--- a/arch/mips/lantiq/prom.h
|
||||
+++ b/arch/mips/lantiq/prom.h
|
||||
@@ -9,17 +9,21 @@
|
||||
#ifndef _LTQ_PROM_H__
|
||||
#define _LTQ_PROM_H__
|
||||
|
||||
+#define LTQ_SYS_REV_LEN 0x10
|
||||
#define LTQ_SYS_TYPE_LEN 0x100
|
||||
|
||||
struct ltq_soc_info {
|
||||
unsigned char *name;
|
||||
unsigned int rev;
|
||||
+ unsigned char rev_type[LTQ_SYS_REV_LEN];
|
||||
+ unsigned int srev;
|
||||
unsigned int partnum;
|
||||
unsigned int type;
|
||||
unsigned char sys_type[LTQ_SYS_TYPE_LEN];
|
||||
};
|
||||
|
||||
extern void ltq_soc_detect(struct ltq_soc_info *i);
|
||||
+extern void ltq_soc_init(void);
|
||||
extern void ltq_soc_setup(void);
|
||||
|
||||
#endif
|
||||
diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
|
||||
index c517f2e..6678402 100644
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -1,7 +1,7 @@
|
||||
-obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o
|
||||
+obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o
|
||||
|
||||
-obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
|
||||
-obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
|
||||
+obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
|
||||
+obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
|
||||
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c
|
||||
index d0e32ab..9bacaa8 100644
|
||||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -31,22 +31,9 @@
|
||||
|
||||
/* gpio */
|
||||
static struct resource ltq_gpio_resource[] = {
|
||||
- {
|
||||
- .name = "gpio0",
|
||||
- .start = LTQ_GPIO0_BASE_ADDR,
|
||||
- .end = LTQ_GPIO0_BASE_ADDR + LTQ_GPIO_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- }, {
|
||||
- .name = "gpio1",
|
||||
- .start = LTQ_GPIO1_BASE_ADDR,
|
||||
- .end = LTQ_GPIO1_BASE_ADDR + LTQ_GPIO_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- }, {
|
||||
- .name = "gpio2",
|
||||
- .start = LTQ_GPIO2_BASE_ADDR,
|
||||
- .end = LTQ_GPIO2_BASE_ADDR + LTQ_GPIO_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- }
|
||||
+ MEM_RES("gpio0", LTQ_GPIO0_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
+ MEM_RES("gpio1", LTQ_GPIO1_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
+ MEM_RES("gpio2", LTQ_GPIO2_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
};
|
||||
|
||||
void __init ltq_register_gpio(void)
|
||||
@@ -64,12 +51,8 @@ void __init ltq_register_gpio(void)
|
||||
}
|
||||
|
||||
/* serial to parallel conversion */
|
||||
-static struct resource ltq_stp_resource = {
|
||||
- .name = "stp",
|
||||
- .start = LTQ_STP_BASE_ADDR,
|
||||
- .end = LTQ_STP_BASE_ADDR + LTQ_STP_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_stp_resource =
|
||||
+ MEM_RES("stp", LTQ_STP_BASE_ADDR, LTQ_STP_SIZE);
|
||||
|
||||
void __init ltq_register_gpio_stp(void)
|
||||
{
|
||||
@@ -78,12 +61,7 @@ void __init ltq_register_gpio_stp(void)
|
||||
|
||||
/* asc ports - amazon se has its own serial mapping */
|
||||
static struct resource ltq_ase_asc_resources[] = {
|
||||
- {
|
||||
- .name = "asc0",
|
||||
- .start = LTQ_ASC1_BASE_ADDR,
|
||||
- .end = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
+ MEM_RES("asc0", LTQ_ASC1_BASE_ADDR, LTQ_ASC_SIZE),
|
||||
IRQ_RES(tx, LTQ_ASC_ASE_TIR),
|
||||
IRQ_RES(rx, LTQ_ASC_ASE_RIR),
|
||||
IRQ_RES(err, LTQ_ASC_ASE_EIR),
|
||||
@@ -96,12 +74,8 @@ void __init ltq_register_ase_asc(void)
|
||||
}
|
||||
|
||||
/* ethernet */
|
||||
-static struct resource ltq_etop_resources = {
|
||||
- .name = "etop",
|
||||
- .start = LTQ_ETOP_BASE_ADDR,
|
||||
- .end = LTQ_ETOP_BASE_ADDR + LTQ_ETOP_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_etop_resources =
|
||||
+ MEM_RES("etop", LTQ_ETOP_BASE_ADDR, LTQ_ETOP_SIZE);
|
||||
|
||||
static struct platform_device ltq_etop = {
|
||||
.name = "ltq_etop",
|
||||
diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c
|
||||
index 4278a45..af35e62 100644
|
||||
--- a/arch/mips/lantiq/xway/dma.c
|
||||
+++ b/arch/mips/lantiq/xway/dma.c
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <lantiq_soc.h>
|
||||
#include <xway_dma.h>
|
||||
|
||||
+#include "../devices.h"
|
||||
+
|
||||
#define LTQ_DMA_CTRL 0x10
|
||||
#define LTQ_DMA_CPOLL 0x14
|
||||
#define LTQ_DMA_CS 0x18
|
||||
@@ -54,12 +56,8 @@
|
||||
#define ltq_dma_w32_mask(x, y, z) ltq_w32_mask(x, y, \
|
||||
ltq_dma_membase + (z))
|
||||
|
||||
-static struct resource ltq_dma_resource = {
|
||||
- .name = "dma",
|
||||
- .start = LTQ_DMA_BASE_ADDR,
|
||||
- .end = LTQ_DMA_BASE_ADDR + LTQ_DMA_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_dma_resource =
|
||||
+ MEM_RES("dma", LTQ_DMA_BASE_ADDR, LTQ_DMA_SIZE);
|
||||
|
||||
static void __iomem *ltq_dma_membase;
|
||||
|
||||
@@ -219,17 +217,8 @@ ltq_dma_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
- /* insert and request the memory region */
|
||||
- if (insert_resource(&iomem_resource, <q_dma_resource) < 0)
|
||||
- panic("Failed to insert dma memory\n");
|
||||
-
|
||||
- if (request_mem_region(ltq_dma_resource.start,
|
||||
- resource_size(<q_dma_resource), "dma") < 0)
|
||||
- panic("Failed to request dma memory\n");
|
||||
-
|
||||
/* remap dma register range */
|
||||
- ltq_dma_membase = ioremap_nocache(ltq_dma_resource.start,
|
||||
- resource_size(<q_dma_resource));
|
||||
+ ltq_dma_membase = ltq_remap_resource(<q_dma_resource);
|
||||
if (!ltq_dma_membase)
|
||||
panic("Failed to remap dma memory\n");
|
||||
|
||||
diff --git a/arch/mips/lantiq/xway/ebu.c b/arch/mips/lantiq/xway/ebu.c
|
||||
deleted file mode 100644
|
||||
index 66eb52f..0000000
|
||||
--- a/arch/mips/lantiq/xway/ebu.c
|
||||
+++ /dev/null
|
||||
@@ -1,53 +0,0 @@
|
||||
-/*
|
||||
- * 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.
|
||||
- *
|
||||
- * EBU - the external bus unit attaches PCI, NOR and NAND
|
||||
- *
|
||||
- * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
- */
|
||||
-
|
||||
-#include <linux/kernel.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/version.h>
|
||||
-#include <linux/ioport.h>
|
||||
-
|
||||
-#include <lantiq_soc.h>
|
||||
-
|
||||
-/* all access to the ebu must be locked */
|
||||
-DEFINE_SPINLOCK(ebu_lock);
|
||||
-EXPORT_SYMBOL_GPL(ebu_lock);
|
||||
-
|
||||
-static struct resource ltq_ebu_resource = {
|
||||
- .name = "ebu",
|
||||
- .start = LTQ_EBU_BASE_ADDR,
|
||||
- .end = LTQ_EBU_BASE_ADDR + LTQ_EBU_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
-
|
||||
-/* remapped base addr of the clock unit and external bus unit */
|
||||
-void __iomem *ltq_ebu_membase;
|
||||
-
|
||||
-static int __init lantiq_ebu_init(void)
|
||||
-{
|
||||
- /* insert and request the memory region */
|
||||
- if (insert_resource(&iomem_resource, <q_ebu_resource) < 0)
|
||||
- panic("Failed to insert ebu memory\n");
|
||||
-
|
||||
- if (request_mem_region(ltq_ebu_resource.start,
|
||||
- resource_size(<q_ebu_resource), "ebu") < 0)
|
||||
- panic("Failed to request ebu memory\n");
|
||||
-
|
||||
- /* remap ebu register range */
|
||||
- ltq_ebu_membase = ioremap_nocache(ltq_ebu_resource.start,
|
||||
- resource_size(<q_ebu_resource));
|
||||
- if (!ltq_ebu_membase)
|
||||
- panic("Failed to remap ebu memory\n");
|
||||
-
|
||||
- /* make sure to unprotect the memory region where flash is located */
|
||||
- ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-postcore_initcall(lantiq_ebu_init);
|
||||
diff --git a/arch/mips/lantiq/xway/pmu.c b/arch/mips/lantiq/xway/pmu.c
|
||||
deleted file mode 100644
|
||||
index 9d69f01e..0000000
|
||||
--- a/arch/mips/lantiq/xway/pmu.c
|
||||
+++ /dev/null
|
||||
@@ -1,70 +0,0 @@
|
||||
-/*
|
||||
- * 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.
|
||||
- *
|
||||
- * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
- */
|
||||
-
|
||||
-#include <linux/kernel.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/version.h>
|
||||
-#include <linux/ioport.h>
|
||||
-
|
||||
-#include <lantiq_soc.h>
|
||||
-
|
||||
-/* PMU - the power management unit allows us to turn part of the core
|
||||
- * on and off
|
||||
- */
|
||||
-
|
||||
-/* the enable / disable registers */
|
||||
-#define LTQ_PMU_PWDCR 0x1C
|
||||
-#define LTQ_PMU_PWDSR 0x20
|
||||
-
|
||||
-#define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y))
|
||||
-#define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x))
|
||||
-
|
||||
-static struct resource ltq_pmu_resource = {
|
||||
- .name = "pmu",
|
||||
- .start = LTQ_PMU_BASE_ADDR,
|
||||
- .end = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
-
|
||||
-static void __iomem *ltq_pmu_membase;
|
||||
-
|
||||
-void ltq_pmu_enable(unsigned int module)
|
||||
-{
|
||||
- int err = 1000000;
|
||||
-
|
||||
- ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
|
||||
- do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
|
||||
-
|
||||
- if (!err)
|
||||
- panic("activating PMU module failed!\n");
|
||||
-}
|
||||
-EXPORT_SYMBOL(ltq_pmu_enable);
|
||||
-
|
||||
-void ltq_pmu_disable(unsigned int module)
|
||||
-{
|
||||
- ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
|
||||
-}
|
||||
-EXPORT_SYMBOL(ltq_pmu_disable);
|
||||
-
|
||||
-int __init ltq_pmu_init(void)
|
||||
-{
|
||||
- if (insert_resource(&iomem_resource, <q_pmu_resource) < 0)
|
||||
- panic("Failed to insert pmu memory\n");
|
||||
-
|
||||
- if (request_mem_region(ltq_pmu_resource.start,
|
||||
- resource_size(<q_pmu_resource), "pmu") < 0)
|
||||
- panic("Failed to request pmu memory\n");
|
||||
-
|
||||
- ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
|
||||
- resource_size(<q_pmu_resource));
|
||||
- if (!ltq_pmu_membase)
|
||||
- panic("Failed to remap pmu memory\n");
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-core_initcall(ltq_pmu_init);
|
||||
diff --git a/arch/mips/lantiq/xway/prom-ase.c b/arch/mips/lantiq/xway/prom-ase.c
|
||||
index abe49f4..aaccdcb 100644
|
||||
--- a/arch/mips/lantiq/xway/prom-ase.c
|
||||
+++ b/arch/mips/lantiq/xway/prom-ase.c
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
+#include "devices.h"
|
||||
#include "../prom.h"
|
||||
|
||||
#define SOC_AMAZON_SE "Amazon_SE"
|
||||
@@ -26,6 +27,7 @@ void __init ltq_soc_detect(struct ltq_soc_info *i)
|
||||
{
|
||||
i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
|
||||
i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
|
||||
+ sprintf(i->rev_type, "1.%d", i->rev);
|
||||
switch (i->partnum) {
|
||||
case SOC_ID_AMAZON_SE:
|
||||
i->name = SOC_AMAZON_SE;
|
||||
@@ -37,3 +39,10 @@ void __init ltq_soc_detect(struct ltq_soc_info *i)
|
||||
break;
|
||||
}
|
||||
}
|
||||
+
|
||||
+void __init ltq_soc_setup(void)
|
||||
+{
|
||||
+ ltq_register_ase_asc();
|
||||
+ ltq_register_gpio();
|
||||
+ ltq_register_wdt();
|
||||
+}
|
||||
diff --git a/arch/mips/lantiq/xway/prom-xway.c b/arch/mips/lantiq/xway/prom-xway.c
|
||||
index 1686692a..f3d1228 100644
|
||||
--- a/arch/mips/lantiq/xway/prom-xway.c
|
||||
+++ b/arch/mips/lantiq/xway/prom-xway.c
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
+#include "devices.h"
|
||||
#include "../prom.h"
|
||||
|
||||
#define SOC_DANUBE "Danube"
|
||||
@@ -28,6 +29,7 @@ void __init ltq_soc_detect(struct ltq_soc_info *i)
|
||||
{
|
||||
i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
|
||||
i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
|
||||
+ sprintf(i->rev_type, "1.%d", i->rev);
|
||||
switch (i->partnum) {
|
||||
case SOC_ID_DANUBE1:
|
||||
case SOC_ID_DANUBE2:
|
||||
@@ -52,3 +54,11 @@ void __init ltq_soc_detect(struct ltq_soc_info *i)
|
||||
break;
|
||||
}
|
||||
}
|
||||
+
|
||||
+void __init ltq_soc_setup(void)
|
||||
+{
|
||||
+ ltq_register_asc(0);
|
||||
+ ltq_register_asc(1);
|
||||
+ ltq_register_gpio();
|
||||
+ ltq_register_wdt();
|
||||
+}
|
||||
diff --git a/arch/mips/lantiq/xway/reset.c b/arch/mips/lantiq/xway/reset.c
|
||||
index a1be36d..e701a48 100644
|
||||
--- a/arch/mips/lantiq/xway/reset.c
|
||||
+++ b/arch/mips/lantiq/xway/reset.c
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
+#include "../devices.h"
|
||||
+
|
||||
#define ltq_rcu_w32(x, y) ltq_w32((x), ltq_rcu_membase + (y))
|
||||
#define ltq_rcu_r32(x) ltq_r32(ltq_rcu_membase + (x))
|
||||
|
||||
@@ -25,12 +27,8 @@
|
||||
#define LTQ_RCU_RST_STAT 0x0014
|
||||
#define LTQ_RCU_STAT_SHIFT 26
|
||||
|
||||
-static struct resource ltq_rcu_resource = {
|
||||
- .name = "rcu",
|
||||
- .start = LTQ_RCU_BASE_ADDR,
|
||||
- .end = LTQ_RCU_BASE_ADDR + LTQ_RCU_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
-};
|
||||
+static struct resource ltq_rcu_resource =
|
||||
+ MEM_RES("rcu", LTQ_RCU_BASE_ADDR, LTQ_RCU_SIZE);
|
||||
|
||||
/* remapped base addr of the reset control unit */
|
||||
static void __iomem *ltq_rcu_membase;
|
||||
@@ -67,17 +65,8 @@ static void ltq_machine_power_off(void)
|
||||
|
||||
static int __init mips_reboot_setup(void)
|
||||
{
|
||||
- /* insert and request the memory region */
|
||||
- if (insert_resource(&iomem_resource, <q_rcu_resource) < 0)
|
||||
- panic("Failed to insert rcu memory\n");
|
||||
-
|
||||
- if (request_mem_region(ltq_rcu_resource.start,
|
||||
- resource_size(<q_rcu_resource), "rcu") < 0)
|
||||
- panic("Failed to request rcu memory\n");
|
||||
-
|
||||
/* remap rcu register range */
|
||||
- ltq_rcu_membase = ioremap_nocache(ltq_rcu_resource.start,
|
||||
- resource_size(<q_rcu_resource));
|
||||
+ ltq_rcu_membase = ltq_remap_resource(<q_rcu_resource);
|
||||
if (!ltq_rcu_membase)
|
||||
panic("Failed to remap rcu memory\n");
|
||||
|
||||
diff --git a/arch/mips/lantiq/xway/setup-ase.c b/arch/mips/lantiq/xway/setup-ase.c
|
||||
deleted file mode 100644
|
||||
index f6f3267..0000000
|
||||
--- a/arch/mips/lantiq/xway/setup-ase.c
|
||||
+++ /dev/null
|
||||
@@ -1,19 +0,0 @@
|
||||
-/*
|
||||
- * 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.
|
||||
- *
|
||||
- * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
- */
|
||||
-
|
||||
-#include <lantiq_soc.h>
|
||||
-
|
||||
-#include "../prom.h"
|
||||
-#include "devices.h"
|
||||
-
|
||||
-void __init ltq_soc_setup(void)
|
||||
-{
|
||||
- ltq_register_ase_asc();
|
||||
- ltq_register_gpio();
|
||||
- ltq_register_wdt();
|
||||
-}
|
||||
diff --git a/arch/mips/lantiq/xway/setup-xway.c b/arch/mips/lantiq/xway/setup-xway.c
|
||||
deleted file mode 100644
|
||||
index c292f64..0000000
|
||||
--- a/arch/mips/lantiq/xway/setup-xway.c
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/*
|
||||
- * 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.
|
||||
- *
|
||||
- * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
- */
|
||||
-
|
||||
-#include <lantiq_soc.h>
|
||||
-
|
||||
-#include "../prom.h"
|
||||
-#include "devices.h"
|
||||
-
|
||||
-void __init ltq_soc_setup(void)
|
||||
-{
|
||||
- ltq_register_asc(0);
|
||||
- ltq_register_asc(1);
|
||||
- ltq_register_gpio();
|
||||
- ltq_register_wdt();
|
||||
-}
|
||||
diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
|
||||
new file mode 100644
|
||||
index 0000000..a29944f
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
||||
@@ -0,0 +1,77 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/ioport.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+
|
||||
+#include "../devices.h"
|
||||
+
|
||||
+/* clock control register */
|
||||
+#define LTQ_CGU_IFCCR 0x0018
|
||||
+
|
||||
+/* the enable / disable registers */
|
||||
+#define LTQ_PMU_PWDCR 0x1C
|
||||
+#define LTQ_PMU_PWDSR 0x20
|
||||
+
|
||||
+#define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y))
|
||||
+#define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x))
|
||||
+
|
||||
+static struct resource ltq_cgu_resource =
|
||||
+ MEM_RES("cgu", LTQ_CGU_BASE_ADDR, LTQ_CGU_SIZE);
|
||||
+
|
||||
+static struct resource ltq_pmu_resource =
|
||||
+ MEM_RES("pmu", LTQ_PMU_BASE_ADDR, LTQ_PMU_SIZE);
|
||||
+
|
||||
+static struct resource ltq_ebu_resource =
|
||||
+ MEM_RES("ebu", LTQ_EBU_BASE_ADDR, LTQ_EBU_SIZE);
|
||||
+
|
||||
+void __iomem *ltq_cgu_membase;
|
||||
+void __iomem *ltq_ebu_membase;
|
||||
+static void __iomem *ltq_pmu_membase;
|
||||
+
|
||||
+void ltq_cgu_enable(unsigned int clk)
|
||||
+{
|
||||
+ ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | clk, LTQ_CGU_IFCCR);
|
||||
+}
|
||||
+
|
||||
+void ltq_pmu_enable(unsigned int module)
|
||||
+{
|
||||
+ int err = 1000000;
|
||||
+
|
||||
+ ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
|
||||
+ do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
|
||||
+
|
||||
+ if (!err)
|
||||
+ panic("activating PMU module failed!\n");
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_pmu_enable);
|
||||
+
|
||||
+void ltq_pmu_disable(unsigned int module)
|
||||
+{
|
||||
+ ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_pmu_disable);
|
||||
+
|
||||
+void __init ltq_soc_init(void)
|
||||
+{
|
||||
+ ltq_pmu_membase = ltq_remap_resource(<q_pmu_resource);
|
||||
+ if (!ltq_pmu_membase)
|
||||
+ panic("Failed to remap pmu memory\n");
|
||||
+
|
||||
+ ltq_cgu_membase = ltq_remap_resource(<q_cgu_resource);
|
||||
+ if (!ltq_cgu_membase)
|
||||
+ panic("Failed to remap cgu memory\n");
|
||||
+
|
||||
+ ltq_ebu_membase = ltq_remap_resource(<q_ebu_resource);
|
||||
+ if (!ltq_ebu_membase)
|
||||
+ panic("Failed to remap ebu memory\n");
|
||||
+
|
||||
+ /* make sure to unprotect the memory region where flash is located */
|
||||
+ ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
|
||||
+}
|
||||
diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c
|
||||
index 102aed0..179bf98 100644
|
||||
--- a/drivers/watchdog/lantiq_wdt.c
|
||||
+++ b/drivers/watchdog/lantiq_wdt.c
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
-#include <lantiq.h>
|
||||
+#include <lantiq_soc.h>
|
||||
|
||||
/* Section 3.4 of the datasheet
|
||||
* The password sequence protects the WDT control register from unintended
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
From d9355bb07878f9aa40856cc437c43cedc87662fc Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 11 Aug 2011 12:25:55 +0200
|
||||
Subject: [PATCH 05/24] MIPS: lantiq: make irq.c support the FALC-ON
|
||||
|
||||
There are minor differences in how irqs work on xway and falcon socs.
|
||||
Xway needs 2 quirks that we need to disable for falcon to also work with
|
||||
this code.
|
||||
|
||||
* EBU irq does not need to send a special ack to the EBU
|
||||
* The EIU does not exist
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/lantiq/irq.c | 24 +++++++++++++-----------
|
||||
1 files changed, 13 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
|
||||
index f9737bb..17c057f 100644
|
||||
--- a/arch/mips/lantiq/irq.c
|
||||
+++ b/arch/mips/lantiq/irq.c
|
||||
@@ -195,7 +195,7 @@ static void ltq_hw_irqdispatch(int module)
|
||||
do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module));
|
||||
|
||||
/* if this is a EBU irq, we need to ack it or get a deadlock */
|
||||
- if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0))
|
||||
+ if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT)
|
||||
ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10,
|
||||
LTQ_EBU_PCC_ISTAT);
|
||||
}
|
||||
@@ -260,17 +260,19 @@ void __init arch_init_irq(void)
|
||||
if (!ltq_icu_membase)
|
||||
panic("Failed to remap icu memory\n");
|
||||
|
||||
- if (insert_resource(&iomem_resource, <q_eiu_resource) < 0)
|
||||
- panic("Failed to insert eiu memory\n");
|
||||
+ if (LTQ_EIU_BASE_ADDR) {
|
||||
+ if (insert_resource(&iomem_resource, <q_eiu_resource) < 0)
|
||||
+ panic("Failed to insert eiu memory\n");
|
||||
|
||||
- if (request_mem_region(ltq_eiu_resource.start,
|
||||
- resource_size(<q_eiu_resource), "eiu") < 0)
|
||||
- panic("Failed to request eiu memory\n");
|
||||
+ if (request_mem_region(ltq_eiu_resource.start,
|
||||
+ resource_size(<q_eiu_resource), "eiu") < 0)
|
||||
+ panic("Failed to request eiu memory\n");
|
||||
|
||||
- ltq_eiu_membase = ioremap_nocache(ltq_eiu_resource.start,
|
||||
+ ltq_eiu_membase = ioremap_nocache(ltq_eiu_resource.start,
|
||||
resource_size(<q_eiu_resource));
|
||||
- if (!ltq_eiu_membase)
|
||||
- panic("Failed to remap eiu memory\n");
|
||||
+ if (!ltq_eiu_membase)
|
||||
+ panic("Failed to remap eiu memory\n");
|
||||
+ }
|
||||
|
||||
/* make sure all irqs are turned off by default */
|
||||
for (i = 0; i < 5; i++)
|
||||
@@ -296,8 +298,8 @@ void __init arch_init_irq(void)
|
||||
|
||||
for (i = INT_NUM_IRQ0;
|
||||
i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++)
|
||||
- if ((i == LTQ_EIU_IR0) || (i == LTQ_EIU_IR1) ||
|
||||
- (i == LTQ_EIU_IR2))
|
||||
+ if (((i == LTQ_EIU_IR0) || (i == LTQ_EIU_IR1) ||
|
||||
+ (i == LTQ_EIU_IR2)) && LTQ_EIU_BASE_ADDR)
|
||||
irq_set_chip_and_handler(i, <q_eiu_type,
|
||||
handle_level_irq);
|
||||
/* EIU3-5 only exist on ar9 and vr9 */
|
||||
--
|
||||
1.7.5.4
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,501 @@
|
|||
From 02d9df56be1ba23c7bec51c94e5d2ac0d13d2d78 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 11 Aug 2011 14:35:02 +0200
|
||||
Subject: [PATCH 07/24] MIPS: lantiq: add support for FALC-ON GPIOs
|
||||
|
||||
FALC-ON uses a different GPIO core than the other Lantiq SoCs. This patch adds
|
||||
the new driver.
|
||||
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/lantiq/falcon/Makefile | 2 +-
|
||||
arch/mips/lantiq/falcon/devices.c | 41 ++++
|
||||
arch/mips/lantiq/falcon/devices.h | 2 +
|
||||
arch/mips/lantiq/falcon/gpio.c | 398 +++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 442 insertions(+), 1 deletions(-)
|
||||
create mode 100644 arch/mips/lantiq/falcon/gpio.c
|
||||
|
||||
diff --git a/arch/mips/lantiq/falcon/Makefile b/arch/mips/lantiq/falcon/Makefile
|
||||
index e9c7455..de72209 100644
|
||||
--- a/arch/mips/lantiq/falcon/Makefile
|
||||
+++ b/arch/mips/lantiq/falcon/Makefile
|
||||
@@ -1 +1 @@
|
||||
-obj-y := clk.o prom.o reset.o sysctrl.o devices.o
|
||||
+obj-y := clk.o prom.o reset.o sysctrl.o devices.o gpio.o
|
||||
diff --git a/arch/mips/lantiq/falcon/devices.c b/arch/mips/lantiq/falcon/devices.c
|
||||
index c4606f2..4f47b44 100644
|
||||
--- a/arch/mips/lantiq/falcon/devices.c
|
||||
+++ b/arch/mips/lantiq/falcon/devices.c
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
+#include <linux/gpio.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
@@ -85,3 +86,43 @@ falcon_register_nand(void)
|
||||
{
|
||||
platform_device_register(<q_flash_nand);
|
||||
}
|
||||
+
|
||||
+/* gpio */
|
||||
+#define DECLARE_GPIO_RES(port) \
|
||||
+static struct resource falcon_gpio ## port ## _res[] = { \
|
||||
+ MEM_RES("gpio"#port, LTQ_GPIO ## port ## _BASE_ADDR, \
|
||||
+ LTQ_GPIO ## port ## _SIZE), \
|
||||
+ MEM_RES("padctrl"#port, LTQ_PADCTRL ## port ## _BASE_ADDR, \
|
||||
+ LTQ_PADCTRL ## port ## _SIZE), \
|
||||
+ IRQ_RES("gpio_mux"#port, FALCON_IRQ_GPIO_P ## port) \
|
||||
+}
|
||||
+DECLARE_GPIO_RES(0);
|
||||
+DECLARE_GPIO_RES(1);
|
||||
+DECLARE_GPIO_RES(2);
|
||||
+DECLARE_GPIO_RES(3);
|
||||
+DECLARE_GPIO_RES(4);
|
||||
+
|
||||
+void __init
|
||||
+falcon_register_gpio(void)
|
||||
+{
|
||||
+ platform_device_register_simple("falcon_gpio", 0,
|
||||
+ falcon_gpio0_res, ARRAY_SIZE(falcon_gpio0_res));
|
||||
+ platform_device_register_simple("falcon_gpio", 1,
|
||||
+ falcon_gpio1_res, ARRAY_SIZE(falcon_gpio1_res));
|
||||
+ platform_device_register_simple("falcon_gpio", 2,
|
||||
+ falcon_gpio2_res, ARRAY_SIZE(falcon_gpio2_res));
|
||||
+ ltq_sysctl_activate(SYSCTL_SYS1, ACTS_PADCTRL1 | ACTS_P1);
|
||||
+ ltq_sysctl_activate(SYSCTL_SYSETH, ACTS_PADCTRL0 |
|
||||
+ ACTS_PADCTRL2 | ACTS_P0 | ACTS_P2);
|
||||
+}
|
||||
+
|
||||
+void __init
|
||||
+falcon_register_gpio_extra(void)
|
||||
+{
|
||||
+ platform_device_register_simple("falcon_gpio", 3,
|
||||
+ falcon_gpio3_res, ARRAY_SIZE(falcon_gpio3_res));
|
||||
+ platform_device_register_simple("falcon_gpio", 4,
|
||||
+ falcon_gpio4_res, ARRAY_SIZE(falcon_gpio4_res));
|
||||
+ ltq_sysctl_activate(SYSCTL_SYS1,
|
||||
+ ACTS_PADCTRL3 | ACTS_PADCTRL4 | ACTS_P3 | ACTS_P4);
|
||||
+}
|
||||
diff --git a/arch/mips/lantiq/falcon/devices.h b/arch/mips/lantiq/falcon/devices.h
|
||||
index e802a7c..18be8b6 100644
|
||||
--- a/arch/mips/lantiq/falcon/devices.h
|
||||
+++ b/arch/mips/lantiq/falcon/devices.h
|
||||
@@ -14,5 +14,7 @@
|
||||
#include "../devices.h"
|
||||
|
||||
extern void falcon_register_nand(void);
|
||||
+extern void falcon_register_gpio(void);
|
||||
+extern void falcon_register_gpio_extra(void);
|
||||
|
||||
#endif
|
||||
diff --git a/arch/mips/lantiq/falcon/gpio.c b/arch/mips/lantiq/falcon/gpio.c
|
||||
new file mode 100644
|
||||
index 0000000..b87582d
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/gpio.c
|
||||
@@ -0,0 +1,398 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com>
|
||||
+ * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+
|
||||
+/* Multiplexer Control Register */
|
||||
+#define LTQ_PADC_MUX(x) (x * 0x4)
|
||||
+/* Pad Control Availability Register */
|
||||
+#define LTQ_PADC_AVAIL 0x000000F0
|
||||
+
|
||||
+/* Data Output Register */
|
||||
+#define LTQ_GPIO_OUT 0x00000000
|
||||
+/* Data Input Register */
|
||||
+#define LTQ_GPIO_IN 0x00000004
|
||||
+/* Direction Register */
|
||||
+#define LTQ_GPIO_DIR 0x00000008
|
||||
+/* External Interrupt Control Register 0 */
|
||||
+#define LTQ_GPIO_EXINTCR0 0x00000018
|
||||
+/* External Interrupt Control Register 1 */
|
||||
+#define LTQ_GPIO_EXINTCR1 0x0000001C
|
||||
+/* IRN Capture Register */
|
||||
+#define LTQ_GPIO_IRNCR 0x00000020
|
||||
+/* IRN Interrupt Configuration Register */
|
||||
+#define LTQ_GPIO_IRNCFG 0x0000002C
|
||||
+/* IRN Interrupt Enable Set Register */
|
||||
+#define LTQ_GPIO_IRNRNSET 0x00000030
|
||||
+/* IRN Interrupt Enable Clear Register */
|
||||
+#define LTQ_GPIO_IRNENCLR 0x00000034
|
||||
+/* Output Set Register */
|
||||
+#define LTQ_GPIO_OUTSET 0x00000040
|
||||
+/* Output Cler Register */
|
||||
+#define LTQ_GPIO_OUTCLR 0x00000044
|
||||
+/* Direction Clear Register */
|
||||
+#define LTQ_GPIO_DIRSET 0x00000048
|
||||
+/* Direction Set Register */
|
||||
+#define LTQ_GPIO_DIRCLR 0x0000004C
|
||||
+
|
||||
+/* turn a gpio_chip into a falcon_gpio_port */
|
||||
+#define ctop(c) container_of(c, struct falcon_gpio_port, gpio_chip)
|
||||
+/* turn a irq_data into a falcon_gpio_port */
|
||||
+#define itop(i) ((struct falcon_gpio_port *) irq_get_chip_data(i->irq))
|
||||
+
|
||||
+#define ltq_pad_r32(p, reg) ltq_r32(p->pad + reg)
|
||||
+#define ltq_pad_w32(p, val, reg) ltq_w32(val, p->pad + reg)
|
||||
+#define ltq_pad_w32_mask(c, clear, set, reg) \
|
||||
+ ltq_pad_w32(c, (ltq_pad_r32(c, reg) & ~(clear)) | (set), reg)
|
||||
+
|
||||
+#define ltq_port_r32(p, reg) ltq_r32(p->port + reg)
|
||||
+#define ltq_port_w32(p, val, reg) ltq_w32(val, p->port + reg)
|
||||
+#define ltq_port_w32_mask(p, clear, set, reg) \
|
||||
+ ltq_port_w32(p, (ltq_port_r32(p, reg) & ~(clear)) | (set), reg)
|
||||
+
|
||||
+#define MAX_PORTS 5
|
||||
+#define PINS_PER_PORT 32
|
||||
+
|
||||
+struct falcon_gpio_port {
|
||||
+ struct gpio_chip gpio_chip;
|
||||
+ void __iomem *pad;
|
||||
+ void __iomem *port;
|
||||
+ unsigned int irq_base;
|
||||
+ unsigned int chained_irq;
|
||||
+};
|
||||
+
|
||||
+static struct falcon_gpio_port ltq_gpio_port[MAX_PORTS];
|
||||
+
|
||||
+int gpio_to_irq(unsigned int gpio)
|
||||
+{
|
||||
+ return __gpio_to_irq(gpio);
|
||||
+}
|
||||
+EXPORT_SYMBOL(gpio_to_irq);
|
||||
+
|
||||
+int ltq_gpio_mux_set(unsigned int pin, unsigned int mux)
|
||||
+{
|
||||
+ int port = pin / 100;
|
||||
+ int offset = pin % 100;
|
||||
+ struct falcon_gpio_port *gpio_port;
|
||||
+
|
||||
+ if ((offset >= PINS_PER_PORT) || (port >= MAX_PORTS))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ gpio_port = <q_gpio_port[port];
|
||||
+ ltq_pad_w32(gpio_port, mux & 0x3, LTQ_PADC_MUX(offset));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_gpio_mux_set);
|
||||
+
|
||||
+int ltq_gpio_request(unsigned int pin, unsigned int val,
|
||||
+ unsigned int dir, const char *name)
|
||||
+{
|
||||
+ int port = pin / 100;
|
||||
+ int offset = pin % 100;
|
||||
+
|
||||
+ if (offset >= PINS_PER_PORT || port >= MAX_PORTS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (gpio_request(pin, name)) {
|
||||
+ pr_err("failed to setup lantiq gpio: %s\n", name);
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+
|
||||
+ if (dir)
|
||||
+ gpio_direction_output(pin, 1);
|
||||
+ else
|
||||
+ gpio_direction_input(pin);
|
||||
+
|
||||
+ return ltq_gpio_mux_set(pin, val);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_gpio_request);
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
|
||||
+{
|
||||
+ ltq_port_w32(ctop(chip), 1 << offset, LTQ_GPIO_DIRCLR);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
|
||||
+{
|
||||
+ if (value)
|
||||
+ ltq_port_w32(ctop(chip), 1 << offset, LTQ_GPIO_OUTSET);
|
||||
+ else
|
||||
+ ltq_port_w32(ctop(chip), 1 << offset, LTQ_GPIO_OUTCLR);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_direction_output(struct gpio_chip *chip,
|
||||
+ unsigned int offset, int value)
|
||||
+{
|
||||
+ falcon_gpio_set(chip, offset, value);
|
||||
+ ltq_port_w32(ctop(chip), 1 << offset, LTQ_GPIO_DIRSET);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_get(struct gpio_chip *chip, unsigned int offset)
|
||||
+{
|
||||
+ if ((ltq_port_r32(ctop(chip), LTQ_GPIO_DIR) >> offset) & 1)
|
||||
+ return (ltq_port_r32(ctop(chip), LTQ_GPIO_OUT) >> offset) & 1;
|
||||
+ else
|
||||
+ return (ltq_port_r32(ctop(chip), LTQ_GPIO_IN) >> offset) & 1;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_request(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ if ((ltq_pad_r32(ctop(chip), LTQ_PADC_AVAIL) >> offset) & 1) {
|
||||
+ if (ltq_pad_r32(ctop(chip), LTQ_PADC_MUX(offset)) > 1)
|
||||
+ return -EBUSY;
|
||||
+ /* switch on gpio function */
|
||||
+ ltq_pad_w32(ctop(chip), 1, LTQ_PADC_MUX(offset));
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return -ENODEV;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_free(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ if ((ltq_pad_r32(ctop(chip), LTQ_PADC_AVAIL) >> offset) & 1) {
|
||||
+ if (ltq_pad_r32(ctop(chip), LTQ_PADC_MUX(offset)) > 1)
|
||||
+ return;
|
||||
+ /* switch off gpio function */
|
||||
+ ltq_pad_w32(ctop(chip), 0, LTQ_PADC_MUX(offset));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ return ctop(chip)->irq_base + offset;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_disable_irq(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned int offset = d->irq - itop(d)->irq_base;
|
||||
+
|
||||
+ ltq_port_w32(itop(d), 1 << offset, LTQ_GPIO_IRNENCLR);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_enable_irq(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned int offset = d->irq - itop(d)->irq_base;
|
||||
+
|
||||
+ if (!ltq_pad_r32(itop(d), LTQ_PADC_MUX(offset)) < 1)
|
||||
+ /* switch on gpio function */
|
||||
+ ltq_pad_w32(itop(d), 1, LTQ_PADC_MUX(offset));
|
||||
+
|
||||
+ ltq_port_w32(itop(d), 1 << offset, LTQ_GPIO_IRNRNSET);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_ack_irq(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned int offset = d->irq - itop(d)->irq_base;
|
||||
+
|
||||
+ ltq_port_w32(itop(d), 1 << offset, LTQ_GPIO_IRNCR);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_mask_and_ack_irq(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned int offset = d->irq - itop(d)->irq_base;
|
||||
+
|
||||
+ ltq_port_w32(itop(d), 1 << offset, LTQ_GPIO_IRNENCLR);
|
||||
+ ltq_port_w32(itop(d), 1 << offset, LTQ_GPIO_IRNCR);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip falcon_gpio_irq_chip;
|
||||
+static int
|
||||
+falcon_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
+{
|
||||
+ unsigned int offset = d->irq - itop(d)->irq_base;
|
||||
+ unsigned int mask = 1 << offset;
|
||||
+
|
||||
+ if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_NONE)
|
||||
+ return 0;
|
||||
+
|
||||
+ if ((type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) != 0) {
|
||||
+ /* level triggered */
|
||||
+ ltq_port_w32_mask(itop(d), 0, mask, LTQ_GPIO_IRNCFG);
|
||||
+ irq_set_chip_and_handler_name(d->irq,
|
||||
+ &falcon_gpio_irq_chip, handle_level_irq, "mux");
|
||||
+ } else {
|
||||
+ /* edge triggered */
|
||||
+ ltq_port_w32_mask(itop(d), mask, 0, LTQ_GPIO_IRNCFG);
|
||||
+ irq_set_chip_and_handler_name(d->irq,
|
||||
+ &falcon_gpio_irq_chip, handle_simple_irq, "mux");
|
||||
+ }
|
||||
+
|
||||
+ if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
|
||||
+ ltq_port_w32_mask(itop(d), mask, 0, LTQ_GPIO_EXINTCR0);
|
||||
+ ltq_port_w32_mask(itop(d), 0, mask, LTQ_GPIO_EXINTCR1);
|
||||
+ } else {
|
||||
+ if ((type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH)) != 0)
|
||||
+ /* positive logic: rising edge, high level */
|
||||
+ ltq_port_w32_mask(itop(d), mask, 0, LTQ_GPIO_EXINTCR0);
|
||||
+ else
|
||||
+ /* negative logic: falling edge, low level */
|
||||
+ ltq_port_w32_mask(itop(d), 0, mask, LTQ_GPIO_EXINTCR0);
|
||||
+ ltq_port_w32_mask(itop(d), mask, 0, LTQ_GPIO_EXINTCR1);
|
||||
+ }
|
||||
+
|
||||
+ return gpio_direction_input(itop(d)->gpio_chip.base + offset);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
+{
|
||||
+ struct falcon_gpio_port *gpio_port = irq_desc_get_handler_data(desc);
|
||||
+ unsigned long irncr;
|
||||
+ int offset;
|
||||
+
|
||||
+ /* acknowledge interrupt */
|
||||
+ irncr = ltq_port_r32(gpio_port, LTQ_GPIO_IRNCR);
|
||||
+ ltq_port_w32(gpio_port, irncr, LTQ_GPIO_IRNCR);
|
||||
+
|
||||
+ desc->irq_data.chip->irq_ack(&desc->irq_data);
|
||||
+
|
||||
+ for_each_set_bit(offset, &irncr, gpio_port->gpio_chip.ngpio)
|
||||
+ generic_handle_irq(gpio_port->irq_base + offset);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip falcon_gpio_irq_chip = {
|
||||
+ .name = "gpio_irq_mux",
|
||||
+ .irq_mask = falcon_gpio_disable_irq,
|
||||
+ .irq_unmask = falcon_gpio_enable_irq,
|
||||
+ .irq_ack = falcon_gpio_ack_irq,
|
||||
+ .irq_mask_ack = falcon_gpio_mask_and_ack_irq,
|
||||
+ .irq_set_type = falcon_gpio_irq_type,
|
||||
+};
|
||||
+
|
||||
+static struct irqaction gpio_cascade = {
|
||||
+ .handler = no_action,
|
||||
+ .flags = IRQF_DISABLED,
|
||||
+ .name = "gpio_cascade",
|
||||
+};
|
||||
+
|
||||
+static int
|
||||
+falcon_gpio_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct falcon_gpio_port *gpio_port;
|
||||
+ int ret, i;
|
||||
+ struct resource *gpiores, *padres;
|
||||
+ int irq;
|
||||
+
|
||||
+ if (pdev->id >= MAX_PORTS)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ gpiores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ padres = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
+ irq = platform_get_irq(pdev, 0);
|
||||
+ if (!gpiores || !padres)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ gpio_port = <q_gpio_port[pdev->id];
|
||||
+ gpio_port->gpio_chip.label = "falcon-gpio";
|
||||
+ gpio_port->gpio_chip.direction_input = falcon_gpio_direction_input;
|
||||
+ gpio_port->gpio_chip.direction_output = falcon_gpio_direction_output;
|
||||
+ gpio_port->gpio_chip.get = falcon_gpio_get;
|
||||
+ gpio_port->gpio_chip.set = falcon_gpio_set;
|
||||
+ gpio_port->gpio_chip.request = falcon_gpio_request;
|
||||
+ gpio_port->gpio_chip.free = falcon_gpio_free;
|
||||
+ gpio_port->gpio_chip.base = 100 * pdev->id;
|
||||
+ gpio_port->gpio_chip.ngpio = 32;
|
||||
+ gpio_port->gpio_chip.dev = &pdev->dev;
|
||||
+
|
||||
+ gpio_port->port = ltq_remap_resource(gpiores);
|
||||
+ gpio_port->pad = ltq_remap_resource(padres);
|
||||
+
|
||||
+ if (!gpio_port->port || !gpio_port->pad) {
|
||||
+ dev_err(&pdev->dev, "Could not map io ranges\n");
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ if (irq > 0) {
|
||||
+ /* irq_chip support */
|
||||
+ gpio_port->gpio_chip.to_irq = falcon_gpio_to_irq;
|
||||
+ gpio_port->irq_base = INT_NUM_EXTRA_START + (32 * pdev->id);
|
||||
+
|
||||
+ for (i = 0; i < 32; i++) {
|
||||
+ irq_set_chip_and_handler_name(gpio_port->irq_base + i,
|
||||
+ &falcon_gpio_irq_chip, handle_simple_irq,
|
||||
+ "mux");
|
||||
+ irq_set_chip_data(gpio_port->irq_base + i, gpio_port);
|
||||
+ /* set to negative logic (falling edge, low level) */
|
||||
+ ltq_port_w32_mask(gpio_port, 0, 1 << i,
|
||||
+ LTQ_GPIO_EXINTCR0);
|
||||
+ }
|
||||
+
|
||||
+ gpio_port->chained_irq = irq;
|
||||
+ setup_irq(irq, &gpio_cascade);
|
||||
+ irq_set_handler_data(irq, gpio_port);
|
||||
+ irq_set_chained_handler(irq, falcon_gpio_irq_handler);
|
||||
+ }
|
||||
+
|
||||
+ ret = gpiochip_add(&gpio_port->gpio_chip);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "Could not register gpiochip %d, %d\n",
|
||||
+ pdev->id, ret);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ platform_set_drvdata(pdev, gpio_port);
|
||||
+ return ret;
|
||||
+
|
||||
+err:
|
||||
+ dev_err(&pdev->dev, "Error in gpio_probe %d, %d\n", pdev->id, ret);
|
||||
+ if (gpiores)
|
||||
+ release_resource(gpiores);
|
||||
+ if (padres)
|
||||
+ release_resource(padres);
|
||||
+
|
||||
+ if (gpio_port->port)
|
||||
+ iounmap(gpio_port->port);
|
||||
+ if (gpio_port->pad)
|
||||
+ iounmap(gpio_port->pad);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver falcon_gpio_driver = {
|
||||
+ .probe = falcon_gpio_probe,
|
||||
+ .driver = {
|
||||
+ .name = "falcon_gpio",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+int __init
|
||||
+falcon_gpio_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ pr_info("FALC(tm) ON GPIO Driver, (C) 2011 Lantiq Deutschland Gmbh\n");
|
||||
+ ret = platform_driver_register(&falcon_gpio_driver);
|
||||
+ if (ret)
|
||||
+ pr_err("falcon_gpio: Error registering platform driver!");
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+postcore_initcall(falcon_gpio_init);
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,179 @@
|
|||
From ec6ba0f79c010a878d679c057fb6306b50a201b0 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 11 Aug 2011 14:09:35 +0200
|
||||
Subject: [PATCH 08/24] MIPS: lantiq: add support for the EASY98000 evaluation
|
||||
board
|
||||
|
||||
This patch adds the machine code for the EASY9800 evaluation board.
|
||||
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/lantiq/falcon/Kconfig | 11 +++
|
||||
arch/mips/lantiq/falcon/Makefile | 1 +
|
||||
arch/mips/lantiq/falcon/mach-easy98000.c | 110 ++++++++++++++++++++++++++++++
|
||||
arch/mips/lantiq/machtypes.h | 5 ++
|
||||
4 files changed, 127 insertions(+), 0 deletions(-)
|
||||
create mode 100644 arch/mips/lantiq/falcon/Kconfig
|
||||
create mode 100644 arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
|
||||
diff --git a/arch/mips/lantiq/falcon/Kconfig b/arch/mips/lantiq/falcon/Kconfig
|
||||
new file mode 100644
|
||||
index 0000000..03e999d
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/Kconfig
|
||||
@@ -0,0 +1,11 @@
|
||||
+if SOC_FALCON
|
||||
+
|
||||
+menu "MIPS Machine"
|
||||
+
|
||||
+config LANTIQ_MACH_EASY98000
|
||||
+ bool "Easy98000"
|
||||
+ default y
|
||||
+
|
||||
+endmenu
|
||||
+
|
||||
+endif
|
||||
diff --git a/arch/mips/lantiq/falcon/Makefile b/arch/mips/lantiq/falcon/Makefile
|
||||
index de72209..56b22eb 100644
|
||||
--- a/arch/mips/lantiq/falcon/Makefile
|
||||
+++ b/arch/mips/lantiq/falcon/Makefile
|
||||
@@ -1 +1,2 @@
|
||||
obj-y := clk.o prom.o reset.o sysctrl.o devices.o gpio.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
||||
diff --git a/arch/mips/lantiq/falcon/mach-easy98000.c b/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
new file mode 100644
|
||||
index 0000000..361b8f0
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
@@ -0,0 +1,110 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com>
|
||||
+ * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/spi/spi_gpio.h>
|
||||
+#include <linux/spi/eeprom.h>
|
||||
+
|
||||
+#include "../machtypes.h"
|
||||
+
|
||||
+#include "devices.h"
|
||||
+
|
||||
+static struct mtd_partition easy98000_nor_partitions[] = {
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x40000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x40000,
|
||||
+ .size = 0x40000, /* 2 sectors for redundant env. */
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x80000,
|
||||
+ .size = 0xF80000, /* map only 16 MiB */
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+struct physmap_flash_data easy98000_nor_flash_data = {
|
||||
+ .nr_parts = ARRAY_SIZE(easy98000_nor_partitions),
|
||||
+ .parts = easy98000_nor_partitions,
|
||||
+};
|
||||
+
|
||||
+/* setup gpio based spi bus/device for access to the eeprom on the board */
|
||||
+#define SPI_GPIO_MRST 102
|
||||
+#define SPI_GPIO_MTSR 103
|
||||
+#define SPI_GPIO_CLK 104
|
||||
+#define SPI_GPIO_CS0 105
|
||||
+#define SPI_GPIO_CS1 106
|
||||
+#define SPI_GPIO_BUS_NUM 1
|
||||
+
|
||||
+static struct spi_gpio_platform_data easy98000_spi_gpio_data = {
|
||||
+ .sck = SPI_GPIO_CLK,
|
||||
+ .mosi = SPI_GPIO_MTSR,
|
||||
+ .miso = SPI_GPIO_MRST,
|
||||
+ .num_chipselect = 2,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device easy98000_spi_gpio_device = {
|
||||
+ .name = "spi_gpio",
|
||||
+ .id = SPI_GPIO_BUS_NUM,
|
||||
+ .dev.platform_data = &easy98000_spi_gpio_data,
|
||||
+};
|
||||
+
|
||||
+static struct spi_eeprom at25160n = {
|
||||
+ .byte_len = 16 * 1024 / 8,
|
||||
+ .name = "at25160n",
|
||||
+ .page_size = 32,
|
||||
+ .flags = EE_ADDR2,
|
||||
+};
|
||||
+
|
||||
+static struct spi_board_info easy98000_spi_gpio_devices __initdata = {
|
||||
+ .modalias = "at25",
|
||||
+ .bus_num = SPI_GPIO_BUS_NUM,
|
||||
+ .max_speed_hz = 1000 * 1000,
|
||||
+ .mode = SPI_MODE_3,
|
||||
+ .chip_select = 1,
|
||||
+ .controller_data = (void *) SPI_GPIO_CS1,
|
||||
+ .platform_data = &at25160n,
|
||||
+};
|
||||
+
|
||||
+static void __init
|
||||
+easy98000_init_common(void)
|
||||
+{
|
||||
+ spi_register_board_info(&easy98000_spi_gpio_devices, 1);
|
||||
+ platform_device_register(&easy98000_spi_gpio_device);
|
||||
+}
|
||||
+
|
||||
+static void __init
|
||||
+easy98000_init(void)
|
||||
+{
|
||||
+ easy98000_init_common();
|
||||
+ ltq_register_nor(&easy98000_nor_flash_data);
|
||||
+}
|
||||
+
|
||||
+static void __init
|
||||
+easy98000nand_init(void)
|
||||
+{
|
||||
+ easy98000_init_common();
|
||||
+ falcon_register_nand();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98000,
|
||||
+ "EASY98000",
|
||||
+ "EASY98000 Eval Board",
|
||||
+ easy98000_init);
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98000NAND,
|
||||
+ "EASY98000NAND",
|
||||
+ "EASY98000 Eval Board (NAND Flash)",
|
||||
+ easy98000nand_init);
|
||||
diff --git a/arch/mips/lantiq/machtypes.h b/arch/mips/lantiq/machtypes.h
|
||||
index 7e01b8c..dfc6af7 100644
|
||||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -15,6 +15,11 @@ enum lantiq_mach_type {
|
||||
LTQ_MACH_GENERIC = 0,
|
||||
LTQ_MACH_EASY50712, /* Danube evaluation board */
|
||||
LTQ_MACH_EASY50601, /* Amazon SE evaluation board */
|
||||
+
|
||||
+ /* FALCON */
|
||||
+ LANTIQ_MACH_EASY98000, /* Falcon Eval Board, NOR Flash */
|
||||
+ LANTIQ_MACH_EASY98000SF, /* Falcon Eval Board, Serial Flash */
|
||||
+ LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
};
|
||||
|
||||
#endif
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
From 88bb1794592e3fe9c8d65ce73ee851e11dbbd26b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 24 Aug 2011 13:24:11 +0200
|
||||
Subject: [PATCH 09/24] MIPS: make oprofile use cp0_perfcount_irq if it is set
|
||||
|
||||
The patch makes the oprofile code use the performance counters irq.
|
||||
|
||||
This patch is written by Felix Fietkau.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/oprofile/op_model_mipsxx.c | 12 ++++++++++++
|
||||
1 files changed, 12 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c
|
||||
index 54759f1..86cf234 100644
|
||||
--- a/arch/mips/oprofile/op_model_mipsxx.c
|
||||
+++ b/arch/mips/oprofile/op_model_mipsxx.c
|
||||
@@ -298,6 +298,11 @@ static void reset_counters(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
+static irqreturn_t mipsxx_perfcount_int(int irq, void *dev_id)
|
||||
+{
|
||||
+ return mipsxx_perfcount_handler();
|
||||
+}
|
||||
+
|
||||
static int __init mipsxx_init(void)
|
||||
{
|
||||
int counters;
|
||||
@@ -374,6 +379,10 @@ static int __init mipsxx_init(void)
|
||||
save_perf_irq = perf_irq;
|
||||
perf_irq = mipsxx_perfcount_handler;
|
||||
|
||||
+ if (cp0_perfcount_irq >= 0)
|
||||
+ return request_irq(cp0_perfcount_irq, mipsxx_perfcount_int,
|
||||
+ IRQF_SHARED, "Perfcounter", save_perf_irq);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -381,6 +390,9 @@ static void mipsxx_exit(void)
|
||||
{
|
||||
int counters = op_model_mipsxx_ops.num_counters;
|
||||
|
||||
+ if (cp0_perfcount_irq >= 0)
|
||||
+ free_irq(cp0_perfcount_irq, save_perf_irq);
|
||||
+
|
||||
counters = counters_per_cpu_to_total(counters);
|
||||
on_each_cpu(reset_counters, (void *)(long)counters, 1);
|
||||
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
From cc4b9cdff8665a414ae51101d3a0ca6ed7444a27 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 24 Aug 2011 13:28:55 +0200
|
||||
Subject: [PATCH 10/24] MIPS: enable oprofile support on lantiq targets
|
||||
|
||||
This patch sets the performance counters irq and HAVE_OPROFILE flag.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
---
|
||||
arch/mips/Kconfig | 1 +
|
||||
arch/mips/lantiq/irq.c | 5 +++++
|
||||
2 files changed, 6 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
|
||||
index b122adc..0cf5bbd 100644
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -230,6 +230,7 @@ config LANTIQ
|
||||
select SWAP_IO_SPACE
|
||||
select BOOT_RAW
|
||||
select HAVE_CLK
|
||||
+ select HAVE_OPROFILE
|
||||
select MIPS_MACHINE
|
||||
|
||||
config LASAT
|
||||
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
|
||||
index 17c057f..0b2ed87 100644
|
||||
--- a/arch/mips/lantiq/irq.c
|
||||
+++ b/arch/mips/lantiq/irq.c
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
#define MAX_EIU 6
|
||||
|
||||
+/* the performance counter */
|
||||
+#define LTQ_PERF_IRQ (INT_NUM_IM4_IRL0 + 31)
|
||||
+
|
||||
/* irqs generated by device attached to the EBU need to be acked in
|
||||
* a special manner
|
||||
*/
|
||||
@@ -318,6 +321,8 @@ void __init arch_init_irq(void)
|
||||
set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 |
|
||||
IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5);
|
||||
#endif
|
||||
+
|
||||
+ cp0_perfcount_irq = LTQ_PERF_IRQ;
|
||||
}
|
||||
|
||||
unsigned int __cpuinit get_c0_compare_int(void)
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,12 +1,59 @@
|
|||
--- a/drivers/i2c/busses/Makefile
|
||||
+++ b/drivers/i2c/busses/Makefile
|
||||
@@ -82,5 +82,6 @@ obj-$(CONFIG_I2C_SIBYTE) += i2c-sibyte.o
|
||||
obj-$(CONFIG_I2C_STUB) += i2c-stub.o
|
||||
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
|
||||
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
|
||||
+obj-$(CONFIG_I2C_FALCON) += i2c-falcon.o
|
||||
From 6437f41dfdf9475178e22ab0dd886af033f90cc2 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 21:10:16 +0200
|
||||
Subject: [PATCH 11/24] MIPS: lantiq: adds falcon I2C
|
||||
|
||||
---
|
||||
arch/mips/lantiq/falcon/devices.c | 21 +
|
||||
arch/mips/lantiq/falcon/devices.h | 1 +
|
||||
drivers/i2c/busses/Kconfig | 4 +
|
||||
drivers/i2c/busses/Makefile | 1 +
|
||||
drivers/i2c/busses/i2c-falcon.c | 815 +++++++++++++++++++++++++++++++++++++
|
||||
5 files changed, 842 insertions(+), 0 deletions(-)
|
||||
create mode 100644 drivers/i2c/busses/i2c-falcon.c
|
||||
|
||||
diff --git a/arch/mips/lantiq/falcon/devices.c b/arch/mips/lantiq/falcon/devices.c
|
||||
index 4f47b44..a998b6b 100644
|
||||
--- a/arch/mips/lantiq/falcon/devices.c
|
||||
+++ b/arch/mips/lantiq/falcon/devices.c
|
||||
@@ -126,3 +126,24 @@ falcon_register_gpio_extra(void)
|
||||
ltq_sysctl_activate(SYSCTL_SYS1,
|
||||
ACTS_PADCTRL3 | ACTS_PADCTRL4 | ACTS_P3 | ACTS_P4);
|
||||
}
|
||||
+
|
||||
+/* i2c */
|
||||
+static struct resource falcon_i2c_resources[] = {
|
||||
+ MEM_RES("i2c", GPON_I2C_BASE,GPON_I2C_END),
|
||||
+ IRQ_RES("i2c_lb", FALCON_IRQ_I2C_LBREQ),
|
||||
+ IRQ_RES("i2c_b", FALCON_IRQ_I2C_BREQ),
|
||||
+ IRQ_RES("i2c_err", FALCON_IRQ_I2C_I2C_ERR),
|
||||
+ IRQ_RES("i2c_p", FALCON_IRQ_I2C_I2C_P),
|
||||
+};
|
||||
+
|
||||
+void __init falcon_register_i2c(void)
|
||||
+{
|
||||
+ platform_device_register_simple("i2c-falcon", 0,
|
||||
+ falcon_i2c_resources, ARRAY_SIZE(falcon_i2c_resources));
|
||||
+ sys1_hw_activate(ACTS_I2C_ACT);
|
||||
+}
|
||||
+
|
||||
+void __init falcon_register_crypto(void)
|
||||
+{
|
||||
+ platform_device_register_simple("ltq_falcon_deu", 0, NULL, 0);
|
||||
+}
|
||||
diff --git a/arch/mips/lantiq/falcon/devices.h b/arch/mips/lantiq/falcon/devices.h
|
||||
index 18be8b6..2fdcb08 100644
|
||||
--- a/arch/mips/lantiq/falcon/devices.h
|
||||
+++ b/arch/mips/lantiq/falcon/devices.h
|
||||
@@ -16,5 +16,6 @@
|
||||
extern void falcon_register_nand(void);
|
||||
extern void falcon_register_gpio(void);
|
||||
extern void falcon_register_gpio_extra(void);
|
||||
+extern void falcon_register_i2c(void);
|
||||
|
||||
ccflags-$(CONFIG_I2C_DEBUG_BUS) := -DDEBUG
|
||||
#endif
|
||||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
|
||||
index 646068e..e6c3ab6 100644
|
||||
--- a/drivers/i2c/busses/Kconfig
|
||||
+++ b/drivers/i2c/busses/Kconfig
|
||||
@@ -284,6 +284,10 @@ config I2C_POWERMAC
|
||||
|
@ -20,6 +67,20 @@
|
|||
config I2C_AT91
|
||||
tristate "Atmel AT91 I2C Two-Wire interface (TWI)"
|
||||
depends on ARCH_AT91 && EXPERIMENTAL && BROKEN
|
||||
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
|
||||
index e6cf294..83e9250 100644
|
||||
--- a/drivers/i2c/busses/Makefile
|
||||
+++ b/drivers/i2c/busses/Makefile
|
||||
@@ -82,5 +82,6 @@ obj-$(CONFIG_I2C_SIBYTE) += i2c-sibyte.o
|
||||
obj-$(CONFIG_I2C_STUB) += i2c-stub.o
|
||||
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
|
||||
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
|
||||
+obj-$(CONFIG_I2C_FALCON) += i2c-falcon.o
|
||||
|
||||
ccflags-$(CONFIG_I2C_DEBUG_BUS) := -DDEBUG
|
||||
diff --git a/drivers/i2c/busses/i2c-falcon.c b/drivers/i2c/busses/i2c-falcon.c
|
||||
new file mode 100644
|
||||
index 0000000..7bb1253
|
||||
--- /dev/null
|
||||
+++ b/drivers/i2c/busses/i2c-falcon.c
|
||||
@@ -0,0 +1,815 @@
|
||||
|
@ -838,3 +899,6 @@
|
|||
+MODULE_ALIAS("platform:" DRV_NAME);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_VERSION(DRV_VERSION);
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,212 @@
|
|||
From 6b5e2ee7c8f9722d59213f17d423b3f90d80f822 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sat, 13 Aug 2011 13:59:50 +0200
|
||||
Subject: [PATCH 12/24] MIPS: lantiq: adds GPIO3 support on AR9
|
||||
|
||||
There are 3 16bit and 1 8bit gpio ports on AR9. The gpio driver needs a hack
|
||||
at 2 places to make the different register layout of the GPIO3 work properly
|
||||
with the driver. Before only GPIO0-2 were supported. As the GPIO number scheme
|
||||
clashes with the new size, we also move the other gpio chips to new offsets.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 2 +
|
||||
arch/mips/lantiq/xway/devices.c | 3 +
|
||||
arch/mips/lantiq/xway/gpio.c | 62 ++++++++++++++++----
|
||||
arch/mips/lantiq/xway/gpio_ebu.c | 3 +-
|
||||
arch/mips/lantiq/xway/gpio_stp.c | 3 +-
|
||||
5 files changed, 57 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
index da8ff95..421768e 100644
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
@@ -113,7 +113,9 @@
|
||||
#define LTQ_GPIO0_BASE_ADDR 0x1E100B10
|
||||
#define LTQ_GPIO1_BASE_ADDR 0x1E100B40
|
||||
#define LTQ_GPIO2_BASE_ADDR 0x1E100B70
|
||||
+#define LTQ_GPIO3_BASE_ADDR 0x1E100BA0
|
||||
#define LTQ_GPIO_SIZE 0x30
|
||||
+#define LTQ_GPIO3_SIZE 0x10
|
||||
|
||||
/* SSC */
|
||||
#define LTQ_SSC_BASE_ADDR 0x1e100800
|
||||
diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c
|
||||
index 9bacaa8..b7efac5 100644
|
||||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -34,6 +34,7 @@ static struct resource ltq_gpio_resource[] = {
|
||||
MEM_RES("gpio0", LTQ_GPIO0_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
MEM_RES("gpio1", LTQ_GPIO1_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
MEM_RES("gpio2", LTQ_GPIO2_BASE_ADDR, LTQ_GPIO_SIZE),
|
||||
+ MEM_RES("gpio3", LTQ_GPIO3_BASE_ADDR, LTQ_GPIO3_SIZE),
|
||||
};
|
||||
|
||||
void __init ltq_register_gpio(void)
|
||||
@@ -47,6 +48,8 @@ void __init ltq_register_gpio(void)
|
||||
if (ltq_is_ar9() || ltq_is_vr9()) {
|
||||
platform_device_register_simple("ltq_gpio", 2,
|
||||
<q_gpio_resource[2], 1);
|
||||
+ platform_device_register_simple("ltq_gpio", 3,
|
||||
+ <q_gpio_resource[3], 1);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/mips/lantiq/xway/gpio.c b/arch/mips/lantiq/xway/gpio.c
|
||||
index a321451..2c48c17 100644
|
||||
--- a/arch/mips/lantiq/xway/gpio.c
|
||||
+++ b/arch/mips/lantiq/xway/gpio.c
|
||||
@@ -21,9 +21,15 @@
|
||||
#define LTQ_GPIO_ALTSEL0 0x0C
|
||||
#define LTQ_GPIO_ALTSEL1 0x10
|
||||
#define LTQ_GPIO_OD 0x14
|
||||
+#define LTQ_GPIO3_OD 0x24
|
||||
+#define LTQ_GPIO3_ALTSEL1 0x24
|
||||
|
||||
+/* PORT3 only has 8 pins and its register layout
|
||||
+ is slightly different */
|
||||
#define PINS_PER_PORT 16
|
||||
-#define MAX_PORTS 3
|
||||
+#define PINS_PORT3 8
|
||||
+#define MAX_PORTS 4
|
||||
+#define MAX_PIN 56
|
||||
|
||||
#define ltq_gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & (1 << p)))
|
||||
#define ltq_gpio_setbit(m, r, p) ltq_w32_mask(0, (1 << p), m + r)
|
||||
@@ -53,7 +59,7 @@ int ltq_gpio_request(unsigned int pin, unsigned int alt0,
|
||||
{
|
||||
int id = 0;
|
||||
|
||||
- if (pin >= (MAX_PORTS * PINS_PER_PORT))
|
||||
+ if (pin >= MAX_PIN)
|
||||
return -EINVAL;
|
||||
if (gpio_request(pin, name)) {
|
||||
pr_err("failed to setup lantiq gpio: %s\n", name);
|
||||
@@ -73,12 +79,21 @@ int ltq_gpio_request(unsigned int pin, unsigned int alt0,
|
||||
else
|
||||
ltq_gpio_clearbit(ltq_gpio_port[id].membase,
|
||||
LTQ_GPIO_ALTSEL0, pin);
|
||||
- if (alt1)
|
||||
- ltq_gpio_setbit(ltq_gpio_port[id].membase,
|
||||
- LTQ_GPIO_ALTSEL1, pin);
|
||||
- else
|
||||
- ltq_gpio_clearbit(ltq_gpio_port[id].membase,
|
||||
- LTQ_GPIO_ALTSEL1, pin);
|
||||
+ if (id == 3) {
|
||||
+ if (alt1)
|
||||
+ ltq_gpio_setbit(ltq_gpio_port[1].membase,
|
||||
+ LTQ_GPIO3_ALTSEL1, pin);
|
||||
+ else
|
||||
+ ltq_gpio_clearbit(ltq_gpio_port[1].membase,
|
||||
+ LTQ_GPIO3_ALTSEL1, pin);
|
||||
+ } else {
|
||||
+ if (alt1)
|
||||
+ ltq_gpio_setbit(ltq_gpio_port[id].membase,
|
||||
+ LTQ_GPIO_ALTSEL1, pin);
|
||||
+ else
|
||||
+ ltq_gpio_clearbit(ltq_gpio_port[id].membase,
|
||||
+ LTQ_GPIO_ALTSEL1, pin);
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ltq_gpio_request);
|
||||
@@ -104,7 +119,11 @@ static int ltq_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
|
||||
|
||||
- ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
|
||||
+ if (chip->ngpio == PINS_PORT3)
|
||||
+ ltq_gpio_clearbit(ltq_gpio_port[0].membase,
|
||||
+ LTQ_GPIO3_OD, offset);
|
||||
+ else
|
||||
+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
|
||||
ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
|
||||
|
||||
return 0;
|
||||
@@ -115,7 +134,10 @@ static int ltq_gpio_direction_output(struct gpio_chip *chip,
|
||||
{
|
||||
struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
|
||||
|
||||
- ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
|
||||
+ if (chip->ngpio == PINS_PORT3)
|
||||
+ ltq_gpio_setbit(ltq_gpio_port[0].membase, LTQ_GPIO3_OD, offset);
|
||||
+ else
|
||||
+ ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
|
||||
ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
|
||||
ltq_gpio_set(chip, offset, value);
|
||||
|
||||
@@ -127,7 +149,11 @@ static int ltq_gpio_req(struct gpio_chip *chip, unsigned offset)
|
||||
struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
|
||||
|
||||
ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL0, offset);
|
||||
- ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset);
|
||||
+ if (chip->ngpio == PINS_PORT3)
|
||||
+ ltq_gpio_clearbit(ltq_gpio_port[1].membase,
|
||||
+ LTQ_GPIO3_ALTSEL1, offset);
|
||||
+ else
|
||||
+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -140,6 +166,15 @@ static int ltq_gpio_probe(struct platform_device *pdev)
|
||||
pdev->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
+
|
||||
+ /* dirty hack - The registers of port3 are not mapped linearly.
|
||||
+ Port 3 may only load if Port 1/2 are mapped */
|
||||
+ if ((pdev->id == 3) && (!ltq_gpio_port[1].membase || !ltq_gpio_port[2].membase)) {
|
||||
+ dev_err(&pdev->dev,
|
||||
+ "ports 1/2 need to be loaded before port 3 works\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "failed to get memory for gpio port %d\n",
|
||||
@@ -169,7 +204,10 @@ static int ltq_gpio_probe(struct platform_device *pdev)
|
||||
ltq_gpio_port[pdev->id].chip.set = ltq_gpio_set;
|
||||
ltq_gpio_port[pdev->id].chip.request = ltq_gpio_req;
|
||||
ltq_gpio_port[pdev->id].chip.base = PINS_PER_PORT * pdev->id;
|
||||
- ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT;
|
||||
+ if (pdev->id == 3)
|
||||
+ ltq_gpio_port[pdev->id].chip.ngpio = PINS_PORT3;
|
||||
+ else
|
||||
+ ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT;
|
||||
platform_set_drvdata(pdev, <q_gpio_port[pdev->id]);
|
||||
return gpiochip_add(<q_gpio_port[pdev->id].chip);
|
||||
}
|
||||
diff --git a/arch/mips/lantiq/xway/gpio_ebu.c b/arch/mips/lantiq/xway/gpio_ebu.c
|
||||
index a479355..729f8e3 100644
|
||||
--- a/arch/mips/lantiq/xway/gpio_ebu.c
|
||||
+++ b/arch/mips/lantiq/xway/gpio_ebu.c
|
||||
@@ -61,9 +61,8 @@ static struct gpio_chip ltq_ebu_chip = {
|
||||
.label = "ltq_ebu",
|
||||
.direction_output = ltq_ebu_direction_output,
|
||||
.set = ltq_ebu_set,
|
||||
- .base = 72,
|
||||
+ .base = 100,
|
||||
.ngpio = 16,
|
||||
- .can_sleep = 1,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
diff --git a/arch/mips/lantiq/xway/gpio_stp.c b/arch/mips/lantiq/xway/gpio_stp.c
|
||||
index 67d59d6..c01294e 100644
|
||||
--- a/arch/mips/lantiq/xway/gpio_stp.c
|
||||
+++ b/arch/mips/lantiq/xway/gpio_stp.c
|
||||
@@ -70,9 +70,8 @@ static struct gpio_chip ltq_stp_chip = {
|
||||
.label = "ltq_stp",
|
||||
.direction_output = ltq_stp_direction_output,
|
||||
.set = ltq_stp_set,
|
||||
- .base = 48,
|
||||
+ .base = 200,
|
||||
.ngpio = 24,
|
||||
- .can_sleep = 1,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,659 @@
|
|||
From 2bd534c30688bcb3f70f1816fbcff813fc746103 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sat, 27 Aug 2011 18:12:26 +0200
|
||||
Subject: [PATCH 13/24] MIPS: lantiq: adds FALC-ON spi driver
|
||||
|
||||
The external bus unit (EBU) found on the FALC-ON SoC has spi emulation that is
|
||||
designed for serial flash access.
|
||||
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
arch/mips/lantiq/falcon/devices.c | 12 +-
|
||||
arch/mips/lantiq/falcon/devices.h | 4 +
|
||||
arch/mips/lantiq/falcon/mach-easy98000.c | 27 ++
|
||||
drivers/spi/Kconfig | 4 +
|
||||
drivers/spi/Makefile | 1 +
|
||||
drivers/spi/spi-falcon.c | 477 ++++++++++++++++++++++++++++++
|
||||
6 files changed, 523 insertions(+), 2 deletions(-)
|
||||
create mode 100644 drivers/spi/spi-falcon.c
|
||||
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/devices.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/devices.c 2011-10-05 12:30:34.584838403 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/devices.c 2011-10-05 12:42:58.696870214 +0200
|
||||
@@ -129,7 +129,7 @@
|
||||
|
||||
/* i2c */
|
||||
static struct resource falcon_i2c_resources[] = {
|
||||
- MEM_RES("i2c", GPON_I2C_BASE,GPON_I2C_END),
|
||||
+ MEM_RES("i2c", LTQ_I2C_BASE_ADDR, LTQ_I2C_SIZE),
|
||||
IRQ_RES("i2c_lb", FALCON_IRQ_I2C_LBREQ),
|
||||
IRQ_RES("i2c_b", FALCON_IRQ_I2C_BREQ),
|
||||
IRQ_RES("i2c_err", FALCON_IRQ_I2C_I2C_ERR),
|
||||
@@ -140,10 +140,18 @@
|
||||
{
|
||||
platform_device_register_simple("i2c-falcon", 0,
|
||||
falcon_i2c_resources, ARRAY_SIZE(falcon_i2c_resources));
|
||||
- sys1_hw_activate(ACTS_I2C_ACT);
|
||||
+ ltq_sysctl_activate(SYSCTL_SYS1, ACTS_I2C_ACT);
|
||||
}
|
||||
|
||||
-void __init falcon_register_crypto(void)
|
||||
+/* spi flash */
|
||||
+static struct platform_device ltq_spi = {
|
||||
+ .name = "falcon_spi",
|
||||
+ .num_resources = 0,
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+falcon_register_spi_flash(struct spi_board_info *data)
|
||||
{
|
||||
- platform_device_register_simple("ltq_falcon_deu", 0, NULL, 0);
|
||||
+ spi_register_board_info(data, 1);
|
||||
+ platform_device_register(<q_spi);
|
||||
}
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/devices.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/devices.h 2011-10-05 12:30:34.584838403 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/devices.h 2011-10-05 12:30:34.600838405 +0200
|
||||
@@ -11,11 +11,15 @@
|
||||
#ifndef _FALCON_DEVICES_H__
|
||||
#define _FALCON_DEVICES_H__
|
||||
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/spi/flash.h>
|
||||
+
|
||||
#include "../devices.h"
|
||||
|
||||
extern void falcon_register_nand(void);
|
||||
extern void falcon_register_gpio(void);
|
||||
extern void falcon_register_gpio_extra(void);
|
||||
extern void falcon_register_i2c(void);
|
||||
+extern void falcon_register_spi_flash(struct spi_board_info *data);
|
||||
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/mach-easy98000.c 2011-10-05 12:30:34.552838402 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/mach-easy98000.c 2011-10-05 12:30:34.600838405 +0200
|
||||
@@ -40,6 +40,21 @@
|
||||
.parts = easy98000_nor_partitions,
|
||||
};
|
||||
|
||||
+static struct flash_platform_data easy98000_spi_flash_platform_data = {
|
||||
+ .name = "sflash",
|
||||
+ .parts = easy98000_nor_partitions,
|
||||
+ .nr_parts = ARRAY_SIZE(easy98000_nor_partitions)
|
||||
+};
|
||||
+
|
||||
+static struct spi_board_info easy98000_spi_flash_data __initdata = {
|
||||
+ .modalias = "m25p80",
|
||||
+ .bus_num = 0,
|
||||
+ .chip_select = 0,
|
||||
+ .max_speed_hz = 10 * 1000 * 1000,
|
||||
+ .mode = SPI_MODE_3,
|
||||
+ .platform_data = &easy98000_spi_flash_platform_data
|
||||
+};
|
||||
+
|
||||
/* setup gpio based spi bus/device for access to the eeprom on the board */
|
||||
#define SPI_GPIO_MRST 102
|
||||
#define SPI_GPIO_MTSR 103
|
||||
@@ -93,6 +108,13 @@
|
||||
}
|
||||
|
||||
static void __init
|
||||
+easy98000sf_init(void)
|
||||
+{
|
||||
+ easy98000_init_common();
|
||||
+ falcon_register_spi_flash(&easy98000_spi_flash_data);
|
||||
+}
|
||||
+
|
||||
+static void __init
|
||||
easy98000nand_init(void)
|
||||
{
|
||||
easy98000_init_common();
|
||||
@@ -104,6 +126,11 @@
|
||||
"EASY98000 Eval Board",
|
||||
easy98000_init);
|
||||
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98000SF,
|
||||
+ "EASY98000SF",
|
||||
+ "EASY98000 Eval Board (Serial Flash)",
|
||||
+ easy98000sf_init);
|
||||
+
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98000NAND,
|
||||
"EASY98000NAND",
|
||||
"EASY98000 Eval Board (NAND Flash)",
|
||||
Index: linux-3.0.3/drivers/spi/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/spi/Kconfig 2011-10-05 12:30:33.608838362 +0200
|
||||
+++ linux-3.0.3/drivers/spi/Kconfig 2011-10-05 12:41:56.864867570 +0200
|
||||
@@ -219,6 +219,10 @@
|
||||
This drivers supports the MPC52xx SPI controller in master SPI
|
||||
mode.
|
||||
|
||||
+config SPI_FALCON
|
||||
+ tristate "Falcon SPI controller support"
|
||||
+ depends on SOC_FALCON
|
||||
+
|
||||
config SPI_MPC52xx_PSC
|
||||
tristate "Freescale MPC52xx PSC SPI controller"
|
||||
depends on PPC_MPC52xx && EXPERIMENTAL
|
||||
Index: linux-3.0.3/drivers/spi/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/spi/Makefile 2011-10-05 12:30:33.608838362 +0200
|
||||
+++ linux-3.0.3/drivers/spi/Makefile 2011-10-05 12:41:56.884867571 +0200
|
||||
@@ -56,6 +56,7 @@
|
||||
obj-$(CONFIG_SPI_SH_MSIOF) += spi_sh_msiof.o
|
||||
obj-$(CONFIG_SPI_STMP3XXX) += spi_stmp.o
|
||||
obj-$(CONFIG_SPI_NUC900) += spi_nuc900.o
|
||||
+obj-$(CONFIG_SPI_FALCON) += spi-falcon.o
|
||||
|
||||
# special build for s3c24xx spi driver with fiq support
|
||||
spi_s3c24xx_hw-y := spi_s3c24xx.o
|
||||
Index: linux-3.0.3/drivers/spi/spi-falcon.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/drivers/spi/spi-falcon.c 2011-10-05 12:30:34.600838405 +0200
|
||||
@@ -0,0 +1,477 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 Thomas Langer <thomas.langer@lantiq.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/workqueue.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+
|
||||
+#define DRV_NAME "falcon_spi"
|
||||
+
|
||||
+#define FALCON_SPI_XFER_BEGIN (1 << 0)
|
||||
+#define FALCON_SPI_XFER_END (1 << 1)
|
||||
+
|
||||
+/* Bus Read Configuration Register0 */
|
||||
+#define LTQ_BUSRCON0 0x00000010
|
||||
+/* Bus Write Configuration Register0 */
|
||||
+#define LTQ_BUSWCON0 0x00000018
|
||||
+/* Serial Flash Configuration Register */
|
||||
+#define LTQ_SFCON 0x00000080
|
||||
+/* Serial Flash Time Register */
|
||||
+#define LTQ_SFTIME 0x00000084
|
||||
+/* Serial Flash Status Register */
|
||||
+#define LTQ_SFSTAT 0x00000088
|
||||
+/* Serial Flash Command Register */
|
||||
+#define LTQ_SFCMD 0x0000008C
|
||||
+/* Serial Flash Address Register */
|
||||
+#define LTQ_SFADDR 0x00000090
|
||||
+/* Serial Flash Data Register */
|
||||
+#define LTQ_SFDATA 0x00000094
|
||||
+/* Serial Flash I/O Control Register */
|
||||
+#define LTQ_SFIO 0x00000098
|
||||
+/* EBU Clock Control Register */
|
||||
+#define LTQ_EBUCC 0x000000C4
|
||||
+
|
||||
+/* Dummy Phase Length */
|
||||
+#define SFCMD_DUMLEN_OFFSET 16
|
||||
+#define SFCMD_DUMLEN_MASK 0x000F0000
|
||||
+/* Chip Select */
|
||||
+#define SFCMD_CS_OFFSET 24
|
||||
+#define SFCMD_CS_MASK 0x07000000
|
||||
+/* field offset */
|
||||
+#define SFCMD_ALEN_OFFSET 20
|
||||
+#define SFCMD_ALEN_MASK 0x00700000
|
||||
+/* SCK Rise-edge Position */
|
||||
+#define SFTIME_SCKR_POS_OFFSET 8
|
||||
+#define SFTIME_SCKR_POS_MASK 0x00000F00
|
||||
+/* SCK Period */
|
||||
+#define SFTIME_SCK_PER_OFFSET 0
|
||||
+#define SFTIME_SCK_PER_MASK 0x0000000F
|
||||
+/* SCK Fall-edge Position */
|
||||
+#define SFTIME_SCKF_POS_OFFSET 12
|
||||
+#define SFTIME_SCKF_POS_MASK 0x0000F000
|
||||
+/* Device Size */
|
||||
+#define SFCON_DEV_SIZE_A23_0 0x03000000
|
||||
+#define SFCON_DEV_SIZE_MASK 0x0F000000
|
||||
+/* Read Data Position */
|
||||
+#define SFTIME_RD_POS_MASK 0x000F0000
|
||||
+/* Data Output */
|
||||
+#define SFIO_UNUSED_WD_MASK 0x0000000F
|
||||
+/* Command Opcode mask */
|
||||
+#define SFCMD_OPC_MASK 0x000000FF
|
||||
+/* dlen bytes of data to write */
|
||||
+#define SFCMD_DIR_WRITE 0x00000100
|
||||
+/* Data Length offset */
|
||||
+#define SFCMD_DLEN_OFFSET 9
|
||||
+/* Command Error */
|
||||
+#define SFSTAT_CMD_ERR 0x20000000
|
||||
+/* Access Command Pending */
|
||||
+#define SFSTAT_CMD_PEND 0x00400000
|
||||
+/* Frequency set to 100MHz. */
|
||||
+#define EBUCC_EBUDIV_SELF100 0x00000001
|
||||
+/* Serial Flash */
|
||||
+#define BUSRCON0_AGEN_SERIAL_FLASH 0xF0000000
|
||||
+/* 8-bit multiplexed */
|
||||
+#define BUSRCON0_PORTW_8_BIT_MUX 0x00000000
|
||||
+/* Serial Flash */
|
||||
+#define BUSWCON0_AGEN_SERIAL_FLASH 0xF0000000
|
||||
+/* Chip Select after opcode */
|
||||
+#define SFCMD_KEEP_CS_KEEP_SELECTED 0x00008000
|
||||
+
|
||||
+struct falcon_spi {
|
||||
+ u32 sfcmd; /* for caching of opcode, direction, ... */
|
||||
+ struct spi_master *master;
|
||||
+};
|
||||
+
|
||||
+int
|
||||
+falcon_spi_xfer(struct spi_device *spi,
|
||||
+ struct spi_transfer *t,
|
||||
+ unsigned long flags)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+ struct falcon_spi *priv = spi_master_get_devdata(spi->master);
|
||||
+ const u8 *txp = t->tx_buf;
|
||||
+ u8 *rxp = t->rx_buf;
|
||||
+ unsigned int bytelen = ((8 * t->len + 7) / 8);
|
||||
+ unsigned int len, alen, dumlen;
|
||||
+ u32 val;
|
||||
+ enum {
|
||||
+ state_init,
|
||||
+ state_command_prepare,
|
||||
+ state_write,
|
||||
+ state_read,
|
||||
+ state_disable_cs,
|
||||
+ state_end
|
||||
+ } state = state_init;
|
||||
+
|
||||
+ do {
|
||||
+ switch (state) {
|
||||
+ case state_init: /* detect phase of upper layer sequence */
|
||||
+ {
|
||||
+ /* initial write ? */
|
||||
+ if (flags & FALCON_SPI_XFER_BEGIN) {
|
||||
+ if (!txp) {
|
||||
+ dev_err(dev,
|
||||
+ "BEGIN without tx data!\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ /*
|
||||
+ * Prepare the parts of the sfcmd register,
|
||||
+ * which should not
|
||||
+ * change during a sequence!
|
||||
+ * Only exception are the length fields,
|
||||
+ * especially alen and dumlen.
|
||||
+ */
|
||||
+
|
||||
+ priv->sfcmd = ((spi->chip_select
|
||||
+ << SFCMD_CS_OFFSET)
|
||||
+ & SFCMD_CS_MASK);
|
||||
+ priv->sfcmd |= SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ priv->sfcmd |= *txp;
|
||||
+ txp++;
|
||||
+ bytelen--;
|
||||
+ if (bytelen) {
|
||||
+ /* more data:
|
||||
+ * maybe address and/or dummy */
|
||||
+ state = state_command_prepare;
|
||||
+ break;
|
||||
+ } else {
|
||||
+ dev_dbg(dev, "write cmd %02X\n",
|
||||
+ priv->sfcmd & SFCMD_OPC_MASK);
|
||||
+ }
|
||||
+ }
|
||||
+ /* continued write ? */
|
||||
+ if (txp && bytelen) {
|
||||
+ state = state_write;
|
||||
+ break;
|
||||
+ }
|
||||
+ /* read data? */
|
||||
+ if (rxp && bytelen) {
|
||||
+ state = state_read;
|
||||
+ break;
|
||||
+ }
|
||||
+ /* end of sequence? */
|
||||
+ if (flags & FALCON_SPI_XFER_END)
|
||||
+ state = state_disable_cs;
|
||||
+ else
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_command_prepare: /* collect tx data for
|
||||
+ address and dummy phase */
|
||||
+ {
|
||||
+ /* txp is valid, already checked */
|
||||
+ val = 0;
|
||||
+ alen = 0;
|
||||
+ dumlen = 0;
|
||||
+ while (bytelen > 0) {
|
||||
+ if (alen < 3) {
|
||||
+ val = (val<<8)|(*txp++);
|
||||
+ alen++;
|
||||
+ } else if ((dumlen < 15) && (*txp == 0)) {
|
||||
+ /*
|
||||
+ * assume dummy bytes are set to 0
|
||||
+ * from upper layer
|
||||
+ */
|
||||
+ dumlen++;
|
||||
+ txp++;
|
||||
+ } else
|
||||
+ break;
|
||||
+ bytelen--;
|
||||
+ }
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK | SFCMD_DUMLEN_MASK);
|
||||
+ priv->sfcmd |= (alen << SFCMD_ALEN_OFFSET) |
|
||||
+ (dumlen << SFCMD_DUMLEN_OFFSET);
|
||||
+ if (alen > 0)
|
||||
+ ltq_ebu_w32(val, LTQ_SFADDR);
|
||||
+
|
||||
+ dev_dbg(dev, "write cmd %02X, alen=%d "
|
||||
+ "(addr=%06X) dumlen=%d\n",
|
||||
+ priv->sfcmd & SFCMD_OPC_MASK,
|
||||
+ alen, val, dumlen);
|
||||
+
|
||||
+ if (bytelen > 0) {
|
||||
+ /* continue with write */
|
||||
+ state = state_write;
|
||||
+ } else if (flags & FALCON_SPI_XFER_END) {
|
||||
+ /* end of sequence? */
|
||||
+ state = state_disable_cs;
|
||||
+ } else {
|
||||
+ /* go to end and expect another
|
||||
+ * call (read or write) */
|
||||
+ state = state_end;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_write:
|
||||
+ {
|
||||
+ /* txp still valid */
|
||||
+ priv->sfcmd |= SFCMD_DIR_WRITE;
|
||||
+ len = 0;
|
||||
+ val = 0;
|
||||
+ do {
|
||||
+ if (bytelen--)
|
||||
+ val |= (*txp++) << (8 * len++);
|
||||
+ if ((flags & FALCON_SPI_XFER_END)
|
||||
+ && (bytelen == 0)) {
|
||||
+ priv->sfcmd &=
|
||||
+ ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ }
|
||||
+ if ((len == 4) || (bytelen == 0)) {
|
||||
+ ltq_ebu_w32(val, LTQ_SFDATA);
|
||||
+ ltq_ebu_w32(priv->sfcmd
|
||||
+ | (len<<SFCMD_DLEN_OFFSET),
|
||||
+ LTQ_SFCMD);
|
||||
+ len = 0;
|
||||
+ val = 0;
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK
|
||||
+ | SFCMD_DUMLEN_MASK);
|
||||
+ }
|
||||
+ } while (bytelen);
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_read:
|
||||
+ {
|
||||
+ /* read data */
|
||||
+ priv->sfcmd &= ~SFCMD_DIR_WRITE;
|
||||
+ do {
|
||||
+ if ((flags & FALCON_SPI_XFER_END)
|
||||
+ && (bytelen <= 4)) {
|
||||
+ priv->sfcmd &=
|
||||
+ ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ }
|
||||
+ len = (bytelen > 4) ? 4 : bytelen;
|
||||
+ bytelen -= len;
|
||||
+ ltq_ebu_w32(priv->sfcmd
|
||||
+ |(len<<SFCMD_DLEN_OFFSET), LTQ_SFCMD);
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK
|
||||
+ | SFCMD_DUMLEN_MASK);
|
||||
+ do {
|
||||
+ val = ltq_ebu_r32(LTQ_SFSTAT);
|
||||
+ if (val & SFSTAT_CMD_ERR) {
|
||||
+ /* reset error status */
|
||||
+ dev_err(dev, "SFSTAT: CMD_ERR "
|
||||
+ "(%x)\n", val);
|
||||
+ ltq_ebu_w32(SFSTAT_CMD_ERR,
|
||||
+ LTQ_SFSTAT);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ } while (val & SFSTAT_CMD_PEND);
|
||||
+ val = ltq_ebu_r32(LTQ_SFDATA);
|
||||
+ do {
|
||||
+ *rxp = (val & 0xFF);
|
||||
+ rxp++;
|
||||
+ val >>= 8;
|
||||
+ len--;
|
||||
+ } while (len);
|
||||
+ } while (bytelen);
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_disable_cs:
|
||||
+ {
|
||||
+ priv->sfcmd &= ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ ltq_ebu_w32(priv->sfcmd | (0 << SFCMD_DLEN_OFFSET),
|
||||
+ LTQ_SFCMD);
|
||||
+ val = ltq_ebu_r32(LTQ_SFSTAT);
|
||||
+ if (val & SFSTAT_CMD_ERR) {
|
||||
+ /* reset error status */
|
||||
+ dev_err(dev, "SFSTAT: CMD_ERR (%x)\n", val);
|
||||
+ ltq_ebu_w32(SFSTAT_CMD_ERR, LTQ_SFSTAT);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_end:
|
||||
+ break;
|
||||
+ }
|
||||
+ } while (state != state_end);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_spi_setup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+ const u32 ebuclk = CLOCK_100M;
|
||||
+ unsigned int i;
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ dev_dbg(dev, "setup\n");
|
||||
+
|
||||
+ if (spi->master->bus_num > 0 || spi->chip_select > 0)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ spin_lock_irqsave(&ebu_lock, flags);
|
||||
+
|
||||
+ if (ebuclk < spi->max_speed_hz) {
|
||||
+ /* set EBU clock to 100 MHz */
|
||||
+ ltq_sys1_w32_mask(0, EBUCC_EBUDIV_SELF100, LTQ_EBUCC);
|
||||
+ i = 1; /* divider */
|
||||
+ } else {
|
||||
+ /* set EBU clock to 50 MHz */
|
||||
+ ltq_sys1_w32_mask(EBUCC_EBUDIV_SELF100, 0, LTQ_EBUCC);
|
||||
+
|
||||
+ /* search for suitable divider */
|
||||
+ for (i = 1; i < 7; i++) {
|
||||
+ if (ebuclk / i <= spi->max_speed_hz)
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* setup period of serial clock */
|
||||
+ ltq_ebu_w32_mask(SFTIME_SCKF_POS_MASK
|
||||
+ | SFTIME_SCKR_POS_MASK
|
||||
+ | SFTIME_SCK_PER_MASK,
|
||||
+ (i << SFTIME_SCKR_POS_OFFSET)
|
||||
+ | (i << (SFTIME_SCK_PER_OFFSET + 1)),
|
||||
+ LTQ_SFTIME);
|
||||
+
|
||||
+ /* set some bits of unused_wd, to not trigger HOLD/WP
|
||||
+ * signals on non QUAD flashes */
|
||||
+ ltq_ebu_w32((SFIO_UNUSED_WD_MASK & (0x8 | 0x4)), LTQ_SFIO);
|
||||
+
|
||||
+ ltq_ebu_w32(BUSRCON0_AGEN_SERIAL_FLASH | BUSRCON0_PORTW_8_BIT_MUX,
|
||||
+ LTQ_BUSRCON0);
|
||||
+ ltq_ebu_w32(BUSWCON0_AGEN_SERIAL_FLASH, LTQ_BUSWCON0);
|
||||
+ /* set address wrap around to maximum for 24-bit addresses */
|
||||
+ ltq_ebu_w32_mask(SFCON_DEV_SIZE_MASK, SFCON_DEV_SIZE_A23_0, LTQ_SFCON);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&ebu_lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+falcon_spi_transfer(struct spi_device *spi, struct spi_message *m)
|
||||
+{
|
||||
+ struct falcon_spi *priv = spi_master_get_devdata(spi->master);
|
||||
+ struct spi_transfer *t;
|
||||
+ unsigned long spi_flags;
|
||||
+ unsigned long flags;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ priv->sfcmd = 0;
|
||||
+ m->actual_length = 0;
|
||||
+
|
||||
+ spi_flags = FALCON_SPI_XFER_BEGIN;
|
||||
+ list_for_each_entry(t, &m->transfers, transfer_list) {
|
||||
+ if (list_is_last(&t->transfer_list, &m->transfers))
|
||||
+ spi_flags |= FALCON_SPI_XFER_END;
|
||||
+
|
||||
+ spin_lock_irqsave(&ebu_lock, flags);
|
||||
+ ret = falcon_spi_xfer(spi, t, spi_flags);
|
||||
+ spin_unlock_irqrestore(&ebu_lock, flags);
|
||||
+
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+
|
||||
+ m->actual_length += t->len;
|
||||
+
|
||||
+ if (t->delay_usecs || t->cs_change)
|
||||
+ BUG();
|
||||
+
|
||||
+ spi_flags = 0;
|
||||
+ }
|
||||
+
|
||||
+ m->status = ret;
|
||||
+ m->complete(m->context);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+falcon_spi_cleanup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+
|
||||
+ dev_dbg(dev, "cleanup\n");
|
||||
+}
|
||||
+
|
||||
+static int __devinit
|
||||
+falcon_spi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct falcon_spi *priv;
|
||||
+ struct spi_master *master;
|
||||
+ int ret;
|
||||
+
|
||||
+ dev_dbg(dev, "probing\n");
|
||||
+
|
||||
+ master = spi_alloc_master(&pdev->dev, sizeof(*priv));
|
||||
+ if (!master) {
|
||||
+ dev_err(dev, "no memory for spi_master\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ priv = spi_master_get_devdata(master);
|
||||
+ priv->master = master;
|
||||
+
|
||||
+ master->mode_bits = SPI_MODE_3;
|
||||
+ master->num_chipselect = 1;
|
||||
+ master->bus_num = 0;
|
||||
+
|
||||
+ master->setup = falcon_spi_setup;
|
||||
+ master->transfer = falcon_spi_transfer;
|
||||
+ master->cleanup = falcon_spi_cleanup;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+
|
||||
+ ret = spi_register_master(master);
|
||||
+ if (ret)
|
||||
+ spi_master_put(master);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int __devexit
|
||||
+falcon_spi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct falcon_spi *priv = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ dev_dbg(dev, "removed\n");
|
||||
+
|
||||
+ spi_unregister_master(priv->master);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver falcon_spi_driver = {
|
||||
+ .probe = falcon_spi_probe,
|
||||
+ .remove = __devexit_p(falcon_spi_remove),
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .owner = THIS_MODULE
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init
|
||||
+falcon_spi_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&falcon_spi_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit
|
||||
+falcon_spi_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&falcon_spi_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(falcon_spi_init);
|
||||
+module_exit(falcon_spi_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("Lantiq Falcon SPI controller driver");
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h 2011-10-05 12:38:16.176858136 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h 2011-10-05 12:39:54.936862358 +0200
|
||||
@@ -48,6 +48,10 @@
|
||||
|
||||
#define LTQ_EBU_MODCON 0x000C
|
||||
|
||||
+/* I2C */
|
||||
+#define LTQ_I2C_BASE_ADDR 0x1E200000
|
||||
+#define LTQ_I2C_SIZE 0x00010000
|
||||
+
|
||||
/* GPIO */
|
||||
#define LTQ_GPIO0_BASE_ADDR 0x1D810000
|
||||
#define LTQ_GPIO0_SIZE 0x0080
|
||||
@@ -92,6 +96,7 @@
|
||||
|
||||
/* Activation Status Register */
|
||||
#define ACTS_ASC1_ACT 0x00000800
|
||||
+#define ACTS_I2C_ACT 0x00004000
|
||||
#define ACTS_P0 0x00010000
|
||||
#define ACTS_P1 0x00010000
|
||||
#define ACTS_P2 0x00020000
|
|
@ -1,42 +1,96 @@
|
|||
From: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
Date: Thu, 3 Mar 2011 17:15:30 +0000 (+0100)
|
||||
Subject: SPI: lantiq: Add driver for Lantiq SoC SPI controller
|
||||
X-Git-Url: http://nbd.name/gitweb.cgi?p=lantiq.git;a=commitdiff_plain;h=653c95b8b9066c9c6ac08bd64d0ceee439e9fd90;hp=3d21b04682ae8eb1c1965aba39d1796e8c5ad84b
|
||||
From e29263339db41d49d79482c93463c4c0cbe764d7 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 30 Sep 2011 14:23:42 +0200
|
||||
Subject: [PATCH 14/24] MIPS: lantiq: adds xway spi
|
||||
|
||||
SPI: lantiq: Add driver for Lantiq SoC SPI controller
|
||||
|
||||
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/lantiq_platform.h | 9 +
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_irq.h | 2 +
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 1 +
|
||||
drivers/spi/Kconfig | 8 +
|
||||
drivers/spi/Makefile | 2 +-
|
||||
drivers/spi/spi-xway.c | 1062 ++++++++++++++++++++
|
||||
6 files changed, 1083 insertions(+), 1 deletions(-)
|
||||
create mode 100644 drivers/spi/spi-xway.c
|
||||
|
||||
--- a/drivers/spi/Kconfig
|
||||
+++ b/drivers/spi/Kconfig
|
||||
@@ -202,6 +202,14 @@ config SPI_IMX
|
||||
This enables using the Freescale i.MX SPI controllers in master
|
||||
mode.
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/lantiq_platform.h 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h 2011-10-04 20:05:23.962311503 +0200
|
||||
@@ -50,4 +50,13 @@
|
||||
int mii_mode;
|
||||
};
|
||||
|
||||
+config SPI_LANTIQ
|
||||
+ tristate "Lantiq SoC SPI controller"
|
||||
+ depends on SOC_TYPE_XWAY
|
||||
+
|
||||
+struct ltq_spi_platform_data {
|
||||
+ u16 num_chipselect;
|
||||
+};
|
||||
+
|
||||
+struct ltq_spi_controller_data {
|
||||
+ unsigned gpio;
|
||||
+};
|
||||
+
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-10-04 20:05:23.962311503 +0200
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#define LTQ_SSC_TIR (INT_NUM_IM0_IRL0 + 15)
|
||||
#define LTQ_SSC_RIR (INT_NUM_IM0_IRL0 + 14)
|
||||
+#define LTQ_SSC_TIR_AR9 (INT_NUM_IM0_IRL0 + 14)
|
||||
+#define LTQ_SSC_RIR_AR9 (INT_NUM_IM0_IRL0 + 15)
|
||||
#define LTQ_SSC_EIR (INT_NUM_IM0_IRL0 + 16)
|
||||
|
||||
#define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21)
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:03:54.934307699 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:23.966311504 +0200
|
||||
@@ -81,6 +81,7 @@
|
||||
|
||||
#define PMU_DMA 0x0020
|
||||
#define PMU_USB 0x8041
|
||||
+#define PMU_SPI 0x0100
|
||||
#define PMU_LED 0x0800
|
||||
#define PMU_GPT 0x1000
|
||||
#define PMU_PPE 0x2000
|
||||
Index: linux-3.0.3/drivers/spi/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/spi/Kconfig 2011-10-04 20:05:07.030310779 +0200
|
||||
+++ linux-3.0.3/drivers/spi/Kconfig 2011-10-04 20:05:23.966311504 +0200
|
||||
@@ -433,6 +433,14 @@
|
||||
help
|
||||
SPI driver for Nuvoton NUC900 series ARM SoCs
|
||||
|
||||
+config SPI_XWAY
|
||||
+ tristate "Lantiq XWAY SPI controller"
|
||||
+ depends on LANTIQ && SOC_TYPE_XWAY
|
||||
+ select SPI_BITBANG
|
||||
+ help
|
||||
+ This driver supports the Lantiq SoC SPI controller in master
|
||||
+ mode.
|
||||
+
|
||||
config SPI_LM70_LLP
|
||||
tristate "Parallel port adapter for LM70 eval board (DEVELOPMENT)"
|
||||
depends on PARPORT && EXPERIMENTAL
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -27,6 +27,7 @@ obj-$(CONFIG_SPI_EP93XX) += ep93xx_spi.
|
||||
obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
|
||||
obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
|
||||
obj-$(CONFIG_SPI_IMX) += spi_imx.o
|
||||
+obj-$(CONFIG_SPI_LANTIQ) += spi_lantiq.o
|
||||
obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
|
||||
obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
|
||||
obj-$(CONFIG_SPI_PXA2XX_PCI) += pxa2xx_spi_pci.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi_lantiq.c
|
||||
#
|
||||
# Add new SPI master controllers in alphabetical order above this line
|
||||
#
|
||||
Index: linux-3.0.3/drivers/spi/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/spi/Makefile 2011-10-04 20:05:20.000000000 +0200
|
||||
+++ linux-3.0.3/drivers/spi/Makefile 2011-10-04 20:05:35.802312011 +0200
|
||||
@@ -57,6 +57,7 @@
|
||||
obj-$(CONFIG_SPI_STMP3XXX) += spi_stmp.o
|
||||
obj-$(CONFIG_SPI_NUC900) += spi_nuc900.o
|
||||
obj-$(CONFIG_SPI_FALCON) += spi-falcon.o
|
||||
+obj-$(CONFIG_SPI_XWAY) += spi-xway.o
|
||||
|
||||
# special build for s3c24xx spi driver with fiq support
|
||||
spi_s3c24xx_hw-y := spi_s3c24xx.o
|
||||
Index: linux-3.0.3/drivers/spi/spi-xway.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/drivers/spi/spi-xway.c 2011-10-04 20:05:23.966311504 +0200
|
||||
@@ -0,0 +1,1062 @@
|
||||
+/*
|
||||
+ * Lantiq SoC SPI controller
|
|
@ -0,0 +1,417 @@
|
|||
From c7881d8d2b3aed9a90aa37dcf797328a9cfbe7b6 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Wed, 10 Aug 2011 15:32:16 +0200
|
||||
Subject: [PATCH 15/24] MIPS: lantiq: adds etop support for ase/ar9
|
||||
|
||||
Extend the driver to handle the different DMA channel layout for AR9 and
|
||||
SoCs. The patch also adds support for the integrated PHY found on Amazon-SE
|
||||
and the gigabit switch found inside the AR9.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_irq.h | 22 +---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 10 ++
|
||||
arch/mips/lantiq/xway/devices.c | 11 +-
|
||||
arch/mips/lantiq/xway/mach-easy50601.c | 5 +
|
||||
drivers/net/lantiq_etop.c | 172 ++++++++++++++++++--
|
||||
5 files changed, 180 insertions(+), 40 deletions(-)
|
||||
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-10-04 20:05:23.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-10-04 20:05:44.146312365 +0200
|
||||
@@ -40,26 +40,8 @@
|
||||
|
||||
#define MIPS_CPU_TIMER_IRQ 7
|
||||
|
||||
-#define LTQ_DMA_CH0_INT (INT_NUM_IM2_IRL0)
|
||||
-#define LTQ_DMA_CH1_INT (INT_NUM_IM2_IRL0 + 1)
|
||||
-#define LTQ_DMA_CH2_INT (INT_NUM_IM2_IRL0 + 2)
|
||||
-#define LTQ_DMA_CH3_INT (INT_NUM_IM2_IRL0 + 3)
|
||||
-#define LTQ_DMA_CH4_INT (INT_NUM_IM2_IRL0 + 4)
|
||||
-#define LTQ_DMA_CH5_INT (INT_NUM_IM2_IRL0 + 5)
|
||||
-#define LTQ_DMA_CH6_INT (INT_NUM_IM2_IRL0 + 6)
|
||||
-#define LTQ_DMA_CH7_INT (INT_NUM_IM2_IRL0 + 7)
|
||||
-#define LTQ_DMA_CH8_INT (INT_NUM_IM2_IRL0 + 8)
|
||||
-#define LTQ_DMA_CH9_INT (INT_NUM_IM2_IRL0 + 9)
|
||||
-#define LTQ_DMA_CH10_INT (INT_NUM_IM2_IRL0 + 10)
|
||||
-#define LTQ_DMA_CH11_INT (INT_NUM_IM2_IRL0 + 11)
|
||||
-#define LTQ_DMA_CH12_INT (INT_NUM_IM2_IRL0 + 25)
|
||||
-#define LTQ_DMA_CH13_INT (INT_NUM_IM2_IRL0 + 26)
|
||||
-#define LTQ_DMA_CH14_INT (INT_NUM_IM2_IRL0 + 27)
|
||||
-#define LTQ_DMA_CH15_INT (INT_NUM_IM2_IRL0 + 28)
|
||||
-#define LTQ_DMA_CH16_INT (INT_NUM_IM2_IRL0 + 29)
|
||||
-#define LTQ_DMA_CH17_INT (INT_NUM_IM2_IRL0 + 30)
|
||||
-#define LTQ_DMA_CH18_INT (INT_NUM_IM2_IRL0 + 16)
|
||||
-#define LTQ_DMA_CH19_INT (INT_NUM_IM2_IRL0 + 21)
|
||||
+#define LTQ_DMA_ETOP ((ltq_is_ase()) ? \
|
||||
+ (INT_NUM_IM3_IRL0) : (INT_NUM_IM2_IRL0))
|
||||
|
||||
#define LTQ_PPE_MBOX_INT (INT_NUM_IM2_IRL0 + 24)
|
||||
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:23.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:44.146312365 +0200
|
||||
@@ -80,6 +80,7 @@
|
||||
#define LTQ_PMU_SIZE 0x1000
|
||||
|
||||
#define PMU_DMA 0x0020
|
||||
+#define PMU_EPHY 0x0080
|
||||
#define PMU_USB 0x8041
|
||||
#define PMU_SPI 0x0100
|
||||
#define PMU_LED 0x0800
|
||||
@@ -92,6 +93,10 @@
|
||||
#define LTQ_ETOP_BASE_ADDR 0x1E180000
|
||||
#define LTQ_ETOP_SIZE 0x40000
|
||||
|
||||
+/* GBIT - gigabit switch */
|
||||
+#define LTQ_GBIT_BASE_ADDR 0x1E108000
|
||||
+#define LTQ_GBIT_SIZE 0x200
|
||||
+
|
||||
/* DMA */
|
||||
#define LTQ_DMA_BASE_ADDR 0x1E104100
|
||||
#define LTQ_DMA_SIZE 0x800
|
||||
@@ -148,6 +153,11 @@
|
||||
extern void ltq_pmu_disable(unsigned int module);
|
||||
extern void ltq_cgu_enable(unsigned int clk);
|
||||
|
||||
+static inline int ltq_is_ase(void)
|
||||
+{
|
||||
+ return (ltq_get_soc_type() == SOC_TYPE_AMAZON_SE);
|
||||
+}
|
||||
+
|
||||
static inline int ltq_is_ar9(void)
|
||||
{
|
||||
return (ltq_get_soc_type() == SOC_TYPE_AR9);
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/devices.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/devices.c 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/devices.c 2011-10-04 20:05:44.146312365 +0200
|
||||
@@ -79,18 +79,23 @@
|
||||
}
|
||||
|
||||
/* ethernet */
|
||||
-static struct resource ltq_etop_resources =
|
||||
- MEM_RES("etop", LTQ_ETOP_BASE_ADDR, LTQ_ETOP_SIZE);
|
||||
+static struct resource ltq_etop_resources[] = {
|
||||
+ MEM_RES("etop", LTQ_ETOP_BASE_ADDR, LTQ_ETOP_SIZE),
|
||||
+ MEM_RES("gbit", LTQ_GBIT_BASE_ADDR, LTQ_GBIT_SIZE),
|
||||
+};
|
||||
|
||||
static struct platform_device ltq_etop = {
|
||||
.name = "ltq_etop",
|
||||
- .resource = <q_etop_resources,
|
||||
+ .resource = ltq_etop_resources,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
void __init
|
||||
ltq_register_etop(struct ltq_eth_data *eth)
|
||||
{
|
||||
+ /* only register the gphy on socs that have one */
|
||||
+ if (ltq_is_ar9() | ltq_is_vr9())
|
||||
+ ltq_etop.num_resources = 2;
|
||||
if (eth) {
|
||||
ltq_etop.dev.platform_data = eth;
|
||||
platform_device_register(<q_etop);
|
||||
Index: linux-3.0.3/drivers/net/lantiq_etop.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/net/lantiq_etop.c 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/drivers/net/lantiq_etop.c 2011-10-04 20:05:44.146312365 +0200
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/checksum.h>
|
||||
|
||||
@@ -69,10 +70,43 @@
|
||||
#define ETOP_MII_REVERSE 0xe
|
||||
#define ETOP_PLEN_UNDER 0x40
|
||||
#define ETOP_CGEN 0x800
|
||||
+#define ETOP_CFG_MII0 0x01
|
||||
|
||||
-/* use 2 static channels for TX/RX */
|
||||
+#define LTQ_GBIT_MDIO_CTL 0xCC
|
||||
+#define LTQ_GBIT_MDIO_DATA 0xd0
|
||||
+#define LTQ_GBIT_GCTL0 0x68
|
||||
+#define LTQ_GBIT_PMAC_HD_CTL 0x8c
|
||||
+#define LTQ_GBIT_P0_CTL 0x4
|
||||
+#define LTQ_GBIT_PMAC_RX_IPG 0xa8
|
||||
+
|
||||
+#define PMAC_HD_CTL_AS (1 << 19)
|
||||
+#define PMAC_HD_CTL_RXSH (1 << 22)
|
||||
+
|
||||
+/* Switch Enable (0=disable, 1=enable) */
|
||||
+#define GCTL0_SE 0x80000000
|
||||
+/* Disable MDIO auto polling (0=disable, 1=enable) */
|
||||
+#define PX_CTL_DMDIO 0x00400000
|
||||
+
|
||||
+/* register information for the gbit's MDIO bus */
|
||||
+#define MDIO_XR9_REQUEST 0x00008000
|
||||
+#define MDIO_XR9_READ 0x00000800
|
||||
+#define MDIO_XR9_WRITE 0x00000400
|
||||
+#define MDIO_XR9_REG_MASK 0x1f
|
||||
+#define MDIO_XR9_ADDR_MASK 0x1f
|
||||
+#define MDIO_XR9_RD_MASK 0xffff
|
||||
+#define MDIO_XR9_REG_OFFSET 0
|
||||
+#define MDIO_XR9_ADDR_OFFSET 5
|
||||
+#define MDIO_XR9_WR_OFFSET 16
|
||||
+
|
||||
+/* the newer xway socks have a embedded 3/7 port gbit multiplexer */
|
||||
+#define ltq_has_gbit() (ltq_is_ar9() || ltq_is_vr9())
|
||||
+
|
||||
+/* use 2 static channels for TX/RX
|
||||
+ depending on the SoC we need to use different DMA channels for ethernet */
|
||||
#define LTQ_ETOP_TX_CHANNEL 1
|
||||
-#define LTQ_ETOP_RX_CHANNEL 6
|
||||
+#define LTQ_ETOP_RX_CHANNEL ((ltq_is_ase()) ? (5) : \
|
||||
+ ((ltq_has_gbit()) ? (0) : (6)))
|
||||
+
|
||||
#define IS_TX(x) (x == LTQ_ETOP_TX_CHANNEL)
|
||||
#define IS_RX(x) (x == LTQ_ETOP_RX_CHANNEL)
|
||||
|
||||
@@ -81,9 +115,15 @@
|
||||
#define ltq_etop_w32_mask(x, y, z) \
|
||||
ltq_w32_mask(x, y, ltq_etop_membase + (z))
|
||||
|
||||
+#define ltq_gbit_r32(x) ltq_r32(ltq_gbit_membase + (x))
|
||||
+#define ltq_gbit_w32(x, y) ltq_w32(x, ltq_gbit_membase + (y))
|
||||
+#define ltq_gbit_w32_mask(x, y, z) \
|
||||
+ ltq_w32_mask(x, y, ltq_gbit_membase + (z))
|
||||
+
|
||||
#define DRV_VERSION "1.0"
|
||||
|
||||
static void __iomem *ltq_etop_membase;
|
||||
+static void __iomem *ltq_gbit_membase;
|
||||
|
||||
struct ltq_etop_chan {
|
||||
int idx;
|
||||
@@ -108,6 +148,9 @@
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
+static int ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr,
|
||||
+ int phy_reg, u16 phy_data);
|
||||
+
|
||||
static int
|
||||
ltq_etop_alloc_skb(struct ltq_etop_chan *ch)
|
||||
{
|
||||
@@ -209,7 +252,7 @@
|
||||
ltq_etop_dma_irq(int irq, void *_priv)
|
||||
{
|
||||
struct ltq_etop_priv *priv = _priv;
|
||||
- int ch = irq - LTQ_DMA_CH0_INT;
|
||||
+ int ch = irq - LTQ_DMA_ETOP;
|
||||
|
||||
napi_schedule(&priv->ch[ch].napi);
|
||||
return IRQ_HANDLED;
|
||||
@@ -242,26 +285,66 @@
|
||||
ltq_etop_free_channel(dev, &priv->ch[i]);
|
||||
}
|
||||
|
||||
+static void
|
||||
+ltq_etop_gbit_init(void)
|
||||
+{
|
||||
+ ltq_pmu_enable(PMU_SWITCH);
|
||||
+
|
||||
+ ltq_gpio_request(42, 1, 0, 1, "MDIO");
|
||||
+ ltq_gpio_request(43, 1, 0, 1, "MDC");
|
||||
+
|
||||
+ ltq_gbit_w32_mask(0, GCTL0_SE, LTQ_GBIT_GCTL0);
|
||||
+ /** Disable MDIO auto polling mode */
|
||||
+ ltq_gbit_w32_mask(0, PX_CTL_DMDIO, LTQ_GBIT_P0_CTL);
|
||||
+ /* set 1522 packet size */
|
||||
+ ltq_gbit_w32_mask(0x300, 0, LTQ_GBIT_GCTL0);
|
||||
+ /* disable pmac & dmac headers */
|
||||
+ ltq_gbit_w32_mask(PMAC_HD_CTL_AS | PMAC_HD_CTL_RXSH, 0,
|
||||
+ LTQ_GBIT_PMAC_HD_CTL);
|
||||
+ /* Due to traffic halt when burst length 8,
|
||||
+ replace default IPG value with 0x3B */
|
||||
+ ltq_gbit_w32(0x3B, LTQ_GBIT_PMAC_RX_IPG);
|
||||
+}
|
||||
+
|
||||
static int
|
||||
ltq_etop_hw_init(struct net_device *dev)
|
||||
{
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
+ unsigned int mii_mode = priv->pldata->mii_mode;
|
||||
int i;
|
||||
|
||||
ltq_pmu_enable(PMU_PPE);
|
||||
|
||||
- switch (priv->pldata->mii_mode) {
|
||||
+ if (ltq_has_gbit()) {
|
||||
+ ltq_etop_gbit_init();
|
||||
+ }
|
||||
+
|
||||
+ switch (mii_mode) {
|
||||
+ case PHY_INTERFACE_MODE_RGMII:
|
||||
case PHY_INTERFACE_MODE_RMII:
|
||||
ltq_etop_w32_mask(ETOP_MII_MASK,
|
||||
ETOP_MII_REVERSE, LTQ_ETOP_CFG);
|
||||
break;
|
||||
|
||||
+ case PHY_INTERFACE_MODE_GMII:
|
||||
case PHY_INTERFACE_MODE_MII:
|
||||
ltq_etop_w32_mask(ETOP_MII_MASK,
|
||||
ETOP_MII_NORMAL, LTQ_ETOP_CFG);
|
||||
break;
|
||||
|
||||
default:
|
||||
+ if (ltq_is_ase()) {
|
||||
+ ltq_pmu_enable(PMU_EPHY);
|
||||
+ /* disable external MII */
|
||||
+ ltq_etop_w32_mask(0, ETOP_CFG_MII0, LTQ_ETOP_CFG);
|
||||
+ /* enable clock for internal PHY */
|
||||
+ ltq_cgu_enable(CGU_EPHY);
|
||||
+ /* we need to write this magic to the internal phy to
|
||||
+ make it work */
|
||||
+ ltq_etop_mdio_wr(NULL, 0x8, 0x12, 0xC020);
|
||||
+ pr_info("Selected EPHY mode\n");
|
||||
+ break;
|
||||
+ }
|
||||
netdev_err(dev, "unknown mii mode %d\n",
|
||||
priv->pldata->mii_mode);
|
||||
return -ENOTSUPP;
|
||||
@@ -273,7 +356,7 @@
|
||||
ltq_dma_init_port(DMA_PORT_ETOP);
|
||||
|
||||
for (i = 0; i < MAX_DMA_CHAN; i++) {
|
||||
- int irq = LTQ_DMA_CH0_INT + i;
|
||||
+ int irq = LTQ_DMA_ETOP + i;
|
||||
struct ltq_etop_chan *ch = &priv->ch[i];
|
||||
|
||||
ch->idx = ch->dma.nr = i;
|
||||
@@ -337,6 +420,39 @@
|
||||
};
|
||||
|
||||
static int
|
||||
+ltq_etop_mdio_wr_xr9(struct mii_bus *bus, int phy_addr,
|
||||
+ int phy_reg, u16 phy_data)
|
||||
+{
|
||||
+ u32 val = MDIO_XR9_REQUEST | MDIO_XR9_WRITE |
|
||||
+ (phy_data << MDIO_XR9_WR_OFFSET) |
|
||||
+ ((phy_addr & MDIO_XR9_ADDR_MASK) << MDIO_XR9_ADDR_OFFSET) |
|
||||
+ ((phy_reg & MDIO_XR9_REG_MASK) << MDIO_XR9_REG_OFFSET);
|
||||
+
|
||||
+ while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST)
|
||||
+ ;
|
||||
+ ltq_gbit_w32(val, LTQ_GBIT_MDIO_CTL);
|
||||
+ while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST)
|
||||
+ ;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ltq_etop_mdio_rd_xr9(struct mii_bus *bus, int phy_addr, int phy_reg)
|
||||
+{
|
||||
+ u32 val = MDIO_XR9_REQUEST | MDIO_XR9_READ |
|
||||
+ ((phy_addr & MDIO_XR9_ADDR_MASK) << MDIO_XR9_ADDR_OFFSET) |
|
||||
+ ((phy_reg & MDIO_XR9_REG_MASK) << MDIO_XR9_REG_OFFSET);
|
||||
+
|
||||
+ while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST)
|
||||
+ ;
|
||||
+ ltq_gbit_w32(val, LTQ_GBIT_MDIO_CTL);
|
||||
+ while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST)
|
||||
+ ;
|
||||
+ val = ltq_gbit_r32(LTQ_GBIT_MDIO_DATA) & MDIO_XR9_RD_MASK;
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, int phy_reg, u16 phy_data)
|
||||
{
|
||||
u32 val = MDIO_REQUEST |
|
||||
@@ -377,14 +493,11 @@
|
||||
{
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
struct phy_device *phydev = NULL;
|
||||
- int phy_addr;
|
||||
|
||||
- for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
|
||||
- if (priv->mii_bus->phy_map[phy_addr]) {
|
||||
- phydev = priv->mii_bus->phy_map[phy_addr];
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
+ if (ltq_is_ase())
|
||||
+ phydev = priv->mii_bus->phy_map[8];
|
||||
+ else
|
||||
+ phydev = priv->mii_bus->phy_map[0];
|
||||
|
||||
if (!phydev) {
|
||||
netdev_err(dev, "no PHY found\n");
|
||||
@@ -406,6 +519,9 @@
|
||||
| SUPPORTED_Autoneg
|
||||
| SUPPORTED_MII
|
||||
| SUPPORTED_TP);
|
||||
+ if (ltq_has_gbit())
|
||||
+ phydev->supported &= SUPPORTED_1000baseT_Half
|
||||
+ | SUPPORTED_1000baseT_Full;
|
||||
|
||||
phydev->advertising = phydev->supported;
|
||||
priv->phydev = phydev;
|
||||
@@ -431,8 +547,13 @@
|
||||
}
|
||||
|
||||
priv->mii_bus->priv = dev;
|
||||
- priv->mii_bus->read = ltq_etop_mdio_rd;
|
||||
- priv->mii_bus->write = ltq_etop_mdio_wr;
|
||||
+ if (ltq_has_gbit()) {
|
||||
+ priv->mii_bus->read = ltq_etop_mdio_rd_xr9;
|
||||
+ priv->mii_bus->write = ltq_etop_mdio_wr_xr9;
|
||||
+ } else {
|
||||
+ priv->mii_bus->read = ltq_etop_mdio_rd;
|
||||
+ priv->mii_bus->write = ltq_etop_mdio_wr;
|
||||
+ }
|
||||
priv->mii_bus->name = "ltq_mii";
|
||||
snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
|
||||
priv->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
|
||||
@@ -522,9 +643,9 @@
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
struct ltq_etop_chan *ch = &priv->ch[(queue << 1) | 1];
|
||||
struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
|
||||
- int len;
|
||||
unsigned long flags;
|
||||
u32 byte_offset;
|
||||
+ int len;
|
||||
|
||||
len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
|
||||
|
||||
@@ -698,7 +819,7 @@
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct ltq_etop_priv *priv;
|
||||
- struct resource *res;
|
||||
+ struct resource *res, *gbit_res;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
@@ -726,6 +847,23 @@
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
+ if (ltq_has_gbit()) {
|
||||
+ gbit_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
+ if (!gbit_res) {
|
||||
+ dev_err(&pdev->dev, "failed to get gbit resource\n");
|
||||
+ err = -ENOENT;
|
||||
+ goto err_out;
|
||||
+ }
|
||||
+ ltq_gbit_membase = devm_ioremap_nocache(&pdev->dev,
|
||||
+ gbit_res->start, resource_size(gbit_res));
|
||||
+ if (!ltq_gbit_membase) {
|
||||
+ dev_err(&pdev->dev, "failed to remap gigabit switch %d\n",
|
||||
+ pdev->id);
|
||||
+ err = -ENOMEM;
|
||||
+ goto err_out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
dev = alloc_etherdev_mq(sizeof(struct ltq_etop_priv), 4);
|
||||
strcpy(dev->name, "eth%d");
|
||||
dev->netdev_ops = <q_eth_netdev_ops;
|
|
@ -0,0 +1,267 @@
|
|||
From e2d5b4ba92289cb0fcc9db741d159ef5eb852d9f Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sat, 27 Aug 2011 20:08:14 +0200
|
||||
Subject: [PATCH 16/24] MIPS: lantiq: adds xway nand driver
|
||||
|
||||
This patch adds a nand driver for XWAY SoCs. The patch makes use of the
|
||||
plat_nand driver. As with the EBU NOR driver merged in 3.0, we have the
|
||||
endianess swap problem on read. To workaround this problem we make the
|
||||
read_byte() callback available via the plat_nand driver causing the nand
|
||||
layer to do byte reads.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
|
||||
TODO : memory ranges
|
||||
cs lines
|
||||
plat dev
|
||||
ebu2 and not ebu1 ?
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 2 +
|
||||
arch/mips/lantiq/xway/Makefile | 2 +-
|
||||
arch/mips/lantiq/xway/nand.c | 185 ++++++++++++++++++++
|
||||
drivers/mtd/nand/plat_nand.c | 1 +
|
||||
include/linux/mtd/nand.h | 1 +
|
||||
5 files changed, 190 insertions(+), 1 deletions(-)
|
||||
create mode 100644 arch/mips/lantiq/xway/nand.c
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
index 86ed0d2..729dfa2 100644
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
@@ -140,6 +140,8 @@
|
||||
/* register access macros for EBU and CGU */
|
||||
#define ltq_ebu_w32(x, y) ltq_w32((x), ltq_ebu_membase + (y))
|
||||
#define ltq_ebu_r32(x) ltq_r32(ltq_ebu_membase + (x))
|
||||
+#define ltq_ebu_w32_mask(x, y, z) \
|
||||
+ ltq_w32_mask(x, y, ltq_ebu_membase + (z))
|
||||
#define ltq_cgu_w32(x, y) ltq_w32((x), ltq_cgu_membase + (y))
|
||||
#define ltq_cgu_r32(x) ltq_r32(ltq_cgu_membase + (x))
|
||||
|
||||
diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
|
||||
index 6678402..ac7cc34 100644
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -1,4 +1,4 @@
|
||||
-obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o
|
||||
+obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o
|
||||
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
|
||||
diff --git a/arch/mips/lantiq/xway/nand.c b/arch/mips/lantiq/xway/nand.c
|
||||
new file mode 100644
|
||||
index 0000000..ba2443c
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/nand.c
|
||||
@@ -0,0 +1,185 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/mtd/nand.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+#include <lantiq_irq.h>
|
||||
+#include <lantiq_platform.h>
|
||||
+
|
||||
+#include "devices.h"
|
||||
+
|
||||
+/* nand registers */
|
||||
+#define LTQ_EBU_NAND_WAIT 0xB4
|
||||
+#define LTQ_EBU_NAND_ECC0 0xB8
|
||||
+#define LTQ_EBU_NAND_ECC_AC 0xBC
|
||||
+#define LTQ_EBU_NAND_CON 0xB0
|
||||
+#define LTQ_EBU_ADDSEL1 0x24
|
||||
+
|
||||
+/* gpio definitions */
|
||||
+#define PIN_ALE 13
|
||||
+#define PIN_CLE 24
|
||||
+#define PIN_CS1 23
|
||||
+#define PIN_RDY 48 /* NFLASH_READY */
|
||||
+#define PIN_RD 49 /* NFLASH_READ_N */
|
||||
+
|
||||
+#define NAND_CMD_ALE (1 << 2)
|
||||
+#define NAND_CMD_CLE (1 << 3)
|
||||
+#define NAND_CMD_CS (1 << 4)
|
||||
+#define NAND_WRITE_CMD_RESET 0xff
|
||||
+#define NAND_WRITE_CMD (NAND_CMD_CS | NAND_CMD_CLE)
|
||||
+#define NAND_WRITE_ADDR (NAND_CMD_CS | NAND_CMD_ALE)
|
||||
+#define NAND_WRITE_DATA (NAND_CMD_CS)
|
||||
+#define NAND_READ_DATA (NAND_CMD_CS)
|
||||
+#define NAND_WAIT_WR_C (1 << 3)
|
||||
+#define NAND_WAIT_RD (0x1)
|
||||
+
|
||||
+#define ADDSEL1_MASK(x) (x << 4)
|
||||
+#define ADDSEL1_REGEN 1
|
||||
+#define BUSCON1_SETUP (1 << 22)
|
||||
+#define BUSCON1_BCGEN_RES (0x3 << 12)
|
||||
+#define BUSCON1_WAITWRC2 (2 << 8)
|
||||
+#define BUSCON1_WAITRDC2 (2 << 6)
|
||||
+#define BUSCON1_HOLDC1 (1 << 4)
|
||||
+#define BUSCON1_RECOVC1 (1 << 2)
|
||||
+#define BUSCON1_CMULT4 1
|
||||
+#define NAND_CON_NANDM 1
|
||||
+#define NAND_CON_CSMUX (1 << 1)
|
||||
+#define NAND_CON_CS_P (1 << 4)
|
||||
+#define NAND_CON_SE_P (1 << 5)
|
||||
+#define NAND_CON_WP_P (1 << 6)
|
||||
+#define NAND_CON_PRE_P (1 << 7)
|
||||
+#define NAND_CON_IN_CS0 0
|
||||
+#define NAND_CON_OUT_CS0 0
|
||||
+#define NAND_CON_IN_CS1 (1 << 8)
|
||||
+#define NAND_CON_OUT_CS1 (1 << 10)
|
||||
+#define NAND_CON_CE (1 << 20)
|
||||
+
|
||||
+#define NAND_BASE_ADDRESS (KSEG1 | 0x14000000)
|
||||
+
|
||||
+static const char *part_probes[] = { "cmdlinepart", NULL };
|
||||
+
|
||||
+static void
|
||||
+xway_select_chip(struct mtd_info *mtd, int chip)
|
||||
+{
|
||||
+ switch (chip) {
|
||||
+ case -1:
|
||||
+ ltq_ebu_w32_mask(NAND_CON_CE, 0, LTQ_EBU_NAND_CON);
|
||||
+ ltq_ebu_w32_mask(NAND_CON_NANDM, 0, LTQ_EBU_NAND_CON);
|
||||
+ break;
|
||||
+ case 0:
|
||||
+ ltq_ebu_w32_mask(0, NAND_CON_NANDM, LTQ_EBU_NAND_CON);
|
||||
+ ltq_ebu_w32_mask(0, NAND_CON_CE, LTQ_EBU_NAND_CON);
|
||||
+ /* reset the nand chip */
|
||||
+ while((ltq_ebu_r32(LTQ_EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0);
|
||||
+ ltq_w32(NAND_WRITE_CMD_RESET, ((u32*)(NAND_BASE_ADDRESS | NAND_WRITE_CMD)));
|
||||
+ break;
|
||||
+ default:
|
||||
+ BUG();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+xway_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
|
||||
+{
|
||||
+ struct nand_chip *this = mtd->priv;
|
||||
+
|
||||
+ if (ctrl & NAND_CTRL_CHANGE) {
|
||||
+ if(ctrl & NAND_CLE)
|
||||
+ this->IO_ADDR_W = (void __iomem *)(NAND_BASE_ADDRESS | NAND_WRITE_CMD);
|
||||
+ else if(ctrl & NAND_ALE)
|
||||
+ this->IO_ADDR_W = (void __iomem *)(NAND_BASE_ADDRESS | NAND_WRITE_ADDR);
|
||||
+ }
|
||||
+
|
||||
+ if(data != NAND_CMD_NONE) {
|
||||
+ *(volatile u8*)((u32)this->IO_ADDR_W) = data;
|
||||
+ while((ltq_ebu_r32(LTQ_EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+xway_dev_ready(struct mtd_info *mtd)
|
||||
+{
|
||||
+ return ltq_ebu_r32(LTQ_EBU_NAND_WAIT) & NAND_WAIT_RD;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+nand_write(unsigned int addr, unsigned int val)
|
||||
+{
|
||||
+ ltq_w32(val, ((u32*)(NAND_BASE_ADDRESS | addr)));
|
||||
+ while((ltq_ebu_r32(LTQ_EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0);
|
||||
+}
|
||||
+
|
||||
+unsigned char
|
||||
+ltq_nand_read_byte(struct mtd_info *mtd)
|
||||
+{
|
||||
+ return ltq_r8((void __iomem *)(NAND_BASE_ADDRESS | (NAND_READ_DATA)));
|
||||
+}
|
||||
+
|
||||
+int xway_nand_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+// ltq_gpio_request(PIN_CS1, 1, 0, 1, "NAND_CS1");
|
||||
+ ltq_gpio_request(PIN_CLE, 1, 0, 1, "NAND_CLE");
|
||||
+ ltq_gpio_request(PIN_ALE, 1, 0, 1, "NAND_ALE");
|
||||
+ if (ltq_is_ar9() || ltq_is_vr9()) {
|
||||
+ ltq_gpio_request(PIN_RDY, 1, 0, 0, "NAND_BSY");
|
||||
+ ltq_gpio_request(PIN_RD, 1, 0, 1, "NAND_RD");
|
||||
+ }
|
||||
+
|
||||
+ ltq_ebu_w32((NAND_BASE_ADDRESS & 0x1fffff00)
|
||||
+ | ADDSEL1_MASK(3) | ADDSEL1_REGEN, LTQ_EBU_ADDSEL1);
|
||||
+
|
||||
+ ltq_ebu_w32(BUSCON1_SETUP | BUSCON1_BCGEN_RES | BUSCON1_WAITWRC2
|
||||
+ | BUSCON1_WAITRDC2 | BUSCON1_HOLDC1 | BUSCON1_RECOVC1
|
||||
+ | BUSCON1_CMULT4, LTQ_EBU_BUSCON1);
|
||||
+
|
||||
+ ltq_ebu_w32(NAND_CON_NANDM | NAND_CON_CSMUX | NAND_CON_CS_P
|
||||
+ | NAND_CON_SE_P | NAND_CON_WP_P | NAND_CON_PRE_P
|
||||
+ | NAND_CON_IN_CS0 | NAND_CON_OUT_CS0, LTQ_EBU_NAND_CON);
|
||||
+
|
||||
+ ltq_w32(NAND_WRITE_CMD_RESET, ((u32*)(NAND_BASE_ADDRESS | NAND_WRITE_CMD)));
|
||||
+ while((ltq_ebu_r32(LTQ_EBU_NAND_WAIT) & NAND_WAIT_WR_C) == 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_nand_data falcon_flash_nand_data = {
|
||||
+ .chip = {
|
||||
+ .nr_chips = 1,
|
||||
+ .chip_delay = 30,
|
||||
+ .part_probe_types = part_probes,
|
||||
+ },
|
||||
+ .ctrl = {
|
||||
+ .probe = xway_nand_probe,
|
||||
+ .cmd_ctrl = xway_cmd_ctrl,
|
||||
+ .dev_ready = xway_dev_ready,
|
||||
+ .select_chip = xway_select_chip,
|
||||
+ .read_byte = ltq_nand_read_byte,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct resource ltq_nand_res =
|
||||
+ MEM_RES("nand", 0x14000000, 0x3ffffff);
|
||||
+
|
||||
+static struct platform_device ltq_flash_nand = {
|
||||
+ .name = "gen_nand",
|
||||
+ .id = -1,
|
||||
+ .num_resources = 1,
|
||||
+ .resource = <q_nand_res,
|
||||
+ .dev = {
|
||||
+ .platform_data = &falcon_flash_nand_data,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+xway_register_nand(void)
|
||||
+{
|
||||
+ platform_device_register(<q_flash_nand);
|
||||
+}
|
||||
diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c
|
||||
index 633c04b..c3e3ef6 100644
|
||||
--- a/drivers/mtd/nand/plat_nand.c
|
||||
+++ b/drivers/mtd/nand/plat_nand.c
|
||||
@@ -77,6 +77,7 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
|
||||
data->chip.select_chip = pdata->ctrl.select_chip;
|
||||
data->chip.write_buf = pdata->ctrl.write_buf;
|
||||
data->chip.read_buf = pdata->ctrl.read_buf;
|
||||
+ data->chip.read_byte = pdata->ctrl.read_byte;
|
||||
data->chip.chip_delay = pdata->chip.chip_delay;
|
||||
data->chip.options |= pdata->chip.options;
|
||||
|
||||
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
|
||||
index c2b9ac4..597e1a0 100644
|
||||
--- a/include/linux/mtd/nand.h
|
||||
+++ b/include/linux/mtd/nand.h
|
||||
@@ -656,6 +656,7 @@ struct platform_nand_ctrl {
|
||||
void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);
|
||||
void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len);
|
||||
void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len);
|
||||
+ unsigned char (*read_byte)(struct mtd_info *mtd);
|
||||
void *priv;
|
||||
};
|
||||
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,3 +1,190 @@
|
|||
From 45dbb232686978816e8148753e12f27caa2b2eb3 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 17:16:38 +0200
|
||||
Subject: [PATCH 17/24] MIPS: lantiq: adds GPTU driver
|
||||
|
||||
---
|
||||
arch/mips/include/asm/mach-lantiq/lantiq_timer.h | 155 ++++
|
||||
arch/mips/lantiq/xway/Makefile | 2 +-
|
||||
arch/mips/lantiq/xway/timer.c | 830 ++++++++++++++++++++++
|
||||
3 files changed, 986 insertions(+), 1 deletions(-)
|
||||
create mode 100644 arch/mips/include/asm/mach-lantiq/lantiq_timer.h
|
||||
create mode 100644 arch/mips/lantiq/xway/timer.c
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-lantiq/lantiq_timer.h b/arch/mips/include/asm/mach-lantiq/lantiq_timer.h
|
||||
new file mode 100644
|
||||
index 0000000..ef564ab
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/lantiq_timer.h
|
||||
@@ -0,0 +1,155 @@
|
||||
+#ifndef __DANUBE_GPTU_DEV_H__2005_07_26__10_19__
|
||||
+#define __DANUBE_GPTU_DEV_H__2005_07_26__10_19__
|
||||
+
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ Copyright (c) 2002, Infineon Technologies. All rights reserved.
|
||||
+
|
||||
+ No Warranty
|
||||
+ Because the program is licensed free of charge, there is no warranty for
|
||||
+ the program, to the extent permitted by applicable law. Except when
|
||||
+ otherwise stated in writing the copyright holders and/or other parties
|
||||
+ provide the program "as is" without warranty of any kind, either
|
||||
+ expressed or implied, including, but not limited to, the implied
|
||||
+ warranties of merchantability and fitness for a particular purpose. The
|
||||
+ entire risk as to the quality and performance of the program is with
|
||||
+ you. should the program prove defective, you assume the cost of all
|
||||
+ necessary servicing, repair or correction.
|
||||
+
|
||||
+ In no event unless required by applicable law or agreed to in writing
|
||||
+ will any copyright holder, or any other party who may modify and/or
|
||||
+ redistribute the program as permitted above, be liable to you for
|
||||
+ damages, including any general, special, incidental or consequential
|
||||
+ damages arising out of the use or inability to use the program
|
||||
+ (including but not limited to loss of data or data being rendered
|
||||
+ inaccurate or losses sustained by you or third parties or a failure of
|
||||
+ the program to operate with any other programs), even if such holder or
|
||||
+ other party has been advised of the possibility of such damages.
|
||||
+******************************************************************************/
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * ####################################
|
||||
+ * Definition
|
||||
+ * ####################################
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * Available Timer/Counter Index
|
||||
+ */
|
||||
+#define TIMER(n, X) (n * 2 + (X ? 1 : 0))
|
||||
+#define TIMER_ANY 0x00
|
||||
+#define TIMER1A TIMER(1, 0)
|
||||
+#define TIMER1B TIMER(1, 1)
|
||||
+#define TIMER2A TIMER(2, 0)
|
||||
+#define TIMER2B TIMER(2, 1)
|
||||
+#define TIMER3A TIMER(3, 0)
|
||||
+#define TIMER3B TIMER(3, 1)
|
||||
+
|
||||
+/*
|
||||
+ * Flag of Timer/Counter
|
||||
+ * These flags specify the way in which timer is configured.
|
||||
+ */
|
||||
+/* Bit size of timer/counter. */
|
||||
+#define TIMER_FLAG_16BIT 0x0000
|
||||
+#define TIMER_FLAG_32BIT 0x0001
|
||||
+/* Switch between timer and counter. */
|
||||
+#define TIMER_FLAG_TIMER 0x0000
|
||||
+#define TIMER_FLAG_COUNTER 0x0002
|
||||
+/* Stop or continue when overflowing/underflowing. */
|
||||
+#define TIMER_FLAG_ONCE 0x0000
|
||||
+#define TIMER_FLAG_CYCLIC 0x0004
|
||||
+/* Count up or counter down. */
|
||||
+#define TIMER_FLAG_UP 0x0000
|
||||
+#define TIMER_FLAG_DOWN 0x0008
|
||||
+/* Count on specific level or edge. */
|
||||
+#define TIMER_FLAG_HIGH_LEVEL_SENSITIVE 0x0000
|
||||
+#define TIMER_FLAG_LOW_LEVEL_SENSITIVE 0x0040
|
||||
+#define TIMER_FLAG_RISE_EDGE 0x0010
|
||||
+#define TIMER_FLAG_FALL_EDGE 0x0020
|
||||
+#define TIMER_FLAG_ANY_EDGE 0x0030
|
||||
+/* Signal is syncronous to module clock or not. */
|
||||
+#define TIMER_FLAG_UNSYNC 0x0000
|
||||
+#define TIMER_FLAG_SYNC 0x0080
|
||||
+/* Different interrupt handle type. */
|
||||
+#define TIMER_FLAG_NO_HANDLE 0x0000
|
||||
+#if defined(__KERNEL__)
|
||||
+ #define TIMER_FLAG_CALLBACK_IN_IRQ 0x0100
|
||||
+#endif // defined(__KERNEL__)
|
||||
+#define TIMER_FLAG_SIGNAL 0x0300
|
||||
+/* Internal clock source or external clock source */
|
||||
+#define TIMER_FLAG_INT_SRC 0x0000
|
||||
+#define TIMER_FLAG_EXT_SRC 0x1000
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * ioctl Command
|
||||
+ */
|
||||
+#define GPTU_REQUEST_TIMER 0x01 /* General method to setup timer/counter. */
|
||||
+#define GPTU_FREE_TIMER 0x02 /* Free timer/counter. */
|
||||
+#define GPTU_START_TIMER 0x03 /* Start or resume timer/counter. */
|
||||
+#define GPTU_STOP_TIMER 0x04 /* Suspend timer/counter. */
|
||||
+#define GPTU_GET_COUNT_VALUE 0x05 /* Get current count value. */
|
||||
+#define GPTU_CALCULATE_DIVIDER 0x06 /* Calculate timer divider from given freq.*/
|
||||
+#define GPTU_SET_TIMER 0x07 /* Simplified method to setup timer. */
|
||||
+#define GPTU_SET_COUNTER 0x08 /* Simplified method to setup counter. */
|
||||
+
|
||||
+/*
|
||||
+ * Data Type Used to Call ioctl
|
||||
+ */
|
||||
+struct gptu_ioctl_param {
|
||||
+ unsigned int timer; /* In command GPTU_REQUEST_TIMER, GPTU_SET_TIMER, and *
|
||||
+ * GPTU_SET_COUNTER, this field is ID of expected *
|
||||
+ * timer/counter. If it's zero, a timer/counter would *
|
||||
+ * be dynamically allocated and ID would be stored in *
|
||||
+ * this field. *
|
||||
+ * In command GPTU_GET_COUNT_VALUE, this field is *
|
||||
+ * ignored. *
|
||||
+ * In other command, this field is ID of timer/counter *
|
||||
+ * allocated. */
|
||||
+ unsigned int flag; /* In command GPTU_REQUEST_TIMER, GPTU_SET_TIMER, and *
|
||||
+ * GPTU_SET_COUNTER, this field contains flags to *
|
||||
+ * specify how to configure timer/counter. *
|
||||
+ * In command GPTU_START_TIMER, zero indicate start *
|
||||
+ * and non-zero indicate resume timer/counter. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ unsigned long value; /* In command GPTU_REQUEST_TIMER, this field contains *
|
||||
+ * init/reload value. *
|
||||
+ * In command GPTU_SET_TIMER, this field contains *
|
||||
+ * frequency (0.001Hz) of timer. *
|
||||
+ * In command GPTU_GET_COUNT_VALUE, current count *
|
||||
+ * value would be stored in this field. *
|
||||
+ * In command GPTU_CALCULATE_DIVIDER, this field *
|
||||
+ * contains frequency wanted, and after calculation, *
|
||||
+ * divider would be stored in this field to overwrite *
|
||||
+ * the frequency. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ int pid; /* In command GPTU_REQUEST_TIMER and GPTU_SET_TIMER, *
|
||||
+ * if signal is required, this field contains process *
|
||||
+ * ID to which signal would be sent. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ int sig; /* In command GPTU_REQUEST_TIMER and GPTU_SET_TIMER, *
|
||||
+ * if signal is required, this field contains signal *
|
||||
+ * number which would be sent. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * ####################################
|
||||
+ * Data Type
|
||||
+ * ####################################
|
||||
+ */
|
||||
+typedef void (*timer_callback)(unsigned long arg);
|
||||
+
|
||||
+extern int lq_request_timer(unsigned int, unsigned int, unsigned long, unsigned long, unsigned long);
|
||||
+extern int lq_free_timer(unsigned int);
|
||||
+extern int lq_start_timer(unsigned int, int);
|
||||
+extern int lq_stop_timer(unsigned int);
|
||||
+extern int lq_reset_counter_flags(u32 timer, u32 flags);
|
||||
+extern int lq_get_count_value(unsigned int, unsigned long *);
|
||||
+extern u32 lq_cal_divider(unsigned long);
|
||||
+extern int lq_set_timer(unsigned int, unsigned int, int, int, unsigned int, unsigned long, unsigned long);
|
||||
+extern int lq_set_counter(unsigned int timer, unsigned int flag,
|
||||
+ u32 reload, unsigned long arg1, unsigned long arg2);
|
||||
+
|
||||
+#endif /* __DANUBE_GPTU_DEV_H__2005_07_26__10_19__ */
|
||||
diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
|
||||
index ac7cc34..1f41239 100644
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -1,4 +1,4 @@
|
||||
-obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o
|
||||
+obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o timer.o
|
||||
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
|
||||
diff --git a/arch/mips/lantiq/xway/timer.c b/arch/mips/lantiq/xway/timer.c
|
||||
new file mode 100644
|
||||
index 0000000..cac2ea8
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/timer.c
|
||||
@@ -0,0 +1,830 @@
|
||||
|
@ -831,169 +1018,6 @@
|
|||
+
|
||||
+module_init(lq_gptu_init);
|
||||
+module_exit(lq_gptu_exit);
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/lantiq_timer.h
|
||||
@@ -0,0 +1,155 @@
|
||||
+#ifndef __DANUBE_GPTU_DEV_H__2005_07_26__10_19__
|
||||
+#define __DANUBE_GPTU_DEV_H__2005_07_26__10_19__
|
||||
+
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ Copyright (c) 2002, Infineon Technologies. All rights reserved.
|
||||
+
|
||||
+ No Warranty
|
||||
+ Because the program is licensed free of charge, there is no warranty for
|
||||
+ the program, to the extent permitted by applicable law. Except when
|
||||
+ otherwise stated in writing the copyright holders and/or other parties
|
||||
+ provide the program "as is" without warranty of any kind, either
|
||||
+ expressed or implied, including, but not limited to, the implied
|
||||
+ warranties of merchantability and fitness for a particular purpose. The
|
||||
+ entire risk as to the quality and performance of the program is with
|
||||
+ you. should the program prove defective, you assume the cost of all
|
||||
+ necessary servicing, repair or correction.
|
||||
+
|
||||
+ In no event unless required by applicable law or agreed to in writing
|
||||
+ will any copyright holder, or any other party who may modify and/or
|
||||
+ redistribute the program as permitted above, be liable to you for
|
||||
+ damages, including any general, special, incidental or consequential
|
||||
+ damages arising out of the use or inability to use the program
|
||||
+ (including but not limited to loss of data or data being rendered
|
||||
+ inaccurate or losses sustained by you or third parties or a failure of
|
||||
+ the program to operate with any other programs), even if such holder or
|
||||
+ other party has been advised of the possibility of such damages.
|
||||
+******************************************************************************/
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * ####################################
|
||||
+ * Definition
|
||||
+ * ####################################
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * Available Timer/Counter Index
|
||||
+ */
|
||||
+#define TIMER(n, X) (n * 2 + (X ? 1 : 0))
|
||||
+#define TIMER_ANY 0x00
|
||||
+#define TIMER1A TIMER(1, 0)
|
||||
+#define TIMER1B TIMER(1, 1)
|
||||
+#define TIMER2A TIMER(2, 0)
|
||||
+#define TIMER2B TIMER(2, 1)
|
||||
+#define TIMER3A TIMER(3, 0)
|
||||
+#define TIMER3B TIMER(3, 1)
|
||||
+
|
||||
+/*
|
||||
+ * Flag of Timer/Counter
|
||||
+ * These flags specify the way in which timer is configured.
|
||||
+ */
|
||||
+/* Bit size of timer/counter. */
|
||||
+#define TIMER_FLAG_16BIT 0x0000
|
||||
+#define TIMER_FLAG_32BIT 0x0001
|
||||
+/* Switch between timer and counter. */
|
||||
+#define TIMER_FLAG_TIMER 0x0000
|
||||
+#define TIMER_FLAG_COUNTER 0x0002
|
||||
+/* Stop or continue when overflowing/underflowing. */
|
||||
+#define TIMER_FLAG_ONCE 0x0000
|
||||
+#define TIMER_FLAG_CYCLIC 0x0004
|
||||
+/* Count up or counter down. */
|
||||
+#define TIMER_FLAG_UP 0x0000
|
||||
+#define TIMER_FLAG_DOWN 0x0008
|
||||
+/* Count on specific level or edge. */
|
||||
+#define TIMER_FLAG_HIGH_LEVEL_SENSITIVE 0x0000
|
||||
+#define TIMER_FLAG_LOW_LEVEL_SENSITIVE 0x0040
|
||||
+#define TIMER_FLAG_RISE_EDGE 0x0010
|
||||
+#define TIMER_FLAG_FALL_EDGE 0x0020
|
||||
+#define TIMER_FLAG_ANY_EDGE 0x0030
|
||||
+/* Signal is syncronous to module clock or not. */
|
||||
+#define TIMER_FLAG_UNSYNC 0x0000
|
||||
+#define TIMER_FLAG_SYNC 0x0080
|
||||
+/* Different interrupt handle type. */
|
||||
+#define TIMER_FLAG_NO_HANDLE 0x0000
|
||||
+#if defined(__KERNEL__)
|
||||
+ #define TIMER_FLAG_CALLBACK_IN_IRQ 0x0100
|
||||
+#endif // defined(__KERNEL__)
|
||||
+#define TIMER_FLAG_SIGNAL 0x0300
|
||||
+/* Internal clock source or external clock source */
|
||||
+#define TIMER_FLAG_INT_SRC 0x0000
|
||||
+#define TIMER_FLAG_EXT_SRC 0x1000
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * ioctl Command
|
||||
+ */
|
||||
+#define GPTU_REQUEST_TIMER 0x01 /* General method to setup timer/counter. */
|
||||
+#define GPTU_FREE_TIMER 0x02 /* Free timer/counter. */
|
||||
+#define GPTU_START_TIMER 0x03 /* Start or resume timer/counter. */
|
||||
+#define GPTU_STOP_TIMER 0x04 /* Suspend timer/counter. */
|
||||
+#define GPTU_GET_COUNT_VALUE 0x05 /* Get current count value. */
|
||||
+#define GPTU_CALCULATE_DIVIDER 0x06 /* Calculate timer divider from given freq.*/
|
||||
+#define GPTU_SET_TIMER 0x07 /* Simplified method to setup timer. */
|
||||
+#define GPTU_SET_COUNTER 0x08 /* Simplified method to setup counter. */
|
||||
+
|
||||
+/*
|
||||
+ * Data Type Used to Call ioctl
|
||||
+ */
|
||||
+struct gptu_ioctl_param {
|
||||
+ unsigned int timer; /* In command GPTU_REQUEST_TIMER, GPTU_SET_TIMER, and *
|
||||
+ * GPTU_SET_COUNTER, this field is ID of expected *
|
||||
+ * timer/counter. If it's zero, a timer/counter would *
|
||||
+ * be dynamically allocated and ID would be stored in *
|
||||
+ * this field. *
|
||||
+ * In command GPTU_GET_COUNT_VALUE, this field is *
|
||||
+ * ignored. *
|
||||
+ * In other command, this field is ID of timer/counter *
|
||||
+ * allocated. */
|
||||
+ unsigned int flag; /* In command GPTU_REQUEST_TIMER, GPTU_SET_TIMER, and *
|
||||
+ * GPTU_SET_COUNTER, this field contains flags to *
|
||||
+ * specify how to configure timer/counter. *
|
||||
+ * In command GPTU_START_TIMER, zero indicate start *
|
||||
+ * and non-zero indicate resume timer/counter. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ unsigned long value; /* In command GPTU_REQUEST_TIMER, this field contains *
|
||||
+ * init/reload value. *
|
||||
+ * In command GPTU_SET_TIMER, this field contains *
|
||||
+ * frequency (0.001Hz) of timer. *
|
||||
+ * In command GPTU_GET_COUNT_VALUE, current count *
|
||||
+ * value would be stored in this field. *
|
||||
+ * In command GPTU_CALCULATE_DIVIDER, this field *
|
||||
+ * contains frequency wanted, and after calculation, *
|
||||
+ * divider would be stored in this field to overwrite *
|
||||
+ * the frequency. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ int pid; /* In command GPTU_REQUEST_TIMER and GPTU_SET_TIMER, *
|
||||
+ * if signal is required, this field contains process *
|
||||
+ * ID to which signal would be sent. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+ int sig; /* In command GPTU_REQUEST_TIMER and GPTU_SET_TIMER, *
|
||||
+ * if signal is required, this field contains signal *
|
||||
+ * number which would be sent. *
|
||||
+ * In other command, this field is ignored. */
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * ####################################
|
||||
+ * Data Type
|
||||
+ * ####################################
|
||||
+ */
|
||||
+typedef void (*timer_callback)(unsigned long arg);
|
||||
+
|
||||
+extern int lq_request_timer(unsigned int, unsigned int, unsigned long, unsigned long, unsigned long);
|
||||
+extern int lq_free_timer(unsigned int);
|
||||
+extern int lq_start_timer(unsigned int, int);
|
||||
+extern int lq_stop_timer(unsigned int);
|
||||
+extern int lq_reset_counter_flags(u32 timer, u32 flags);
|
||||
+extern int lq_get_count_value(unsigned int, unsigned long *);
|
||||
+extern u32 lq_cal_divider(unsigned long);
|
||||
+extern int lq_set_timer(unsigned int, unsigned int, int, int, unsigned int, unsigned long, unsigned long);
|
||||
+extern int lq_set_counter(unsigned int timer, unsigned int flag,
|
||||
+ u32 reload, unsigned long arg1, unsigned long arg2);
|
||||
+
|
||||
+#endif /* __DANUBE_GPTU_DEV_H__2005_07_26__10_19__ */
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -1,4 +1,4 @@
|
||||
-obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o
|
||||
+obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o timer.o
|
||||
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,3 +1,52 @@
|
|||
From ffd7924fcc69ff146d62f131d72ef18575bf0227 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 30 Sep 2011 14:37:36 +0200
|
||||
Subject: [PATCH 18/24] MIPS: lantiq: adds dwc_otg
|
||||
|
||||
---
|
||||
drivers/usb/Kconfig | 2 +
|
||||
drivers/usb/Makefile | 2 +
|
||||
drivers/usb/core/hub.c | 4 +-
|
||||
drivers/usb/dwc_otg/Kconfig | 37 +
|
||||
drivers/usb/dwc_otg/Makefile | 39 +
|
||||
drivers/usb/dwc_otg/dwc_otg_attr.c | 802 ++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_attr.h | 67 +
|
||||
drivers/usb/dwc_otg/dwc_otg_cil.c | 3025 +++++++++++++++++++++++++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_cil.h | 911 ++++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_cil_ifx.h | 58 +
|
||||
drivers/usb/dwc_otg/dwc_otg_cil_intr.c | 708 ++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_driver.c | 1274 +++++++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_driver.h | 84 +
|
||||
drivers/usb/dwc_otg/dwc_otg_hcd.c | 2870 +++++++++++++++++++++++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_hcd.h | 676 +++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_hcd_intr.c | 1841 +++++++++++++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_hcd_queue.c | 794 ++++++++
|
||||
drivers/usb/dwc_otg/dwc_otg_ifx.c | 100 +
|
||||
drivers/usb/dwc_otg/dwc_otg_ifx.h | 85 +
|
||||
drivers/usb/dwc_otg/dwc_otg_plat.h | 269 +++
|
||||
drivers/usb/dwc_otg/dwc_otg_regs.h | 1797 ++++++++++++++++++
|
||||
21 files changed, 15443 insertions(+), 2 deletions(-)
|
||||
create mode 100644 drivers/usb/dwc_otg/Kconfig
|
||||
create mode 100644 drivers/usb/dwc_otg/Makefile
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_attr.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_attr.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil_ifx.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil_intr.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_driver.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_driver.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd_intr.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd_queue.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_ifx.c
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_ifx.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_plat.h
|
||||
create mode 100644 drivers/usb/dwc_otg/dwc_otg_regs.h
|
||||
|
||||
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
|
||||
index 48f1781..b48c1bd 100644
|
||||
--- a/drivers/usb/Kconfig
|
||||
+++ b/drivers/usb/Kconfig
|
||||
@@ -116,6 +116,8 @@ source "drivers/usb/wusbcore/Kconfig"
|
||||
|
@ -9,6 +58,8 @@
|
|||
source "drivers/usb/musb/Kconfig"
|
||||
|
||||
source "drivers/usb/renesas_usbhs/Kconfig"
|
||||
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
|
||||
index 30ddf8d..ba3b993 100644
|
||||
--- a/drivers/usb/Makefile
|
||||
+++ b/drivers/usb/Makefile
|
||||
@@ -28,6 +28,8 @@ obj-$(CONFIG_USB_C67X00_HCD) += c67x00/
|
||||
|
@ -20,6 +71,27 @@
|
|||
obj-$(CONFIG_USB_ACM) += class/
|
||||
obj-$(CONFIG_USB_PRINTER) += class/
|
||||
obj-$(CONFIG_USB_WDM) += class/
|
||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||
index a428aa0..115ae9a 100644
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -2885,11 +2885,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
||||
udev->ttport = hdev->ttport;
|
||||
} else if (udev->speed != USB_SPEED_HIGH
|
||||
&& hdev->speed == USB_SPEED_HIGH) {
|
||||
- if (!hub->tt.hub) {
|
||||
+/* if (!hub->tt.hub) {
|
||||
dev_err(&udev->dev, "parent hub has no TT\n");
|
||||
retval = -EINVAL;
|
||||
goto fail;
|
||||
- }
|
||||
+ }*/
|
||||
udev->tt = &hub->tt;
|
||||
udev->ttport = port1;
|
||||
}
|
||||
diff --git a/drivers/usb/dwc_otg/Kconfig b/drivers/usb/dwc_otg/Kconfig
|
||||
new file mode 100644
|
||||
index 0000000..e018490
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/Kconfig
|
||||
@@ -0,0 +1,37 @@
|
||||
|
@ -60,6 +132,9 @@
|
|||
+config DWC_OTG_DEBUG
|
||||
+ bool "Enable debug mode"
|
||||
+ depends on DWC_OTG
|
||||
diff --git a/drivers/usb/dwc_otg/Makefile b/drivers/usb/dwc_otg/Makefile
|
||||
new file mode 100644
|
||||
index 0000000..d4d2355
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/Makefile
|
||||
@@ -0,0 +1,39 @@
|
||||
|
@ -102,6 +177,9 @@
|
|||
+
|
||||
+#obj-$(CONFIG_DWC_OTG_IFX) := dwc_otg_ifx.o
|
||||
+#dwc_otg_ifx-objs := dwc_otg_ifx.o
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_attr.c b/drivers/usb/dwc_otg/dwc_otg_attr.c
|
||||
new file mode 100644
|
||||
index 0000000..4675a5c
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_attr.c
|
||||
@@ -0,0 +1,802 @@
|
||||
|
@ -907,6 +985,9 @@
|
|||
+ device_remove_file(_dev, &dev_attr_rd_reg_test);
|
||||
+ device_remove_file(_dev, &dev_attr_wr_reg_test);
|
||||
+}
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_attr.h b/drivers/usb/dwc_otg/dwc_otg_attr.h
|
||||
new file mode 100644
|
||||
index 0000000..4bbf7df
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_attr.h
|
||||
@@ -0,0 +1,67 @@
|
||||
|
@ -977,6 +1058,9 @@
|
|||
+void dwc_otg_attr_remove (struct device *_dev);
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_cil.c b/drivers/usb/dwc_otg/dwc_otg_cil.c
|
||||
new file mode 100644
|
||||
index 0000000..42c69eb
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_cil.c
|
||||
@@ -0,0 +1,3025 @@
|
||||
|
@ -4005,6 +4089,9 @@
|
|||
+ _cb->p = _p;
|
||||
+}
|
||||
+
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_cil.h b/drivers/usb/dwc_otg/dwc_otg_cil.h
|
||||
new file mode 100644
|
||||
index 0000000..bbb9516
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_cil.h
|
||||
@@ -0,0 +1,911 @@
|
||||
|
@ -4919,6 +5006,9 @@
|
|||
+
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h b/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h
|
||||
new file mode 100644
|
||||
index 0000000..b0298ec
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h
|
||||
@@ -0,0 +1,58 @@
|
||||
|
@ -4980,6 +5070,9 @@
|
|||
+
|
||||
+#endif // __DWC_OTG_CIL_IFX_H__
|
||||
+
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_cil_intr.c b/drivers/usb/dwc_otg/dwc_otg_cil_intr.c
|
||||
new file mode 100644
|
||||
index 0000000..d469ab4
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_cil_intr.c
|
||||
@@ -0,0 +1,708 @@
|
||||
|
@ -5691,6 +5784,9 @@
|
|||
+ }
|
||||
+ return retval;
|
||||
+}
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.c b/drivers/usb/dwc_otg/dwc_otg_driver.c
|
||||
new file mode 100644
|
||||
index 0000000..1b0daab
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_driver.c
|
||||
@@ -0,0 +1,1274 @@
|
||||
|
@ -6968,6 +7064,9 @@
|
|||
+ </td></tr>
|
||||
+
|
||||
+*/
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.h b/drivers/usb/dwc_otg/dwc_otg_driver.h
|
||||
new file mode 100644
|
||||
index 0000000..7e6940d
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_driver.h
|
||||
@@ -0,0 +1,84 @@
|
||||
|
@ -7055,6 +7154,9 @@
|
|||
+//#define dev_dbg(fake, format, arg...) printk(KERN_CRIT __FILE__ ":%d: " format "\n" , __LINE__, ## arg)
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.c b/drivers/usb/dwc_otg/dwc_otg_hcd.c
|
||||
new file mode 100644
|
||||
index 0000000..ad6bc72
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_hcd.c
|
||||
@@ -0,0 +1,2870 @@
|
||||
|
@ -9928,6 +10030,9 @@
|
|||
+#endif
|
||||
+}
|
||||
+#endif /* DWC_DEVICE_ONLY */
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.h b/drivers/usb/dwc_otg/dwc_otg_hcd.h
|
||||
new file mode 100644
|
||||
index 0000000..8a20dff
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_hcd.h
|
||||
@@ -0,0 +1,676 @@
|
||||
|
@ -10607,6 +10712,9 @@
|
|||
+#endif // DEBUG
|
||||
+#endif // __DWC_HCD_H__
|
||||
+#endif /* DWC_DEVICE_ONLY */
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c b/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c
|
||||
new file mode 100644
|
||||
index 0000000..834b5e0
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c
|
||||
@@ -0,0 +1,1841 @@
|
||||
|
@ -12451,6 +12559,9 @@
|
|||
+}
|
||||
+
|
||||
+#endif /* DWC_DEVICE_ONLY */
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c
|
||||
new file mode 100644
|
||||
index 0000000..fcb5ce6
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c
|
||||
@@ -0,0 +1,794 @@
|
||||
|
@ -13248,6 +13359,9 @@
|
|||
+}
|
||||
+
|
||||
+#endif /* DWC_DEVICE_ONLY */
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_ifx.c b/drivers/usb/dwc_otg/dwc_otg_ifx.c
|
||||
new file mode 100644
|
||||
index 0000000..0a4c209
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_ifx.c
|
||||
@@ -0,0 +1,100 @@
|
||||
|
@ -13351,6 +13465,9 @@
|
|||
+void ifx_usb_hc_remove(void)
|
||||
+{
|
||||
+}
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_ifx.h b/drivers/usb/dwc_otg/dwc_otg_ifx.h
|
||||
new file mode 100644
|
||||
index 0000000..402d7a6
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_ifx.h
|
||||
@@ -0,0 +1,85 @@
|
||||
|
@ -13439,6 +13556,9 @@
|
|||
+ ltq_mask_and_ack_irq(&d);
|
||||
+}
|
||||
+#endif //__DWC_OTG_IFX_H__
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_plat.h b/drivers/usb/dwc_otg/dwc_otg_plat.h
|
||||
new file mode 100644
|
||||
index 0000000..727d0c4
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_plat.h
|
||||
@@ -0,0 +1,269 @@
|
||||
|
@ -13711,6 +13831,9 @@
|
|||
+
|
||||
+#endif
|
||||
+
|
||||
diff --git a/drivers/usb/dwc_otg/dwc_otg_regs.h b/drivers/usb/dwc_otg/dwc_otg_regs.h
|
||||
new file mode 100644
|
||||
index 0000000..397a954
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/dwc_otg/dwc_otg_regs.h
|
||||
@@ -0,0 +1,1797 @@
|
||||
|
@ -15511,121 +15634,6 @@
|
|||
+} dwc_otg_host_if_t;
|
||||
+
|
||||
+#endif
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o timer.o
|
||||
-
|
||||
+obj-y += dev-dwc_otg.o
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/dev-dwc_otg.c
|
||||
@@ -0,0 +1,70 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/string.h>
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/reboot.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
+#include <linux/reboot.h>
|
||||
+#include <linux/time.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/leds.h>
|
||||
+
|
||||
+#include <asm/bootinfo.h>
|
||||
+#include <asm/irq.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+#include <lantiq_irq.h>
|
||||
+#include <lantiq_platform.h>
|
||||
+
|
||||
+#define LTQ_USB_IOMEM_BASE 0x1e101000
|
||||
+#define LTQ_USB_IOMEM_SIZE 0x00001000
|
||||
+
|
||||
+static struct resource resources[] =
|
||||
+{
|
||||
+ [0] = {
|
||||
+ .name = "dwc_otg_membase",
|
||||
+ .start = LTQ_USB_IOMEM_BASE,
|
||||
+ .end = LTQ_USB_IOMEM_BASE + LTQ_USB_IOMEM_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ },
|
||||
+ [1] = {
|
||||
+ .name = "dwc_otg_irq",
|
||||
+ .start = LTQ_USB_INT,
|
||||
+ .flags = IORESOURCE_IRQ,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static u64 dwc_dmamask = (u32)0x1fffffff;
|
||||
+
|
||||
+static struct platform_device platform_dev = {
|
||||
+ .name = "dwc_otg",
|
||||
+ .dev = {
|
||||
+ .dma_mask = &dwc_dmamask,
|
||||
+ },
|
||||
+ .resource = resources,
|
||||
+ .num_resources = ARRAY_SIZE(resources),
|
||||
+};
|
||||
+
|
||||
+int __init
|
||||
+xway_register_dwc(int pin)
|
||||
+{
|
||||
+ struct irq_data d;
|
||||
+ d.irq = resources[1].start;
|
||||
+ ltq_enable_irq(&d);
|
||||
+ platform_dev.dev.platform_data = (void*) pin;
|
||||
+ return platform_device_register(&platform_dev);
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/dev-dwc_otg.h
|
||||
@@ -0,0 +1,17 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LTQ_DEV_DWC_H__
|
||||
+#define _LTQ_DEV_DWC_H__
|
||||
+
|
||||
+#include <lantiq_platform.h>
|
||||
+
|
||||
+extern void __init xway_register_dwc(int pin);
|
||||
+
|
||||
+#endif
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -2885,11 +2885,11 @@ hub_port_init (struct usb_hub *hub, stru
|
||||
udev->ttport = hdev->ttport;
|
||||
} else if (udev->speed != USB_SPEED_HIGH
|
||||
&& hdev->speed == USB_SPEED_HIGH) {
|
||||
- if (!hub->tt.hub) {
|
||||
+/* if (!hub->tt.hub) {
|
||||
dev_err(&udev->dev, "parent hub has no TT\n");
|
||||
retval = -EINVAL;
|
||||
goto fail;
|
||||
- }
|
||||
+ }*/
|
||||
udev->tt = &hub->tt;
|
||||
udev->ttport = port1;
|
||||
}
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,6 +1,27 @@
|
|||
From c6c810d83f0d95f54c3a6b338d219cec7ccef4c9 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 20:30:40 +0200
|
||||
Subject: [PATCH 19/24] MIPS: lantiq: adds VPE extensions
|
||||
|
||||
---
|
||||
arch/mips/Kconfig | 22 +++
|
||||
arch/mips/include/asm/mipsmtregs.h | 54 +++++++
|
||||
arch/mips/kernel/Makefile | 3 +-
|
||||
arch/mips/kernel/mips-mt.c | 97 +++++++++++--
|
||||
arch/mips/kernel/mtsched_proc.c | 279 ++++++++++++++++++++++++++++++++++++
|
||||
arch/mips/kernel/perf_proc.c | 191 ++++++++++++++++++++++++
|
||||
arch/mips/kernel/proc.c | 17 +++
|
||||
arch/mips/kernel/smtc.c | 7 +
|
||||
arch/mips/kernel/vpe.c | 250 ++++++++++++++++++++++++++++++++-
|
||||
9 files changed, 905 insertions(+), 15 deletions(-)
|
||||
create mode 100644 arch/mips/kernel/mtsched_proc.c
|
||||
create mode 100644 arch/mips/kernel/perf_proc.c
|
||||
|
||||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
|
||||
index 0cf5bbd..bf1b76d 100644
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1905,6 +1905,28 @@ config MIPS_VPE_LOADER
|
||||
@@ -1903,6 +1903,28 @@ config MIPS_VPE_LOADER
|
||||
Includes a loader for loading an elf relocatable object
|
||||
onto another VPE and running it.
|
||||
|
||||
|
@ -29,6 +50,8 @@
|
|||
config MIPS_MT_SMTC_IM_BACKSTOP
|
||||
bool "Use per-TC register bits as backstop for inhibited IM bits"
|
||||
depends on MIPS_MT_SMTC
|
||||
diff --git a/arch/mips/include/asm/mipsmtregs.h b/arch/mips/include/asm/mipsmtregs.h
|
||||
index c9420aa..04bfb4b 100644
|
||||
--- a/arch/mips/include/asm/mipsmtregs.h
|
||||
+++ b/arch/mips/include/asm/mipsmtregs.h
|
||||
@@ -28,14 +28,34 @@
|
||||
|
@ -138,9 +161,11 @@
|
|||
|
||||
/* GPR */
|
||||
#define read_tc_gpr_sp() mftgpr(29)
|
||||
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
|
||||
index 83bba33..53a9a0a 100644
|
||||
--- a/arch/mips/kernel/Makefile
|
||||
+++ b/arch/mips/kernel/Makefile
|
||||
@@ -86,7 +86,8 @@ obj-$(CONFIG_MIPS32_O32) += binfmt_elfo3
|
||||
@@ -86,7 +86,8 @@ obj-$(CONFIG_MIPS32_O32) += binfmt_elfo32.o scall64-o32.o
|
||||
|
||||
obj-$(CONFIG_KGDB) += kgdb.o
|
||||
obj-$(CONFIG_PROC_FS) += proc.o
|
||||
|
@ -150,6 +175,8 @@
|
|||
obj-$(CONFIG_64BIT) += cpu-bugs64.o
|
||||
|
||||
obj-$(CONFIG_I8253) += i8253.o
|
||||
diff --git a/arch/mips/kernel/mips-mt.c b/arch/mips/kernel/mips-mt.c
|
||||
index 594ca69..ad912fc 100644
|
||||
--- a/arch/mips/kernel/mips-mt.c
|
||||
+++ b/arch/mips/kernel/mips-mt.c
|
||||
@@ -21,26 +21,96 @@
|
||||
|
@ -254,7 +281,7 @@
|
|||
|
||||
/*
|
||||
* Dump new MIPS MT state for the core. Does not leave TCs halted.
|
||||
@@ -78,18 +148,18 @@ void mips_mt_regdump(unsigned long mvpct
|
||||
@@ -78,18 +148,18 @@ void mips_mt_regdump(unsigned long mvpctl)
|
||||
if ((read_tc_c0_tcbind() & TCBIND_CURVPE) == i) {
|
||||
printk(" VPE %d\n", i);
|
||||
printk(" VPEControl : %08lx\n",
|
||||
|
@ -290,417 +317,9 @@
|
|||
}
|
||||
|
||||
/*
|
||||
--- a/arch/mips/kernel/proc.c
|
||||
+++ b/arch/mips/kernel/proc.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
+#include <linux/proc_fs.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpu-features.h>
|
||||
@@ -110,3 +111,19 @@ const struct seq_operations cpuinfo_op =
|
||||
.stop = c_stop,
|
||||
.show = show_cpuinfo,
|
||||
};
|
||||
+
|
||||
+/*
|
||||
+ * Support for MIPS/local /proc hooks in /proc/mips/
|
||||
+ */
|
||||
+
|
||||
+static struct proc_dir_entry *mips_proc = NULL;
|
||||
+
|
||||
+struct proc_dir_entry *get_mips_proc_dir(void)
|
||||
+{
|
||||
+ /*
|
||||
+ * This ought not to be preemptable.
|
||||
+ */
|
||||
+ if(mips_proc == NULL)
|
||||
+ mips_proc = proc_mkdir("mips", NULL);
|
||||
+ return(mips_proc);
|
||||
+}
|
||||
--- a/arch/mips/kernel/smtc.c
|
||||
+++ b/arch/mips/kernel/smtc.c
|
||||
@@ -1334,6 +1334,13 @@ void smtc_get_new_mmu_context(struct mm_
|
||||
asid = asid_cache(cpu);
|
||||
|
||||
do {
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ /* If TLB is shared between AP and RP (AP is running SMTC),
|
||||
+ leave out max ASID i.e., ASID_MASK for RP
|
||||
+ */
|
||||
+ if (!nostlb && ((asid & ASID_MASK) == (ASID_MASK - 1)))
|
||||
+ asid++;
|
||||
+#endif
|
||||
if (!((asid += ASID_INC) & ASID_MASK) ) {
|
||||
if (cpu_has_vtag_icache)
|
||||
flush_icache_all();
|
||||
--- a/arch/mips/kernel/vpe.c
|
||||
+++ b/arch/mips/kernel/vpe.c
|
||||
@@ -76,6 +76,58 @@ static struct kspd_notifications kspd_ev
|
||||
static int kspd_events_reqd;
|
||||
#endif
|
||||
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+static int is_sdepgm;
|
||||
+extern int stlb;
|
||||
+extern int vpe0_wired;
|
||||
+extern int vpe1_wired;
|
||||
+unsigned int vpe1_load_addr;
|
||||
+
|
||||
+static int __init load_address(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_load_addr);
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("vpe1_load_addr=", load_address);
|
||||
+
|
||||
+#include <asm/mipsmtregs.h>
|
||||
+#define write_vpe_c0_wired(val) mttc0(6, 0, val)
|
||||
+
|
||||
+#ifndef COMMAND_LINE_SIZE
|
||||
+# define COMMAND_LINE_SIZE 512
|
||||
+#endif
|
||||
+
|
||||
+char command_line[COMMAND_LINE_SIZE * 2];
|
||||
+
|
||||
+static unsigned int vpe1_mem;
|
||||
+static int __init vpe1mem(char *str)
|
||||
+{
|
||||
+ vpe1_mem = memparse(str, &str);
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("vpe1_mem=", vpe1mem);
|
||||
+
|
||||
+uint32_t vpe1_wdog_ctr;
|
||||
+static int __init wdog_ctr(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_wdog_ctr);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+__setup("vpe1_wdog_ctr_addr=", wdog_ctr);
|
||||
+EXPORT_SYMBOL(vpe1_wdog_ctr);
|
||||
+
|
||||
+uint32_t vpe1_wdog_timeout;
|
||||
+static int __init wdog_timeout(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_wdog_timeout);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+__setup("vpe1_wdog_timeout=", wdog_timeout);
|
||||
+EXPORT_SYMBOL(vpe1_wdog_timeout);
|
||||
+
|
||||
+#endif
|
||||
/* grab the likely amount of memory we will need. */
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
#define P_SIZE (2 * 1024 * 1024)
|
||||
@@ -268,6 +320,13 @@ static void *alloc_progmem(unsigned long
|
||||
void *addr;
|
||||
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ if (vpe1_load_addr) {
|
||||
+ memset((void *)vpe1_load_addr, 0, len);
|
||||
+ return (void *)vpe1_load_addr;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* This means you must tell Linux to use less memory than you
|
||||
* physically have, for example by passing a mem= boot argument.
|
||||
@@ -746,6 +805,12 @@ static int vpe_run(struct vpe * v)
|
||||
}
|
||||
|
||||
/* Write the address we want it to start running from in the TCPC register. */
|
||||
+#if defined(CONFIG_IFX_VPE_EXT) && 0
|
||||
+ if (stlb)
|
||||
+ write_vpe_c0_wired(vpe0_wired + vpe1_wired);
|
||||
+ else
|
||||
+ write_vpe_c0_wired(vpe1_wired);
|
||||
+#endif
|
||||
write_tc_c0_tcrestart((unsigned long)v->__start);
|
||||
write_tc_c0_tccontext((unsigned long)0);
|
||||
|
||||
@@ -759,6 +824,20 @@ static int vpe_run(struct vpe * v)
|
||||
|
||||
write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H);
|
||||
|
||||
+#if defined(CONFIG_IFX_VPE_EXT) && 0
|
||||
+ /*
|
||||
+ * $a2 & $a3 are used to pass command line parameters to VPE1. $a2
|
||||
+ * points to the start of the command line string and $a3 points to
|
||||
+ * the end of the string. This convention is identical to the Linux
|
||||
+ * kernel boot parameter passing mechanism. Please note that $a3 is
|
||||
+ * used to pass physical memory size or 0 in SDE tool kit. So, if you
|
||||
+ * are passing comand line parameters through $a2 & $a3 SDE programs
|
||||
+ * don't work as desired.
|
||||
+ */
|
||||
+ mttgpr(6, command_line);
|
||||
+ mttgpr(7, (command_line + strlen(command_line)));
|
||||
+ if (is_sdepgm)
|
||||
+#endif
|
||||
/*
|
||||
* The sde-kit passes 'memsize' to __start in $a3, so set something
|
||||
* here... Or set $a3 to zero and define DFLT_STACK_SIZE and
|
||||
@@ -833,6 +912,9 @@ static int find_vpe_symbols(struct vpe *
|
||||
if ( (v->__start == 0) || (v->shared_ptr == NULL))
|
||||
return -1;
|
||||
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ is_sdepgm = 1;
|
||||
+#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -994,6 +1076,15 @@ static int vpe_elfload(struct vpe * v)
|
||||
(unsigned long)v->load_addr + v->len);
|
||||
|
||||
if ((find_vpe_symbols(v, sechdrs, symindex, strtab, &mod)) < 0) {
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ if (vpe1_load_addr) {
|
||||
+ /* Conversion to KSEG1 is required ??? */
|
||||
+ v->__start = KSEG1ADDR(vpe1_load_addr);
|
||||
+ is_sdepgm = 0;
|
||||
+ return 0;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (v->__start == 0) {
|
||||
printk(KERN_WARNING "VPE loader: program does not contain "
|
||||
"a __start symbol\n");
|
||||
@@ -1064,6 +1155,9 @@ static int vpe_open(struct inode *inode,
|
||||
struct vpe_notifications *not;
|
||||
struct vpe *v;
|
||||
int ret;
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ int progsize;
|
||||
+#endif
|
||||
|
||||
if (minor != iminor(inode)) {
|
||||
/* assume only 1 device at the moment. */
|
||||
@@ -1089,7 +1183,12 @@ static int vpe_open(struct inode *inode,
|
||||
release_progmem(v->load_addr);
|
||||
cleanup_tc(get_tc(tclimit));
|
||||
}
|
||||
-
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ progsize = (vpe1_mem != 0) ? vpe1_mem : P_SIZE;
|
||||
+ //printk("progsize = %x\n", progsize);
|
||||
+ v->pbuffer = vmalloc(progsize);
|
||||
+ v->plen = progsize;
|
||||
+#else
|
||||
/* this of-course trashes what was there before... */
|
||||
v->pbuffer = vmalloc(P_SIZE);
|
||||
if (!v->pbuffer) {
|
||||
@@ -1097,11 +1196,14 @@ static int vpe_open(struct inode *inode,
|
||||
return -ENOMEM;
|
||||
}
|
||||
v->plen = P_SIZE;
|
||||
+#endif
|
||||
v->load_addr = NULL;
|
||||
v->len = 0;
|
||||
|
||||
+#if 0
|
||||
v->uid = filp->f_cred->fsuid;
|
||||
v->gid = filp->f_cred->fsgid;
|
||||
+#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_APSP_KSPD
|
||||
/* get kspd to tell us when a syscall_exit happens */
|
||||
@@ -1349,6 +1451,133 @@ static void kspd_sp_exit( int sp_id)
|
||||
cleanup_tc(get_tc(sp_id));
|
||||
}
|
||||
#endif
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+int32_t vpe1_sw_start(void* sw_start_addr, uint32_t tcmask, uint32_t flags)
|
||||
+{
|
||||
+ enum vpe_state state;
|
||||
+ struct vpe *v = get_vpe(tclimit);
|
||||
+ struct vpe_notifications *not;
|
||||
+
|
||||
+ if (tcmask || flags) {
|
||||
+ printk(KERN_WARNING "Currently tcmask and flags should be 0.\
|
||||
+ other values not supported\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ state = xchg(&v->state, VPE_STATE_INUSE);
|
||||
+ if (state != VPE_STATE_UNUSED) {
|
||||
+ vpe_stop(v);
|
||||
+
|
||||
+ list_for_each_entry(not, &v->notify, list) {
|
||||
+ not->stop(tclimit);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ v->__start = (unsigned long)sw_start_addr;
|
||||
+ is_sdepgm = 0;
|
||||
+
|
||||
+ if (!vpe_run(v)) {
|
||||
+ printk(KERN_DEBUG "VPE loader: VPE1 running successfully\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_sw_start);
|
||||
+
|
||||
+int32_t vpe1_sw_stop(uint32_t flags)
|
||||
+{
|
||||
+ struct vpe *v = get_vpe(tclimit);
|
||||
+
|
||||
+ if (!vpe_free(v)) {
|
||||
+ printk(KERN_DEBUG "RP Stopped\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ else
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_sw_stop);
|
||||
+
|
||||
+uint32_t vpe1_get_load_addr (uint32_t flags)
|
||||
+{
|
||||
+ return vpe1_load_addr;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_load_addr);
|
||||
+
|
||||
+uint32_t vpe1_get_max_mem (uint32_t flags)
|
||||
+{
|
||||
+ if (!vpe1_mem)
|
||||
+ return P_SIZE;
|
||||
+ else
|
||||
+ return vpe1_mem;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_max_mem);
|
||||
+
|
||||
+void* vpe1_get_cmdline_argument(void)
|
||||
+{
|
||||
+ return saved_command_line;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_cmdline_argument);
|
||||
+
|
||||
+int32_t vpe1_set_boot_param(char *field, char *value, char flags)
|
||||
+{
|
||||
+ char *ptr, string[64];
|
||||
+ int start_off, end_off;
|
||||
+ if (!field)
|
||||
+ return -1;
|
||||
+ strcpy(string, field);
|
||||
+ if (value) {
|
||||
+ strcat(string, "=");
|
||||
+ strcat(string, value);
|
||||
+ strcat(command_line, " ");
|
||||
+ strcat(command_line, string);
|
||||
+ }
|
||||
+ else {
|
||||
+ ptr = strstr(command_line, string);
|
||||
+ if (ptr) {
|
||||
+ start_off = ptr - command_line;
|
||||
+ ptr += strlen(string);
|
||||
+ while ((*ptr != ' ') && (*ptr != '\0'))
|
||||
+ ptr++;
|
||||
+ end_off = ptr - command_line;
|
||||
+ command_line[start_off] = '\0';
|
||||
+ strcat (command_line, command_line+end_off);
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_set_boot_param);
|
||||
+
|
||||
+int32_t vpe1_get_boot_param(char *field, char **value, char flags)
|
||||
+{
|
||||
+ char *ptr, string[64];
|
||||
+ int i = 0;
|
||||
+ if (!field)
|
||||
+ return -1;
|
||||
+ if ((ptr = strstr(command_line, field))) {
|
||||
+ ptr += strlen(field) + 1; /* including = */
|
||||
+ while ((*ptr != ' ') && (*ptr != '\0'))
|
||||
+ string[i++] = *ptr++;
|
||||
+ string[i] = '\0';
|
||||
+ *value = kmalloc((strlen(string) + 1), GFP_KERNEL);
|
||||
+ if (*value != NULL)
|
||||
+ strcpy(*value, string);
|
||||
+ }
|
||||
+ else
|
||||
+ *value = NULL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_boot_param);
|
||||
+
|
||||
+extern void configure_tlb(void);
|
||||
+#endif
|
||||
|
||||
static ssize_t store_kill(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
@@ -1430,6 +1659,18 @@ static int __init vpe_module_init(void)
|
||||
printk("VPE loader: not a MIPS MT capable processor\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+#ifndef CONFIG_MIPS_MT_SMTC
|
||||
+ configure_tlb();
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
+#ifndef CONFIG_MIPS_MT_SMTC
|
||||
+ if (!vpelimit)
|
||||
+ vpelimit = 1;
|
||||
+ if (!tclimit)
|
||||
+ tclimit = 1;
|
||||
+#endif
|
||||
|
||||
if (vpelimit == 0) {
|
||||
printk(KERN_WARNING "No VPEs reserved for AP/SP, not "
|
||||
@@ -1474,10 +1715,12 @@ static int __init vpe_module_init(void)
|
||||
mtflags = dmt();
|
||||
vpflags = dvpe();
|
||||
|
||||
+ back_to_back_c0_hazard();
|
||||
+
|
||||
/* Put MVPE's into 'configuration state' */
|
||||
set_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
|
||||
- /* dump_mtregs(); */
|
||||
+ dump_mtregs();
|
||||
|
||||
val = read_c0_mvpconf0();
|
||||
hw_tcs = (val & MVPCONF0_PTC) + 1;
|
||||
@@ -1489,6 +1732,7 @@ static int __init vpe_module_init(void)
|
||||
* reschedule send IPIs or similar we might hang.
|
||||
*/
|
||||
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
+ back_to_back_c0_hazard();
|
||||
evpe(vpflags);
|
||||
emt(mtflags);
|
||||
local_irq_restore(flags);
|
||||
@@ -1514,6 +1758,7 @@ static int __init vpe_module_init(void)
|
||||
}
|
||||
|
||||
v->ntcs = hw_tcs - tclimit;
|
||||
+ write_tc_c0_tcbind((read_tc_c0_tcbind() & ~TCBIND_CURVPE) | 1);
|
||||
|
||||
/* add the tc to the list of this vpe's tc's. */
|
||||
list_add(&t->tc, &v->tc);
|
||||
@@ -1582,6 +1827,7 @@ static int __init vpe_module_init(void)
|
||||
out_reenable:
|
||||
/* release config state */
|
||||
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
+ back_to_back_c0_hazard();
|
||||
|
||||
evpe(vpflags);
|
||||
emt(mtflags);
|
||||
diff --git a/arch/mips/kernel/mtsched_proc.c b/arch/mips/kernel/mtsched_proc.c
|
||||
new file mode 100644
|
||||
index 0000000..4dafded
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/kernel/mtsched_proc.c
|
||||
@@ -0,0 +1,279 @@
|
||||
|
@ -983,6 +602,9 @@
|
|||
+
|
||||
+/* Automagically create the entry */
|
||||
+module_init(init_mtsched_proc);
|
||||
diff --git a/arch/mips/kernel/perf_proc.c b/arch/mips/kernel/perf_proc.c
|
||||
new file mode 100644
|
||||
index 0000000..7eec015
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/kernel/perf_proc.c
|
||||
@@ -0,0 +1,191 @@
|
||||
|
@ -1177,3 +799,423 @@
|
|||
+
|
||||
+/* Automagically create the entry */
|
||||
+module_init(init_perf_proc);
|
||||
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c
|
||||
index e309665..2de204f 100644
|
||||
--- a/arch/mips/kernel/proc.c
|
||||
+++ b/arch/mips/kernel/proc.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
+#include <linux/proc_fs.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpu-features.h>
|
||||
@@ -110,3 +111,19 @@ const struct seq_operations cpuinfo_op = {
|
||||
.stop = c_stop,
|
||||
.show = show_cpuinfo,
|
||||
};
|
||||
+
|
||||
+/*
|
||||
+ * Support for MIPS/local /proc hooks in /proc/mips/
|
||||
+ */
|
||||
+
|
||||
+static struct proc_dir_entry *mips_proc = NULL;
|
||||
+
|
||||
+struct proc_dir_entry *get_mips_proc_dir(void)
|
||||
+{
|
||||
+ /*
|
||||
+ * This ought not to be preemptable.
|
||||
+ */
|
||||
+ if(mips_proc == NULL)
|
||||
+ mips_proc = proc_mkdir("mips", NULL);
|
||||
+ return(mips_proc);
|
||||
+}
|
||||
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c
|
||||
index f0895e7..199e853 100644
|
||||
--- a/arch/mips/kernel/smtc.c
|
||||
+++ b/arch/mips/kernel/smtc.c
|
||||
@@ -1334,6 +1334,13 @@ void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu)
|
||||
asid = asid_cache(cpu);
|
||||
|
||||
do {
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ /* If TLB is shared between AP and RP (AP is running SMTC),
|
||||
+ leave out max ASID i.e., ASID_MASK for RP
|
||||
+ */
|
||||
+ if (!nostlb && ((asid & ASID_MASK) == (ASID_MASK - 1)))
|
||||
+ asid++;
|
||||
+#endif
|
||||
if (!((asid += ASID_INC) & ASID_MASK) ) {
|
||||
if (cpu_has_vtag_icache)
|
||||
flush_icache_all();
|
||||
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c
|
||||
index 3efcb06..742f24b 100644
|
||||
--- a/arch/mips/kernel/vpe.c
|
||||
+++ b/arch/mips/kernel/vpe.c
|
||||
@@ -76,6 +76,58 @@ static struct kspd_notifications kspd_events;
|
||||
static int kspd_events_reqd;
|
||||
#endif
|
||||
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+static int is_sdepgm;
|
||||
+extern int stlb;
|
||||
+extern int vpe0_wired;
|
||||
+extern int vpe1_wired;
|
||||
+unsigned int vpe1_load_addr;
|
||||
+
|
||||
+static int __init load_address(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_load_addr);
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("vpe1_load_addr=", load_address);
|
||||
+
|
||||
+#include <asm/mipsmtregs.h>
|
||||
+#define write_vpe_c0_wired(val) mttc0(6, 0, val)
|
||||
+
|
||||
+#ifndef COMMAND_LINE_SIZE
|
||||
+# define COMMAND_LINE_SIZE 512
|
||||
+#endif
|
||||
+
|
||||
+char command_line[COMMAND_LINE_SIZE * 2];
|
||||
+
|
||||
+static unsigned int vpe1_mem;
|
||||
+static int __init vpe1mem(char *str)
|
||||
+{
|
||||
+ vpe1_mem = memparse(str, &str);
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("vpe1_mem=", vpe1mem);
|
||||
+
|
||||
+uint32_t vpe1_wdog_ctr;
|
||||
+static int __init wdog_ctr(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_wdog_ctr);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+__setup("vpe1_wdog_ctr_addr=", wdog_ctr);
|
||||
+EXPORT_SYMBOL(vpe1_wdog_ctr);
|
||||
+
|
||||
+uint32_t vpe1_wdog_timeout;
|
||||
+static int __init wdog_timeout(char *str)
|
||||
+{
|
||||
+ get_option(&str, &vpe1_wdog_timeout);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+__setup("vpe1_wdog_timeout=", wdog_timeout);
|
||||
+EXPORT_SYMBOL(vpe1_wdog_timeout);
|
||||
+
|
||||
+#endif
|
||||
/* grab the likely amount of memory we will need. */
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
#define P_SIZE (2 * 1024 * 1024)
|
||||
@@ -268,6 +320,13 @@ static void *alloc_progmem(unsigned long len)
|
||||
void *addr;
|
||||
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ if (vpe1_load_addr) {
|
||||
+ memset((void *)vpe1_load_addr, 0, len);
|
||||
+ return (void *)vpe1_load_addr;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* This means you must tell Linux to use less memory than you
|
||||
* physically have, for example by passing a mem= boot argument.
|
||||
@@ -746,6 +805,12 @@ static int vpe_run(struct vpe * v)
|
||||
}
|
||||
|
||||
/* Write the address we want it to start running from in the TCPC register. */
|
||||
+#if defined(CONFIG_IFX_VPE_EXT) && 0
|
||||
+ if (stlb)
|
||||
+ write_vpe_c0_wired(vpe0_wired + vpe1_wired);
|
||||
+ else
|
||||
+ write_vpe_c0_wired(vpe1_wired);
|
||||
+#endif
|
||||
write_tc_c0_tcrestart((unsigned long)v->__start);
|
||||
write_tc_c0_tccontext((unsigned long)0);
|
||||
|
||||
@@ -759,6 +824,20 @@ static int vpe_run(struct vpe * v)
|
||||
|
||||
write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H);
|
||||
|
||||
+#if defined(CONFIG_IFX_VPE_EXT) && 0
|
||||
+ /*
|
||||
+ * $a2 & $a3 are used to pass command line parameters to VPE1. $a2
|
||||
+ * points to the start of the command line string and $a3 points to
|
||||
+ * the end of the string. This convention is identical to the Linux
|
||||
+ * kernel boot parameter passing mechanism. Please note that $a3 is
|
||||
+ * used to pass physical memory size or 0 in SDE tool kit. So, if you
|
||||
+ * are passing comand line parameters through $a2 & $a3 SDE programs
|
||||
+ * don't work as desired.
|
||||
+ */
|
||||
+ mttgpr(6, command_line);
|
||||
+ mttgpr(7, (command_line + strlen(command_line)));
|
||||
+ if (is_sdepgm)
|
||||
+#endif
|
||||
/*
|
||||
* The sde-kit passes 'memsize' to __start in $a3, so set something
|
||||
* here... Or set $a3 to zero and define DFLT_STACK_SIZE and
|
||||
@@ -833,6 +912,9 @@ static int find_vpe_symbols(struct vpe * v, Elf_Shdr * sechdrs,
|
||||
if ( (v->__start == 0) || (v->shared_ptr == NULL))
|
||||
return -1;
|
||||
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ is_sdepgm = 1;
|
||||
+#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -994,6 +1076,15 @@ static int vpe_elfload(struct vpe * v)
|
||||
(unsigned long)v->load_addr + v->len);
|
||||
|
||||
if ((find_vpe_symbols(v, sechdrs, symindex, strtab, &mod)) < 0) {
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ if (vpe1_load_addr) {
|
||||
+ /* Conversion to KSEG1 is required ??? */
|
||||
+ v->__start = KSEG1ADDR(vpe1_load_addr);
|
||||
+ is_sdepgm = 0;
|
||||
+ return 0;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (v->__start == 0) {
|
||||
printk(KERN_WARNING "VPE loader: program does not contain "
|
||||
"a __start symbol\n");
|
||||
@@ -1064,6 +1155,9 @@ static int vpe_open(struct inode *inode, struct file *filp)
|
||||
struct vpe_notifications *not;
|
||||
struct vpe *v;
|
||||
int ret;
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ int progsize;
|
||||
+#endif
|
||||
|
||||
if (minor != iminor(inode)) {
|
||||
/* assume only 1 device at the moment. */
|
||||
@@ -1089,7 +1183,12 @@ static int vpe_open(struct inode *inode, struct file *filp)
|
||||
release_progmem(v->load_addr);
|
||||
cleanup_tc(get_tc(tclimit));
|
||||
}
|
||||
-
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+ progsize = (vpe1_mem != 0) ? vpe1_mem : P_SIZE;
|
||||
+ //printk("progsize = %x\n", progsize);
|
||||
+ v->pbuffer = vmalloc(progsize);
|
||||
+ v->plen = progsize;
|
||||
+#else
|
||||
/* this of-course trashes what was there before... */
|
||||
v->pbuffer = vmalloc(P_SIZE);
|
||||
if (!v->pbuffer) {
|
||||
@@ -1097,11 +1196,14 @@ static int vpe_open(struct inode *inode, struct file *filp)
|
||||
return -ENOMEM;
|
||||
}
|
||||
v->plen = P_SIZE;
|
||||
+#endif
|
||||
v->load_addr = NULL;
|
||||
v->len = 0;
|
||||
|
||||
+#if 0
|
||||
v->uid = filp->f_cred->fsuid;
|
||||
v->gid = filp->f_cred->fsgid;
|
||||
+#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_APSP_KSPD
|
||||
/* get kspd to tell us when a syscall_exit happens */
|
||||
@@ -1349,6 +1451,133 @@ static void kspd_sp_exit( int sp_id)
|
||||
cleanup_tc(get_tc(sp_id));
|
||||
}
|
||||
#endif
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+int32_t vpe1_sw_start(void* sw_start_addr, uint32_t tcmask, uint32_t flags)
|
||||
+{
|
||||
+ enum vpe_state state;
|
||||
+ struct vpe *v = get_vpe(tclimit);
|
||||
+ struct vpe_notifications *not;
|
||||
+
|
||||
+ if (tcmask || flags) {
|
||||
+ printk(KERN_WARNING "Currently tcmask and flags should be 0.\
|
||||
+ other values not supported\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ state = xchg(&v->state, VPE_STATE_INUSE);
|
||||
+ if (state != VPE_STATE_UNUSED) {
|
||||
+ vpe_stop(v);
|
||||
+
|
||||
+ list_for_each_entry(not, &v->notify, list) {
|
||||
+ not->stop(tclimit);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ v->__start = (unsigned long)sw_start_addr;
|
||||
+ is_sdepgm = 0;
|
||||
+
|
||||
+ if (!vpe_run(v)) {
|
||||
+ printk(KERN_DEBUG "VPE loader: VPE1 running successfully\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_sw_start);
|
||||
+
|
||||
+int32_t vpe1_sw_stop(uint32_t flags)
|
||||
+{
|
||||
+ struct vpe *v = get_vpe(tclimit);
|
||||
+
|
||||
+ if (!vpe_free(v)) {
|
||||
+ printk(KERN_DEBUG "RP Stopped\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ else
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_sw_stop);
|
||||
+
|
||||
+uint32_t vpe1_get_load_addr (uint32_t flags)
|
||||
+{
|
||||
+ return vpe1_load_addr;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_load_addr);
|
||||
+
|
||||
+uint32_t vpe1_get_max_mem (uint32_t flags)
|
||||
+{
|
||||
+ if (!vpe1_mem)
|
||||
+ return P_SIZE;
|
||||
+ else
|
||||
+ return vpe1_mem;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_max_mem);
|
||||
+
|
||||
+void* vpe1_get_cmdline_argument(void)
|
||||
+{
|
||||
+ return saved_command_line;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_cmdline_argument);
|
||||
+
|
||||
+int32_t vpe1_set_boot_param(char *field, char *value, char flags)
|
||||
+{
|
||||
+ char *ptr, string[64];
|
||||
+ int start_off, end_off;
|
||||
+ if (!field)
|
||||
+ return -1;
|
||||
+ strcpy(string, field);
|
||||
+ if (value) {
|
||||
+ strcat(string, "=");
|
||||
+ strcat(string, value);
|
||||
+ strcat(command_line, " ");
|
||||
+ strcat(command_line, string);
|
||||
+ }
|
||||
+ else {
|
||||
+ ptr = strstr(command_line, string);
|
||||
+ if (ptr) {
|
||||
+ start_off = ptr - command_line;
|
||||
+ ptr += strlen(string);
|
||||
+ while ((*ptr != ' ') && (*ptr != '\0'))
|
||||
+ ptr++;
|
||||
+ end_off = ptr - command_line;
|
||||
+ command_line[start_off] = '\0';
|
||||
+ strcat (command_line, command_line+end_off);
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_set_boot_param);
|
||||
+
|
||||
+int32_t vpe1_get_boot_param(char *field, char **value, char flags)
|
||||
+{
|
||||
+ char *ptr, string[64];
|
||||
+ int i = 0;
|
||||
+ if (!field)
|
||||
+ return -1;
|
||||
+ if ((ptr = strstr(command_line, field))) {
|
||||
+ ptr += strlen(field) + 1; /* including = */
|
||||
+ while ((*ptr != ' ') && (*ptr != '\0'))
|
||||
+ string[i++] = *ptr++;
|
||||
+ string[i] = '\0';
|
||||
+ *value = kmalloc((strlen(string) + 1), GFP_KERNEL);
|
||||
+ if (*value != NULL)
|
||||
+ strcpy(*value, string);
|
||||
+ }
|
||||
+ else
|
||||
+ *value = NULL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_get_boot_param);
|
||||
+
|
||||
+extern void configure_tlb(void);
|
||||
+#endif
|
||||
|
||||
static ssize_t store_kill(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
@@ -1430,6 +1659,18 @@ static int __init vpe_module_init(void)
|
||||
printk("VPE loader: not a MIPS MT capable processor\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
+#ifdef CONFIG_IFX_VPE_EXT
|
||||
+#ifndef CONFIG_MIPS_MT_SMTC
|
||||
+ configure_tlb();
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
+#ifndef CONFIG_MIPS_MT_SMTC
|
||||
+ if (!vpelimit)
|
||||
+ vpelimit = 1;
|
||||
+ if (!tclimit)
|
||||
+ tclimit = 1;
|
||||
+#endif
|
||||
|
||||
if (vpelimit == 0) {
|
||||
printk(KERN_WARNING "No VPEs reserved for AP/SP, not "
|
||||
@@ -1474,10 +1715,12 @@ static int __init vpe_module_init(void)
|
||||
mtflags = dmt();
|
||||
vpflags = dvpe();
|
||||
|
||||
+ back_to_back_c0_hazard();
|
||||
+
|
||||
/* Put MVPE's into 'configuration state' */
|
||||
set_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
|
||||
- /* dump_mtregs(); */
|
||||
+ dump_mtregs();
|
||||
|
||||
val = read_c0_mvpconf0();
|
||||
hw_tcs = (val & MVPCONF0_PTC) + 1;
|
||||
@@ -1489,6 +1732,7 @@ static int __init vpe_module_init(void)
|
||||
* reschedule send IPIs or similar we might hang.
|
||||
*/
|
||||
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
+ back_to_back_c0_hazard();
|
||||
evpe(vpflags);
|
||||
emt(mtflags);
|
||||
local_irq_restore(flags);
|
||||
@@ -1514,6 +1758,7 @@ static int __init vpe_module_init(void)
|
||||
}
|
||||
|
||||
v->ntcs = hw_tcs - tclimit;
|
||||
+ write_tc_c0_tcbind((read_tc_c0_tcbind() & ~TCBIND_CURVPE) | 1);
|
||||
|
||||
/* add the tc to the list of this vpe's tc's. */
|
||||
list_add(&t->tc, &v->tc);
|
||||
@@ -1582,6 +1827,7 @@ static int __init vpe_module_init(void)
|
||||
out_reenable:
|
||||
/* release config state */
|
||||
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
+ back_to_back_c0_hazard();
|
||||
|
||||
evpe(vpflags);
|
||||
emt(mtflags);
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
From e3c377986855f820513edf2924a022a39c363908 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 21:29:14 +0200
|
||||
Subject: [PATCH 20/24] MIPS: lantiq: adds falcon VPE softdog
|
||||
|
||||
---
|
||||
arch/mips/include/asm/mach-lantiq/falcon/vpe.h | 44 ++++++++++
|
||||
arch/mips/lantiq/falcon/softdog_vpe.c | 109 ++++++++++++++++++++++++
|
||||
2 files changed, 153 insertions(+), 0 deletions(-)
|
||||
create mode 100644 arch/mips/include/asm/mach-lantiq/falcon/vpe.h
|
||||
create mode 100644 arch/mips/lantiq/falcon/softdog_vpe.c
|
||||
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/falcon/vpe.h
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/falcon/vpe.h 2011-10-05 13:26:22.732981532 +0200
|
||||
@@ -0,0 +1,44 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ *
|
||||
+ * Copyright (C) 2005 infineon
|
||||
+ * Copyright (C) 2007 John Crispin <blogic@openwrt.org>
|
||||
+ *
|
||||
+ */
|
||||
+#ifndef _IFXMIPS_VPE_H__
|
||||
+#define _IFXMIPS_VPE_H__
|
||||
+
|
||||
+/* For the explanation of the APIs please refer the section "MT APRP Kernel
|
||||
+ * Programming" in AR9 SW Architecture Specification
|
||||
+ */
|
||||
+int32_t vpe1_sw_start(void* sw_start_addr, uint32_t tcmask, uint32_t flags);
|
||||
+int32_t vpe1_sw_stop(uint32_t flags);
|
||||
+uint32_t vpe1_get_load_addr (uint32_t flags);
|
||||
+uint32_t vpe1_get_max_mem (uint32_t flags);
|
||||
+
|
||||
+int32_t vpe1_set_boot_param(char *field, char *value, char flags);
|
||||
+int32_t vpe1_get_boot_param(char *field, char **value, char flags);
|
||||
+
|
||||
+/* Watchdog APIs */
|
||||
+extern unsigned long vpe1_wdog_ctr;
|
||||
+extern unsigned long vpe1_wdog_timeout;
|
||||
+
|
||||
+unsigned long vpe1_sw_wdog_start(unsigned long);
|
||||
+unsigned long vpe1_sw_wdog_stop(unsigned long);
|
||||
+
|
||||
+typedef int (*VPE_SW_WDOG_RESET)(unsigned long wdog_cleared_ok_count);
|
||||
+int32_t vpe1_sw_wdog_register_reset_handler(VPE_SW_WDOG_RESET reset_fn);
|
||||
+
|
||||
+#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/softdog_vpe.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/softdog_vpe.c 2011-10-05 13:26:22.736981533 +0200
|
||||
@@ -0,0 +1,109 @@
|
||||
+/*
|
||||
+** =============================================================================
|
||||
+** FILE NAME : softdog_vpe.c
|
||||
+** MODULES : LXDB
|
||||
+** DATE : 24-03-2008
|
||||
+** AUTHOR : LXDB Team
|
||||
+** DESCRIPTION : This header file contains the code for the watchdog
|
||||
+** implentation on vpe1 side.
|
||||
+** REFERENCES :
|
||||
+** COPYRIGHT : Copyright (c) 2008
|
||||
+** Am Campeon 1-12, 85579 Neubiberg, Germany
|
||||
+** Any use of this software is subject to the conclusion of a respective
|
||||
+** License agreement. Without such a License agreement no rights to the
|
||||
+** software are granted
|
||||
+**
|
||||
+** HISTORY :
|
||||
+** $Date $Author $Comment
|
||||
+** 24-03-2008 LXDB Initial version
|
||||
+** ============================================================================
|
||||
+*/
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/moduleparam.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/timer.h>
|
||||
+#include <linux/reboot.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/jiffies.h>
|
||||
+
|
||||
+#include <falcon/vpe.h>
|
||||
+
|
||||
+static unsigned long last_wdog_value;
|
||||
+static unsigned long vpe1_wdog_cleared;
|
||||
+
|
||||
+static unsigned long vpe1_wdog_dead;
|
||||
+static void watchdog_vpe0_fire(unsigned long); /* Called when vpe0 timer expires */
|
||||
+static void keep_alive_vpe0(unsigned long);
|
||||
+VPE_SW_WDOG_RESET reset_local_fn;
|
||||
+
|
||||
+
|
||||
+static struct timer_list watchdog_vpe0_ticktock =
|
||||
+ TIMER_INITIALIZER(watchdog_vpe0_fire, 0, 0);
|
||||
+
|
||||
+static void watchdog_vpe0_fire (unsigned long flags)
|
||||
+{
|
||||
+ volatile unsigned long *wdog_ctr_value;
|
||||
+ wdog_ctr_value = (void*)vpe1_wdog_ctr;
|
||||
+ if (*wdog_ctr_value == last_wdog_value) { /* VPE1 watchdog expiry handling */
|
||||
+ vpe1_sw_wdog_stop(flags);
|
||||
+ vpe1_wdog_dead++;
|
||||
+ printk(KERN_DEBUG "VPE1 watchdog reset handler called\n");
|
||||
+ /* Call the reset handler function */
|
||||
+ reset_local_fn(flags);
|
||||
+ } else { /* Everything is OK on vpe1 side. Continue. */
|
||||
+ last_wdog_value = *wdog_ctr_value;
|
||||
+ vpe1_wdog_cleared++;
|
||||
+ keep_alive_vpe0(flags);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+int32_t vpe1_sw_wdog_register_reset_handler (VPE_SW_WDOG_RESET reset_fn)
|
||||
+{
|
||||
+ reset_local_fn = (VPE_SW_WDOG_RESET)reset_fn;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void keep_alive_vpe0(unsigned long flags)
|
||||
+{
|
||||
+ mod_timer(&watchdog_vpe0_ticktock, jiffies+ vpe1_wdog_timeout );
|
||||
+}
|
||||
+
|
||||
+unsigned long vpe1_sw_wdog_start(unsigned long flags)
|
||||
+{
|
||||
+ volatile unsigned long *wdog_ctr_value;
|
||||
+ wdog_ctr_value = (void*)vpe1_wdog_ctr;
|
||||
+ *wdog_ctr_value = 0;
|
||||
+ last_wdog_value = 0;
|
||||
+ keep_alive_vpe0(flags);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+unsigned long vpe1_sw_wdog_stop(unsigned long flags)
|
||||
+{
|
||||
+ del_timer(&watchdog_vpe0_ticktock);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __init watchdog_vpe1_init(void)
|
||||
+{
|
||||
+ /* Nothing to be done here */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit watchdog_vpe1_exit(void)
|
||||
+{
|
||||
+ unsigned long flags=0;
|
||||
+ vpe1_sw_wdog_stop(flags);
|
||||
+}
|
||||
+
|
||||
+module_init(watchdog_vpe1_init);
|
||||
+module_exit(watchdog_vpe1_exit);
|
||||
+
|
||||
+EXPORT_SYMBOL(vpe1_sw_wdog_register_reset_handler);
|
||||
+EXPORT_SYMBOL(vpe1_sw_wdog_start);
|
||||
+EXPORT_SYMBOL(vpe1_sw_wdog_stop);
|
||||
+
|
||||
+MODULE_AUTHOR("LXDB");
|
||||
+MODULE_DESCRIPTION("Software Watchdog For VPE1");
|
||||
+MODULE_LICENSE("GPL");
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/Makefile 2011-10-05 13:38:41.801013127 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/Makefile 2011-10-05 13:38:47.341013363 +0200
|
||||
@@ -1,2 +1,2 @@
|
||||
-obj-y := clk.o prom.o reset.o sysctrl.o devices.o gpio.o
|
||||
+obj-y := clk.o prom.o reset.o sysctrl.o devices.o gpio.o softdog_vpe.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
|
@ -1,6 +1,19 @@
|
|||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1912,6 +1912,28 @@ config IFX_VPE_EXT
|
||||
From 0f85e79f6f01f50cb703866a555085a9c65bad2f Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 20:31:54 +0200
|
||||
Subject: [PATCH 21/24] MIPS: lantiq: adds cache split
|
||||
|
||||
---
|
||||
arch/mips/Kconfig | 22 ++++++
|
||||
arch/mips/kernel/vpe.c | 66 ++++++++++++++++++
|
||||
arch/mips/mm/c-r4k.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 260 insertions(+), 0 deletions(-)
|
||||
|
||||
Index: linux-3.0.3/arch/mips/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/Kconfig 2011-10-05 12:53:54.792898260 +0200
|
||||
+++ linux-3.0.3/arch/mips/Kconfig 2011-10-05 12:53:54.852898263 +0200
|
||||
@@ -1913,6 +1913,28 @@
|
||||
help
|
||||
IFX included extensions in APRP
|
||||
|
||||
|
@ -29,9 +42,11 @@
|
|||
config PERFCTRS
|
||||
bool "34K Performance counters"
|
||||
depends on MIPS_MT && PROC_FS
|
||||
--- a/arch/mips/kernel/vpe.c
|
||||
+++ b/arch/mips/kernel/vpe.c
|
||||
@@ -128,6 +128,13 @@ __setup("vpe1_wdog_timeout=", wdog_timeo
|
||||
Index: linux-3.0.3/arch/mips/kernel/vpe.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/kernel/vpe.c 2011-10-05 12:53:54.800898262 +0200
|
||||
+++ linux-3.0.3/arch/mips/kernel/vpe.c 2011-10-05 12:53:54.852898263 +0200
|
||||
@@ -128,6 +128,13 @@
|
||||
EXPORT_SYMBOL(vpe1_wdog_timeout);
|
||||
|
||||
#endif
|
||||
|
@ -45,7 +60,7 @@
|
|||
/* grab the likely amount of memory we will need. */
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
#define P_SIZE (2 * 1024 * 1024)
|
||||
@@ -866,6 +873,65 @@ static int vpe_run(struct vpe * v)
|
||||
@@ -866,6 +873,65 @@
|
||||
/* enable this VPE */
|
||||
write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | VPECONF0_VPA);
|
||||
|
||||
|
@ -111,9 +126,11 @@
|
|||
/* clear out any left overs from a previous program */
|
||||
write_vpe_c0_status(0);
|
||||
write_vpe_c0_cause(0);
|
||||
--- a/arch/mips/mm/c-r4k.c
|
||||
+++ b/arch/mips/mm/c-r4k.c
|
||||
@@ -1346,6 +1346,106 @@ static int __init setcoherentio(char *st
|
||||
Index: linux-3.0.3/arch/mips/mm/c-r4k.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/mm/c-r4k.c 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/mm/c-r4k.c 2011-10-05 12:53:54.852898263 +0200
|
||||
@@ -1346,6 +1346,106 @@
|
||||
__setup("coherentio", setcoherentio);
|
||||
#endif
|
||||
|
||||
|
@ -220,7 +237,7 @@
|
|||
void __cpuinit r4k_cache_init(void)
|
||||
{
|
||||
extern void build_clear_page(void);
|
||||
@@ -1365,6 +1465,78 @@ void __cpuinit r4k_cache_init(void)
|
||||
@@ -1365,6 +1465,78 @@
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -299,3 +316,38 @@
|
|||
probe_pcache();
|
||||
setup_scache();
|
||||
|
||||
Index: linux-3.0.3/arch/mips/lantiq/setup.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/setup.c 2011-10-05 13:20:49.808967301 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/setup.c 2011-10-05 13:23:27.796974054 +0200
|
||||
@@ -18,10 +18,11 @@
|
||||
#include "devices.h"
|
||||
#include "prom.h"
|
||||
|
||||
+/* assume 16M as default incase uboot fails to pass proper ramsize */
|
||||
+unsigned long physical_memsize = 16L;
|
||||
+
|
||||
void __init plat_mem_setup(void)
|
||||
{
|
||||
- /* assume 16M as default incase uboot fails to pass proper ramsize */
|
||||
- unsigned long memsize = 16;
|
||||
char **envp = (char **) KSEG1ADDR(fw_arg2);
|
||||
|
||||
ioport_resource.start = IOPORT_RESOURCE_START;
|
||||
@@ -35,13 +36,13 @@
|
||||
char *e = (char *)KSEG1ADDR(*envp);
|
||||
if (!strncmp(e, "memsize=", 8)) {
|
||||
e += 8;
|
||||
- if (strict_strtoul(e, 0, &memsize))
|
||||
+ if (strict_strtoul(e, 0, &physical_memsize))
|
||||
pr_warn("bad memsize specified\n");
|
||||
}
|
||||
envp++;
|
||||
}
|
||||
- memsize *= 1024 * 1024;
|
||||
- add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
|
||||
+ physical_memsize *= 1024 * 1024;
|
||||
+ add_memory_region(0x00000000, physical_memsize, BOOT_MEM_RAM);
|
||||
}
|
||||
|
||||
static int __init
|
|
@ -1,3 +1,21 @@
|
|||
From 14ff975c660696fa636e8d6b58d0abed0ddc72ce Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 29 Sep 2011 20:29:54 +0200
|
||||
Subject: [PATCH 22/24] MIPS: lantiq: adds udp in-kernel redirect
|
||||
|
||||
---
|
||||
include/linux/udp_redirect.h | 57 +++++++++++++
|
||||
net/Kconfig | 6 ++
|
||||
net/ipv4/Makefile | 3 +
|
||||
net/ipv4/udp.c | 28 ++++++-
|
||||
net/ipv4/udp_redirect_symb.c | 186 ++++++++++++++++++++++++++++++++++++++++++
|
||||
5 files changed, 276 insertions(+), 4 deletions(-)
|
||||
create mode 100644 include/linux/udp_redirect.h
|
||||
create mode 100644 net/ipv4/udp_redirect_symb.c
|
||||
|
||||
diff --git a/include/linux/udp_redirect.h b/include/linux/udp_redirect.h
|
||||
new file mode 100644
|
||||
index 0000000..de1e64f
|
||||
--- /dev/null
|
||||
+++ b/include/linux/udp_redirect.h
|
||||
@@ -0,0 +1,57 @@
|
||||
|
@ -58,6 +76,114 @@
|
|||
+extern int udpredirect_getfrag(void *p, char * to, int offset,
|
||||
+ int fraglen, int odd, struct sk_buff *skb);
|
||||
+#endif
|
||||
diff --git a/net/Kconfig b/net/Kconfig
|
||||
index a073148..d13e3fa 100644
|
||||
--- a/net/Kconfig
|
||||
+++ b/net/Kconfig
|
||||
@@ -72,6 +72,12 @@ config INET
|
||||
|
||||
Short answer: say Y.
|
||||
|
||||
+config IFX_UDP_REDIRECT
|
||||
+ bool "IFX Kernel Packet Interface for UDP redirection"
|
||||
+ help
|
||||
+ You can say Y here if you want to use hooks from kernel for
|
||||
+ UDP redirection.
|
||||
+
|
||||
if INET
|
||||
source "net/ipv4/Kconfig"
|
||||
source "net/ipv6/Kconfig"
|
||||
diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile
|
||||
index f2dc69c..6badd72 100644
|
||||
--- a/net/ipv4/Makefile
|
||||
+++ b/net/ipv4/Makefile
|
||||
@@ -14,6 +14,9 @@ obj-y := route.o inetpeer.o protocol.o \
|
||||
inet_fragment.o ping.o
|
||||
|
||||
obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o
|
||||
+ifneq ($(CONFIG_IFX_UDP_REDIRECT),)
|
||||
+obj-$(CONFIG_IFX_UDP_REDIRECT) += udp_redirect_symb.o
|
||||
+endif
|
||||
obj-$(CONFIG_PROC_FS) += proc.o
|
||||
obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o
|
||||
obj-$(CONFIG_IP_MROUTE) += ipmr.o
|
||||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
||||
index 1b5a193..4d15cf6 100644
|
||||
--- a/net/ipv4/udp.c
|
||||
+++ b/net/ipv4/udp.c
|
||||
@@ -108,6 +108,10 @@
|
||||
#include <trace/events/udp.h>
|
||||
#include "udp_impl.h"
|
||||
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+#include <linux/udp_redirect.h>
|
||||
+#endif
|
||||
+
|
||||
struct udp_table udp_table __read_mostly;
|
||||
EXPORT_SYMBOL(udp_table);
|
||||
|
||||
@@ -803,7 +807,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
u8 tos;
|
||||
int err, is_udplite = IS_UDPLITE(sk);
|
||||
int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
|
||||
- int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
|
||||
+ int (*getfrag)(void *, char *, int, int, int, struct sk_buff *) = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct ip_options_data opt_copy;
|
||||
|
||||
@@ -820,7 +824,13 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
ipc.opt = NULL;
|
||||
ipc.tx_flags = 0;
|
||||
|
||||
- getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
||||
+/* UDPREDIRECT */
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+ if(udpredirect_getfrag_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC)
|
||||
+ getfrag = udpredirect_getfrag_fn;
|
||||
+ else
|
||||
+#endif /* IFX_UDP_REDIRECT */
|
||||
+ getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
||||
|
||||
fl4 = &inet->cork.fl.u.ip4;
|
||||
if (up->pending) {
|
||||
@@ -1621,6 +1631,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
__be32 saddr, daddr;
|
||||
struct net *net = dev_net(skb->dev);
|
||||
+ int ret = 0;
|
||||
|
||||
/*
|
||||
* Validate the packet.
|
||||
@@ -1653,7 +1664,16 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
|
||||
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
|
||||
|
||||
if (sk != NULL) {
|
||||
- int ret = udp_queue_rcv_skb(sk, skb);
|
||||
+ /* UDPREDIRECT */
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+ if(udp_do_redirect_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC)
|
||||
+ {
|
||||
+ udp_do_redirect_fn(sk,skb);
|
||||
+ kfree_skb(skb);
|
||||
+ return(0);
|
||||
+ }
|
||||
+#endif
|
||||
+ ret = udp_queue_rcv_skb(sk, skb);
|
||||
sock_put(sk);
|
||||
|
||||
/* a return value > 0 means to resubmit the input, but
|
||||
@@ -1950,7 +1970,7 @@ struct proto udp_prot = {
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
EXPORT_SYMBOL(udp_prot);
|
||||
-
|
||||
+EXPORT_SYMBOL(udp_rcv);
|
||||
/* ------------------------------------------------------------------------ */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
diff --git a/net/ipv4/udp_redirect_symb.c b/net/ipv4/udp_redirect_symb.c
|
||||
new file mode 100644
|
||||
index 0000000..5617e86
|
||||
--- /dev/null
|
||||
+++ b/net/ipv4/udp_redirect_symb.c
|
||||
@@ -0,0 +1,186 @@
|
||||
|
@ -247,102 +373,6 @@
|
|||
+EXPORT_SYMBOL(udp_do_redirect_fn);
|
||||
+EXPORT_SYMBOL(udpredirect_getfrag_fn);
|
||||
+#endif /* CONFIG_IFX_UDP_REDIRECT* */
|
||||
--- a/net/ipv4/Makefile
|
||||
+++ b/net/ipv4/Makefile
|
||||
@@ -14,6 +14,9 @@ obj-y := route.o inetpeer.o protocol
|
||||
inet_fragment.o ping.o
|
||||
|
||||
obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o
|
||||
+ifneq ($(CONFIG_IFX_UDP_REDIRECT),)
|
||||
+obj-$(CONFIG_IFX_UDP_REDIRECT) += udp_redirect_symb.o
|
||||
+endif
|
||||
obj-$(CONFIG_PROC_FS) += proc.o
|
||||
obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o
|
||||
obj-$(CONFIG_IP_MROUTE) += ipmr.o
|
||||
--- a/net/ipv4/udp.c
|
||||
+++ b/net/ipv4/udp.c
|
||||
@@ -107,6 +107,10 @@
|
||||
#include <net/xfrm.h>
|
||||
#include "udp_impl.h"
|
||||
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+#include <linux/udp_redirect.h>
|
||||
+#endif
|
||||
+
|
||||
struct udp_table udp_table __read_mostly;
|
||||
EXPORT_SYMBOL(udp_table);
|
||||
|
||||
@@ -802,7 +806,7 @@ int udp_sendmsg(struct kiocb *iocb, stru
|
||||
u8 tos;
|
||||
int err, is_udplite = IS_UDPLITE(sk);
|
||||
int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
|
||||
- int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
|
||||
+ int (*getfrag)(void *, char *, int, int, int, struct sk_buff *) = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct ip_options_data opt_copy;
|
||||
|
||||
@@ -819,7 +823,13 @@ int udp_sendmsg(struct kiocb *iocb, stru
|
||||
ipc.opt = NULL;
|
||||
ipc.tx_flags = 0;
|
||||
|
||||
- getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
||||
+/* UDPREDIRECT */
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+ if(udpredirect_getfrag_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC)
|
||||
+ getfrag = udpredirect_getfrag_fn;
|
||||
+ else
|
||||
+#endif /* IFX_UDP_REDIRECT */
|
||||
+ getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
||||
|
||||
fl4 = &inet->cork.fl.u.ip4;
|
||||
if (up->pending) {
|
||||
@@ -1619,6 +1629,7 @@ int __udp4_lib_rcv(struct sk_buff *skb,
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
__be32 saddr, daddr;
|
||||
struct net *net = dev_net(skb->dev);
|
||||
+ int ret = 0;
|
||||
|
||||
/*
|
||||
* Validate the packet.
|
||||
@@ -1651,7 +1662,16 @@ int __udp4_lib_rcv(struct sk_buff *skb,
|
||||
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
|
||||
|
||||
if (sk != NULL) {
|
||||
- int ret = udp_queue_rcv_skb(sk, skb);
|
||||
+ /* UDPREDIRECT */
|
||||
+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE)
|
||||
+ if(udp_do_redirect_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC)
|
||||
+ {
|
||||
+ udp_do_redirect_fn(sk,skb);
|
||||
+ kfree_skb(skb);
|
||||
+ return(0);
|
||||
+ }
|
||||
+#endif
|
||||
+ ret = udp_queue_rcv_skb(sk, skb);
|
||||
sock_put(sk);
|
||||
|
||||
/* a return value > 0 means to resubmit the input, but
|
||||
@@ -1948,7 +1968,7 @@ struct proto udp_prot = {
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
EXPORT_SYMBOL(udp_prot);
|
||||
-
|
||||
+EXPORT_SYMBOL(udp_rcv);
|
||||
/* ------------------------------------------------------------------------ */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
--- a/net/Kconfig
|
||||
+++ b/net/Kconfig
|
||||
@@ -72,6 +72,12 @@ config INET
|
||||
|
||||
Short answer: say Y.
|
||||
|
||||
+config IFX_UDP_REDIRECT
|
||||
+ bool "IFX Kernel Packet Interface for UDP redirection"
|
||||
+ help
|
||||
+ You can say Y here if you want to use hooks from kernel for
|
||||
+ UDP redirection.
|
||||
+
|
||||
if INET
|
||||
source "net/ipv4/Kconfig"
|
||||
source "net/ipv6/Kconfig"
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -0,0 +1,280 @@
|
|||
From 780a64cd52209fad15c7133f950b2b2d6b9b59e2 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sat, 27 Aug 2011 21:44:32 +0200
|
||||
Subject: [PATCH 23/24] MIPS: lantiq: adds basic vr9 support
|
||||
|
||||
---
|
||||
.../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 2 +
|
||||
arch/mips/lantiq/Kconfig | 9 ++
|
||||
arch/mips/lantiq/Platform | 1 +
|
||||
arch/mips/lantiq/machtypes.h | 3 +
|
||||
arch/mips/lantiq/xway/Kconfig | 12 +++
|
||||
arch/mips/lantiq/xway/Makefile | 2 +
|
||||
arch/mips/lantiq/xway/clk-vr9.c | 78 ++++++++++++++++++++
|
||||
arch/mips/lantiq/xway/mach-fritz.c | 74 +++++++++++++++++++
|
||||
arch/mips/lantiq/xway/prom-vr9.c | 55 ++++++++++++++
|
||||
arch/mips/pci/Makefile | 2 +-
|
||||
10 files changed, 237 insertions(+), 1 deletions(-)
|
||||
create mode 100644 arch/mips/lantiq/xway/clk-vr9.c
|
||||
create mode 100644 arch/mips/lantiq/xway/mach-fritz.c
|
||||
create mode 100644 arch/mips/lantiq/xway/prom-vr9.c
|
||||
|
||||
Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:48.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:54.234312800 +0200
|
||||
@@ -21,6 +21,7 @@
|
||||
#define SOC_ID_ARX188 0x16C
|
||||
#define SOC_ID_ARX168 0x16D
|
||||
#define SOC_ID_ARX182 0x16F
|
||||
+#define SOC_ID_VRX288 0x1C0
|
||||
|
||||
/* SoC Types */
|
||||
#define SOC_TYPE_DANUBE 0x01
|
||||
@@ -91,6 +92,7 @@
|
||||
|
||||
/* ETOP - ethernet */
|
||||
#define LTQ_ETOP_BASE_ADDR 0x1E180000
|
||||
+#define LTQ_ETOP_BASE_ADDR_VR9 0x1E200000
|
||||
#define LTQ_ETOP_SIZE 0x40000
|
||||
|
||||
/* GBIT - gigabit switch */
|
||||
Index: linux-3.0.3/arch/mips/lantiq/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/Kconfig 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/Kconfig 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -1,5 +1,8 @@
|
||||
if LANTIQ
|
||||
|
||||
+config LANTIQ_PCIE
|
||||
+ bool
|
||||
+
|
||||
config SOC_TYPE_XWAY
|
||||
bool
|
||||
default n
|
||||
@@ -17,6 +20,12 @@
|
||||
select SOC_TYPE_XWAY
|
||||
select HW_HAS_PCI
|
||||
|
||||
+config SOC_VR9
|
||||
+ bool "VR9"
|
||||
+ select SOC_TYPE_XWAY
|
||||
+ select HW_HAS_PCI
|
||||
+ select LANTIQ_PCIE
|
||||
+
|
||||
config SOC_FALCON
|
||||
bool "FALCON"
|
||||
endchoice
|
||||
Index: linux-3.0.3/arch/mips/lantiq/Platform
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/Platform 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/Platform 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -6,4 +6,5 @@
|
||||
cflags-$(CONFIG_LANTIQ) += -I$(srctree)/arch/mips/include/asm/mach-lantiq
|
||||
load-$(CONFIG_LANTIQ) = 0xffffffff80002000
|
||||
cflags-$(CONFIG_SOC_TYPE_XWAY) += -I$(srctree)/arch/mips/include/asm/mach-lantiq/xway
|
||||
+cflags-$(CONFIG_SOC_TYPE_VR9) += -I$(srctree)/arch/mips/include/asm/mach-lantiq/xway
|
||||
cflags-$(CONFIG_SOC_FALCON) += -I$(srctree)/arch/mips/include/asm/mach-lantiq/falcon
|
||||
Index: linux-3.0.3/arch/mips/lantiq/machtypes.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/machtypes.h 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/machtypes.h 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -20,6 +20,9 @@
|
||||
LANTIQ_MACH_EASY98000, /* Falcon Eval Board, NOR Flash */
|
||||
LANTIQ_MACH_EASY98000SF, /* Falcon Eval Board, Serial Flash */
|
||||
LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
+
|
||||
+ /* FRITZ!BOX */
|
||||
+ LANTIQ_MACH_FRITZ3370, /* FRITZ!BOX 3370 vdsl cpe */
|
||||
};
|
||||
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/Kconfig 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/Kconfig 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -21,3 +21,15 @@
|
||||
endmenu
|
||||
|
||||
endif
|
||||
+
|
||||
+if SOC_VR9
|
||||
+
|
||||
+menu "MIPS Machine"
|
||||
+
|
||||
+config LANTIQ_MACH_FRITZ3370
|
||||
+ bool "Fritz!Box 3370"
|
||||
+ default y
|
||||
+
|
||||
+endmenu
|
||||
+
|
||||
+endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/Makefile 2011-10-04 20:05:50.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/Makefile 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
|
||||
+obj-$(CONFIG_SOC_VR9) += clk-vr9.o prom-vr9.o
|
||||
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_FRITZ3370) += mach-fritz.o
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/clk-vr9.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/clk-vr9.c 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -0,0 +1,78 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/clk.h>
|
||||
+
|
||||
+#include <asm/time.h>
|
||||
+#include <asm/irq.h>
|
||||
+#include <asm/div64.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+
|
||||
+#define CLOCK_62_5M 62500000
|
||||
+#define CLOCK_83_5M 83500000
|
||||
+#define CLOCK_125M 125000000
|
||||
+#define CLOCK_200M 200000000
|
||||
+#define CLOCK_250M 250000000
|
||||
+#define CLOCK_300M 300000000
|
||||
+#define CLOCK_98_304M 98304000
|
||||
+#define CLOCK_150M 150000000
|
||||
+#define CLOCK_196_608M 196608000
|
||||
+#define CLOCK_600M 600000000
|
||||
+#define CLOCK_500M 500000000
|
||||
+#define CLOCK_393M 393215332
|
||||
+#define CLOCK_166M 166666666
|
||||
+
|
||||
+#define LTQ_CGU_SYS 0x0c
|
||||
+#define LTQ_CGU_IF_CLK 0x24
|
||||
+
|
||||
+unsigned int ltq_get_cpu_hz(void)
|
||||
+{
|
||||
+ int clks[] = {
|
||||
+ CLOCK_600M, CLOCK_500M, CLOCK_393M, CLOCK_333M, CLOCK_125M,
|
||||
+ CLOCK_125M, CLOCK_196_608M, CLOCK_166M, CLOCK_125M, CLOCK_125M };
|
||||
+ int val = (ltq_cgu_r32(LTQ_CGU_SYS) >> 4) & 0xf;
|
||||
+
|
||||
+ if (val > 9)
|
||||
+ panic("bad cpu speed\n");
|
||||
+ if (val == 2)
|
||||
+ panic("missing workaround\n");
|
||||
+ //cgu_get_pll1_fosc(); //CLOCK_393M;
|
||||
+ return clks[val];
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_cpu_hz);
|
||||
+
|
||||
+unsigned int ltq_get_fpi_hz(void)
|
||||
+{
|
||||
+ int clks[] = {
|
||||
+ CLOCK_62_5M, CLOCK_62_5M, CLOCK_83_5M, CLOCK_125M, CLOCK_125M,
|
||||
+ CLOCK_125M, CLOCK_167M, CLOCK_200M, CLOCK_250M, CLOCK_300M,
|
||||
+ CLOCK_62_5M, CLOCK_98_304M, CLOCK_150M, CLOCK_196_608M };
|
||||
+ int val = ((ltq_cgu_r32(LTQ_CGU_IF_CLK) >> 25) & 0xf);
|
||||
+
|
||||
+ if (val > 13)
|
||||
+ panic("bad fpi speed\n");
|
||||
+
|
||||
+ return clks[val];
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_fpi_hz);
|
||||
+
|
||||
+unsigned int ltq_get_io_region_clock(void)
|
||||
+{
|
||||
+ return ltq_get_fpi_hz() / 2;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_io_region_clock);
|
||||
+
|
||||
+unsigned int ltq_get_fpi_bus_clock(int fpi)
|
||||
+{
|
||||
+ return ltq_get_fpi_hz();
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_fpi_bus_clock);
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/prom-vr9.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/prom-vr9.c 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -0,0 +1,55 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <asm/bootinfo.h>
|
||||
+#include <asm/time.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+
|
||||
+#include "devices.h"
|
||||
+#include "../prom.h"
|
||||
+
|
||||
+#define SOC_VRX288 "VRX288"
|
||||
+
|
||||
+#define PART_SHIFT 12
|
||||
+#define PART_MASK 0x0FFFFFFF
|
||||
+#define REV_SHIFT 28
|
||||
+#define REV_MASK 0xF0000000
|
||||
+
|
||||
+void __init ltq_soc_detect(struct ltq_soc_info *i)
|
||||
+{
|
||||
+ i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
|
||||
+ i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
|
||||
+ sprintf(i->rev_type, "1.%d", i->rev);
|
||||
+ switch (i->partnum) {
|
||||
+ case SOC_ID_VRX288:
|
||||
+ i->name = SOC_VRX288;
|
||||
+ i->type = SOC_TYPE_VR9;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ unreachable();
|
||||
+ break;
|
||||
+ }
|
||||
+ printk("%08X\n", i->partnum);
|
||||
+}
|
||||
+
|
||||
+void __init ltq_soc_setup(void)
|
||||
+{
|
||||
+ /*
|
||||
+ reg = IFX_REG_R32(IFX_XBAR_ALWAYS_LAST);
|
||||
+ reg &= ~ IFX_XBAR_FPI_BURST_EN;
|
||||
+ IFX_REG_W32(reg, IFX_XBAR_ALWAYS_LAST);
|
||||
+ */
|
||||
+
|
||||
+ ltq_register_asc(1);
|
||||
+ ltq_register_gpio();
|
||||
+ ltq_register_wdt();
|
||||
+}
|
||||
Index: linux-3.0.3/arch/mips/pci/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/pci/Makefile 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/pci/Makefile 2011-10-04 20:05:54.238312800 +0200
|
||||
@@ -41,7 +41,7 @@
|
||||
obj-$(CONFIG_SIBYTE_BCM112X) += fixup-sb1250.o pci-sb1250.o
|
||||
obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o
|
||||
obj-$(CONFIG_SNI_RM) += fixup-sni.o ops-sni.o
|
||||
-obj-$(CONFIG_SOC_XWAY) += pci-lantiq.o ops-lantiq.o
|
||||
+obj-$(CONFIG_LANTIQ) += pci-lantiq.o ops-lantiq.o
|
||||
obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o
|
||||
obj-$(CONFIG_TANBAC_TB0226) += fixup-tb0226.o
|
||||
obj-$(CONFIG_TANBAC_TB0287) += fixup-tb0287.o
|
|
@ -1,32 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/mach-easy50601.c
|
||||
+++ b/arch/mips/lantiq/xway/mach-easy50601.c
|
||||
@@ -32,12 +32,7 @@ static struct mtd_partition easy50601_pa
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
- .size = 0xE0000,
|
||||
- },
|
||||
- {
|
||||
- .name = "rootfs",
|
||||
- .offset = 0x100000,
|
||||
- .size = 0x300000,
|
||||
+ .size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
||||
--- a/arch/mips/lantiq/xway/mach-easy50712.c
|
||||
+++ b/arch/mips/lantiq/xway/mach-easy50712.c
|
||||
@@ -34,12 +34,7 @@ static struct mtd_partition easy50712_pa
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
- .size = 0xe0000,
|
||||
- },
|
||||
- {
|
||||
- .name = "rootfs",
|
||||
- .offset = 0x100000,
|
||||
- .size = 0x300000,
|
||||
+ .size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
--- a/drivers/mtd/maps/lantiq-flash.c
|
||||
+++ b/drivers/mtd/maps/lantiq-flash.c
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
+#include "../mtdcore.h"
|
||||
+
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
--- a/arch/mips/lantiq/clk.c
|
||||
+++ b/arch/mips/lantiq/clk.c
|
||||
@@ -100,6 +100,17 @@ void clk_put(struct clk *clk)
|
||||
}
|
||||
EXPORT_SYMBOL(clk_put);
|
||||
|
||||
+int clk_enable(struct clk *clk)
|
||||
+{
|
||||
+ /* clocks are always enabled*/
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void clk_disable(struct clk *clk)
|
||||
+{
|
||||
+ /* clocks are always enabled*/
|
||||
+}
|
||||
+
|
||||
static inline u32 ltq_get_counter_resolution(void)
|
||||
{
|
||||
u32 res;
|
||||
--- a/arch/mips/lantiq/irq.c
|
||||
+++ b/arch/mips/lantiq/irq.c
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
+#include <linux/module.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq_cpu.h>
|
||||
@@ -99,6 +100,7 @@ void ltq_mask_and_ack_irq(struct irq_dat
|
||||
ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier);
|
||||
ltq_icu_w32((1 << irq_nr), isr);
|
||||
}
|
||||
+EXPORT_SYMBOL(ltq_mask_and_ack_irq);
|
||||
|
||||
static void ltq_ack_irq(struct irq_data *d)
|
||||
{
|
||||
--- a/arch/mips/lantiq/setup.c
|
||||
+++ b/arch/mips/lantiq/setup.c
|
||||
@@ -18,6 +18,8 @@
|
||||
#include "devices.h"
|
||||
#include "prom.h"
|
||||
|
||||
+unsigned long physical_memsize = 0L;
|
||||
+
|
||||
void __init plat_mem_setup(void)
|
||||
{
|
||||
/* assume 16M as default incase uboot fails to pass proper ramsize */
|
||||
@@ -40,8 +42,8 @@ void __init plat_mem_setup(void)
|
||||
}
|
||||
envp++;
|
||||
}
|
||||
- memsize *= 1024 * 1024;
|
||||
- add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
|
||||
+ physical_memsize = memsize * 1024 * 1024;
|
||||
+ add_memory_region(0x00000000, physical_memsize, BOOT_MEM_RAM);
|
||||
}
|
||||
|
||||
static int __init
|
|
@ -1,284 +1,4 @@
|
|||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h
|
||||
@@ -0,0 +1,277 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 Lantiq
|
||||
+ */
|
||||
+#ifndef _FALCON_IRQ__
|
||||
+#define _FALCON_IRQ__
|
||||
+
|
||||
+#define INT_NUM_IRQ0 8
|
||||
+#define INT_NUM_IM0_IRL0 (INT_NUM_IRQ0 + 0)
|
||||
+#define INT_NUM_IM1_IRL0 (INT_NUM_IM0_IRL0 + 32)
|
||||
+#define INT_NUM_IM2_IRL0 (INT_NUM_IM1_IRL0 + 32)
|
||||
+#define INT_NUM_IM3_IRL0 (INT_NUM_IM2_IRL0 + 32)
|
||||
+#define INT_NUM_IM4_IRL0 (INT_NUM_IM3_IRL0 + 32)
|
||||
+#define INT_NUM_EXTRA_START (INT_NUM_IM4_IRL0 + 32)
|
||||
+#define INT_NUM_IM_OFFSET (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0)
|
||||
+
|
||||
+#define MIPS_CPU_TIMER_IRQ 7
|
||||
+
|
||||
+/* HOST IF Event Interrupt */
|
||||
+#define FALCON_IRQ_HOST (INT_NUM_IM0_IRL0 + 0)
|
||||
+/* HOST IF Mailbox0 Receive Interrupt */
|
||||
+#define FALCON_IRQ_HOST_MB0_RX (INT_NUM_IM0_IRL0 + 1)
|
||||
+/* HOST IF Mailbox0 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_HOST_MB0_TX (INT_NUM_IM0_IRL0 + 2)
|
||||
+/* HOST IF Mailbox1 Receive Interrupt */
|
||||
+#define FALCON_IRQ_HOST_MB1_RX (INT_NUM_IM0_IRL0 + 3)
|
||||
+/* HOST IF Mailbox1 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_HOST_MB1_TX (INT_NUM_IM0_IRL0 + 4)
|
||||
+/* I2C Last Single Data Transfer Request */
|
||||
+#define FALCON_IRQ_I2C_LSREQ (INT_NUM_IM0_IRL0 + 8)
|
||||
+/* I2C Single Data Transfer Request */
|
||||
+#define FALCON_IRQ_I2C_SREQ (INT_NUM_IM0_IRL0 + 9)
|
||||
+/* I2C Last Burst Data Transfer Request */
|
||||
+#define FALCON_IRQ_I2C_LBREQ (INT_NUM_IM0_IRL0 + 10)
|
||||
+/* I2C Burst Data Transfer Request */
|
||||
+#define FALCON_IRQ_I2C_BREQ (INT_NUM_IM0_IRL0 + 11)
|
||||
+/* I2C Error Interrupt */
|
||||
+#define FALCON_IRQ_I2C_I2C_ERR (INT_NUM_IM0_IRL0 + 12)
|
||||
+/* I2C Protocol Interrupt */
|
||||
+#define FALCON_IRQ_I2C_I2C_P (INT_NUM_IM0_IRL0 + 13)
|
||||
+/* SSC Transmit Interrupt */
|
||||
+#define FALCON_IRQ_SSC_T (INT_NUM_IM0_IRL0 + 14)
|
||||
+/* SSC Receive Interrupt */
|
||||
+#define FALCON_IRQ_SSC_R (INT_NUM_IM0_IRL0 + 15)
|
||||
+/* SSC Error Interrupt */
|
||||
+#define FALCON_IRQ_SSC_E (INT_NUM_IM0_IRL0 + 16)
|
||||
+/* SSC Frame Interrupt */
|
||||
+#define FALCON_IRQ_SSC_F (INT_NUM_IM0_IRL0 + 17)
|
||||
+/* Advanced Encryption Standard Interrupt */
|
||||
+#define FALCON_IRQ_AES_AES (INT_NUM_IM0_IRL0 + 27)
|
||||
+/* Secure Hash Algorithm Interrupt */
|
||||
+#define FALCON_IRQ_SHA_HASH (INT_NUM_IM0_IRL0 + 28)
|
||||
+/* PCM Receive Interrupt */
|
||||
+#define FALCON_IRQ_PCM_RX (INT_NUM_IM0_IRL0 + 29)
|
||||
+/* PCM Transmit Interrupt */
|
||||
+#define FALCON_IRQ_PCM_TX (INT_NUM_IM0_IRL0 + 30)
|
||||
+/* PCM Transmit Crash Interrupt */
|
||||
+#define FALCON_IRQ_PCM_HW2_CRASH (INT_NUM_IM0_IRL0 + 31)
|
||||
+
|
||||
+/* EBU Serial Flash Command Error */
|
||||
+#define FALCON_IRQ_EBU_SF_CMDERR (INT_NUM_IM1_IRL0 + 0)
|
||||
+/* EBU Serial Flash Command Overwrite Error */
|
||||
+#define FALCON_IRQ_EBU_SF_COVERR (INT_NUM_IM1_IRL0 + 1)
|
||||
+/* EBU Serial Flash Busy */
|
||||
+#define FALCON_IRQ_EBU_SF_BUSY (INT_NUM_IM1_IRL0 + 2)
|
||||
+/* External Interrupt from GPIO P0 */
|
||||
+#define FALCON_IRQ_GPIO_P0 (INT_NUM_IM1_IRL0 + 4)
|
||||
+/* External Interrupt from GPIO P1 */
|
||||
+#define FALCON_IRQ_GPIO_P1 (INT_NUM_IM1_IRL0 + 5)
|
||||
+/* External Interrupt from GPIO P2 */
|
||||
+#define FALCON_IRQ_GPIO_P2 (INT_NUM_IM1_IRL0 + 6)
|
||||
+/* External Interrupt from GPIO P3 */
|
||||
+#define FALCON_IRQ_GPIO_P3 (INT_NUM_IM1_IRL0 + 7)
|
||||
+/* External Interrupt from GPIO P4 */
|
||||
+#define FALCON_IRQ_GPIO_P4 (INT_NUM_IM1_IRL0 + 8)
|
||||
+/* 8kHz backup interrupt derived from core-PLL */
|
||||
+#define FALCON_IRQ_FSC_BKP (INT_NUM_IM1_IRL0 + 10)
|
||||
+/* FSC Timer Interrupt 0 */
|
||||
+#define FALCON_IRQ_FSCT_CMP0 (INT_NUM_IM1_IRL0 + 11)
|
||||
+/* FSC Timer Interrupt 1 */
|
||||
+#define FALCON_IRQ_FSCT_CMP1 (INT_NUM_IM1_IRL0 + 12)
|
||||
+/* 8kHz root interrupt derived from GPON interface */
|
||||
+#define FALCON_IRQ_FSC_ROOT (INT_NUM_IM1_IRL0 + 13)
|
||||
+/* Time of Day */
|
||||
+#define FALCON_IRQ_TOD (INT_NUM_IM1_IRL0 + 14)
|
||||
+/* PMA Interrupt from IntNode of the 200MHz Domain */
|
||||
+#define FALCON_IRQ_PMA_200M (INT_NUM_IM1_IRL0 + 15)
|
||||
+/* PMA Interrupt from IntNode of the TX Clk Domain */
|
||||
+#define FALCON_IRQ_PMA_TX (INT_NUM_IM1_IRL0 + 16)
|
||||
+/* PMA Interrupt from IntNode of the RX Clk Domain */
|
||||
+#define FALCON_IRQ_PMA_RX (INT_NUM_IM1_IRL0 + 17)
|
||||
+/* SYS1 Interrupt */
|
||||
+#define FALCON_IRQ_SYS1 (INT_NUM_IM1_IRL0 + 20)
|
||||
+/* SYS GPE Interrupt */
|
||||
+#define FALCON_IRQ_SYS_GPE (INT_NUM_IM1_IRL0 + 21)
|
||||
+/* Watchdog Access Error Interrupt */
|
||||
+#define FALCON_IRQ_WDT_AEIR (INT_NUM_IM1_IRL0 + 24)
|
||||
+/* Watchdog Prewarning Interrupt */
|
||||
+#define FALCON_IRQ_WDT_PIR (INT_NUM_IM1_IRL0 + 25)
|
||||
+/* SBIU interrupt */
|
||||
+#define FALCON_IRQ_SBIU0 (INT_NUM_IM1_IRL0 + 27)
|
||||
+/* FPI Bus Control Unit Interrupt */
|
||||
+#define FALCON_IRQ_BCU0 (INT_NUM_IM1_IRL0 + 29)
|
||||
+/* DDR Controller Interrupt */
|
||||
+#define FALCON_IRQ_DDR (INT_NUM_IM1_IRL0 + 30)
|
||||
+/* Crossbar Error Interrupt */
|
||||
+#define FALCON_IRQ_XBAR_ERROR (INT_NUM_IM1_IRL0 + 31)
|
||||
+
|
||||
+/* ICTRLL 0 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLL0 (INT_NUM_IM2_IRL0 + 0)
|
||||
+/* ICTRLL 1 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLL1 (INT_NUM_IM2_IRL0 + 1)
|
||||
+/* ICTRLL 2 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLL2 (INT_NUM_IM2_IRL0 + 2)
|
||||
+/* ICTRLL 3 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLL3 (INT_NUM_IM2_IRL0 + 3)
|
||||
+/* OCTRLL 0 Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLL0 (INT_NUM_IM2_IRL0 + 4)
|
||||
+/* OCTRLL 1 Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLL1 (INT_NUM_IM2_IRL0 + 5)
|
||||
+/* OCTRLL 2 Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLL2 (INT_NUM_IM2_IRL0 + 6)
|
||||
+/* OCTRLL 3 Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLL3 (INT_NUM_IM2_IRL0 + 7)
|
||||
+/* OCTRLG Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLG (INT_NUM_IM2_IRL0 + 9)
|
||||
+/* IQM Interrupt */
|
||||
+#define FALCON_IRQ_IQM (INT_NUM_IM2_IRL0 + 10)
|
||||
+/* FSQM Interrupt */
|
||||
+#define FALCON_IRQ_FSQM (INT_NUM_IM2_IRL0 + 11)
|
||||
+/* TMU Interrupt */
|
||||
+#define FALCON_IRQ_TMU (INT_NUM_IM2_IRL0 + 12)
|
||||
+/* LINK1 Interrupt */
|
||||
+#define FALCON_IRQ_LINK1 (INT_NUM_IM2_IRL0 + 14)
|
||||
+/* ICTRLC 0 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLC0 (INT_NUM_IM2_IRL0 + 16)
|
||||
+/* ICTRLC 1 Interrupt */
|
||||
+#define FALCON_IRQ_ICTRLC1 (INT_NUM_IM2_IRL0 + 17)
|
||||
+/* OCTRLC Interrupt */
|
||||
+#define FALCON_IRQ_OCTRLC (INT_NUM_IM2_IRL0 + 18)
|
||||
+/* CONFIG Break Interrupt */
|
||||
+#define FALCON_IRQ_CONFIG_BREAK (INT_NUM_IM2_IRL0 + 19)
|
||||
+/* CONFIG Interrupt */
|
||||
+#define FALCON_IRQ_CONFIG (INT_NUM_IM2_IRL0 + 20)
|
||||
+/* Dispatcher Interrupt */
|
||||
+#define FALCON_IRQ_DISP (INT_NUM_IM2_IRL0 + 21)
|
||||
+/* TBM Interrupt */
|
||||
+#define FALCON_IRQ_TBM (INT_NUM_IM2_IRL0 + 22)
|
||||
+/* GTC Downstream Interrupt */
|
||||
+#define FALCON_IRQ_GTC_DS (INT_NUM_IM2_IRL0 + 29)
|
||||
+/* GTC Upstream Interrupt */
|
||||
+#define FALCON_IRQ_GTC_US (INT_NUM_IM2_IRL0 + 30)
|
||||
+/* EIM Interrupt */
|
||||
+#define FALCON_IRQ_EIM (INT_NUM_IM2_IRL0 + 31)
|
||||
+
|
||||
+/* ASC0 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_T (INT_NUM_IM3_IRL0 + 0)
|
||||
+/* ASC0 Receive Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_R (INT_NUM_IM3_IRL0 + 1)
|
||||
+/* ASC0 Error Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_E (INT_NUM_IM3_IRL0 + 2)
|
||||
+/* ASC0 Transmit Buffer Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_TB (INT_NUM_IM3_IRL0 + 3)
|
||||
+/* ASC0 Autobaud Start Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_ABST (INT_NUM_IM3_IRL0 + 4)
|
||||
+/* ASC0 Autobaud Detection Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_ABDET (INT_NUM_IM3_IRL0 + 5)
|
||||
+/* ASC1 Modem Status Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_MS (INT_NUM_IM3_IRL0 + 6)
|
||||
+/* ASC0 Soft Flow Control Interrupt */
|
||||
+#define FALCON_IRQ_ASC0_SFC (INT_NUM_IM3_IRL0 + 7)
|
||||
+/* ASC1 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_T (INT_NUM_IM3_IRL0 + 8)
|
||||
+/* ASC1 Receive Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_R (INT_NUM_IM3_IRL0 + 9)
|
||||
+/* ASC1 Error Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_E (INT_NUM_IM3_IRL0 + 10)
|
||||
+/* ASC1 Transmit Buffer Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_TB (INT_NUM_IM3_IRL0 + 11)
|
||||
+/* ASC1 Autobaud Start Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_ABST (INT_NUM_IM3_IRL0 + 12)
|
||||
+/* ASC1 Autobaud Detection Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_ABDET (INT_NUM_IM3_IRL0 + 13)
|
||||
+/* ASC1 Modem Status Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_MS (INT_NUM_IM3_IRL0 + 14)
|
||||
+/* ASC1 Soft Flow Control Interrupt */
|
||||
+#define FALCON_IRQ_ASC1_SFC (INT_NUM_IM3_IRL0 + 15)
|
||||
+/* GPTC Timer/Counter 1A Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC1A (INT_NUM_IM3_IRL0 + 16)
|
||||
+/* GPTC Timer/Counter 1B Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC1B (INT_NUM_IM3_IRL0 + 17)
|
||||
+/* GPTC Timer/Counter 2A Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC2A (INT_NUM_IM3_IRL0 + 18)
|
||||
+/* GPTC Timer/Counter 2B Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC2B (INT_NUM_IM3_IRL0 + 19)
|
||||
+/* GPTC Timer/Counter 3A Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC3A (INT_NUM_IM3_IRL0 + 20)
|
||||
+/* GPTC Timer/Counter 3B Interrupt */
|
||||
+#define FALCON_IRQ_GPTC_TC3B (INT_NUM_IM3_IRL0 + 21)
|
||||
+/* DFEV0, Channel 1 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_2TX (INT_NUM_IM3_IRL0 + 26)
|
||||
+/* DFEV0, Channel 1 Receive Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_2RX (INT_NUM_IM3_IRL0 + 27)
|
||||
+/* DFEV0, Channel 1 General Purpose Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_2GP (INT_NUM_IM3_IRL0 + 28)
|
||||
+/* DFEV0, Channel 0 Transmit Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_1TX (INT_NUM_IM3_IRL0 + 29)
|
||||
+/* DFEV0, Channel 0 Receive Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_1RX (INT_NUM_IM3_IRL0 + 30)
|
||||
+/* DFEV0, Channel 0 General Purpose Interrupt */
|
||||
+#define FALCON_IRQ_DFEV0_1GP (INT_NUM_IM3_IRL0 + 31)
|
||||
+
|
||||
+/* ICTRLL 0 Error */
|
||||
+#define FALCON_IRQ_ICTRLL0_ERR (INT_NUM_IM4_IRL0 + 0)
|
||||
+/* ICTRLL 1 Error */
|
||||
+#define FALCON_IRQ_ICTRLL1_ERR (INT_NUM_IM4_IRL0 + 1)
|
||||
+/* ICTRLL 2 Error */
|
||||
+#define FALCON_IRQ_ICTRLL2_ERR (INT_NUM_IM4_IRL0 + 2)
|
||||
+/* ICTRLL 3 Error */
|
||||
+#define FALCON_IRQ_ICTRLL3_ERR (INT_NUM_IM4_IRL0 + 3)
|
||||
+/* OCTRLL 0 Error */
|
||||
+#define FALCON_IRQ_OCTRLL0_ERR (INT_NUM_IM4_IRL0 + 4)
|
||||
+/* OCTRLL 1 Error */
|
||||
+#define FALCON_IRQ_OCTRLL1_ERR (INT_NUM_IM4_IRL0 + 5)
|
||||
+/* OCTRLL 2 Error */
|
||||
+#define FALCON_IRQ_OCTRLL2_ERR (INT_NUM_IM4_IRL0 + 6)
|
||||
+/* OCTRLL 3 Error */
|
||||
+#define FALCON_IRQ_OCTRLL3_ERR (INT_NUM_IM4_IRL0 + 7)
|
||||
+/* ICTRLG Error */
|
||||
+#define FALCON_IRQ_ICTRLG_ERR (INT_NUM_IM4_IRL0 + 8)
|
||||
+/* OCTRLG Error */
|
||||
+#define FALCON_IRQ_OCTRLG_ERR (INT_NUM_IM4_IRL0 + 9)
|
||||
+/* IQM Error */
|
||||
+#define FALCON_IRQ_IQM_ERR (INT_NUM_IM4_IRL0 + 10)
|
||||
+/* FSQM Error */
|
||||
+#define FALCON_IRQ_FSQM_ERR (INT_NUM_IM4_IRL0 + 11)
|
||||
+/* TMU Error */
|
||||
+#define FALCON_IRQ_TMU_ERR (INT_NUM_IM4_IRL0 + 12)
|
||||
+/* MPS Status Interrupt #0 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR0 (INT_NUM_IM4_IRL0 + 14)
|
||||
+/* MPS Status Interrupt #1 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR1 (INT_NUM_IM4_IRL0 + 15)
|
||||
+/* MPS Status Interrupt #2 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR2 (INT_NUM_IM4_IRL0 + 16)
|
||||
+/* MPS Status Interrupt #3 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR3 (INT_NUM_IM4_IRL0 + 17)
|
||||
+/* MPS Status Interrupt #4 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR4 (INT_NUM_IM4_IRL0 + 18)
|
||||
+/* MPS Status Interrupt #5 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR5 (INT_NUM_IM4_IRL0 + 19)
|
||||
+/* MPS Status Interrupt #6 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR6 (INT_NUM_IM4_IRL0 + 20)
|
||||
+/* MPS Status Interrupt #7 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR7 (INT_NUM_IM4_IRL0 + 21)
|
||||
+/* MPS Status Interrupt #8 (VPE1 to VPE0) */
|
||||
+#define FALCON_IRQ_MPS_IR8 (INT_NUM_IM4_IRL0 + 22)
|
||||
+/* VPE0 Exception Level Flag Interrupt */
|
||||
+#define FALCON_IRQ_VPE0_EXL (INT_NUM_IM4_IRL0 + 29)
|
||||
+/* VPE0 Error Level Flag Interrupt */
|
||||
+#define FALCON_IRQ_VPE0_ERL (INT_NUM_IM4_IRL0 + 30)
|
||||
+/* VPE0 Performance Monitoring Counter Interrupt */
|
||||
+#define FALCON_IRQ_VPE0_PMCIR (INT_NUM_IM4_IRL0 + 31)
|
||||
+
|
||||
+#endif /* _FALCON_IRQ__ */
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/falcon/gpon_reg_base.h
|
||||
@@ -0,0 +1,376 @@
|
||||
+/******************************************************************************
|
||||
|
@ -5818,40 +5538,6 @@
|
|||
+
|
||||
+#endif /* _icu0_reg_h */
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/falcon/irq.h
|
||||
@@ -0,0 +1,31 @@
|
||||
+/*
|
||||
+ * arch/mips/include/asm/mach-ifxmips/falcon/irq.h
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 Lantiq
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __FALCON_IRQ_H
|
||||
+#define __FALCON_IRQ_H
|
||||
+
|
||||
+#include <falcon_irq.h>
|
||||
+
|
||||
+#define NR_IRQS 264
|
||||
+
|
||||
+#include_next <irq.h>
|
||||
+
|
||||
+#endif
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/falcon/status_reg.h
|
||||
@@ -0,0 +1,529 @@
|
||||
+/******************************************************************************
|
File diff suppressed because it is too large
Load diff
|
@ -1,497 +0,0 @@
|
|||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -56,6 +56,7 @@ obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci.
|
||||
obj-$(CONFIG_SPI_SH_MSIOF) += spi_sh_msiof.o
|
||||
obj-$(CONFIG_SPI_STMP3XXX) += spi_stmp.o
|
||||
obj-$(CONFIG_SPI_NUC900) += spi_nuc900.o
|
||||
+obj-$(CONFIG_SPI_FALCON) += spi_falcon.o
|
||||
|
||||
# special build for s3c24xx spi driver with fiq support
|
||||
spi_s3c24xx_hw-y := spi_s3c24xx.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi_falcon.c
|
||||
@@ -0,0 +1,471 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/workqueue.h>
|
||||
+
|
||||
+#include <lantiq.h> /* ebu_lock */
|
||||
+#include <falcon/ebu_reg.h>
|
||||
+#include <falcon/sys1_reg.h>
|
||||
+
|
||||
+#define DRV_NAME "falcon_spi"
|
||||
+
|
||||
+#define FALCON_SPI_XFER_BEGIN (1 << 0)
|
||||
+#define FALCON_SPI_XFER_END (1 << 1)
|
||||
+
|
||||
+/* mapping for access macros */
|
||||
+#define reg_r32(reg) __raw_readl(reg)
|
||||
+#define reg_w32(val, reg) __raw_writel(val, reg)
|
||||
+#define reg_w32_mask(clear, set, reg) reg_w32((reg_r32(reg) \
|
||||
+ & ~(clear)) | (set), reg)
|
||||
+#define reg_r32_table(reg, idx) reg_r32(&((uint32_t *)®)[idx])
|
||||
+#define reg_w32_table(val, reg, idx) reg_w32(val, &((uint32_t *)®)[idx])
|
||||
+
|
||||
+#define ebu (priv->ebu_membase)
|
||||
+#define sys1 (priv->sys1_membase)
|
||||
+
|
||||
+struct falcon_spi {
|
||||
+ u32 sfcmd; /* for caching of opcode, direction, ... */
|
||||
+
|
||||
+ struct spi_master *master;
|
||||
+
|
||||
+ struct gpon_reg_ebu __iomem *ebu_membase;
|
||||
+ struct gpon_reg_sys1 __iomem *sys1_membase;
|
||||
+};
|
||||
+
|
||||
+int falcon_spi_xfer(struct spi_device *spi,
|
||||
+ struct spi_transfer *t,
|
||||
+ unsigned long flags)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+ struct falcon_spi *priv = spi_master_get_devdata(spi->master);
|
||||
+ const u8 *txp = t->tx_buf;
|
||||
+ u8 *rxp = t->rx_buf;
|
||||
+ unsigned int bytelen = ((8 * t->len + 7) / 8);
|
||||
+ unsigned int len, alen, dumlen;
|
||||
+ u32 val;
|
||||
+ enum {
|
||||
+ state_init,
|
||||
+ state_command_prepare,
|
||||
+ state_write,
|
||||
+ state_read,
|
||||
+ state_disable_cs,
|
||||
+ state_end
|
||||
+ } state = state_init;
|
||||
+
|
||||
+ do {
|
||||
+ switch (state) {
|
||||
+ case state_init: /* detect phase of upper layer sequence */
|
||||
+ {
|
||||
+ /* initial write ? */
|
||||
+ if (flags & FALCON_SPI_XFER_BEGIN) {
|
||||
+ if (!txp) {
|
||||
+ dev_err(dev,
|
||||
+ "BEGIN without tx data!\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ /*
|
||||
+ * Prepare the parts of the sfcmd register,
|
||||
+ * which should not
|
||||
+ * change during a sequence!
|
||||
+ * Only exception are the length fields,
|
||||
+ * especially alen and dumlen.
|
||||
+ */
|
||||
+
|
||||
+ priv->sfcmd = ((spi->chip_select
|
||||
+ << SFCMD_CS_OFFSET)
|
||||
+ & SFCMD_CS_MASK);
|
||||
+ priv->sfcmd |= SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ priv->sfcmd |= *txp;
|
||||
+ txp++;
|
||||
+ bytelen--;
|
||||
+ if (bytelen) {
|
||||
+ /* more data:
|
||||
+ * maybe address and/or dummy */
|
||||
+ state = state_command_prepare;
|
||||
+ break;
|
||||
+ } else {
|
||||
+ dev_dbg(dev, "write cmd %02X\n",
|
||||
+ priv->sfcmd & SFCMD_OPC_MASK);
|
||||
+ }
|
||||
+ }
|
||||
+ /* continued write ? */
|
||||
+ if (txp && bytelen) {
|
||||
+ state = state_write;
|
||||
+ break;
|
||||
+ }
|
||||
+ /* read data? */
|
||||
+ if (rxp && bytelen) {
|
||||
+ state = state_read;
|
||||
+ break;
|
||||
+ }
|
||||
+ /* end of sequence? */
|
||||
+ if (flags & FALCON_SPI_XFER_END)
|
||||
+ state = state_disable_cs;
|
||||
+ else
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_command_prepare: /* collect tx data for
|
||||
+ address and dummy phase */
|
||||
+ {
|
||||
+ /* txp is valid, already checked */
|
||||
+ val = 0;
|
||||
+ alen = 0;
|
||||
+ dumlen = 0;
|
||||
+ while (bytelen > 0) {
|
||||
+ if (alen < 3) {
|
||||
+ val = (val<<8)|(*txp++);
|
||||
+ alen++;
|
||||
+ } else if ((dumlen < 15) && (*txp == 0)) {
|
||||
+ /*
|
||||
+ * assume dummy bytes are set to 0
|
||||
+ * from upper layer
|
||||
+ */
|
||||
+ dumlen++;
|
||||
+ txp++;
|
||||
+ } else
|
||||
+ break;
|
||||
+ bytelen--;
|
||||
+ }
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK | SFCMD_DUMLEN_MASK);
|
||||
+ priv->sfcmd |= (alen << SFCMD_ALEN_OFFSET) |
|
||||
+ (dumlen << SFCMD_DUMLEN_OFFSET);
|
||||
+ if (alen > 0)
|
||||
+ ebu_w32(val, sfaddr);
|
||||
+
|
||||
+ dev_dbg(dev, "write cmd %02X, alen=%d "
|
||||
+ "(addr=%06X) dumlen=%d\n",
|
||||
+ priv->sfcmd & SFCMD_OPC_MASK,
|
||||
+ alen, val, dumlen);
|
||||
+
|
||||
+ if (bytelen > 0) {
|
||||
+ /* continue with write */
|
||||
+ state = state_write;
|
||||
+ } else if (flags & FALCON_SPI_XFER_END) {
|
||||
+ /* end of sequence? */
|
||||
+ state = state_disable_cs;
|
||||
+ } else {
|
||||
+ /* go to end and expect another
|
||||
+ * call (read or write) */
|
||||
+ state = state_end;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_write:
|
||||
+ {
|
||||
+ /* txp still valid */
|
||||
+ priv->sfcmd |= SFCMD_DIR_WRITE;
|
||||
+ len = 0;
|
||||
+ val = 0;
|
||||
+ do {
|
||||
+ if (bytelen--)
|
||||
+ val |= (*txp++) << (8 * len++);
|
||||
+ if ((flags & FALCON_SPI_XFER_END)
|
||||
+ && (bytelen == 0)) {
|
||||
+ priv->sfcmd &=
|
||||
+ ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ }
|
||||
+ if ((len == 4) || (bytelen == 0)) {
|
||||
+ ebu_w32(val, sfdata);
|
||||
+ ebu_w32(priv->sfcmd
|
||||
+ | (len<<SFCMD_DLEN_OFFSET),
|
||||
+ sfcmd);
|
||||
+ len = 0;
|
||||
+ val = 0;
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK
|
||||
+ | SFCMD_DUMLEN_MASK);
|
||||
+ }
|
||||
+ } while (bytelen);
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_read:
|
||||
+ {
|
||||
+ /* read data */
|
||||
+ priv->sfcmd &= ~SFCMD_DIR_WRITE;
|
||||
+ do {
|
||||
+ if ((flags & FALCON_SPI_XFER_END)
|
||||
+ && (bytelen <= 4)) {
|
||||
+ priv->sfcmd &=
|
||||
+ ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ }
|
||||
+ len = (bytelen > 4) ? 4 : bytelen;
|
||||
+ bytelen -= len;
|
||||
+ ebu_w32(priv->sfcmd
|
||||
+ |(len<<SFCMD_DLEN_OFFSET), sfcmd);
|
||||
+ priv->sfcmd &= ~(SFCMD_ALEN_MASK
|
||||
+ | SFCMD_DUMLEN_MASK);
|
||||
+ do {
|
||||
+ val = ebu_r32(sfstat);
|
||||
+ if (val & SFSTAT_CMD_ERR) {
|
||||
+ /* reset error status */
|
||||
+ dev_err(dev, "SFSTAT: CMD_ERR "
|
||||
+ "(%x)\n", val);
|
||||
+ ebu_w32(SFSTAT_CMD_ERR, sfstat);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ } while (val & SFSTAT_CMD_PEND);
|
||||
+ val = ebu_r32(sfdata);
|
||||
+ do {
|
||||
+ *rxp = (val & 0xFF);
|
||||
+ rxp++;
|
||||
+ val >>= 8;
|
||||
+ len--;
|
||||
+ } while (len);
|
||||
+ } while (bytelen);
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_disable_cs:
|
||||
+ {
|
||||
+ priv->sfcmd &= ~SFCMD_KEEP_CS_KEEP_SELECTED;
|
||||
+ ebu_w32(priv->sfcmd | (0<<SFCMD_DLEN_OFFSET), sfcmd);
|
||||
+ val = ebu_r32(sfstat);
|
||||
+ if (val & SFSTAT_CMD_ERR) {
|
||||
+ /* reset error status */
|
||||
+ dev_err(dev, "SFSTAT: CMD_ERR (%x)\n", val);
|
||||
+ ebu_w32(SFSTAT_CMD_ERR, sfstat);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ state = state_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ case state_end:
|
||||
+ break;
|
||||
+ }
|
||||
+ } while (state != state_end);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int falcon_spi_setup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+ struct falcon_spi *priv = spi_master_get_devdata(spi->master);
|
||||
+ const u32 ebuclk = 100*1000*1000;
|
||||
+ unsigned int i;
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ dev_dbg(dev, "setup\n");
|
||||
+
|
||||
+ if (spi->master->bus_num > 0 || spi->chip_select > 0)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ spin_lock_irqsave(&ebu_lock, flags);
|
||||
+
|
||||
+ if (ebuclk < spi->max_speed_hz) {
|
||||
+ /* set EBU clock to 100 MHz */
|
||||
+ sys1_w32_mask(0, EBUCC_EBUDIV_SELF100, ebucc);
|
||||
+ i = 1; /* divider */
|
||||
+ } else {
|
||||
+ /* set EBU clock to 50 MHz */
|
||||
+ sys1_w32_mask(EBUCC_EBUDIV_SELF100, 0, ebucc);
|
||||
+
|
||||
+ /* search for suitable divider */
|
||||
+ for (i = 1; i < 7; i++) {
|
||||
+ if (ebuclk / i <= spi->max_speed_hz)
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* setup period of serial clock */
|
||||
+ ebu_w32_mask(SFTIME_SCKF_POS_MASK
|
||||
+ | SFTIME_SCKR_POS_MASK
|
||||
+ | SFTIME_SCK_PER_MASK,
|
||||
+ (i << SFTIME_SCKR_POS_OFFSET)
|
||||
+ | (i << (SFTIME_SCK_PER_OFFSET + 1)),
|
||||
+ sftime);
|
||||
+
|
||||
+ /* set some bits of unused_wd, to not trigger HOLD/WP
|
||||
+ * signals on non QUAD flashes */
|
||||
+ ebu_w32((SFIO_UNUSED_WD_MASK & (0x8|0x4)), sfio);
|
||||
+
|
||||
+ ebu_w32(BUSRCON0_AGEN_SERIAL_FLASH | BUSRCON0_PORTW_8_BIT_MUX,
|
||||
+ busrcon0);
|
||||
+ ebu_w32(BUSWCON0_AGEN_SERIAL_FLASH, buswcon0);
|
||||
+ /* set address wrap around to maximum for 24-bit addresses */
|
||||
+ ebu_w32_mask(SFCON_DEV_SIZE_MASK, SFCON_DEV_SIZE_A23_0, sfcon);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&ebu_lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int falcon_spi_transfer(struct spi_device *spi, struct spi_message *m)
|
||||
+{
|
||||
+ struct falcon_spi *priv = spi_master_get_devdata(spi->master);
|
||||
+ struct spi_transfer *t;
|
||||
+ unsigned long spi_flags;
|
||||
+ unsigned long flags;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ priv->sfcmd = 0;
|
||||
+ m->actual_length = 0;
|
||||
+
|
||||
+ spi_flags = FALCON_SPI_XFER_BEGIN;
|
||||
+ list_for_each_entry(t, &m->transfers, transfer_list) {
|
||||
+ if (list_is_last(&t->transfer_list, &m->transfers))
|
||||
+ spi_flags |= FALCON_SPI_XFER_END;
|
||||
+
|
||||
+ spin_lock_irqsave(&ebu_lock, flags);
|
||||
+ ret = falcon_spi_xfer(spi, t, spi_flags);
|
||||
+ spin_unlock_irqrestore(&ebu_lock, flags);
|
||||
+
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+
|
||||
+ m->actual_length += t->len;
|
||||
+
|
||||
+ if (t->delay_usecs || t->cs_change)
|
||||
+ BUG();
|
||||
+
|
||||
+ spi_flags = 0;
|
||||
+ }
|
||||
+
|
||||
+ m->status = ret;
|
||||
+ m->complete(m->context);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void falcon_spi_cleanup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct device *dev = &spi->dev;
|
||||
+
|
||||
+ dev_dbg(dev, "cleanup\n");
|
||||
+}
|
||||
+
|
||||
+static int __devinit falcon_spi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct falcon_spi *priv;
|
||||
+ struct spi_master *master;
|
||||
+ struct resource *memres_ebu, *memres_sys1;
|
||||
+ int ret;
|
||||
+
|
||||
+ dev_dbg(dev, "probing\n");
|
||||
+
|
||||
+ memres_ebu = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ebu");
|
||||
+ memres_sys1 = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
+ "sys1");
|
||||
+
|
||||
+ if (!memres_ebu || !memres_sys1) {
|
||||
+ dev_err(dev, "no resources\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ master = spi_alloc_master(&pdev->dev, sizeof(*priv));
|
||||
+ if (!master) {
|
||||
+ dev_err(dev, "no memory for spi_master\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ priv = spi_master_get_devdata(master);
|
||||
+
|
||||
+ priv->ebu_membase = ioremap_nocache(memres_ebu->start & ~KSEG1,
|
||||
+ resource_size(memres_ebu));
|
||||
+
|
||||
+ if (!priv->ebu_membase) {
|
||||
+ dev_err(dev, "can't map ebu memory\n");
|
||||
+
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_master;
|
||||
+ }
|
||||
+
|
||||
+ priv->sys1_membase = ioremap_nocache(memres_sys1->start & ~KSEG1,
|
||||
+ resource_size(memres_sys1));
|
||||
+
|
||||
+ if (!priv->sys1_membase) {
|
||||
+ dev_err(dev, "can't map sys1 memory\n");
|
||||
+
|
||||
+ ret = -ENOMEM;
|
||||
+ goto unmap_ebu;
|
||||
+ }
|
||||
+
|
||||
+ priv->master = master;
|
||||
+
|
||||
+ master->mode_bits = SPI_MODE_3;
|
||||
+ master->num_chipselect = 1;
|
||||
+ master->bus_num = 0;
|
||||
+
|
||||
+ master->setup = falcon_spi_setup;
|
||||
+ master->transfer = falcon_spi_transfer;
|
||||
+ master->cleanup = falcon_spi_cleanup;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+
|
||||
+ ret = spi_register_master(master);
|
||||
+ if (ret)
|
||||
+ goto unmap_sys1;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+unmap_sys1:
|
||||
+ iounmap(priv->sys1_membase);
|
||||
+
|
||||
+unmap_ebu:
|
||||
+ iounmap(priv->ebu_membase);
|
||||
+
|
||||
+free_master:
|
||||
+ spi_master_put(master);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int __devexit falcon_spi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct falcon_spi *priv = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ dev_dbg(dev, "removed\n");
|
||||
+
|
||||
+ spi_unregister_master(priv->master);
|
||||
+
|
||||
+ iounmap(priv->sys1_membase);
|
||||
+ iounmap(priv->ebu_membase);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver falcon_spi_driver = {
|
||||
+ .probe = falcon_spi_probe,
|
||||
+ .remove = __devexit_p(falcon_spi_remove),
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .owner = THIS_MODULE
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init falcon_spi_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&falcon_spi_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit falcon_spi_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&falcon_spi_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(falcon_spi_init);
|
||||
+module_exit(falcon_spi_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("Lantiq Falcon SPI controller driver");
|
||||
--- a/drivers/spi/Kconfig
|
||||
+++ b/drivers/spi/Kconfig
|
||||
@@ -219,6 +219,10 @@ config SPI_MPC52xx
|
||||
This drivers supports the MPC52xx SPI controller in master SPI
|
||||
mode.
|
||||
|
||||
+config SPI_FALCON
|
||||
+ tristate "Falcon SPI controller support"
|
||||
+ depends on SOC_FALCON
|
||||
+
|
||||
config SPI_MPC52xx_PSC
|
||||
tristate "Freescale MPC52xx PSC SPI controller"
|
||||
depends on PPC_MPC52xx && EXPERIMENTAL
|
|
@ -1,193 +0,0 @@
|
|||
--- a/arch/mips/lantiq/falcon/Makefile
|
||||
+++ b/arch/mips/lantiq/falcon/Makefile
|
||||
@@ -2,3 +2,4 @@ obj-y := clk-falcon.o devices.o gpio.o p
|
||||
obj-y += softdog_vpe.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += addon-easy98000.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98000) += dev-leds-easy98000-cpld.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/dev-leds-easy98000-cpld.c
|
||||
@@ -0,0 +1,160 @@
|
||||
+/*
|
||||
+ * EASY98000 CPLD LED driver
|
||||
+ *
|
||||
+ * Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/version.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#include "dev-leds-easy98000-cpld.h"
|
||||
+
|
||||
+const char *led_name[8] = {
|
||||
+ "ge0_act",
|
||||
+ "ge0_link",
|
||||
+ "ge1_act",
|
||||
+ "ge1_link",
|
||||
+ "fe2_act",
|
||||
+ "fe2_link",
|
||||
+ "fe3_act",
|
||||
+ "fe3_link"
|
||||
+};
|
||||
+
|
||||
+#define cpld_base7 ((u16 *)(KSEG1 | 0x17c0000c))
|
||||
+#define cpld_base8 ((u16 *)(KSEG1 | 0x17c00012))
|
||||
+
|
||||
+#define ltq_r16(reg) __raw_readw(reg)
|
||||
+#define ltq_w16(val, reg) __raw_writew(val, reg)
|
||||
+
|
||||
+struct cpld_led_dev {
|
||||
+ struct led_classdev cdev;
|
||||
+ u8 mask;
|
||||
+ u16 *base;
|
||||
+};
|
||||
+
|
||||
+struct cpld_led_drvdata {
|
||||
+ struct cpld_led_dev *led_devs;
|
||||
+ int num_leds;
|
||||
+};
|
||||
+
|
||||
+void led_set(u8 mask, u16 *base)
|
||||
+{
|
||||
+ ltq_w16(ltq_r16(base) | mask, base);
|
||||
+}
|
||||
+
|
||||
+void led_clear(u8 mask, u16 *base)
|
||||
+{
|
||||
+ ltq_w16(ltq_r16(base) & (~mask), base);
|
||||
+}
|
||||
+
|
||||
+void led_blink_clear(u8 mask, u16 *base)
|
||||
+{
|
||||
+ led_clear(mask, base);
|
||||
+}
|
||||
+
|
||||
+static void led_brightness(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness value)
|
||||
+{
|
||||
+ struct cpld_led_dev *led_dev =
|
||||
+ container_of(led_cdev, struct cpld_led_dev, cdev);
|
||||
+
|
||||
+ if (value)
|
||||
+ led_set(led_dev->mask, led_dev->base);
|
||||
+ else
|
||||
+ led_clear(led_dev->mask, led_dev->base);
|
||||
+}
|
||||
+
|
||||
+static int led_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int i;
|
||||
+ char name[32];
|
||||
+ struct cpld_led_drvdata *drvdata;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ drvdata = kzalloc(sizeof(struct cpld_led_drvdata) +
|
||||
+ sizeof(struct cpld_led_dev) * MAX_LED,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!drvdata)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ drvdata->led_devs = (struct cpld_led_dev *) &drvdata[1];
|
||||
+
|
||||
+ for (i = 0; i < MAX_LED; i++) {
|
||||
+ struct cpld_led_dev *led_dev = &drvdata->led_devs[i];
|
||||
+ led_dev->cdev.brightness_set = led_brightness;
|
||||
+ led_dev->cdev.default_trigger = NULL;
|
||||
+ led_dev->mask = 1 << (i % 8);
|
||||
+ if(i < 8) {
|
||||
+ sprintf(name, "easy98000-cpld:%s", led_name[i]);
|
||||
+ led_dev->base = cpld_base8;
|
||||
+ } else {
|
||||
+ sprintf(name, "easy98000-cpld:red:%d", i-8);
|
||||
+ led_dev->base = cpld_base7;
|
||||
+ }
|
||||
+ led_dev->cdev.name = name;
|
||||
+ ret = led_classdev_register(&pdev->dev, &led_dev->cdev);
|
||||
+ if (ret)
|
||||
+ goto err;
|
||||
+ }
|
||||
+ platform_set_drvdata(pdev, drvdata);
|
||||
+ return 0;
|
||||
+
|
||||
+err:
|
||||
+ printk("led_probe: 3\n");
|
||||
+ for (i = i - 1; i >= 0; i--)
|
||||
+ led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
+
|
||||
+ kfree(drvdata);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int led_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ int i;
|
||||
+ struct cpld_led_drvdata *drvdata = platform_get_drvdata(pdev);
|
||||
+ for (i = 0; i < MAX_LED; i++)
|
||||
+ led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
+ kfree(drvdata);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver led_driver = {
|
||||
+ .probe = led_probe,
|
||||
+ .remove = __devexit_p(led_remove),
|
||||
+ .driver = {
|
||||
+ .name = LED_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+int __init easy98000_cpld_led_init(void)
|
||||
+{
|
||||
+ pr_info(LED_DESC ", Version " LED_VERSION
|
||||
+ " (c) Copyright 2011, Lantiq Deutschland GmbH\n");
|
||||
+ return platform_driver_register(&led_driver);
|
||||
+}
|
||||
+
|
||||
+void __exit easy98000_cpld_led_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&led_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(easy98000_cpld_led_init);
|
||||
+module_exit(easy98000_cpld_led_exit);
|
||||
+
|
||||
+MODULE_DESCRIPTION(LED_NAME);
|
||||
+MODULE_DESCRIPTION(LED_DESC);
|
||||
+MODULE_AUTHOR("Ralph Hempel <ralph.hempel@lantiq.com>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/dev-leds-easy98000-cpld.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/*
|
||||
+ * EASY98000 CPLD LED driver
|
||||
+ *
|
||||
+ * Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+#ifndef _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
+#define _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
+
|
||||
+#define LED_NAME "easy98000_cpld_led"
|
||||
+#define LED_DESC "EASY98000 LED driver"
|
||||
+#define LED_VERSION "1.0.0"
|
||||
+
|
||||
+#define MAX_LED 16
|
||||
+
|
||||
+#endif /* _INCLUDE_EASY98000_CPLD_LED_H_ */
|
|
@ -1,136 +0,0 @@
|
|||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/mach-easy98020.c
|
||||
@@ -0,0 +1,113 @@
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/spi/flash.h>
|
||||
+#include "../machtypes.h"
|
||||
+
|
||||
+#include "devices.h"
|
||||
+#include "dev-leds-gpio.h"
|
||||
+
|
||||
+#define EASY98020_GPIO_LED_0 9
|
||||
+#define EASY98020_GPIO_LED_1 10
|
||||
+#define EASY98020_GPIO_LED_2 11
|
||||
+#define EASY98020_GPIO_LED_3 12
|
||||
+#define EASY98020_GPIO_LED_GE0_ACT 110
|
||||
+#define EASY98020_GPIO_LED_GE0_LINK 109
|
||||
+#define EASY98020_GPIO_LED_GE1_ACT 106
|
||||
+#define EASY98020_GPIO_LED_GE1_LINK 105
|
||||
+
|
||||
+extern unsigned char ltq_ethaddr[6];
|
||||
+
|
||||
+static struct mtd_partition easy98020_spi_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x40000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x40000,
|
||||
+ .size = 0x40000, /* 2 sectors for redundant env. */
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x80000,
|
||||
+ .size = 0xF80000, /* map only 16 MiB */
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct flash_platform_data easy98020_spi_flash_platform_data = {
|
||||
+ .name = "sflash",
|
||||
+ .parts = easy98020_spi_partitions,
|
||||
+ .nr_parts = ARRAY_SIZE(easy98020_spi_partitions)
|
||||
+};
|
||||
+
|
||||
+static struct spi_board_info easy98020_spi_flash_data __initdata = {
|
||||
+ .modalias = "m25p80",
|
||||
+ .bus_num = 0,
|
||||
+ .chip_select = 0,
|
||||
+ .max_speed_hz = 10 * 1000 * 1000,
|
||||
+ .mode = SPI_MODE_3,
|
||||
+ .platform_data = &easy98020_spi_flash_platform_data
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led easy98020_leds_gpio[] __initdata = {
|
||||
+ {
|
||||
+ .name = "easy98020:green:0",
|
||||
+ .gpio = EASY98020_GPIO_LED_0,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:green:1",
|
||||
+ .gpio = EASY98020_GPIO_LED_1,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:green:2",
|
||||
+ .gpio = EASY98020_GPIO_LED_2,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:green:3",
|
||||
+ .gpio = EASY98020_GPIO_LED_3,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:ge0_act",
|
||||
+ .gpio = EASY98020_GPIO_LED_GE0_ACT,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:ge0_link",
|
||||
+ .gpio = EASY98020_GPIO_LED_GE0_LINK,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:ge1_act",
|
||||
+ .gpio = EASY98020_GPIO_LED_GE1_ACT,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98020:ge1_link",
|
||||
+ .gpio = EASY98020_GPIO_LED_GE1_LINK,
|
||||
+ .active_low = 0,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static void __init easy98020_init(void)
|
||||
+{
|
||||
+ falcon_register_asc(0);
|
||||
+ falcon_register_gpio();
|
||||
+ falcon_register_wdt();
|
||||
+ falcon_register_i2c();
|
||||
+ falcon_register_spi_flash(&easy98020_spi_flash_data);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(easy98020_leds_gpio),
|
||||
+ easy98020_leds_gpio);
|
||||
+ falcon_register_crypto();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98020,
|
||||
+ "EASY98020",
|
||||
+ "EASY98020 Eval Board",
|
||||
+ easy98020_init);
|
||||
--- a/arch/mips/lantiq/falcon/Kconfig
|
||||
+++ b/arch/mips/lantiq/falcon/Kconfig
|
||||
@@ -6,6 +6,10 @@ config LANTIQ_MACH_EASY98000
|
||||
bool "Easy98000"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_EASY98020
|
||||
+ bool "Easy98020"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
--- a/arch/mips/lantiq/falcon/Makefile
|
||||
+++ b/arch/mips/lantiq/falcon/Makefile
|
||||
@@ -3,3 +3,4 @@ obj-y += softdog_vpe.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += addon-easy98000.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += dev-leds-easy98000-cpld.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98020) += mach-easy98020.o
|
|
@ -1,132 +0,0 @@
|
|||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/falcon/mach-95C3AM1.c
|
||||
@@ -0,0 +1,99 @@
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/i2c-gpio.h>
|
||||
+#include "../machtypes.h"
|
||||
+
|
||||
+#include "devices.h"
|
||||
+#include "dev-leds-gpio.h"
|
||||
+
|
||||
+#define BOARD_95C3AM1_GPIO_LED_0 10
|
||||
+#define BOARD_95C3AM1_GPIO_LED_1 11
|
||||
+#define BOARD_95C3AM1_GPIO_LED_2 12
|
||||
+#define BOARD_95C3AM1_GPIO_LED_3 13
|
||||
+
|
||||
+extern unsigned char ltq_ethaddr[6];
|
||||
+
|
||||
+static struct mtd_partition board_95C3AM1_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x40000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x40000,
|
||||
+ .size = 0x40000, /* 2 sectors for redundant env. */
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x80000,
|
||||
+ .size = 0xF80000, /* map only 16 MiB */
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct flash_platform_data board_95C3AM1_flash_platform_data = {
|
||||
+ .name = "sflash",
|
||||
+ .parts = board_95C3AM1_partitions,
|
||||
+ .nr_parts = ARRAY_SIZE(board_95C3AM1_partitions)
|
||||
+};
|
||||
+
|
||||
+static struct spi_board_info board_95C3AM1_flash_data __initdata = {
|
||||
+ .modalias = "m25p80",
|
||||
+ .bus_num = 0,
|
||||
+ .chip_select = 0,
|
||||
+ .max_speed_hz = 10 * 1000 * 1000,
|
||||
+ .mode = SPI_MODE_3,
|
||||
+ .platform_data = &board_95C3AM1_flash_platform_data
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led board_95C3AM1_leds_gpio[] __initdata = {
|
||||
+ {
|
||||
+ .name = "power",
|
||||
+ .gpio = BOARD_95C3AM1_GPIO_LED_0,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "optical",
|
||||
+ .gpio = BOARD_95C3AM1_GPIO_LED_1,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "lan",
|
||||
+ .gpio = BOARD_95C3AM1_GPIO_LED_2,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "update",
|
||||
+ .gpio = BOARD_95C3AM1_GPIO_LED_3,
|
||||
+ .active_low = 0,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct i2c_gpio_platform_data board_95C3AM1_i2c_gpio_data = {
|
||||
+ .sda_pin = 107,
|
||||
+ .scl_pin = 108,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device board_95C3AM1_i2c_gpio_device = {
|
||||
+ .name = "i2c-gpio",
|
||||
+ .id = 0,
|
||||
+ .dev = {
|
||||
+ .platform_data = &board_95C3AM1_i2c_gpio_data,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static void __init board_95C3AM1_init(void)
|
||||
+{
|
||||
+ falcon_register_asc(0);
|
||||
+ falcon_register_gpio();
|
||||
+ falcon_register_wdt();
|
||||
+ falcon_register_i2c();
|
||||
+ falcon_register_spi_flash(&board_95C3AM1_flash_data);
|
||||
+ platform_device_register(&board_95C3AM1_i2c_gpio_device);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(board_95C3AM1_leds_gpio),
|
||||
+ board_95C3AM1_leds_gpio);
|
||||
+ falcon_register_crypto();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_95C3AM1,
|
||||
+ "95C3AM1",
|
||||
+ "95C3AM1 Board",
|
||||
+ board_95C3AM1_init);
|
||||
--- a/arch/mips/lantiq/falcon/Kconfig
|
||||
+++ b/arch/mips/lantiq/falcon/Kconfig
|
||||
@@ -10,6 +10,10 @@ config LANTIQ_MACH_EASY98020
|
||||
bool "Easy98020"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_95C3AM1
|
||||
+ bool "95C3AM1"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
--- a/arch/mips/lantiq/falcon/Makefile
|
||||
+++ b/arch/mips/lantiq/falcon/Makefile
|
||||
@@ -4,3 +4,4 @@ obj-$(CONFIG_LANTIQ_MACH_EASY98000) += a
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += dev-leds-easy98000-cpld.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98020) += mach-easy98020.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_95C3AM1) += mach-95C3AM1.o
|
||||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -21,6 +21,7 @@ enum lantiq_mach_type {
|
||||
LANTIQ_MACH_EASY98000SF, /* Falcon Eval Board, Serial Flash */
|
||||
LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
LANTIQ_MACH_EASY98020, /* Falcon Reference Board */
|
||||
+ LANTIQ_MACH_95C3AM1, /* Board 95C3AM1 */
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,163 +0,0 @@
|
|||
--- a/arch/mips/lantiq/irq.c
|
||||
+++ b/arch/mips/lantiq/irq.c
|
||||
@@ -52,6 +52,7 @@
|
||||
#define ltq_eiu_w32(x, y) ltq_w32((x), ltq_eiu_membase + (y))
|
||||
#define ltq_eiu_r32(x) ltq_r32(ltq_eiu_membase + (x))
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static unsigned short ltq_eiu_irq[MAX_EIU] = {
|
||||
LTQ_EIU_IR0,
|
||||
LTQ_EIU_IR1,
|
||||
@@ -60,6 +61,7 @@ static unsigned short ltq_eiu_irq[MAX_EI
|
||||
LTQ_EIU_IR4,
|
||||
LTQ_EIU_IR5,
|
||||
};
|
||||
+#endif
|
||||
|
||||
static struct resource ltq_icu_resource = {
|
||||
.name = "icu",
|
||||
@@ -68,15 +70,19 @@ static struct resource ltq_icu_resource
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static struct resource ltq_eiu_resource = {
|
||||
.name = "eiu",
|
||||
.start = LTQ_EIU_BASE_ADDR,
|
||||
.end = LTQ_EIU_BASE_ADDR + LTQ_ICU_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
+#endif
|
||||
|
||||
static void __iomem *ltq_icu_membase;
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static void __iomem *ltq_eiu_membase;
|
||||
+#endif
|
||||
|
||||
void ltq_disable_irq(struct irq_data *d)
|
||||
{
|
||||
@@ -122,6 +128,7 @@ void ltq_enable_irq(struct irq_data *d)
|
||||
ltq_icu_w32(ltq_icu_r32(ier) | (1 << irq_nr), ier);
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static unsigned int ltq_startup_eiu_irq(struct irq_data *d)
|
||||
{
|
||||
int i;
|
||||
@@ -161,6 +168,7 @@ static void ltq_shutdown_eiu_irq(struct
|
||||
}
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
static struct irq_chip ltq_irq_type = {
|
||||
"icu",
|
||||
@@ -172,6 +180,7 @@ static struct irq_chip ltq_irq_type = {
|
||||
.irq_mask_ack = ltq_mask_and_ack_irq,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static struct irq_chip ltq_eiu_type = {
|
||||
"eiu",
|
||||
.irq_startup = ltq_startup_eiu_irq,
|
||||
@@ -183,6 +192,7 @@ static struct irq_chip ltq_eiu_type = {
|
||||
.irq_mask = ltq_disable_irq,
|
||||
.irq_mask_ack = ltq_mask_and_ack_irq,
|
||||
};
|
||||
+#endif
|
||||
|
||||
static void ltq_hw_irqdispatch(int module)
|
||||
{
|
||||
@@ -198,10 +208,12 @@ static void ltq_hw_irqdispatch(int modul
|
||||
irq = __fls(irq);
|
||||
do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module));
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
/* if this is a EBU irq, we need to ack it or get a deadlock */
|
||||
if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0))
|
||||
ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10,
|
||||
LTQ_EBU_PCC_ISTAT);
|
||||
+#endif
|
||||
}
|
||||
|
||||
#define DEFINE_HWx_IRQDISPATCH(x) \
|
||||
@@ -264,6 +276,7 @@ void __init arch_init_irq(void)
|
||||
if (!ltq_icu_membase)
|
||||
panic("Failed to remap icu memory\n");
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
if (insert_resource(&iomem_resource, <q_eiu_resource) < 0)
|
||||
panic("Failed to insert eiu memory\n");
|
||||
|
||||
@@ -275,6 +288,7 @@ void __init arch_init_irq(void)
|
||||
resource_size(<q_eiu_resource));
|
||||
if (!ltq_eiu_membase)
|
||||
panic("Failed to remap eiu memory\n");
|
||||
+#endif
|
||||
|
||||
/* make sure all irqs are turned off by default */
|
||||
for (i = 0; i < 5; i++)
|
||||
@@ -300,6 +314,7 @@ void __init arch_init_irq(void)
|
||||
|
||||
for (i = INT_NUM_IRQ0;
|
||||
i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++)
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
if ((i == LTQ_EIU_IR0) || (i == LTQ_EIU_IR1) ||
|
||||
(i == LTQ_EIU_IR2))
|
||||
irq_set_chip_and_handler(i, <q_eiu_type,
|
||||
@@ -310,6 +325,7 @@ void __init arch_init_irq(void)
|
||||
irq_set_chip_and_handler(i, <q_eiu_type,
|
||||
handle_level_irq);
|
||||
else
|
||||
+#endif
|
||||
irq_set_chip_and_handler(i, <q_irq_type,
|
||||
handle_level_irq);
|
||||
|
||||
--- a/arch/mips/lantiq/clk.c
|
||||
+++ b/arch/mips/lantiq/clk.c
|
||||
@@ -46,6 +46,7 @@ static struct clk cpu_clk_generic[] = {
|
||||
},
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
static struct resource ltq_cgu_resource = {
|
||||
.name = "cgu",
|
||||
.start = LTQ_CGU_BASE_ADDR,
|
||||
@@ -55,6 +56,7 @@ static struct resource ltq_cgu_resource
|
||||
|
||||
/* remapped clock register range */
|
||||
void __iomem *ltq_cgu_membase;
|
||||
+#endif
|
||||
|
||||
void clk_init(void)
|
||||
{
|
||||
@@ -131,6 +133,7 @@ void __init plat_time_init(void)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
||||
+#ifdef CONFIG_SOC_XWAY
|
||||
if (insert_resource(&iomem_resource, <q_cgu_resource) < 0)
|
||||
panic("Failed to insert cgu memory\n");
|
||||
|
||||
@@ -144,6 +147,7 @@ void __init plat_time_init(void)
|
||||
pr_err("Failed to remap cgu memory\n");
|
||||
unreachable();
|
||||
}
|
||||
+#endif
|
||||
clk = clk_get(0, "cpu");
|
||||
mips_hpt_frequency = clk_get_rate(clk) / ltq_get_counter_resolution();
|
||||
write_c0_compare(read_c0_count());
|
||||
--- a/arch/mips/lantiq/early_printk.c
|
||||
+++ b/arch/mips/lantiq/early_printk.c
|
||||
@@ -13,7 +13,11 @@
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
/* no ioremap possible at this early stage, lets use KSEG1 instead */
|
||||
+#ifdef CONFIG_SOC_FALCON
|
||||
+#define LTQ_ASC_BASE KSEG1ADDR(LTQ_ASC0_BASE_ADDR)
|
||||
+#else
|
||||
#define LTQ_ASC_BASE KSEG1ADDR(LTQ_ASC1_BASE_ADDR)
|
||||
+#endif
|
||||
#define ASC_BUF 1024
|
||||
#define LTQ_ASC_FSTAT ((u32 *)(LTQ_ASC_BASE + 0x0048))
|
||||
#define LTQ_ASC_TBUF ((u32 *)(LTQ_ASC_BASE + 0x0020))
|
|
@ -1,48 +0,0 @@
|
|||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h
|
||||
@@ -0,0 +1,45 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LTQ_FALCON_H__
|
||||
+#define _LTQ_FALCON_H__
|
||||
+
|
||||
+#ifdef CONFIG_SOC_FALCON
|
||||
+
|
||||
+#include <lantiq.h>
|
||||
+
|
||||
+/* Chip IDs */
|
||||
+#define SOC_ID_FALCON 0x01B8
|
||||
+
|
||||
+/* SoC Types */
|
||||
+#define SOC_TYPE_FALCON 0x01
|
||||
+
|
||||
+/* ASC0/1 - serial port */
|
||||
+#define LTQ_ASC0_BASE_ADDR 0x1E100C00
|
||||
+#define LTQ_ASC1_BASE_ADDR 0x1E100B00
|
||||
+#define LTQ_ASC_SIZE 0x100
|
||||
+
|
||||
+#define LTQ_ASC_TIR(x) (INT_NUM_IM3_IRL0 + (x * 8))
|
||||
+#define LTQ_ASC_RIR(x) (INT_NUM_IM3_IRL0 + (x * 8) + 1)
|
||||
+#define LTQ_ASC_EIR(x) (INT_NUM_IM3_IRL0 + (x * 8) + 2)
|
||||
+
|
||||
+/* ICU - interrupt control unit */
|
||||
+#define LTQ_ICU_BASE_ADDR 0x1F880200
|
||||
+#define LTQ_ICU_SIZE 0x100
|
||||
+
|
||||
+/* WDT */
|
||||
+#define LTQ_WDT_BASE_ADDR 0x1F8803F0
|
||||
+#define LTQ_WDT_SIZE 0x10
|
||||
+
|
||||
+extern int ltq_gpio_request(unsigned int pin, unsigned int alt0,
|
||||
+ unsigned int alt1, unsigned int dir,
|
||||
+ const char *name);
|
||||
+extern int ltq_gpio_mux_set(unsigned int pin, unsigned int mux);
|
||||
+
|
||||
+#endif /* CONFIG_SOC_FALCON */
|
||||
+#endif /* _LTQ_XWAY_H__ */
|
|
@ -1,3 +1,23 @@
|
|||
Index: linux-3.0.3/arch/mips/lantiq/irq.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/irq.c 2011-09-29 20:43:07.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/irq.c 2011-09-29 20:45:14.785132132 +0200
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
+#include <linux/module.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq_cpu.h>
|
||||
@@ -102,6 +103,7 @@
|
||||
ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier);
|
||||
ltq_icu_w32((1 << irq_nr), isr);
|
||||
}
|
||||
+EXPORT_SYMBOL(ltq_mask_and_ack_irq);
|
||||
|
||||
static void ltq_ack_irq(struct irq_data *d)
|
||||
{
|
||||
--- a/arch/mips/mm/cache.c
|
||||
+++ b/arch/mips/mm/cache.c
|
||||
@@ -52,6 +52,8 @@ void (*_dma_cache_wback)(unsigned long s
|
|
@ -1,6 +1,8 @@
|
|||
--- a/arch/mips/lantiq/prom.c
|
||||
+++ b/arch/mips/lantiq/prom.c
|
||||
@@ -39,6 +39,34 @@ void prom_free_prom_memory(void)
|
||||
Index: linux-3.0.3/arch/mips/lantiq/prom.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/prom.c 2011-10-02 15:49:12.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/prom.c 2011-10-02 15:50:34.614270672 +0200
|
||||
@@ -43,6 +43,34 @@
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -35,11 +37,11 @@
|
|||
static void __init prom_init_cmdline(void)
|
||||
{
|
||||
int argc = fw_arg0;
|
||||
@@ -55,6 +83,7 @@ static void __init prom_init_cmdline(voi
|
||||
@@ -59,6 +87,7 @@
|
||||
strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline));
|
||||
}
|
||||
}
|
||||
+ prom_init_image_cmdline();
|
||||
}
|
||||
|
||||
void __init prom_init(void)
|
||||
void __iomem *ltq_remap_resource(struct resource *res)
|
54
target/linux/lantiq/patches-3.0/205-owrt-gpio-export.patch
Normal file
54
target/linux/lantiq/patches-3.0/205-owrt-gpio-export.patch
Normal file
|
@ -0,0 +1,54 @@
|
|||
Index: linux-3.0.3/drivers/gpio/gpiolib.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/gpio/gpiolib.c 2011-10-03 00:13:35.359561120 +0200
|
||||
+++ linux-3.0.3/drivers/gpio/gpiolib.c 2011-10-03 09:52:55.785047081 +0200
|
||||
@@ -64,9 +64,9 @@
|
||||
#define GPIO_FLAGS_MASK ((1 << ID_SHIFT) - 1)
|
||||
#define GPIO_TRIGGER_MASK (BIT(FLAG_TRIG_FALL) | BIT(FLAG_TRIG_RISE))
|
||||
|
||||
-#ifdef CONFIG_DEBUG_FS
|
||||
+//#ifdef CONFIG_DEBUG_FS
|
||||
const char *label;
|
||||
-#endif
|
||||
+//#endif
|
||||
};
|
||||
static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];
|
||||
|
||||
@@ -76,9 +76,9 @@
|
||||
|
||||
static inline void desc_set_label(struct gpio_desc *d, const char *label)
|
||||
{
|
||||
-#ifdef CONFIG_DEBUG_FS
|
||||
+//#ifdef CONFIG_DEBUG_FS
|
||||
d->label = label;
|
||||
-#endif
|
||||
+//#endif
|
||||
}
|
||||
|
||||
/* Warn when drivers omit gpio_request() calls -- legal but ill-advised
|
||||
@@ -727,7 +727,8 @@
|
||||
|
||||
if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
|
||||
ioname = desc->chip->names[gpio - desc->chip->base];
|
||||
-
|
||||
+ else
|
||||
+ ioname = gpio_desc[gpio].label;
|
||||
if (status == 0) {
|
||||
struct device *dev;
|
||||
|
||||
@@ -1347,11 +1348,11 @@
|
||||
return NULL;
|
||||
if (test_bit(FLAG_REQUESTED, &gpio_desc[gpio].flags) == 0)
|
||||
return NULL;
|
||||
-#ifdef CONFIG_DEBUG_FS
|
||||
+//#ifdef CONFIG_DEBUG_FS
|
||||
return gpio_desc[gpio].label;
|
||||
-#else
|
||||
- return "?";
|
||||
-#endif
|
||||
+//#else
|
||||
+// return "?";
|
||||
+//#endif
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_is_requested);
|
||||
|
325
target/linux/lantiq/patches-3.0/210-machtypes.patch
Normal file
325
target/linux/lantiq/patches-3.0/210-machtypes.patch
Normal file
|
@ -0,0 +1,325 @@
|
|||
Index: linux-3.0.3/arch/mips/lantiq/machtypes.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/machtypes.h 2011-10-05 14:32:23.173150836 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/machtypes.h 2011-10-05 14:32:23.385150846 +0200
|
||||
@@ -20,9 +20,33 @@
|
||||
LANTIQ_MACH_EASY98000, /* Falcon Eval Board, NOR Flash */
|
||||
LANTIQ_MACH_EASY98000SF, /* Falcon Eval Board, Serial Flash */
|
||||
LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
+ LANTIQ_MACH_EASY98020, /* EASY98020 Eval Board */
|
||||
+ LANTIQ_MACH_EASY98020_1LAN, /* EASY98020 Eval Board (1 LAN port) */
|
||||
+ LANTIQ_MACH_EASY98020_2LAN, /* EASY98020 Eval Board (2 LAN port) */
|
||||
+ LANTIQ_MACH_95C3AM1, /* 95C3AM1 Eval Board */
|
||||
|
||||
/* FRITZ!BOX */
|
||||
LANTIQ_MACH_FRITZ3370, /* FRITZ!BOX 3370 vdsl cpe */
|
||||
+
|
||||
+ /* Arcadyan */
|
||||
+ LANTIQ_MACH_ARV3527P, /* Arcor easybox a401 */
|
||||
+ LANTIQ_MACH_ARV4510PW, /* Wippies Homebox */
|
||||
+ LANTIQ_MACH_ARV4518PW, /* Airties WAV-221, SMC-7908A-ISP */
|
||||
+ LANTIQ_MACH_ARV4520PW, /* Airties WAV-281, Arcor EasyboxA800 */
|
||||
+ LANTIQ_MACH_ARV452CPW, /* Arcor EasyboxA801 */
|
||||
+ LANTIQ_MACH_ARV4525PW, /* Speedport W502V */
|
||||
+ LANTIQ_MACH_ARV752DPW, /* Arcor easybox a802 */
|
||||
+ LANTIQ_MACH_ARV752DPW22, /* Arcor easybox a803 */
|
||||
+ LANTIQ_MACH_ARV7518PW, /* ASTORIA */
|
||||
+
|
||||
+ /* Netgear */
|
||||
+ LANTIQ_MACH_DGN3500B, /* Netgear DGN3500 */
|
||||
+
|
||||
+ /* Gigaset */
|
||||
+ LANTIQ_MACH_GIGASX76X, /* Gigaset SX76x */
|
||||
+
|
||||
+ /* Buffalo */
|
||||
+ LANTIQ_MACH_WBMR, /* WBMR-HP-G300H */
|
||||
};
|
||||
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/Kconfig 2011-10-05 14:32:23.173150836 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/Kconfig 2011-10-05 14:32:23.385150846 +0200
|
||||
@@ -6,6 +6,22 @@
|
||||
bool "Easy50712 - Danube"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_ARV45XX
|
||||
+ bool "ARV45XX"
|
||||
+ default y
|
||||
+
|
||||
+config LANTIQ_MACH_NETGEAR
|
||||
+ bool "Netgear"
|
||||
+ default y
|
||||
+
|
||||
+config LANTIQ_MACH_GIGASX76X
|
||||
+ bool "GIGASX76X"
|
||||
+ default y
|
||||
+
|
||||
+config LANTIQ_MACH_WBMR
|
||||
+ bool "WBMR-HP-G300H"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/Makefile 2011-10-05 14:32:23.173150836 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/Makefile 2011-10-05 15:46:10.061340080 +0200
|
||||
@@ -7,3 +7,7 @@
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_FRITZ3370) += mach-fritz.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_ARV45XX) += mach-arv45xx.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_NETGEAR) += mach-netgear.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_GIGASX76X) += mach-gigasx76x.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_WBMR) += mach-wbmr.o
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/Kconfig 2011-10-05 14:32:22.745150818 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/Kconfig 2011-10-05 14:32:23.385150846 +0200
|
||||
@@ -6,6 +6,14 @@
|
||||
bool "Easy98000"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_EASY98020
|
||||
+ bool "Easy98020"
|
||||
+ default y
|
||||
+
|
||||
+config LANTIQ_MACH_95C3AM1
|
||||
+ bool "95C3AM1"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/Makefile 2011-10-05 14:32:23.089150832 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/Makefile 2011-10-05 14:32:23.389150846 +0200
|
||||
@@ -1,2 +1,6 @@
|
||||
obj-y := clk.o prom.o reset.o sysctrl.o devices.o gpio.o softdog_vpe.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98000) += addon-easy98000.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98000) += dev-leds-easy98000-cpld.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY98000) += mach-easy98000.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_EASY98020) += mach-easy98020.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_95C3AM1) += mach-95C3AM1.o
|
||||
Index: linux-3.0.3/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/falcon/mach-easy98000.c 2011-10-05 15:17:45.445267210 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/falcon/mach-easy98000.c 2011-10-05 15:45:54.153339399 +0200
|
||||
@@ -1,23 +1,38 @@
|
||||
-/*
|
||||
- * 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.
|
||||
- *
|
||||
- * Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com>
|
||||
- * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
- */
|
||||
-
|
||||
+#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/dm9000.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/i2c-gpio.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
#include <linux/spi/eeprom.h>
|
||||
+#include <falcon/lantiq_soc.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
|
||||
#include "devices.h"
|
||||
+#include "dev-leds-gpio.h"
|
||||
+
|
||||
+#define EASY98000_GPIO_LED_0 9
|
||||
+#define EASY98000_GPIO_LED_1 10
|
||||
+#define EASY98000_GPIO_LED_2 11
|
||||
+#define EASY98000_GPIO_LED_3 12
|
||||
+#define EASY98000_GPIO_LED_4 13
|
||||
+#define EASY98000_GPIO_LED_5 14
|
||||
+
|
||||
+extern unsigned char ltq_ethaddr[6];
|
||||
|
||||
-static struct mtd_partition easy98000_nor_partitions[] = {
|
||||
+static struct mtd_partition easy98000_nor_partitions[] =
|
||||
+{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
@@ -35,7 +50,7 @@
|
||||
},
|
||||
};
|
||||
|
||||
-struct physmap_flash_data easy98000_nor_flash_data = {
|
||||
+static struct physmap_flash_data easy98000_nor_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(easy98000_nor_partitions),
|
||||
.parts = easy98000_nor_partitions,
|
||||
};
|
||||
@@ -55,12 +70,105 @@
|
||||
.platform_data = &easy98000_spi_flash_platform_data
|
||||
};
|
||||
|
||||
+static struct gpio_led easy98000_leds_gpio[] __initdata = {
|
||||
+ {
|
||||
+ .name = "easy98000:green:0",
|
||||
+ .gpio = EASY98000_GPIO_LED_0,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98000:green:1",
|
||||
+ .gpio = EASY98000_GPIO_LED_1,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98000:green:2",
|
||||
+ .gpio = EASY98000_GPIO_LED_2,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98000:green:3",
|
||||
+ .gpio = EASY98000_GPIO_LED_3,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98000:green:4",
|
||||
+ .gpio = EASY98000_GPIO_LED_4,
|
||||
+ .active_low = 0,
|
||||
+ }, {
|
||||
+ .name = "easy98000:green:5",
|
||||
+ .gpio = EASY98000_GPIO_LED_5,
|
||||
+ .active_low = 0,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+#define CONFIG_DM9000_BASE 0x14000000
|
||||
+#define DM9000_IO (CONFIG_DM9000_BASE + 3)
|
||||
+#define DM9000_DATA (CONFIG_DM9000_BASE + 1)
|
||||
+
|
||||
+static struct dm9000_plat_data dm9000_plat_data = {
|
||||
+ .flags = DM9000_PLATF_8BITONLY,
|
||||
+ //.dev_addr = { }, /* possibility to provide an ethernet address for the chip */
|
||||
+};
|
||||
+
|
||||
+static struct resource dm9000_resources[] = {
|
||||
+ MEM_RES("dm9000_io", DM9000_IO, DM9000_IO),
|
||||
+ MEM_RES("dm9000_data", DM9000_DATA, DM9000_DATA),
|
||||
+ [2] = {
|
||||
+ /* with irq (210 -> gpio 110) the driver is very unreliable */
|
||||
+ .start = -1, /* use polling */
|
||||
+ .end = -1,
|
||||
+ .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct platform_device dm9000_platform = {
|
||||
+ .name = "dm9000",
|
||||
+ .id = 0,
|
||||
+ .num_resources = ARRAY_SIZE(dm9000_resources),
|
||||
+ .resource = dm9000_resources,
|
||||
+ .dev = {
|
||||
+ .platform_data = (void *) &dm9000_plat_data,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+extern int easy98000_addon_has_dm9000(void);
|
||||
+static void __init register_davicom(void)
|
||||
+{
|
||||
+ if (!easy98000_addon_has_dm9000())
|
||||
+ return;
|
||||
+
|
||||
+ if (!is_valid_ether_addr(ltq_ethaddr))
|
||||
+ random_ether_addr(dm9000_plat_data.dev_addr);
|
||||
+ else {
|
||||
+ memcpy(dm9000_plat_data.dev_addr, ltq_ethaddr, 6);
|
||||
+ /* change to "Locally Administered Address" */
|
||||
+ dm9000_plat_data.dev_addr[0] |= 0x2;
|
||||
+ }
|
||||
+ platform_device_register(&dm9000_platform);
|
||||
+}
|
||||
+
|
||||
+static struct i2c_gpio_platform_data easy98000_i2c_gpio_data = {
|
||||
+ .sda_pin = 107,
|
||||
+ .scl_pin = 108,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device easy98000_i2c_gpio_device = {
|
||||
+ .name = "i2c-gpio",
|
||||
+ .id = 0,
|
||||
+ .dev = {
|
||||
+ .platform_data = &easy98000_i2c_gpio_data,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+void __init register_easy98000_cpld(void)
|
||||
+{
|
||||
+ platform_device_register_simple("easy98000_cpld_led", 0, NULL, 0);
|
||||
+ platform_device_register_simple("easy98000_addon", 0, NULL, 0);
|
||||
+}
|
||||
+
|
||||
/* setup gpio based spi bus/device for access to the eeprom on the board */
|
||||
-#define SPI_GPIO_MRST 102
|
||||
-#define SPI_GPIO_MTSR 103
|
||||
-#define SPI_GPIO_CLK 104
|
||||
-#define SPI_GPIO_CS0 105
|
||||
-#define SPI_GPIO_CS1 106
|
||||
+#define SPI_GPIO_MRST 102
|
||||
+#define SPI_GPIO_MTSR 103
|
||||
+#define SPI_GPIO_CLK 104
|
||||
+#define SPI_GPIO_CS0 105
|
||||
+#define SPI_GPIO_CS1 106
|
||||
#define SPI_GPIO_BUS_NUM 1
|
||||
|
||||
static struct spi_gpio_platform_data easy98000_spi_gpio_data = {
|
||||
@@ -93,29 +201,36 @@
|
||||
.platform_data = &at25160n,
|
||||
};
|
||||
|
||||
-static void __init
|
||||
-easy98000_init_common(void)
|
||||
+static void __init easy98000_spi_gpio_init(void)
|
||||
{
|
||||
spi_register_board_info(&easy98000_spi_gpio_devices, 1);
|
||||
platform_device_register(&easy98000_spi_gpio_device);
|
||||
}
|
||||
|
||||
-static void __init
|
||||
-easy98000_init(void)
|
||||
+static void __init easy98000_init_common(void)
|
||||
+{
|
||||
+ falcon_register_i2c();
|
||||
+ platform_device_register(&easy98000_i2c_gpio_device);
|
||||
+ register_davicom();
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(easy98000_leds_gpio),
|
||||
+ easy98000_leds_gpio);
|
||||
+ register_easy98000_cpld();
|
||||
+ easy98000_spi_gpio_init();
|
||||
+}
|
||||
+
|
||||
+static void __init easy98000_init(void)
|
||||
{
|
||||
easy98000_init_common();
|
||||
ltq_register_nor(&easy98000_nor_flash_data);
|
||||
}
|
||||
|
||||
-static void __init
|
||||
-easy98000sf_init(void)
|
||||
+static void __init easy98000sf_init(void)
|
||||
{
|
||||
easy98000_init_common();
|
||||
falcon_register_spi_flash(&easy98000_spi_flash_data);
|
||||
}
|
||||
|
||||
-static void __init
|
||||
-easy98000nand_init(void)
|
||||
+static void __init easy98000nand_init(void)
|
||||
{
|
||||
easy98000_init_common();
|
||||
falcon_register_nand();
|
198
target/linux/lantiq/patches-3.0/211-devices.patch
Normal file
198
target/linux/lantiq/patches-3.0/211-devices.patch
Normal file
|
@ -0,0 +1,198 @@
|
|||
Index: linux-3.0.3/arch/mips/lantiq/devices.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/devices.c 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/devices.c 2011-10-04 20:07:28.514316826 +0200
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -102,3 +103,20 @@
|
||||
pr_err("kernel is compiled without PCI support\n");
|
||||
}
|
||||
#endif
|
||||
+
|
||||
+static unsigned int *cp1_base = 0;
|
||||
+unsigned int*
|
||||
+ltq_get_cp1_base(void)
|
||||
+{
|
||||
+ return cp1_base;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_cp1_base);
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_tapi(void)
|
||||
+{
|
||||
+#define CP1_SIZE (1 << 20)
|
||||
+ dma_addr_t dma;
|
||||
+ cp1_base =
|
||||
+ (void*)CPHYSADDR(dma_alloc_coherent(NULL, CP1_SIZE, &dma, GFP_ATOMIC));
|
||||
+}
|
||||
Index: linux-3.0.3/arch/mips/lantiq/devices.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/devices.h 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/devices.h 2011-10-04 20:07:13.362316180 +0200
|
||||
@@ -23,5 +23,6 @@
|
||||
extern void ltq_register_wdt(void);
|
||||
extern void ltq_register_asc(int port);
|
||||
extern void ltq_register_pci(struct ltq_pci_data *data);
|
||||
+extern void ltq_register_tapi(void);
|
||||
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/Makefile 2011-10-04 20:07:01.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/Makefile 2011-10-04 20:07:13.362316180 +0200
|
||||
@@ -1,5 +1,7 @@
|
||||
obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o timer.o
|
||||
|
||||
+obj-y += dev-dwc_otg.o
|
||||
+
|
||||
obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
|
||||
obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
|
||||
obj-$(CONFIG_SOC_VR9) += clk-vr9.o prom-vr9.o
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/devices.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/devices.c 2011-10-04 20:05:44.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/devices.c 2011-10-04 20:07:44.070317494 +0200
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -101,3 +102,94 @@
|
||||
platform_device_register(<q_etop);
|
||||
}
|
||||
}
|
||||
+
|
||||
+/* madwifi */
|
||||
+int lantiq_emulate_madwifi_eep = 0;
|
||||
+EXPORT_SYMBOL(lantiq_emulate_madwifi_eep);
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_madwifi_eep(void)
|
||||
+{
|
||||
+ lantiq_emulate_madwifi_eep = 1;
|
||||
+}
|
||||
+
|
||||
+/* ebu */
|
||||
+static struct resource ltq_ebu_resource =
|
||||
+{
|
||||
+ .name = "gpio_ebu",
|
||||
+ .start = LTQ_EBU_GPIO_START,
|
||||
+ .end = LTQ_EBU_GPIO_START + LTQ_EBU_GPIO_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ltq_ebu =
|
||||
+{
|
||||
+ .name = "ltq_ebu",
|
||||
+ .resource = <q_ebu_resource,
|
||||
+ .num_resources = 1,
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_gpio_ebu(unsigned int value)
|
||||
+{
|
||||
+ ltq_ebu.dev.platform_data = (void*) value;
|
||||
+ platform_device_register(<q_ebu);
|
||||
+}
|
||||
+
|
||||
+/* gpio buttons */
|
||||
+static struct gpio_buttons_platform_data ltq_gpio_buttons_platform_data;
|
||||
+
|
||||
+static struct platform_device ltq_gpio_buttons_platform_device =
|
||||
+{
|
||||
+ .name = "gpio-buttons",
|
||||
+ .id = 0,
|
||||
+ .dev = {
|
||||
+ .platform_data = (void *) <q_gpio_buttons_platform_data,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_gpio_buttons(struct gpio_button *buttons, int cnt)
|
||||
+{
|
||||
+ ltq_gpio_buttons_platform_data.buttons = buttons;
|
||||
+ ltq_gpio_buttons_platform_data.nbuttons = cnt;
|
||||
+ platform_device_register(<q_gpio_buttons_platform_device);
|
||||
+}
|
||||
+
|
||||
+static struct resource ltq_spi_resources[] = {
|
||||
+ {
|
||||
+ .start = LTQ_SSC_BASE_ADDR,
|
||||
+ .end = LTQ_SSC_BASE_ADDR + LTQ_SSC_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ },
|
||||
+ IRQ_RES(spi_tx, LTQ_SSC_TIR),
|
||||
+ IRQ_RES(spi_rx, LTQ_SSC_RIR),
|
||||
+ IRQ_RES(spi_err, LTQ_SSC_EIR),
|
||||
+};
|
||||
+
|
||||
+static struct resource ltq_spi_resources_ar9[] = {
|
||||
+ {
|
||||
+ .start = LTQ_SSC_BASE_ADDR,
|
||||
+ .end = LTQ_SSC_BASE_ADDR + LTQ_SSC_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ },
|
||||
+ IRQ_RES(spi_tx, LTQ_SSC_TIR_AR9),
|
||||
+ IRQ_RES(spi_rx, LTQ_SSC_RIR_AR9),
|
||||
+ IRQ_RES(spi_err, LTQ_SSC_EIR),
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ltq_spi = {
|
||||
+ .name = "ltq-spi",
|
||||
+ .resource = ltq_spi_resources,
|
||||
+ .num_resources = ARRAY_SIZE(ltq_spi_resources),
|
||||
+};
|
||||
+
|
||||
+void __init ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
+ struct spi_board_info const *info, unsigned n)
|
||||
+{
|
||||
+ if(ltq_is_ar9())
|
||||
+ ltq_spi.resource = ltq_spi_resources_ar9;
|
||||
+ spi_register_board_info(info, n);
|
||||
+ ltq_spi.dev.platform_data = pdata;
|
||||
+ platform_device_register(<q_spi);
|
||||
+}
|
||||
Index: linux-3.0.3/arch/mips/lantiq/xway/devices.h
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/xway/devices.h 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/xway/devices.h 2011-10-04 20:07:13.366316178 +0200
|
||||
@@ -11,10 +11,17 @@
|
||||
|
||||
#include "../devices.h"
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
|
||||
extern void ltq_register_gpio(void);
|
||||
extern void ltq_register_gpio_stp(void);
|
||||
extern void ltq_register_ase_asc(void);
|
||||
extern void ltq_register_etop(struct ltq_eth_data *eth);
|
||||
+extern void ltq_register_gpio_ebu(unsigned int value);
|
||||
+extern void ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
+ struct spi_board_info const *info, unsigned n);
|
||||
+extern void ltq_register_madwifi_eep(void);
|
||||
+extern void ltq_register_gpio_buttons(struct gpio_button *buttons, int cnt);
|
||||
|
||||
#endif
|
||||
Index: linux-3.0.3/arch/mips/lantiq/Makefile
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/Makefile 2011-10-04 20:03:54.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/Makefile 2011-10-04 20:08:10.406318621 +0200
|
||||
@@ -4,7 +4,7 @@
|
||||
# under the terms of the GNU General Public License version 2 as published
|
||||
# by the Free Software Foundation.
|
||||
|
||||
-obj-y := irq.o setup.o clk.o prom.o devices.o
|
||||
+obj-y := irq.o setup.o clk.o prom.o devices.o dev-leds-gpio.o dev-gpio-buttons.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
Date: Thu, 3 Mar 2011 17:15:58 +0000 (+0100)
|
||||
Subject: MIPS: lantiq: Add platform data for Lantiq SoC SPI controller driver
|
||||
X-Git-Url: http://nbd.name/gitweb.cgi?p=lantiq.git;a=commitdiff_plain;h=3d21b04682ae8eb1c1965aba39d1796e8c5ad84b;hp=06b420500fe98e37662837e78d8e51aead8aea81
|
||||
|
||||
MIPS: lantiq: Add platform data for Lantiq SoC SPI controller driver
|
||||
|
||||
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
---
|
||||
|
||||
--- a/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
|
||||
@@ -50,4 +50,13 @@ struct ltq_eth_data {
|
||||
int mii_mode;
|
||||
};
|
||||
|
||||
+
|
||||
+struct ltq_spi_platform_data {
|
||||
+ u16 num_chipselect;
|
||||
+};
|
||||
+
|
||||
+struct ltq_spi_controller_data {
|
||||
+ unsigned gpio;
|
||||
+};
|
||||
+
|
||||
#endif
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
|
||||
@@ -75,6 +75,7 @@
|
||||
|
||||
#define PMU_DMA 0x0020
|
||||
#define PMU_USB 0x8041
|
||||
+#define PMU_SPI 0x0100
|
||||
#define PMU_LED 0x0800
|
||||
#define PMU_GPT 0x1000
|
||||
#define PMU_PPE 0x2000
|
|
@ -1,89 +0,0 @@
|
|||
From: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
Date: Thu, 3 Mar 2011 20:42:26 +0000 (+0100)
|
||||
Subject: MIPS: lantiq: Add device register helper for SPI controller and devices
|
||||
X-Git-Url: http://nbd.name/gitweb.cgi?p=lantiq.git;a=commitdiff_plain;h=b35b07062b718ece9b9cb7b23b12d83a087eafb0;hp=653c95b8b9066c9c6ac08bd64d0ceee439e9fd90
|
||||
|
||||
MIPS: lantiq: Add device register helper for SPI controller and devices
|
||||
|
||||
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
||||
---
|
||||
|
||||
--- a/arch/mips/lantiq/xway/devices.h
|
||||
+++ b/arch/mips/lantiq/xway/devices.h
|
||||
@@ -11,10 +11,13 @@
|
||||
|
||||
#include "../devices.h"
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
|
||||
extern void ltq_register_gpio(void);
|
||||
extern void ltq_register_gpio_stp(void);
|
||||
extern void ltq_register_ase_asc(void);
|
||||
extern void ltq_register_etop(struct ltq_eth_data *eth);
|
||||
+extern void ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
+ struct spi_board_info const *info, unsigned n);
|
||||
|
||||
#endif
|
||||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -119,3 +120,41 @@ ltq_register_etop(struct ltq_eth_data *e
|
||||
platform_device_register(<q_etop);
|
||||
}
|
||||
}
|
||||
+
|
||||
+static struct resource ltq_spi_resources[] = {
|
||||
+ {
|
||||
+ .start = LTQ_SSC_BASE_ADDR,
|
||||
+ .end = LTQ_SSC_BASE_ADDR + LTQ_SSC_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ },
|
||||
+ IRQ_RES(spi_tx, LTQ_SSC_TIR),
|
||||
+ IRQ_RES(spi_rx, LTQ_SSC_RIR),
|
||||
+ IRQ_RES(spi_err, LTQ_SSC_EIR),
|
||||
+};
|
||||
+
|
||||
+static struct resource ltq_spi_resources_ar9[] = {
|
||||
+ {
|
||||
+ .start = LTQ_SSC_BASE_ADDR,
|
||||
+ .end = LTQ_SSC_BASE_ADDR + LTQ_SSC_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ },
|
||||
+ IRQ_RES(spi_tx, LTQ_SSC_TIR_AR9),
|
||||
+ IRQ_RES(spi_rx, LTQ_SSC_RIR_AR9),
|
||||
+ IRQ_RES(spi_err, LTQ_SSC_EIR),
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ltq_spi = {
|
||||
+ .name = "ltq-spi",
|
||||
+ .resource = ltq_spi_resources,
|
||||
+ .num_resources = ARRAY_SIZE(ltq_spi_resources),
|
||||
+};
|
||||
+
|
||||
+void __init ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
+ struct spi_board_info const *info, unsigned n)
|
||||
+{
|
||||
+ if(ltq_is_ar9())
|
||||
+ ltq_spi.resource = ltq_spi_resources_ar9;
|
||||
+ spi_register_board_info(info, n);
|
||||
+ ltq_spi.dev.platform_data = pdata;
|
||||
+ platform_device_register(<q_spi);
|
||||
+}
|
||||
--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#define LTQ_SSC_TIR (INT_NUM_IM0_IRL0 + 15)
|
||||
#define LTQ_SSC_RIR (INT_NUM_IM0_IRL0 + 14)
|
||||
+#define LTQ_SSC_TIR_AR9 (INT_NUM_IM0_IRL0 + 14)
|
||||
+#define LTQ_SSC_RIR_AR9 (INT_NUM_IM0_IRL0 + 15)
|
||||
#define LTQ_SSC_EIR (INT_NUM_IM0_IRL0 + 16)
|
||||
|
||||
#define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21)
|
|
@ -1,538 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/Kconfig
|
||||
+++ b/arch/mips/lantiq/xway/Kconfig
|
||||
@@ -6,6 +6,10 @@ config LANTIQ_MACH_EASY50712
|
||||
bool "Easy50712 - Danube"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_ARV45XX
|
||||
+ bool "ARV45XX"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -5,3 +5,4 @@ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o
|
||||
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_ARV45XX) += mach-arv45xx.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/mach-arv45xx.c
|
||||
@@ -0,0 +1,495 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
+#include <linux/ath5k_platform.h>
|
||||
+#include <linux/pci.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+#include <lantiq_platform.h>
|
||||
+
|
||||
+#include "../machtypes.h"
|
||||
+#include "devices.h"
|
||||
+#include "dev-leds-gpio.h"
|
||||
+#include "dev-dwc_otg.h"
|
||||
+
|
||||
+static struct mtd_partition arv4510_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x20000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x20000,
|
||||
+ .size = 0x120000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x40000,
|
||||
+ .size = 0xfa0000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "board_config",
|
||||
+ .offset = 0xfe0000,
|
||||
+ .size = 0x20000,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct mtd_partition arv45xx_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x20000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x20000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x30000,
|
||||
+ .size = 0x3c0000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "board_config",
|
||||
+ .offset = 0x3f0000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct mtd_partition arv75xx_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x0,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot_env",
|
||||
+ .offset = 0x10000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x20000,
|
||||
+ .size = 0x7d0000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "board_config",
|
||||
+ .offset = 0x7f0000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct physmap_flash_data arv4510_flash_data = {
|
||||
+ .nr_parts = ARRAY_SIZE(arv4510_partitions),
|
||||
+ .parts = arv4510_partitions,
|
||||
+};
|
||||
+
|
||||
+static struct physmap_flash_data arv45xx_flash_data = {
|
||||
+ .nr_parts = ARRAY_SIZE(arv45xx_partitions),
|
||||
+ .parts = arv45xx_partitions,
|
||||
+};
|
||||
+
|
||||
+static struct physmap_flash_data arv75xx_flash_data = {
|
||||
+ .nr_parts = ARRAY_SIZE(arv75xx_partitions),
|
||||
+ .parts = arv75xx_partitions,
|
||||
+};
|
||||
+
|
||||
+static struct ltq_pci_data ltq_pci_data = {
|
||||
+ .clock = PCI_CLOCK_EXT,
|
||||
+ .gpio = PCI_GNT1 | PCI_REQ1,
|
||||
+ .irq = {
|
||||
+ [14] = INT_NUM_IM0_IRL0 + 22,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct ltq_eth_data ltq_eth_data = {
|
||||
+ .mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv4510pw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:green:foo", .gpio = 4, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv4518pw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:green:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:wlan", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:fail", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:usb", .gpio = 19, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:voip", .gpio = 72, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:fxs1", .gpio = 73, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:fxs2", .gpio = 74, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:fxo", .gpio = 75, .active_low = 1, .default_trigger = "default-on" },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_button
|
||||
+arv4518pw_gpio_buttons[] __initdata = {
|
||||
+ { .desc = "wlan", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 28, .active_low = 1, },
|
||||
+ { .desc = "wps", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 29, .active_low = 1, },
|
||||
+ { .desc = "reset", .type = EV_KEY, .code = BTN_2, .threshold = 3, .gpio = 30, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv4520pw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:blue:power", .gpio = 3, .active_low = 1, },
|
||||
+ { .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, },
|
||||
+ { .name = "soc:blue:internet", .gpio = 5, .active_low = 1, },
|
||||
+ { .name = "soc:red:power", .gpio = 6, .active_low = 1, },
|
||||
+ { .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, },
|
||||
+ { .name = "soc:red:wps", .gpio = 9, .active_low = 1, },
|
||||
+ { .name = "soc:blue:voip", .gpio = 72, .active_low = 1, },
|
||||
+ { .name = "soc:blue:fxs1", .gpio = 73, .active_low = 1, },
|
||||
+ { .name = "soc:blue:fxs2", .gpio = 74, .active_low = 1, },
|
||||
+ { .name = "soc:blue:fxo", .gpio = 75, .active_low = 1, },
|
||||
+ { .name = "soc:blue:voice", .gpio = 76, .active_low = 1, },
|
||||
+ { .name = "soc:blue:usb", .gpio = 77, .active_low = 1, },
|
||||
+ { .name = "soc:blue:wlan", .gpio = 78, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv452cpw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:isdn", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:wps", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:fxs1", .gpio = 72, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:fxs2", .gpio = 73, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:wps", .gpio = 74, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:fxo", .gpio = 75, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:voice", .gpio = 76, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:usb", .gpio = 77, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:wlan", .gpio = 78, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:internet", .gpio = 80, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:internet", .gpio = 81, .active_low = 1, .default_trigger = "default-on" },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv4525pw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:green:festnetz", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:dsl", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:wlan", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:online", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv752dpw22_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:wps", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:fxo", .gpio = 75, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:red:voice", .gpio = 76, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:usb", .gpio = 77, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:wlan", .gpio = 78, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:wlan1", .gpio = 79, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:wlan", .gpio = 80, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:blue:wlan1", .gpio = 81, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:eth1", .gpio = 83, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:eth2", .gpio = 84, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:eth3", .gpio = 85, .active_low = 1, .default_trigger = "default-on" },
|
||||
+ { .name = "soc:green:eth4", .gpio = 86, .active_low = 1, .default_trigger = "default-on", },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_button
|
||||
+arv752dpw22_gpio_buttons[] __initdata = {
|
||||
+ { .desc = "btn0", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 12, .active_low = 1, },
|
||||
+ { .desc = "btn1", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 13, .active_low = 1, },
|
||||
+ { .desc = "btn2", .type = EV_KEY, .code = BTN_2, .threshold = 3, .gpio = 28, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+arv7518pw_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:green:power", .gpio = 2, .active_low = 1, },
|
||||
+ { .name = "soc:green:adsl", .gpio = 4, .active_low = 1, },
|
||||
+ { .name = "soc:green:internet", .gpio = 5, .active_low = 1, },
|
||||
+ { .name = "soc:green:wlan", .gpio = 6, .active_low = 1, },
|
||||
+ { .name = "soc:red:internet", .gpio = 8, .active_low = 1, },
|
||||
+ { .name = "soc:green:usb", .gpio = 19, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_button
|
||||
+arv7518pw_gpio_buttons[] __initdata = {
|
||||
+ { .desc = "reset", .type = EV_KEY, .code = BTN_0, .threshold = 3, .gpio = 23, .active_low = 1, },
|
||||
+ { .desc = "wlan", .type = EV_KEY, .code = BTN_1, .threshold = 3, .gpio = 25, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static void
|
||||
+arv45xx_register_ethernet(void)
|
||||
+{
|
||||
+#define ARV45XX_BRN_MAC 0x3f0016
|
||||
+ memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
+ (void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_MAC), 6);
|
||||
+ ltq_register_etop(<q_eth_data);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+arv75xx_register_ethernet(void)
|
||||
+{
|
||||
+#define ARV75XX_BRN_MAC 0x7f0016
|
||||
+ memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
+ (void *)KSEG1ADDR(LTQ_FLASH_START + ARV75XX_BRN_MAC), 6);
|
||||
+ ltq_register_etop(<q_eth_data);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+bewan_register_ethernet(void)
|
||||
+{
|
||||
+#define BEWAN_BRN_MAC 0x3f0014
|
||||
+ memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
+ (void *)KSEG1ADDR(LTQ_FLASH_START + BEWAN_BRN_MAC), 6);
|
||||
+ ltq_register_etop(<q_eth_data);
|
||||
+}
|
||||
+
|
||||
+static u16 arv45xx_ath5k_eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS];
|
||||
+static struct ath5k_platform_data arv45xx_ath5k_platform_data;
|
||||
+
|
||||
+/*static int arv45xx_pci_plat_dev_init(struct pci_dev *dev)
|
||||
+{
|
||||
+ dev->dev.platform_data = &arv45xx_ath5k_platform_data;
|
||||
+ return 0;
|
||||
+}
|
||||
+*/
|
||||
+void __init
|
||||
+arv45xx_register_ath5k(void)
|
||||
+{
|
||||
+#define ARV45XX_BRN_ATH 0x3f0478
|
||||
+ int i;
|
||||
+ unsigned char eeprom_mac[6];
|
||||
+ static u16 eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS];
|
||||
+ u32 *p = (u32*)arv45xx_ath5k_eeprom_data;
|
||||
+
|
||||
+ memcpy_fromio(eeprom_mac,
|
||||
+ (void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_MAC), 6);
|
||||
+ eeprom_mac[5]++;
|
||||
+ memcpy_fromio(arv45xx_ath5k_eeprom_data,
|
||||
+ (void *)KSEG1ADDR(LTQ_FLASH_START + ARV45XX_BRN_ATH), ATH5K_PLAT_EEP_MAX_WORDS);
|
||||
+ // swap eeprom bytes
|
||||
+ for (i = 0; i < ATH5K_PLAT_EEP_MAX_WORDS>>1; i++){
|
||||
+ //arv4518_ath5k_eeprom_data[i] = ((eeprom_data[i]&0xff)<<8)|((eeprom_data[i]&0xff00)>>8);
|
||||
+ p[i] = ((eeprom_data[(i<<1)+1]&0xff)<<24)|((eeprom_data[(i<<1)+1]&0xff00)<<8)|((eeprom_data[i<<1]&0xff)<<8)|((eeprom_data[i<<1]&0xff00)>>8);
|
||||
+ if (i == 0xbf>>1){
|
||||
+ // printk ("regdomain: 0x%x --> 0x%x\n", p[i], (p[i] & 0xffff0000)|0x67);
|
||||
+ /* regdomain is invalid?? how did original fw convert
|
||||
+ * value to 0x82d4 ??
|
||||
+ * for now, force to 0x67 */
|
||||
+ p[i] &= 0xffff0000;
|
||||
+ p[i] |= 0x67;
|
||||
+ }
|
||||
+ }
|
||||
+ arv45xx_ath5k_platform_data.eeprom_data = arv45xx_ath5k_eeprom_data;
|
||||
+ arv45xx_ath5k_platform_data.macaddr = eeprom_mac;
|
||||
+ //lqpci_plat_dev_init = arv45xx_pci_plat_dev_init;
|
||||
+}
|
||||
+
|
||||
+static void __init
|
||||
+arv3527p_init(void)
|
||||
+{
|
||||
+ ltq_register_gpio_stp();
|
||||
+ //ltq_add_device_leds_gpio(arv3527p_leds_gpio, ARRAY_SIZE(arv3527p_leds_gpio));
|
||||
+ ltq_register_nor(&arv45xx_flash_data);
|
||||
+ arv45xx_register_ethernet();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV3527P,
|
||||
+ "ARV3527P",
|
||||
+ "ARV3527P - Arcor Easybox 401",
|
||||
+ arv3527p_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv4510pw_init(void)
|
||||
+{
|
||||
+ ltq_register_gpio_stp();
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4510pw_leds_gpio), arv4510pw_leds_gpio);
|
||||
+ ltq_register_nor(&arv4510_flash_data);
|
||||
+ ltq_pci_data.irq[12] = (INT_NUM_IM2_IRL0 + 31);
|
||||
+ ltq_pci_data.irq[15] = (INT_NUM_IM0_IRL0 + 26);
|
||||
+ ltq_pci_data.gpio |= PCI_EXIN2 | PCI_REQ2;
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ bewan_register_ethernet();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV4510PW,
|
||||
+ "ARV4510PW",
|
||||
+ "ARV4510PW - Wippies Homebox",
|
||||
+ arv4510pw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv4518pw_init(void)
|
||||
+{
|
||||
+#define ARV4518PW_EBU 0
|
||||
+#define ARV4518PW_USB 14
|
||||
+#define ARV4518PW_SWITCH_RESET 13
|
||||
+
|
||||
+ ltq_register_gpio_ebu(ARV4518PW_EBU);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4518pw_leds_gpio), arv4518pw_leds_gpio);
|
||||
+ ltq_register_gpio_buttons(arv4518pw_gpio_buttons, ARRAY_SIZE(arv4518pw_gpio_buttons));
|
||||
+ ltq_register_nor(&arv45xx_flash_data);
|
||||
+ ltq_pci_data.gpio = PCI_GNT2 | PCI_REQ2;
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_madwifi_eep();
|
||||
+ xway_register_dwc(ARV4518PW_USB);
|
||||
+ arv45xx_register_ethernet();
|
||||
+ arv45xx_register_ath5k();
|
||||
+
|
||||
+ gpio_request(ARV4518PW_SWITCH_RESET, "switch");
|
||||
+ gpio_direction_output(ARV4518PW_SWITCH_RESET, 1);
|
||||
+ gpio_export(ARV4518PW_SWITCH_RESET, 0);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV4518PW,
|
||||
+ "ARV4518PW",
|
||||
+ "ARV4518PW - SMC7908A-ISP, Airties WAV-221",
|
||||
+ arv4518pw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv4520pw_init(void)
|
||||
+{
|
||||
+#define ARV4520PW_EBU 0x400
|
||||
+#define ARV4520PW_USB 28
|
||||
+#define ARV4520PW_SWITCH_RESET 82
|
||||
+
|
||||
+ ltq_register_gpio_ebu(ARV4520PW_EBU);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4520pw_leds_gpio), arv4520pw_leds_gpio);
|
||||
+ ltq_register_nor(&arv45xx_flash_data);
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_tapi();
|
||||
+ arv45xx_register_ethernet();
|
||||
+ xway_register_dwc(ARV4520PW_USB);
|
||||
+
|
||||
+ gpio_request(ARV4520PW_SWITCH_RESET, "switch");
|
||||
+ gpio_set_value(ARV4520PW_SWITCH_RESET, 1);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV4520PW,
|
||||
+ "ARV4520PW",
|
||||
+ "ARV4520PW - Airties WAV-281, Arcor A800",
|
||||
+ arv4520pw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv452Cpw_init(void)
|
||||
+{
|
||||
+#define ARV452CPW_EBU 0x77f
|
||||
+#define ARV452CPW_USB 28
|
||||
+#define ARV452CPW_RELAY1 31
|
||||
+#define ARV452CPW_RELAY2 79
|
||||
+#define ARV452CPW_SWITCH_RESET 82
|
||||
+
|
||||
+ ltq_register_gpio_ebu(ARV452CPW_EBU);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv452cpw_leds_gpio), arv452cpw_leds_gpio);
|
||||
+ ltq_register_nor(&arv45xx_flash_data);
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_madwifi_eep();
|
||||
+ xway_register_dwc(ARV452CPW_USB);
|
||||
+ arv45xx_register_ethernet();
|
||||
+ arv45xx_register_ath5k();
|
||||
+
|
||||
+ gpio_request(ARV452CPW_SWITCH_RESET, "switch");
|
||||
+ gpio_set_value(ARV452CPW_SWITCH_RESET, 1);
|
||||
+ gpio_export(ARV452CPW_SWITCH_RESET, 0);
|
||||
+
|
||||
+ gpio_request(ARV452CPW_RELAY1, "relay1");
|
||||
+ gpio_direction_output(ARV452CPW_RELAY1, 1);
|
||||
+ gpio_export(ARV452CPW_RELAY1, 0);
|
||||
+
|
||||
+ gpio_request(ARV452CPW_RELAY2, "relay2");
|
||||
+ gpio_set_value(ARV452CPW_RELAY2, 1);
|
||||
+ gpio_export(ARV452CPW_RELAY2, 0);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV452CPW,
|
||||
+ "ARV452CPW",
|
||||
+ "ARV452CPW - Arcor A801",
|
||||
+ arv452Cpw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv4525pw_init(void)
|
||||
+{
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv4525pw_leds_gpio), arv4525pw_leds_gpio);
|
||||
+ ltq_register_nor(&arv45xx_flash_data);
|
||||
+ ltq_pci_data.clock = PCI_CLOCK_INT;
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_madwifi_eep();
|
||||
+ ltq_eth_data.mii_mode = PHY_INTERFACE_MODE_MII;
|
||||
+ arv45xx_register_ethernet();
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV4525PW,
|
||||
+ "ARV4525PW",
|
||||
+ "ARV4525PW - Speedport W502V",
|
||||
+ arv4525pw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv7518pw_init(void)
|
||||
+{
|
||||
+#define ARV7518PW_EBU 0x2
|
||||
+#define ARV7518PW_USB 14
|
||||
+
|
||||
+ ltq_register_gpio_ebu(ARV7518PW_EBU);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv7518pw_leds_gpio), arv7518pw_leds_gpio);
|
||||
+ ltq_register_gpio_buttons(arv7518pw_gpio_buttons, ARRAY_SIZE(arv7518pw_gpio_buttons));
|
||||
+ ltq_register_nor(&arv75xx_flash_data);
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_tapi();
|
||||
+ xway_register_dwc(ARV7518PW_USB);
|
||||
+ arv75xx_register_ethernet();
|
||||
+ //arv7518_register_ath9k(mac);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV7518PW,
|
||||
+ "ARV7518PW",
|
||||
+ "ARV7518PW - ASTORIA",
|
||||
+ arv7518pw_init);
|
||||
+
|
||||
+static void __init
|
||||
+arv752dpw22_init(void)
|
||||
+{
|
||||
+#define ARV752DPW22_EBU 0x2
|
||||
+#define ARV752DPW22_USB 72
|
||||
+#define ARV752DPW22_RELAY 73
|
||||
+
|
||||
+ ltq_register_gpio_ebu(ARV752DPW22_EBU);
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(arv752dpw22_leds_gpio), arv752dpw22_leds_gpio);
|
||||
+ ltq_register_gpio_buttons(arv752dpw22_gpio_buttons, ARRAY_SIZE(arv752dpw22_gpio_buttons));
|
||||
+ ltq_register_nor(&arv75xx_flash_data);
|
||||
+ ltq_pci_data.irq[15] = (INT_NUM_IM2_IRL0 + 31);
|
||||
+ ltq_pci_data.gpio |= PCI_EXIN1 | PCI_REQ2;
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ xway_register_dwc(ARV752DPW22_USB);
|
||||
+ arv75xx_register_ethernet();
|
||||
+
|
||||
+ gpio_request(ARV752DPW22_RELAY, "relay");
|
||||
+ gpio_set_value(ARV752DPW22_RELAY, 1);
|
||||
+ gpio_export(ARV752DPW22_RELAY, 0);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_ARV752DPW22,
|
||||
+ "ARV752DPW22",
|
||||
+ "ARV752DPW22 - Arcor A803",
|
||||
+ arv752dpw22_init);
|
||||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -22,6 +22,17 @@ enum lantiq_mach_type {
|
||||
LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
LANTIQ_MACH_EASY98020, /* Falcon Reference Board */
|
||||
LANTIQ_MACH_95C3AM1, /* Board 95C3AM1 */
|
||||
+
|
||||
+ /* Arcadyan */
|
||||
+ LANTIQ_MACH_ARV3527P, /* Arcor easybox a401 */
|
||||
+ LANTIQ_MACH_ARV4510PW, /* Wippies Homebox */
|
||||
+ LANTIQ_MACH_ARV4518PW, /* Airties WAV-221, SMC-7908A-ISP */
|
||||
+ LANTIQ_MACH_ARV4520PW, /* Airties WAV-281, Arcor EasyboxA800 */
|
||||
+ LANTIQ_MACH_ARV452CPW, /* Arcor EasyboxA801 */
|
||||
+ LANTIQ_MACH_ARV4525PW, /* Speedport W502V */
|
||||
+ LANTIQ_MACH_ARV752DPW, /* Arcor easybox a802 */
|
||||
+ LANTIQ_MACH_ARV752DPW22, /* Arcor easybox a803 */
|
||||
+ LANTIQ_MACH_ARV7518PW, /* ASTORIA */
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,92 +0,0 @@
|
|||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -33,6 +33,9 @@ enum lantiq_mach_type {
|
||||
LANTIQ_MACH_ARV752DPW, /* Arcor easybox a802 */
|
||||
LANTIQ_MACH_ARV752DPW22, /* Arcor easybox a803 */
|
||||
LANTIQ_MACH_ARV7518PW, /* ASTORIA */
|
||||
+
|
||||
+ /* Netgear */
|
||||
+ LANTIQ_MACH_DGN3500B, /* Netgear DGN3500 */
|
||||
};
|
||||
|
||||
#endif
|
||||
--- a/arch/mips/lantiq/xway/Kconfig
|
||||
+++ b/arch/mips/lantiq/xway/Kconfig
|
||||
@@ -10,6 +10,10 @@ config LANTIQ_MACH_ARV45XX
|
||||
bool "ARV45XX"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_NETGEAR
|
||||
+ bool "Netgear"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -6,3 +6,4 @@ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_ARV45XX) += mach-arv45xx.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_NETGEAR) += mach-netgear.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/mach-netgear.c
|
||||
@@ -0,0 +1,57 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/phy.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+#include <irq.h>
|
||||
+
|
||||
+#include "../machtypes.h"
|
||||
+#include "devices.h"
|
||||
+
|
||||
+static struct ltq_pci_data ltq_pci_data = {
|
||||
+ .clock = PCI_CLOCK_INT,
|
||||
+ .gpio = PCI_GNT1 | PCI_REQ1,
|
||||
+ .irq = {
|
||||
+ [14] = INT_NUM_IM0_IRL0 + 22,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct ltq_eth_data ltq_eth_data = {
|
||||
+ .mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
+};
|
||||
+
|
||||
+struct spi_board_info spi_info = {
|
||||
+ .bus_num = 0,
|
||||
+ .chip_select = 3,
|
||||
+ .max_speed_hz = 25000000,
|
||||
+ .modalias = "mx25l12805d",
|
||||
+};
|
||||
+
|
||||
+struct ltq_spi_platform_data ltq_spi_data = {
|
||||
+ .num_chipselect = 4,
|
||||
+};
|
||||
+
|
||||
+static void __init dgn3500_init(void)
|
||||
+{
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_etop(<q_eth_data);
|
||||
+ ltq_register_spi(<q_spi_data, &spi_info, 1);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_DGN3500B,
|
||||
+ "DGN3500B",
|
||||
+ "Netgear DGN3500B",
|
||||
+ dgn3500_init);
|
|
@ -1,144 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/Kconfig
|
||||
+++ b/arch/mips/lantiq/xway/Kconfig
|
||||
@@ -14,6 +14,10 @@ config LANTIQ_MACH_NETGEAR
|
||||
bool "Netgear"
|
||||
default y
|
||||
|
||||
+config LANTIQ_MACH_GIGASX76X
|
||||
+ bool "GIGASX76X"
|
||||
+ default y
|
||||
+
|
||||
endmenu
|
||||
|
||||
endif
|
||||
--- a/arch/mips/lantiq/xway/Makefile
|
||||
+++ b/arch/mips/lantiq/xway/Makefile
|
||||
@@ -7,3 +7,4 @@ obj-$(CONFIG_LANTIQ_MACH_EASY50712) += m
|
||||
obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_ARV45XX) += mach-arv45xx.o
|
||||
obj-$(CONFIG_LANTIQ_MACH_NETGEAR) += mach-netgear.o
|
||||
+obj-$(CONFIG_LANTIQ_MACH_GIGASX76X) += mach-gigasx76x.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/xway/mach-gigasx76x.c
|
||||
@@ -0,0 +1,109 @@
|
||||
+/*
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Andrej Vlašić
|
||||
+ * Copyright (C) 2011 Luka Perkov
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/mtd/physmap.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/ath5k_platform.h>
|
||||
+#include <linux/pci.h>
|
||||
+#include <linux/phy.h>
|
||||
+
|
||||
+#include <irq.h>
|
||||
+
|
||||
+#include <lantiq_soc.h>
|
||||
+#include <lantiq_platform.h>
|
||||
+
|
||||
+#include "../machtypes.h"
|
||||
+#include "devices.h"
|
||||
+#include "dev-dwc_otg.h"
|
||||
+#include "dev-leds-gpio.h"
|
||||
+
|
||||
+static struct mtd_partition gigasx76x_partitions[] =
|
||||
+{
|
||||
+ {
|
||||
+ .name = "secondary_env",
|
||||
+ .offset = 0xe000,
|
||||
+ .size = 0x2000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "secondary_boot",
|
||||
+ .offset = 0x10000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "uboot",
|
||||
+ .offset = 0x20000,
|
||||
+ .size = 0x30000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "linux",
|
||||
+ .offset = 0x50000,
|
||||
+ .size = 0x7a0000,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "board_config",
|
||||
+ .offset = 0x7f0000,
|
||||
+ .size = 0x10000,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct gpio_led
|
||||
+gigasx76x_leds_gpio[] __initdata = {
|
||||
+ { .name = "soc:green:usb", .gpio = 50, },
|
||||
+ { .name = "soc:green:wlan", .gpio = 51, },
|
||||
+ { .name = "soc:green:phone2", .gpio = 52, },
|
||||
+ { .name = "soc:green:phone1", .gpio = 53, },
|
||||
+ { .name = "soc:green:line", .gpio = 54, },
|
||||
+ { .name = "soc:green:online", .gpio = 55, },
|
||||
+};
|
||||
+
|
||||
+
|
||||
+static struct physmap_flash_data gigasx76x_flash_data = {
|
||||
+ .nr_parts = ARRAY_SIZE(gigasx76x_partitions),
|
||||
+ .parts = gigasx76x_partitions,
|
||||
+};
|
||||
+
|
||||
+static struct ltq_pci_data ltq_pci_data = {
|
||||
+ .clock = PCI_CLOCK_INT,
|
||||
+ .gpio = PCI_GNT1 | PCI_REQ1,
|
||||
+ .irq = {
|
||||
+ [14] = INT_NUM_IM0_IRL0 + 22,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct ltq_eth_data ltq_eth_data = {
|
||||
+ .mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
+};
|
||||
+
|
||||
+static void __init
|
||||
+gigasx76x_init(void)
|
||||
+{
|
||||
+#define GIGASX76X_USB 29
|
||||
+
|
||||
+ ltq_register_gpio_stp();
|
||||
+ ltq_register_nor(&gigasx76x_flash_data);
|
||||
+ ltq_register_pci(<q_pci_data);
|
||||
+ ltq_register_etop(<q_eth_data);
|
||||
+ xway_register_dwc(GIGASX76X_USB);
|
||||
+ ltq_register_tapi();
|
||||
+ ltq_register_madwifi_eep();
|
||||
+ ltq_add_device_leds_gpio(-1, ARRAY_SIZE(gigasx76x_leds_gpio), gigasx76x_leds_gpio);
|
||||
+}
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_GIGASX76X,
|
||||
+ "GIGASX76X",
|
||||
+ "GIGASX76X - Gigaset SX761,SX762,SX763",
|
||||
+ gigasx76x_init);
|
||||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -36,6 +36,9 @@ enum lantiq_mach_type {
|
||||
|
||||
/* Netgear */
|
||||
LANTIQ_MACH_DGN3500B, /* Netgear DGN3500 */
|
||||
+
|
||||
+ /* Gigaset */
|
||||
+ LANTIQ_MACH_GIGASX76X, /* Gigaset SX76x */
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,27 +0,0 @@
|
|||
--- a/arch/mips/lantiq/falcon/mach-easy98020.c
|
||||
+++ b/arch/mips/lantiq/falcon/mach-easy98020.c
|
||||
@@ -111,3 +111,13 @@ MIPS_MACHINE(LANTIQ_MACH_EASY98020,
|
||||
"EASY98020",
|
||||
"EASY98020 Eval Board",
|
||||
easy98020_init);
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98020_1LAN,
|
||||
+ "EASY98020_1LAN",
|
||||
+ "EASY98020 Eval Board (1 LAN port)",
|
||||
+ easy98020_init);
|
||||
+
|
||||
+MIPS_MACHINE(LANTIQ_MACH_EASY98020_2LAN,
|
||||
+ "EASY98020_2LAN",
|
||||
+ "EASY98020 Eval Board (2 LAN ports)",
|
||||
+ easy98020_init);
|
||||
--- a/arch/mips/lantiq/machtypes.h
|
||||
+++ b/arch/mips/lantiq/machtypes.h
|
||||
@@ -21,6 +21,8 @@ enum lantiq_mach_type {
|
||||
LANTIQ_MACH_EASY98000SF, /* Falcon Eval Board, Serial Flash */
|
||||
LANTIQ_MACH_EASY98000NAND, /* Falcon Eval Board, NAND Flash */
|
||||
LANTIQ_MACH_EASY98020, /* Falcon Reference Board */
|
||||
+ LANTIQ_MACH_EASY98020_1LAN, /* Falcon Reference Board (1 LAN port) */
|
||||
+ LANTIQ_MACH_EASY98020_2LAN, /* Falcon Reference Board (2 LAN ports) */
|
||||
LANTIQ_MACH_95C3AM1, /* Board 95C3AM1 */
|
||||
|
||||
/* Arcadyan */
|
|
@ -1,28 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -121,6 +121,16 @@ ltq_register_etop(struct ltq_eth_data *e
|
||||
}
|
||||
}
|
||||
|
||||
+/* madwifi */
|
||||
+int lantiq_emulate_madwifi_eep = 0;
|
||||
+EXPORT_SYMBOL(lantiq_emulate_madwifi_eep);
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_madwifi_eep(void)
|
||||
+{
|
||||
+ lantiq_emulate_madwifi_eep = 1;
|
||||
+}
|
||||
+
|
||||
static struct resource ltq_spi_resources[] = {
|
||||
{
|
||||
.start = LTQ_SSC_BASE_ADDR,
|
||||
--- a/arch/mips/lantiq/xway/devices.h
|
||||
+++ b/arch/mips/lantiq/xway/devices.h
|
||||
@@ -19,5 +19,6 @@ extern void ltq_register_ase_asc(void);
|
||||
extern void ltq_register_etop(struct ltq_eth_data *eth);
|
||||
extern void ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
struct spi_board_info const *info, unsigned n);
|
||||
+extern void ltq_register_madwifi_eep(void);
|
||||
|
||||
#endif
|
|
@ -1,46 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -131,6 +131,26 @@ ltq_register_madwifi_eep(void)
|
||||
lantiq_emulate_madwifi_eep = 1;
|
||||
}
|
||||
|
||||
+/* gpio buttons */
|
||||
+static struct gpio_buttons_platform_data ltq_gpio_buttons_platform_data;
|
||||
+
|
||||
+static struct platform_device ltq_gpio_buttons_platform_device =
|
||||
+{
|
||||
+ .name = "gpio-buttons",
|
||||
+ .id = 0,
|
||||
+ .dev = {
|
||||
+ .platform_data = (void *) <q_gpio_buttons_platform_data,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_gpio_buttons(struct gpio_button *buttons, int cnt)
|
||||
+{
|
||||
+ ltq_gpio_buttons_platform_data.buttons = buttons;
|
||||
+ ltq_gpio_buttons_platform_data.nbuttons = cnt;
|
||||
+ platform_device_register(<q_gpio_buttons_platform_device);
|
||||
+}
|
||||
+
|
||||
static struct resource ltq_spi_resources[] = {
|
||||
{
|
||||
.start = LTQ_SSC_BASE_ADDR,
|
||||
--- a/arch/mips/lantiq/xway/devices.h
|
||||
+++ b/arch/mips/lantiq/xway/devices.h
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "../devices.h"
|
||||
#include <linux/phy.h>
|
||||
#include <linux/spi/spi.h>
|
||||
+#include <linux/gpio_buttons.h>
|
||||
|
||||
extern void ltq_register_gpio(void);
|
||||
extern void ltq_register_gpio_stp(void);
|
||||
@@ -20,5 +21,6 @@ extern void ltq_register_etop(struct ltq
|
||||
extern void ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
||||
struct spi_board_info const *info, unsigned n);
|
||||
extern void ltq_register_madwifi_eep(void);
|
||||
+extern void ltq_register_gpio_buttons(struct gpio_button *buttons, int cnt);
|
||||
|
||||
#endif
|
|
@ -1,42 +0,0 @@
|
|||
--- a/arch/mips/lantiq/devices.c
|
||||
+++ b/arch/mips/lantiq/devices.c
|
||||
@@ -120,3 +120,20 @@ void __init ltq_register_pci(struct ltq_
|
||||
pr_err("kernel is compiled without PCI support\n");
|
||||
}
|
||||
#endif
|
||||
+
|
||||
+static unsigned int *cp1_base = 0;
|
||||
+unsigned int*
|
||||
+ltq_get_cp1_base(void)
|
||||
+{
|
||||
+ return cp1_base;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ltq_get_cp1_base);
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_tapi(void)
|
||||
+{
|
||||
+#define CP1_SIZE (1 << 20)
|
||||
+ dma_addr_t dma;
|
||||
+ cp1_base =
|
||||
+ (void*)CPHYSADDR(dma_alloc_coherent(NULL, CP1_SIZE, &dma, GFP_ATOMIC));
|
||||
+}
|
||||
--- a/arch/mips/lantiq/devices.h
|
||||
+++ b/arch/mips/lantiq/devices.h
|
||||
@@ -19,5 +19,6 @@ extern void ltq_register_nor(struct phys
|
||||
extern void ltq_register_wdt(void);
|
||||
extern void ltq_register_asc(int port);
|
||||
extern void ltq_register_pci(struct ltq_pci_data *data);
|
||||
+extern void ltq_register_tapi(void);
|
||||
|
||||
#endif
|
||||
--- a/arch/mips/lantiq/xway/mach-easy50712.c
|
||||
+++ b/arch/mips/lantiq/xway/mach-easy50712.c
|
||||
@@ -61,6 +61,7 @@ static void __init easy50712_init(void)
|
||||
ltq_register_nor(&easy50712_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
+ ltq_register_tapi();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LTQ_MACH_EASY50712,
|
|
@ -1,95 +0,0 @@
|
|||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-lantiq/dev-leds-gpio.h
|
||||
@@ -0,0 +1,21 @@
|
||||
+/*
|
||||
+ * Lantiq GPIO LED device support
|
||||
+ *
|
||||
+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ * Copyright (C) 2008 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.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LANTIQ_DEV_LEDS_GPIO_H
|
||||
+#define _LANTIQ_DEV_LEDS_GPIO_H
|
||||
+
|
||||
+#include <linux/leds.h>
|
||||
+
|
||||
+void ltq_add_device_leds_gpio(int id,
|
||||
+ unsigned num_leds,
|
||||
+ struct gpio_led *leds) __init;
|
||||
+
|
||||
+#endif /* _LANTIQ_DEV_LEDS_GPIO_H */
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/lantiq/dev-leds-gpio.c
|
||||
@@ -0,0 +1,57 @@
|
||||
+/*
|
||||
+ * Lantiq GPIO LED device support
|
||||
+ *
|
||||
+ * Copyright (C) 2008-2009 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/slab.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include "dev-leds-gpio.h"
|
||||
+
|
||||
+void __init ltq_add_device_leds_gpio(int id, unsigned num_leds,
|
||||
+ struct gpio_led *leds)
|
||||
+{
|
||||
+ struct platform_device *pdev;
|
||||
+ struct gpio_led_platform_data pdata;
|
||||
+ struct gpio_led *p;
|
||||
+ int err;
|
||||
+
|
||||
+ p = kmalloc(num_leds * sizeof(*p), GFP_KERNEL);
|
||||
+ if (!p)
|
||||
+ return;
|
||||
+
|
||||
+ memcpy(p, leds, num_leds * sizeof(*p));
|
||||
+
|
||||
+ pdev = platform_device_alloc("leds-gpio", id);
|
||||
+ if (!pdev)
|
||||
+ goto err_free_leds;
|
||||
+
|
||||
+ memset(&pdata, 0, sizeof(pdata));
|
||||
+ pdata.num_leds = num_leds;
|
||||
+ pdata.leds = p;
|
||||
+
|
||||
+ err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
+ if (err)
|
||||
+ goto err_put_pdev;
|
||||
+
|
||||
+ err = platform_device_add(pdev);
|
||||
+ if (err)
|
||||
+ goto err_put_pdev;
|
||||
+
|
||||
+ return;
|
||||
+
|
||||
+err_put_pdev:
|
||||
+ platform_device_put(pdev);
|
||||
+
|
||||
+err_free_leds:
|
||||
+ kfree(p);
|
||||
+}
|
||||
--- a/arch/mips/lantiq/Makefile
|
||||
+++ b/arch/mips/lantiq/Makefile
|
||||
@@ -4,7 +4,7 @@
|
||||
# under the terms of the GNU General Public License version 2 as published
|
||||
# by the Free Software Foundation.
|
||||
|
||||
-obj-y := irq.o setup.o clk.o prom.o devices.o
|
||||
+obj-y := irq.o setup.o clk.o prom.o devices.o dev-leds-gpio.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
--- a/arch/mips/lantiq/xway/devices.c
|
||||
+++ b/arch/mips/lantiq/xway/devices.c
|
||||
@@ -151,6 +151,29 @@ ltq_register_gpio_buttons(struct gpio_bu
|
||||
platform_device_register(<q_gpio_buttons_platform_device);
|
||||
}
|
||||
|
||||
+/* ebu */
|
||||
+static struct resource ltq_ebu_resource =
|
||||
+{
|
||||
+ .name = "gpio_ebu",
|
||||
+ .start = LTQ_EBU_GPIO_START,
|
||||
+ .end = LTQ_EBU_GPIO_START + LTQ_EBU_GPIO_SIZE - 1,
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ltq_ebu =
|
||||
+{
|
||||
+ .name = "ltq_ebu",
|
||||
+ .resource = <q_ebu_resource,
|
||||
+ .num_resources = 1,
|
||||
+};
|
||||
+
|
||||
+void __init
|
||||
+ltq_register_gpio_ebu(unsigned int value)
|
||||
+{
|
||||
+ ltq_ebu.dev.platform_data = (void*) value;
|
||||
+ platform_device_register(<q_ebu);
|
||||
+}
|
||||
+
|
||||
static struct resource ltq_spi_resources[] = {
|
||||
{
|
||||
.start = LTQ_SSC_BASE_ADDR,
|
||||
--- a/arch/mips/lantiq/xway/devices.h
|
||||
+++ b/arch/mips/lantiq/xway/devices.h
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
extern void ltq_register_gpio(void);
|
||||
extern void ltq_register_gpio_stp(void);
|
||||
+extern void ltq_register_gpio_ebu(unsigned int value);
|
||||
extern void ltq_register_ase_asc(void);
|
||||
extern void ltq_register_etop(struct ltq_eth_data *eth);
|
||||
extern void ltq_register_spi(struct ltq_spi_platform_data *pdata,
|
69
target/linux/lantiq/patches-3.0/800-fix-etop.patch
Normal file
69
target/linux/lantiq/patches-3.0/800-fix-etop.patch
Normal file
|
@ -0,0 +1,69 @@
|
|||
Index: linux-3.0.3/drivers/net/lantiq_etop.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/net/lantiq_etop.c 2011-10-07 11:03:00.140000754 +0200
|
||||
+++ linux-3.0.3/drivers/net/lantiq_etop.c 2011-10-07 11:03:06.088001008 +0200
|
||||
@@ -397,7 +397,10 @@
|
||||
{
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
|
||||
- return phy_ethtool_gset(priv->phydev, cmd);
|
||||
+ if (priv->phydev)
|
||||
+ return phy_ethtool_gset(priv->phydev, cmd);
|
||||
+ else
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -405,7 +408,10 @@
|
||||
{
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
|
||||
- return phy_ethtool_sset(priv->phydev, cmd);
|
||||
+ if (priv->phydev)
|
||||
+ return phy_ethtool_sset(priv->phydev, cmd);
|
||||
+ else
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -413,7 +419,10 @@
|
||||
{
|
||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||
|
||||
- return phy_start_aneg(priv->phydev);
|
||||
+ if (priv->phydev)
|
||||
+ return phy_start_aneg(priv->phydev);
|
||||
+ else
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ltq_etop_ethtool_ops = {
|
||||
@@ -615,7 +624,8 @@
|
||||
ltq_dma_open(&ch->dma);
|
||||
napi_enable(&ch->napi);
|
||||
}
|
||||
- phy_start(priv->phydev);
|
||||
+ if (priv->phydev)
|
||||
+ phy_start(priv->phydev);
|
||||
netif_tx_start_all_queues(dev);
|
||||
return 0;
|
||||
}
|
||||
@@ -627,7 +637,8 @@
|
||||
int i;
|
||||
|
||||
netif_tx_stop_all_queues(dev);
|
||||
- phy_stop(priv->phydev);
|
||||
+ if (priv->phydev)
|
||||
+ phy_stop(priv->phydev);
|
||||
for (i = 0; i < MAX_DMA_CHAN; i++) {
|
||||
struct ltq_etop_chan *ch = &priv->ch[i];
|
||||
|
||||
@@ -775,7 +786,7 @@
|
||||
ltq_etop_set_multicast_list(dev);
|
||||
err = ltq_etop_mdio_init(dev);
|
||||
if (err)
|
||||
- goto err_netdev;
|
||||
+ pr_warn("etop: mdio probe failed\n");;
|
||||
return 0;
|
||||
|
||||
err_netdev:
|
|
@ -1,26 +0,0 @@
|
|||
--- a/arch/mips/lantiq/early_printk.c
|
||||
+++ b/arch/mips/lantiq/early_printk.c
|
||||
@@ -20,7 +20,12 @@
|
||||
#endif
|
||||
#define ASC_BUF 1024
|
||||
#define LTQ_ASC_FSTAT ((u32 *)(LTQ_ASC_BASE + 0x0048))
|
||||
-#define LTQ_ASC_TBUF ((u32 *)(LTQ_ASC_BASE + 0x0020))
|
||||
+#ifdef __BIG_ENDIAN
|
||||
+#define LTQ_ASC_TBUF ((u8 *)(LTQ_ASC_BASE + 0x0023))
|
||||
+#else
|
||||
+#define LTQ_ASC_TBUF ((u8 *)(LTQ_ASC_BASE + 0x0020))
|
||||
+#endif
|
||||
+
|
||||
#define TXMASK 0x3F00
|
||||
#define TXOFFSET 8
|
||||
|
||||
@@ -30,8 +35,6 @@ void prom_putchar(char c)
|
||||
|
||||
local_irq_save(flags);
|
||||
do { } while ((ltq_r32(LTQ_ASC_FSTAT) & TXMASK) >> TXOFFSET);
|
||||
- if (c == '\n')
|
||||
- ltq_w32('\r', LTQ_ASC_TBUF);
|
||||
- ltq_w32(c, LTQ_ASC_TBUF);
|
||||
+ ltq_w8(c, LTQ_ASC_TBUF);
|
||||
local_irq_restore(flags);
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
--- a/arch/mips/lantiq/irq.c
|
||||
+++ b/arch/mips/lantiq/irq.c
|
||||
@@ -132,7 +132,7 @@
|
||||
static unsigned int ltq_startup_eiu_irq(struct irq_data *d)
|
||||
{
|
||||
int i;
|
||||
- int irq_nr = d->irq - INT_NUM_IRQ0;
|
||||
+ int irq_nr = d->irq;
|
||||
|
||||
ltq_enable_irq(d);
|
||||
for (i = 0; i < MAX_EIU; i++) {
|
||||
@@ -156,7 +156,7 @@
|
||||
static void ltq_shutdown_eiu_irq(struct irq_data *d)
|
||||
{
|
||||
int i;
|
||||
- int irq_nr = d->irq - INT_NUM_IRQ0;
|
||||
+ int irq_nr = d->irq;
|
||||
|
||||
ltq_disable_irq(d);
|
||||
for (i = 0; i < MAX_EIU; i++) {
|
|
@ -0,0 +1,18 @@
|
|||
--- a/arch/mips/pci/pci-lantiq.c
|
||||
+++ b/arch/mips/pci/pci-lantiq.c
|
||||
@@ -171,8 +171,13 @@
|
||||
u32 temp_buffer;
|
||||
|
||||
/* set clock to 33Mhz */
|
||||
- ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) & ~0xf00000, LTQ_CGU_IFCCR);
|
||||
- ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | 0x800000, LTQ_CGU_IFCCR);
|
||||
+ if (ltq_is_ar9()) {
|
||||
+ ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) & ~0x1f00000, LTQ_CGU_IFCCR);
|
||||
+ ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | 0xe00000, LTQ_CGU_IFCCR);
|
||||
+ } else {
|
||||
+ ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) & ~0xf00000, LTQ_CGU_IFCCR);
|
||||
+ ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | 0x800000, LTQ_CGU_IFCCR);
|
||||
+ }
|
||||
|
||||
/* external or internal clock ? */
|
||||
if (conf->clock) {
|
|
@ -0,0 +1,13 @@
|
|||
Index: linux-3.0.3/drivers/mtd/maps/lantiq-flash.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/drivers/mtd/maps/lantiq-flash.c 2011-08-17 19:57:16.000000000 +0200
|
||||
+++ linux-3.0.3/drivers/mtd/maps/lantiq-flash.c 2011-09-29 20:45:14.785132132 +0200
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
+#include "../mtdcore.h"
|
||||
+
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
Index: linux-3.0.3/arch/mips/lantiq/clk.c
|
||||
===================================================================
|
||||
--- linux-3.0.3.orig/arch/mips/lantiq/clk.c 2011-09-29 20:43:07.000000000 +0200
|
||||
+++ linux-3.0.3/arch/mips/lantiq/clk.c 2011-09-29 20:45:14.785132132 +0200
|
||||
@@ -91,6 +91,17 @@
|
||||
}
|
||||
EXPORT_SYMBOL(clk_put);
|
||||
|
||||
+int clk_enable(struct clk *clk)
|
||||
+{
|
||||
+ /* clocks are always enabled*/
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void clk_disable(struct clk *clk)
|
||||
+{
|
||||
+ /* clocks are always enabled*/
|
||||
+}
|
||||
+
|
||||
static inline u32 ltq_get_counter_resolution(void)
|
||||
{
|
||||
u32 res;
|
|
@ -0,0 +1,56 @@
|
|||
commit 1c388919d89ca35741e9c4d3255adf87f76f0c06
|
||||
Author: Geert Uytterhoeven <geert@linux-m68k.org>
|
||||
Date: Sat May 7 20:53:16 2011 +0200
|
||||
|
||||
resources: Add lookup_resource()
|
||||
|
||||
Add a function to find an existing resource by a resource start address.
|
||||
This allows to implement simple allocators (with a malloc/free-alike API)
|
||||
on top of the resource system.
|
||||
|
||||
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
|
||||
|
||||
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
|
||||
index e9bb22c..63eb429 100644
|
||||
--- a/include/linux/ioport.h
|
||||
+++ b/include/linux/ioport.h
|
||||
@@ -132,6 +132,7 @@ extern int allocate_resource(struct resource *root, struct resource *new,
|
||||
resource_size_t,
|
||||
resource_size_t),
|
||||
void *alignf_data);
|
||||
+struct resource *lookup_resource(struct resource *root, resource_size_t start);
|
||||
int adjust_resource(struct resource *res, resource_size_t start,
|
||||
resource_size_t size);
|
||||
resource_size_t resource_alignment(struct resource *res);
|
||||
diff --git a/kernel/resource.c b/kernel/resource.c
|
||||
index 3ff4017..3b3cedc 100644
|
||||
--- a/kernel/resource.c
|
||||
+++ b/kernel/resource.c
|
||||
@@ -553,6 +553,27 @@ int allocate_resource(struct resource *root, struct resource *new,
|
||||
|
||||
EXPORT_SYMBOL(allocate_resource);
|
||||
|
||||
+/**
|
||||
+ * lookup_resource - find an existing resource by a resource start address
|
||||
+ * @root: root resource descriptor
|
||||
+ * @start: resource start address
|
||||
+ *
|
||||
+ * Returns a pointer to the resource if found, NULL otherwise
|
||||
+ */
|
||||
+struct resource *lookup_resource(struct resource *root, resource_size_t start)
|
||||
+{
|
||||
+ struct resource *res;
|
||||
+
|
||||
+ read_lock(&resource_lock);
|
||||
+ for (res = root->child; res; res = res->sibling) {
|
||||
+ if (res->start == start)
|
||||
+ break;
|
||||
+ }
|
||||
+ read_unlock(&resource_lock);
|
||||
+
|
||||
+ return res;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Insert a resource into the resource tree. If successful, return NULL,
|
||||
* otherwise return the conflicting resource (compare to __request_resource())
|
|
@ -1,59 +0,0 @@
|
|||
activate serial driver for ASC1 if "use_asc1=x" is given on kernel commandline
|
||||
mux setup for pins is done via late_initcall, when the gpio driver is initialized
|
||||
|
||||
only implemented for EASY98000, generic version t.b.d.
|
||||
--- a/arch/mips/lantiq/falcon/devices.c
|
||||
+++ b/arch/mips/lantiq/falcon/devices.c
|
||||
@@ -75,6 +75,7 @@ void __init falcon_register_asc(int port
|
||||
case 1:
|
||||
platform_device_register_simple("ltq_asc", 1,
|
||||
falcon_asc1_resources, ARRAY_SIZE(falcon_asc1_resources));
|
||||
+ sys1_hw_activate(ACTS_ASC1_ACT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
--- a/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
+++ b/arch/mips/lantiq/falcon/mach-easy98000.c
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
#include <linux/spi/eeprom.h>
|
||||
+#include <falcon/lantiq_soc.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
|
||||
@@ -206,9 +207,34 @@ static void __init easy98000_spi_gpio_in
|
||||
platform_device_register(&easy98000_spi_gpio_device);
|
||||
}
|
||||
|
||||
+static int register_asc1 = 0;
|
||||
+static int __init parse_asc1(char *p)
|
||||
+{
|
||||
+ register_asc1 = 1;
|
||||
+ return 0;
|
||||
+}
|
||||
+__setup("use_asc1", parse_asc1);
|
||||
+
|
||||
+#define MUXC_SIF_RX_PIN 112
|
||||
+#define MUXC_SIF_TX_PIN 113
|
||||
+
|
||||
+static int __init asc1_mux_setup(void)
|
||||
+{
|
||||
+ if (register_asc1) {
|
||||
+ if (ltq_gpio_request(MUXC_SIF_RX_PIN, 1, 1, 0, "asc1-rx"))
|
||||
+ return -1;
|
||||
+ if (ltq_gpio_request(MUXC_SIF_TX_PIN, 1, 1, 1, "asc1-tx"))
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+late_initcall(asc1_mux_setup);
|
||||
+
|
||||
static void __init easy98000_init_common(void)
|
||||
{
|
||||
falcon_register_asc(0);
|
||||
+ if (register_asc1)
|
||||
+ falcon_register_asc(1);
|
||||
falcon_register_gpio();
|
||||
falcon_register_wdt();
|
||||
falcon_register_i2c();
|
|
@ -24,10 +24,7 @@ CONFIG_INPUT_EVDEV=y
|
|||
CONFIG_INPUT_POLLDEV=y
|
||||
# CONFIG_ISDN is not set
|
||||
CONFIG_LANTIQ_ETOP=y
|
||||
CONFIG_LANTIQ_MACH_ARV45XX=y
|
||||
CONFIG_LANTIQ_MACH_EASY50712=y
|
||||
# CONFIG_LANTIQ_MACH_NETGEAR is not set
|
||||
CONFIG_LANTIQ_MACH_GIGASX76X=y
|
||||
CONFIG_LANTIQ_MACH_FRITZ3370=y
|
||||
CONFIG_MACH_NO_WESTBRIDGE=y
|
||||
# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
|
@ -39,9 +36,10 @@ CONFIG_PERF_USE_VMALLOC=y
|
|||
# CONFIG_QUOTACTL is not set
|
||||
CONFIG_RTL8306_PHY=y
|
||||
# CONFIG_SOC_AMAZON_SE is not set
|
||||
CONFIG_SOC_VR9=y
|
||||
# CONFIG_SOC_FALCON is not set
|
||||
CONFIG_SOC_TYPE_XWAY=y
|
||||
CONFIG_SOC_XWAY=y
|
||||
# CONFIG_SOC_XWAY is not set
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
# CONFIG_SPI_GPIO is not set
|
||||
|
@ -49,3 +47,4 @@ CONFIG_SPI_LANTIQ=y
|
|||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_SPI_XWAY=y
|
6
target/linux/lantiq/vr9/profiles/000-generic.mk
Normal file
6
target/linux/lantiq/vr9/profiles/000-generic.mk
Normal file
|
@ -0,0 +1,6 @@
|
|||
define Profile/Generic
|
||||
NAME:=Generic - all boards
|
||||
PACKAGES:=kmod-leds-gpio button-hotplug
|
||||
endef
|
||||
|
||||
$(eval $(call Profile,Generic))
|
10
target/linux/lantiq/vr9/target.mk
Normal file
10
target/linux/lantiq/vr9/target.mk
Normal file
|
@ -0,0 +1,10 @@
|
|||
ARCH:=mips
|
||||
SUBTARGET:=vr9
|
||||
BOARDNAME:=VR9
|
||||
FEATURES:=squashfs jffs2 atm
|
||||
|
||||
DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-vr9 ltq-dsl-app swconfig
|
||||
|
||||
define Target/Description
|
||||
Lantiq VR9
|
||||
endef
|
Loading…
Reference in a new issue