Changeset 28405 for trunk


Ignore:
Timestamp:
2011-10-10T17:13:46+02:00 (5 years ago)
Author:
blogic
Message:

[lantiq]

  • update patches to 3.0
  • add basic vr9 support
  • backport 3.1 fixes
  • backport 3.2 queue (falcon)
Location:
trunk/target/linux/lantiq
Files:
54 added
27 deleted
13 edited
1 copied
16 moved

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/lantiq/Makefile

    r28022 r28405  
    1313DEFAULT_SUBTARGET:=danube 
    1414 
    15 LINUX_VERSION:=2.6.39.4 
     15LINUX_VERSION:=3.0.3 
    1616 
    1717CFLAGS=-Os -pipe -mips32r2 -mtune=mips32r2 -fno-caller-saves 
  • trunk/target/linux/lantiq/ar9/config-default

    r27697 r28405  
    2828# CONFIG_LANTIQ_MACH_EASY50712 is not set 
    2929CONFIG_LANTIQ_MACH_NETGEAR=y 
     30CONFIG_LANTIQ_MACH_WBMR=y 
    3031# CONFIG_LANTIQ_MACH_GIGASX76X is not set 
    31 CONFIG_LANTIQ_MACH_WBMR=y 
    3232CONFIG_MACH_NO_WESTBRIDGE=y 
    3333# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set 
     
    4141CONFIG_RTL8306_PHY=y 
    4242# CONFIG_SOC_AMAZON_SE is not set 
     43# CONFIG_SOC_VR9 is not set 
    4344# CONFIG_SOC_FALCON is not set 
    4445CONFIG_SOC_TYPE_XWAY=y 
     
    5152CONFIG_USB_SUPPORT=y 
    5253CONFIG_XZ_DEC=y 
     54CONFIG_SPI_XWAY=y 
  • trunk/target/linux/lantiq/ar9/profiles/003-buffalo.mk

    r27694 r28405  
    22  NAME:=WBMR - Buffalo WBMR-HP-G300H 
    33  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio \ 
    4          kmod-ltq-dsl-firmware-b kmod-ledtrig-usbdev  
     4         kmod-ltq-dsl-firmware-b-ar9 kmod-ledtrig-usbdev 
    55endef 
    66 
  • trunk/target/linux/lantiq/ar9/target.mk

    r27536 r28405  
    44FEATURES:=squashfs jffs2 atm 
    55 
    6 DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig 
     6DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-ar9 ltq-dsl-app swconfig 
    77 
    88define Target/Description 
  • trunk/target/linux/lantiq/ase/config-default

    r27036 r28405  
    3232# CONFIG_QUOTACTL is not set 
    3333CONFIG_SOC_AMAZON_SE=y 
     34# CONFIG_SOC_VR9 is not set 
    3435# CONFIG_SOC_FALCON is not set 
    3536CONFIG_SOC_TYPE_XWAY=y 
    3637# CONFIG_SOC_XWAY is not set 
    3738CONFIG_XZ_DEC=y 
     39CONFIG_SPI_XWAY=y 
  • trunk/target/linux/lantiq/ase/target.mk

    r27026 r28405  
    44FEATURES:=squashfs jffs2 atm 
    55 
    6 DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app 
     6DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-ase ltq-dsl-app 
    77 
    88define Target/Description 
  • trunk/target/linux/lantiq/config-default

    r27665 r28405  
    1 # CONFIG_64BIT is not set 
     1# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set 
    22# CONFIG_ARCH_HAS_ILOG2_U32 is not set 
    33# CONFIG_ARCH_HAS_ILOG2_U64 is not set 
    44CONFIG_ARCH_HIBERNATION_POSSIBLE=y 
     5# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set 
    56CONFIG_ARCH_POPULATES_NODE_MAP=y 
    67CONFIG_ARCH_REQUIRE_GPIOLIB=y 
     
    89CONFIG_ARCH_SUPPORTS_OPROFILE=y 
    910CONFIG_ARCH_SUSPEND_POSSIBLE=y 
     11# CONFIG_ATH79 is not set 
     12CONFIG_BCMA_POSSIBLE=y 
     13# CONFIG_BRCMUTIL is not set 
    1014CONFIG_CEVT_R4K=y 
    1115CONFIG_CEVT_R4K_LIB=y 
    12 CONFIG_CFG80211_DEFAULT_PS_VALUE=0 
    1316CONFIG_CPU_BIG_ENDIAN=y 
    14 # CONFIG_CPU_CAVIUM_OCTEON is not set 
    1517CONFIG_CPU_HAS_PREFETCH=y 
    1618CONFIG_CPU_HAS_SYNC=y 
    17 # CONFIG_CPU_LITTLE_ENDIAN is not set 
    18 # CONFIG_CPU_LOONGSON2E is not set 
    1919CONFIG_CPU_MIPS32=y 
    2020# CONFIG_CPU_MIPS32_R1 is not set 
    2121CONFIG_CPU_MIPS32_R2=y 
    22 # CONFIG_CPU_MIPS64_R1 is not set 
    23 # CONFIG_CPU_MIPS64_R2 is not set 
    2422CONFIG_CPU_MIPSR2=y 
    25 # CONFIG_CPU_NEVADA is not set 
    26 # CONFIG_CPU_R10000 is not set 
    27 # CONFIG_CPU_R3000 is not set 
    28 # CONFIG_CPU_R4300 is not set 
    29 # CONFIG_CPU_R4X00 is not set 
    30 # CONFIG_CPU_R5000 is not set 
    31 # CONFIG_CPU_R5432 is not set 
    32 # CONFIG_CPU_R5500 is not set 
    33 # CONFIG_CPU_R6000 is not set 
    34 # CONFIG_CPU_R8000 is not set 
    35 # CONFIG_CPU_RM7000 is not set 
    36 # CONFIG_CPU_RM9000 is not set 
    37 # CONFIG_CPU_SB1 is not set 
    3823CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y 
    3924CONFIG_CPU_SUPPORTS_HIGHMEM=y 
    40 # CONFIG_CPU_TX39XX is not set 
    41 # CONFIG_CPU_TX49XX is not set 
    42 # CONFIG_CPU_VR41XX is not set 
    4325CONFIG_CSRC_R4K=y 
    4426CONFIG_CSRC_R4K_LIB=y 
    4527CONFIG_DECOMPRESS_LZMA=y 
    46 CONFIG_DMA_NEED_PCI_MAP_STATE=y 
    4728CONFIG_DMA_NONCOHERENT=y 
    4829CONFIG_EARLY_PRINTK=y 
    4930# CONFIG_FSNOTIFY is not set 
     31CONFIG_GENERIC_ATOMIC64=y 
    5032CONFIG_GENERIC_CLOCKEVENTS=y 
    5133CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 
    5234CONFIG_GENERIC_CMOS_UPDATE=y 
    53 CONFIG_GENERIC_FIND_LAST_BIT=y 
    54 CONFIG_GENERIC_FIND_NEXT_BIT=y 
    5535CONFIG_GENERIC_GPIO=y 
    56 CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y 
     36CONFIG_GENERIC_IRQ_SHOW=y 
    5737CONFIG_GPIOLIB=y 
    5838CONFIG_GPIO_SYSFS=y 
     
    6141CONFIG_HAS_IOMEM=y 
    6242CONFIG_HAS_IOPORT=y 
     43CONFIG_HAVE_ARCH_JUMP_LABEL=y 
    6344CONFIG_HAVE_ARCH_KGDB=y 
    6445CONFIG_HAVE_CLK=y 
     46CONFIG_HAVE_C_RECORDMCOUNT=y 
     47CONFIG_HAVE_DMA_API_DEBUG=y 
     48CONFIG_HAVE_DMA_ATTRS=y 
     49CONFIG_HAVE_DYNAMIC_FTRACE=y 
     50CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y 
     51CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y 
     52CONFIG_HAVE_FUNCTION_TRACER=y 
     53CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y 
    6554CONFIG_HAVE_GENERIC_DMA_COHERENT=y 
     55CONFIG_HAVE_GENERIC_HARDIRQS=y 
    6656CONFIG_HAVE_IDE=y 
     57CONFIG_HAVE_IRQ_WORK=y 
    6758CONFIG_HAVE_OPROFILE=y 
     59CONFIG_HAVE_PERF_EVENTS=y 
    6860CONFIG_HW_RANDOM=y 
    6961CONFIG_HZ=250 
     
    7567CONFIG_IRQ_CPU=y 
    7668CONFIG_LANTIQ=y 
     69CONFIG_LANTIQ_MACH_95C3AM1=y 
     70CONFIG_LANTIQ_MACH_EASY98000=y 
     71CONFIG_LANTIQ_MACH_EASY98020=y 
    7772CONFIG_LANTIQ_WDT=y 
    7873CONFIG_LEDS_GPIO=y 
    79 # CONFIG_MACH_ALCHEMY is not set 
     74CONFIG_MACH_NO_WESTBRIDGE=y 
     75# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set 
    8076CONFIG_MIPS=y 
    8177CONFIG_MIPS_L1_CACHE_SHIFT=5 
     
    9086CONFIG_MTD_LANTIQ=y 
    9187CONFIG_MTD_UIMAGE_SPLIT=y 
    92 CONFIG_NLS=y 
     88CONFIG_NEED_DMA_MAP_STATE=y 
     89CONFIG_NEED_PER_CPU_KM=y 
    9390CONFIG_PAGEFLAGS_EXTENDED=y 
     91CONFIG_PERF_USE_VMALLOC=y 
    9492CONFIG_PHYLIB=y 
     93# CONFIG_PREEMPT_RCU is not set 
     94# CONFIG_QUOTACTL is not set 
     95CONFIG_RTL8366RB_PHY=y 
     96CONFIG_RTL8366_SMI=y 
    9597# CONFIG_SCSI_DMA is not set 
    9698# CONFIG_SERIAL_8250 is not set 
     
    105107CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y 
    106108CONFIG_SYS_SUPPORTS_MULTITHREADING=y 
    107 CONFIG_TREE_RCU=y 
     109CONFIG_XZ_DEC=y 
    108110CONFIG_ZONE_DMA_FLAG=0 
  • trunk/target/linux/lantiq/danube/config-default

    r27697 r28405  
    2828CONFIG_LANTIQ_MACH_EASY50712=y 
    2929# CONFIG_LANTIQ_MACH_NETGEAR is not set 
     30# CONFIG_LANTIQ_MACH_WBMR is not set 
    3031CONFIG_LANTIQ_MACH_GIGASX76X=y 
    31 # CONFIG_LANTIQ_MACH_WBMR is not set 
    3232CONFIG_MACH_NO_WESTBRIDGE=y 
    3333# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set 
     
    4242# CONFIG_SOC_AMAZON_SE is not set 
    4343# CONFIG_SOC_FALCON is not set 
     44# CONFIG_SOC_VR9 is not set 
    4445CONFIG_SOC_TYPE_XWAY=y 
    4546CONFIG_SOC_XWAY=y 
     
    5152CONFIG_USB_SUPPORT=y 
    5253CONFIG_XZ_DEC=y 
     54CONFIG_SPI_XWAY=y 
  • trunk/target/linux/lantiq/danube/profiles/002-arcadyan.mk

    r27665 r28405  
    11define Profile/ARV3527P 
    22  NAME:=ARV3527P - Arcor Easybox 401 
    3   PACKAGES:=kmod-ledtrig-netdev kmod-leds-gpio kmod-button-hotplug kmod-ltq-dsl-firmware-b 
     3  PACKAGES:=kmod-ledtrig-netdev kmod-leds-gpio kmod-button-hotplug kmod-ltq-dsl-firmware-b-danube 
    44endef 
    55 
     
    1414  PACKAGES:= kmod-usb-core \ 
    1515        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    16         kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-a 
     16        kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-a-danube 
    1717endef 
    1818 
     
    2727  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    2828        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    29         kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-a 
     29        kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-a-danube 
    3030endef 
    3131 
     
    4040  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    4141        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    42         kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-b  
     42        kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-b-danube  
    4343endef 
    4444 
     
    5353  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    5454        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    55         kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b 
     55        kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b-danube 
    5656endef 
    5757 
     
    6666  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    6767        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    68         kmod-rt2800-pci wpad-mini kmod-ltq-dsl-firmware-b 
     68        kmod-rt2800-pci wpad-mini kmod-ltq-dsl-firmware-b-danube 
    6969endef 
    7070 
     
    7979  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    8080        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    81         kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b 
     81        kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b-danube 
    8282endef 
    8383 
     
    9292  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \ 
    9393        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    94         kmod-rt2800-pci kmod-ltq-dsl-firmware-b 
     94        kmod-rt2800-pci kmod-ltq-dsl-firmware-b-danube 
    9595endef 
    9696 
     
    105105  PACKAGES:= kmod-usb-core kmod-usb2 kmod-usb-uhci kmod-usb-dwc-otg \ 
    106106        kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \ 
    107         kmod-ltq-dsl-firmware-b 
     107        kmod-ltq-dsl-firmware-b-danube 
    108108endef 
    109109 
  • trunk/target/linux/lantiq/danube/profiles/003-gigaset.mk

    r27535 r28405  
    22  NAME:=GIGASX76X - Gigaset SX761,SX762,SX763 
    33  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio \ 
    4          kmod-ltq-dsl-firmware-b kmod-ledtrig-usbdev  
     4         kmod-ltq-dsl-firmware-b-danube kmod-ledtrig-usbdev  
    55endef 
    66 
  • trunk/target/linux/lantiq/danube/target.mk

    r27535 r28405  
    44FEATURES:=squashfs jffs2 atm 
    55 
    6 DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig 
     6DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-danube ltq-dsl-app swconfig 
    77 
    88define Target/Description 
  • trunk/target/linux/lantiq/falcon/config-default

    r27542 r28405  
    1 # CONFIG_ARCH_DMA_ADDR_T_64BIT is not set 
    2 # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set 
    3 # CONFIG_ATH79 is not set 
    41CONFIG_CPU_MIPSR2_IRQ_EI=y 
    52CONFIG_CPU_MIPSR2_IRQ_VI=y 
    6 CONFIG_GENERIC_ATOMIC64=y 
    7 CONFIG_GENERIC_IRQ_SHOW=y 
    8 CONFIG_HAVE_ARCH_JUMP_LABEL=y 
    9 CONFIG_HAVE_C_RECORDMCOUNT=y 
    10 CONFIG_HAVE_DMA_API_DEBUG=y 
    11 CONFIG_HAVE_DMA_ATTRS=y 
    12 CONFIG_HAVE_DYNAMIC_FTRACE=y 
    13 CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y 
    14 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y 
    15 CONFIG_HAVE_FUNCTION_TRACER=y 
    16 CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y 
    17 CONFIG_HAVE_GENERIC_HARDIRQS=y 
    18 CONFIG_HAVE_IRQ_WORK=y 
    19 CONFIG_HAVE_PERF_EVENTS=y 
    203CONFIG_IFX_VPE_CACHE_SPLIT=y 
    214CONFIG_IFX_VPE_EXT=y 
    22 CONFIG_LANTIQ_MACH_95C3AM1=y 
    23 CONFIG_LANTIQ_MACH_EASY98000=y 
    24 CONFIG_LANTIQ_MACH_EASY98020=y 
    255CONFIG_M25PXX_USE_FAST_READ=y 
    26 CONFIG_MACH_NO_WESTBRIDGE=y 
    27 # CONFIG_MFD_MAX8997 is not set 
    28 # CONFIG_MINIX_FS_NATIVE_ENDIAN is not set 
    296CONFIG_MIPS_MT=y 
    307# CONFIG_MIPS_VPE_APSP_API is not set 
     
    3411CONFIG_MTD_NAND=y 
    3512CONFIG_MTD_NAND_ECC=y 
    36 # CONFIG_MTD_NAND_ECC_BCH is not set 
    3713CONFIG_MTD_NAND_PLATFORM=y 
    3814# CONFIG_MTD_SM_COMMON is not set 
    3915CONFIG_MTSCHED=y 
    40 CONFIG_NEED_DMA_MAP_STATE=y 
    41 CONFIG_NEED_PER_CPU_KM=y 
    4216# CONFIG_PERFCTRS is not set 
    43 CONFIG_PERF_USE_VMALLOC=y 
    44 # CONFIG_PREEMPT_RCU is not set 
    45 # CONFIG_QUOTACTL is not set 
    4617# CONFIG_SOC_AMAZON_SE is not set 
    4718CONFIG_SOC_FALCON=y 
    4819# CONFIG_SOC_TYPE_XWAY is not set 
    4920# CONFIG_SOC_XWAY is not set 
     21# CONFIG_SOC_VR9 is not set 
    5022CONFIG_SPI=y 
    5123# CONFIG_SPI_BITBANG is not set 
     
    5325# CONFIG_SPI_GPIO is not set 
    5426CONFIG_SPI_MASTER=y 
    55 CONFIG_XZ_DEC=y 
    5627# CONFIG_I2C_DESIGNWARE is not set 
     28 
  • trunk/target/linux/lantiq/modules.mk

    r27538 r28405  
    3030  TITLE:=Synopsis DWC_OTG support 
    3131  SUBMENU:=$(USB_MENU) 
    32   DEPENDS+=@TARGET_lantiq_danube +kmod-usb-core 
     32  DEPENDS+=@(TARGET_lantiq_danube||TARGET_lantiq_ar9||TARGET_lantiq_vr9) +kmod-usb-core 
    3333  KCONFIG:=CONFIG_DWC_OTG \ 
    3434        CONFIG_DWC_OTG_DEBUG=n \ 
     
    5252  TITLE:=Falcon I2C controller 
    5353  $(call i2c_defaults,$(I2C_FALCON_MODULES),52) 
    54   DEPENDS:=kmod-i2c-core @TARGET_lantiq 
     54  DEPENDS:=kmod-i2c-core @(TARGET_lantiq_falcon||TARGET_lantiq_falcon_stable) 
    5555endef 
    5656 
  • trunk/target/linux/lantiq/patches-3.0/0003-MIPS-lantiq-fix-watchdogs-timeout-handling.patch

    r28404 r28405  
    22From: John Crispin <blogic@openwrt.org> 
    33Date: Thu, 11 Aug 2011 13:58:39 +0200 
    4 Subject: [PATCH 03/16] MIPS: lantiq: fix watchdogs timeout handling 
     4Subject: [PATCH 03/24] MIPS: lantiq: fix watchdogs timeout handling 
    55 
    66The enable function was using the global timeout variable for local operations. 
     
    1616 1 files changed, 4 insertions(+), 4 deletions(-) 
    1717 
     18diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c 
     19index 7d82ada..102aed0 100644 
    1820--- a/drivers/watchdog/lantiq_wdt.c 
    1921+++ b/drivers/watchdog/lantiq_wdt.c 
     
    3941  
    4042 static void 
     43--  
     441.7.5.4 
     45 
  • trunk/target/linux/lantiq/patches-3.0/0011-MIPS-lantiq-adds-falcon-I2C.patch

    r28404 r28405  
     1From 6437f41dfdf9475178e22ab0dd886af033f90cc2 Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Thu, 29 Sep 2011 21:10:16 +0200 
     4Subject: [PATCH 11/24] MIPS: lantiq: adds falcon I2C 
     5 
     6--- 
     7 arch/mips/lantiq/falcon/devices.c |   21 + 
     8 arch/mips/lantiq/falcon/devices.h |    1 + 
     9 drivers/i2c/busses/Kconfig        |    4 + 
     10 drivers/i2c/busses/Makefile       |    1 + 
     11 drivers/i2c/busses/i2c-falcon.c   |  815 +++++++++++++++++++++++++++++++++++++ 
     12 5 files changed, 842 insertions(+), 0 deletions(-) 
     13 create mode 100644 drivers/i2c/busses/i2c-falcon.c 
     14 
     15diff --git a/arch/mips/lantiq/falcon/devices.c b/arch/mips/lantiq/falcon/devices.c 
     16index 4f47b44..a998b6b 100644 
     17--- a/arch/mips/lantiq/falcon/devices.c 
     18+++ b/arch/mips/lantiq/falcon/devices.c 
     19@@ -126,3 +126,24 @@ falcon_register_gpio_extra(void) 
     20        ltq_sysctl_activate(SYSCTL_SYS1, 
     21                ACTS_PADCTRL3 | ACTS_PADCTRL4 | ACTS_P3 | ACTS_P4); 
     22 } 
     23+ 
     24+/* i2c */ 
     25+static struct resource falcon_i2c_resources[] = { 
     26+       MEM_RES("i2c", GPON_I2C_BASE,GPON_I2C_END), 
     27+       IRQ_RES("i2c_lb", FALCON_IRQ_I2C_LBREQ), 
     28+       IRQ_RES("i2c_b", FALCON_IRQ_I2C_BREQ), 
     29+       IRQ_RES("i2c_err", FALCON_IRQ_I2C_I2C_ERR), 
     30+       IRQ_RES("i2c_p", FALCON_IRQ_I2C_I2C_P), 
     31+}; 
     32+ 
     33+void __init falcon_register_i2c(void) 
     34+{ 
     35+       platform_device_register_simple("i2c-falcon", 0, 
     36+       falcon_i2c_resources, ARRAY_SIZE(falcon_i2c_resources)); 
     37+       sys1_hw_activate(ACTS_I2C_ACT); 
     38+} 
     39+ 
     40+void __init falcon_register_crypto(void) 
     41+{ 
     42+       platform_device_register_simple("ltq_falcon_deu", 0, NULL, 0); 
     43+} 
     44diff --git a/arch/mips/lantiq/falcon/devices.h b/arch/mips/lantiq/falcon/devices.h 
     45index 18be8b6..2fdcb08 100644 
     46--- a/arch/mips/lantiq/falcon/devices.h 
     47+++ b/arch/mips/lantiq/falcon/devices.h 
     48@@ -16,5 +16,6 @@ 
     49 extern void falcon_register_nand(void); 
     50 extern void falcon_register_gpio(void); 
     51 extern void falcon_register_gpio_extra(void); 
     52+extern void falcon_register_i2c(void); 
     53  
     54 #endif 
     55diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig 
     56index 646068e..e6c3ab6 100644 
     57--- a/drivers/i2c/busses/Kconfig 
     58+++ b/drivers/i2c/busses/Kconfig 
     59@@ -284,6 +284,10 @@ config I2C_POWERMAC 
     60  
     61 comment "I2C system bus drivers (mostly embedded / system-on-chip)" 
     62  
     63+config I2C_FALCON 
     64+       tristate "Falcon I2C interface" 
     65+#      depends on SOC_FALCON 
     66+ 
     67 config I2C_AT91 
     68        tristate "Atmel AT91 I2C Two-Wire interface (TWI)" 
     69        depends on ARCH_AT91 && EXPERIMENTAL && BROKEN 
     70diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile 
     71index e6cf294..83e9250 100644 
    172--- a/drivers/i2c/busses/Makefile 
    273+++ b/drivers/i2c/busses/Makefile 
     
    879  
    980 ccflags-$(CONFIG_I2C_DEBUG_BUS) := -DDEBUG 
    10 --- a/drivers/i2c/busses/Kconfig 
    11 +++ b/drivers/i2c/busses/Kconfig 
    12 @@ -284,6 +284,10 @@ config I2C_POWERMAC 
    13   
    14  comment "I2C system bus drivers (mostly embedded / system-on-chip)" 
    15   
    16 +config I2C_FALCON 
    17 +       tristate "Falcon I2C interface" 
    18 +#      depends on SOC_FALCON 
    19 + 
    20  config I2C_AT91 
    21         tristate "Atmel AT91 I2C Two-Wire interface (TWI)" 
    22         depends on ARCH_AT91 && EXPERIMENTAL && BROKEN 
     81diff --git a/drivers/i2c/busses/i2c-falcon.c b/drivers/i2c/busses/i2c-falcon.c 
     82new file mode 100644 
     83index 0000000..7bb1253 
    2384--- /dev/null 
    2485+++ b/drivers/i2c/busses/i2c-falcon.c 
     
    839900+MODULE_LICENSE("GPL"); 
    840901+MODULE_VERSION(DRV_VERSION); 
     902--  
     9031.7.5.4 
     904 
  • trunk/target/linux/lantiq/patches-3.0/0014-MIPS-lantiq-adds-xway-spi.patch

    r28404 r28405  
    1 From: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com> 
    2 Date: Thu, 3 Mar 2011 17:15:30 +0000 (+0100) 
    3 Subject: SPI: lantiq: Add driver for Lantiq SoC SPI controller 
    4 X-Git-Url: http://nbd.name/gitweb.cgi?p=lantiq.git;a=commitdiff_plain;h=653c95b8b9066c9c6ac08bd64d0ceee439e9fd90;hp=3d21b04682ae8eb1c1965aba39d1796e8c5ad84b 
     1From e29263339db41d49d79482c93463c4c0cbe764d7 Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Fri, 30 Sep 2011 14:23:42 +0200 
     4Subject: [PATCH 14/24] MIPS: lantiq: adds xway spi 
    55 
    6 SPI: lantiq: Add driver for Lantiq SoC SPI controller 
     6--- 
     7 .../mips/include/asm/mach-lantiq/lantiq_platform.h |    9 + 
     8 .../mips/include/asm/mach-lantiq/xway/lantiq_irq.h |    2 + 
     9 .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |    1 + 
     10 drivers/spi/Kconfig                                |    8 + 
     11 drivers/spi/Makefile                               |    2 +- 
     12 drivers/spi/spi-xway.c                             | 1062 ++++++++++++++++++++ 
     13 6 files changed, 1083 insertions(+), 1 deletions(-) 
     14 create mode 100644 drivers/spi/spi-xway.c 
    715 
    8 Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com> 
    9 --- 
    10  
    11 --- a/drivers/spi/Kconfig 
    12 +++ b/drivers/spi/Kconfig 
    13 @@ -202,6 +202,14 @@ config SPI_IMX 
    14           This enables using the Freescale i.MX SPI controllers in master 
    15           mode. 
     16Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h 
     17=================================================================== 
     18--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/lantiq_platform.h        2011-08-17 19:57:16.000000000 +0200 
     19+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h     2011-10-04 20:05:23.962311503 +0200 
     20@@ -50,4 +50,13 @@ 
     21        int mii_mode; 
     22 }; 
    1623  
    17 +config SPI_LANTIQ 
    18 +       tristate "Lantiq SoC SPI controller" 
    19 +       depends on SOC_TYPE_XWAY 
     24+ 
     25+struct ltq_spi_platform_data { 
     26+       u16 num_chipselect; 
     27+}; 
     28+ 
     29+struct ltq_spi_controller_data { 
     30+       unsigned gpio; 
     31+}; 
     32+ 
     33 #endif 
     34Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 
     35=================================================================== 
     36--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h        2011-08-17 19:57:16.000000000 +0200 
     37+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h     2011-10-04 20:05:23.962311503 +0200 
     38@@ -27,6 +27,8 @@ 
     39  
     40 #define LTQ_SSC_TIR            (INT_NUM_IM0_IRL0 + 15) 
     41 #define LTQ_SSC_RIR            (INT_NUM_IM0_IRL0 + 14) 
     42+#define LTQ_SSC_TIR_AR9                (INT_NUM_IM0_IRL0 + 14) 
     43+#define LTQ_SSC_RIR_AR9                (INT_NUM_IM0_IRL0 + 15) 
     44 #define LTQ_SSC_EIR            (INT_NUM_IM0_IRL0 + 16) 
     45  
     46 #define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21) 
     47Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 
     48=================================================================== 
     49--- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h        2011-10-04 20:03:54.934307699 +0200 
     50+++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h     2011-10-04 20:05:23.966311504 +0200 
     51@@ -81,6 +81,7 @@ 
     52  
     53 #define PMU_DMA                        0x0020 
     54 #define PMU_USB                        0x8041 
     55+#define PMU_SPI                        0x0100 
     56 #define PMU_LED                        0x0800 
     57 #define PMU_GPT                        0x1000 
     58 #define PMU_PPE                        0x2000 
     59Index: linux-3.0.3/drivers/spi/Kconfig 
     60=================================================================== 
     61--- linux-3.0.3.orig/drivers/spi/Kconfig        2011-10-04 20:05:07.030310779 +0200 
     62+++ linux-3.0.3/drivers/spi/Kconfig     2011-10-04 20:05:23.966311504 +0200 
     63@@ -433,6 +433,14 @@ 
     64        help 
     65          SPI driver for Nuvoton NUC900 series ARM SoCs 
     66  
     67+config SPI_XWAY 
     68+       tristate "Lantiq XWAY SPI controller" 
     69+       depends on LANTIQ && SOC_TYPE_XWAY 
    2070+       select SPI_BITBANG 
    2171+       help 
     
    2373+         mode. 
    2474+ 
    25  config SPI_LM70_LLP 
    26         tristate "Parallel port adapter for LM70 eval board (DEVELOPMENT)" 
    27         depends on PARPORT && EXPERIMENTAL 
    28 --- a/drivers/spi/Makefile 
    29 +++ b/drivers/spi/Makefile 
    30 @@ -27,6 +27,7 @@ obj-$(CONFIG_SPI_EP93XX)              += ep93xx_spi. 
    31  obj-$(CONFIG_SPI_GPIO)                 += spi_gpio.o 
    32  obj-$(CONFIG_SPI_GPIO_OLD)             += spi_gpio_old.o 
    33  obj-$(CONFIG_SPI_IMX)                  += spi_imx.o 
    34 +obj-$(CONFIG_SPI_LANTIQ)               += spi_lantiq.o 
    35  obj-$(CONFIG_SPI_LM70_LLP)             += spi_lm70llp.o 
    36  obj-$(CONFIG_SPI_PXA2XX)               += pxa2xx_spi.o 
    37  obj-$(CONFIG_SPI_PXA2XX_PCI)           += pxa2xx_spi_pci.o 
    38 --- /dev/null 
    39 +++ b/drivers/spi/spi_lantiq.c 
     75 # 
     76 # Add new SPI master controllers in alphabetical order above this line 
     77 # 
     78Index: linux-3.0.3/drivers/spi/Makefile 
     79=================================================================== 
     80--- linux-3.0.3.orig/drivers/spi/Makefile       2011-10-04 20:05:20.000000000 +0200 
     81+++ linux-3.0.3/drivers/spi/Makefile    2011-10-04 20:05:35.802312011 +0200 
     82@@ -57,6 +57,7 @@ 
     83 obj-$(CONFIG_SPI_STMP3XXX)             += spi_stmp.o 
     84 obj-$(CONFIG_SPI_NUC900)               += spi_nuc900.o 
     85 obj-$(CONFIG_SPI_FALCON)               += spi-falcon.o 
     86+obj-$(CONFIG_SPI_XWAY)                 += spi-xway.o 
     87  
     88 # special build for s3c24xx spi driver with fiq support 
     89 spi_s3c24xx_hw-y                       := spi_s3c24xx.o 
     90Index: linux-3.0.3/drivers/spi/spi-xway.c 
     91=================================================================== 
     92--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
     93+++ linux-3.0.3/drivers/spi/spi-xway.c  2011-10-04 20:05:23.966311504 +0200 
    4094@@ -0,0 +1,1062 @@ 
    4195+/* 
  • trunk/target/linux/lantiq/patches-3.0/0017-MIPS-lantiq-adds-GPTU-driver.patch

    r28404 r28405  
    1 --- /dev/null 
    2 +++ b/arch/mips/lantiq/xway/timer.c 
    3 @@ -0,0 +1,830 @@ 
    4 +#include <linux/kernel.h> 
    5 +#include <linux/module.h> 
    6 +#include <linux/version.h> 
    7 +#include <linux/types.h> 
    8 +#include <linux/fs.h> 
    9 +#include <linux/miscdevice.h> 
    10 +#include <linux/init.h> 
    11 +#include <linux/uaccess.h> 
    12 +#include <linux/unistd.h> 
    13 +#include <linux/errno.h> 
    14 +#include <linux/interrupt.h> 
    15 +#include <linux/sched.h> 
    16 + 
    17 +#include <asm/irq.h> 
    18 +#include <asm/div64.h> 
    19 + 
    20 +#include <lantiq_soc.h> 
    21 +#include <lantiq_irq.h> 
    22 +#include <lantiq_timer.h> 
    23 + 
    24 +#define MAX_NUM_OF_32BIT_TIMER_BLOCKS  6 
    25 + 
    26 +#ifdef TIMER1A 
    27 +#define FIRST_TIMER                    TIMER1A 
    28 +#else 
    29 +#define FIRST_TIMER                    2 
    30 +#endif 
    31 + 
    32 +/* 
    33 + *  GPTC divider is set or not. 
    34 + */ 
    35 +#define GPTU_CLC_RMC_IS_SET            0 
    36 + 
    37 +/* 
    38 + *  Timer Interrupt (IRQ) 
    39 + */ 
    40 +/*  Must be adjusted when ICU driver is available */ 
    41 +#define TIMER_INTERRUPT                        (INT_NUM_IM3_IRL0 + 22) 
    42 + 
    43 +/* 
    44 + *  Bits Operation 
    45 + */ 
    46 +#define GET_BITS(x, msb, lsb)          \ 
    47 +       (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb)) 
    48 +#define SET_BITS(x, msb, lsb, value)   \ 
    49 +       (((x) & ~(((1 << ((msb) + 1)) - 1) ^ ((1 << (lsb)) - 1))) | \ 
    50 +       (((value) & ((1 << (1 + (msb) - (lsb))) - 1)) << (lsb))) 
    51 + 
    52 +/* 
    53 + *  GPTU Register Mapping 
    54 + */ 
    55 +#define LQ_GPTU                        (KSEG1 + 0x1E100A00) 
    56 +#define LQ_GPTU_CLC            ((volatile u32 *)(LQ_GPTU + 0x0000)) 
    57 +#define LQ_GPTU_ID                     ((volatile u32 *)(LQ_GPTU + 0x0008)) 
    58 +#define LQ_GPTU_CON(n, X)              ((volatile u32 *)(LQ_GPTU + 0x0010 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
    59 +#define LQ_GPTU_RUN(n, X)              ((volatile u32 *)(LQ_GPTU + 0x0018 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
    60 +#define LQ_GPTU_RELOAD(n, X)   ((volatile u32 *)(LQ_GPTU + 0x0020 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
    61 +#define LQ_GPTU_COUNT(n, X)    ((volatile u32 *)(LQ_GPTU + 0x0028 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
    62 +#define LQ_GPTU_IRNEN          ((volatile u32 *)(LQ_GPTU + 0x00F4)) 
    63 +#define LQ_GPTU_IRNICR         ((volatile u32 *)(LQ_GPTU + 0x00F8)) 
    64 +#define LQ_GPTU_IRNCR          ((volatile u32 *)(LQ_GPTU + 0x00FC)) 
    65 + 
    66 +/* 
    67 + *  Clock Control Register 
    68 + */ 
    69 +#define GPTU_CLC_SMC                   GET_BITS(*LQ_GPTU_CLC, 23, 16) 
    70 +#define GPTU_CLC_RMC                   GET_BITS(*LQ_GPTU_CLC, 15, 8) 
    71 +#define GPTU_CLC_FSOE                  (*LQ_GPTU_CLC & (1 << 5)) 
    72 +#define GPTU_CLC_EDIS                  (*LQ_GPTU_CLC & (1 << 3)) 
    73 +#define GPTU_CLC_SPEN                  (*LQ_GPTU_CLC & (1 << 2)) 
    74 +#define GPTU_CLC_DISS                  (*LQ_GPTU_CLC & (1 << 1)) 
    75 +#define GPTU_CLC_DISR                  (*LQ_GPTU_CLC & (1 << 0)) 
    76 + 
    77 +#define GPTU_CLC_SMC_SET(value)                SET_BITS(0, 23, 16, (value)) 
    78 +#define GPTU_CLC_RMC_SET(value)                SET_BITS(0, 15, 8, (value)) 
    79 +#define GPTU_CLC_FSOE_SET(value)       ((value) ? (1 << 5) : 0) 
    80 +#define GPTU_CLC_SBWE_SET(value)       ((value) ? (1 << 4) : 0) 
    81 +#define GPTU_CLC_EDIS_SET(value)       ((value) ? (1 << 3) : 0) 
    82 +#define GPTU_CLC_SPEN_SET(value)       ((value) ? (1 << 2) : 0) 
    83 +#define GPTU_CLC_DISR_SET(value)       ((value) ? (1 << 0) : 0) 
    84 + 
    85 +/* 
    86 + *  ID Register 
    87 + */ 
    88 +#define GPTU_ID_ID                     GET_BITS(*LQ_GPTU_ID, 15, 8) 
    89 +#define GPTU_ID_CFG                    GET_BITS(*LQ_GPTU_ID, 7, 5) 
    90 +#define GPTU_ID_REV                    GET_BITS(*LQ_GPTU_ID, 4, 0) 
    91 + 
    92 +/* 
    93 + *  Control Register of Timer/Counter nX 
    94 + *    n is the index of block (1 based index) 
    95 + *    X is either A or B 
    96 + */ 
    97 +#define GPTU_CON_SRC_EG(n, X)          (*LQ_GPTU_CON(n, X) & (1 << 10)) 
    98 +#define GPTU_CON_SRC_EXT(n, X)         (*LQ_GPTU_CON(n, X) & (1 << 9)) 
    99 +#define GPTU_CON_SYNC(n, X)            (*LQ_GPTU_CON(n, X) & (1 << 8)) 
    100 +#define GPTU_CON_EDGE(n, X)            GET_BITS(*LQ_GPTU_CON(n, X), 7, 6) 
    101 +#define GPTU_CON_INV(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 5)) 
    102 +#define GPTU_CON_EXT(n, X)             (*LQ_GPTU_CON(n, A) & (1 << 4)) /* Timer/Counter B does not have this bit */ 
    103 +#define GPTU_CON_STP(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 3)) 
    104 +#define GPTU_CON_CNT(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 2)) 
    105 +#define GPTU_CON_DIR(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 1)) 
    106 +#define GPTU_CON_EN(n, X)              (*LQ_GPTU_CON(n, X) & (1 << 0)) 
    107 + 
    108 +#define GPTU_CON_SRC_EG_SET(value)     ((value) ? 0 : (1 << 10)) 
    109 +#define GPTU_CON_SRC_EXT_SET(value)    ((value) ? (1 << 9) : 0) 
    110 +#define GPTU_CON_SYNC_SET(value)       ((value) ? (1 << 8) : 0) 
    111 +#define GPTU_CON_EDGE_SET(value)       SET_BITS(0, 7, 6, (value)) 
    112 +#define GPTU_CON_INV_SET(value)                ((value) ? (1 << 5) : 0) 
    113 +#define GPTU_CON_EXT_SET(value)                ((value) ? (1 << 4) : 0) 
    114 +#define GPTU_CON_STP_SET(value)                ((value) ? (1 << 3) : 0) 
    115 +#define GPTU_CON_CNT_SET(value)                ((value) ? (1 << 2) : 0) 
    116 +#define GPTU_CON_DIR_SET(value)                ((value) ? (1 << 1) : 0) 
    117 + 
    118 +#define GPTU_RUN_RL_SET(value)         ((value) ? (1 << 2) : 0) 
    119 +#define GPTU_RUN_CEN_SET(value)                ((value) ? (1 << 1) : 0) 
    120 +#define GPTU_RUN_SEN_SET(value)                ((value) ? (1 << 0) : 0) 
    121 + 
    122 +#define GPTU_IRNEN_TC_SET(n, X, value) ((value) ? (1 << (((n) - 1) * 2 + (X))) : 0) 
    123 +#define GPTU_IRNCR_TC_SET(n, X, value) ((value) ? (1 << (((n) - 1) * 2 + (X))) : 0) 
    124 + 
    125 +#define TIMER_FLAG_MASK_SIZE(x)                (x & 0x0001) 
    126 +#define TIMER_FLAG_MASK_TYPE(x)                (x & 0x0002) 
    127 +#define TIMER_FLAG_MASK_STOP(x)                (x & 0x0004) 
    128 +#define TIMER_FLAG_MASK_DIR(x)         (x & 0x0008) 
    129 +#define TIMER_FLAG_NONE_EDGE           0x0000 
    130 +#define TIMER_FLAG_MASK_EDGE(x)                (x & 0x0030) 
    131 +#define TIMER_FLAG_REAL                        0x0000 
    132 +#define TIMER_FLAG_INVERT              0x0040 
    133 +#define TIMER_FLAG_MASK_INVERT(x)      (x & 0x0040) 
    134 +#define TIMER_FLAG_MASK_TRIGGER(x)     (x & 0x0070) 
    135 +#define TIMER_FLAG_MASK_SYNC(x)                (x & 0x0080) 
    136 +#define TIMER_FLAG_CALLBACK_IN_HB      0x0200 
    137 +#define TIMER_FLAG_MASK_HANDLE(x)      (x & 0x0300) 
    138 +#define TIMER_FLAG_MASK_SRC(x)         (x & 0x1000) 
    139 + 
    140 +struct timer_dev_timer { 
    141 +       unsigned int f_irq_on; 
    142 +       unsigned int irq; 
    143 +       unsigned int flag; 
    144 +       unsigned long arg1; 
    145 +       unsigned long arg2; 
    146 +}; 
    147 + 
    148 +struct timer_dev { 
    149 +       struct mutex gptu_mutex; 
    150 +       unsigned int number_of_timers; 
    151 +       unsigned int occupation; 
    152 +       unsigned int f_gptu_on; 
    153 +       struct timer_dev_timer timer[MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2]; 
    154 +}; 
    155 + 
    156 +unsigned int ltq_get_fpi_bus_clock(int fpi); 
    157 + 
    158 +static long gptu_ioctl(struct file *, unsigned int, unsigned long); 
    159 +static int gptu_open(struct inode *, struct file *); 
    160 +static int gptu_release(struct inode *, struct file *); 
    161 + 
    162 +static struct file_operations gptu_fops = { 
    163 +       .owner = THIS_MODULE, 
    164 +       .unlocked_ioctl = gptu_ioctl, 
    165 +       .open = gptu_open, 
    166 +       .release = gptu_release 
    167 +}; 
    168 + 
    169 +static struct miscdevice gptu_miscdev = { 
    170 +       .minor = MISC_DYNAMIC_MINOR, 
    171 +       .name = "gptu", 
    172 +       .fops = &gptu_fops, 
    173 +}; 
    174 + 
    175 +static struct timer_dev timer_dev; 
    176 + 
    177 +static irqreturn_t timer_irq_handler(int irq, void *p) 
    178 +{ 
    179 +       unsigned int timer; 
    180 +       unsigned int flag; 
    181 +       struct timer_dev_timer *dev_timer = (struct timer_dev_timer *)p; 
    182 + 
    183 +       timer = irq - TIMER_INTERRUPT; 
    184 +       if (timer < timer_dev.number_of_timers 
    185 +               && dev_timer == &timer_dev.timer[timer]) { 
    186 +               /*  Clear interrupt.    */ 
    187 +               ltq_w32(1 << timer, LQ_GPTU_IRNCR); 
    188 + 
    189 +               /*  Call user hanler or signal. */ 
    190 +               flag = dev_timer->flag; 
    191 +               if (!(timer & 0x01) 
    192 +                       || TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) { 
    193 +                       /* 16-bit timer or timer A of 32-bit timer  */ 
    194 +                       switch (TIMER_FLAG_MASK_HANDLE(flag)) { 
    195 +                       case TIMER_FLAG_CALLBACK_IN_IRQ: 
    196 +                       case TIMER_FLAG_CALLBACK_IN_HB: 
    197 +                               if (dev_timer->arg1) 
    198 +                                       (*(timer_callback)dev_timer->arg1)(dev_timer->arg2); 
    199 +                               break; 
    200 +                       case TIMER_FLAG_SIGNAL: 
    201 +                               send_sig((int)dev_timer->arg2, (struct task_struct *)dev_timer->arg1, 0); 
    202 +                               break; 
    203 +                       } 
    204 +               } 
    205 +       } 
    206 +       return IRQ_HANDLED; 
    207 +} 
    208 + 
    209 +static inline void lq_enable_gptu(void) 
    210 +{ 
    211 +       ltq_pmu_enable(PMU_GPT); 
    212 + 
    213 +       /*  Set divider as 1, disable write protection for SPEN, enable module. */ 
    214 +       *LQ_GPTU_CLC = 
    215 +               GPTU_CLC_SMC_SET(0x00) | 
    216 +               GPTU_CLC_RMC_SET(0x01) | 
    217 +               GPTU_CLC_FSOE_SET(0) | 
    218 +               GPTU_CLC_SBWE_SET(1) | 
    219 +               GPTU_CLC_EDIS_SET(0) | 
    220 +               GPTU_CLC_SPEN_SET(0) | 
    221 +               GPTU_CLC_DISR_SET(0); 
    222 +} 
    223 + 
    224 +static inline void lq_disable_gptu(void) 
    225 +{ 
    226 +       ltq_w32(0x00, LQ_GPTU_IRNEN); 
    227 +       ltq_w32(0xfff, LQ_GPTU_IRNCR); 
    228 + 
    229 +       /*  Set divider as 0, enable write protection for SPEN, disable module. */ 
    230 +       *LQ_GPTU_CLC = 
    231 +               GPTU_CLC_SMC_SET(0x00) | 
    232 +               GPTU_CLC_RMC_SET(0x00) | 
    233 +               GPTU_CLC_FSOE_SET(0) | 
    234 +               GPTU_CLC_SBWE_SET(0) | 
    235 +               GPTU_CLC_EDIS_SET(0) | 
    236 +               GPTU_CLC_SPEN_SET(0) | 
    237 +               GPTU_CLC_DISR_SET(1); 
    238 + 
    239 +       ltq_pmu_disable(PMU_GPT); 
    240 +} 
    241 + 
    242 +int lq_request_timer(unsigned int timer, unsigned int flag, 
    243 +       unsigned long value, unsigned long arg1, unsigned long arg2) 
    244 +{ 
    245 +       int ret = 0; 
    246 +       unsigned int con_reg, irnen_reg; 
    247 +       int n, X; 
    248 + 
    249 +       if (timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    250 +               return -EINVAL; 
    251 + 
    252 +       printk(KERN_INFO "request_timer(%d, 0x%08X, %lu)...", 
    253 +               timer, flag, value); 
    254 + 
    255 +       if (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) 
    256 +               value &= 0xFFFF; 
    257 +       else 
    258 +               timer &= ~0x01; 
    259 + 
    260 +       mutex_lock(&timer_dev.gptu_mutex); 
    261 + 
    262 +       /* 
    263 +        *  Allocate timer. 
    264 +        */ 
    265 +       if (timer < FIRST_TIMER) { 
    266 +               unsigned int mask; 
    267 +               unsigned int shift; 
    268 +               /* This takes care of TIMER1B which is the only choice for Voice TAPI system */ 
    269 +               unsigned int offset = TIMER2A; 
    270 + 
    271 +               /* 
    272 +                *  Pick up a free timer. 
    273 +                */ 
    274 +               if (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) { 
    275 +                       mask = 1 << offset; 
    276 +                       shift = 1; 
    277 +               } else { 
    278 +                       mask = 3 << offset; 
    279 +                       shift = 2; 
    280 +               } 
    281 +               for (timer = offset; 
    282 +                    timer < offset + timer_dev.number_of_timers; 
    283 +                    timer += shift, mask <<= shift) 
    284 +                       if (!(timer_dev.occupation & mask)) { 
    285 +                               timer_dev.occupation |= mask; 
    286 +                               break; 
    287 +                       } 
    288 +               if (timer >= offset + timer_dev.number_of_timers) { 
    289 +                       printk("failed![%d]\n", __LINE__); 
    290 +                       mutex_unlock(&timer_dev.gptu_mutex); 
    291 +                       return -EINVAL; 
    292 +               } else 
    293 +                       ret = timer; 
    294 +       } else { 
    295 +               register unsigned int mask; 
    296 + 
    297 +               /* 
    298 +                *  Check if the requested timer is free. 
    299 +                */ 
    300 +               mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    301 +               if ((timer_dev.occupation & mask)) { 
    302 +                       printk("failed![%d] mask %#x, timer_dev.occupation %#x\n", 
    303 +                               __LINE__, mask, timer_dev.occupation); 
    304 +                       mutex_unlock(&timer_dev.gptu_mutex); 
    305 +                       return -EBUSY; 
    306 +               } else { 
    307 +                       timer_dev.occupation |= mask; 
    308 +                       ret = 0; 
    309 +               } 
    310 +       } 
    311 + 
    312 +       /* 
    313 +        *  Prepare control register value. 
    314 +        */ 
    315 +       switch (TIMER_FLAG_MASK_EDGE(flag)) { 
    316 +       default: 
    317 +       case TIMER_FLAG_NONE_EDGE: 
    318 +               con_reg = GPTU_CON_EDGE_SET(0x00); 
    319 +               break; 
    320 +       case TIMER_FLAG_RISE_EDGE: 
    321 +               con_reg = GPTU_CON_EDGE_SET(0x01); 
    322 +               break; 
    323 +       case TIMER_FLAG_FALL_EDGE: 
    324 +               con_reg = GPTU_CON_EDGE_SET(0x02); 
    325 +               break; 
    326 +       case TIMER_FLAG_ANY_EDGE: 
    327 +               con_reg = GPTU_CON_EDGE_SET(0x03); 
    328 +               break; 
    329 +       } 
    330 +       if (TIMER_FLAG_MASK_TYPE(flag) == TIMER_FLAG_TIMER) 
    331 +               con_reg |= 
    332 +                       TIMER_FLAG_MASK_SRC(flag) == 
    333 +                       TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EXT_SET(1) : 
    334 +                       GPTU_CON_SRC_EXT_SET(0); 
    335 +       else 
    336 +               con_reg |= 
    337 +                       TIMER_FLAG_MASK_SRC(flag) == 
    338 +                       TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EG_SET(1) : 
    339 +                       GPTU_CON_SRC_EG_SET(0); 
    340 +       con_reg |= 
    341 +               TIMER_FLAG_MASK_SYNC(flag) == 
    342 +               TIMER_FLAG_UNSYNC ? GPTU_CON_SYNC_SET(0) : 
    343 +               GPTU_CON_SYNC_SET(1); 
    344 +       con_reg |= 
    345 +               TIMER_FLAG_MASK_INVERT(flag) == 
    346 +               TIMER_FLAG_REAL ? GPTU_CON_INV_SET(0) : GPTU_CON_INV_SET(1); 
    347 +       con_reg |= 
    348 +               TIMER_FLAG_MASK_SIZE(flag) == 
    349 +               TIMER_FLAG_16BIT ? GPTU_CON_EXT_SET(0) : 
    350 +               GPTU_CON_EXT_SET(1); 
    351 +       con_reg |= 
    352 +               TIMER_FLAG_MASK_STOP(flag) == 
    353 +               TIMER_FLAG_ONCE ? GPTU_CON_STP_SET(1) : GPTU_CON_STP_SET(0); 
    354 +       con_reg |= 
    355 +               TIMER_FLAG_MASK_TYPE(flag) == 
    356 +               TIMER_FLAG_TIMER ? GPTU_CON_CNT_SET(0) : 
    357 +               GPTU_CON_CNT_SET(1); 
    358 +       con_reg |= 
    359 +               TIMER_FLAG_MASK_DIR(flag) == 
    360 +               TIMER_FLAG_UP ? GPTU_CON_DIR_SET(1) : GPTU_CON_DIR_SET(0); 
    361 + 
    362 +       /* 
    363 +        *  Fill up running data. 
    364 +        */ 
    365 +       timer_dev.timer[timer - FIRST_TIMER].flag = flag; 
    366 +       timer_dev.timer[timer - FIRST_TIMER].arg1 = arg1; 
    367 +       timer_dev.timer[timer - FIRST_TIMER].arg2 = arg2; 
    368 +       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
    369 +               timer_dev.timer[timer - FIRST_TIMER + 1].flag = flag; 
    370 + 
    371 +       /* 
    372 +        *  Enable GPTU module. 
    373 +        */ 
    374 +       if (!timer_dev.f_gptu_on) { 
    375 +               lq_enable_gptu(); 
    376 +               timer_dev.f_gptu_on = 1; 
    377 +       } 
    378 + 
    379 +       /* 
    380 +        *  Enable IRQ. 
    381 +        */ 
    382 +       if (TIMER_FLAG_MASK_HANDLE(flag) != TIMER_FLAG_NO_HANDLE) { 
    383 +               if (TIMER_FLAG_MASK_HANDLE(flag) == TIMER_FLAG_SIGNAL) 
    384 +                       timer_dev.timer[timer - FIRST_TIMER].arg1 = 
    385 +                               (unsigned long) find_task_by_vpid((int) arg1); 
    386 + 
    387 +               irnen_reg = 1 << (timer - FIRST_TIMER); 
    388 + 
    389 +               if (TIMER_FLAG_MASK_HANDLE(flag) == TIMER_FLAG_SIGNAL 
    390 +                   || (TIMER_FLAG_MASK_HANDLE(flag) == 
    391 +                       TIMER_FLAG_CALLBACK_IN_IRQ 
    392 +                       && timer_dev.timer[timer - FIRST_TIMER].arg1)) { 
    393 +                       enable_irq(timer_dev.timer[timer - FIRST_TIMER].irq); 
    394 +                       timer_dev.timer[timer - FIRST_TIMER].f_irq_on = 1; 
    395 +               } 
    396 +       } else 
    397 +               irnen_reg = 0; 
    398 + 
    399 +       /* 
    400 +        *  Write config register, reload value and enable interrupt. 
    401 +        */ 
    402 +       n = timer >> 1; 
    403 +       X = timer & 0x01; 
    404 +       *LQ_GPTU_CON(n, X) = con_reg; 
    405 +       *LQ_GPTU_RELOAD(n, X) = value; 
    406 +       /* printk("reload value = %d\n", (u32)value); */ 
    407 +       *LQ_GPTU_IRNEN |= irnen_reg; 
    408 + 
    409 +       mutex_unlock(&timer_dev.gptu_mutex); 
    410 +       printk("successful!\n"); 
    411 +       return ret; 
    412 +} 
    413 +EXPORT_SYMBOL(lq_request_timer); 
    414 + 
    415 +int lq_free_timer(unsigned int timer) 
    416 +{ 
    417 +       unsigned int flag; 
    418 +       unsigned int mask; 
    419 +       int n, X; 
    420 + 
    421 +       if (!timer_dev.f_gptu_on) 
    422 +               return -EINVAL; 
    423 + 
    424 +       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    425 +               return -EINVAL; 
    426 + 
    427 +       mutex_lock(&timer_dev.gptu_mutex); 
    428 + 
    429 +       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
    430 +       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
    431 +               timer &= ~0x01; 
    432 + 
    433 +       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    434 +       if (((timer_dev.occupation & mask) ^ mask)) { 
    435 +               mutex_unlock(&timer_dev.gptu_mutex); 
    436 +               return -EINVAL; 
    437 +       } 
    438 + 
    439 +       n = timer >> 1; 
    440 +       X = timer & 0x01; 
    441 + 
    442 +       if (GPTU_CON_EN(n, X)) 
    443 +               *LQ_GPTU_RUN(n, X) = GPTU_RUN_CEN_SET(1); 
    444 + 
    445 +       *LQ_GPTU_IRNEN &= ~GPTU_IRNEN_TC_SET(n, X, 1); 
    446 +       *LQ_GPTU_IRNCR |= GPTU_IRNCR_TC_SET(n, X, 1); 
    447 + 
    448 +       if (timer_dev.timer[timer - FIRST_TIMER].f_irq_on) { 
    449 +               disable_irq(timer_dev.timer[timer - FIRST_TIMER].irq); 
    450 +               timer_dev.timer[timer - FIRST_TIMER].f_irq_on = 0; 
    451 +       } 
    452 + 
    453 +       timer_dev.occupation &= ~mask; 
    454 +       if (!timer_dev.occupation && timer_dev.f_gptu_on) { 
    455 +               lq_disable_gptu(); 
    456 +               timer_dev.f_gptu_on = 0; 
    457 +       } 
    458 + 
    459 +       mutex_unlock(&timer_dev.gptu_mutex); 
    460 + 
    461 +       return 0; 
    462 +} 
    463 +EXPORT_SYMBOL(lq_free_timer); 
    464 + 
    465 +int lq_start_timer(unsigned int timer, int is_resume) 
    466 +{ 
    467 +       unsigned int flag; 
    468 +       unsigned int mask; 
    469 +       int n, X; 
    470 + 
    471 +       if (!timer_dev.f_gptu_on) 
    472 +               return -EINVAL; 
    473 + 
    474 +       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    475 +               return -EINVAL; 
    476 + 
    477 +       mutex_lock(&timer_dev.gptu_mutex); 
    478 + 
    479 +       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
    480 +       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
    481 +               timer &= ~0x01; 
    482 + 
    483 +       mask = (TIMER_FLAG_MASK_SIZE(flag) == 
    484 +       TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    485 +       if (((timer_dev.occupation & mask) ^ mask)) { 
    486 +               mutex_unlock(&timer_dev.gptu_mutex); 
    487 +               return -EINVAL; 
    488 +       } 
    489 + 
    490 +       n = timer >> 1; 
    491 +       X = timer & 0x01; 
    492 + 
    493 +       *LQ_GPTU_RUN(n, X) = GPTU_RUN_RL_SET(!is_resume) | GPTU_RUN_SEN_SET(1); 
    494 + 
    495 +       mutex_unlock(&timer_dev.gptu_mutex); 
    496 + 
    497 +       return 0; 
    498 +} 
    499 +EXPORT_SYMBOL(lq_start_timer); 
    500 + 
    501 +int lq_stop_timer(unsigned int timer) 
    502 +{ 
    503 +       unsigned int flag; 
    504 +       unsigned int mask; 
    505 +       int n, X; 
    506 + 
    507 +       if (!timer_dev.f_gptu_on) 
    508 +               return -EINVAL; 
    509 + 
    510 +       if (timer < FIRST_TIMER 
    511 +           || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    512 +               return -EINVAL; 
    513 + 
    514 +       mutex_lock(&timer_dev.gptu_mutex); 
    515 + 
    516 +       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
    517 +       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
    518 +               timer &= ~0x01; 
    519 + 
    520 +       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    521 +       if (((timer_dev.occupation & mask) ^ mask)) { 
    522 +               mutex_unlock(&timer_dev.gptu_mutex); 
    523 +               return -EINVAL; 
    524 +       } 
    525 + 
    526 +       n = timer >> 1; 
    527 +       X = timer & 0x01; 
    528 + 
    529 +       *LQ_GPTU_RUN(n, X) = GPTU_RUN_CEN_SET(1); 
    530 + 
    531 +       mutex_unlock(&timer_dev.gptu_mutex); 
    532 + 
    533 +       return 0; 
    534 +} 
    535 +EXPORT_SYMBOL(lq_stop_timer); 
    536 + 
    537 +int lq_reset_counter_flags(u32 timer, u32 flags) 
    538 +{ 
    539 +       unsigned int oflag; 
    540 +       unsigned int mask, con_reg; 
    541 +       int n, X; 
    542 + 
    543 +       if (!timer_dev.f_gptu_on) 
    544 +               return -EINVAL; 
    545 + 
    546 +       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    547 +               return -EINVAL; 
    548 + 
    549 +       mutex_lock(&timer_dev.gptu_mutex); 
    550 + 
    551 +       oflag = timer_dev.timer[timer - FIRST_TIMER].flag; 
    552 +       if (TIMER_FLAG_MASK_SIZE(oflag) != TIMER_FLAG_16BIT) 
    553 +               timer &= ~0x01; 
    554 + 
    555 +       mask = (TIMER_FLAG_MASK_SIZE(oflag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    556 +       if (((timer_dev.occupation & mask) ^ mask)) { 
    557 +               mutex_unlock(&timer_dev.gptu_mutex); 
    558 +               return -EINVAL; 
    559 +       } 
    560 + 
    561 +       switch (TIMER_FLAG_MASK_EDGE(flags)) { 
    562 +       default: 
    563 +       case TIMER_FLAG_NONE_EDGE: 
    564 +               con_reg = GPTU_CON_EDGE_SET(0x00); 
    565 +               break; 
    566 +       case TIMER_FLAG_RISE_EDGE: 
    567 +               con_reg = GPTU_CON_EDGE_SET(0x01); 
    568 +               break; 
    569 +       case TIMER_FLAG_FALL_EDGE: 
    570 +               con_reg = GPTU_CON_EDGE_SET(0x02); 
    571 +               break; 
    572 +       case TIMER_FLAG_ANY_EDGE: 
    573 +               con_reg = GPTU_CON_EDGE_SET(0x03); 
    574 +               break; 
    575 +       } 
    576 +       if (TIMER_FLAG_MASK_TYPE(flags) == TIMER_FLAG_TIMER) 
    577 +               con_reg |= TIMER_FLAG_MASK_SRC(flags) == TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EXT_SET(1) : GPTU_CON_SRC_EXT_SET(0); 
    578 +       else 
    579 +               con_reg |= TIMER_FLAG_MASK_SRC(flags) == TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EG_SET(1) : GPTU_CON_SRC_EG_SET(0); 
    580 +       con_reg |= TIMER_FLAG_MASK_SYNC(flags) == TIMER_FLAG_UNSYNC ? GPTU_CON_SYNC_SET(0) : GPTU_CON_SYNC_SET(1); 
    581 +       con_reg |= TIMER_FLAG_MASK_INVERT(flags) == TIMER_FLAG_REAL ? GPTU_CON_INV_SET(0) : GPTU_CON_INV_SET(1); 
    582 +       con_reg |= TIMER_FLAG_MASK_SIZE(flags) == TIMER_FLAG_16BIT ? GPTU_CON_EXT_SET(0) : GPTU_CON_EXT_SET(1); 
    583 +       con_reg |= TIMER_FLAG_MASK_STOP(flags) == TIMER_FLAG_ONCE ? GPTU_CON_STP_SET(1) : GPTU_CON_STP_SET(0); 
    584 +       con_reg |= TIMER_FLAG_MASK_TYPE(flags) == TIMER_FLAG_TIMER ? GPTU_CON_CNT_SET(0) : GPTU_CON_CNT_SET(1); 
    585 +       con_reg |= TIMER_FLAG_MASK_DIR(flags) == TIMER_FLAG_UP ? GPTU_CON_DIR_SET(1) : GPTU_CON_DIR_SET(0); 
    586 + 
    587 +       timer_dev.timer[timer - FIRST_TIMER].flag = flags; 
    588 +       if (TIMER_FLAG_MASK_SIZE(flags) != TIMER_FLAG_16BIT) 
    589 +               timer_dev.timer[timer - FIRST_TIMER + 1].flag = flags; 
    590 + 
    591 +       n = timer >> 1; 
    592 +       X = timer & 0x01; 
    593 + 
    594 +       *LQ_GPTU_CON(n, X) = con_reg; 
    595 +       smp_wmb(); 
    596 +       printk(KERN_INFO "[%s]: counter%d oflags %#x, nflags %#x, GPTU_CON %#x\n", __func__, timer, oflag, flags, *LQ_GPTU_CON(n, X)); 
    597 +       mutex_unlock(&timer_dev.gptu_mutex); 
    598 +       return 0; 
    599 +} 
    600 +EXPORT_SYMBOL(lq_reset_counter_flags); 
    601 + 
    602 +int lq_get_count_value(unsigned int timer, unsigned long *value) 
    603 +{ 
    604 +       unsigned int flag; 
    605 +       unsigned int mask; 
    606 +       int n, X; 
    607 + 
    608 +       if (!timer_dev.f_gptu_on) 
    609 +               return -EINVAL; 
    610 + 
    611 +       if (timer < FIRST_TIMER 
    612 +           || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
    613 +               return -EINVAL; 
    614 + 
    615 +       mutex_lock(&timer_dev.gptu_mutex); 
    616 + 
    617 +       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
    618 +       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
    619 +               timer &= ~0x01; 
    620 + 
    621 +       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
    622 +       if (((timer_dev.occupation & mask) ^ mask)) { 
    623 +               mutex_unlock(&timer_dev.gptu_mutex); 
    624 +               return -EINVAL; 
    625 +       } 
    626 + 
    627 +       n = timer >> 1; 
    628 +       X = timer & 0x01; 
    629 + 
    630 +       *value = *LQ_GPTU_COUNT(n, X); 
    631 + 
    632 +       mutex_unlock(&timer_dev.gptu_mutex); 
    633 + 
    634 +       return 0; 
    635 +} 
    636 +EXPORT_SYMBOL(lq_get_count_value); 
    637 + 
    638 +u32 lq_cal_divider(unsigned long freq) 
    639 +{ 
    640 +       u64 module_freq, fpi = ltq_get_fpi_bus_clock(2); 
    641 +       u32 clock_divider = 1; 
    642 +       module_freq = fpi * 1000; 
    643 +       do_div(module_freq, clock_divider * freq); 
    644 +       return module_freq; 
    645 +} 
    646 +EXPORT_SYMBOL(lq_cal_divider); 
    647 + 
    648 +int lq_set_timer(unsigned int timer, unsigned int freq, int is_cyclic, 
    649 +       int is_ext_src, unsigned int handle_flag, unsigned long arg1, 
    650 +       unsigned long arg2) 
    651 +{ 
    652 +       unsigned long divider; 
    653 +       unsigned int flag; 
    654 + 
    655 +       divider = lq_cal_divider(freq); 
    656 +       if (divider == 0) 
    657 +               return -EINVAL; 
    658 +       flag = ((divider & ~0xFFFF) ? TIMER_FLAG_32BIT : TIMER_FLAG_16BIT) 
    659 +               | (is_cyclic ? TIMER_FLAG_CYCLIC : TIMER_FLAG_ONCE) 
    660 +               | (is_ext_src ? TIMER_FLAG_EXT_SRC : TIMER_FLAG_INT_SRC) 
    661 +               | TIMER_FLAG_TIMER | TIMER_FLAG_DOWN 
    662 +               | TIMER_FLAG_MASK_HANDLE(handle_flag); 
    663 + 
    664 +       printk(KERN_INFO "lq_set_timer(%d, %d), divider = %lu\n", 
    665 +               timer, freq, divider); 
    666 +       return lq_request_timer(timer, flag, divider, arg1, arg2); 
    667 +} 
    668 +EXPORT_SYMBOL(lq_set_timer); 
    669 + 
    670 +int lq_set_counter(unsigned int timer, unsigned int flag, u32 reload, 
    671 +       unsigned long arg1, unsigned long arg2) 
    672 +{ 
    673 +       printk(KERN_INFO "lq_set_counter(%d, %#x, %d)\n", timer, flag, reload); 
    674 +       return lq_request_timer(timer, flag, reload, arg1, arg2); 
    675 +} 
    676 +EXPORT_SYMBOL(lq_set_counter); 
    677 + 
    678 +static long gptu_ioctl(struct file *file, unsigned int cmd, 
    679 +       unsigned long arg) 
    680 +{ 
    681 +       int ret; 
    682 +       struct gptu_ioctl_param param; 
    683 + 
    684 +       if (!access_ok(VERIFY_READ, arg, sizeof(struct gptu_ioctl_param))) 
    685 +               return -EFAULT; 
    686 +       copy_from_user(&param, (void *) arg, sizeof(param)); 
    687 + 
    688 +       if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER 
    689 +              || GPTU_SET_COUNTER) && param.timer < 2) 
    690 +            || cmd == GPTU_GET_COUNT_VALUE || cmd == GPTU_CALCULATE_DIVIDER) 
    691 +           && !access_ok(VERIFY_WRITE, arg, 
    692 +                          sizeof(struct gptu_ioctl_param))) 
    693 +               return -EFAULT; 
    694 + 
    695 +       switch (cmd) { 
    696 +       case GPTU_REQUEST_TIMER: 
    697 +               ret = lq_request_timer(param.timer, param.flag, param.value, 
    698 +                                    (unsigned long) param.pid, 
    699 +                                    (unsigned long) param.sig); 
    700 +               if (ret > 0) { 
    701 +                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
    702 +                                     timer, &ret, sizeof(&ret)); 
    703 +                       ret = 0; 
    704 +               } 
    705 +               break; 
    706 +       case GPTU_FREE_TIMER: 
    707 +               ret = lq_free_timer(param.timer); 
    708 +               break; 
    709 +       case GPTU_START_TIMER: 
    710 +               ret = lq_start_timer(param.timer, param.flag); 
    711 +               break; 
    712 +       case GPTU_STOP_TIMER: 
    713 +               ret = lq_stop_timer(param.timer); 
    714 +               break; 
    715 +       case GPTU_GET_COUNT_VALUE: 
    716 +               ret = lq_get_count_value(param.timer, &param.value); 
    717 +               if (!ret) 
    718 +                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
    719 +                                     value, &param.value, 
    720 +                                     sizeof(param.value)); 
    721 +               break; 
    722 +       case GPTU_CALCULATE_DIVIDER: 
    723 +               param.value = lq_cal_divider(param.value); 
    724 +               if (param.value == 0) 
    725 +                       ret = -EINVAL; 
    726 +               else { 
    727 +                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
    728 +                                     value, &param.value, 
    729 +                                     sizeof(param.value)); 
    730 +                       ret = 0; 
    731 +               } 
    732 +               break; 
    733 +       case GPTU_SET_TIMER: 
    734 +               ret = lq_set_timer(param.timer, param.value, 
    735 +                                TIMER_FLAG_MASK_STOP(param.flag) != 
    736 +                                TIMER_FLAG_ONCE ? 1 : 0, 
    737 +                                TIMER_FLAG_MASK_SRC(param.flag) == 
    738 +                                TIMER_FLAG_EXT_SRC ? 1 : 0, 
    739 +                                TIMER_FLAG_MASK_HANDLE(param.flag) == 
    740 +                                TIMER_FLAG_SIGNAL ? TIMER_FLAG_SIGNAL : 
    741 +                                TIMER_FLAG_NO_HANDLE, 
    742 +                                (unsigned long) param.pid, 
    743 +                                (unsigned long) param.sig); 
    744 +               if (ret > 0) { 
    745 +                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
    746 +                                     timer, &ret, sizeof(&ret)); 
    747 +                       ret = 0; 
    748 +               } 
    749 +               break; 
    750 +       case GPTU_SET_COUNTER: 
    751 +               lq_set_counter(param.timer, param.flag, param.value, 0, 0); 
    752 +               if (ret > 0) { 
    753 +                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
    754 +                                     timer, &ret, sizeof(&ret)); 
    755 +                       ret = 0; 
    756 +               } 
    757 +               break; 
    758 +       default: 
    759 +               ret = -ENOTTY; 
    760 +       } 
    761 + 
    762 +       return ret; 
    763 +} 
    764 + 
    765 +static int gptu_open(struct inode *inode, struct file *file) 
    766 +{ 
    767 +       return 0; 
    768 +} 
    769 + 
    770 +static int gptu_release(struct inode *inode, struct file *file) 
    771 +{ 
    772 +       return 0; 
    773 +} 
    774 + 
    775 +int __init lq_gptu_init(void) 
    776 +{ 
    777 +       int ret; 
    778 +       unsigned int i; 
    779 + 
    780 +       ltq_w32(0, LQ_GPTU_IRNEN); 
    781 +       ltq_w32(0xfff, LQ_GPTU_IRNCR); 
    782 + 
    783 +       memset(&timer_dev, 0, sizeof(timer_dev)); 
    784 +       mutex_init(&timer_dev.gptu_mutex); 
    785 + 
    786 +       lq_enable_gptu(); 
    787 +       timer_dev.number_of_timers = GPTU_ID_CFG * 2; 
    788 +       lq_disable_gptu(); 
    789 +       if (timer_dev.number_of_timers > MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2) 
    790 +               timer_dev.number_of_timers = MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2; 
    791 +       printk(KERN_INFO "gptu: totally %d 16-bit timers/counters\n", timer_dev.number_of_timers); 
    792 + 
    793 +       ret = misc_register(&gptu_miscdev); 
    794 +       if (ret) { 
    795 +               printk(KERN_ERR "gptu: can't misc_register, get error %d\n", -ret); 
    796 +               return ret; 
    797 +       } else { 
    798 +               printk(KERN_INFO "gptu: misc_register on minor %d\n", gptu_miscdev.minor); 
    799 +       } 
    800 + 
    801 +       for (i = 0; i < timer_dev.number_of_timers; i++) { 
    802 +               ret = request_irq(TIMER_INTERRUPT + i, timer_irq_handler, IRQF_TIMER, gptu_miscdev.name, &timer_dev.timer[i]); 
    803 +               if (ret) { 
    804 +                       for (; i >= 0; i--) 
    805 +                               free_irq(TIMER_INTERRUPT + i, &timer_dev.timer[i]); 
    806 +                       misc_deregister(&gptu_miscdev); 
    807 +                       printk(KERN_ERR "gptu: failed in requesting irq (%d), get error %d\n", i, -ret); 
    808 +                       return ret; 
    809 +               } else { 
    810 +                       timer_dev.timer[i].irq = TIMER_INTERRUPT + i; 
    811 +                       disable_irq(timer_dev.timer[i].irq); 
    812 +                       printk(KERN_INFO "gptu: succeeded to request irq %d\n", timer_dev.timer[i].irq); 
    813 +               } 
    814 +       } 
    815 + 
    816 +       return 0; 
    817 +} 
    818 + 
    819 +void __exit lq_gptu_exit(void) 
    820 +{ 
    821 +       unsigned int i; 
    822 + 
    823 +       for (i = 0; i < timer_dev.number_of_timers; i++) { 
    824 +               if (timer_dev.timer[i].f_irq_on) 
    825 +                       disable_irq(timer_dev.timer[i].irq); 
    826 +               free_irq(timer_dev.timer[i].irq, &timer_dev.timer[i]); 
    827 +       } 
    828 +       lq_disable_gptu(); 
    829 +       misc_deregister(&gptu_miscdev); 
    830 +} 
    831 + 
    832 +module_init(lq_gptu_init); 
    833 +module_exit(lq_gptu_exit); 
     1From 45dbb232686978816e8148753e12f27caa2b2eb3 Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Thu, 29 Sep 2011 17:16:38 +0200 
     4Subject: [PATCH 17/24] MIPS: lantiq: adds GPTU driver 
     5 
     6--- 
     7 arch/mips/include/asm/mach-lantiq/lantiq_timer.h |  155 ++++ 
     8 arch/mips/lantiq/xway/Makefile                   |    2 +- 
     9 arch/mips/lantiq/xway/timer.c                    |  830 ++++++++++++++++++++++ 
     10 3 files changed, 986 insertions(+), 1 deletions(-) 
     11 create mode 100644 arch/mips/include/asm/mach-lantiq/lantiq_timer.h 
     12 create mode 100644 arch/mips/lantiq/xway/timer.c 
     13 
     14diff --git a/arch/mips/include/asm/mach-lantiq/lantiq_timer.h b/arch/mips/include/asm/mach-lantiq/lantiq_timer.h 
     15new file mode 100644 
     16index 0000000..ef564ab 
    83417--- /dev/null 
    83518+++ b/arch/mips/include/asm/mach-lantiq/lantiq_timer.h 
     
    990173+ 
    991174+#endif /* __DANUBE_GPTU_DEV_H__2005_07_26__10_19__ */ 
     175diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile 
     176index ac7cc34..1f41239 100644 
    992177--- a/arch/mips/lantiq/xway/Makefile 
    993178+++ b/arch/mips/lantiq/xway/Makefile 
    994179@@ -1,4 +1,4 @@ 
    995 -obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o 
    996 +obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o timer.o 
     180-obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o 
     181+obj-y := sysctrl.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o nand.o timer.o 
    997182  
    998  obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o 
    999  obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o 
     183 obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o 
     184 obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o 
     185diff --git a/arch/mips/lantiq/xway/timer.c b/arch/mips/lantiq/xway/timer.c 
     186new file mode 100644 
     187index 0000000..cac2ea8 
     188--- /dev/null 
     189+++ b/arch/mips/lantiq/xway/timer.c 
     190@@ -0,0 +1,830 @@ 
     191+#include <linux/kernel.h> 
     192+#include <linux/module.h> 
     193+#include <linux/version.h> 
     194+#include <linux/types.h> 
     195+#include <linux/fs.h> 
     196+#include <linux/miscdevice.h> 
     197+#include <linux/init.h> 
     198+#include <linux/uaccess.h> 
     199+#include <linux/unistd.h> 
     200+#include <linux/errno.h> 
     201+#include <linux/interrupt.h> 
     202+#include <linux/sched.h> 
     203+ 
     204+#include <asm/irq.h> 
     205+#include <asm/div64.h> 
     206+ 
     207+#include <lantiq_soc.h> 
     208+#include <lantiq_irq.h> 
     209+#include <lantiq_timer.h> 
     210+ 
     211+#define MAX_NUM_OF_32BIT_TIMER_BLOCKS  6 
     212+ 
     213+#ifdef TIMER1A 
     214+#define FIRST_TIMER                    TIMER1A 
     215+#else 
     216+#define FIRST_TIMER                    2 
     217+#endif 
     218+ 
     219+/* 
     220+ *  GPTC divider is set or not. 
     221+ */ 
     222+#define GPTU_CLC_RMC_IS_SET            0 
     223+ 
     224+/* 
     225+ *  Timer Interrupt (IRQ) 
     226+ */ 
     227+/*  Must be adjusted when ICU driver is available */ 
     228+#define TIMER_INTERRUPT                        (INT_NUM_IM3_IRL0 + 22) 
     229+ 
     230+/* 
     231+ *  Bits Operation 
     232+ */ 
     233+#define GET_BITS(x, msb, lsb)          \ 
     234+       (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb)) 
     235+#define SET_BITS(x, msb, lsb, value)   \ 
     236+       (((x) & ~(((1 << ((msb) + 1)) - 1) ^ ((1 << (lsb)) - 1))) | \ 
     237+       (((value) & ((1 << (1 + (msb) - (lsb))) - 1)) << (lsb))) 
     238+ 
     239+/* 
     240+ *  GPTU Register Mapping 
     241+ */ 
     242+#define LQ_GPTU                        (KSEG1 + 0x1E100A00) 
     243+#define LQ_GPTU_CLC            ((volatile u32 *)(LQ_GPTU + 0x0000)) 
     244+#define LQ_GPTU_ID                     ((volatile u32 *)(LQ_GPTU + 0x0008)) 
     245+#define LQ_GPTU_CON(n, X)              ((volatile u32 *)(LQ_GPTU + 0x0010 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
     246+#define LQ_GPTU_RUN(n, X)              ((volatile u32 *)(LQ_GPTU + 0x0018 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
     247+#define LQ_GPTU_RELOAD(n, X)   ((volatile u32 *)(LQ_GPTU + 0x0020 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
     248+#define LQ_GPTU_COUNT(n, X)    ((volatile u32 *)(LQ_GPTU + 0x0028 + ((X) * 4) + ((n) - 1) * 0x0020))   /* X must be either A or B */ 
     249+#define LQ_GPTU_IRNEN          ((volatile u32 *)(LQ_GPTU + 0x00F4)) 
     250+#define LQ_GPTU_IRNICR         ((volatile u32 *)(LQ_GPTU + 0x00F8)) 
     251+#define LQ_GPTU_IRNCR          ((volatile u32 *)(LQ_GPTU + 0x00FC)) 
     252+ 
     253+/* 
     254+ *  Clock Control Register 
     255+ */ 
     256+#define GPTU_CLC_SMC                   GET_BITS(*LQ_GPTU_CLC, 23, 16) 
     257+#define GPTU_CLC_RMC                   GET_BITS(*LQ_GPTU_CLC, 15, 8) 
     258+#define GPTU_CLC_FSOE                  (*LQ_GPTU_CLC & (1 << 5)) 
     259+#define GPTU_CLC_EDIS                  (*LQ_GPTU_CLC & (1 << 3)) 
     260+#define GPTU_CLC_SPEN                  (*LQ_GPTU_CLC & (1 << 2)) 
     261+#define GPTU_CLC_DISS                  (*LQ_GPTU_CLC & (1 << 1)) 
     262+#define GPTU_CLC_DISR                  (*LQ_GPTU_CLC & (1 << 0)) 
     263+ 
     264+#define GPTU_CLC_SMC_SET(value)                SET_BITS(0, 23, 16, (value)) 
     265+#define GPTU_CLC_RMC_SET(value)                SET_BITS(0, 15, 8, (value)) 
     266+#define GPTU_CLC_FSOE_SET(value)       ((value) ? (1 << 5) : 0) 
     267+#define GPTU_CLC_SBWE_SET(value)       ((value) ? (1 << 4) : 0) 
     268+#define GPTU_CLC_EDIS_SET(value)       ((value) ? (1 << 3) : 0) 
     269+#define GPTU_CLC_SPEN_SET(value)       ((value) ? (1 << 2) : 0) 
     270+#define GPTU_CLC_DISR_SET(value)       ((value) ? (1 << 0) : 0) 
     271+ 
     272+/* 
     273+ *  ID Register 
     274+ */ 
     275+#define GPTU_ID_ID                     GET_BITS(*LQ_GPTU_ID, 15, 8) 
     276+#define GPTU_ID_CFG                    GET_BITS(*LQ_GPTU_ID, 7, 5) 
     277+#define GPTU_ID_REV                    GET_BITS(*LQ_GPTU_ID, 4, 0) 
     278+ 
     279+/* 
     280+ *  Control Register of Timer/Counter nX 
     281+ *    n is the index of block (1 based index) 
     282+ *    X is either A or B 
     283+ */ 
     284+#define GPTU_CON_SRC_EG(n, X)          (*LQ_GPTU_CON(n, X) & (1 << 10)) 
     285+#define GPTU_CON_SRC_EXT(n, X)         (*LQ_GPTU_CON(n, X) & (1 << 9)) 
     286+#define GPTU_CON_SYNC(n, X)            (*LQ_GPTU_CON(n, X) & (1 << 8)) 
     287+#define GPTU_CON_EDGE(n, X)            GET_BITS(*LQ_GPTU_CON(n, X), 7, 6) 
     288+#define GPTU_CON_INV(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 5)) 
     289+#define GPTU_CON_EXT(n, X)             (*LQ_GPTU_CON(n, A) & (1 << 4)) /* Timer/Counter B does not have this bit */ 
     290+#define GPTU_CON_STP(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 3)) 
     291+#define GPTU_CON_CNT(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 2)) 
     292+#define GPTU_CON_DIR(n, X)             (*LQ_GPTU_CON(n, X) & (1 << 1)) 
     293+#define GPTU_CON_EN(n, X)              (*LQ_GPTU_CON(n, X) & (1 << 0)) 
     294+ 
     295+#define GPTU_CON_SRC_EG_SET(value)     ((value) ? 0 : (1 << 10)) 
     296+#define GPTU_CON_SRC_EXT_SET(value)    ((value) ? (1 << 9) : 0) 
     297+#define GPTU_CON_SYNC_SET(value)       ((value) ? (1 << 8) : 0) 
     298+#define GPTU_CON_EDGE_SET(value)       SET_BITS(0, 7, 6, (value)) 
     299+#define GPTU_CON_INV_SET(value)                ((value) ? (1 << 5) : 0) 
     300+#define GPTU_CON_EXT_SET(value)                ((value) ? (1 << 4) : 0) 
     301+#define GPTU_CON_STP_SET(value)                ((value) ? (1 << 3) : 0) 
     302+#define GPTU_CON_CNT_SET(value)                ((value) ? (1 << 2) : 0) 
     303+#define GPTU_CON_DIR_SET(value)                ((value) ? (1 << 1) : 0) 
     304+ 
     305+#define GPTU_RUN_RL_SET(value)         ((value) ? (1 << 2) : 0) 
     306+#define GPTU_RUN_CEN_SET(value)                ((value) ? (1 << 1) : 0) 
     307+#define GPTU_RUN_SEN_SET(value)                ((value) ? (1 << 0) : 0) 
     308+ 
     309+#define GPTU_IRNEN_TC_SET(n, X, value) ((value) ? (1 << (((n) - 1) * 2 + (X))) : 0) 
     310+#define GPTU_IRNCR_TC_SET(n, X, value) ((value) ? (1 << (((n) - 1) * 2 + (X))) : 0) 
     311+ 
     312+#define TIMER_FLAG_MASK_SIZE(x)                (x & 0x0001) 
     313+#define TIMER_FLAG_MASK_TYPE(x)                (x & 0x0002) 
     314+#define TIMER_FLAG_MASK_STOP(x)                (x & 0x0004) 
     315+#define TIMER_FLAG_MASK_DIR(x)         (x & 0x0008) 
     316+#define TIMER_FLAG_NONE_EDGE           0x0000 
     317+#define TIMER_FLAG_MASK_EDGE(x)                (x & 0x0030) 
     318+#define TIMER_FLAG_REAL                        0x0000 
     319+#define TIMER_FLAG_INVERT              0x0040 
     320+#define TIMER_FLAG_MASK_INVERT(x)      (x & 0x0040) 
     321+#define TIMER_FLAG_MASK_TRIGGER(x)     (x & 0x0070) 
     322+#define TIMER_FLAG_MASK_SYNC(x)                (x & 0x0080) 
     323+#define TIMER_FLAG_CALLBACK_IN_HB      0x0200 
     324+#define TIMER_FLAG_MASK_HANDLE(x)      (x & 0x0300) 
     325+#define TIMER_FLAG_MASK_SRC(x)         (x & 0x1000) 
     326+ 
     327+struct timer_dev_timer { 
     328+       unsigned int f_irq_on; 
     329+       unsigned int irq; 
     330+       unsigned int flag; 
     331+       unsigned long arg1; 
     332+       unsigned long arg2; 
     333+}; 
     334+ 
     335+struct timer_dev { 
     336+       struct mutex gptu_mutex; 
     337+       unsigned int number_of_timers; 
     338+       unsigned int occupation; 
     339+       unsigned int f_gptu_on; 
     340+       struct timer_dev_timer timer[MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2]; 
     341+}; 
     342+ 
     343+unsigned int ltq_get_fpi_bus_clock(int fpi); 
     344+ 
     345+static long gptu_ioctl(struct file *, unsigned int, unsigned long); 
     346+static int gptu_open(struct inode *, struct file *); 
     347+static int gptu_release(struct inode *, struct file *); 
     348+ 
     349+static struct file_operations gptu_fops = { 
     350+       .owner = THIS_MODULE, 
     351+       .unlocked_ioctl = gptu_ioctl, 
     352+       .open = gptu_open, 
     353+       .release = gptu_release 
     354+}; 
     355+ 
     356+static struct miscdevice gptu_miscdev = { 
     357+       .minor = MISC_DYNAMIC_MINOR, 
     358+       .name = "gptu", 
     359+       .fops = &gptu_fops, 
     360+}; 
     361+ 
     362+static struct timer_dev timer_dev; 
     363+ 
     364+static irqreturn_t timer_irq_handler(int irq, void *p) 
     365+{ 
     366+       unsigned int timer; 
     367+       unsigned int flag; 
     368+       struct timer_dev_timer *dev_timer = (struct timer_dev_timer *)p; 
     369+ 
     370+       timer = irq - TIMER_INTERRUPT; 
     371+       if (timer < timer_dev.number_of_timers 
     372+               && dev_timer == &timer_dev.timer[timer]) { 
     373+               /*  Clear interrupt.    */ 
     374+               ltq_w32(1 << timer, LQ_GPTU_IRNCR); 
     375+ 
     376+               /*  Call user hanler or signal. */ 
     377+               flag = dev_timer->flag; 
     378+               if (!(timer & 0x01) 
     379+                       || TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) { 
     380+                       /* 16-bit timer or timer A of 32-bit timer  */ 
     381+                       switch (TIMER_FLAG_MASK_HANDLE(flag)) { 
     382+                       case TIMER_FLAG_CALLBACK_IN_IRQ: 
     383+                       case TIMER_FLAG_CALLBACK_IN_HB: 
     384+                               if (dev_timer->arg1) 
     385+                                       (*(timer_callback)dev_timer->arg1)(dev_timer->arg2); 
     386+                               break; 
     387+                       case TIMER_FLAG_SIGNAL: 
     388+                               send_sig((int)dev_timer->arg2, (struct task_struct *)dev_timer->arg1, 0); 
     389+                               break; 
     390+                       } 
     391+               } 
     392+       } 
     393+       return IRQ_HANDLED; 
     394+} 
     395+ 
     396+static inline void lq_enable_gptu(void) 
     397+{ 
     398+       ltq_pmu_enable(PMU_GPT); 
     399+ 
     400+       /*  Set divider as 1, disable write protection for SPEN, enable module. */ 
     401+       *LQ_GPTU_CLC = 
     402+               GPTU_CLC_SMC_SET(0x00) | 
     403+               GPTU_CLC_RMC_SET(0x01) | 
     404+               GPTU_CLC_FSOE_SET(0) | 
     405+               GPTU_CLC_SBWE_SET(1) | 
     406+               GPTU_CLC_EDIS_SET(0) | 
     407+               GPTU_CLC_SPEN_SET(0) | 
     408+               GPTU_CLC_DISR_SET(0); 
     409+} 
     410+ 
     411+static inline void lq_disable_gptu(void) 
     412+{ 
     413+       ltq_w32(0x00, LQ_GPTU_IRNEN); 
     414+       ltq_w32(0xfff, LQ_GPTU_IRNCR); 
     415+ 
     416+       /*  Set divider as 0, enable write protection for SPEN, disable module. */ 
     417+       *LQ_GPTU_CLC = 
     418+               GPTU_CLC_SMC_SET(0x00) | 
     419+               GPTU_CLC_RMC_SET(0x00) | 
     420+               GPTU_CLC_FSOE_SET(0) | 
     421+               GPTU_CLC_SBWE_SET(0) | 
     422+               GPTU_CLC_EDIS_SET(0) | 
     423+               GPTU_CLC_SPEN_SET(0) | 
     424+               GPTU_CLC_DISR_SET(1); 
     425+ 
     426+       ltq_pmu_disable(PMU_GPT); 
     427+} 
     428+ 
     429+int lq_request_timer(unsigned int timer, unsigned int flag, 
     430+       unsigned long value, unsigned long arg1, unsigned long arg2) 
     431+{ 
     432+       int ret = 0; 
     433+       unsigned int con_reg, irnen_reg; 
     434+       int n, X; 
     435+ 
     436+       if (timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     437+               return -EINVAL; 
     438+ 
     439+       printk(KERN_INFO "request_timer(%d, 0x%08X, %lu)...", 
     440+               timer, flag, value); 
     441+ 
     442+       if (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) 
     443+               value &= 0xFFFF; 
     444+       else 
     445+               timer &= ~0x01; 
     446+ 
     447+       mutex_lock(&timer_dev.gptu_mutex); 
     448+ 
     449+       /* 
     450+        *  Allocate timer. 
     451+        */ 
     452+       if (timer < FIRST_TIMER) { 
     453+               unsigned int mask; 
     454+               unsigned int shift; 
     455+               /* This takes care of TIMER1B which is the only choice for Voice TAPI system */ 
     456+               unsigned int offset = TIMER2A; 
     457+ 
     458+               /* 
     459+                *  Pick up a free timer. 
     460+                */ 
     461+               if (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT) { 
     462+                       mask = 1 << offset; 
     463+                       shift = 1; 
     464+               } else { 
     465+                       mask = 3 << offset; 
     466+                       shift = 2; 
     467+               } 
     468+               for (timer = offset; 
     469+                    timer < offset + timer_dev.number_of_timers; 
     470+                    timer += shift, mask <<= shift) 
     471+                       if (!(timer_dev.occupation & mask)) { 
     472+                               timer_dev.occupation |= mask; 
     473+                               break; 
     474+                       } 
     475+               if (timer >= offset + timer_dev.number_of_timers) { 
     476+                       printk("failed![%d]\n", __LINE__); 
     477+                       mutex_unlock(&timer_dev.gptu_mutex); 
     478+                       return -EINVAL; 
     479+               } else 
     480+                       ret = timer; 
     481+       } else { 
     482+               register unsigned int mask; 
     483+ 
     484+               /* 
     485+                *  Check if the requested timer is free. 
     486+                */ 
     487+               mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     488+               if ((timer_dev.occupation & mask)) { 
     489+                       printk("failed![%d] mask %#x, timer_dev.occupation %#x\n", 
     490+                               __LINE__, mask, timer_dev.occupation); 
     491+                       mutex_unlock(&timer_dev.gptu_mutex); 
     492+                       return -EBUSY; 
     493+               } else { 
     494+                       timer_dev.occupation |= mask; 
     495+                       ret = 0; 
     496+               } 
     497+       } 
     498+ 
     499+       /* 
     500+        *  Prepare control register value. 
     501+        */ 
     502+       switch (TIMER_FLAG_MASK_EDGE(flag)) { 
     503+       default: 
     504+       case TIMER_FLAG_NONE_EDGE: 
     505+               con_reg = GPTU_CON_EDGE_SET(0x00); 
     506+               break; 
     507+       case TIMER_FLAG_RISE_EDGE: 
     508+               con_reg = GPTU_CON_EDGE_SET(0x01); 
     509+               break; 
     510+       case TIMER_FLAG_FALL_EDGE: 
     511+               con_reg = GPTU_CON_EDGE_SET(0x02); 
     512+               break; 
     513+       case TIMER_FLAG_ANY_EDGE: 
     514+               con_reg = GPTU_CON_EDGE_SET(0x03); 
     515+               break; 
     516+       } 
     517+       if (TIMER_FLAG_MASK_TYPE(flag) == TIMER_FLAG_TIMER) 
     518+               con_reg |= 
     519+                       TIMER_FLAG_MASK_SRC(flag) == 
     520+                       TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EXT_SET(1) : 
     521+                       GPTU_CON_SRC_EXT_SET(0); 
     522+       else 
     523+               con_reg |= 
     524+                       TIMER_FLAG_MASK_SRC(flag) == 
     525+                       TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EG_SET(1) : 
     526+                       GPTU_CON_SRC_EG_SET(0); 
     527+       con_reg |= 
     528+               TIMER_FLAG_MASK_SYNC(flag) == 
     529+               TIMER_FLAG_UNSYNC ? GPTU_CON_SYNC_SET(0) : 
     530+               GPTU_CON_SYNC_SET(1); 
     531+       con_reg |= 
     532+               TIMER_FLAG_MASK_INVERT(flag) == 
     533+               TIMER_FLAG_REAL ? GPTU_CON_INV_SET(0) : GPTU_CON_INV_SET(1); 
     534+       con_reg |= 
     535+               TIMER_FLAG_MASK_SIZE(flag) == 
     536+               TIMER_FLAG_16BIT ? GPTU_CON_EXT_SET(0) : 
     537+               GPTU_CON_EXT_SET(1); 
     538+       con_reg |= 
     539+               TIMER_FLAG_MASK_STOP(flag) == 
     540+               TIMER_FLAG_ONCE ? GPTU_CON_STP_SET(1) : GPTU_CON_STP_SET(0); 
     541+       con_reg |= 
     542+               TIMER_FLAG_MASK_TYPE(flag) == 
     543+               TIMER_FLAG_TIMER ? GPTU_CON_CNT_SET(0) : 
     544+               GPTU_CON_CNT_SET(1); 
     545+       con_reg |= 
     546+               TIMER_FLAG_MASK_DIR(flag) == 
     547+               TIMER_FLAG_UP ? GPTU_CON_DIR_SET(1) : GPTU_CON_DIR_SET(0); 
     548+ 
     549+       /* 
     550+        *  Fill up running data. 
     551+        */ 
     552+       timer_dev.timer[timer - FIRST_TIMER].flag = flag; 
     553+       timer_dev.timer[timer - FIRST_TIMER].arg1 = arg1; 
     554+       timer_dev.timer[timer - FIRST_TIMER].arg2 = arg2; 
     555+       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
     556+               timer_dev.timer[timer - FIRST_TIMER + 1].flag = flag; 
     557+ 
     558+       /* 
     559+        *  Enable GPTU module. 
     560+        */ 
     561+       if (!timer_dev.f_gptu_on) { 
     562+               lq_enable_gptu(); 
     563+               timer_dev.f_gptu_on = 1; 
     564+       } 
     565+ 
     566+       /* 
     567+        *  Enable IRQ. 
     568+        */ 
     569+       if (TIMER_FLAG_MASK_HANDLE(flag) != TIMER_FLAG_NO_HANDLE) { 
     570+               if (TIMER_FLAG_MASK_HANDLE(flag) == TIMER_FLAG_SIGNAL) 
     571+                       timer_dev.timer[timer - FIRST_TIMER].arg1 = 
     572+                               (unsigned long) find_task_by_vpid((int) arg1); 
     573+ 
     574+               irnen_reg = 1 << (timer - FIRST_TIMER); 
     575+ 
     576+               if (TIMER_FLAG_MASK_HANDLE(flag) == TIMER_FLAG_SIGNAL 
     577+                   || (TIMER_FLAG_MASK_HANDLE(flag) == 
     578+                       TIMER_FLAG_CALLBACK_IN_IRQ 
     579+                       && timer_dev.timer[timer - FIRST_TIMER].arg1)) { 
     580+                       enable_irq(timer_dev.timer[timer - FIRST_TIMER].irq); 
     581+                       timer_dev.timer[timer - FIRST_TIMER].f_irq_on = 1; 
     582+               } 
     583+       } else 
     584+               irnen_reg = 0; 
     585+ 
     586+       /* 
     587+        *  Write config register, reload value and enable interrupt. 
     588+        */ 
     589+       n = timer >> 1; 
     590+       X = timer & 0x01; 
     591+       *LQ_GPTU_CON(n, X) = con_reg; 
     592+       *LQ_GPTU_RELOAD(n, X) = value; 
     593+       /* printk("reload value = %d\n", (u32)value); */ 
     594+       *LQ_GPTU_IRNEN |= irnen_reg; 
     595+ 
     596+       mutex_unlock(&timer_dev.gptu_mutex); 
     597+       printk("successful!\n"); 
     598+       return ret; 
     599+} 
     600+EXPORT_SYMBOL(lq_request_timer); 
     601+ 
     602+int lq_free_timer(unsigned int timer) 
     603+{ 
     604+       unsigned int flag; 
     605+       unsigned int mask; 
     606+       int n, X; 
     607+ 
     608+       if (!timer_dev.f_gptu_on) 
     609+               return -EINVAL; 
     610+ 
     611+       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     612+               return -EINVAL; 
     613+ 
     614+       mutex_lock(&timer_dev.gptu_mutex); 
     615+ 
     616+       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
     617+       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
     618+               timer &= ~0x01; 
     619+ 
     620+       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     621+       if (((timer_dev.occupation & mask) ^ mask)) { 
     622+               mutex_unlock(&timer_dev.gptu_mutex); 
     623+               return -EINVAL; 
     624+       } 
     625+ 
     626+       n = timer >> 1; 
     627+       X = timer & 0x01; 
     628+ 
     629+       if (GPTU_CON_EN(n, X)) 
     630+               *LQ_GPTU_RUN(n, X) = GPTU_RUN_CEN_SET(1); 
     631+ 
     632+       *LQ_GPTU_IRNEN &= ~GPTU_IRNEN_TC_SET(n, X, 1); 
     633+       *LQ_GPTU_IRNCR |= GPTU_IRNCR_TC_SET(n, X, 1); 
     634+ 
     635+       if (timer_dev.timer[timer - FIRST_TIMER].f_irq_on) { 
     636+               disable_irq(timer_dev.timer[timer - FIRST_TIMER].irq); 
     637+               timer_dev.timer[timer - FIRST_TIMER].f_irq_on = 0; 
     638+       } 
     639+ 
     640+       timer_dev.occupation &= ~mask; 
     641+       if (!timer_dev.occupation && timer_dev.f_gptu_on) { 
     642+               lq_disable_gptu(); 
     643+               timer_dev.f_gptu_on = 0; 
     644+       } 
     645+ 
     646+       mutex_unlock(&timer_dev.gptu_mutex); 
     647+ 
     648+       return 0; 
     649+} 
     650+EXPORT_SYMBOL(lq_free_timer); 
     651+ 
     652+int lq_start_timer(unsigned int timer, int is_resume) 
     653+{ 
     654+       unsigned int flag; 
     655+       unsigned int mask; 
     656+       int n, X; 
     657+ 
     658+       if (!timer_dev.f_gptu_on) 
     659+               return -EINVAL; 
     660+ 
     661+       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     662+               return -EINVAL; 
     663+ 
     664+       mutex_lock(&timer_dev.gptu_mutex); 
     665+ 
     666+       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
     667+       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
     668+               timer &= ~0x01; 
     669+ 
     670+       mask = (TIMER_FLAG_MASK_SIZE(flag) == 
     671+       TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     672+       if (((timer_dev.occupation & mask) ^ mask)) { 
     673+               mutex_unlock(&timer_dev.gptu_mutex); 
     674+               return -EINVAL; 
     675+       } 
     676+ 
     677+       n = timer >> 1; 
     678+       X = timer & 0x01; 
     679+ 
     680+       *LQ_GPTU_RUN(n, X) = GPTU_RUN_RL_SET(!is_resume) | GPTU_RUN_SEN_SET(1); 
     681+ 
     682+       mutex_unlock(&timer_dev.gptu_mutex); 
     683+ 
     684+       return 0; 
     685+} 
     686+EXPORT_SYMBOL(lq_start_timer); 
     687+ 
     688+int lq_stop_timer(unsigned int timer) 
     689+{ 
     690+       unsigned int flag; 
     691+       unsigned int mask; 
     692+       int n, X; 
     693+ 
     694+       if (!timer_dev.f_gptu_on) 
     695+               return -EINVAL; 
     696+ 
     697+       if (timer < FIRST_TIMER 
     698+           || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     699+               return -EINVAL; 
     700+ 
     701+       mutex_lock(&timer_dev.gptu_mutex); 
     702+ 
     703+       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
     704+       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
     705+               timer &= ~0x01; 
     706+ 
     707+       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     708+       if (((timer_dev.occupation & mask) ^ mask)) { 
     709+               mutex_unlock(&timer_dev.gptu_mutex); 
     710+               return -EINVAL; 
     711+       } 
     712+ 
     713+       n = timer >> 1; 
     714+       X = timer & 0x01; 
     715+ 
     716+       *LQ_GPTU_RUN(n, X) = GPTU_RUN_CEN_SET(1); 
     717+ 
     718+       mutex_unlock(&timer_dev.gptu_mutex); 
     719+ 
     720+       return 0; 
     721+} 
     722+EXPORT_SYMBOL(lq_stop_timer); 
     723+ 
     724+int lq_reset_counter_flags(u32 timer, u32 flags) 
     725+{ 
     726+       unsigned int oflag; 
     727+       unsigned int mask, con_reg; 
     728+       int n, X; 
     729+ 
     730+       if (!timer_dev.f_gptu_on) 
     731+               return -EINVAL; 
     732+ 
     733+       if (timer < FIRST_TIMER || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     734+               return -EINVAL; 
     735+ 
     736+       mutex_lock(&timer_dev.gptu_mutex); 
     737+ 
     738+       oflag = timer_dev.timer[timer - FIRST_TIMER].flag; 
     739+       if (TIMER_FLAG_MASK_SIZE(oflag) != TIMER_FLAG_16BIT) 
     740+               timer &= ~0x01; 
     741+ 
     742+       mask = (TIMER_FLAG_MASK_SIZE(oflag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     743+       if (((timer_dev.occupation & mask) ^ mask)) { 
     744+               mutex_unlock(&timer_dev.gptu_mutex); 
     745+               return -EINVAL; 
     746+       } 
     747+ 
     748+       switch (TIMER_FLAG_MASK_EDGE(flags)) { 
     749+       default: 
     750+       case TIMER_FLAG_NONE_EDGE: 
     751+               con_reg = GPTU_CON_EDGE_SET(0x00); 
     752+               break; 
     753+       case TIMER_FLAG_RISE_EDGE: 
     754+               con_reg = GPTU_CON_EDGE_SET(0x01); 
     755+               break; 
     756+       case TIMER_FLAG_FALL_EDGE: 
     757+               con_reg = GPTU_CON_EDGE_SET(0x02); 
     758+               break; 
     759+       case TIMER_FLAG_ANY_EDGE: 
     760+               con_reg = GPTU_CON_EDGE_SET(0x03); 
     761+               break; 
     762+       } 
     763+       if (TIMER_FLAG_MASK_TYPE(flags) == TIMER_FLAG_TIMER) 
     764+               con_reg |= TIMER_FLAG_MASK_SRC(flags) == TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EXT_SET(1) : GPTU_CON_SRC_EXT_SET(0); 
     765+       else 
     766+               con_reg |= TIMER_FLAG_MASK_SRC(flags) == TIMER_FLAG_EXT_SRC ? GPTU_CON_SRC_EG_SET(1) : GPTU_CON_SRC_EG_SET(0); 
     767+       con_reg |= TIMER_FLAG_MASK_SYNC(flags) == TIMER_FLAG_UNSYNC ? GPTU_CON_SYNC_SET(0) : GPTU_CON_SYNC_SET(1); 
     768+       con_reg |= TIMER_FLAG_MASK_INVERT(flags) == TIMER_FLAG_REAL ? GPTU_CON_INV_SET(0) : GPTU_CON_INV_SET(1); 
     769+       con_reg |= TIMER_FLAG_MASK_SIZE(flags) == TIMER_FLAG_16BIT ? GPTU_CON_EXT_SET(0) : GPTU_CON_EXT_SET(1); 
     770+       con_reg |= TIMER_FLAG_MASK_STOP(flags) == TIMER_FLAG_ONCE ? GPTU_CON_STP_SET(1) : GPTU_CON_STP_SET(0); 
     771+       con_reg |= TIMER_FLAG_MASK_TYPE(flags) == TIMER_FLAG_TIMER ? GPTU_CON_CNT_SET(0) : GPTU_CON_CNT_SET(1); 
     772+       con_reg |= TIMER_FLAG_MASK_DIR(flags) == TIMER_FLAG_UP ? GPTU_CON_DIR_SET(1) : GPTU_CON_DIR_SET(0); 
     773+ 
     774+       timer_dev.timer[timer - FIRST_TIMER].flag = flags; 
     775+       if (TIMER_FLAG_MASK_SIZE(flags) != TIMER_FLAG_16BIT) 
     776+               timer_dev.timer[timer - FIRST_TIMER + 1].flag = flags; 
     777+ 
     778+       n = timer >> 1; 
     779+       X = timer & 0x01; 
     780+ 
     781+       *LQ_GPTU_CON(n, X) = con_reg; 
     782+       smp_wmb(); 
     783+       printk(KERN_INFO "[%s]: counter%d oflags %#x, nflags %#x, GPTU_CON %#x\n", __func__, timer, oflag, flags, *LQ_GPTU_CON(n, X)); 
     784+       mutex_unlock(&timer_dev.gptu_mutex); 
     785+       return 0; 
     786+} 
     787+EXPORT_SYMBOL(lq_reset_counter_flags); 
     788+ 
     789+int lq_get_count_value(unsigned int timer, unsigned long *value) 
     790+{ 
     791+       unsigned int flag; 
     792+       unsigned int mask; 
     793+       int n, X; 
     794+ 
     795+       if (!timer_dev.f_gptu_on) 
     796+               return -EINVAL; 
     797+ 
     798+       if (timer < FIRST_TIMER 
     799+           || timer >= FIRST_TIMER + timer_dev.number_of_timers) 
     800+               return -EINVAL; 
     801+ 
     802+       mutex_lock(&timer_dev.gptu_mutex); 
     803+ 
     804+       flag = timer_dev.timer[timer - FIRST_TIMER].flag; 
     805+       if (TIMER_FLAG_MASK_SIZE(flag) != TIMER_FLAG_16BIT) 
     806+               timer &= ~0x01; 
     807+ 
     808+       mask = (TIMER_FLAG_MASK_SIZE(flag) == TIMER_FLAG_16BIT ? 1 : 3) << timer; 
     809+       if (((timer_dev.occupation & mask) ^ mask)) { 
     810+               mutex_unlock(&timer_dev.gptu_mutex); 
     811+               return -EINVAL; 
     812+       } 
     813+ 
     814+       n = timer >> 1; 
     815+       X = timer & 0x01; 
     816+ 
     817+       *value = *LQ_GPTU_COUNT(n, X); 
     818+ 
     819+       mutex_unlock(&timer_dev.gptu_mutex); 
     820+ 
     821+       return 0; 
     822+} 
     823+EXPORT_SYMBOL(lq_get_count_value); 
     824+ 
     825+u32 lq_cal_divider(unsigned long freq) 
     826+{ 
     827+       u64 module_freq, fpi = ltq_get_fpi_bus_clock(2); 
     828+       u32 clock_divider = 1; 
     829+       module_freq = fpi * 1000; 
     830+       do_div(module_freq, clock_divider * freq); 
     831+       return module_freq; 
     832+} 
     833+EXPORT_SYMBOL(lq_cal_divider); 
     834+ 
     835+int lq_set_timer(unsigned int timer, unsigned int freq, int is_cyclic, 
     836+       int is_ext_src, unsigned int handle_flag, unsigned long arg1, 
     837+       unsigned long arg2) 
     838+{ 
     839+       unsigned long divider; 
     840+       unsigned int flag; 
     841+ 
     842+       divider = lq_cal_divider(freq); 
     843+       if (divider == 0) 
     844+               return -EINVAL; 
     845+       flag = ((divider & ~0xFFFF) ? TIMER_FLAG_32BIT : TIMER_FLAG_16BIT) 
     846+               | (is_cyclic ? TIMER_FLAG_CYCLIC : TIMER_FLAG_ONCE) 
     847+               | (is_ext_src ? TIMER_FLAG_EXT_SRC : TIMER_FLAG_INT_SRC) 
     848+               | TIMER_FLAG_TIMER | TIMER_FLAG_DOWN 
     849+               | TIMER_FLAG_MASK_HANDLE(handle_flag); 
     850+ 
     851+       printk(KERN_INFO "lq_set_timer(%d, %d), divider = %lu\n", 
     852+               timer, freq, divider); 
     853+       return lq_request_timer(timer, flag, divider, arg1, arg2); 
     854+} 
     855+EXPORT_SYMBOL(lq_set_timer); 
     856+ 
     857+int lq_set_counter(unsigned int timer, unsigned int flag, u32 reload, 
     858+       unsigned long arg1, unsigned long arg2) 
     859+{ 
     860+       printk(KERN_INFO "lq_set_counter(%d, %#x, %d)\n", timer, flag, reload); 
     861+       return lq_request_timer(timer, flag, reload, arg1, arg2); 
     862+} 
     863+EXPORT_SYMBOL(lq_set_counter); 
     864+ 
     865+static long gptu_ioctl(struct file *file, unsigned int cmd, 
     866+       unsigned long arg) 
     867+{ 
     868+       int ret; 
     869+       struct gptu_ioctl_param param; 
     870+ 
     871+       if (!access_ok(VERIFY_READ, arg, sizeof(struct gptu_ioctl_param))) 
     872+               return -EFAULT; 
     873+       copy_from_user(&param, (void *) arg, sizeof(param)); 
     874+ 
     875+       if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER 
     876+              || GPTU_SET_COUNTER) && param.timer < 2) 
     877+            || cmd == GPTU_GET_COUNT_VALUE || cmd == GPTU_CALCULATE_DIVIDER) 
     878+           && !access_ok(VERIFY_WRITE, arg, 
     879+                          sizeof(struct gptu_ioctl_param))) 
     880+               return -EFAULT; 
     881+ 
     882+       switch (cmd) { 
     883+       case GPTU_REQUEST_TIMER: 
     884+               ret = lq_request_timer(param.timer, param.flag, param.value, 
     885+                                    (unsigned long) param.pid, 
     886+                                    (unsigned long) param.sig); 
     887+               if (ret > 0) { 
     888+                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
     889+                                     timer, &ret, sizeof(&ret)); 
     890+                       ret = 0; 
     891+               } 
     892+               break; 
     893+       case GPTU_FREE_TIMER: 
     894+               ret = lq_free_timer(param.timer); 
     895+               break; 
     896+       case GPTU_START_TIMER: 
     897+               ret = lq_start_timer(param.timer, param.flag); 
     898+               break; 
     899+       case GPTU_STOP_TIMER: 
     900+               ret = lq_stop_timer(param.timer); 
     901+               break; 
     902+       case GPTU_GET_COUNT_VALUE: 
     903+               ret = lq_get_count_value(param.timer, &param.value); 
     904+               if (!ret) 
     905+                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
     906+                                     value, &param.value, 
     907+                                     sizeof(param.value)); 
     908+               break; 
     909+       case GPTU_CALCULATE_DIVIDER: 
     910+               param.value = lq_cal_divider(param.value); 
     911+               if (param.value == 0) 
     912+                       ret = -EINVAL; 
     913+               else { 
     914+                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
     915+                                     value, &param.value, 
     916+                                     sizeof(param.value)); 
     917+                       ret = 0; 
     918+               } 
     919+               break; 
     920+       case GPTU_SET_TIMER: 
     921+               ret = lq_set_timer(param.timer, param.value, 
     922+                                TIMER_FLAG_MASK_STOP(param.flag) != 
     923+                                TIMER_FLAG_ONCE ? 1 : 0, 
     924+                                TIMER_FLAG_MASK_SRC(param.flag) == 
     925+                                TIMER_FLAG_EXT_SRC ? 1 : 0, 
     926+                                TIMER_FLAG_MASK_HANDLE(param.flag) == 
     927+                                TIMER_FLAG_SIGNAL ? TIMER_FLAG_SIGNAL : 
     928+                                TIMER_FLAG_NO_HANDLE, 
     929+                                (unsigned long) param.pid, 
     930+                                (unsigned long) param.sig); 
     931+               if (ret > 0) { 
     932+                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
     933+                                     timer, &ret, sizeof(&ret)); 
     934+                       ret = 0; 
     935+               } 
     936+               break; 
     937+       case GPTU_SET_COUNTER: 
     938+               lq_set_counter(param.timer, param.flag, param.value, 0, 0); 
     939+               if (ret > 0) { 
     940+                       copy_to_user(&((struct gptu_ioctl_param *) arg)-> 
     941+                                     timer, &ret, sizeof(&ret)); 
     942+                       ret = 0; 
     943+               } 
     944+               break; 
     945+       default: 
     946+               ret = -ENOTTY; 
     947+       } 
     948+ 
     949+       return ret; 
     950+} 
     951+ 
     952+static int gptu_open(struct inode *inode, struct file *file) 
     953+{ 
     954+       return 0; 
     955+} 
     956+ 
     957+static int gptu_release(struct inode *inode, struct file *file) 
     958+{ 
     959+       return 0; 
     960+} 
     961+ 
     962+int __init lq_gptu_init(void) 
     963+{ 
     964+       int ret; 
     965+       unsigned int i; 
     966+ 
     967+       ltq_w32(0, LQ_GPTU_IRNEN); 
     968+       ltq_w32(0xfff, LQ_GPTU_IRNCR); 
     969+ 
     970+       memset(&timer_dev, 0, sizeof(timer_dev)); 
     971+       mutex_init(&timer_dev.gptu_mutex); 
     972+ 
     973+       lq_enable_gptu(); 
     974+       timer_dev.number_of_timers = GPTU_ID_CFG * 2; 
     975+       lq_disable_gptu(); 
     976+       if (timer_dev.number_of_timers > MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2) 
     977+               timer_dev.number_of_timers = MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2; 
     978+       printk(KERN_INFO "gptu: totally %d 16-bit timers/counters\n", timer_dev.number_of_timers); 
     979+ 
     980+       ret = misc_register(&gptu_miscdev); 
     981+       if (ret) { 
     982+               printk(KERN_ERR "gptu: can't misc_register, get error %d\n", -ret); 
     983+               return ret; 
     984+       } else { 
     985+               printk(KERN_INFO "gptu: misc_register on minor %d\n", gptu_miscdev.minor); 
     986+       } 
     987+ 
     988+       for (i = 0; i < timer_dev.number_of_timers; i++) { 
     989+               ret = request_irq(TIMER_INTERRUPT + i, timer_irq_handler, IRQF_TIMER, gptu_miscdev.name, &timer_dev.timer[i]); 
     990+               if (ret) { 
     991+                       for (; i >= 0; i--) 
     992+                               free_irq(TIMER_INTERRUPT + i, &timer_dev.timer[i]); 
     993+                       misc_deregister(&gptu_miscdev); 
     994+                       printk(KERN_ERR "gptu: failed in requesting irq (%d), get error %d\n", i, -ret); 
     995+                       return ret; 
     996+               } else { 
     997+                       timer_dev.timer[i].irq = TIMER_INTERRUPT + i; 
     998+                       disable_irq(timer_dev.timer[i].irq); 
     999+                       printk(KERN_INFO "gptu: succeeded to request irq %d\n", timer_dev.timer[i].irq); 
     1000+               } 
     1001+       } 
     1002+ 
     1003+       return 0; 
     1004+} 
     1005+ 
     1006+void __exit lq_gptu_exit(void) 
     1007+{ 
     1008+       unsigned int i; 
     1009+ 
     1010+       for (i = 0; i < timer_dev.number_of_timers; i++) { 
     1011+               if (timer_dev.timer[i].f_irq_on) 
     1012+                       disable_irq(timer_dev.timer[i].irq); 
     1013+               free_irq(timer_dev.timer[i].irq, &timer_dev.timer[i]); 
     1014+       } 
     1015+       lq_disable_gptu(); 
     1016+       misc_deregister(&gptu_miscdev); 
     1017+} 
     1018+ 
     1019+module_init(lq_gptu_init); 
     1020+module_exit(lq_gptu_exit); 
     1021--  
     10221.7.5.4 
     1023 
  • trunk/target/linux/lantiq/patches-3.0/0018-MIPS-lantiq-adds-dwc_otg.patch

    r28404 r28405  
     1From ffd7924fcc69ff146d62f131d72ef18575bf0227 Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Fri, 30 Sep 2011 14:37:36 +0200 
     4Subject: [PATCH 18/24] MIPS: lantiq: adds dwc_otg 
     5 
     6--- 
     7 drivers/usb/Kconfig                     |    2 + 
     8 drivers/usb/Makefile                    |    2 + 
     9 drivers/usb/core/hub.c                  |    4 +- 
     10 drivers/usb/dwc_otg/Kconfig             |   37 + 
     11 drivers/usb/dwc_otg/Makefile            |   39 + 
     12 drivers/usb/dwc_otg/dwc_otg_attr.c      |  802 ++++++++ 
     13 drivers/usb/dwc_otg/dwc_otg_attr.h      |   67 + 
     14 drivers/usb/dwc_otg/dwc_otg_cil.c       | 3025 +++++++++++++++++++++++++++++++ 
     15 drivers/usb/dwc_otg/dwc_otg_cil.h       |  911 ++++++++++ 
     16 drivers/usb/dwc_otg/dwc_otg_cil_ifx.h   |   58 + 
     17 drivers/usb/dwc_otg/dwc_otg_cil_intr.c  |  708 ++++++++ 
     18 drivers/usb/dwc_otg/dwc_otg_driver.c    | 1274 +++++++++++++ 
     19 drivers/usb/dwc_otg/dwc_otg_driver.h    |   84 + 
     20 drivers/usb/dwc_otg/dwc_otg_hcd.c       | 2870 +++++++++++++++++++++++++++++ 
     21 drivers/usb/dwc_otg/dwc_otg_hcd.h       |  676 +++++++ 
     22 drivers/usb/dwc_otg/dwc_otg_hcd_intr.c  | 1841 +++++++++++++++++++ 
     23 drivers/usb/dwc_otg/dwc_otg_hcd_queue.c |  794 ++++++++ 
     24 drivers/usb/dwc_otg/dwc_otg_ifx.c       |  100 + 
     25 drivers/usb/dwc_otg/dwc_otg_ifx.h       |   85 + 
     26 drivers/usb/dwc_otg/dwc_otg_plat.h      |  269 +++ 
     27 drivers/usb/dwc_otg/dwc_otg_regs.h      | 1797 ++++++++++++++++++ 
     28 21 files changed, 15443 insertions(+), 2 deletions(-) 
     29 create mode 100644 drivers/usb/dwc_otg/Kconfig 
     30 create mode 100644 drivers/usb/dwc_otg/Makefile 
     31 create mode 100644 drivers/usb/dwc_otg/dwc_otg_attr.c 
     32 create mode 100644 drivers/usb/dwc_otg/dwc_otg_attr.h 
     33 create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil.c 
     34 create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil.h 
     35 create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil_ifx.h 
     36 create mode 100644 drivers/usb/dwc_otg/dwc_otg_cil_intr.c 
     37 create mode 100644 drivers/usb/dwc_otg/dwc_otg_driver.c 
     38 create mode 100644 drivers/usb/dwc_otg/dwc_otg_driver.h 
     39 create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd.c 
     40 create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd.h 
     41 create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd_intr.c 
     42 create mode 100644 drivers/usb/dwc_otg/dwc_otg_hcd_queue.c 
     43 create mode 100644 drivers/usb/dwc_otg/dwc_otg_ifx.c 
     44 create mode 100644 drivers/usb/dwc_otg/dwc_otg_ifx.h 
     45 create mode 100644 drivers/usb/dwc_otg/dwc_otg_plat.h 
     46 create mode 100644 drivers/usb/dwc_otg/dwc_otg_regs.h 
     47 
     48diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig 
     49index 48f1781..b48c1bd 100644 
    150--- a/drivers/usb/Kconfig 
    251+++ b/drivers/usb/Kconfig 
     
    1059  
    1160 source "drivers/usb/renesas_usbhs/Kconfig" 
     61diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile 
     62index 30ddf8d..ba3b993 100644 
    1263--- a/drivers/usb/Makefile 
    1364+++ b/drivers/usb/Makefile 
     
    2172 obj-$(CONFIG_USB_PRINTER)      += class/ 
    2273 obj-$(CONFIG_USB_WDM)          += class/ 
     74diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c 
     75index a428aa0..115ae9a 100644 
     76--- a/drivers/usb/core/hub.c 
     77+++ b/drivers/usb/core/hub.c 
     78@@ -2885,11 +2885,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, 
     79                udev->ttport = hdev->ttport; 
     80        } else if (udev->speed != USB_SPEED_HIGH 
     81                        && hdev->speed == USB_SPEED_HIGH) { 
     82-               if (!hub->tt.hub) { 
     83+/*             if (!hub->tt.hub) { 
     84                        dev_err(&udev->dev, "parent hub has no TT\n"); 
     85                        retval = -EINVAL; 
     86                        goto fail; 
     87-               } 
     88+               }*/ 
     89                udev->tt = &hub->tt; 
     90                udev->ttport = port1; 
     91        } 
     92diff --git a/drivers/usb/dwc_otg/Kconfig b/drivers/usb/dwc_otg/Kconfig 
     93new file mode 100644 
     94index 0000000..e018490 
    2395--- /dev/null 
    2496+++ b/drivers/usb/dwc_otg/Kconfig 
     
    61133+        bool "Enable debug mode" 
    62134+        depends on DWC_OTG 
     135diff --git a/drivers/usb/dwc_otg/Makefile b/drivers/usb/dwc_otg/Makefile 
     136new file mode 100644 
     137index 0000000..d4d2355 
    63138--- /dev/null 
    64139+++ b/drivers/usb/dwc_otg/Makefile 
     
    103178+#obj-$(CONFIG_DWC_OTG_IFX)     := dwc_otg_ifx.o 
    104179+#dwc_otg_ifx-objs              := dwc_otg_ifx.o 
     180diff --git a/drivers/usb/dwc_otg/dwc_otg_attr.c b/drivers/usb/dwc_otg/dwc_otg_attr.c 
     181new file mode 100644 
     182index 0000000..4675a5c 
    105183--- /dev/null 
    106184+++ b/drivers/usb/dwc_otg/dwc_otg_attr.c 
     
    908986+       device_remove_file(_dev, &dev_attr_wr_reg_test); 
    909987+} 
     988diff --git a/drivers/usb/dwc_otg/dwc_otg_attr.h b/drivers/usb/dwc_otg/dwc_otg_attr.h 
     989new file mode 100644 
     990index 0000000..4bbf7df 
    910991--- /dev/null 
    911992+++ b/drivers/usb/dwc_otg/dwc_otg_attr.h 
     
    9781059+ 
    9791060+#endif 
     1061diff --git a/drivers/usb/dwc_otg/dwc_otg_cil.c b/drivers/usb/dwc_otg/dwc_otg_cil.c 
     1062new file mode 100644 
     1063index 0000000..42c69eb 
    9801064--- /dev/null 
    9811065+++ b/drivers/usb/dwc_otg/dwc_otg_cil.c 
     
    40064090+} 
    40074091+ 
     4092diff --git a/drivers/usb/dwc_otg/dwc_otg_cil.h b/drivers/usb/dwc_otg/dwc_otg_cil.h 
     4093new file mode 100644 
     4094index 0000000..bbb9516 
    40084095--- /dev/null 
    40094096+++ b/drivers/usb/dwc_otg/dwc_otg_cil.h 
     
    49205007+ 
    49215008+#endif 
     5009diff --git a/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h b/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h 
     5010new file mode 100644 
     5011index 0000000..b0298ec 
    49225012--- /dev/null 
    49235013+++ b/drivers/usb/dwc_otg/dwc_otg_cil_ifx.h 
     
    49815071+#endif // __DWC_OTG_CIL_IFX_H__ 
    49825072+ 
     5073diff --git a/drivers/usb/dwc_otg/dwc_otg_cil_intr.c b/drivers/usb/dwc_otg/dwc_otg_cil_intr.c 
     5074new file mode 100644 
     5075index 0000000..d469ab4 
    49835076--- /dev/null 
    49845077+++ b/drivers/usb/dwc_otg/dwc_otg_cil_intr.c 
     
    56925785+        return retval; 
    56935786+} 
     5787diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.c b/drivers/usb/dwc_otg/dwc_otg_driver.c 
     5788new file mode 100644 
     5789index 0000000..1b0daab 
    56945790--- /dev/null 
    56955791+++ b/drivers/usb/dwc_otg/dwc_otg_driver.c 
     
    69697065+ 
    69707066+*/ 
     7067diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.h b/drivers/usb/dwc_otg/dwc_otg_driver.h 
     7068new file mode 100644 
     7069index 0000000..7e6940d 
    69717070--- /dev/null 
    69727071+++ b/drivers/usb/dwc_otg/dwc_otg_driver.h 
     
    70567155+ 
    70577156+#endif 
     7157diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.c b/drivers/usb/dwc_otg/dwc_otg_hcd.c 
     7158new file mode 100644 
     7159index 0000000..ad6bc72 
    70587160--- /dev/null 
    70597161+++ b/drivers/usb/dwc_otg/dwc_otg_hcd.c 
     
    992910031+} 
    993010032+#endif /* DWC_DEVICE_ONLY */ 
     10033diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.h b/drivers/usb/dwc_otg/dwc_otg_hcd.h 
     10034new file mode 100644 
     10035index 0000000..8a20dff 
    993110036--- /dev/null 
    993210037+++ b/drivers/usb/dwc_otg/dwc_otg_hcd.h 
     
    1060810713+#endif // __DWC_HCD_H__ 
    1060910714+#endif /* DWC_DEVICE_ONLY */ 
     10715diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c b/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c 
     10716new file mode 100644 
     10717index 0000000..834b5e0 
    1061010718--- /dev/null 
    1061110719+++ b/drivers/usb/dwc_otg/dwc_otg_hcd_intr.c 
     
    1245212560+ 
    1245312561+#endif /* DWC_DEVICE_ONLY */ 
     12562diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c 
     12563new file mode 100644 
     12564index 0000000..fcb5ce6 
    1245412565--- /dev/null 
    1245512566+++ b/drivers/usb/dwc_otg/dwc_otg_hcd_queue.c 
     
    1324913360+ 
    1325013361+#endif /* DWC_DEVICE_ONLY */ 
     13362diff --git a/drivers/usb/dwc_otg/dwc_otg_ifx.c b/drivers/usb/dwc_otg/dwc_otg_ifx.c 
     13363new file mode 100644 
     13364index 0000000..0a4c209 
    1325113365--- /dev/null 
    1325213366+++ b/drivers/usb/dwc_otg/dwc_otg_ifx.c 
     
    1335213466+{ 
    1335313467+} 
     13468diff --git a/drivers/usb/dwc_otg/dwc_otg_ifx.h b/drivers/usb/dwc_otg/dwc_otg_ifx.h 
     13469new file mode 100644 
     13470index 0000000..402d7a6 
    1335413471--- /dev/null 
    1335513472+++ b/drivers/usb/dwc_otg/dwc_otg_ifx.h 
     
    1344013557+} 
    1344113558+#endif //__DWC_OTG_IFX_H__ 
     13559diff --git a/drivers/usb/dwc_otg/dwc_otg_plat.h b/drivers/usb/dwc_otg/dwc_otg_plat.h 
     13560new file mode 100644 
     13561index 0000000..727d0c4 
    1344213562--- /dev/null 
    1344313563+++ b/drivers/usb/dwc_otg/dwc_otg_plat.h 
     
    1371213832+#endif 
    1371313833+ 
     13834diff --git a/drivers/usb/dwc_otg/dwc_otg_regs.h b/drivers/usb/dwc_otg/dwc_otg_regs.h 
     13835new file mode 100644 
     13836index 0000000..397a954 
    1371413837--- /dev/null 
    1371513838+++ b/drivers/usb/dwc_otg/dwc_otg_regs.h 
     
    1551215635+ 
    1551315636+#endif 
    15514 --- a/arch/mips/lantiq/xway/Makefile 
    15515 +++ b/arch/mips/lantiq/xway/Makefile 
    15516 @@ -1,5 +1,5 @@ 
    15517  obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o timer.o 
    15518 - 
    15519 +obj-y += dev-dwc_otg.o 
    15520  obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o 
    15521  obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o 
    15522   
    15523 --- /dev/null 
    15524 +++ b/arch/mips/lantiq/xway/dev-dwc_otg.c 
    15525 @@ -0,0 +1,70 @@ 
    15526 +/* 
    15527 + * This program is free software; you can redistribute it and/or modify 
    15528 + * it under the terms of the GNU General Public License as published by 
    15529 + * the Free Software Foundation; either version 2 of the License, or 
    15530 + * (at your option) any later version. 
    15531 + * 
    15532 + * Copyright (C) 2010 John Crispin <blogic@openwrt.org> 
    15533 + */ 
    15534 + 
    15535 +#include <linux/init.h> 
    15536 +#include <linux/module.h> 
    15537 +#include <linux/types.h> 
    15538 +#include <linux/string.h> 
    15539 +#include <linux/mtd/physmap.h> 
    15540 +#include <linux/kernel.h> 
    15541 +#include <linux/reboot.h> 
    15542 +#include <linux/platform_device.h> 
    15543 +#include <linux/leds.h> 
    15544 +#include <linux/etherdevice.h> 
    15545 +#include <linux/reboot.h> 
    15546 +#include <linux/time.h> 
    15547 +#include <linux/io.h> 
    15548 +#include <linux/gpio.h> 
    15549 +#include <linux/leds.h> 
    15550 + 
    15551 +#include <asm/bootinfo.h> 
    15552 +#include <asm/irq.h> 
    15553 + 
    15554 +#include <lantiq_soc.h> 
    15555 +#include <lantiq_irq.h> 
    15556 +#include <lantiq_platform.h> 
    15557 + 
    15558 +#define LTQ_USB_IOMEM_BASE 0x1e101000 
    15559 +#define LTQ_USB_IOMEM_SIZE 0x00001000 
    15560 + 
    15561 +static struct resource resources[] = 
    15562 +{ 
    15563 +       [0] = { 
    15564 +               .name    = "dwc_otg_membase", 
    15565 +               .start   = LTQ_USB_IOMEM_BASE, 
    15566 +               .end     = LTQ_USB_IOMEM_BASE + LTQ_USB_IOMEM_SIZE - 1, 
    15567 +               .flags   = IORESOURCE_MEM, 
    15568 +       }, 
    15569 +       [1] = { 
    15570 +               .name    = "dwc_otg_irq", 
    15571 +               .start   = LTQ_USB_INT, 
    15572 +               .flags   = IORESOURCE_IRQ, 
    15573 +       }, 
    15574 +}; 
    15575 + 
    15576 +static u64 dwc_dmamask = (u32)0x1fffffff; 
    15577 + 
    15578 +static struct platform_device platform_dev = { 
    15579 +       .name = "dwc_otg", 
    15580 +       .dev = { 
    15581 +               .dma_mask      = &dwc_dmamask, 
    15582 +       }, 
    15583 +       .resource               = resources, 
    15584 +       .num_resources          = ARRAY_SIZE(resources), 
    15585 +}; 
    15586 + 
    15587 +int __init 
    15588 +xway_register_dwc(int pin) 
    15589 +{ 
    15590 +       struct irq_data d; 
    15591 +       d.irq = resources[1].start; 
    15592 +       ltq_enable_irq(&d); 
    15593 +       platform_dev.dev.platform_data = (void*) pin; 
    15594 +       return platform_device_register(&platform_dev); 
    15595 +} 
    15596 --- /dev/null 
    15597 +++ b/arch/mips/lantiq/xway/dev-dwc_otg.h 
    15598 @@ -0,0 +1,17 @@ 
    15599 +/* 
    15600 + * This program is free software; you can redistribute it and/or modify 
    15601 + * it under the terms of the GNU General Public License as published by 
    15602 + * the Free Software Foundation; either version 2 of the License, or 
    15603 + * (at your option) any later version. 
    15604 + * 
    15605 + * Copyright (C) 2010 John Crispin <blogic@openwrt.org> 
    15606 + */ 
    15607 + 
    15608 +#ifndef _LTQ_DEV_DWC_H__ 
    15609 +#define _LTQ_DEV_DWC_H__ 
    15610 + 
    15611 +#include <lantiq_platform.h> 
    15612 + 
    15613 +extern void __init xway_register_dwc(int pin); 
    15614 + 
    15615 +#endif 
    15616 --- a/drivers/usb/core/hub.c 
    15617 +++ b/drivers/usb/core/hub.c 
    15618 @@ -2885,11 +2885,11 @@ hub_port_init (struct usb_hub *hub, stru 
    15619                 udev->ttport = hdev->ttport; 
    15620         } else if (udev->speed != USB_SPEED_HIGH 
    15621                         && hdev->speed == USB_SPEED_HIGH) { 
    15622 -               if (!hub->tt.hub) { 
    15623 +/*             if (!hub->tt.hub) { 
    15624                         dev_err(&udev->dev, "parent hub has no TT\n"); 
    15625                         retval = -EINVAL; 
    15626                         goto fail; 
    15627 -               } 
    15628 +               }*/ 
    15629                 udev->tt = &hub->tt; 
    15630                 udev->ttport = port1; 
    15631         } 
     15637--  
     156381.7.5.4 
     15639 
  • trunk/target/linux/lantiq/patches-3.0/0019-MIPS-lantiq-adds-VPE-extensions.patch

    r28404 r28405  
     1From c6c810d83f0d95f54c3a6b338d219cec7ccef4c9 Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Thu, 29 Sep 2011 20:30:40 +0200 
     4Subject: [PATCH 19/24] MIPS: lantiq: adds VPE extensions 
     5 
     6--- 
     7 arch/mips/Kconfig                  |   22 +++ 
     8 arch/mips/include/asm/mipsmtregs.h |   54 +++++++ 
     9 arch/mips/kernel/Makefile          |    3 +- 
     10 arch/mips/kernel/mips-mt.c         |   97 +++++++++++-- 
     11 arch/mips/kernel/mtsched_proc.c    |  279 ++++++++++++++++++++++++++++++++++++ 
     12 arch/mips/kernel/perf_proc.c       |  191 ++++++++++++++++++++++++ 
     13 arch/mips/kernel/proc.c            |   17 +++ 
     14 arch/mips/kernel/smtc.c            |    7 + 
     15 arch/mips/kernel/vpe.c             |  250 ++++++++++++++++++++++++++++++++- 
     16 9 files changed, 905 insertions(+), 15 deletions(-) 
     17 create mode 100644 arch/mips/kernel/mtsched_proc.c 
     18 create mode 100644 arch/mips/kernel/perf_proc.c 
     19 
     20diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig 
     21index 0cf5bbd..bf1b76d 100644 
    122--- a/arch/mips/Kconfig 
    223+++ b/arch/mips/Kconfig 
    3 @@ -1905,6 +1905,28 @@ config MIPS_VPE_LOADER 
     24@@ -1903,6 +1903,28 @@ config MIPS_VPE_LOADER 
    425          Includes a loader for loading an elf relocatable object 
    526          onto another VPE and running it. 
     
    3051        bool "Use per-TC register bits as backstop for inhibited IM bits" 
    3152        depends on MIPS_MT_SMTC 
     53diff --git a/arch/mips/include/asm/mipsmtregs.h b/arch/mips/include/asm/mipsmtregs.h 
     54index c9420aa..04bfb4b 100644 
    3255--- a/arch/mips/include/asm/mipsmtregs.h 
    3356+++ b/arch/mips/include/asm/mipsmtregs.h 
     
    139162 /* GPR */ 
    140163 #define read_tc_gpr_sp()               mftgpr(29) 
     164diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile 
     165index 83bba33..53a9a0a 100644 
    141166--- a/arch/mips/kernel/Makefile 
    142167+++ b/arch/mips/kernel/Makefile 
    143 @@ -86,7 +86,8 @@ obj-$(CONFIG_MIPS32_O32)      += binfmt_elfo3 
     168@@ -86,7 +86,8 @@ obj-$(CONFIG_MIPS32_O32)      += binfmt_elfo32.o scall64-o32.o 
    144169  
    145170 obj-$(CONFIG_KGDB)             += kgdb.o 
     
    151176  
    152177 obj-$(CONFIG_I8253)            += i8253.o 
     178diff --git a/arch/mips/kernel/mips-mt.c b/arch/mips/kernel/mips-mt.c 
     179index 594ca69..ad912fc 100644 
    153180--- a/arch/mips/kernel/mips-mt.c 
    154181+++ b/arch/mips/kernel/mips-mt.c 
     
    255282 /* 
    256283  * Dump new MIPS MT state for the core. Does not leave TCs halted. 
    257 @@ -78,18 +148,18 @@ void mips_mt_regdump(unsigned long mvpct 
     284@@ -78,18 +148,18 @@ void mips_mt_regdump(unsigned long mvpctl) 
    258285                        if ((read_tc_c0_tcbind() & TCBIND_CURVPE) == i) { 
    259286                                printk("  VPE %d\n", i); 
     
    291318  
    292319 /* 
    293 --- a/arch/mips/kernel/proc.c 
    294 +++ b/arch/mips/kernel/proc.c 
    295 @@ -7,6 +7,7 @@ 
    296  #include <linux/kernel.h> 
    297  #include <linux/sched.h> 
    298  #include <linux/seq_file.h> 
    299 +#include <linux/proc_fs.h> 
    300  #include <asm/bootinfo.h> 
    301  #include <asm/cpu.h> 
    302  #include <asm/cpu-features.h> 
    303 @@ -110,3 +111,19 @@ const struct seq_operations cpuinfo_op = 
    304         .stop   = c_stop, 
    305         .show   = show_cpuinfo, 
    306  }; 
    307 + 
    308 +/* 
    309 + * Support for MIPS/local /proc hooks in /proc/mips/ 
    310 + */ 
    311 + 
    312 +static struct proc_dir_entry *mips_proc = NULL; 
    313 + 
    314 +struct proc_dir_entry *get_mips_proc_dir(void) 
    315 +{ 
    316 +       /* 
    317 +        * This ought not to be preemptable. 
    318 +        */ 
    319 +       if(mips_proc == NULL) 
    320 +               mips_proc = proc_mkdir("mips", NULL); 
    321 +       return(mips_proc); 
    322 +} 
    323 --- a/arch/mips/kernel/smtc.c 
    324 +++ b/arch/mips/kernel/smtc.c 
    325 @@ -1334,6 +1334,13 @@ void smtc_get_new_mmu_context(struct mm_ 
    326         asid = asid_cache(cpu); 
    327   
    328         do { 
    329 +#ifdef CONFIG_IFX_VPE_EXT 
    330 +               /* If TLB is shared between AP and RP (AP is running SMTC), 
    331 +                  leave out max ASID i.e., ASID_MASK for RP 
    332 +                */ 
    333 +               if (!nostlb && ((asid & ASID_MASK) == (ASID_MASK - 1))) 
    334 +                       asid++; 
    335 +#endif 
    336                 if (!((asid += ASID_INC) & ASID_MASK) ) { 
    337                         if (cpu_has_vtag_icache) 
    338                                 flush_icache_all(); 
    339 --- a/arch/mips/kernel/vpe.c 
    340 +++ b/arch/mips/kernel/vpe.c 
    341 @@ -76,6 +76,58 @@ static struct kspd_notifications kspd_ev 
    342  static int kspd_events_reqd; 
    343  #endif 
    344   
    345 +#ifdef CONFIG_IFX_VPE_EXT 
    346 +static int is_sdepgm; 
    347 +extern int stlb; 
    348 +extern int vpe0_wired; 
    349 +extern int vpe1_wired; 
    350 +unsigned int vpe1_load_addr; 
    351 + 
    352 +static int __init load_address(char *str) 
    353 +{ 
    354 +       get_option(&str, &vpe1_load_addr); 
    355 +       return 1; 
    356 +} 
    357 +__setup("vpe1_load_addr=", load_address); 
    358 + 
    359 +#include <asm/mipsmtregs.h> 
    360 +#define write_vpe_c0_wired(val)                mttc0(6, 0, val) 
    361 + 
    362 +#ifndef COMMAND_LINE_SIZE 
    363 +#      define COMMAND_LINE_SIZE        512 
    364 +#endif 
    365 + 
    366 +char command_line[COMMAND_LINE_SIZE * 2]; 
    367 + 
    368 +static unsigned int vpe1_mem; 
    369 +static int __init vpe1mem(char *str) 
    370 +{ 
    371 +       vpe1_mem = memparse(str, &str); 
    372 +       return 1; 
    373 +} 
    374 +__setup("vpe1_mem=", vpe1mem); 
    375 + 
    376 +uint32_t vpe1_wdog_ctr; 
    377 +static int __init wdog_ctr(char *str) 
    378 +{ 
    379 +       get_option(&str, &vpe1_wdog_ctr); 
    380 +       return 1; 
    381 +} 
    382 + 
    383 +__setup("vpe1_wdog_ctr_addr=", wdog_ctr); 
    384 +EXPORT_SYMBOL(vpe1_wdog_ctr); 
    385 + 
    386 +uint32_t vpe1_wdog_timeout; 
    387 +static int __init wdog_timeout(char *str) 
    388 +{ 
    389 +        get_option(&str, &vpe1_wdog_timeout); 
    390 +        return 1; 
    391 +} 
    392 + 
    393 +__setup("vpe1_wdog_timeout=", wdog_timeout); 
    394 +EXPORT_SYMBOL(vpe1_wdog_timeout); 
    395 + 
    396 +#endif 
    397  /* grab the likely amount of memory we will need. */ 
    398  #ifdef CONFIG_MIPS_VPE_LOADER_TOM 
    399  #define P_SIZE (2 * 1024 * 1024) 
    400 @@ -268,6 +320,13 @@ static void *alloc_progmem(unsigned long 
    401         void *addr; 
    402   
    403  #ifdef CONFIG_MIPS_VPE_LOADER_TOM 
    404 +#ifdef CONFIG_IFX_VPE_EXT 
    405 +       if (vpe1_load_addr) { 
    406 +               memset((void *)vpe1_load_addr, 0, len); 
    407 +               return (void *)vpe1_load_addr; 
    408 +       } 
    409 +#endif 
    410 + 
    411         /* 
    412          * This means you must tell Linux to use less memory than you 
    413          * physically have, for example by passing a mem= boot argument. 
    414 @@ -746,6 +805,12 @@ static int vpe_run(struct vpe * v) 
    415         } 
    416   
    417         /* Write the address we want it to start running from in the TCPC register. */ 
    418 +#if defined(CONFIG_IFX_VPE_EXT) && 0 
    419 +       if (stlb) 
    420 +               write_vpe_c0_wired(vpe0_wired + vpe1_wired); 
    421 +       else 
    422 +               write_vpe_c0_wired(vpe1_wired); 
    423 +#endif 
    424         write_tc_c0_tcrestart((unsigned long)v->__start); 
    425         write_tc_c0_tccontext((unsigned long)0); 
    426   
    427 @@ -759,6 +824,20 @@ static int vpe_run(struct vpe * v) 
    428   
    429         write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H); 
    430   
    431 +#if defined(CONFIG_IFX_VPE_EXT) && 0 
    432 +       /* 
    433 +        * $a2 & $a3 are used to pass command line parameters to VPE1. $a2 
    434 +        * points to the start of the command line string and $a3 points to 
    435 +        * the end of the string. This convention is identical to the Linux 
    436 +        * kernel boot parameter passing mechanism. Please note that $a3 is 
    437 +        * used to pass physical memory size or 0 in SDE tool kit. So, if you 
    438 +        * are passing comand line parameters through $a2 & $a3 SDE programs 
    439 +        * don't work as desired. 
    440 +        */ 
    441 +       mttgpr(6, command_line); 
    442 +       mttgpr(7, (command_line + strlen(command_line))); 
    443 +       if (is_sdepgm) 
    444 +#endif 
    445         /* 
    446          * The sde-kit passes 'memsize' to __start in $a3, so set something 
    447          * here...  Or set $a3 to zero and define DFLT_STACK_SIZE and 
    448 @@ -833,6 +912,9 @@ static int find_vpe_symbols(struct vpe * 
    449         if ( (v->__start == 0) || (v->shared_ptr == NULL)) 
    450                 return -1; 
    451   
    452 +#ifdef CONFIG_IFX_VPE_EXT 
    453 +       is_sdepgm = 1; 
    454 +#endif 
    455         return 0; 
    456  } 
    457   
    458 @@ -994,6 +1076,15 @@ static int vpe_elfload(struct vpe * v) 
    459                            (unsigned long)v->load_addr + v->len); 
    460   
    461         if ((find_vpe_symbols(v, sechdrs, symindex, strtab, &mod)) < 0) { 
    462 +#ifdef CONFIG_IFX_VPE_EXT 
    463 +               if (vpe1_load_addr) { 
    464 +                       /* Conversion to KSEG1 is required ??? */ 
    465 +                       v->__start = KSEG1ADDR(vpe1_load_addr); 
    466 +                       is_sdepgm = 0; 
    467 +                       return 0; 
    468 +               } 
    469 +#endif 
    470 + 
    471                 if (v->__start == 0) { 
    472                         printk(KERN_WARNING "VPE loader: program does not contain " 
    473                                "a __start symbol\n"); 
    474 @@ -1064,6 +1155,9 @@ static int vpe_open(struct inode *inode, 
    475         struct vpe_notifications *not; 
    476         struct vpe *v; 
    477         int ret; 
    478 +#ifdef CONFIG_IFX_VPE_EXT 
    479 +   int progsize; 
    480 +#endif 
    481   
    482         if (minor != iminor(inode)) { 
    483                 /* assume only 1 device at the moment. */ 
    484 @@ -1089,7 +1183,12 @@ static int vpe_open(struct inode *inode, 
    485                 release_progmem(v->load_addr); 
    486                 cleanup_tc(get_tc(tclimit)); 
    487         } 
    488 - 
    489 +#ifdef CONFIG_IFX_VPE_EXT 
    490 +       progsize = (vpe1_mem  != 0) ? vpe1_mem : P_SIZE; 
    491 +       //printk("progsize = %x\n", progsize); 
    492 +       v->pbuffer = vmalloc(progsize); 
    493 +       v->plen = progsize; 
    494 +#else 
    495         /* this of-course trashes what was there before... */ 
    496         v->pbuffer = vmalloc(P_SIZE); 
    497         if (!v->pbuffer) { 
    498 @@ -1097,11 +1196,14 @@ static int vpe_open(struct inode *inode, 
    499                 return -ENOMEM; 
    500         } 
    501         v->plen = P_SIZE; 
    502 +#endif 
    503         v->load_addr = NULL; 
    504         v->len = 0; 
    505   
    506 +#if 0 
    507         v->uid = filp->f_cred->fsuid; 
    508         v->gid = filp->f_cred->fsgid; 
    509 +#endif 
    510   
    511  #ifdef CONFIG_MIPS_APSP_KSPD 
    512         /* get kspd to tell us when a syscall_exit happens */ 
    513 @@ -1349,6 +1451,133 @@ static void kspd_sp_exit( int sp_id) 
    514         cleanup_tc(get_tc(sp_id)); 
    515  } 
    516  #endif 
    517 +#ifdef CONFIG_IFX_VPE_EXT 
    518 +int32_t vpe1_sw_start(void* sw_start_addr, uint32_t tcmask, uint32_t flags) 
    519 +{ 
    520 +       enum vpe_state state; 
    521 +       struct vpe *v = get_vpe(tclimit); 
    522 +       struct vpe_notifications *not; 
    523 + 
    524 +       if (tcmask || flags) { 
    525 +               printk(KERN_WARNING "Currently tcmask and flags should be 0.\ 
    526 +                               other values not supported\n"); 
    527 +               return -1; 
    528 +       } 
    529 + 
    530 +       state = xchg(&v->state, VPE_STATE_INUSE); 
    531 +       if (state != VPE_STATE_UNUSED) { 
    532 +               vpe_stop(v); 
    533 + 
    534 +               list_for_each_entry(not, &v->notify, list) { 
    535 +                       not->stop(tclimit); 
    536 +               } 
    537 +       } 
    538 + 
    539 +       v->__start = (unsigned long)sw_start_addr; 
    540 +       is_sdepgm = 0; 
    541 + 
    542 +       if (!vpe_run(v)) { 
    543 +               printk(KERN_DEBUG "VPE loader: VPE1 running successfully\n"); 
    544 +               return 0; 
    545 +       } 
    546 +       return -1; 
    547 +} 
    548 + 
    549 +EXPORT_SYMBOL(vpe1_sw_start); 
    550 + 
    551 +int32_t vpe1_sw_stop(uint32_t flags) 
    552 +{ 
    553 +       struct vpe *v = get_vpe(tclimit); 
    554 + 
    555 +       if (!vpe_free(v)) { 
    556 +               printk(KERN_DEBUG "RP Stopped\n"); 
    557 +               return 0; 
    558 +       } 
    559 +       else 
    560 +               return -1; 
    561 +} 
    562 + 
    563 +EXPORT_SYMBOL(vpe1_sw_stop); 
    564 + 
    565 +uint32_t vpe1_get_load_addr (uint32_t flags) 
    566 +{ 
    567 +       return vpe1_load_addr; 
    568 +} 
    569 + 
    570 +EXPORT_SYMBOL(vpe1_get_load_addr); 
    571 + 
    572 +uint32_t vpe1_get_max_mem (uint32_t flags) 
    573 +{ 
    574 +       if (!vpe1_mem) 
    575 +               return P_SIZE; 
    576 +       else 
    577 +               return vpe1_mem; 
    578 +} 
    579 + 
    580 +EXPORT_SYMBOL(vpe1_get_max_mem); 
    581 + 
    582 +void* vpe1_get_cmdline_argument(void) 
    583 +{ 
    584 +       return saved_command_line; 
    585 +} 
    586 + 
    587 +EXPORT_SYMBOL(vpe1_get_cmdline_argument); 
    588 + 
    589 +int32_t vpe1_set_boot_param(char *field, char *value, char flags) 
    590 +{ 
    591 +       char *ptr, string[64]; 
    592 +       int start_off, end_off; 
    593 +       if (!field) 
    594 +               return -1; 
    595 +       strcpy(string, field); 
    596 +       if (value) { 
    597 +               strcat(string, "="); 
    598 +               strcat(string, value); 
    599 +               strcat(command_line, " "); 
    600 +               strcat(command_line, string); 
    601 +       } 
    602 +       else { 
    603 +               ptr = strstr(command_line, string); 
    604 +               if (ptr) { 
    605 +                       start_off = ptr - command_line; 
    606 +                       ptr += strlen(string); 
    607 +                       while ((*ptr != ' ') && (*ptr != '\0')) 
    608 +                               ptr++; 
    609 +                       end_off = ptr - command_line; 
    610 +                       command_line[start_off] = '\0'; 
    611 +                       strcat (command_line, command_line+end_off); 
    612 +               } 
    613 +       } 
    614 +       return 0; 
    615 +} 
    616 + 
    617 +EXPORT_SYMBOL(vpe1_set_boot_param); 
    618 + 
    619 +int32_t vpe1_get_boot_param(char *field, char **value, char flags) 
    620 +{ 
    621 +       char *ptr, string[64]; 
    622 +       int i = 0; 
    623 +       if (!field) 
    624 +               return -1; 
    625 +       if ((ptr = strstr(command_line, field))) { 
    626 +               ptr += strlen(field) + 1; /* including = */ 
    627 +               while ((*ptr != ' ') && (*ptr != '\0')) 
    628 +                       string[i++] = *ptr++; 
    629 +               string[i] = '\0'; 
    630 +               *value = kmalloc((strlen(string) + 1), GFP_KERNEL); 
    631 +               if (*value != NULL) 
    632 +                       strcpy(*value, string); 
    633 +       } 
    634 +       else 
    635 +               *value = NULL; 
    636 + 
    637 +       return 0; 
    638 +} 
    639 + 
    640 +EXPORT_SYMBOL(vpe1_get_boot_param); 
    641 + 
    642 +extern void configure_tlb(void); 
    643 +#endif 
    644   
    645  static ssize_t store_kill(struct device *dev, struct device_attribute *attr, 
    646                           const char *buf, size_t len) 
    647 @@ -1430,6 +1659,18 @@ static int __init vpe_module_init(void) 
    648                 printk("VPE loader: not a MIPS MT capable processor\n"); 
    649                 return -ENODEV; 
    650         } 
    651 +#ifdef CONFIG_IFX_VPE_EXT 
    652 +#ifndef CONFIG_MIPS_MT_SMTC 
    653 +       configure_tlb(); 
    654 +#endif 
    655 +#endif 
    656 + 
    657 +#ifndef CONFIG_MIPS_MT_SMTC 
    658 +       if (!vpelimit) 
    659 +               vpelimit = 1; 
    660 +       if (!tclimit) 
    661 +               tclimit = 1; 
    662 +#endif 
    663   
    664         if (vpelimit == 0) { 
    665                 printk(KERN_WARNING "No VPEs reserved for AP/SP, not " 
    666 @@ -1474,10 +1715,12 @@ static int __init vpe_module_init(void) 
    667         mtflags = dmt(); 
    668         vpflags = dvpe(); 
    669   
    670 +       back_to_back_c0_hazard(); 
    671 + 
    672         /* Put MVPE's into 'configuration state' */ 
    673         set_c0_mvpcontrol(MVPCONTROL_VPC); 
    674   
    675 -       /* dump_mtregs(); */ 
    676 +       dump_mtregs(); 
    677   
    678         val = read_c0_mvpconf0(); 
    679         hw_tcs = (val & MVPCONF0_PTC) + 1; 
    680 @@ -1489,6 +1732,7 @@ static int __init vpe_module_init(void) 
    681                  * reschedule send IPIs or similar we might hang. 
    682                  */ 
    683                 clear_c0_mvpcontrol(MVPCONTROL_VPC); 
    684 +               back_to_back_c0_hazard(); 
    685                 evpe(vpflags); 
    686                 emt(mtflags); 
    687                 local_irq_restore(flags); 
    688 @@ -1514,6 +1758,7 @@ static int __init vpe_module_init(void) 
    689                         } 
    690   
    691                         v->ntcs = hw_tcs - tclimit; 
    692 +                        write_tc_c0_tcbind((read_tc_c0_tcbind() & ~TCBIND_CURVPE) | 1); 
    693   
    694                         /* add the tc to the list of this vpe's tc's. */ 
    695                         list_add(&t->tc, &v->tc); 
    696 @@ -1582,6 +1827,7 @@ static int __init vpe_module_init(void) 
    697  out_reenable: 
    698         /* release config state */ 
    699         clear_c0_mvpcontrol(MVPCONTROL_VPC); 
    700 +       back_to_back_c0_hazard(); 
    701   
    702         evpe(vpflags); 
    703         emt(mtflags); 
     320diff --git a/arch/mips/kernel/mtsched_proc.c b/arch/mips/kernel/mtsched_proc.c 
     321new file mode 100644 
     322index 0000000..4dafded 
    704323--- /dev/null 
    705324+++ b/arch/mips/kernel/mtsched_proc.c 
     
    984603+/* Automagically create the entry */ 
    985604+module_init(init_mtsched_proc); 
     605diff --git a/arch/mips/kernel/perf_proc.c b/arch/mips/kernel/perf_proc.c 
     606new file mode 100644 
     607index 0000000..7eec015 
    986608--- /dev/null 
    987609+++ b/arch/mips/kernel/perf_proc.c 
     
    1178800+/* Automagically create the entry */ 
    1179801+module_init(init_perf_proc); 
     802diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c 
     803index e309665..2de204f 100644 
     804--- a/arch/mips/kernel/proc.c 
     805+++ b/arch/mips/kernel/proc.c 
     806@@ -7,6 +7,7 @@ 
     807 #include <linux/kernel.h> 
     808 #include <linux/sched.h> 
     809 #include <linux/seq_file.h> 
     810+#include <linux/proc_fs.h> 
     811 #include <asm/bootinfo.h> 
     812 #include <asm/cpu.h> 
     813 #include <asm/cpu-features.h> 
     814@@ -110,3 +111,19 @@ const struct seq_operations cpuinfo_op = { 
     815        .stop   = c_stop, 
     816        .show   = show_cpuinfo, 
     817 }; 
     818+ 
     819+/* 
     820+ * Support for MIPS/local /proc hooks in /proc/mips/ 
     821+ */ 
     822+ 
     823+static struct proc_dir_entry *mips_proc = NULL; 
     824+ 
     825+struct proc_dir_entry *get_mips_proc_dir(void) 
     826+{ 
     827+       /* 
     828+        * This ought not to be preemptable. 
     829+        */ 
     830+       if(mips_proc == NULL) 
     831+               mips_proc = proc_mkdir("mips", NULL); 
     832+       return(mips_proc); 
     833+} 
     834diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c 
     835index f0895e7..199e853 100644 
     836--- a/arch/mips/kernel/smtc.c 
     837+++ b/arch/mips/kernel/smtc.c 
     838@@ -1334,6 +1334,13 @@ void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) 
     839        asid = asid_cache(cpu); 
     840  
     841        do { 
     842+#ifdef CONFIG_IFX_VPE_EXT 
     843+               /* If TLB is shared between AP and RP (AP is running SMTC), 
     844+                  leave out max ASID i.e., ASID_MASK for RP 
     845+                */ 
     846+               if (!nostlb && ((asid & ASID_MASK) == (ASID_MASK - 1))) 
     847+                       asid++; 
     848+#endif 
     849                if (!((asid += ASID_INC) & ASID_MASK) ) { 
     850                        if (cpu_has_vtag_icache) 
     851                                flush_icache_all(); 
     852diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c 
     853index 3efcb06..742f24b 100644 
     854--- a/arch/mips/kernel/vpe.c 
     855+++ b/arch/mips/kernel/vpe.c 
     856@@ -76,6 +76,58 @@ static struct kspd_notifications kspd_events; 
     857 static int kspd_events_reqd; 
     858 #endif 
     859  
     860+#ifdef CONFIG_IFX_VPE_EXT 
     861+static int is_sdepgm; 
     862+extern int stlb; 
     863+extern int vpe0_wired; 
     864+extern int vpe1_wired; 
     865+unsigned int vpe1_load_addr; 
     866+ 
     867+static int __init load_address(char *str) 
     868+{ 
     869+       get_option(&str, &vpe1_load_addr); 
     870+       return 1; 
     871+} 
     872+__setup("vpe1_load_addr=", load_address); 
     873+ 
     874+#include <asm/mipsmtregs.h> 
     875+#define write_vpe_c0_wired(val)                mttc0(6, 0, val) 
     876+ 
     877+#ifndef COMMAND_LINE_SIZE 
     878+#      define COMMAND_LINE_SIZE        512 
     879+#endif 
     880+ 
     881+char command_line[COMMAND_LINE_SIZE * 2]; 
     882+ 
     883+static unsigned int vpe1_mem; 
     884+static int __init vpe1mem(char *str) 
     885+{ 
     886+       vpe1_mem = memparse(str, &str); 
     887+       return 1; 
     888+} 
     889+__setup("vpe1_mem=", vpe1mem); 
     890+ 
     891+uint32_t vpe1_wdog_ctr; 
     892+static int __init wdog_ctr(char *str) 
     893+{ 
     894+       get_option(&str, &vpe1_wdog_ctr); 
     895+       return 1; 
     896+} 
     897+ 
     898+__setup("vpe1_wdog_ctr_addr=", wdog_ctr); 
     899+EXPORT_SYMBOL(vpe1_wdog_ctr); 
     900+ 
     901+uint32_t vpe1_wdog_timeout; 
     902+static int __init wdog_timeout(char *str) 
     903+{ 
     904+        get_option(&str, &vpe1_wdog_timeout); 
     905+        return 1; 
     906+} 
     907+ 
     908+__setup("vpe1_wdog_timeout=", wdog_timeout); 
     909+EXPORT_SYMBOL(vpe1_wdog_timeout); 
     910+ 
     911+#endif 
     912 /* grab the likely amount of memory we will need. */ 
     913 #ifdef CONFIG_MIPS_VPE_LOADER_TOM 
     914 #define P_SIZE (2 * 1024 * 1024) 
     915@@ -268,6 +320,13 @@ static void *alloc_progmem(unsigned long len) 
     916        void *addr; 
     917  
     918 #ifdef CONFIG_MIPS_VPE_LOADER_TOM 
     919+#ifdef CONFIG_IFX_VPE_EXT 
     920+       if (vpe1_load_addr) { 
     921+               memset((void *)vpe1_load_addr, 0, len); 
     922+               return (void *)vpe1_load_addr; 
     923+       } 
     924+#endif 
     925+ 
     926        /* 
     927         * This means you must tell Linux to use less memory than you 
     928         * physically have, for example by passing a mem= boot argument. 
     929@@ -746,6 +805,12 @@ static int vpe_run(struct vpe * v) 
     930        } 
     931  
     932        /* Write the address we want it to start running from in the TCPC register. */ 
     933+#if defined(CONFIG_IFX_VPE_EXT) && 0 
     934+       if (stlb) 
     935+               write_vpe_c0_wired(vpe0_wired + vpe1_wired); 
     936+       else 
     937+               write_vpe_c0_wired(vpe1_wired); 
     938+#endif 
     939        write_tc_c0_tcrestart((unsigned long)v->__start); 
     940        write_tc_c0_tccontext((unsigned long)0); 
     941  
     942@@ -759,6 +824,20 @@ static int vpe_run(struct vpe * v) 
     943  
     944        write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H); 
     945  
     946+#if defined(CONFIG_IFX_VPE_EXT) && 0 
     947+       /* 
     948+        * $a2 & $a3 are used to pass command line parameters to VPE1. $a2 
     949+        * points to the start of the command line string and $a3 points to 
     950+        * the end of the string. This convention is identical to the Linux 
     951+        * kernel boot parameter passing mechanism. Please note that $a3 is 
     952+        * used to pass physical memory size or 0 in SDE tool kit. So, if you 
     953+        * are passing comand line parameters through $a2 & $a3 SDE programs 
     954+        * don't work as desired. 
     955+        */ 
     956+       mttgpr(6, command_line); 
     957+       mttgpr(7, (command_line + strlen(command_line))); 
     958+       if (is_sdepgm) 
     959+#endif 
     960        /* 
     961         * The sde-kit passes 'memsize' to __start in $a3, so set something 
     962         * here...  Or set $a3 to zero and define DFLT_STACK_SIZE and 
     963@@ -833,6 +912,9 @@ static int find_vpe_symbols(struct vpe * v, Elf_Shdr * sechdrs, 
     964        if ( (v->__start == 0) || (v->shared_ptr == NULL)) 
     965                return -1; 
     966  
     967+#ifdef CONFIG_IFX_VPE_EXT 
     968+       is_sdepgm = 1; 
     969+#endif 
     970        return 0; 
     971 } 
     972  
     973@@ -994,6 +1076,15 @@ static int vpe_elfload(struct vpe * v) 
     974                           (unsigned long)v->load_addr + v->len); 
     975  
     976        if ((find_vpe_symbols(v, sechdrs, symindex, strtab, &mod)) < 0) { 
     977+#ifdef CONFIG_IFX_VPE_EXT 
     978+               if (vpe1_load_addr) { 
     979+                       /* Conversion to KSEG1 is required ??? */ 
     980+                       v->__start = KSEG1ADDR(vpe1_load_addr); 
     981+                       is_sdepgm = 0; 
     982+                       return 0; 
     983+               } 
     984+#endif 
     985+ 
     986                if (v->__start == 0) { 
     987                        printk(KERN_WARNING "VPE loader: program does not contain " 
     988                               "a __start symbol\n"); 
     989@@ -1064,6 +1155,9 @@ static int vpe_open(struct inode *inode, struct file *filp) 
     990        struct vpe_notifications *not; 
     991        struct vpe *v; 
     992        int ret; 
     993+#ifdef CONFIG_IFX_VPE_EXT 
     994+   int progsize; 
     995+#endif 
     996  
     997        if (minor != iminor(inode)) { 
     998                /* assume only 1 device at the moment. */ 
     999@@ -1089,7 +1183,12 @@ static int vpe_open(struct inode *inode, struct file *filp) 
     1000                release_progmem(v->load_addr); 
     1001                cleanup_tc(get_tc(tclimit)); 
     1002        } 
     1003- 
     1004+#ifdef CONFIG_IFX_VPE_EXT 
     1005+       progsize = (vpe1_mem  != 0) ? vpe1_mem : P_SIZE; 
     1006+       //printk("progsize = %x\n", progsize); 
     1007+       v->pbuffer = vmalloc(progsize); 
     1008+       v->plen = progsize; 
     1009+#else 
     1010        /* this of-course trashes what was there before... */ 
     1011        v->pbuffer = vmalloc(P_SIZE); 
     1012        if (!v->pbuffer) { 
     1013@@ -1097,11 +1196,14 @@ static int vpe_open(struct inode *inode, struct file *filp) 
     1014                return -ENOMEM; 
     1015        } 
     1016        v->plen = P_SIZE; 
     1017+#endif 
     1018        v->load_addr = NULL; 
     1019        v->len = 0; 
     1020  
     1021+#if 0 
     1022        v->uid = filp->f_cred->fsuid; 
     1023        v->gid = filp->f_cred->fsgid; 
     1024+#endif 
     1025  
     1026 #ifdef CONFIG_MIPS_APSP_KSPD 
     1027        /* get kspd to tell us when a syscall_exit happens */ 
     1028@@ -1349,6 +1451,133 @@ static void kspd_sp_exit( int sp_id) 
     1029        cleanup_tc(get_tc(sp_id)); 
     1030 } 
     1031 #endif 
     1032+#ifdef CONFIG_IFX_VPE_EXT 
     1033+int32_t vpe1_sw_start(void* sw_start_addr, uint32_t tcmask, uint32_t flags) 
     1034+{ 
     1035+       enum vpe_state state; 
     1036+       struct vpe *v = get_vpe(tclimit); 
     1037+       struct vpe_notifications *not; 
     1038+ 
     1039+       if (tcmask || flags) { 
     1040+               printk(KERN_WARNING "Currently tcmask and flags should be 0.\ 
     1041+                               other values not supported\n"); 
     1042+               return -1; 
     1043+       } 
     1044+ 
     1045+       state = xchg(&v->state, VPE_STATE_INUSE); 
     1046+       if (state != VPE_STATE_UNUSED) { 
     1047+               vpe_stop(v); 
     1048+ 
     1049+               list_for_each_entry(not, &v->notify, list) { 
     1050+                       not->stop(tclimit); 
     1051+               } 
     1052+       } 
     1053+ 
     1054+       v->__start = (unsigned long)sw_start_addr; 
     1055+       is_sdepgm = 0; 
     1056+ 
     1057+       if (!vpe_run(v)) { 
     1058+               printk(KERN_DEBUG "VPE loader: VPE1 running successfully\n"); 
     1059+               return 0; 
     1060+       } 
     1061+       return -1; 
     1062+} 
     1063+ 
     1064+EXPORT_SYMBOL(vpe1_sw_start); 
     1065+ 
     1066+int32_t vpe1_sw_stop(uint32_t flags) 
     1067+{ 
     1068+       struct vpe *v = get_vpe(tclimit); 
     1069+ 
     1070+       if (!vpe_free(v)) { 
     1071+               printk(KERN_DEBUG "RP Stopped\n"); 
     1072+               return 0; 
     1073+       } 
     1074+       else 
     1075+               return -1; 
     1076+} 
     1077+ 
     1078+EXPORT_SYMBOL(vpe1_sw_stop); 
     1079+ 
     1080+uint32_t vpe1_get_load_addr (uint32_t flags) 
     1081+{ 
     1082+       return vpe1_load_addr; 
     1083+} 
     1084+ 
     1085+EXPORT_SYMBOL(vpe1_get_load_addr); 
     1086+ 
     1087+uint32_t vpe1_get_max_mem (uint32_t flags) 
     1088+{ 
     1089+       if (!vpe1_mem) 
     1090+               return P_SIZE; 
     1091+       else 
     1092+               return vpe1_mem; 
     1093+} 
     1094+ 
     1095+EXPORT_SYMBOL(vpe1_get_max_mem); 
     1096+ 
     1097+void* vpe1_get_cmdline_argument(void) 
     1098+{ 
     1099+       return saved_command_line; 
     1100+} 
     1101+ 
     1102+EXPORT_SYMBOL(vpe1_get_cmdline_argument); 
     1103+ 
     1104+int32_t vpe1_set_boot_param(char *field, char *value, char flags) 
     1105+{ 
     1106+       char *ptr, string[64]; 
     1107+       int start_off, end_off; 
     1108+       if (!field) 
     1109+               return -1; 
     1110+       strcpy(string, field); 
     1111+       if (value) { 
     1112+               strcat(string, "="); 
     1113+               strcat(string, value); 
     1114+               strcat(command_line, " "); 
     1115+               strcat(command_line, string); 
     1116+       } 
     1117+       else { 
     1118+               ptr = strstr(command_line, string); 
     1119+               if (ptr) { 
     1120+                       start_off = ptr - command_line; 
     1121+                       ptr += strlen(string); 
     1122+                       while ((*ptr != ' ') && (*ptr != '\0')) 
     1123+                               ptr++; 
     1124+                       end_off = ptr - command_line; 
     1125+                       command_line[start_off] = '\0'; 
     1126+                       strcat (command_line, command_line+end_off); 
     1127+               } 
     1128+       } 
     1129+       return 0; 
     1130+} 
     1131+ 
     1132+EXPORT_SYMBOL(vpe1_set_boot_param); 
     1133+ 
     1134+int32_t vpe1_get_boot_param(char *field, char **value, char flags) 
     1135+{ 
     1136+       char *ptr, string[64]; 
     1137+       int i = 0; 
     1138+       if (!field) 
     1139+               return -1; 
     1140+       if ((ptr = strstr(command_line, field))) { 
     1141+               ptr += strlen(field) + 1; /* including = */ 
     1142+               while ((*ptr != ' ') && (*ptr != '\0')) 
     1143+                       string[i++] = *ptr++; 
     1144+               string[i] = '\0'; 
     1145+               *value = kmalloc((strlen(string) + 1), GFP_KERNEL); 
     1146+               if (*value != NULL) 
     1147+                       strcpy(*value, string); 
     1148+       } 
     1149+       else 
     1150+               *value = NULL; 
     1151+ 
     1152+       return 0; 
     1153+} 
     1154+ 
     1155+EXPORT_SYMBOL(vpe1_get_boot_param); 
     1156+ 
     1157+extern void configure_tlb(void); 
     1158+#endif 
     1159  
     1160 static ssize_t store_kill(struct device *dev, struct device_attribute *attr, 
     1161                          const char *buf, size_t len) 
     1162@@ -1430,6 +1659,18 @@ static int __init vpe_module_init(void) 
     1163                printk("VPE loader: not a MIPS MT capable processor\n"); 
     1164                return -ENODEV; 
     1165        } 
     1166+#ifdef CONFIG_IFX_VPE_EXT 
     1167+#ifndef CONFIG_MIPS_MT_SMTC 
     1168+       configure_tlb(); 
     1169+#endif 
     1170+#endif 
     1171+ 
     1172+#ifndef CONFIG_MIPS_MT_SMTC 
     1173+       if (!vpelimit) 
     1174+               vpelimit = 1; 
     1175+       if (!tclimit) 
     1176+               tclimit = 1; 
     1177+#endif 
     1178  
     1179        if (vpelimit == 0) { 
     1180                printk(KERN_WARNING "No VPEs reserved for AP/SP, not " 
     1181@@ -1474,10 +1715,12 @@ static int __init vpe_module_init(void) 
     1182        mtflags = dmt(); 
     1183        vpflags = dvpe(); 
     1184  
     1185+       back_to_back_c0_hazard(); 
     1186+ 
     1187        /* Put MVPE's into 'configuration state' */ 
     1188        set_c0_mvpcontrol(MVPCONTROL_VPC); 
     1189  
     1190-       /* dump_mtregs(); */ 
     1191+       dump_mtregs(); 
     1192  
     1193        val = read_c0_mvpconf0(); 
     1194        hw_tcs = (val & MVPCONF0_PTC) + 1; 
     1195@@ -1489,6 +1732,7 @@ static int __init vpe_module_init(void) 
     1196                 * reschedule send IPIs or similar we might hang. 
     1197                 */ 
     1198                clear_c0_mvpcontrol(MVPCONTROL_VPC); 
     1199+               back_to_back_c0_hazard(); 
     1200                evpe(vpflags); 
     1201                emt(mtflags); 
     1202                local_irq_restore(flags); 
     1203@@ -1514,6 +1758,7 @@ static int __init vpe_module_init(void) 
     1204                        } 
     1205  
     1206                        v->ntcs = hw_tcs - tclimit; 
     1207+                        write_tc_c0_tcbind((read_tc_c0_tcbind() & ~TCBIND_CURVPE) | 1); 
     1208  
     1209                        /* add the tc to the list of this vpe's tc's. */ 
     1210                        list_add(&t->tc, &v->tc); 
     1211@@ -1582,6 +1827,7 @@ static int __init vpe_module_init(void) 
     1212 out_reenable: 
     1213        /* release config state */ 
     1214        clear_c0_mvpcontrol(MVPCONTROL_VPC); 
     1215+       back_to_back_c0_hazard(); 
     1216  
     1217        evpe(vpflags); 
     1218        emt(mtflags); 
     1219--  
     12201.7.5.4 
     1221 
  • trunk/target/linux/lantiq/patches-3.0/0021-MIPS-lantiq-adds-cache-split.patch

    r28404 r28405  
    1 --- a/arch/mips/Kconfig 
    2 +++ b/arch/mips/Kconfig 
    3 @@ -1912,6 +1912,28 @@ config IFX_VPE_EXT 
     1From 0f85e79f6f01f50cb703866a555085a9c65bad2f Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Thu, 29 Sep 2011 20:31:54 +0200 
     4Subject: [PATCH 21/24] MIPS: lantiq: adds cache split 
     5 
     6--- 
     7 arch/mips/Kconfig      |   22 ++++++ 
     8 arch/mips/kernel/vpe.c |   66 ++++++++++++++++++ 
     9 arch/mips/mm/c-r4k.c   |  172 ++++++++++++++++++++++++++++++++++++++++++++++++ 
     10 3 files changed, 260 insertions(+), 0 deletions(-) 
     11 
     12Index: linux-3.0.3/arch/mips/Kconfig 
     13=================================================================== 
     14--- linux-3.0.3.orig/arch/mips/Kconfig  2011-10-05 12:53:54.792898260 +0200 
     15+++ linux-3.0.3/arch/mips/Kconfig       2011-10-05 12:53:54.852898263 +0200 
     16@@ -1913,6 +1913,28 @@ 
    417        help 
    518          IFX included extensions in APRP 
     
    3043        bool "34K Performance counters" 
    3144        depends on MIPS_MT && PROC_FS 
    32 --- a/arch/mips/kernel/vpe.c 
    33 +++ b/arch/mips/kernel/vpe.c 
    34 @@ -128,6 +128,13 @@ __setup("vpe1_wdog_timeout=", wdog_timeo 
     45Index: linux-3.0.3/arch/mips/kernel/vpe.c 
     46=================================================================== 
     47--- linux-3.0.3.orig/arch/mips/kernel/vpe.c     2011-10-05 12:53:54.800898262 +0200 
     48+++ linux-3.0.3/arch/mips/kernel/vpe.c  2011-10-05 12:53:54.852898263 +0200 
     49@@ -128,6 +128,13 @@ 
    3550 EXPORT_SYMBOL(vpe1_wdog_timeout); 
    3651  
     
    4661 #ifdef CONFIG_MIPS_VPE_LOADER_TOM 
    4762 #define P_SIZE (2 * 1024 * 1024) 
    48 @@ -866,6 +873,65 @@ static int vpe_run(struct vpe * v) 
     63@@ -866,6 +873,65 @@ 
    4964        /* enable this VPE */ 
    5065        write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | VPECONF0_VPA); 
     
    112127        write_vpe_c0_status(0); 
    113128        write_vpe_c0_cause(0); 
    114 --- a/arch/mips/mm/c-r4k.c 
    115 +++ b/arch/mips/mm/c-r4k.c 
    116 @@ -1346,6 +1346,106 @@ static int __init setcoherentio(char *st 
     129Index: linux-3.0.3/arch/mips/mm/c-r4k.c 
     130=================================================================== 
     131--- linux-3.0.3.orig/arch/mips/mm/c-r4k.c       2011-08-17 19:57:16.000000000 +0200 
     132+++ linux-3.0.3/arch/mips/mm/c-r4k.c    2011-10-05 12:53:54.852898263 +0200 
     133@@ -1346,6 +1346,106 @@ 
    117134 __setup("coherentio", setcoherentio); 
    118135 #endif 
     
    221238 { 
    222239        extern void build_clear_page(void); 
    223 @@ -1365,6 +1465,78 @@ void __cpuinit r4k_cache_init(void) 
     240@@ -1365,6 +1465,78 @@ 
    224241                break; 
    225242        } 
     
    300317        setup_scache(); 
    301318  
     319Index: linux-3.0.3/arch/mips/lantiq/setup.c 
     320=================================================================== 
     321--- linux-3.0.3.orig/arch/mips/lantiq/setup.c   2011-10-05 13:20:49.808967301 +0200 
     322+++ linux-3.0.3/arch/mips/lantiq/setup.c        2011-10-05 13:23:27.796974054 +0200 
     323@@ -18,10 +18,11 @@ 
     324 #include "devices.h" 
     325 #include "prom.h" 
     326  
     327+/* assume 16M as default incase uboot fails to pass proper ramsize */ 
     328+unsigned long physical_memsize = 16L; 
     329+ 
     330 void __init plat_mem_setup(void) 
     331 { 
     332-       /* assume 16M as default incase uboot fails to pass proper ramsize */ 
     333-       unsigned long memsize = 16; 
     334        char **envp = (char **) KSEG1ADDR(fw_arg2); 
     335  
     336        ioport_resource.start = IOPORT_RESOURCE_START; 
     337@@ -35,13 +36,13 @@ 
     338                char *e = (char *)KSEG1ADDR(*envp); 
     339                if (!strncmp(e, "memsize=", 8)) { 
     340                        e += 8; 
     341-                       if (strict_strtoul(e, 0, &memsize)) 
     342+                       if (strict_strtoul(e, 0, &physical_memsize)) 
     343                                pr_warn("bad memsize specified\n"); 
     344                } 
     345                envp++; 
     346        } 
     347-       memsize *= 1024 * 1024; 
     348-       add_memory_region(0x00000000, memsize, BOOT_MEM_RAM); 
     349+       physical_memsize *= 1024 * 1024; 
     350+       add_memory_region(0x00000000, physical_memsize, BOOT_MEM_RAM); 
     351 } 
     352  
     353 static int __init 
  • trunk/target/linux/lantiq/patches-3.0/0022-MIPS-lantiq-adds-udp-in-kernel-redirect.patch

    r28404 r28405  
     1From 14ff975c660696fa636e8d6b58d0abed0ddc72ce Mon Sep 17 00:00:00 2001 
     2From: John Crispin <blogic@openwrt.org> 
     3Date: Thu, 29 Sep 2011 20:29:54 +0200 
     4Subject: [PATCH 22/24] MIPS: lantiq: adds udp in-kernel redirect 
     5 
     6--- 
     7 include/linux/udp_redirect.h |   57 +++++++++++++ 
     8 net/Kconfig                  |    6 ++ 
     9 net/ipv4/Makefile            |    3 + 
     10 net/ipv4/udp.c               |   28 ++++++- 
     11 net/ipv4/udp_redirect_symb.c |  186 ++++++++++++++++++++++++++++++++++++++++++ 
     12 5 files changed, 276 insertions(+), 4 deletions(-) 
     13 create mode 100644 include/linux/udp_redirect.h 
     14 create mode 100644 net/ipv4/udp_redirect_symb.c 
     15 
     16diff --git a/include/linux/udp_redirect.h b/include/linux/udp_redirect.h 
     17new file mode 100644 
     18index 0000000..de1e64f 
    119--- /dev/null 
    220+++ b/include/linux/udp_redirect.h 
     
    5977+                               int fraglen, int odd, struct sk_buff *skb); 
    6078+#endif 
     79diff --git a/net/Kconfig b/net/Kconfig 
     80index a073148..d13e3fa 100644 
     81--- a/net/Kconfig 
     82+++ b/net/Kconfig 
     83@@ -72,6 +72,12 @@ config INET 
     84  
     85          Short answer: say Y. 
     86  
     87+config IFX_UDP_REDIRECT 
     88+       bool "IFX Kernel Packet Interface for UDP redirection" 
     89+       help 
     90+         You can say Y here if you want to use hooks from kernel for 
     91+         UDP redirection. 
     92+ 
     93 if INET 
     94 source "net/ipv4/Kconfig" 
     95 source "net/ipv6/Kconfig" 
     96diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile 
     97index f2dc69c..6badd72 100644 
     98--- a/net/ipv4/Makefile 
     99+++ b/net/ipv4/Makefile 
     100@@ -14,6 +14,9 @@ obj-y     := route.o inetpeer.o protocol.o \ 
     101             inet_fragment.o ping.o 
     102  
     103 obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o 
     104+ifneq ($(CONFIG_IFX_UDP_REDIRECT),) 
     105+obj-$(CONFIG_IFX_UDP_REDIRECT) += udp_redirect_symb.o 
     106+endif 
     107 obj-$(CONFIG_PROC_FS) += proc.o 
     108 obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o 
     109 obj-$(CONFIG_IP_MROUTE) += ipmr.o 
     110diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c 
     111index 1b5a193..4d15cf6 100644 
     112--- a/net/ipv4/udp.c 
     113+++ b/net/ipv4/udp.c 
     114@@ -108,6 +108,10 @@ 
     115 #include <trace/events/udp.h> 
     116 #include "udp_impl.h" 
     117  
     118+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
     119+#include <linux/udp_redirect.h> 
     120+#endif 
     121+ 
     122 struct udp_table udp_table __read_mostly; 
     123 EXPORT_SYMBOL(udp_table); 
     124  
     125@@ -803,7 +807,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 
     126        u8  tos; 
     127        int err, is_udplite = IS_UDPLITE(sk); 
     128        int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; 
     129-       int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); 
     130+       int (*getfrag)(void *, char *, int, int, int, struct sk_buff *) = NULL; 
     131        struct sk_buff *skb; 
     132        struct ip_options_data opt_copy; 
     133  
     134@@ -820,7 +824,13 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 
     135        ipc.opt = NULL; 
     136        ipc.tx_flags = 0; 
     137  
     138-       getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; 
     139+/* UDPREDIRECT */ 
     140+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
     141+       if(udpredirect_getfrag_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC) 
     142+               getfrag = udpredirect_getfrag_fn; 
     143+       else 
     144+#endif /* IFX_UDP_REDIRECT */ 
     145+               getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; 
     146  
     147        fl4 = &inet->cork.fl.u.ip4; 
     148        if (up->pending) { 
     149@@ -1621,6 +1631,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, 
     150        struct rtable *rt = skb_rtable(skb); 
     151        __be32 saddr, daddr; 
     152        struct net *net = dev_net(skb->dev); 
     153+       int ret = 0; 
     154  
     155        /* 
     156         *  Validate the packet. 
     157@@ -1653,7 +1664,16 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, 
     158        sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable); 
     159  
     160        if (sk != NULL) { 
     161-               int ret = udp_queue_rcv_skb(sk, skb); 
     162+       /* UDPREDIRECT */ 
     163+#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
     164+      if(udp_do_redirect_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC) 
     165+      { 
     166+         udp_do_redirect_fn(sk,skb); 
     167+         kfree_skb(skb); 
     168+         return(0); 
     169+      } 
     170+#endif 
     171+               ret = udp_queue_rcv_skb(sk, skb); 
     172                sock_put(sk); 
     173  
     174                /* a return value > 0 means to resubmit the input, but 
     175@@ -1950,7 +1970,7 @@ struct proto udp_prot = { 
     176        .clear_sk          = sk_prot_clear_portaddr_nulls, 
     177 }; 
     178 EXPORT_SYMBOL(udp_prot); 
     179- 
     180+EXPORT_SYMBOL(udp_rcv); 
     181 /* ------------------------------------------------------------------------ */ 
     182 #ifdef CONFIG_PROC_FS 
     183  
     184diff --git a/net/ipv4/udp_redirect_symb.c b/net/ipv4/udp_redirect_symb.c 
     185new file mode 100644 
     186index 0000000..5617e86 
    61187--- /dev/null 
    62188+++ b/net/ipv4/udp_redirect_symb.c 
     
    248374+EXPORT_SYMBOL(udpredirect_getfrag_fn); 
    249375+#endif /* CONFIG_IFX_UDP_REDIRECT* */ 
    250 --- a/net/ipv4/Makefile 
    251 +++ b/net/ipv4/Makefile 
    252 @@ -14,6 +14,9 @@ obj-y     := route.o inetpeer.o protocol 
    253              inet_fragment.o ping.o 
    254   
    255  obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o 
    256 +ifneq ($(CONFIG_IFX_UDP_REDIRECT),) 
    257 +obj-$(CONFIG_IFX_UDP_REDIRECT) += udp_redirect_symb.o 
    258 +endif 
    259  obj-$(CONFIG_PROC_FS) += proc.o 
    260  obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o 
    261  obj-$(CONFIG_IP_MROUTE) += ipmr.o 
    262 --- a/net/ipv4/udp.c 
    263 +++ b/net/ipv4/udp.c 
    264 @@ -107,6 +107,10 @@ 
    265  #include <net/xfrm.h> 
    266  #include "udp_impl.h" 
    267   
    268 +#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
    269 +#include <linux/udp_redirect.h> 
    270 +#endif 
    271 + 
    272  struct udp_table udp_table __read_mostly; 
    273  EXPORT_SYMBOL(udp_table); 
    274   
    275 @@ -802,7 +806,7 @@ int udp_sendmsg(struct kiocb *iocb, stru 
    276         u8  tos; 
    277         int err, is_udplite = IS_UDPLITE(sk); 
    278         int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; 
    279 -       int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); 
    280 +       int (*getfrag)(void *, char *, int, int, int, struct sk_buff *) = NULL; 
    281         struct sk_buff *skb; 
    282         struct ip_options_data opt_copy; 
    283   
    284 @@ -819,7 +823,13 @@ int udp_sendmsg(struct kiocb *iocb, stru 
    285         ipc.opt = NULL; 
    286         ipc.tx_flags = 0; 
    287   
    288 -       getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; 
    289 +/* UDPREDIRECT */ 
    290 +#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
    291 +       if(udpredirect_getfrag_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC) 
    292 +               getfrag = udpredirect_getfrag_fn; 
    293 +       else 
    294 +#endif /* IFX_UDP_REDIRECT */ 
    295 +               getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; 
    296   
    297         fl4 = &inet->cork.fl.u.ip4; 
    298         if (up->pending) { 
    299 @@ -1619,6 +1629,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, 
    300         struct rtable *rt = skb_rtable(skb); 
    301         __be32 saddr, daddr; 
    302         struct net *net = dev_net(skb->dev); 
    303 +       int ret = 0; 
    304   
    305         /* 
    306          *  Validate the packet. 
    307 @@ -1651,7 +1662,16 @@ int __udp4_lib_rcv(struct sk_buff *skb, 
    308         sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable); 
    309   
    310         if (sk != NULL) { 
    311 -               int ret = udp_queue_rcv_skb(sk, skb); 
    312 +       /* UDPREDIRECT */ 
    313 +#if defined(CONFIG_IFX_UDP_REDIRECT) || defined(CONFIG_IFX_UDP_REDIRECT_MODULE) 
    314 +      if(udp_do_redirect_fn && sk->sk_user_data == UDP_REDIRECT_MAGIC) 
    315 +      { 
    316 +         udp_do_redirect_fn(sk,skb); 
    317 +         kfree_skb(skb); 
    318 +         return(0); 
    319 +      } 
    320 +#endif 
    321 +               ret = udp_queue_rcv_skb(sk, skb); 
    322                 sock_put(sk); 
    323   
    324                 /* a return value > 0 means to resubmit the input, but 
    325 @@ -1948,7 +1968,7 @@ struct proto udp_prot = { 
    326         .clear_sk          = sk_prot_clear_portaddr_nulls, 
    327  }; 
    328  EXPORT_SYMBOL(udp_prot); 
    329 - 
    330 +EXPORT_SYMBOL(udp_rcv); 
    331  /* ------------------------------------------------------------------------ */ 
    332  #ifdef CONFIG_PROC_FS 
    333   
    334 --- a/net/Kconfig 
    335 +++ b/net/Kconfig 
    336 @@ -72,6 +72,12 @@ config INET 
    337   
    338           Short answer: say Y. 
    339   
    340 +config IFX_UDP_REDIRECT 
    341 +       bool "IFX Kernel Packet Interface for UDP redirection" 
    342 +       help 
    343 +         You can say Y here if you want to use hooks from kernel for 
    344 +         UDP redirection. 
    345 + 
    346  if INET 
    347  source "net/ipv4/Kconfig" 
    348  source "net/ipv6/Kconfig" 
     376--  
     3771.7.5.4 
     378 
  • trunk/target/linux/lantiq/patches-3.0/100-falcon_bsp_header.patch

    r28404 r28405  
    1 --- /dev/null 
    2 +++ b/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h 
    3 @@ -0,0 +1,277 @@ 
    4 +/* 
    5 + *   This program is free software; you can redistribute it and/or modify 
    6 + *   it under the terms of the GNU General Public License as published by 
    7 + *   the Free Software Foundation; either version 2 of the License, or 
    8 + *   (at your option) any later version. 
    9 + * 
    10 + *   This program is distributed in the hope that it will be useful, 
    11 + *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
    12 + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    13 + *   GNU General Public License for more details. 
    14 + * 
    15 + *   You should have received a copy of the GNU General Public License 
    16 + *   along with this program; if not, write to the Free Software 
    17 + *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
    18 + * 
    19 + *   Copyright (C) 2010 Lantiq 
    20 + */ 
    21 +#ifndef _FALCON_IRQ__ 
    22 +#define _FALCON_IRQ__ 
    23 + 
    24 +#define INT_NUM_IRQ0                   8 
    25 +#define INT_NUM_IM0_IRL0               (INT_NUM_IRQ0 + 0) 
    26 +#define INT_NUM_IM1_IRL0               (INT_NUM_IM0_IRL0 + 32) 
    27 +#define INT_NUM_IM2_IRL0               (INT_NUM_IM1_IRL0 + 32) 
    28 +#define INT_NUM_IM3_IRL0               (INT_NUM_IM2_IRL0 + 32) 
    29 +#define INT_NUM_IM4_IRL0               (INT_NUM_IM3_IRL0 + 32) 
    30 +#define INT_NUM_EXTRA_START            (INT_NUM_IM4_IRL0 + 32) 
    31 +#define INT_NUM_IM_OFFSET              (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0) 
    32 + 
    33 +#define MIPS_CPU_TIMER_IRQ                     7 
    34 + 
    35 +/* HOST IF Event Interrupt */ 
    36 +#define FALCON_IRQ_HOST                                (INT_NUM_IM0_IRL0 + 0) 
    37 +/* HOST IF Mailbox0 Receive Interrupt */ 
    38 +#define FALCON_IRQ_HOST_MB0_RX                 (INT_NUM_IM0_IRL0 + 1) 
    39 +/* HOST IF Mailbox0 Transmit Interrupt */ 
    40 +#define FALCON_IRQ_HOST_MB0_TX                 (INT_NUM_IM0_IRL0 + 2) 
    41 +/* HOST IF Mailbox1 Receive Interrupt */ 
    42 +#define FALCON_IRQ_HOST_MB1_RX                 (INT_NUM_IM0_IRL0 + 3) 
    43 +/* HOST IF Mailbox1 Transmit Interrupt */ 
    44 +#define FALCON_IRQ_HOST_MB1_TX                 (INT_NUM_IM0_IRL0 + 4) 
    45 +/* I2C Last Single Data Transfer Request */ 
    46 +#define FALCON_IRQ_I2C_LSREQ                   (INT_NUM_IM0_IRL0 + 8) 
    47 +/* I2C Single Data Transfer Request */ 
    48 +#define FALCON_IRQ_I2C_SREQ                    (INT_NUM_IM0_IRL0 + 9) 
    49 +/* I2C Last Burst Data Transfer Request */ 
    50 +#define FALCON_IRQ_I2C_LBREQ                   (INT_NUM_IM0_IRL0 + 10) 
    51 +/* I2C Burst Data Transfer Request */ 
    52 +#define FALCON_IRQ_I2C_BREQ                    (INT_NUM_IM0_IRL0 + 11) 
    53 +/* I2C Error Interrupt */ 
    54 +#define FALCON_IRQ_I2C_I2C_ERR                 (INT_NUM_IM0_IRL0 + 12) 
    55 +/* I2C Protocol Interrupt */ 
    56 +#define FALCON_IRQ_I2C_I2C_P                   (INT_NUM_IM0_IRL0 + 13) 
    57 +/* SSC Transmit Interrupt */ 
    58 +#define FALCON_IRQ_SSC_T                       (INT_NUM_IM0_IRL0 + 14) 
    59 +/* SSC Receive Interrupt */ 
    60 +#define FALCON_IRQ_SSC_R                       (INT_NUM_IM0_IRL0 + 15) 
    61 +/* SSC Error Interrupt */ 
    62 +#define FALCON_IRQ_SSC_E                       (INT_NUM_IM0_IRL0 + 16) 
    63 +/* SSC Frame Interrupt */ 
    64 +#define FALCON_IRQ_SSC_F                       (INT_NUM_IM0_IRL0 + 17) 
    65 +/* Advanced Encryption Standard Interrupt */ 
    66 +#define FALCON_IRQ_AES_AES                     (INT_NUM_IM0_IRL0 + 27) 
    67 +/* Secure Hash Algorithm Interrupt */ 
    68 +#define FALCON_IRQ_SHA_HASH                    (INT_NUM_IM0_IRL0 + 28) 
    69 +/* PCM Receive Interrupt */ 
    70 +#define FALCON_IRQ_PCM_RX                      (INT_NUM_IM0_IRL0 + 29) 
    71 +/* PCM Transmit Interrupt */ 
    72 +#define FALCON_IRQ_PCM_TX                      (INT_NUM_IM0_IRL0 + 30) 
    73 +/* PCM Transmit Crash Interrupt */ 
    74 +#define FALCON_IRQ_PCM_HW2_CRASH               (INT_NUM_IM0_IRL0 + 31) 
    75 + 
    76 +/* EBU Serial Flash Command Error */ 
    77 +#define FALCON_IRQ_EBU_SF_CMDERR               (INT_NUM_IM1_IRL0 + 0) 
    78 +/* EBU Serial Flash Command Overwrite Error */ 
    79 +#define FALCON_IRQ_EBU_SF_COVERR               (INT_NUM_IM1_IRL0 + 1) 
    80 +/* EBU Serial Flash Busy */ 
    81 +#define FALCON_IRQ_EBU_SF_BUSY                 (INT_NUM_IM1_IRL0 + 2) 
    82 +/* External Interrupt from GPIO P0 */ 
    83 +#define FALCON_IRQ_GPIO_P0                     (INT_NUM_IM1_IRL0 + 4) 
    84 +/* External Interrupt from GPIO P1 */ 
    85 +#define FALCON_IRQ_GPIO_P1                     (INT_NUM_IM1_IRL0 + 5) 
    86 +/* External Interrupt from GPIO P2 */ 
    87 +#define FALCON_IRQ_GPIO_P2                     (INT_NUM_IM1_IRL0 + 6) 
    88 +/* External Interrupt from GPIO P3 */ 
    89 +#define FALCON_IRQ_GPIO_P3                     (INT_NUM_IM1_IRL0 + 7) 
    90 +/* External Interrupt from GPIO P4 */ 
    91 +#define FALCON_IRQ_GPIO_P4                     (INT_NUM_IM1_IRL0 + 8) 
    92 +/* 8kHz backup interrupt derived from core-PLL */ 
    93 +#define FALCON_IRQ_FSC_BKP                     (INT_NUM_IM1_IRL0 + 10) 
    94 +/* FSC Timer Interrupt 0 */ 
    95 +#define FALCON_IRQ_FSCT_CMP0                   (INT_NUM_IM1_IRL0 + 11) 
    96 +/* FSC Timer Interrupt 1 */ 
    97 +#define FALCON_IRQ_FSCT_CMP1                   (INT_NUM_IM1_IRL0 + 12) 
    98 +/* 8kHz root interrupt derived from GPON interface */ 
    99 +#define FALCON_IRQ_FSC_ROOT                    (INT_NUM_IM1_IRL0 + 13) 
    100 +/* Time of Day */ 
    101 +#define FALCON_IRQ_TOD                         (INT_NUM_IM1_IRL0 + 14) 
    102 +/* PMA Interrupt from IntNode of the 200MHz Domain */ 
    103 +#define FALCON_IRQ_PMA_200M                    (INT_NUM_IM1_IRL0 + 15) 
    104 +/* PMA Interrupt from IntNode of the TX Clk Domain */ 
    105 +#define FALCON_IRQ_PMA_TX                      (INT_NUM_IM1_IRL0 + 16) 
    106 +/* PMA Interrupt from IntNode of the RX Clk Domain */ 
    107 +#define FALCON_IRQ_PMA_RX                      (INT_NUM_IM1_IRL0 + 17) 
    108 +/* SYS1 Interrupt */ 
    109 +#define FALCON_IRQ_SYS1                                (INT_NUM_IM1_IRL0 + 20) 
    110 +/* SYS GPE Interrupt */ 
    111 +#define FALCON_IRQ_SYS_GPE                     (INT_NUM_IM1_IRL0 + 21) 
    112 +/* Watchdog Access Error Interrupt */ 
    113 +#define FALCON_IRQ_WDT_AEIR                    (INT_NUM_IM1_IRL0 + 24) 
    114 +/* Watchdog Prewarning Interrupt */ 
    115 +#define FALCON_IRQ_WDT_PIR                     (INT_NUM_IM1_IRL0 + 25) 
    116 +/* SBIU interrupt */ 
    117 +#define FALCON_IRQ_SBIU0                       (INT_NUM_IM1_IRL0 + 27) 
    118 +/* FPI Bus Control Unit Interrupt */ 
    119 +#define FALCON_IRQ_BCU0                                (INT_NUM_IM1_IRL0 + 29) 
    120 +/* DDR Controller Interrupt */ 
    121 +#define FALCON_IRQ_DDR                         (INT_NUM_IM1_IRL0 + 30) 
    122 +/* Crossbar Error Interrupt */ 
    123 +#define FALCON_IRQ_XBAR_ERROR                  (INT_NUM_IM1_IRL0 + 31) 
    124 + 
    125 +/* ICTRLL 0 Interrupt */ 
    126 +#define FALCON_IRQ_ICTRLL0                     (INT_NUM_IM2_IRL0 + 0) 
    127 +/* ICTRLL 1 Interrupt */ 
    128 +#define FALCON_IRQ_ICTRLL1                     (INT_NUM_IM2_IRL0 + 1) 
    129 +/* ICTRLL 2 Interrupt */ 
    130 +#define FALCON_IRQ_ICTRLL2                     (INT_NUM_IM2_IRL0 + 2) 
    131 +/* ICTRLL 3 Interrupt */ 
    132 +#define FALCON_IRQ_ICTRLL3                     (INT_NUM_IM2_IRL0 + 3) 
    133 +/* OCTRLL 0 Interrupt */ 
    134 +#define FALCON_IRQ_OCTRLL0                     (INT_NUM_IM2_IRL0 + 4) 
    135 +/* OCTRLL 1 Interrupt */ 
    136 +#define FALCON_IRQ_OCTRLL1                     (INT_NUM_IM2_IRL0 + 5) 
    137 +/* OCTRLL 2 Interrupt */ 
    138 +#define FALCON_IRQ_OCTRLL2                     (INT_NUM_IM2_IRL0 + 6) 
    139 +/* OCTRLL 3 Interrupt */ 
    140 +#define FALCON_IRQ_OCTRLL3                     (INT_NUM_IM2_IRL0 + 7) 
    141 +/* OCTRLG Interrupt */ 
    142 +#define FALCON_IRQ_OCTRLG                      (INT_NUM_IM2_IRL0 + 9) 
    143 +/* IQM Interrupt */ 
    144 +#define FALCON_IRQ_IQM                         (INT_NUM_IM2_IRL0 + 10) 
    145 +/* FSQM Interrupt */ 
    146 +#define FALCON_IRQ_FSQM                                (INT_NUM_IM2_IRL0 + 11) 
    147 +/* TMU Interrupt */ 
    148 +#define FALCON_IRQ_TMU                         (INT_NUM_IM2_IRL0 + 12) 
    149 +/* LINK1 Interrupt */ 
    150 +#define FALCON_IRQ_LINK1                       (INT_NUM_IM2_IRL0 + 14) 
    151 +/* ICTRLC 0 Interrupt */ 
    152 +#define FALCON_IRQ_ICTRLC0                     (INT_NUM_IM2_IRL0 + 16) 
    153 +/* ICTRLC 1 Interrupt */ 
    154 +#define FALCON_IRQ_ICTRLC1                     (INT_NUM_IM2_IRL0 + 17) 
    155 +/* OCTRLC Interrupt */ 
    156 +#define FALCON_IRQ_OCTRLC                      (INT_NUM_IM2_IRL0 + 18) 
    157 +/* CONFIG Break Interrupt */ 
    158 +#define FALCON_IRQ_CONFIG_BREAK                        (INT_NUM_IM2_IRL0 + 19) 
    159 +/* CONFIG Interrupt */ 
    160 +#define FALCON_IRQ_CONFIG                      (INT_NUM_IM2_IRL0 + 20) 
    161 +/* Dispatcher Interrupt */ 
    162 +#define FALCON_IRQ_DISP                                (INT_NUM_IM2_IRL0 + 21) 
    163 +/* TBM Interrupt */ 
    164 +#define FALCON_IRQ_TBM                         (INT_NUM_IM2_IRL0 + 22) 
    165 +/* GTC Downstream Interrupt */ 
    166 +#define FALCON_IRQ_GTC_DS                      (INT_NUM_IM2_IRL0 + 29) 
    167 +/* GTC Upstream Interrupt */ 
    168 +#define FALCON_IRQ_GTC_US                      (INT_NUM_IM2_IRL0 + 30) 
    169 +/* EIM Interrupt */ 
    170 +#define FALCON_IRQ_EIM                         (INT_NUM_IM2_IRL0 + 31) 
    171 + 
    172 +/* ASC0 Transmit Interrupt */ 
    173 +#define FALCON_IRQ_ASC0_T                      (INT_NUM_IM3_IRL0 + 0) 
    174 +/* ASC0 Receive Interrupt */ 
    175 +#define FALCON_IRQ_ASC0_R                      (INT_NUM_IM3_IRL0 + 1) 
    176 +/* ASC0 Error Interrupt */ 
    177 +#define FALCON_IRQ_ASC0_E                      (INT_NUM_IM3_IRL0 + 2) 
    178 +/* ASC0 Transmit Buffer Interrupt */ 
    179 +#define FALCON_IRQ_ASC0_TB                     (INT_NUM_IM3_IRL0 + 3) 
    180 +/* ASC0 Autobaud Start Interrupt */ 
    181 +#define FALCON_IRQ_ASC0_ABST                   (INT_NUM_IM3_IRL0 + 4) 
    182 +/* ASC0 Autobaud Detection Interrupt */ 
    183 +#define FALCON_IRQ_ASC0_ABDET                  (INT_NUM_IM3_IRL0 + 5) 
    184 +/* ASC1 Modem Status Interrupt */ 
    185 +#define FALCON_IRQ_ASC0_MS                     (INT_NUM_IM3_IRL0 + 6) 
    186 +/* ASC0 Soft Flow Control Interrupt */ 
    187 +#define FALCON_IRQ_ASC0_SFC                    (INT_NUM_IM3_IRL0 + 7) 
    188 +/* ASC1 Transmit Interrupt */ 
    189 +#define FALCON_IRQ_ASC1_T                      (INT_NUM_IM3_IRL0 + 8) 
    190 +/* ASC1 Receive Interrupt */ 
    191 +#define FALCON_IRQ_ASC1_R                      (INT_NUM_IM3_IRL0 + 9) 
    192 +/* ASC1 Error Interrupt */ 
    193 +#define FALCON_IRQ_ASC1_E                      (INT_NUM_IM3_IRL0 + 10) 
    194 +/* ASC1 Transmit Buffer Interrupt */ 
    195 +#define FALCON_IRQ_ASC1_TB                     (INT_NUM_IM3_IRL0 + 11) 
    196 +/* ASC1 Autobaud Start Interrupt */ 
    197 +#define FALCON_IRQ_ASC1_ABST                   (INT_NUM_IM3_IRL0 + 12) 
    198 +/* ASC1 Autobaud Detection Interrupt */ 
    199 +#define FALCON_IRQ_ASC1_ABDET                  (INT_NUM_IM3_IRL0 + 13) 
    200 +/* ASC1 Modem Status Interrupt */ 
    201 +#define FALCON_IRQ_ASC1_MS                     (INT_NUM_IM3_IRL0 + 14) 
    202 +/* ASC1 Soft Flow Control Interrupt */ 
    203 +#define FALCON_IRQ_ASC1_SFC                    (INT_NUM_IM3_IRL0 + 15) 
    204 +/* GPTC Timer/Counter 1A Interrupt */ 
    205 +#define FALCON_IRQ_GPTC_TC1A                   (INT_NUM_IM3_IRL0 + 16) 
    206 +/* GPTC Timer/Counter 1B Interrupt */ 
    207 +#define FALCON_IRQ_GPTC_TC1B                   (INT_NUM_IM3_IRL0 + 17) 
    208 +/* GPTC Timer/Counter 2A Interrupt */ 
    209 +#define FALCON_IRQ_GPTC_TC2A                   (INT_NUM_IM3_IRL0 + 18) 
    210 +/* GPTC Timer/Counter 2B Interrupt */ 
    211 +#define FALCON_IRQ_GPTC_TC2B                   (INT_NUM_IM3_IRL0 + 19) 
    212 +/* GPTC Timer/Counter 3A Interrupt */ 
    213 +#define FALCON_IRQ_GPTC_TC3A                   (INT_NUM_IM3_IRL0 + 20) 
    214 +/* GPTC Timer/Counter 3B Interrupt */ 
    215 +#define FALCON_IRQ_GPTC_TC3B                   (INT_NUM_IM3_IRL0 + 21) 
    216 +/* DFEV0, Channel 1 Transmit Interrupt */ 
    217 +#define FALCON_IRQ_DFEV0_2TX                   (INT_NUM_IM3_IRL0 + 26) 
    218 +/* DFEV0, Channel 1 Receive Interrupt */ 
    219 +#define FALCON_IRQ_DFEV0_2RX                   (INT_NUM_IM3_IRL0 + 27) 
    220 +/* DFEV0, Channel 1 General Purpose Interrupt */ 
    221 +#define FALCON_IRQ_DFEV0_2GP                   (INT_NUM_IM3_IRL0 + 28) 
    222 +/* DFEV0, Channel 0 Transmit Interrupt */ 
    223 +#define FALCON_IRQ_DFEV0_1TX                   (INT_NUM_IM3_IRL0 + 29) 
    224 +/* DFEV0, Channel 0 Receive Interrupt */ 
    225 +#define FALCON_IRQ_DFEV0_1RX                   (INT_NUM_IM3_IRL0 + 30) 
    226 +/* DFEV0, Channel 0 General Purpose Interrupt */ 
    227 +#define FALCON_IRQ_DFEV0_1GP                   (INT_NUM_IM3_IRL0 + 31) 
    228 + 
    229 +/* ICTRLL 0 Error */ 
    230 +#define FALCON_IRQ_ICTRLL0_ERR                 (INT_NUM_IM4_IRL0 + 0) 
    231 +/* ICTRLL 1 Error */ 
    232 +#define FALCON_IRQ_ICTRLL1_ERR                 (INT_NUM_IM4_IRL0 + 1) 
    233 +/* ICTRLL 2 Error */ 
    234 +#define FALCON_IRQ_ICTRLL2_ERR                 (INT_NUM_IM4_IRL0 + 2) 
    235 +/* ICTRLL 3 Error */ 
    236 +#define FALCON_IRQ_ICTRLL3_ERR                 (INT_NUM_IM4_IRL0 + 3) 
    237 +/* OCTRLL 0 Error */ 
    238 +#define FALCON_IRQ_OCTRLL0_ERR                 (INT_NUM_IM4_IRL0 + 4) 
    239 +/* OCTRLL 1 Error */ 
    240 +#define FALCON_IRQ_OCTRLL1_ERR                 (INT_NUM_IM4_IRL0 + 5) 
    241 +/* OCTRLL 2 Error */ 
    242 +#define FALCON_IRQ_OCTRLL2_ERR                 (INT_NUM_IM4_IRL0 + 6) 
    243 +/* OCTRLL 3 Error */ 
    244 +#define FALCON_IRQ_OCTRLL3_ERR                 (INT_NUM_IM4_IRL0 + 7) 
    245 +/* ICTRLG Error */ 
    246 +#define FALCON_IRQ_ICTRLG_ERR                  (INT_NUM_IM4_IRL0 + 8) 
    247 +/* OCTRLG Error */ 
    248 +#define FALCON_IRQ_OCTRLG_ERR                  (INT_NUM_IM4_IRL0 + 9) 
    249 +/* IQM Error */ 
    250 +#define FALCON_IRQ_IQM_ERR                     (INT_NUM_IM4_IRL0 + 10) 
    251 +/* FSQM Error */ 
    252 +#define FALCON_IRQ_FSQM_ERR                    (INT_NUM_IM4_IRL0 + 11) 
    253 +/* TMU Error */ 
    254 +#define FALCON_IRQ_TMU_ERR                     (INT_NUM_IM4_IRL0 + 12) 
    255 +/* MPS Status Interrupt #0 (VPE1 to VPE0) */ 
    256 +#define FALCON_IRQ_MPS_IR0                     (INT_NUM_IM4_IRL0 + 14) 
    257 +/* MPS Status Interrupt #1 (VPE1 to VPE0) */ 
    258 +#define FALCON_IRQ_MPS_IR1                     (INT_NUM_IM4_IRL0 + 15) 
    259 +/* MPS Status Interrupt #2 (VPE1 to VPE0) */ 
    260 +#define FALCON_IRQ_MPS_IR2                     (INT_NUM_IM4_IRL0 + 16) 
    261 +/* MPS Status Interrupt #3 (VPE1 to VPE0) */ 
    262 +#define FALCON_IRQ_MPS_IR3                     (INT_NUM_IM4_IRL0 + 17) 
    263 +/* MPS Status Interrupt #4 (VPE1 to VPE0) */ 
    264 +#define FALCON_IRQ_MPS_IR4                     (INT_NUM_IM4_IRL0 + 18) 
    265 +/* MPS Status Interrupt #5 (VPE1 to VPE0) */ 
    266 +#define FALCON_IRQ_MPS_IR5                     (INT_NUM_IM4_IRL0 + 19) 
    267 +/* MPS Status Interrupt #6 (VPE1 to VPE0) */ 
    268 +#define FALCON_IRQ_MPS_IR6                     (INT_NUM_IM4_IRL0 + 20) 
    269 +/* MPS Status Interrupt #7 (VPE1 to VPE0) */ 
    270 +#define FALCON_IRQ_MPS_IR7                     (INT_NUM_IM4_IRL0 + 21) 
    271 +/* MPS Status Interrupt #8 (VPE1 to VPE0) */ 
    272 +#define FALCON_IRQ_MPS_IR8                     (INT_NUM_IM4_IRL0 + 22) 
    273 +/* VPE0 Exception Level Flag Interrupt */ 
    274 +#define FALCON_IRQ_VPE0_EXL                    (INT_NUM_IM4_IRL0 + 29) 
    275 +/* VPE0 Error Level Flag Interrupt */ 
    276 +#define FALCON_IRQ_VPE0_ERL                    (INT_NUM_IM4_IRL0 + 30) 
    277 +/* VPE0 Performance Monitoring Counter Interrupt */ 
    278 +#define FALCON_IRQ_VPE0_PMCIR                  (INT_NUM_IM4_IRL0 + 31) 
    279 + 
    280 +#endif /* _FALCON_IRQ__ */ 
    2811--- /dev/null 
    2822+++ b/arch/mips/include/asm/mach-lantiq/falcon/gpon_reg_base.h 
     
    58195539+#endif /* _icu0_reg_h */ 
    58205540--- /dev/null 
    5821 +++ b/arch/mips/include/asm/mach-lantiq/falcon/irq.h 
    5822 @@ -0,0 +1,31 @@ 
    5823 +/* 
    5824 + *   arch/mips/include/asm/mach-ifxmips/falcon/irq.h 
    5825 + * 
    5826 + *   This program is free software; you can redistribute it and/or modify 
    5827 + *   it under the terms of the GNU General Public License as published by 
    5828 + *   the Free Software Foundation; either version 2 of the License, or 
    5829 + *   (at your option) any later version. 
    5830 + * 
    5831 + *   This program is distributed in the hope that it will be useful, 
    5832 + *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
    5833 + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    5834 + *   GNU General Public License for more details. 
    5835 + * 
    5836 + *   You should have received a copy of the GNU General Public License 
    5837 + *   along with this program; if not, write to the Free Software 
    5838 + *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
    5839 + * 
    5840 + *   Copyright (C) 2010 Lantiq 
    5841 + * 
    5842 + */ 
    5843 + 
    5844 +#ifndef __FALCON_IRQ_H 
    5845 +#define __FALCON_IRQ_H 
    5846 + 
    5847 +#include <falcon_irq.h> 
    5848 + 
    5849 +#define NR_IRQS 264 
    5850 + 
    5851 +#include_next <irq.h> 
    5852 + 
    5853 +#endif 
    5854 --- /dev/null 
    58555541+++ b/arch/mips/include/asm/mach-lantiq/falcon/status_reg.h 
    58565542@@ -0,0 +1,529 @@ 
  • trunk/target/linux/lantiq/patches-3.0/202-owrt-atm.patch

    r28404 r28405  
     1Index: linux-3.0.3/arch/mips/lantiq/irq.c 
     2=================================================================== 
     3--- linux-3.0.3.orig/arch/mips/lantiq/irq.c     2011-09-29 20:43:07.000000000 +0200 
     4+++ linux-3.0.3/arch/mips/lantiq/irq.c  2011-09-29 20:45:14.785132132 +0200 
     5@@ -9,6 +9,7 @@ 
     6  
     7 #include <linux/interrupt.h> 
     8 #include <linux/ioport.h> 
     9+#include <linux/module.h> 
     10  
     11 #include <asm/bootinfo.h> 
     12 #include <asm/irq_cpu.h> 
     13@@ -102,6 +103,7 @@ 
     14        ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier); 
     15        ltq_icu_w32((1 << irq_nr), isr); 
     16 } 
     17+EXPORT_SYMBOL(ltq_mask_and_ack_irq); 
     18  
     19 static void ltq_ack_irq(struct irq_data *d) 
     20 { 
    121--- a/arch/mips/mm/cache.c 
    222+++ b/arch/mips/mm/cache.c 
  • trunk/target/linux/lantiq/patches-3.0/203-owrt-cmdline.patch

    r28404 r28405  
    1 --- a/arch/mips/lantiq/prom.c 
    2 +++ b/arch/mips/lantiq/prom.c 
    3 @@ -39,6 +39,34 @@ void prom_free_prom_memory(void) 
     1Index: linux-3.0.3/arch/mips/lantiq/prom.c 
     2=================================================================== 
     3--- linux-3.0.3.orig/arch/mips/lantiq/prom.c    2011-10-02 15:49:12.000000000 +0200 
     4+++ linux-3.0.3/arch/mips/lantiq/prom.c 2011-10-02 15:50:34.614270672 +0200 
     5@@ -43,6 +43,34 @@ 
    46 { 
    57 } 
     
    3638 { 
    3739        int argc = fw_arg0; 
    38 @@ -55,6 +83,7 @@ static void __init prom_init_cmdline(voi 
     40@@ -59,6 +87,7 @@ 
    3941                        strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); 
    4042                } 
     
    4345 } 
    4446  
    45  void __init prom_init(void) 
     47 void __iomem *ltq_remap_resource(struct resource *res) 
  • trunk/target/linux/lantiq/vr9/config-default

    r28404 r28405  
    2525# CONFIG_ISDN is not set 
    2626CONFIG_LANTIQ_ETOP=y 
    27 CONFIG_LANTIQ_MACH_ARV45XX=y 
    28 CONFIG_LANTIQ_MACH_EASY50712=y 
    29 # CONFIG_LANTIQ_MACH_NETGEAR is not set 
    30 CONFIG_LANTIQ_MACH_GIGASX76X=y 
     27CONFIG_LANTIQ_MACH_FRITZ3370=y 
    3128CONFIG_MACH_NO_WESTBRIDGE=y 
    3229# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set 
     
    4037CONFIG_RTL8306_PHY=y 
    4138# CONFIG_SOC_AMAZON_SE is not set 
     39CONFIG_SOC_VR9=y 
    4240# CONFIG_SOC_FALCON is not set 
    4341CONFIG_SOC_TYPE_XWAY=y 
    44 CONFIG_SOC_XWAY=y 
     42# CONFIG_SOC_XWAY is not set 
    4543CONFIG_SPI=y 
    4644CONFIG_SPI_BITBANG=y 
     
    5048CONFIG_USB_SUPPORT=y 
    5149CONFIG_XZ_DEC=y 
     50CONFIG_SPI_XWAY=y 
  • trunk/target/linux/lantiq/vr9/target.mk

    r28404 r28405  
    11ARCH:=mips 
    2 SUBTARGET:=ase 
    3 BOARDNAME:=Amazon-SE 
     2SUBTARGET:=vr9 
     3BOARDNAME:=VR9 
    44FEATURES:=squashfs jffs2 atm 
    55 
    6 DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app 
     6DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl-vr9 ltq-dsl-app swconfig 
    77 
    88define Target/Description 
    9         Lantiq ASE 
     9        Lantiq VR9 
    1010endef 
Note: See TracChangeset for help on using the changeset viewer.