Merge git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial
authorLinus Torvalds <torvalds@g5.osdl.org>
Tue, 3 Oct 2006 23:35:11 +0000 (16:35 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 3 Oct 2006 23:35:11 +0000 (16:35 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial: (39 commits)
  Add missing maintainer countries in CREDITS
  Fix bytes <-> kilobytes  typo in Kconfig for ramdisk
  fix a typo in Documentation/pi-futex.txt
  BUG_ON conversion for fs/xfs/
  BUG_ON() conversion in fs/nfsd/
  BUG_ON conversion for fs/reiserfs
  BUG_ON cleanups in arch/i386
  BUG_ON cleanup in drivers/net/tokenring/
  BUG_ON cleanup for drivers/md/
  kerneldoc-typo in led-class.c
  debugfs: spelling fix
  rcutorture: Fix incorrect description of default for nreaders parameter
  parport: Remove space in function calls
  Michal Wronski: update contact info
  Spelling fix: "control" instead of "cotrol"
  reboot parameter in Documentation/kernel-parameters.txt
  Fix copy&waste bug in comment in scripts/kernel-doc
  remove duplicate "until" from kernel/workqueue.c
  ite_gpio fix tabbage
  fix file specification in comments
  ...

Fixed trivial path conflicts due to removed files:
   arch/mips/dec/boot/decstation.c, drivers/char/ite_gpio.c

131 files changed:
Documentation/feature-removal-schedule.txt
Documentation/video4linux/CARDLIST.cx88
Documentation/video4linux/CARDLIST.saa7134
MAINTAINERS
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/configs/decstation_defconfig
arch/mips/configs/it8172_defconfig [deleted file]
arch/mips/configs/ivr_defconfig [deleted file]
arch/mips/dec/boot/Makefile [deleted file]
arch/mips/dec/boot/decstation.c [deleted file]
arch/mips/dec/boot/ld.ecoff [deleted file]
arch/mips/dec/time.c
arch/mips/ite-boards/Kconfig [deleted file]
arch/mips/ite-boards/generic/Makefile [deleted file]
arch/mips/ite-boards/generic/dbg_io.c [deleted file]
arch/mips/ite-boards/generic/irq.c [deleted file]
arch/mips/ite-boards/generic/it8172_cir.c [deleted file]
arch/mips/ite-boards/generic/it8172_setup.c [deleted file]
arch/mips/ite-boards/generic/lpc.c [deleted file]
arch/mips/ite-boards/generic/pmon_prom.c [deleted file]
arch/mips/ite-boards/generic/puts.c [deleted file]
arch/mips/ite-boards/generic/reset.c [deleted file]
arch/mips/ite-boards/generic/time.c [deleted file]
arch/mips/ite-boards/ivr/Makefile [deleted file]
arch/mips/ite-boards/ivr/README [deleted file]
arch/mips/ite-boards/ivr/init.c [deleted file]
arch/mips/ite-boards/qed-4n-s01b/Makefile [deleted file]
arch/mips/ite-boards/qed-4n-s01b/README [deleted file]
arch/mips/ite-boards/qed-4n-s01b/init.c [deleted file]
arch/mips/kernel/time.c
arch/mips/mm/init.c
arch/mips/pci/Makefile
arch/mips/pci/fixup-ite8172g.c [deleted file]
arch/mips/pci/fixup-ivr.c [deleted file]
arch/mips/pci/fixup-sb1250.c
arch/mips/pci/ops-it8172.c [deleted file]
arch/mips/sibyte/bcm1480/irq.c
arch/mips/sibyte/sb1250/irq.c
drivers/char/.gitignore
drivers/char/Kconfig
drivers/char/Makefile
drivers/char/ite_gpio.c [deleted file]
drivers/char/qtronixmap.c_shipped [deleted file]
drivers/char/qtronixmap.map [deleted file]
drivers/char/watchdog/Kconfig
drivers/char/watchdog/Makefile
drivers/char/watchdog/iTCO_wdt.c [new file with mode: 0644]
drivers/char/watchdog/pnx4008_wdt.c
drivers/ide/Kconfig
drivers/ide/pci/Makefile
drivers/ide/pci/it8172.c [deleted file]
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_frontend.h
drivers/media/dvb/dvb-usb/Kconfig
drivers/media/dvb/dvb-usb/Makefile
drivers/media/dvb/dvb-usb/a800.c
drivers/media/dvb/dvb-usb/cxusb.c
drivers/media/dvb/dvb-usb/dib0700.h [new file with mode: 0644]
drivers/media/dvb/dvb-usb/dib0700_core.c [new file with mode: 0644]
drivers/media/dvb/dvb-usb/dib0700_devices.c [new file with mode: 0644]
drivers/media/dvb/dvb-usb/dib07x0.h [new file with mode: 0644]
drivers/media/dvb/dvb-usb/dibusb-common.c
drivers/media/dvb/dvb-usb/dibusb-mb.c
drivers/media/dvb/dvb-usb/dibusb-mc.c
drivers/media/dvb/dvb-usb/dibusb.h
drivers/media/dvb/dvb-usb/digitv.c
drivers/media/dvb/dvb-usb/dtt200u.c
drivers/media/dvb/dvb-usb/dvb-usb-common.h
drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
drivers/media/dvb/dvb-usb/dvb-usb-i2c.c
drivers/media/dvb/dvb-usb/dvb-usb-ids.h
drivers/media/dvb/dvb-usb/dvb-usb-init.c
drivers/media/dvb/dvb-usb/dvb-usb-remote.c
drivers/media/dvb/dvb-usb/dvb-usb-urb.c
drivers/media/dvb/dvb-usb/dvb-usb.h
drivers/media/dvb/dvb-usb/gp8psk.c
drivers/media/dvb/dvb-usb/nova-t-usb2.c
drivers/media/dvb/dvb-usb/umt-010.c
drivers/media/dvb/dvb-usb/usb-urb.c [new file with mode: 0644]
drivers/media/dvb/dvb-usb/vp702x-fe.c
drivers/media/dvb/dvb-usb/vp702x.c
drivers/media/dvb/dvb-usb/vp702x.h
drivers/media/dvb/dvb-usb/vp7045.c
drivers/media/dvb/frontends/cx24123.c
drivers/media/dvb/frontends/dib3000mc.c
drivers/media/dvb/frontends/dib3000mc.h
drivers/media/dvb/frontends/mt2060.c
drivers/media/dvb/frontends/mt2060.h
drivers/media/video/Kconfig
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-core.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88-i2c.c
drivers/media/video/cx88/cx88-mpeg.c
drivers/media/video/cx88/cx88-tvaudio.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/cx88/cx88.h
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/msp3400-driver.c
drivers/media/video/msp3400-driver.h
drivers/media/video/msp3400-kthreads.c
drivers/media/video/pvrusb2/Kconfig
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/pvrusb2/pvrusb2-hdw.h
drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c
drivers/media/video/pvrusb2/pvrusb2-v4l2.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-dvb.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/video-buf.c
include/asm-mips/bootinfo.h
include/asm-mips/it8172/it8172.h [deleted file]
include/asm-mips/it8172/it8172_cir.h [deleted file]
include/asm-mips/it8172/it8172_dbg.h [deleted file]
include/asm-mips/it8172/it8172_int.h [deleted file]
include/asm-mips/it8172/it8172_pci.h [deleted file]
include/asm-mips/it8712.h [deleted file]
include/asm-mips/ptrace.h
include/asm-mips/serial.h
include/linux/ite_gpio.h [deleted file]
include/linux/pci_ids.h
include/linux/videodev2.h
include/media/audiochip.h
sound/oss/Kconfig
sound/oss/Makefile
sound/oss/ite8172.c [deleted file]

index 486638f24b4f69ceb0c42643496fad657b7a9df4..42b95e0ad558d3de7fd1cd50c0455ba164cfc26c 100644 (file)
@@ -211,42 +211,6 @@ Who:       Nick Piggin <npiggin@suse.de>
 
 ---------------------------
 
-What:  Support for the Momentum / PMC-Sierra Jaguar ATX evaluation board
-When:  September 2006
-Why:   Does no longer build since quite some time, and was never popular,
-       due to the platform being replaced by successor models.  Apparently
-       no user base left.  It also is one of the last users of
-       WANT_PAGE_VIRTUAL.
-Who:   Ralf Baechle <ralf@linux-mips.org>
-
----------------------------
-
-What:  Support for the Momentum Ocelot, Ocelot 3, Ocelot C and Ocelot G
-When:  September 2006
-Why:   Some do no longer build and apparently there is no user base left
-       for these platforms.
-Who:   Ralf Baechle <ralf@linux-mips.org>
-
----------------------------
-
-What:  Support for MIPS Technologies' Altas and SEAD evaluation board
-When:  September 2006
-Why:   Some do no longer build and apparently there is no user base left
-       for these platforms.  Hardware out of production since several years.
-Who:   Ralf Baechle <ralf@linux-mips.org>
-
----------------------------
-
-What:  Support for the IT8172-based platforms, ITE 8172G and Globespan IVR
-When:  September 2006
-Why:   Code does no longer build since at least 2.6.0,  apparently there is
-       no user base left for these platforms.  Hardware out of production
-       since several years and hardly a trace of the manufacturer left on
-       the net.
-Who:   Ralf Baechle <ralf@linux-mips.org>
-
----------------------------
-
 What:  Interrupt only SA_* flags
 When:  Januar 2007
 Why:   The interrupt related SA_* flags are replaced by IRQF_* to move them
index 669a09aa5bb463934d96c25a76dc0346b8611fe8..126e59d935cd2348f162fc06aefe2538478584c4 100644 (file)
@@ -16,7 +16,7 @@
  15 -> DViCO FusionHDTV DVB-T1                             [18ac:db00]
  16 -> KWorld LTV883RF
  17 -> DViCO FusionHDTV 3 Gold-Q                           [18ac:d810,18ac:d800]
- 18 -> Hauppauge Nova-T DVB-T                              [0070:9002,0070:9001]
+ 18 -> Hauppauge Nova-T DVB-T                              [0070:9002,0070:9001,0070:9000]
  19 -> Conexant DVB-T reference design                     [14f1:0187]
  20 -> Provideo PV259                                      [1540:2580]
  21 -> DViCO FusionHDTV DVB-T Plus                         [18ac:db10,18ac:db11]
@@ -41,7 +41,7 @@
  40 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid                [0070:9400,0070:9402]
  41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)  [0070:9800,0070:9802]
  42 -> digitalnow DNTV Live! DVB-T Pro                     [1822:0025,1822:0019]
- 43 -> KWorld/VStream XPert DVB-T with cx22702             [17de:08a1]
+ 43 -> KWorld/VStream XPert DVB-T with cx22702             [17de:08a1,12ab:2300]
  44 -> DViCO FusionHDTV DVB-T Dual Digital                 [18ac:db50,18ac:db54]
  45 -> KWorld HardwareMpegTV XPert                         [17de:0840]
  46 -> DViCO FusionHDTV DVB-T Hybrid                       [18ac:db40,18ac:db44]
index 94cf695b1378ce8f79dd763448d3303909b76d19..6fb82ac3bef09e6c40aa48c76b37f42d21ad9c5c 100644 (file)
@@ -97,3 +97,4 @@
  96 -> Medion Md8800 Quadro                     [16be:0007,16be:0008]
  97 -> LifeView FlyDVB-S /Acorp TV134DS         [5168:0300,4e42:0300]
  98 -> Proteus Pro 2309                         [0919:2003]
+ 99 -> AVerMedia TV Hybrid A16AR                [1461:2c00]
index 28cd70cf3e9912077da3f5e21ba14fb3e250dd43..1c6223d3ce70b465561e41616e9aa2179c52972e 100644 (file)
@@ -144,11 +144,9 @@ L: netdev@vger.kernel.org
 S:     Maintained
 
 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
-P:     Russell King
-M:     rmk+serial@arm.linux.org.uk
 L:     linux-serial@vger.kernel.org
 W:     http://serial.sourceforge.net
-S:     Maintained
+S:     Orphan
 
 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
 P:     Paul Gortmaker
@@ -1986,9 +1984,7 @@ W:        http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html
 S:     Maintained
 
 MULTIMEDIA CARD (MMC) SUBSYSTEM
-P:     Russell King
-M:     rmk+mmc@arm.linux.org.uk
-S:     Maintained
+S:     Orphan
 
 MULTISOUND SOUND DRIVER
 P:     Andrew Veliath
index 87cee341eb54d1318fa2c117be81f07d50edb50d..bfab055ad7cc3d98e358b21c60e6200bb10c557a 100644 (file)
@@ -203,39 +203,6 @@ config MIPS_EV64120
          <http://www.marvell.com/>.  Say Y here if you wish to build a
          kernel for this platform.
 
-config MIPS_IVR
-       bool "Globespan IVR board"
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select ITE_BOARD_GEN
-       select SYS_HAS_CPU_NEVADA
-       select SYS_SUPPORTS_32BIT_KERNEL
-       select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       help
-         This is an evaluation board built by Globespan to showcase thir
-         iVR (Internet Video Recorder) design. It utilizes a QED RM5231
-         R5000 MIPS core. More information can be found out their website
-         located at <http://www.globespan.net/>. Say Y here if you wish to
-         build a kernel for this platform.
-
-config MIPS_ITE8172
-       bool "ITE 8172G board"
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select ITE_BOARD_GEN
-       select SYS_HAS_CPU_R5432
-       select SYS_HAS_CPU_NEVADA
-       select SYS_SUPPORTS_32BIT_KERNEL
-       select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       help
-         Ths is an evaluation board made by ITE <http://www.ite.com.tw/>
-         with ATX form factor that utilizes a MIPS R5000 to work with its
-         ITE8172G companion internet appliance chip. The MIPS core can be
-         either a NEC Vr5432 or QED RM5231. Say Y here if you wish to build
-         a kernel for this platform.
-
 config MACH_JAZZ
        bool "Jazz family of machines"
        select ARC
@@ -804,7 +771,6 @@ endchoice
 source "arch/mips/ddb5xxx/Kconfig"
 source "arch/mips/gt64120/ev64120/Kconfig"
 source "arch/mips/jazz/Kconfig"
-source "arch/mips/ite-boards/Kconfig"
 source "arch/mips/lasat/Kconfig"
 source "arch/mips/momentum/Kconfig"
 source "arch/mips/pmc-sierra/Kconfig"
@@ -837,6 +803,10 @@ config GENERIC_CALIBRATE_DELAY
        bool
        default y
 
+config GENERIC_TIME
+       bool
+       default y
+
 config SCHED_NO_NO_OMIT_FRAME_POINTER
        bool
        default y
@@ -964,9 +934,6 @@ config MIPS_RM9122
 config PCI_MARVELL
        bool
 
-config ITE_BOARD_GEN
-       bool
-
 config SOC_AU1000
        bool
        select SOC_AU1X00
@@ -1050,16 +1017,6 @@ config AU1X00_USB_DEVICE
        depends on MIPS_PB1500 || MIPS_PB1100 || MIPS_PB1000
        default n
 
-config IT8172_CIR
-       bool
-       depends on MIPS_ITE8172 || MIPS_IVR
-       default y
-
-config IT8712
-       bool
-       depends on MIPS_ITE8172
-       default y
-
 config BOOT_ELF32
        bool
 
index e521826b423459bc5e3c9ff018954420f346403c..2124350ab94dfa88e609e7fe193f09d45c6c5bf7 100644 (file)
@@ -286,19 +286,6 @@ core-$(CONFIG_WR_PPMC)             += arch/mips/gt64120/wrppmc/
 cflags-$(CONFIG_WR_PPMC)               += -Iinclude/asm-mips/mach-wrppmc
 load-$(CONFIG_WR_PPMC)         += 0xffffffff80100000
 
-#
-# Globespan IVR eval board with QED 5231 CPU
-#
-core-$(CONFIG_ITE_BOARD_GEN)   += arch/mips/ite-boards/generic/
-core-$(CONFIG_MIPS_IVR)                += arch/mips/ite-boards/ivr/
-load-$(CONFIG_MIPS_IVR)                += 0xffffffff80100000
-
-#
-# ITE 8172 eval board with QED 5231 CPU
-#
-core-$(CONFIG_MIPS_ITE8172)    += arch/mips/ite-boards/qed-4n-s01b/
-load-$(CONFIG_MIPS_ITE8172)    += 0xffffffff80100000
-
 #
 # For all MIPS, Inc. eval boards
 #
index be901df7fefae8f7619cdbb50ee053f262a486f5..fe1387eb83c9850cd49d94c98a4888d0f662b6df 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc1
-# Thu Jul  6 10:04:01 2006
+# Linux kernel version: 2.6.18
+# Tue Oct  3 11:57:53 2006
 #
 CONFIG_MIPS=y
 
@@ -167,27 +167,28 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
-CONFIG_RELAY=y
+# CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+# CONFIG_SYSCTL_SYSCALL is not set
 CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
 # CONFIG_HOTPLUG is not set
 CONFIG_PRINTK=y
 CONFIG_BUG=y
 CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
-CONFIG_RT_MUTEXES=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_SHMEM=y
 CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 # CONFIG_SLOB is not set
@@ -205,6 +206,7 @@ CONFIG_KMOD=y
 #
 # Block layer
 #
+CONFIG_BLOCK=y
 # CONFIG_LBD is not set
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
@@ -231,7 +233,6 @@ CONFIG_MMU=y
 #
 # PCCARD (PCMCIA/CardBus) support
 #
-# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -258,9 +259,10 @@ CONFIG_PACKET_MMAP=y
 CONFIG_UNIX=y
 CONFIG_XFRM=y
 # CONFIG_XFRM_USER is not set
-# CONFIG_NET_KEY is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+CONFIG_NET_KEY=m
 CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
 CONFIG_IP_FIB_HASH=y
 CONFIG_IP_PNP=y
@@ -269,22 +271,37 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INET_TUNNEL=m
 CONFIG_INET_XFRM_MODE_TRANSPORT=m
 CONFIG_INET_XFRM_MODE_TUNNEL=m
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_MIP6=y
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+# CONFIG_IPV6_TUNNEL is not set
+CONFIG_IPV6_SUBTREES=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
 CONFIG_NETWORK_SECMARK=y
 # CONFIG_NETFILTER is not set
 
@@ -304,14 +321,13 @@ CONFIG_NETWORK_SECMARK=y
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
+CONFIG_VLAN_8021Q=m
 # CONFIG_DECNET is not set
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 
@@ -327,13 +343,8 @@ CONFIG_NETWORK_SECMARK=y
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_SOFTMAC=m
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-CONFIG_WIRELESS_EXT=y
+# CONFIG_IEEE80211 is not set
+CONFIG_FIB_RULES=y
 
 #
 # Device Drivers
@@ -344,8 +355,6 @@ CONFIG_WIRELESS_EXT=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -387,8 +396,9 @@ CONFIG_BLK_DEV_LOOP=m
 #
 # SCSI device support
 #
-CONFIG_RAID_ATTRS=m
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=y
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -410,12 +420,13 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 CONFIG_SCSI_SPI_ATTRS=m
 # CONFIG_SCSI_FC_ATTRS is not set
 CONFIG_SCSI_ISCSI_ATTRS=m
 CONFIG_SCSI_SAS_ATTRS=m
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
@@ -423,9 +434,13 @@ CONFIG_SCSI_SAS_ATTRS=m
 CONFIG_ISCSI_TCP=m
 CONFIG_SCSI_DECNCR=y
 # CONFIG_SCSI_DECSII is not set
-# CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_DEBUG is not set
 
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
 #
 # Multi-device support (RAID and LVM)
 #
@@ -456,18 +471,7 @@ CONFIG_NETDEVICES=y
 #
 # PHY device support
 #
-CONFIG_PHYLIB=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_SMSC_PHY=m
+# CONFIG_PHYLIB is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -712,7 +716,12 @@ CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
 CONFIG_EXT2_FS_SECURITY=y
 # CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
@@ -747,11 +756,13 @@ CONFIG_FUSE_FS=m
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
 CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
+CONFIG_CONFIGFS_FS=y
 
 #
 # Miscellaneous filesystems
@@ -769,7 +780,7 @@ CONFIG_RAMFS=y
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_SYSV_FS is not set
 CONFIG_UFS_FS=y
-# CONFIG_UFS_FS_WRITE is not set
+CONFIG_UFS_FS_WRITE=y
 # CONFIG_UFS_DEBUG is not set
 
 #
@@ -777,24 +788,25 @@ CONFIG_UFS_FS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V3_ACL=y
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
 # CONFIG_9P_FS is not set
+CONFIG_GENERIC_ACL=y
 
 #
 # Partition Types
@@ -832,44 +844,29 @@ CONFIG_ULTRIX_PARTITION=y
 #
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
 CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
-CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE=""
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_KGDB is not set
-# CONFIG_RUNTIME_DEBUG is not set
-# CONFIG_MIPS_UNCACHED is not set
 
 #
 # Security options
 #
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
+# CONFIG_KEYS is not set
 # CONFIG_SECURITY is not set
 
 #
 # Cryptographic options
 #
 CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=m
 CONFIG_CRYPTO_HMAC=y
 CONFIG_CRYPTO_NULL=m
 CONFIG_CRYPTO_MD4=m
@@ -879,9 +876,12 @@ CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
 CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
 CONFIG_CRYPTO_DES=m
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
 CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_CAST5=m
@@ -903,7 +903,7 @@ CONFIG_CRYPTO_CRC32C=m
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
-CONFIG_CRC16=m
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=m
diff --git a/arch/mips/configs/it8172_defconfig b/arch/mips/configs/it8172_defconfig
deleted file mode 100644 (file)
index 18d20fb..0000000
+++ /dev/null
@@ -1,964 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc1
-# Thu Jul  6 10:04:11 2006
-#
-CONFIG_MIPS=y
-
-#
-# Machine selection
-#
-# CONFIG_MIPS_MTX1 is not set
-# CONFIG_MIPS_BOSPORUS is not set
-# CONFIG_MIPS_PB1000 is not set
-# CONFIG_MIPS_PB1100 is not set
-# CONFIG_MIPS_PB1500 is not set
-# CONFIG_MIPS_PB1550 is not set
-# CONFIG_MIPS_PB1200 is not set
-# CONFIG_MIPS_DB1000 is not set
-# CONFIG_MIPS_DB1100 is not set
-# CONFIG_MIPS_DB1500 is not set
-# CONFIG_MIPS_DB1550 is not set
-# CONFIG_MIPS_DB1200 is not set
-# CONFIG_MIPS_MIRAGE is not set
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_MIPS_COBALT is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MIPS_EV64120 is not set
-# CONFIG_MIPS_IVR is not set
-CONFIG_MIPS_ITE8172=y
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_LASAT is not set
-# CONFIG_MIPS_ATLAS is not set
-# CONFIG_MIPS_MALTA is not set
-# CONFIG_MIPS_SEAD is not set
-# CONFIG_WR_PPMC is not set
-# CONFIG_MIPS_SIM is not set
-# CONFIG_MOMENCO_JAGUAR_ATX is not set
-# CONFIG_MOMENCO_OCELOT is not set
-# CONFIG_MOMENCO_OCELOT_3 is not set
-# CONFIG_MOMENCO_OCELOT_C is not set
-# CONFIG_MOMENCO_OCELOT_G is not set
-# CONFIG_MIPS_XXS1500 is not set
-# CONFIG_PNX8550_V2PCI is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_DDB5477 is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_QEMU is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_PTSWARM is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SNI_RM200_PCI is not set
-# CONFIG_TOSHIBA_JMR3927 is not set
-# CONFIG_TOSHIBA_RBTX4927 is not set
-# CONFIG_TOSHIBA_RBTX4938 is not set
-# CONFIG_IT8172_REVC is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-# CONFIG_CPU_BIG_ENDIAN is not set
-CONFIG_CPU_LITTLE_ENDIAN=y
-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-CONFIG_ITE_BOARD_GEN=y
-CONFIG_IT8172_CIR=y
-CONFIG_IT8712=y
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-
-#
-# CPU selection
-#
-# CONFIG_CPU_MIPS32_R1 is not set
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R6000 is not set
-CONFIG_CPU_NEVADA=y
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_SYS_HAS_CPU_R5432=y
-CONFIG_SYS_HAS_CPU_NEVADA=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
-
-#
-# Kernel type
-#
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_64KB is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_VPE_LOADER is not set
-CONFIG_CPU_HAS_LLSC=y
-CONFIG_CPU_HAS_SYNC=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_HZ_100 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-CONFIG_HZ_1000=y
-# CONFIG_HZ_1024 is not set
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_HZ=1000
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-CONFIG_RELAY=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_HOTPLUG is not set
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_RT_MUTEXES=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_LSF is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-#
-CONFIG_HW_HAS_PCI=y
-# CONFIG_PCI is not set
-CONFIG_MMU=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_TRAD_SIGNALS=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=y
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=m
-CONFIG_INET_XFRM_MODE_TUNNEL=m
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_NETWORK_SECMARK=y
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_SOFTMAC=m
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-CONFIG_CONNECTOR=m
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_PARTITIONS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-# CONFIG_MTD_BLOCK is not set
-# CONFIG_MTD_BLOCK_RO is not set
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_JEDECPROBE is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_AMDSTD is not set
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-# CONFIG_MTD_RAM is not set
-# CONFIG_MTD_ROM is not set
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_PHYSMAP_START=0x8000000
-CONFIG_MTD_PHYSMAP_LEN=0x2000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-# CONFIG_MTD_PLATRAM is not set
-
-#
-# Self-contained MTD device drivers
-#
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-# CONFIG_MTD_NAND is not set
-
-#
-# OneNAND Flash Device Drivers
-#
-# CONFIG_MTD_ONENAND is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_CDROM_PKTCDVD_BUFFERS=8
-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-CONFIG_ATA_OVER_ETH=m
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-CONFIG_RAID_ATTRS=m
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# PHY device support
-#
-CONFIG_PHYLIB=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_SMSC_PHY=m
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_DM9000 is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_LIBPS2 is not set
-CONFIG_SERIO_RAW=m
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_QTRONIX_KEYBOARD is not set
-# CONFIG_IT8172_SCR0 is not set
-# CONFIG_IT8172_SCR1 is not set
-# CONFIG_ITE_GPIO is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-# CONFIG_SND is not set
-
-#
-# Open Sound System
-#
-CONFIG_SOUND_PRIME=y
-CONFIG_SOUND_IT8172=y
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
-
-#
-# USB support
-#
-# CONFIG_USB_ARCH_HAS_HCD is not set
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-# CONFIG_MSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-# CONFIG_TMPFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFFS2_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-# CONFIG_NLS is not set
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DEBUG_FS is not set
-CONFIG_CROSSCOMPILE=y
-CONFIG_CMDLINE=""
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-CONFIG_CRC16=m
-CONFIG_CRC32=m
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_PLIST=y
diff --git a/arch/mips/configs/ivr_defconfig b/arch/mips/configs/ivr_defconfig
deleted file mode 100644 (file)
index 99831d0..0000000
+++ /dev/null
@@ -1,920 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc1
-# Thu Jul  6 10:04:12 2006
-#
-CONFIG_MIPS=y
-
-#
-# Machine selection
-#
-# CONFIG_MIPS_MTX1 is not set
-# CONFIG_MIPS_BOSPORUS is not set
-# CONFIG_MIPS_PB1000 is not set
-# CONFIG_MIPS_PB1100 is not set
-# CONFIG_MIPS_PB1500 is not set
-# CONFIG_MIPS_PB1550 is not set
-# CONFIG_MIPS_PB1200 is not set
-# CONFIG_MIPS_DB1000 is not set
-# CONFIG_MIPS_DB1100 is not set
-# CONFIG_MIPS_DB1500 is not set
-# CONFIG_MIPS_DB1550 is not set
-# CONFIG_MIPS_DB1200 is not set
-# CONFIG_MIPS_MIRAGE is not set
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_MIPS_COBALT is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MIPS_EV64120 is not set
-CONFIG_MIPS_IVR=y
-# CONFIG_MIPS_ITE8172 is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_LASAT is not set
-# CONFIG_MIPS_ATLAS is not set
-# CONFIG_MIPS_MALTA is not set
-# CONFIG_MIPS_SEAD is not set
-# CONFIG_WR_PPMC is not set
-# CONFIG_MIPS_SIM is not set
-# CONFIG_MOMENCO_JAGUAR_ATX is not set
-# CONFIG_MOMENCO_OCELOT is not set
-# CONFIG_MOMENCO_OCELOT_3 is not set
-# CONFIG_MOMENCO_OCELOT_C is not set
-# CONFIG_MOMENCO_OCELOT_G is not set
-# CONFIG_MIPS_XXS1500 is not set
-# CONFIG_PNX8550_V2PCI is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_DDB5477 is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_QEMU is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_PTSWARM is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SNI_RM200_PCI is not set
-# CONFIG_TOSHIBA_JMR3927 is not set
-# CONFIG_TOSHIBA_RBTX4927 is not set
-# CONFIG_TOSHIBA_RBTX4938 is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-# CONFIG_CPU_BIG_ENDIAN is not set
-CONFIG_CPU_LITTLE_ENDIAN=y
-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-CONFIG_ITE_BOARD_GEN=y
-CONFIG_IT8172_CIR=y
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-
-#
-# CPU selection
-#
-# CONFIG_CPU_MIPS32_R1 is not set
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R6000 is not set
-CONFIG_CPU_NEVADA=y
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_SYS_HAS_CPU_NEVADA=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
-
-#
-# Kernel type
-#
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_64KB is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_VPE_LOADER is not set
-CONFIG_CPU_HAS_LLSC=y
-CONFIG_CPU_HAS_SYNC=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_HZ_100 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-CONFIG_HZ_1000=y
-# CONFIG_HZ_1024 is not set
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_HZ=1000
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-CONFIG_RELAY=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_RT_MUTEXES=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-# CONFIG_LBD is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_LSF is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-#
-CONFIG_HW_HAS_PCI=y
-CONFIG_PCI=y
-CONFIG_MMU=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_TRAD_SIGNALS=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=y
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=m
-CONFIG_INET_XFRM_MODE_TUNNEL=m
-CONFIG_INET_DIAG=y
-CONFIG_INET_TCP_DIAG=y
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_NETWORK_SECMARK=y
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_SOFTMAC=m
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=m
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-CONFIG_CONNECTOR=m
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_CDROM_PKTCDVD_BUFFERS=8
-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-CONFIG_ATA_OVER_ETH=m
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-CONFIG_RAID_ATTRS=m
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-CONFIG_PHYLIB=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_SMSC_PHY=m
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_BNX2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-CONFIG_SERIO_RAW=m
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-CONFIG_QTRONIX_KEYBOARD=y
-CONFIG_IT8172_SCR0=y
-CONFIG_IT8172_SCR1=y
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_RTC=y
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-# CONFIG_USB is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
-# CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-# CONFIG_MSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_SYSFS=y
-# CONFIG_TMPFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-# CONFIG_NLS is not set
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DEBUG_FS is not set
-CONFIG_CROSSCOMPILE=y
-CONFIG_CMDLINE=""
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_TGR192=m
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-CONFIG_CRC16=m
-CONFIG_CRC32=m
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_PLIST=y
diff --git a/arch/mips/dec/boot/Makefile b/arch/mips/dec/boot/Makefile
deleted file mode 100644 (file)
index bcea416..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for the DECstation family specific parts of the kernel
-#
-
-netboot: all
-       $(LD) -N -G 0 -T ld.ecoff ../../boot/zImage \
-               dec_boot.o ramdisk.img -o nbImage
-
-obj-y   := decstation.o
-
-clean:
-       rm -f nbImage
diff --git a/arch/mips/dec/boot/decstation.c b/arch/mips/dec/boot/decstation.c
deleted file mode 100644 (file)
index f2fb82b..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * arch/mips/dec/boot/decstation.c
- */
-#include <asm/sections.h>
-
-#define RELOC
-#define INITRD
-#define DEBUG_BOOT
-
-/*
- * Magic number indicating REX PROM available on DECSTATION.
- */
-#define        REX_PROM_MAGIC          0x30464354
-
-#define REX_PROM_CLEARCACHE    0x7c/4
-#define REX_PROM_PRINTF                0x30/4
-
-#define VEC_RESET              0xBFC00000              /* Prom base address */
-#define        PMAX_PROM_ENTRY(x)      (VEC_RESET+((x)*8))     /* Prom jump table */
-#define        PMAX_PROM_PRINTF        PMAX_PROM_ENTRY(17)
-
-#define PARAM  (k_start + 0x2000)
-
-#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
-#define INITRD_START (*(unsigned long *) (PARAM+0x218))
-#define INITRD_SIZE (*(unsigned long *) (PARAM+0x21c))
-
-extern int _ftext;                     /* begin and end of kernel image */
-extern void kernel_entry(int, char **, unsigned long, int *);
-
-void * memcpy(void * dest, const void *src, unsigned int count)
-{
-       unsigned long *tmp = (unsigned long *) dest, *s = (unsigned long *) src;
-
-       count >>= 2;
-       while (count--)
-               *tmp++ = *s++;
-
-       return dest;
-}
-
-void dec_entry(int argc, char **argv,
-              unsigned long magic, int *prom_vec)
-{
-       void (*rex_clear_cache)(void);
-       int (*prom_printf)(char *, ...);
-       unsigned long k_start, len;
-
-       /*
-        * The DS5100 leaves cpu with BEV enabled, clear it.
-        */
-       asm(    "lui\t$8,0x3000\n\t"
-               "mtc0\t$8,$12\n\t"
-               ".section\t.sdata\n\t"
-               ".section\t.sbss\n\t"
-               ".section\t.text"
-               : : : "$8");
-
-#ifdef DEBUG_BOOT
-       if (magic == REX_PROM_MAGIC) {
-       prom_printf = (int (*)(char *, ...)) *(prom_vec + REX_PROM_PRINTF);
-       } else {
-               prom_printf = (int (*)(char *, ...)) PMAX_PROM_PRINTF;
-       }
-       prom_printf("Launching kernel...\n");
-#endif
-
-       k_start = (unsigned long) (&kernel_entry) & 0xffff0000;
-
-#ifdef RELOC
-       /*
-        * Now copy kernel image to its destination.
-        */
-       len = ((unsigned long) (&_end) - k_start);
-       memcpy((void *)k_start, &_ftext, len);
-#endif
-
-       if (magic == REX_PROM_MAGIC) {
-               rex_clear_cache = (void (*)(void)) * (prom_vec + REX_PROM_CLEARCACHE);
-               rex_clear_cache();
-       }
-
-       kernel_entry(argc, argv, magic, prom_vec);
-}
diff --git a/arch/mips/dec/boot/ld.ecoff b/arch/mips/dec/boot/ld.ecoff
deleted file mode 100644 (file)
index aaa633d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-OUTPUT_FORMAT("ecoff-littlemips")
-OUTPUT_ARCH(mips)
-ENTRY(dec_entry)
-SECTIONS
-{
-  . = 0x80200000;
-
-  .text :
-  {
-    _ftext = .;
-    *(.text)
-    *(.fixup)
-  }
-  .rdata :
-  {
-    *(.rodata .rodata.* .rdata)
-  }
-  .data :
-  {
-    . = ALIGN(0x1000);
-    ramdisk.img (.data)
-    *(.data)
-  }
-  .sdata :
-  {
-    *(.sdata)
-  }
-  _gp = .;
-  .sbss :
-  {
-    *(.sbss)
-    *(.scommon)
-  }
-  .bss :
-  {
-   *(.dynbss)
-   *(.bss)
-   *(COMMON)
-  }
-  /DISCARD/ : {
-    *(.reginfo .mdebug .note)
-  }
-}
index 57294740c2dd2bd9130a5763fdc3f195c36723ef..4cf0c06e2414b556d66cf5d8c212b4f28c523c0e 100644 (file)
@@ -184,8 +184,6 @@ void __init dec_time_init(void)
        CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A);
 }
 
-EXPORT_SYMBOL(do_settimeofday);
-
 void __init plat_timer_setup(struct irqaction *irq)
 {
        setup_irq(dec_interrupt[DEC_IRQ_RTC], irq);
diff --git a/arch/mips/ite-boards/Kconfig b/arch/mips/ite-boards/Kconfig
deleted file mode 100644 (file)
index a6d59ad..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-config IT8172_REVC
-       bool "Support for older IT8172 (Rev C)"
-       depends on MIPS_ITE8172
-       help
-         Say Y here to support the older, Revision C version of the Integrated
-         Technology Express, Inc. ITE8172 SBC.  Vendor page at
-         <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-         board at <http://www.mvista.com/partners/semiconductor/ite.html>.
diff --git a/arch/mips/ite-boards/generic/Makefile b/arch/mips/ite-boards/generic/Makefile
deleted file mode 100644 (file)
index 6343153..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-#  Copyright 2000 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc.
-#      ppopov@mvista.com or source@mvista.com
-#
-# Makefile for the ITE 8172 (qed-4n-s01b) board, generic files.
-#
-
-obj-y                  += it8172_setup.o irq.o pmon_prom.o \
-                          time.o lpc.o puts.o reset.o
-
-obj-$(CONFIG_IT8172_CIR)+= it8172_cir.o
-obj-$(CONFIG_KGDB)     += dbg_io.o
-
-EXTRA_AFLAGS := $(CFLAGS)
diff --git a/arch/mips/ite-boards/generic/dbg_io.c b/arch/mips/ite-boards/generic/dbg_io.c
deleted file mode 100644 (file)
index 8e9cd8a..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-#ifdef CONFIG_KGDB
-
-/* --- CONFIG --- */
-
-/* we need uint32 uint8 */
-/* #include "types.h" */
-typedef unsigned char uint8;
-typedef unsigned int uint32;
-
-/* --- END OF CONFIG --- */
-
-#define         UART16550_BAUD_2400             2400
-#define         UART16550_BAUD_4800             4800
-#define         UART16550_BAUD_9600             9600
-#define         UART16550_BAUD_19200            19200
-#define         UART16550_BAUD_38400            38400
-#define         UART16550_BAUD_57600            57600
-#define         UART16550_BAUD_115200           115200
-
-#define         UART16550_PARITY_NONE           0
-#define         UART16550_PARITY_ODD            0x08
-#define         UART16550_PARITY_EVEN           0x18
-#define         UART16550_PARITY_MARK           0x28
-#define         UART16550_PARITY_SPACE          0x38
-
-#define         UART16550_DATA_5BIT             0x0
-#define         UART16550_DATA_6BIT             0x1
-#define         UART16550_DATA_7BIT             0x2
-#define         UART16550_DATA_8BIT             0x3
-
-#define         UART16550_STOP_1BIT             0x0
-#define         UART16550_STOP_2BIT             0x4
-
-/* ----------------------------------------------------- */
-
-/* === CONFIG === */
-
-/* [stevel] we use the IT8712 serial port for kgdb */
-#define        DEBUG_BASE  0xB40003F8  /* 8712 serial port 1 base address */
-#define MAX_BAUD    115200
-
-/* === END OF CONFIG === */
-
-/* register offset */
-#define         OFS_RCV_BUFFER          0
-#define         OFS_TRANS_HOLD          0
-#define         OFS_SEND_BUFFER         0
-#define         OFS_INTR_ENABLE         1
-#define         OFS_INTR_ID             2
-#define         OFS_DATA_FORMAT         3
-#define         OFS_LINE_CONTROL        3
-#define         OFS_MODEM_CONTROL       4
-#define         OFS_RS232_OUTPUT        4
-#define         OFS_LINE_STATUS         5
-#define         OFS_MODEM_STATUS        6
-#define         OFS_RS232_INPUT         6
-#define         OFS_SCRATCH_PAD         7
-
-#define         OFS_DIVISOR_LSB         0
-#define         OFS_DIVISOR_MSB         1
-
-
-/* memory-mapped read/write of the port */
-#define UART16550_READ(y)    (*((volatile uint8*)(DEBUG_BASE + y)))
-#define UART16550_WRITE(y,z) ((*((volatile uint8*)(DEBUG_BASE + y))) = z)
-
-void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
-{
-       /* disable interrupts */
-       UART16550_WRITE(OFS_INTR_ENABLE, 0);
-
-       /* set up baud rate */
-       {
-               uint32 divisor;
-
-               /* set DIAB bit */
-               UART16550_WRITE(OFS_LINE_CONTROL, 0x80);
-
-               /* set divisor */
-               divisor = MAX_BAUD / baud;
-               UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff);
-               UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8);
-
-               /* clear DIAB bit */
-               UART16550_WRITE(OFS_LINE_CONTROL, 0x0);
-       }
-
-       /* set data format */
-       UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop);
-}
-
-static int remoteDebugInitialized = 0;
-
-uint8 getDebugChar(void)
-{
-       if (!remoteDebugInitialized) {
-               remoteDebugInitialized = 1;
-               debugInit(UART16550_BAUD_115200,
-                         UART16550_DATA_8BIT,
-                         UART16550_PARITY_NONE, UART16550_STOP_1BIT);
-       }
-
-       while ((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0);
-       return UART16550_READ(OFS_RCV_BUFFER);
-}
-
-
-int putDebugChar(uint8 byte)
-{
-       if (!remoteDebugInitialized) {
-               remoteDebugInitialized = 1;
-               debugInit(UART16550_BAUD_115200,
-                         UART16550_DATA_8BIT,
-                         UART16550_PARITY_NONE, UART16550_STOP_1BIT);
-       }
-
-       while ((UART16550_READ(OFS_LINE_STATUS) & 0x20) == 0);
-       UART16550_WRITE(OFS_SEND_BUFFER, byte);
-       return 1;
-}
-
-#endif
diff --git a/arch/mips/ite-boards/generic/irq.c b/arch/mips/ite-boards/generic/irq.c
deleted file mode 100644 (file)
index cb59ca4..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     ITE 8172G interrupt/setup routines.
- *
- * Copyright 2000,2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- * Part of this file was derived from Carsten Langgaard's
- * arch/mips/mips-boards/atlas/atlas_int.c.
- *
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/kernel_stat.h>
-#include <linux/module.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/timex.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/serial_reg.h>
-#include <linux/bitops.h>
-
-#include <asm/bootinfo.h>
-#include <asm/io.h>
-#include <asm/mipsregs.h>
-#include <asm/system.h>
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_int.h>
-#include <asm/it8172/it8172_dbg.h>
-
-/* revisit */
-#define EXT_IRQ0_TO_IP 2 /* IP 2 */
-#define EXT_IRQ5_TO_IP 7 /* IP 7 */
-
-#define ALLINTS_NOTIMER (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4)
-
-extern void set_debug_traps(void);
-extern void mips_timer_interrupt(int irq, struct pt_regs *regs);
-
-struct it8172_intc_regs volatile *it8172_hw0_icregs =
-       (struct it8172_intc_regs volatile *)(KSEG1ADDR(IT8172_PCI_IO_BASE + IT_INTC_BASE));
-
-static void disable_it8172_irq(unsigned int irq_nr)
-{
-       if ( (irq_nr >= IT8172_LPC_IRQ_BASE) && (irq_nr <= IT8172_SERIRQ_15)) {
-               /* LPC interrupt */
-               it8172_hw0_icregs->lpc_mask |=
-                       (1 << (irq_nr - IT8172_LPC_IRQ_BASE));
-       } else if ( (irq_nr >= IT8172_LB_IRQ_BASE) && (irq_nr <= IT8172_IOCHK_IRQ)) {
-               /* Local Bus interrupt */
-               it8172_hw0_icregs->lb_mask |=
-                       (1 << (irq_nr - IT8172_LB_IRQ_BASE));
-       } else if ( (irq_nr >= IT8172_PCI_DEV_IRQ_BASE) && (irq_nr <= IT8172_DMA_IRQ)) {
-               /* PCI and other interrupts */
-               it8172_hw0_icregs->pci_mask |=
-                       (1 << (irq_nr - IT8172_PCI_DEV_IRQ_BASE));
-       } else if ( (irq_nr >= IT8172_NMI_IRQ_BASE) && (irq_nr <= IT8172_POWER_NMI_IRQ)) {
-               /* NMI interrupts */
-               it8172_hw0_icregs->nmi_mask |=
-                       (1 << (irq_nr - IT8172_NMI_IRQ_BASE));
-       } else {
-               panic("disable_it8172_irq: bad irq %d", irq_nr);
-       }
-}
-
-static void enable_it8172_irq(unsigned int irq_nr)
-{
-       if ( (irq_nr >= IT8172_LPC_IRQ_BASE) && (irq_nr <= IT8172_SERIRQ_15)) {
-               /* LPC interrupt */
-               it8172_hw0_icregs->lpc_mask &=
-                       ~(1 << (irq_nr - IT8172_LPC_IRQ_BASE));
-       }
-       else if ( (irq_nr >= IT8172_LB_IRQ_BASE) && (irq_nr <= IT8172_IOCHK_IRQ)) {
-               /* Local Bus interrupt */
-               it8172_hw0_icregs->lb_mask &=
-                       ~(1 << (irq_nr - IT8172_LB_IRQ_BASE));
-       }
-       else if ( (irq_nr >= IT8172_PCI_DEV_IRQ_BASE) && (irq_nr <= IT8172_DMA_IRQ)) {
-               /* PCI and other interrupts */
-               it8172_hw0_icregs->pci_mask &=
-                       ~(1 << (irq_nr - IT8172_PCI_DEV_IRQ_BASE));
-       }
-       else if ( (irq_nr >= IT8172_NMI_IRQ_BASE) && (irq_nr <= IT8172_POWER_NMI_IRQ)) {
-               /* NMI interrupts */
-               it8172_hw0_icregs->nmi_mask &=
-                       ~(1 << (irq_nr - IT8172_NMI_IRQ_BASE));
-       }
-       else {
-               panic("enable_it8172_irq: bad irq %d", irq_nr);
-       }
-}
-
-static unsigned int startup_ite_irq(unsigned int irq)
-{
-       enable_it8172_irq(irq);
-       return 0;
-}
-
-#define shutdown_ite_irq       disable_it8172_irq
-#define mask_and_ack_ite_irq    disable_it8172_irq
-
-static void end_ite_irq(unsigned int irq)
-{
-       if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-               enable_it8172_irq(irq);
-}
-
-static struct irq_chip it8172_irq_type = {
-       .typename = "ITE8172",
-       .startup = startup_ite_irq,
-       .shutdown = shutdown_ite_irq,
-       .enable = enable_it8172_irq,
-       .disable = disable_it8172_irq,
-       .ack = mask_and_ack_ite_irq,
-       .end = end_ite_irq,
-};
-
-
-static void enable_none(unsigned int irq) { }
-static unsigned int startup_none(unsigned int irq) { return 0; }
-static void disable_none(unsigned int irq) { }
-static void ack_none(unsigned int irq) { }
-
-/* startup is the same as "enable", shutdown is same as "disable" */
-#define shutdown_none  disable_none
-#define end_none       enable_none
-
-static struct irq_chip cp0_irq_type = {
-       .typename = "CP0 Count",
-       .startup = startup_none,
-       .shutdown = shutdown_none,
-       .enable = enable_none,
-       .disable = disable_none,
-       .ack = ack_none,
-       .end = end_none
-};
-
-void enable_cpu_timer(void)
-{
-        unsigned long flags;
-
-        local_irq_save(flags);
-       set_c0_status(0x100 << EXT_IRQ5_TO_IP);
-        local_irq_restore(flags);
-}
-
-void __init arch_init_irq(void)
-{
-       int i;
-        unsigned long flags;
-
-       /* mask all interrupts */
-       it8172_hw0_icregs->lb_mask  = 0xffff;
-       it8172_hw0_icregs->lpc_mask = 0xffff;
-       it8172_hw0_icregs->pci_mask = 0xffff;
-       it8172_hw0_icregs->nmi_mask = 0xffff;
-
-       /* make all interrupts level triggered */
-       it8172_hw0_icregs->lb_trigger  = 0;
-       it8172_hw0_icregs->lpc_trigger = 0;
-       it8172_hw0_icregs->pci_trigger = 0;
-       it8172_hw0_icregs->nmi_trigger = 0;
-
-       /* active level setting */
-       /* uart, keyboard, and mouse are active high */
-       it8172_hw0_icregs->lpc_level = (0x10 | 0x2 | 0x1000);
-       it8172_hw0_icregs->lb_level |= 0x20;
-
-       /* keyboard and mouse are edge triggered */
-       it8172_hw0_icregs->lpc_trigger |= (0x2 | 0x1000);
-
-
-#if 0
-       // Enable this piece of code to make internal USB interrupt
-       // edge triggered.
-       it8172_hw0_icregs->pci_trigger |=
-               (1 << (IT8172_USB_IRQ - IT8172_PCI_DEV_IRQ_BASE));
-       it8172_hw0_icregs->pci_level &=
-               ~(1 << (IT8172_USB_IRQ - IT8172_PCI_DEV_IRQ_BASE));
-#endif
-
-       for (i = 0; i <= IT8172_LAST_IRQ; i++) {
-               irq_desc[i].chip = &it8172_irq_type;
-               spin_lock_init(&irq_desc[i].lock);
-       }
-       irq_desc[MIPS_CPU_TIMER_IRQ].chip = &cp0_irq_type;
-       set_c0_status(ALLINTS_NOTIMER);
-}
-
-void mips_spurious_interrupt(struct pt_regs *regs)
-{
-#if 1
-       return;
-#else
-       unsigned long status, cause;
-
-       printk("got spurious interrupt\n");
-       status = read_c0_status();
-       cause = read_c0_cause();
-       printk("status %x cause %x\n", status, cause);
-       printk("epc %x badvaddr %x \n", regs->cp0_epc, regs->cp0_badvaddr);
-#endif
-}
-
-void it8172_hw0_irqdispatch(struct pt_regs *regs)
-{
-       int irq;
-       unsigned short intstatus = 0, status = 0;
-
-       intstatus = it8172_hw0_icregs->intstatus;
-       if (intstatus & 0x8) {
-               panic("Got NMI interrupt");
-       } else if (intstatus & 0x4) {
-               /* PCI interrupt */
-               irq = 0;
-               status |= it8172_hw0_icregs->pci_req;
-               while (!(status & 0x1)) {
-                       irq++;
-                       status >>= 1;
-               }
-               irq += IT8172_PCI_DEV_IRQ_BASE;
-       } else if (intstatus & 0x1) {
-               /* Local Bus interrupt */
-               irq = 0;
-               status |= it8172_hw0_icregs->lb_req;
-               while (!(status & 0x1)) {
-                       irq++;
-                       status >>= 1;
-               }
-               irq += IT8172_LB_IRQ_BASE;
-       } else if (intstatus & 0x2) {
-               /* LPC interrupt */
-               /* Since some lpc interrupts are edge triggered,
-                * we could lose an interrupt this way because
-                * we acknowledge all ints at onces. Revisit.
-                */
-               status |= it8172_hw0_icregs->lpc_req;
-               it8172_hw0_icregs->lpc_req = 0; /* acknowledge ints */
-               irq = 0;
-               while (!(status & 0x1)) {
-                       irq++;
-                       status >>= 1;
-               }
-               irq += IT8172_LPC_IRQ_BASE;
-       } else
-               return;
-
-       do_IRQ(irq, regs);
-}
-
-asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
-{
-       unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
-
-       if (!pending)
-               mips_spurious_interrupt(regs);
-       else if (pending & CAUSEF_IP7)
-               ll_timer_interrupt(127, regs);
-       else if (pending & CAUSEF_IP2)
-               it8172_hw0_irqdispatch(regs);
-}
-
-void show_pending_irqs(void)
-{
-       fputs("intstatus:  ");
-       put32(it8172_hw0_icregs->intstatus);
-       puts("");
-
-       fputs("pci_req:  ");
-       put32(it8172_hw0_icregs->pci_req);
-       puts("");
-
-       fputs("lb_req:  ");
-       put32(it8172_hw0_icregs->lb_req);
-       puts("");
-
-       fputs("lpc_req:  ");
-       put32(it8172_hw0_icregs->lpc_req);
-       puts("");
-}
diff --git a/arch/mips/ite-boards/generic/it8172_cir.c b/arch/mips/ite-boards/generic/it8172_cir.c
deleted file mode 100644 (file)
index bfc25ad..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     IT8172 Consumer IR port generic routines.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
-#ifdef CONFIG_IT8172_CIR
-
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_cir.h>
-
-
-volatile struct it8172_cir_regs *cir_regs[NUM_CIR_PORTS] = {
-       (volatile struct it8172_cir_regs *)(KSEG1ADDR(IT8172_PCI_IO_BASE + IT_CIR0_BASE)),
-       (volatile struct it8172_cir_regs *)(KSEG1ADDR(IT8172_PCI_IO_BASE + IT_CIR1_BASE))};
-
-
-/*
- * Initialize Consumer IR Port.
- */
-int cir_port_init(struct cir_port *cir)
-{
-       int port = cir->port;
-       unsigned char data;
-
-       /* set baud rate */
-       cir_regs[port]->bdlr = cir->baud_rate & 0xff;
-       cir_regs[port]->bdhr = (cir->baud_rate >> 8) & 0xff;
-
-       /* set receiver control register */
-       cir_regs[port]->rcr = (CIR_SET_RDWOS(cir->rdwos) | CIR_SET_RXDCR(cir->rxdcr));
-
-       /* set carrier frequency register */
-       cir_regs[port]->cfr = (CIR_SET_CF(cir->cfq) | CIR_SET_HS(cir->hcfs));
-
-       /* set fifo threshold */
-       data = cir_regs[port]->mstcr & 0xf3;
-       data |= CIR_SET_FIFO_TL(cir->fifo_tl);
-       cir_regs[port]->mstcr = data;
-
-       clear_fifo(cir);
-       enable_receiver(cir);
-       disable_rx_demodulation(cir);
-
-       set_rx_active(cir);
-       int_enable(cir);
-       rx_int_enable(cir);
-
-       return 0;
-}
-
-
-void clear_fifo(struct cir_port *cir)
-{
-       cir_regs[cir->port]->mstcr |= CIR_FIFO_CLEAR;
-}
-
-void enable_receiver(struct cir_port *cir)
-{
-       cir_regs[cir->port]->rcr |= CIR_RXEN;
-}
-
-void disable_receiver(struct cir_port *cir)
-{
-       cir_regs[cir->port]->rcr &= ~CIR_RXEN;
-}
-
-void enable_rx_demodulation(struct cir_port *cir)
-{
-       cir_regs[cir->port]->rcr |= CIR_RXEND;
-}
-
-void disable_rx_demodulation(struct cir_port *cir)
-{
-       cir_regs[cir->port]->rcr &= ~CIR_RXEND;
-}
-
-void set_rx_active(struct cir_port *cir)
-{
-       cir_regs[cir->port]->rcr |= CIR_RXACT;
-}
-
-void int_enable(struct cir_port *cir)
-{
-       cir_regs[cir->port]->ier |= CIR_IEC;
-}
-
-void rx_int_enable(struct cir_port *cir)
-{
-       cir_regs[cir->port]->ier |= CIR_RDAIE;
-}
-
-void dump_regs(struct cir_port *cir)
-{
-       printk("mstcr %x ier %x iir %x cfr %x rcr %x tcr %x tfsr %x rfsr %x\n",
-       cir_regs[cir->port]->mstcr,
-       cir_regs[cir->port]->ier,
-       cir_regs[cir->port]->iir,
-       cir_regs[cir->port]->cfr,
-       cir_regs[cir->port]->rcr,
-       cir_regs[cir->port]->tcr,
-       cir_regs[cir->port]->tfsr,
-       cir_regs[cir->port]->rfsr);
-
-       while (cir_regs[cir->port]->iir & CIR_RDAI) {
-               printk("data %x\n", cir_regs[cir->port]->dr);
-       }
-}
-
-void dump_reg_addr(struct cir_port *cir)
-{
-       printk("dr %x mstcr %x ier %x iir %x cfr %x rcr %x tcr %x bdlr %x bdhr %x tfsr %x rfsr %x\n",
-       (unsigned)&cir_regs[cir->port]->dr,
-       (unsigned)&cir_regs[cir->port]->mstcr,
-       (unsigned)&cir_regs[cir->port]->ier,
-       (unsigned)&cir_regs[cir->port]->iir,
-       (unsigned)&cir_regs[cir->port]->cfr,
-       (unsigned)&cir_regs[cir->port]->rcr,
-       (unsigned)&cir_regs[cir->port]->tcr,
-       (unsigned)&cir_regs[cir->port]->bdlr,
-       (unsigned)&cir_regs[cir->port]->bdhr,
-       (unsigned)&cir_regs[cir->port]->tfsr,
-       (unsigned)&cir_regs[cir->port]->rfsr);
-}
-
-int cir_get_rx_count(struct cir_port *cir)
-{
-       return cir_regs[cir->port]->rfsr & CIR_RXFBC_MASK;
-}
-
-char cir_read_data(struct cir_port *cir)
-{
-       return cir_regs[cir->port]->dr;
-}
-
-char get_int_status(struct cir_port *cir)
-{
-       return cir_regs[cir->port]->iir;
-}
-#endif
diff --git a/arch/mips/ite-boards/generic/it8172_setup.c b/arch/mips/ite-boards/generic/it8172_setup.c
deleted file mode 100644 (file)
index 07faf3c..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     IT8172/QED5231 board setup.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/irq.h>
-#include <linux/serial_reg.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
-#include <linux/pm.h>
-
-#include <asm/cpu.h>
-#include <asm/time.h>
-#include <asm/io.h>
-#include <asm/bootinfo.h>
-#include <asm/irq.h>
-#include <asm/mipsregs.h>
-#include <asm/reboot.h>
-#include <asm/traps.h>
-#include <asm/it8172/it8172.h>
-#include <asm/it8712.h>
-
-extern struct resource ioport_resource;
-#ifdef CONFIG_SERIO_I8042
-int init_8712_keyboard(void);
-#endif
-
-extern int SearchIT8712(void);
-extern void InitLPCInterface(void);
-extern char * __init prom_getcmdline(void);
-extern void it8172_restart(char *command);
-extern void it8172_halt(void);
-extern void it8172_power_off(void);
-
-extern void it8172_time_init(void);
-
-#ifdef CONFIG_IT8172_REVC
-struct {
-    struct resource ram;
-    struct resource pci_mem;
-    struct resource pci_io;
-    struct resource flash;
-    struct resource boot;
-} it8172_resources = {
-       {
-               .start  = 0,                            /* to be initted */
-               .end    = 0,
-               .name   = "RAM",
-               .flags  = IORESOURCE_MEM
-       }, {
-               .start  = 0x10000000,
-               .end    = 0x13FFFFFF,
-               .name   = "PCI Mem",
-               .flags  = IORESOURCE_MEM
-       }, {
-               .start  = 0x14000000,
-               .end    = 0x17FFFFFF
-               .name   = "PCI I/O",
-       }, {
-               .start  = 0x08000000,
-               .end    = 0x0CFFFFFF
-               .name   = "Flash",
-       }, {
-               .start  = 0x1FC00000,
-               .end    = 0x1FFFFFFF
-               .name   = "Boot ROM",
-       }
-};
-#else
-struct {
-    struct resource ram;
-    struct resource pci_mem0;
-    struct resource pci_mem1;
-    struct resource pci_io;
-    struct resource pci_mem2;
-    struct resource pci_mem3;
-    struct resource flash;
-    struct resource boot;
-} it8172_resources = {
-       {
-               .start  = 0,                            /* to be initted */
-               .end    = 0,
-               .name   = "RAM",
-               .flags  = IORESOURCE_MEM
-       }, {
-               .start  = 0x0C000000,
-               .end    = 0x0FFFFFFF,
-               .name   = "PCI Mem0",
-               .flags  = IORESOURCE_MEM
-        }, {
-               .start  = 0x10000000,
-               .end    = 0x13FFFFFF,
-               .name   = "PCI Mem1",
-               .flags  = IORESOURCE_MEM
-        }, {
-               .start  = 0x14000000,
-               .end    = 0x17FFFFFF
-               .name   = "PCI I/O",
-       }, {
-               .start  = 0x1A000000,
-               .end    = 0x1BFFFFFF,
-               .name   = "PCI Mem2",
-               .flags  = IORESOURCE_MEM
-       }, {
-               .start  = 0x1C000000,
-               .end    = 0x1FBFFFFF,
-               .name   = "PCI Mem3",
-               .flags  = IORESOURCE_MEM
-       }, {
-               .start  = 0x08000000,
-               .end    = 0x0CFFFFFF
-               .name   = "Flash",
-       }, {
-               .start  = 0x1FC00000,
-               .end    = 0x1FFFFFFF
-               .name   = "Boot ROM",
-       }
-};
-#endif
-
-
-void __init it8172_init_ram_resource(unsigned long memsize)
-{
-       it8172_resources.ram.end = memsize;
-}
-
-void __init plat_mem_setup(void)
-{
-       unsigned short dsr;
-       char *argptr;
-
-       argptr = prom_getcmdline();
-#ifdef CONFIG_SERIAL_CONSOLE
-       if ((argptr = strstr(argptr, "console=")) == NULL) {
-               argptr = prom_getcmdline();
-               strcat(argptr, " console=ttyS0,115200");
-       }
-#endif
-
-       clear_c0_status(ST0_FR);
-
-       board_time_init = it8172_time_init;
-
-       _machine_restart = it8172_restart;
-       _machine_halt = it8172_halt;
-       pm_power_off = it8172_power_off;
-
-       /*
-        * IO/MEM resources.
-        *
-        * revisit this area.
-        */
-       set_io_port_base(KSEG1);
-       ioport_resource.start = it8172_resources.pci_io.start;
-       ioport_resource.end = it8172_resources.pci_io.end;
-#ifdef CONFIG_IT8172_REVC
-       iomem_resource.start = it8172_resources.pci_mem.start;
-       iomem_resource.end = it8172_resources.pci_mem.end;
-#else
-       iomem_resource.start = it8172_resources.pci_mem0.start;
-       iomem_resource.end = it8172_resources.pci_mem3.end;
-#endif
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       ROOT_DEV = Root_RAM0;
-#endif
-
-       /*
-        * Pull enabled devices out of standby
-        */
-       IT_IO_READ16(IT_PM_DSR, dsr);
-
-       /*
-        * Fixme: This breaks when these drivers are modules!!!
-        */
-#ifdef CONFIG_SOUND_IT8172
-       dsr &= ~IT_PM_DSR_ACSB;
-#else
-       dsr |= IT_PM_DSR_ACSB;
-#endif
-#ifdef CONFIG_BLK_DEV_IT8172
-       dsr &= ~IT_PM_DSR_IDESB;
-#else
-       dsr |= IT_PM_DSR_IDESB;
-#endif
-       IT_IO_WRITE16(IT_PM_DSR, dsr);
-
-       InitLPCInterface();
-
-#ifdef CONFIG_MIPS_ITE8172
-       if (SearchIT8712()) {
-               printk("Found IT8712 Super IO\n");
-               /* enable IT8712 serial port */
-               LPCSetConfig(LDN_SERIAL1, 0x30, 0x01); /* enable */
-               LPCSetConfig(LDN_SERIAL1, 0x23, 0x01); /* clock selection */
-#ifdef CONFIG_SERIO_I8042
-               if (init_8712_keyboard()) {
-                       printk("Unable to initialize keyboard\n");
-                       LPCSetConfig(LDN_KEYBOARD, 0x30, 0x0); /* disable keyboard */
-               } else {
-                       LPCSetConfig(LDN_KEYBOARD, 0x30, 0x1); /* enable keyboard */
-                       LPCSetConfig(LDN_KEYBOARD, 0xf0, 0x2);
-                       LPCSetConfig(LDN_KEYBOARD, 0x71, 0x3);
-
-                       LPCSetConfig(LDN_MOUSE, 0x30, 0x1); /* enable mouse */
-
-                       LPCSetConfig(0x4, 0x30, 0x1);
-                       LPCSetConfig(0x4, 0xf4, LPCGetConfig(0x4, 0xf4) | 0x80);
-
-                       if ((LPCGetConfig(LDN_KEYBOARD, 0x30) == 0) ||
-                                       (LPCGetConfig(LDN_MOUSE, 0x30) == 0))
-                               printk("Error: keyboard or mouse not enabled\n");
-
-               }
-#endif
-       }
-       else {
-               printk("IT8712 Super IO not found\n");
-       }
-#endif
-
-#ifdef CONFIG_IT8172_CIR
-       {
-               unsigned long data;
-               //printk("Enabling CIR0\n");
-               IT_IO_READ16(IT_PM_DSR, data);
-               data &= ~IT_PM_DSR_CIR0SB;
-               IT_IO_WRITE16(IT_PM_DSR, data);
-               //printk("DSR register: %x\n", (unsigned)IT_IO_READ16(IT_PM_DSR, data));
-       }
-#endif
-#ifdef CONFIG_IT8172_SCR0
-       {
-               unsigned i;
-               /* Enable Smart Card Reader 0 */
-               /* First power it up */
-               IT_IO_READ16(IT_PM_DSR, i);
-               i &= ~IT_PM_DSR_SCR0SB;
-               IT_IO_WRITE16(IT_PM_DSR, i);
-               /* Then initialize its registers */
-               outb(( IT_SCR_SFR_GATE_UART_OFF     << IT_SCR_SFR_GATE_UART_BIT
-                     |IT_SCR_SFR_FET_CHARGE_213_US << IT_SCR_SFR_FET_CHARGE_BIT
-                     |IT_SCR_SFR_CARD_FREQ_3_5_MHZ << IT_SCR_SFR_CARD_FREQ_BIT
-                     |IT_SCR_SFR_FET_ACTIVE_INVERT << IT_SCR_SFR_FET_ACTIVE_BIT
-                     |IT_SCR_SFR_ENABLE_ON         << IT_SCR_SFR_ENABLE_BIT),
-                    IT8172_PCI_IO_BASE + IT_SCR0_BASE + IT_SCR_SFR);
-               outb(IT_SCR_SCDR_RESET_MODE_ASYNC << IT_SCR_SCDR_RESET_MODE_BIT,
-                    IT8172_PCI_IO_BASE + IT_SCR0_BASE + IT_SCR_SCDR);
-       }
-#endif /* CONFIG_IT8172_SCR0 */
-#ifdef CONFIG_IT8172_SCR1
-       {
-               unsigned i;
-               /* Enable Smart Card Reader 1 */
-               /* First power it up */
-               IT_IO_READ16(IT_PM_DSR, i);
-               i &= ~IT_PM_DSR_SCR1SB;
-               IT_IO_WRITE16(IT_PM_DSR, i);
-               /* Then initialize its registers */
-               outb(( IT_SCR_SFR_GATE_UART_OFF     << IT_SCR_SFR_GATE_UART_BIT
-                     |IT_SCR_SFR_FET_CHARGE_213_US << IT_SCR_SFR_FET_CHARGE_BIT
-                     |IT_SCR_SFR_CARD_FREQ_3_5_MHZ << IT_SCR_SFR_CARD_FREQ_BIT
-                     |IT_SCR_SFR_FET_ACTIVE_INVERT << IT_SCR_SFR_FET_ACTIVE_BIT
-                     |IT_SCR_SFR_ENABLE_ON         << IT_SCR_SFR_ENABLE_BIT),
-                    IT8172_PCI_IO_BASE + IT_SCR1_BASE + IT_SCR_SFR);
-               outb(IT_SCR_SCDR_RESET_MODE_ASYNC << IT_SCR_SCDR_RESET_MODE_BIT,
-                    IT8172_PCI_IO_BASE + IT_SCR1_BASE + IT_SCR_SCDR);
-       }
-#endif /* CONFIG_IT8172_SCR1 */
-}
-
-#ifdef CONFIG_SERIO_I8042
-/*
- * According to the ITE Special BIOS Note for waking up the
- * keyboard controller...
- */
-static int init_8712_keyboard(void)
-{
-       unsigned int cmd_port = 0x14000064;
-       unsigned int data_port = 0x14000060;
-                                ^^^^^^^^^^^
-       Somebody here doesn't grok the concept of io ports.
-
-       unsigned char data;
-       int i;
-
-       outb(0xaa, cmd_port); /* send self-test cmd */
-       i = 0;
-       while (!(inb(cmd_port) & 0x1)) { /* wait output buffer full */
-               i++;
-               if (i > 0xffffff)
-                       return 1;
-       }
-
-       data = inb(data_port);
-       outb(0xcb, cmd_port); /* set ps2 mode */
-       while (inb(cmd_port) & 0x2) { /* wait while input buffer full */
-               i++;
-               if (i > 0xffffff)
-                       return 1;
-       }
-       outb(0x01, data_port);
-       while (inb(cmd_port) & 0x2) { /* wait while input buffer full */
-               i++;
-               if (i > 0xffffff)
-                       return 1;
-       }
-
-       outb(0x60, cmd_port); /* write 8042 command byte */
-       while (inb(cmd_port) & 0x2) { /* wait while input buffer full */
-               i++;
-               if (i > 0xffffff)
-                       return 1;
-       }
-       outb(0x45, data_port); /* at interface, keyboard enabled, system flag */
-       while (inb(cmd_port) & 0x2) { /* wait while input buffer full */
-               i++;
-               if (i > 0xffffff)
-                       return 1;
-       }
-
-       outb(0xae, cmd_port); /* enable interface */
-       return 0;
-}
-#endif
diff --git a/arch/mips/ite-boards/generic/lpc.c b/arch/mips/ite-boards/generic/lpc.c
deleted file mode 100644 (file)
index cc7584f..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     ITE Semi IT8712 Super I/O functions.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <asm/io.h>
-#include <asm/types.h>
-#include <asm/it8712.h>
-#include <asm/it8172/it8172.h>
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-void LPCEnterMBPnP(void)
-{
-       int i;
-       unsigned char key[4] = {0x87, 0x01, 0x55, 0x55};
-
-       for (i = 0; i<4; i++)
-               outb(key[i], LPC_KEY_ADDR);
-
-}
-
-void LPCExitMBPnP(void)
-{
-       outb(0x02, LPC_KEY_ADDR);
-       outb(0x02, LPC_DATA_ADDR);
-}
-
-void LPCSetConfig(char LdnNumber, char Index, char data)
-{
-       LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
-       outb(0x07, LPC_KEY_ADDR);
-       outb(LdnNumber, LPC_DATA_ADDR);
-       outb(Index, LPC_KEY_ADDR);
-       outb(data, LPC_DATA_ADDR);
-       LPCExitMBPnP();
-}
-
-char LPCGetConfig(char LdnNumber, char Index)
-{
-       char rtn;
-
-       LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
-       outb(0x07, LPC_KEY_ADDR);
-       outb(LdnNumber, LPC_DATA_ADDR);
-       outb(Index, LPC_KEY_ADDR);
-       rtn = inb(LPC_DATA_ADDR);
-       LPCExitMBPnP();
-       return rtn;
-}
-
-int SearchIT8712(void)
-{
-       unsigned char Id1, Id2;
-       unsigned short Id;
-
-       LPCEnterMBPnP();
-       outb(0x20, LPC_KEY_ADDR); /* chip id byte 1 */
-       Id1 = inb(LPC_DATA_ADDR);
-       outb(0x21, LPC_KEY_ADDR); /* chip id byte 2 */
-       Id2 = inb(LPC_DATA_ADDR);
-       Id = (Id1 << 8) | Id2;
-       LPCExitMBPnP();
-       if (Id == 0x8712)
-               return TRUE;
-       else
-               return FALSE;
-}
-
-void InitLPCInterface(void)
-{
-       unsigned char bus, dev_fn;
-       unsigned long data;
-
-       bus = 0;
-       dev_fn = 1<<3 | 4;
-
-
-       /* pci cmd, SERR# Enable */
-       IT_WRITE(IT_CONFADDR,
-                (bus         << IT_BUSNUM_SHF)   |
-                (dev_fn      << IT_FUNCNUM_SHF) |
-                ((0x4 / 4) << IT_REGNUM_SHF));
-       IT_READ(IT_CONFDATA, data);
-       data |= 0x0100;
-       IT_WRITE(IT_CONFADDR,
-                (bus         << IT_BUSNUM_SHF)   |
-                (dev_fn      << IT_FUNCNUM_SHF) |
-                ((0x4 / 4) << IT_REGNUM_SHF));
-       IT_WRITE(IT_CONFDATA, data);
-
-       /* setup serial irq control register */
-       IT_WRITE(IT_CONFADDR,
-                (bus         << IT_BUSNUM_SHF)   |
-                (dev_fn      << IT_FUNCNUM_SHF) |
-                ((0x48 / 4) << IT_REGNUM_SHF));
-       IT_READ(IT_CONFDATA, data);
-       data  = (data & 0xffff00ff) | 0xc400;
-       IT_WRITE(IT_CONFADDR,
-                (bus         << IT_BUSNUM_SHF)   |
-                (dev_fn      << IT_FUNCNUM_SHF) |
-                ((0x48 / 4) << IT_REGNUM_SHF));
-       IT_WRITE(IT_CONFDATA, data);
-
-
-       /* Enable I/O Space Subtractive Decode */
-       /* default 0x4C is 0x3f220000 */
-       IT_WRITE(IT_CONFADDR,
-                (bus         << IT_BUSNUM_SHF)   |
-                (dev_fn      << IT_FUNCNUM_SHF) |
-                ((0x4C / 4) << IT_REGNUM_SHF));
-       IT_WRITE(IT_CONFDATA, 0x3f2200f3);
-}
diff --git a/arch/mips/ite-boards/generic/pmon_prom.c b/arch/mips/ite-boards/generic/pmon_prom.c
deleted file mode 100644 (file)
index 7d0a79b..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *    PROM library initialisation code, assuming a version of
- *    pmon is the boot code.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- * This file was derived from Carsten Langgaard's
- * arch/mips/mips-boards/xx files.
- *
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-extern int prom_argc;
-extern char **prom_argv, **prom_envp;
-
-typedef struct
-{
-    char *name;
-/*    char *val; */
-}t_env_var;
-
-
-char * __init prom_getcmdline(void)
-{
-       return &(arcs_cmdline[0]);
-}
-
-void  __init prom_init_cmdline(void)
-{
-       char *cp;
-       int actr;
-
-       actr = 1; /* Always ignore argv[0] */
-
-       cp = &(arcs_cmdline[0]);
-       while(actr < prom_argc) {
-               strcpy(cp, prom_argv[actr]);
-               cp += strlen(prom_argv[actr]);
-               *cp++ = ' ';
-               actr++;
-       }
-       if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
-               --cp;
-       *cp = '\0';
-
-}
-
-
-char *prom_getenv(char *envname)
-{
-       /*
-        * Return a pointer to the given environment variable.
-        * Environment variables are stored in the form of "memsize=64".
-        */
-
-       t_env_var *env = (t_env_var *)prom_envp;
-       int i;
-
-       i = strlen(envname);
-
-       while(env->name) {
-               if(strncmp(envname, env->name, i) == 0) {
-                       return(env->name + strlen(envname) + 1);
-               }
-               env++;
-       }
-       return(NULL);
-}
-
-static inline unsigned char str2hexnum(unsigned char c)
-{
-       if(c >= '0' && c <= '9')
-       return c - '0';
-       if(c >= 'a' && c <= 'f')
-       return c - 'a' + 10;
-       return 0; /* foo */
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-       return 0;
-}
-
-unsigned long __init prom_get_memsize(void)
-{
-       char *memsize_str;
-       unsigned int memsize;
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str) {
-#ifdef CONFIG_MIPS_ITE8172
-               memsize = 32;
-#elif defined(CONFIG_MIPS_IVR)
-               memsize = 64;
-#else
-               memsize = 8;
-#endif
-               printk("memsize unknown: setting to %dMB\n", memsize);
-       } else {
-               printk("memsize: %s\n", memsize_str);
-               memsize = simple_strtol(memsize_str, NULL, 0);
-       }
-       return memsize;
-}
diff --git a/arch/mips/ite-boards/generic/puts.c b/arch/mips/ite-boards/generic/puts.c
deleted file mode 100644 (file)
index 20b02df..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Low level uart routines to directly access a 16550 uart.
- *
- * Copyright 2000,2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/types.h>
-
-#define SERIAL_BASE   0xB4011800       /* it8172 */
-#define SER_CMD       5
-#define SER_DATA      0x00
-#define TX_BUSY       0x20
-
-#define TIMEOUT       0xffff
-#undef SLOW_DOWN
-
-static const char digits[16] = "0123456789abcdef";
-static volatile unsigned char *const com1 = (unsigned char *) SERIAL_BASE;
-
-
-#ifdef SLOW_DOWN
-static inline void slow_down()
-{
-       int k;
-       for (k = 0; k < 10000; k++);
-}
-#else
-#define slow_down()
-#endif
-
-void putch(const unsigned char c)
-{
-       unsigned char ch;
-       int i = 0;
-
-       do {
-               ch = com1[SER_CMD];
-               slow_down();
-               i++;
-               if (i > TIMEOUT) {
-                       break;
-               }
-       } while (0 == (ch & TX_BUSY));
-       com1[SER_DATA] = c;
-}
-
-void puts(unsigned char *cp)
-{
-       unsigned char ch;
-       int i = 0;
-
-       while (*cp) {
-               do {
-                       ch = com1[SER_CMD];
-                       slow_down();
-                       i++;
-                       if (i > TIMEOUT) {
-                               break;
-                       }
-               } while (0 == (ch & TX_BUSY));
-               com1[SER_DATA] = *cp++;
-       }
-       putch('\r');
-       putch('\n');
-}
-
-void fputs(unsigned char *cp)
-{
-       unsigned char ch;
-       int i = 0;
-
-       while (*cp) {
-
-               do {
-                       ch = com1[SER_CMD];
-                       slow_down();
-                       i++;
-                       if (i > TIMEOUT) {
-                               break;
-                       }
-               } while (0 == (ch & TX_BUSY));
-               com1[SER_DATA] = *cp++;
-       }
-}
-
-
-void put64(uint64_t ul)
-{
-       int cnt;
-       unsigned ch;
-
-       cnt = 16;               /* 16 nibbles in a 64 bit long */
-       putch('0');
-       putch('x');
-       do {
-               cnt--;
-               ch = (unsigned char) (ul >> cnt * 4) & 0x0F;
-               putch(digits[ch]);
-       } while (cnt > 0);
-}
-
-void put32(unsigned u)
-{
-       int cnt;
-       unsigned ch;
-
-       cnt = 8;                /* 8 nibbles in a 32 bit long */
-       putch('0');
-       putch('x');
-       do {
-               cnt--;
-               ch = (unsigned char) (u >> cnt * 4) & 0x0F;
-               putch(digits[ch]);
-       } while (cnt > 0);
-}
diff --git a/arch/mips/ite-boards/generic/reset.c b/arch/mips/ite-boards/generic/reset.c
deleted file mode 100644 (file)
index 03bd5ba..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     ITE 8172 reset routines.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <asm/cacheflush.h>
-#include <asm/io.h>
-#include <asm/processor.h>
-#include <asm/reboot.h>
-#include <asm/system.h>
-
-void it8172_restart()
-{
-       set_c0_status(ST0_BEV | ST0_ERL);
-       change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
-       flush_cache_all();
-       write_c0_wired(0);
-       __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
-}
-
-void it8172_halt(void)
-{
-       printk(KERN_NOTICE "\n** You can safely turn off the power\n");
-       while (1)
-               __asm__(".set\tmips3\n\t"
-                       "wait\n\t"
-                       ".set\tmips0");
-}
-
-void it8172_power_off(void)
-{
-       it8172_halt();
-}
diff --git a/arch/mips/ite-boards/generic/time.c b/arch/mips/ite-boards/generic/time.c
deleted file mode 100644 (file)
index 3dc5556..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- * Copyright (C) 2003 MontaVista Software Inc.
- * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- * Setting up the clock on the MIPS boards.
- */
-#include <linux/init.h>
-#include <linux/kernel_stat.h>
-#include <linux/sched.h>
-#include <linux/time.h>
-#include <linux/spinlock.h>
-#include <linux/mc146818rtc.h>
-
-#include <asm/time.h>
-#include <asm/mipsregs.h>
-#include <asm/ptrace.h>
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_int.h>
-#include <asm/debug.h>
-
-#define IT8172_RTC_ADR_REG  (IT8172_PCI_IO_BASE + IT_RTC_BASE)
-#define IT8172_RTC_DAT_REG  (IT8172_RTC_ADR_REG + 1)
-#define IT8172_RTC_CENTURY_REG  (IT8172_PCI_IO_BASE + IT_RTC_CENTURY)
-
-static volatile char *rtc_adr_reg = (char*)KSEG1ADDR(IT8172_RTC_ADR_REG);
-static volatile char *rtc_dat_reg = (char*)KSEG1ADDR(IT8172_RTC_DAT_REG);
-static volatile char *rtc_century_reg = (char*)KSEG1ADDR(IT8172_RTC_CENTURY_REG);
-
-unsigned char it8172_rtc_read_data(unsigned long addr)
-{
-       unsigned char retval;
-
-       *rtc_adr_reg = addr;
-       retval =  *rtc_dat_reg;
-       return retval;
-}
-
-void it8172_rtc_write_data(unsigned char data, unsigned long addr)
-{
-       *rtc_adr_reg = addr;
-       *rtc_dat_reg = data;
-}
-
-#undef         CMOS_READ
-#undef         CMOS_WRITE
-#define        CMOS_READ(addr)                 it8172_rtc_read_data(addr)
-#define CMOS_WRITE(data, addr)                 it8172_rtc_write_data(data, addr)
-
-static unsigned char saved_control;    /* remember rtc control reg */
-static inline int rtc_24h(void) { return saved_control & RTC_24H; }
-static inline int rtc_dm_binary(void) { return saved_control & RTC_DM_BINARY; }
-
-static inline unsigned char
-bin_to_hw(unsigned char c)
-{
-       if (rtc_dm_binary())
-               return c;
-       else
-               return ((c/10) << 4) + (c%10);
-}
-
-static inline unsigned char
-hw_to_bin(unsigned char c)
-{
-       if (rtc_dm_binary())
-               return c;
-       else
-               return (c>>4)*10 + (c &0xf);
-}
-
-/* 0x80 bit indicates pm in 12-hour format */
-static inline unsigned char
-hour_bin_to_hw(unsigned char c)
-{
-       if (rtc_24h())
-               return bin_to_hw(c);
-       if (c >= 12)
-               return 0x80 | bin_to_hw((c==12)?12:c-12);  /* 12 is 12pm */
-       else
-               return bin_to_hw((c==0)?12:c);  /* 0 is 12 AM, not 0 am */
-}
-
-static inline unsigned char
-hour_hw_to_bin(unsigned char c)
-{
-       unsigned char tmp = hw_to_bin(c&0x3f);
-       if (rtc_24h())
-               return tmp;
-       if (c & 0x80)
-               return (tmp==12)?12:tmp+12;     /* 12pm is 12, not 24 */
-       else
-               return (tmp==12)?0:tmp;         /* 12am is 0 */
-}
-
-static unsigned long r4k_offset; /* Amount to increment compare reg each time */
-static unsigned long r4k_cur;    /* What counter should be at next timer irq */
-extern unsigned int mips_hpt_frequency;
-
-/*
- * Figure out the r4k offset, the amount to increment the compare
- * register for each time tick.
- * Use the RTC to calculate offset.
- */
-static unsigned long __init cal_r4koff(void)
-{
-       unsigned int flags;
-
-       local_irq_save(flags);
-
-       /* Start counter exactly on falling edge of update flag */
-       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
-       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
-
-       /* Start r4k counter. */
-       write_c0_count(0);
-
-       /* Read counter exactly on falling edge of update flag */
-       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
-       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
-
-       mips_hpt_frequency = read_c0_count();
-
-       /* restore interrupts */
-       local_irq_restore(flags);
-
-       return (mips_hpt_frequency / HZ);
-}
-
-static unsigned long
-it8172_rtc_get_time(void)
-{
-       unsigned int year, mon, day, hour, min, sec;
-       unsigned int flags;
-
-       /* avoid update-in-progress. */
-       for (;;) {
-               local_irq_save(flags);
-               if (! (CMOS_READ(RTC_REG_A) & RTC_UIP))
-                       break;
-               /* don't hold intr closed all the time */
-               local_irq_restore(flags);
-       }
-
-       /* Read regs. */
-       sec = hw_to_bin(CMOS_READ(RTC_SECONDS));
-       min = hw_to_bin(CMOS_READ(RTC_MINUTES));
-       hour = hour_hw_to_bin(CMOS_READ(RTC_HOURS));
-       day = hw_to_bin(CMOS_READ(RTC_DAY_OF_MONTH));
-       mon = hw_to_bin(CMOS_READ(RTC_MONTH));
-       year = hw_to_bin(CMOS_READ(RTC_YEAR)) +
-               hw_to_bin(*rtc_century_reg) * 100;
-
-       /* restore interrupts */
-       local_irq_restore(flags);
-
-       return mktime(year, mon, day, hour, min, sec);
-}
-
-static int
-it8172_rtc_set_time(unsigned long t)
-{
-       struct rtc_time tm;
-       unsigned int flags;
-
-       /* convert */
-       to_tm(t, &tm);
-
-       /* avoid update-in-progress. */
-       for (;;) {
-               local_irq_save(flags);
-               if (! (CMOS_READ(RTC_REG_A) & RTC_UIP))
-                       break;
-               /* don't hold intr closed all the time */
-               local_irq_restore(flags);
-       }
-
-       *rtc_century_reg = bin_to_hw(tm.tm_year/100);
-       CMOS_WRITE(bin_to_hw(tm.tm_sec), RTC_SECONDS);
-       CMOS_WRITE(bin_to_hw(tm.tm_min), RTC_MINUTES);
-       CMOS_WRITE(hour_bin_to_hw(tm.tm_hour), RTC_HOURS);
-       CMOS_WRITE(bin_to_hw(tm.tm_mday), RTC_DAY_OF_MONTH);
-       CMOS_WRITE(bin_to_hw(tm.tm_mon+1), RTC_MONTH);  /* tm_mon starts from 0 */
-       CMOS_WRITE(bin_to_hw(tm.tm_year%100), RTC_YEAR);
-
-       /* restore interrupts */
-       local_irq_restore(flags);
-
-       return 0;
-}
-
-void __init it8172_time_init(void)
-{
-        unsigned int est_freq, flags;
-
-       local_irq_save(flags);
-
-       saved_control = CMOS_READ(RTC_CONTROL);
-
-       printk("calculating r4koff... ");
-       r4k_offset = cal_r4koff();
-       printk("%08lx(%d)\n", r4k_offset, (int) r4k_offset);
-
-       est_freq = 2*r4k_offset*HZ;
-       est_freq += 5000;    /* round */
-       est_freq -= est_freq%10000;
-       printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
-              (est_freq%1000000)*100/1000000);
-
-       local_irq_restore(flags);
-
-       rtc_mips_get_time = it8172_rtc_get_time;
-       rtc_mips_set_time = it8172_rtc_set_time;
-}
-
-#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
-
-void __init plat_timer_setup(struct irqaction *irq)
-{
-       puts("timer_setup\n");
-       put32(NR_IRQS);
-       puts("");
-        /* we are using the cpu counter for timer interrupts */
-       setup_irq(MIPS_CPU_TIMER_IRQ, irq);
-
-        /* to generate the first timer interrupt */
-       r4k_cur = (read_c0_count() + r4k_offset);
-       write_c0_compare(r4k_cur);
-       set_c0_status(ALLINTS);
-}
diff --git a/arch/mips/ite-boards/ivr/Makefile b/arch/mips/ite-boards/ivr/Makefile
deleted file mode 100644 (file)
index e4fa604..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-#  Copyright 2000 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc.
-#      ppopov@mvista.com or source@mvista.com
-#
-# Makefile for the Globespan IVR board,
-# board-specific files.
-#
-
-obj-y          += init.o
diff --git a/arch/mips/ite-boards/ivr/README b/arch/mips/ite-boards/ivr/README
deleted file mode 100644 (file)
index aa7d8db..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-This is not really a board made by ITE Semi, but it's very
-similar to the ITE QED-4N-S01B board.  The IVR board is made
-by Globespan and it's a reference board for the PVR chip.
diff --git a/arch/mips/ite-boards/ivr/init.c b/arch/mips/ite-boards/ivr/init.c
deleted file mode 100644 (file)
index 05cf921..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     IVR board setup.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/bootmem.h>
-#include <asm/addrspace.h>
-#include <asm/bootinfo.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <asm/sections.h>
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_dbg.h>
-
-int prom_argc;
-char **prom_argv, **prom_envp;
-
-extern void  __init prom_init_cmdline(void);
-extern unsigned long __init prom_get_memsize(void);
-extern void __init it8172_init_ram_resource(unsigned long memsize);
-
-const char *get_system_type(void)
-{
-       return "Globespan IVR";
-}
-
-void __init prom_init(void)
-{
-       unsigned long mem_size;
-       unsigned long pcicr;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **) fw_arg1;
-       prom_envp = (int *) fw_arg3;
-
-       mips_machgroup = MACH_GROUP_GLOBESPAN;
-       mips_machtype = MACH_IVR;  /* Globespan's iTVC15 reference board */
-
-       prom_init_cmdline();
-
-       /* pmon does not set memsize */
-       mem_size = prom_get_memsize();
-       mem_size = mem_size << 20;
-
-       /*
-        * make the entire physical memory visible to pci bus masters
-        */
-       IT_READ(IT_MC_PCICR, pcicr);
-       pcicr &= ~0x1f;
-       pcicr |= (mem_size - 1) >> 22;
-       IT_WRITE(IT_MC_PCICR, pcicr);
-
-       it8172_init_ram_resource(mem_size);
-       add_memory_region(0, mem_size, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/ite-boards/qed-4n-s01b/Makefile b/arch/mips/ite-boards/qed-4n-s01b/Makefile
deleted file mode 100644 (file)
index bb9972a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-#  Copyright 2000 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc.
-#      ppopov@mvista.com or source@mvista.com
-#
-# Makefile for the ITE 8172 (qed-4n-s01b) board, board
-# specific files.
-#
-
-obj-y := init.o
diff --git a/arch/mips/ite-boards/qed-4n-s01b/README b/arch/mips/ite-boards/qed-4n-s01b/README
deleted file mode 100644 (file)
index fb4b519..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-This is an ITE (www.iteusa.com) eval board for the ITE 8172G
-system controller, with a QED 5231 CPU.
diff --git a/arch/mips/ite-boards/qed-4n-s01b/init.c b/arch/mips/ite-boards/qed-4n-s01b/init.c
deleted file mode 100644 (file)
index ea2a754..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     IT8172/QED5231 board setup.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/bootmem.h>
-#include <asm/addrspace.h>
-#include <asm/bootinfo.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <asm/sections.h>
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_dbg.h>
-
-int prom_argc;
-char **prom_argv, **prom_envp;
-
-extern void  __init prom_init_cmdline(void);
-extern unsigned long __init prom_get_memsize(void);
-extern void __init it8172_init_ram_resource(unsigned long memsize);
-
-const char *get_system_type(void)
-{
-       return "ITE QED-4N-S01B";
-}
-
-void __init prom_init(void)
-{
-       unsigned long mem_size;
-       unsigned long pcicr;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **) fw_arg1;
-       prom_envp = (int *) fw_arg3;
-
-       mips_machgroup = MACH_GROUP_ITE;
-       mips_machtype = MACH_QED_4N_S01B;  /* ITE board name/number */
-
-       prom_init_cmdline();
-       mem_size = prom_get_memsize();
-
-       printk("Memory size: %dMB\n", (unsigned)mem_size);
-
-       mem_size <<= 20; /* MB */
-
-       /*
-        * make the entire physical memory visible to pci bus masters
-        */
-       IT_READ(IT_MC_PCICR, pcicr);
-       pcicr &= ~0x1f;
-       pcicr |= (mem_size - 1) >> 22;
-       IT_WRITE(IT_MC_PCICR, pcicr);
-
-       it8172_init_ram_resource(mem_size);
-       add_memory_region(0, mem_size, BOOT_MEM_RAM);
-}
index 845c7e55505d39f3335e66f031e723b2729d6406..a8340802f2d76a3c27acd634a1e658b6a0a8518e 100644 (file)
@@ -149,80 +149,6 @@ void (*mips_timer_ack)(void);
 unsigned int (*mips_hpt_read)(void);
 void (*mips_hpt_init)(unsigned int);
 
-
-/*
- * This version of gettimeofday has microsecond resolution and better than
- * microsecond precision on fast machines with cycle counter.
- */
-void do_gettimeofday(struct timeval *tv)
-{
-       unsigned long seq;
-       unsigned long usec, sec;
-       unsigned long max_ntp_tick;
-
-       do {
-               seq = read_seqbegin(&xtime_lock);
-
-               usec = do_gettimeoffset();
-
-               /*
-                * If time_adjust is negative then NTP is slowing the clock
-                * so make sure not to go into next possible interval.
-                * Better to lose some accuracy than have time go backwards..
-                */
-               if (unlikely(time_adjust < 0)) {
-                       max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
-                       usec = min(usec, max_ntp_tick);
-               }
-
-               sec = xtime.tv_sec;
-               usec += (xtime.tv_nsec / 1000);
-
-       } while (read_seqretry(&xtime_lock, seq));
-
-       while (usec >= 1000000) {
-               usec -= 1000000;
-               sec++;
-       }
-
-       tv->tv_sec = sec;
-       tv->tv_usec = usec;
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
-
-int do_settimeofday(struct timespec *tv)
-{
-       time_t wtm_sec, sec = tv->tv_sec;
-       long wtm_nsec, nsec = tv->tv_nsec;
-
-       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-               return -EINVAL;
-
-       write_seqlock_irq(&xtime_lock);
-
-       /*
-        * This is revolting.  We need to set "xtime" correctly.  However,
-        * the value in this location is the value at the most recent update
-        * of wall time.  Discover what correction gettimeofday() would have
-        * made, and then undo it!
-        */
-       nsec -= do_gettimeoffset() * NSEC_PER_USEC;
-
-       wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
-       wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
-
-       set_normalized_timespec(&xtime, sec, nsec);
-       set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-       ntp_clear();
-       write_sequnlock_irq(&xtime_lock);
-       clock_was_set();
-       return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
-
 /*
  * Gettimeoffset routines.  These routines returns the time duration
  * since last timer interrupt in usecs.
index 5b06349af2d56e84286b62bd2d0af79cdf81185c..88b72c9a84957f2ac787ccf83fa46c4dbb0818d2 100644 (file)
@@ -163,10 +163,10 @@ static int __init page_is_ram(unsigned long pagenr)
 
 void __init paging_init(void)
 {
-       unsigned long zones_size[] = { 0, };
+       unsigned long zones_size[MAX_NR_ZONES] = { 0, };
        unsigned long max_dma, high, low;
 #ifndef CONFIG_FLATMEM
-       unsigned long zholes_size[] = { 0, };
+       unsigned long zholes_size[MAX_NR_ZONES] = { 0, };
        unsigned long i, j, pfn;
 #endif
 
index edefa97b233098327e0b6aefbe961403491d9501..3cf0dd4ba548a95a669b563eef477d61a6e4ca9a 100644 (file)
@@ -7,7 +7,6 @@ obj-y                           += pci.o
 #
 # PCI bus host bridge specific code
 #
-obj-$(CONFIG_ITE_BOARD_GEN)    += ops-it8172.o
 obj-$(CONFIG_MIPS_BONITO64)    += ops-bonito64.o
 obj-$(CONFIG_MIPS_GT64111)     += ops-gt64111.o
 obj-$(CONFIG_MIPS_GT64120)     += ops-gt64120.o
@@ -28,8 +27,6 @@ obj-$(CONFIG_LASAT)           += pci-lasat.o
 obj-$(CONFIG_MIPS_ATLAS)       += fixup-atlas.o
 obj-$(CONFIG_MIPS_COBALT)      += fixup-cobalt.o
 obj-$(CONFIG_MIPS_EV64120)     += fixup-ev64120.o
-obj-$(CONFIG_MIPS_ITE8172)     += fixup-ite8172g.o
-obj-$(CONFIG_MIPS_IVR)         += fixup-ivr.o
 obj-$(CONFIG_SOC_AU1500)       += fixup-au1000.o ops-au1000.o
 obj-$(CONFIG_SOC_AU1550)       += fixup-au1000.o ops-au1000.o
 obj-$(CONFIG_SOC_PNX8550)      += fixup-pnx8550.o ops-pnx8550.o
diff --git a/arch/mips/pci/fixup-ite8172g.c b/arch/mips/pci/fixup-ite8172g.c
deleted file mode 100644 (file)
index 2290ea4..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Board specific pci fixups.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_pci.h>
-#include <asm/it8172/it8172_int.h>
-
-/*
- * Shortcuts
- */
-#define INTA   IT8172_PCI_INTA_IRQ
-#define INTB   IT8172_PCI_INTB_IRQ
-#define INTC   IT8172_PCI_INTC_IRQ
-#define INTD   IT8172_PCI_INTD_IRQ
-
-static const int internal_func_irqs[7] __initdata = {
-       IT8172_AC97_IRQ,
-       IT8172_DMA_IRQ,
-       IT8172_CDMA_IRQ,
-       IT8172_USB_IRQ,
-       IT8172_BRIDGE_MASTER_IRQ,
-       IT8172_IDE_IRQ,
-       IT8172_MC68K_IRQ
-};
-
-static char irq_tab_ite8172g[][5] __initdata = {
- [0x10] = {    0, INTA, INTB, INTC, INTD },
- [0x11] = {    0, INTA, INTB, INTC, INTD },
- [0x12] = {    0, INTB, INTC, INTD, INTA },
- [0x13] = {    0, INTC, INTD, INTA, INTB },
- [0x14] = {    0, INTD, INTA, INTB, INTC },
-};
-
-int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-{
-       /*
-        * Internal device 1 is actually 7 different internal devices on the
-        * IT8172G (a multifunction device).
-        */
-       if (slot == 1)
-               return internal_func_irqs[PCI_FUNC(dev->devfn)];
-
-       return irq_tab_ite8172g[slot][pin];
-}
-
-/* Do platform specific device initialization at pci_enable_device() time */
-int pcibios_plat_dev_init(struct pci_dev *dev)
-{
-       return 0;
-}
diff --git a/arch/mips/pci/fixup-ivr.c b/arch/mips/pci/fixup-ivr.c
deleted file mode 100644 (file)
index 0c7c164..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Globespan IVR board-specific pci fixups.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_pci.h>
-#include <asm/it8172/it8172_int.h>
-
-/*
- * Shortcuts
- */
-#define INTA   IT8172_PCI_INTA_IRQ
-#define INTB   IT8172_PCI_INTB_IRQ
-#define INTC   IT8172_PCI_INTC_IRQ
-#define INTD   IT8172_PCI_INTD_IRQ
-
-static const int internal_func_irqs[7] __initdata = {
-       IT8172_AC97_IRQ,
-       IT8172_DMA_IRQ,
-       IT8172_CDMA_IRQ,
-       IT8172_USB_IRQ,
-       IT8172_BRIDGE_MASTER_IRQ,
-       IT8172_IDE_IRQ,
-       IT8172_MC68K_IRQ
-};
-
-static char irq_tab_ivr[][5] __initdata = {
- [0x11] = { INTC, INTC, INTD, INTA, INTB },    /* Realtek RTL-8139     */
- [0x12] = { INTB, INTB, INTB, INTC, INTC },    /* IVR slot             */
- [0x13] = { INTA, INTA, INTB, INTC, INTD }     /* Expansion slot       */
-};
-
-int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-{
-       if (slot == 1)
-               return internal_func_irqs[PCI_FUNC(dev->devfn)];
-
-       return irq_tab_ivr[slot][pin];
-}
-
-/* Do platform specific device initialization at pci_enable_device() time */
-int pcibios_plat_dev_init(struct pci_dev *dev)
-{
-       return 0;
-}
index 13791b78e59890f525e8600889418b8f5159982a..7a7444874e80341522eb1cadd0c3b2d078d7b8d2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     arch/mips/pci/fixup-sb1250.c
  *
- *     Copyright (C) 2004  MIPS Technologies, Inc.  All rights reserved.
+ *     Copyright (C) 2004, 2006  MIPS Technologies, Inc.  All rights reserved.
  *         Author:     Maciej W. Rozycki <macro@mips.com>
  *
  *     This program is free software; you can redistribute it and/or
 #include <linux/init.h>
 #include <linux/pci.h>
 
+/*
+ * Set the the BCM1250, etc. PCI host bridge's TRDY timeout
+ * to the finite max.
+ */
+static void __init quirk_sb1250_pci(struct pci_dev *dev)
+{
+       pci_write_config_byte(dev, 0x40, 0xff);
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_PCI,
+                       quirk_sb1250_pci);
+
 /*
  * The BCM1250, etc. PCI/HT bridge reports as a host bridge.
  */
@@ -22,3 +33,13 @@ static void __init quirk_sb1250_ht(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_HT,
                        quirk_sb1250_ht);
+
+/*
+ * Set the the SP1011 HT/PCI bridge's TRDY timeout to the finite max.
+ */
+static void __init quirk_sp1011(struct pci_dev *dev)
+{
+       pci_write_config_byte(dev, 0x64, 0xff);
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIPACKETS, PCI_DEVICE_ID_SP1011,
+                       quirk_sp1011);
diff --git a/arch/mips/pci/ops-it8172.c b/arch/mips/pci/ops-it8172.c
deleted file mode 100644 (file)
index ba83285..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     IT8172 system controller specific pci support.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_pci.h>
-
-#define PCI_ACCESS_READ  0
-#define PCI_ACCESS_WRITE 1
-
-#undef DEBUG
-#ifdef DEBUG
-#define DBG(x...) printk(x)
-#else
-#define DBG(x...)
-#endif
-
-static struct resource pci_mem_resource_1;
-
-static struct resource pci_io_resource = {
-       .start  = 0x14018000,
-       .end    = 0x17FFFFFF,
-       .name   = "io pci IO space",
-       .flags  = IORESOURCE_IO
-};
-
-static struct resource pci_mem_resource_0 = {
-       .start  = 0x10101000,
-       .end    = 0x13FFFFFF,
-       .name   = "ext pci memory space 0/1",
-       .flags  = IORESOURCE_MEM,
-       .parent = &pci_mem_resource_0,
-       .sibling = NULL,
-       .child  = &pci_mem_resource_1
-};
-
-static struct resource pci_mem_resource_1 = {
-       .start  = 0x1A000000,
-       .end    = 0x1FBFFFFF,
-       .name   = "ext pci memory space 2/3",
-       .flags  = IORESOURCE_MEM,
-       .parent = &pci_mem_resource_0
-};
-
-extern struct pci_ops it8172_pci_ops;
-
-struct pci_controller it8172_controller = {
-       .pci_ops        = &it8172_pci_ops,
-       .io_resource    = &pci_io_resource,
-       .mem_resource   = &pci_mem_resource_0,
-};
-
-static int it8172_pcibios_config_access(unsigned char access_type,
-                                       struct pci_bus *bus,
-                                       unsigned int devfn, int where,
-                                       u32 * data)
-{
-       /*
-        * config cycles are on 4 byte boundary only
-        */
-
-       /* Setup address */
-       IT_WRITE(IT_CONFADDR, (bus->number << IT_BUSNUM_SHF) |
-                (devfn << IT_FUNCNUM_SHF) | (where & ~0x3));
-
-       if (access_type == PCI_ACCESS_WRITE) {
-               IT_WRITE(IT_CONFDATA, *data);
-       } else {
-               IT_READ(IT_CONFDATA, *data);
-       }
-
-       /*
-        * Revisit: check for master or target abort.
-        */
-       return 0;
-}
-
-
-/*
- * We can't address 8 and 16 bit words directly.  Instead we have to
- * read/write a 32bit word and mask/modify the data we actually want.
- */
-static write_config(struct pci_bus *bus, unsigned int devfn, int where,
-                   int size, u32 val)
-{
-       u32 data = 0;
-
-       switch (size) {
-       case 1:
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_READ, dev, where, &data))
-                       return -1;
-
-               *val = (data >> ((where & 3) << 3)) & 0xff;
-
-               return PCIBIOS_SUCCESSFUL;
-
-       case 2:
-
-               if (where & 1)
-                       return PCIBIOS_BAD_REGISTER_NUMBER;
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_READ, dev, where, &data))
-                       return -1;
-
-               *val = (data >> ((where & 3) << 3)) & 0xffff;
-               DBG("cfg read word: bus %d dev_fn %x where %x: val %x\n",
-                   dev->bus->number, dev->devfn, where, *val);
-
-               return PCIBIOS_SUCCESSFUL;
-
-       case 4:
-
-               if (where & 3)
-                       return PCIBIOS_BAD_REGISTER_NUMBER;
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_READ, dev, where, &data))
-                       return -1;
-
-               *val = data;
-
-               return PCIBIOS_SUCCESSFUL;
-       }
-}
-
-
-static write_config(struct pci_bus *bus, unsigned int devfn, int where,
-                   int size, u32 val)
-{
-       u32 data = 0;
-
-       switch (size) {
-       case 1:
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_READ, dev, where, &data))
-                       return -1;
-
-               data = (data & ~(0xff << ((where & 3) << 3))) |
-                   (val << ((where & 3) << 3));
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_WRITE, dev, where, &data))
-                       return -1;
-
-               return PCIBIOS_SUCCESSFUL;
-
-       case 2:
-               if (where & 1)
-                       return PCIBIOS_BAD_REGISTER_NUMBER;
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_READ, dev, where, &data))
-                       eturn - 1;
-
-               data = (data & ~(0xffff << ((where & 3) << 3))) |
-                   (val << ((where & 3) << 3));
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_WRITE, dev, where, &data))
-                       return -1;
-
-               return PCIBIOS_SUCCESSFUL;
-
-       case 4:
-               if (where & 3)
-                       return PCIBIOS_BAD_REGISTER_NUMBER;
-
-               if (it8172_pcibios_config_access
-                   (PCI_ACCESS_WRITE, dev, where, &val))
-                       return -1;
-
-               return PCIBIOS_SUCCESSFUL;
-       }
-}
-
-struct pci_ops it8172_pci_ops = {
-       .read = read_config,
-       .write = write_config,
-};
index a0222fa4416cb62537302e01c4b5ed6a3436d491..a46b75b23ecb1e2ef10f4470279764f23905dacc 100644 (file)
@@ -482,7 +482,7 @@ asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
        write_c0_compare(read_c0_count());
 #endif
 
-       pending = read_c0_cause();
+       pending = read_c0_cause() & read_c0_status();
 
 #ifdef CONFIG_SIBYTE_BCM1480_PROF
        if (pending & CAUSEF_IP7)       /* Cpu performance counter interrupt */
index a451b4c7732d9baae2127529c74f974cf2154278..f9bd9f074517575cae863c3b03b2200d22c5677a 100644 (file)
@@ -442,7 +442,7 @@ asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
         * blasting the high 32 bits.
         */
 
-       pending = read_c0_cause();
+       pending = read_c0_cause() & read_c0_status();
 
 #ifdef CONFIG_SIBYTE_SB1250_PROF
        if (pending & CAUSEF_IP7) /* Cpu performance counter interrupt */
@@ -476,5 +476,8 @@ asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
                                              R_IMR_INTERRUPT_STATUS_BASE)));
                if (mask)
                        do_IRQ(fls64(mask) - 1, regs);
-       }
+               else
+                       spurious_interrupt(regs);
+       } else
+               spurious_interrupt(regs);
 }
index 73dfdcebfbba64a725a99fbb637242e07c1c5071..83683a2d8e6a9822ef2ee2f2a567b7600dea241f 100644 (file)
@@ -1,3 +1,2 @@
 consolemap_deftbl.c
 defkeymap.c
-qtronixmap.c
index bde1c665d9f4b1cf6e70cfa9ba32ec7bd765d3cc..0e6f35fcc2ebf9ed0fd36ddaa74c5faf3b8cedac 100644 (file)
@@ -371,36 +371,6 @@ config AU1000_SERIAL_CONSOLE
          If you have an Alchemy AU1000 processor (MIPS based) and you want
          to use a console on a serial port, say Y.  Otherwise, say N.
 
-config QTRONIX_KEYBOARD
-       bool "Enable Qtronix 990P Keyboard Support"
-       depends on IT8712
-       help
-         Images of Qtronix keyboards are at
-         <http://www.qtronix.com/keyboard.html>.
-
-config IT8172_CIR
-       bool
-       depends on QTRONIX_KEYBOARD
-       default y
-
-config IT8172_SCR0
-       bool "Enable Smart Card Reader 0 Support "
-       depends on IT8712
-       help
-         Say Y here to support smart-card reader 0 (SCR0) on the Integrated
-         Technology Express, Inc. ITE8172 SBC.  Vendor page at
-         <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-         board at <http://www.mvista.com/partners/semiconductor/ite.html>.
-
-config IT8172_SCR1
-       bool "Enable Smart Card Reader 1 Support "
-       depends on IT8712
-       help
-         Say Y here to support smart-card reader 1 (SCR1) on the Integrated
-         Technology Express, Inc. ITE8172 SBC.  Vendor page at
-         <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-         board at <http://www.mvista.com/partners/semiconductor/ite.html>.
-
 config A2232
        tristate "Commodore A2232 serial support (EXPERIMENTAL)"
        depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP
index 19114df59bbdf72e973812808f66caaa65ca4df2..777cad045094672c0d1fe86f0fa2df3d15cb42c4 100644 (file)
@@ -102,7 +102,7 @@ obj-$(CONFIG_HANGCHECK_TIMER)       += hangcheck-timer.o
 obj-$(CONFIG_TCG_TPM)          += tpm/
 
 # Files generated that shall be removed upon make clean
-clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c
+clean-files := consolemap_deftbl.c defkeymap.c
 
 quiet_cmd_conmk = CONMK   $@
       cmd_conmk = scripts/conmakehash $< > $@
@@ -112,8 +112,6 @@ $(obj)/consolemap_deftbl.c: $(src)/$(FONTMAPFILE)
 
 $(obj)/defkeymap.o:  $(obj)/defkeymap.c
 
-$(obj)/qtronixmap.o: $(obj)/qtronixmap.c
-
 # Uncomment if you're changing the keymap and have an appropriate
 # loadkeys version for the map. By default, we'll use the shipped
 # versions.
@@ -121,7 +119,7 @@ $(obj)/qtronixmap.o: $(obj)/qtronixmap.c
 
 ifdef GENERATE_KEYMAP
 
-$(obj)/defkeymap.c $(obj)/qtronixmap.c: $(obj)/%.c: $(src)/%.map
+$(obj)/defkeymap.c $(obj)/%.c: $(src)/%.map
        loadkeys --mktable $< > $@.tmp
        sed -e 's/^static *//' $@.tmp > $@
        rm $@.tmp
diff --git a/drivers/char/ite_gpio.c b/drivers/char/ite_gpio.c
deleted file mode 100644 (file)
index ef14b6d..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * FILE NAME ite_gpio.c
- *
- * BRIEF MODULE DESCRIPTION
- *  API for ITE GPIO device.
- *  Driver for ITE GPIO device.
- *
- *  Author: MontaVista Software, Inc.  <source@mvista.com>
- *          Hai-Pao Fan <haipao@mvista.com>
- *
- * Copyright 2001 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE  LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/miscdevice.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <asm/uaccess.h>
-#include <asm/addrspace.h>
-#include <asm/it8172/it8172_int.h>
-#include <linux/sched.h>
-#include <linux/ite_gpio.h>
-
-#define ite_gpio_base 0x14013800
-
-#define        ITE_GPADR       (*(volatile __u8 *)(0x14013800 + KSEG1))
-#define        ITE_GPBDR       (*(volatile __u8 *)(0x14013808 + KSEG1))
-#define        ITE_GPCDR       (*(volatile __u8 *)(0x14013810 + KSEG1))
-#define        ITE_GPACR       (*(volatile __u16 *)(0x14013802 + KSEG1))
-#define        ITE_GPBCR       (*(volatile __u16 *)(0x1401380a + KSEG1))
-#define        ITE_GPCCR       (*(volatile __u16 *)(0x14013812 + KSEG1))
-#define ITE_GPAICR     (*(volatile __u16 *)(0x14013804 + KSEG1))
-#define        ITE_GPBICR      (*(volatile __u16 *)(0x1401380c + KSEG1))
-#define        ITE_GPCICR      (*(volatile __u16 *)(0x14013814 + KSEG1))
-#define        ITE_GPAISR      (*(volatile __u8 *)(0x14013806 + KSEG1))
-#define        ITE_GPBISR      (*(volatile __u8 *)(0x1401380e + KSEG1))
-#define        ITE_GPCISR      (*(volatile __u8 *)(0x14013816 + KSEG1))
-#define        ITE_GCR         (*(volatile __u8 *)(0x14013818 + KSEG1))
-
-#define MAX_GPIO_LINE          21
-static int ite_gpio_irq=IT8172_GPIO_IRQ;
-
-static long ite_irq_counter[MAX_GPIO_LINE];
-wait_queue_head_t ite_gpio_wait[MAX_GPIO_LINE];
-static int ite_gpio_irq_pending[MAX_GPIO_LINE];
-
-static int ite_gpio_debug=0;
-#define DEB(x)  if (ite_gpio_debug>=1) x
-
-int ite_gpio_in(__u32 device, __u32 mask, volatile __u32 *data)
-{
-       DEB(printk("ite_gpio_in mask=0x%x\n",mask)); 
-
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               ITE_GPACR = (__u16)mask;        /* 0xffff */
-               *data = ITE_GPADR;
-               break;
-       case ITE_GPIO_PORTB:
-               ITE_GPBCR = (__u16)mask;        /* 0xffff */
-               *data = ITE_GPBDR;
-               break;
-       case ITE_GPIO_PORTC:
-               ITE_GPCCR = (__u16)mask;        /* 0x03ff */
-               *data = ITE_GPCDR;
-               break;
-       default:
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-
-int ite_gpio_out(__u32 device, __u32 mask, __u32 data)
-{
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               ITE_GPACR = (__u16)mask;        /* 0x5555 */
-               ITE_GPADR = (__u8)data;
-               break;
-       case ITE_GPIO_PORTB:
-               ITE_GPBCR = (__u16)mask;        /* 0x5555 */
-               ITE_GPBDR = (__u8)data;
-               break;
-       case ITE_GPIO_PORTC:
-               ITE_GPCCR = (__u16)mask;        /* 0x0155 */
-               ITE_GPCDR = (__u8)data;
-               break;
-       default:
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-int ite_gpio_int_ctrl(__u32 device, __u32 mask, __u32 data)
-{
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               ITE_GPAICR = (ITE_GPAICR & ~mask) | (data & mask);
-               break;
-       case ITE_GPIO_PORTB:
-               ITE_GPBICR = (ITE_GPBICR & ~mask) | (data & mask);
-               break;
-       case ITE_GPIO_PORTC:
-               ITE_GPCICR = (ITE_GPCICR & ~mask) | (data & mask);
-               break;
-       default:
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-int ite_gpio_in_status(__u32 device, __u32 mask, volatile __u32 *data)
-{
-       int ret=-1;
-
-       if ((MAX_GPIO_LINE > *data) && (*data >= 0)) 
-               ret=ite_gpio_irq_pending[*data];
-       DEB(printk("ite_gpio_in_status %d ret=%d\n",*data, ret));
-
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               *data = ITE_GPAISR & mask;
-               break;
-       case ITE_GPIO_PORTB:
-               *data = ITE_GPBISR & mask;
-               break;
-       case ITE_GPIO_PORTC:
-               *data = ITE_GPCISR & mask;
-               break;
-       default:
-               return -EFAULT;
-       }
-
-       return ret;
-}
-
-int ite_gpio_out_status(__u32 device, __u32 mask, __u32 data)
-{
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               ITE_GPAISR = (ITE_GPAISR & ~mask) | (data & mask);
-               break;
-       case ITE_GPIO_PORTB:
-               ITE_GPBISR = (ITE_GPBISR & ~mask) | (data & mask);
-               break;
-       case ITE_GPIO_PORTC:
-               ITE_GPCISR = (ITE_GPCISR & ~mask) | (data & mask);
-               break;
-       default:
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-int ite_gpio_gen_ctrl(__u32 device, __u32 mask, __u32 data)
-{
-       ITE_GCR = (ITE_GCR & ~mask) | (data & mask);
-
-       return 0;
-}
-
-int ite_gpio_int_wait (__u32 device, __u32 mask, __u32 data)
-{
-       int i,line=0, ret=0;
-       unsigned long flags;
-
-       switch (device) {
-       case ITE_GPIO_PORTA:
-               line = data & mask;
-               break;
-       case ITE_GPIO_PORTB:
-               line = (data & mask) <<8;
-               break;
-       case ITE_GPIO_PORTC:
-               line = (data & mask) <<16;
-               break;
-       }
-       for (i=MAX_GPIO_LINE-1; i >= 0; i--) {
-               if ( (line) & (1 << i))
-                       break;
-       }
-
-       DEB(printk("wait device=0x%d mask=0x%x data=0x%x index %d\n", 
-               device, mask, data, i));
-
-       if (line & ~(1<<i))
-               return -EFAULT;
-
-       if (ite_gpio_irq_pending[i]==1)
-               return -EFAULT;
-
-       save_flags (flags);
-       cli();
-       ite_gpio_irq_pending[i] = 1;
-       ret = interruptible_sleep_on_timeout(&ite_gpio_wait[i], 3*HZ);
-       restore_flags (flags);
-       ite_gpio_irq_pending[i] = 0;
-
-       return ret;
-}
-
-EXPORT_SYMBOL(ite_gpio_in);
-EXPORT_SYMBOL(ite_gpio_out);
-EXPORT_SYMBOL(ite_gpio_int_ctrl);
-EXPORT_SYMBOL(ite_gpio_in_status);
-EXPORT_SYMBOL(ite_gpio_out_status);
-EXPORT_SYMBOL(ite_gpio_gen_ctrl);
-EXPORT_SYMBOL(ite_gpio_int_wait);
-
-static int ite_gpio_open(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-
-static int ite_gpio_release(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-
-static int ite_gpio_ioctl(struct inode *inode, struct file *file,
-       unsigned int cmd, unsigned long arg)
-{
-       static struct ite_gpio_ioctl_data ioctl_data;
-
-       if (copy_from_user(&ioctl_data, (struct ite_gpio_ioctl_data *)arg,
-                       sizeof(ioctl_data)))
-               return -EFAULT;
-       if ((ioctl_data.device < ITE_GPIO_PORTA) ||
-                       (ioctl_data.device > ITE_GPIO_PORTC) )
-                               return -EFAULT;
-
-       switch(cmd) {
-               case ITE_GPIO_IN:
-                       if (ite_gpio_in(ioctl_data.device, ioctl_data.mask,
-                                          &ioctl_data.data))
-                               return -EFAULT;
-
-                       if (copy_to_user((struct ite_gpio_ioctl_data *)arg,
-                                        &ioctl_data, sizeof(ioctl_data)))
-                               return -EFAULT;
-                       break;
-
-               case ITE_GPIO_OUT:
-                       return ite_gpio_out(ioctl_data.device,
-                                       ioctl_data.mask, ioctl_data.data);
-                       break;
-
-               case ITE_GPIO_INT_CTRL:
-                       return ite_gpio_int_ctrl(ioctl_data.device,
-                                       ioctl_data.mask, ioctl_data.data);
-                       break;
-
-               case ITE_GPIO_IN_STATUS:
-                       if (ite_gpio_in_status(ioctl_data.device, ioctl_data.mask,
-                                       &ioctl_data.data))
-                               return -EFAULT;
-                       if (copy_to_user((struct ite_gpio_ioctl_data *)arg,
-                                       &ioctl_data, sizeof(ioctl_data))) 
-                               return -EFAULT;
-                       break;
-
-               case ITE_GPIO_OUT_STATUS:
-                       return ite_gpio_out_status(ioctl_data.device,
-                                       ioctl_data.mask, ioctl_data.data);
-                       break;
-
-               case ITE_GPIO_GEN_CTRL:
-                       return ite_gpio_gen_ctrl(ioctl_data.device,
-                                       ioctl_data.mask, ioctl_data.data);
-                       break;
-
-               case ITE_GPIO_INT_WAIT:
-                       return ite_gpio_int_wait(ioctl_data.device,
-                                       ioctl_data.mask, ioctl_data.data);
-                       break;
-
-               default:
-                       return -ENOIOCTLCMD;
-
-       }
-
-       return 0;
-}
-
-static void ite_gpio_irq_handler(int this_irq, void *dev_id,
-       struct pt_regs *regs)
-{
-       int i,line;
-
-       line = ITE_GPCISR & 0x1f;
-       for (i=4; i >=0; i--) {
-               if ( line & (1 << i)) { 
-                       ++ite_irq_counter[i+16];
-                       ite_gpio_irq_pending[i+16] = 2;
-                       wake_up_interruptible(&ite_gpio_wait[i+16]);
-
-DEB(printk("interrupt 0x%x %d\n", &ite_gpio_wait[i+16], i+16));
-
-                       ITE_GPCISR = ITE_GPCISR & (1<<i);
-                       return;
-               }
-       }
-       line = ITE_GPBISR;
-       for (i=7; i >= 0; i--) {
-               if ( line & (1 << i)) {
-                       ++ite_irq_counter[i+8];
-                       ite_gpio_irq_pending[i+8] = 2;
-                       wake_up_interruptible(&ite_gpio_wait[i+8]);
-
-DEB(printk("interrupt 0x%x %d\n",ITE_GPBISR, i+8));
-
-                       ITE_GPBISR = ITE_GPBISR & (1<<i);
-                       return;
-               }
-       }
-       line = ITE_GPAISR;
-       for (i=7; i >= 0; i--) {
-               if ( line & (1 << i)) {
-                       ++ite_irq_counter[i];
-                       ite_gpio_irq_pending[i] = 2;
-                       wake_up_interruptible(&ite_gpio_wait[i]);
-
-DEB(printk("interrupt 0x%x %d\n",ITE_GPAISR, i));
-
-                       ITE_GPAISR = ITE_GPAISR & (1<<i);
-                       return;
-               }
-       }
-}
-
-static const struct file_operations ite_gpio_fops = {
-       .owner          = THIS_MODULE,
-       .ioctl          = ite_gpio_ioctl,
-       .open           = ite_gpio_open,
-       .release        = ite_gpio_release,
-};
-
-static struct miscdevice ite_gpio_miscdev = {
-       MISC_DYNAMIC_MINOR,
-       "ite_gpio",
-       &ite_gpio_fops
-};
-
-int __init ite_gpio_init(void)
-{
-       int i;
-
-       if (misc_register(&ite_gpio_miscdev))
-               return -ENODEV;
-
-       if (!request_region(ite_gpio_base, 0x1c, "ITE GPIO"))
-       {
-               misc_deregister(&ite_gpio_miscdev);
-               return -EIO;
-       }
-
-       /* initialize registers */
-       ITE_GPACR = 0xffff;
-       ITE_GPBCR = 0xffff;
-       ITE_GPCCR = 0xffff;
-       ITE_GPAICR = 0x00ff;
-       ITE_GPBICR = 0x00ff;
-       ITE_GPCICR = 0x00ff;
-       ITE_GCR = 0;
-       
-       for (i = 0; i < MAX_GPIO_LINE; i++) {
-               ite_gpio_irq_pending[i]=0;      
-               init_waitqueue_head(&ite_gpio_wait[i]);
-       }
-
-       if (request_irq(ite_gpio_irq, ite_gpio_irq_handler, IRQF_SHARED, "gpio", 0) < 0) {
-               misc_deregister(&ite_gpio_miscdev);
-               release_region(ite_gpio_base, 0x1c);
-               return 0;
-       }
-
-       printk("GPIO at 0x%x (irq = %d)\n", ite_gpio_base, ite_gpio_irq);
-
-       return 0;
-}      
-
-static void __exit ite_gpio_exit(void)
-{
-       misc_deregister(&ite_gpio_miscdev);
-}
-
-module_init(ite_gpio_init);
-module_exit(ite_gpio_exit);
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/char/qtronixmap.c_shipped b/drivers/char/qtronixmap.c_shipped
deleted file mode 100644 (file)
index 1e2b92b..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-
-/* Do not edit this file! It was automatically generated by   */
-/*    loadkeys --mktable defkeymap.map > defkeymap.c          */
-
-#include <linux/types.h>
-#include <linux/keyboard.h>
-#include <linux/kd.h>
-
-u_short plain_map[NR_KEYS] = {
-       0xf200, 0xf060, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036,
-       0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf200, 0xf07f,
-       0xf009, 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75,
-       0xfb69, 0xfb6f, 0xfb70, 0xf05b, 0xf05d, 0xf05c, 0xf207, 0xfb61,
-       0xfb73, 0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c,
-       0xf03b, 0xf027, 0xf060, 0xf201, 0xf700, 0xf200, 0xfb7a, 0xfb78,
-       0xfb63, 0xfb76, 0xfb62, 0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf02f,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf020, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf602, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf01b, 0xf200,
-       0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107,
-       0xf108, 0xf109, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short shift_map[NR_KEYS] = {
-       0xf200, 0xf07e, 0xf021, 0xf040, 0xf023, 0xf024, 0xf025, 0xf05e,
-       0xf026, 0xf02a, 0xf028, 0xf029, 0xf05f, 0xf02b, 0xf200, 0xf07f,
-       0xf009, 0xfb51, 0xfb57, 0xfb45, 0xfb52, 0xfb54, 0xfb59, 0xfb55,
-       0xfb49, 0xfb4f, 0xfb50, 0xf07b, 0xf07d, 0xf07c, 0xf207, 0xfb41,
-       0xfb53, 0xfb44, 0xfb46, 0xfb47, 0xfb48, 0xfb4a, 0xfb4b, 0xfb4c,
-       0xf03a, 0xf022, 0xf07e, 0xf201, 0xf700, 0xf200, 0xfb5a, 0xfb58,
-       0xfb43, 0xfb56, 0xfb42, 0xfb4e, 0xfb4d, 0xf03c, 0xf03e, 0xf03f,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf020, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf20b, 0xf20a, 0xf200,
-       0xf200, 0xf602, 0xf213, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf01b, 0xf200,
-       0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, 0xf110, 0xf111,
-       0xf112, 0xf113, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short altgr_map[NR_KEYS] = {
-       0xf200, 0xf200, 0xf200, 0xf040, 0xf200, 0xf024, 0xf200, 0xf200,
-       0xf07b, 0xf05b, 0xf05d, 0xf07d, 0xf05c, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75,
-       0xfb69, 0xfb6f, 0xfb70, 0xf200, 0xf200, 0xf200, 0xf207, 0xfb61,
-       0xfb73, 0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c,
-       0xf200, 0xf200, 0xf200, 0xf201, 0xf700, 0xf200, 0xfb7a, 0xfb78,
-       0xfb63, 0xfb76, 0xfb62, 0xfb6e, 0xfb6d, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf200, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf602, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf200, 0xf200,
-       0xf50c, 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511, 0xf512, 0xf513,
-       0xf514, 0xf515, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short ctrl_map[NR_KEYS] = {
-       0xf200, 0xf200, 0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e,
-       0xf01f, 0xf07f, 0xf200, 0xf200, 0xf01f, 0xf200, 0xf200, 0xf008,
-       0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015,
-       0xf009, 0xf00f, 0xf010, 0xf01b, 0xf01d, 0xf01c, 0xf207, 0xf001,
-       0xf013, 0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c,
-       0xf007, 0xf000, 0xf200, 0xf201, 0xf700, 0xf200, 0xf01a, 0xf018,
-       0xf003, 0xf016, 0xf002, 0xf00e, 0xf20e, 0xf07f, 0xf200, 0xf200,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf000, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf602, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf200, 0xf200,
-       0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107,
-       0xf108, 0xf109, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short shift_ctrl_map[NR_KEYS] = {
-       0xf200, 0xf200, 0xf200, 0xf000, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf01f, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015,
-       0xf009, 0xf00f, 0xf010, 0xf200, 0xf200, 0xf200, 0xf207, 0xf001,
-       0xf013, 0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c,
-       0xf200, 0xf200, 0xf200, 0xf201, 0xf700, 0xf200, 0xf01a, 0xf018,
-       0xf003, 0xf016, 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf200, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf602, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short alt_map[NR_KEYS] = {
-       0xf200, 0xf81b, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836,
-       0xf837, 0xf838, 0xf839, 0xf830, 0xf82d, 0xf83d, 0xf200, 0xf87f,
-       0xf809, 0xf871, 0xf877, 0xf865, 0xf872, 0xf874, 0xf879, 0xf875,
-       0xf869, 0xf86f, 0xf870, 0xf85b, 0xf85d, 0xf85c, 0xf207, 0xf861,
-       0xf873, 0xf864, 0xf866, 0xf867, 0xf868, 0xf86a, 0xf86b, 0xf83b,
-       0xf827, 0xf860, 0xf200, 0xf80d, 0xf700, 0xf200, 0xf87a, 0xf878,
-       0xf863, 0xf876, 0xf862, 0xf82c, 0xf82e, 0xf82f, 0xf200, 0xf200,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf820, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf210,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf211, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf200, 0xf200,
-       0xf500, 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507,
-       0xf508, 0xf509, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-u_short ctrl_alt_map[NR_KEYS] = {
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf811, 0xf817, 0xf805, 0xf812, 0xf814, 0xf819, 0xf815,
-       0xf809, 0xf80f, 0xf810, 0xf200, 0xf200, 0xf200, 0xf207, 0xf801,
-       0xf813, 0xf804, 0xf806, 0xf807, 0xf808, 0xf80a, 0xf80b, 0xf80c,
-       0xf200, 0xf200, 0xf200, 0xf201, 0xf700, 0xf200, 0xf81a, 0xf818,
-       0xf803, 0xf816, 0xf802, 0xf80e, 0xf80d, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf700, 0xf702, 0xf200, 0xf703, 0xf200, 0xf703, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf601,
-       0xf200, 0xf200, 0xf200, 0xf603, 0xf600, 0xf118, 0xf119, 0xf200,
-       0xf200, 0xf602, 0xf208, 0xf02d, 0xf02b, 0xf30c, 0xf02e, 0xf30d,
-       0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
-       0xf200, 0xf200, 0xf200, 0xf117, 0xf600, 0xf200, 0xf200, 0xf200,
-       0xf500, 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507,
-       0xf508, 0xf509, 0xf200, 0xf200, 0xf200, 0xf200, 0xf11d, 0xf200,
-};
-
-ushort *key_maps[MAX_NR_KEYMAPS] = {
-       plain_map, shift_map, altgr_map, 0,
-       ctrl_map, shift_ctrl_map, 0, 0,
-       alt_map, 0, 0, 0,
-       ctrl_alt_map,   0
-};
-
-unsigned int keymap_count = 7;
-
-
-/*
- * Philosophy: most people do not define more strings, but they who do
- * often want quite a lot of string space. So, we statically allocate
- * the default and allocate dynamically in chunks of 512 bytes.
- */
-
-char func_buf[] = {
-       '\033', '[', '[', 'A', 0, 
-       '\033', '[', '[', 'B', 0, 
-       '\033', '[', '[', 'C', 0, 
-       '\033', '[', '[', 'D', 0, 
-       '\033', '[', '[', 'E', 0, 
-       '\033', '[', '1', '7', '~', 0, 
-       '\033', '[', '1', '8', '~', 0, 
-       '\033', '[', '1', '9', '~', 0, 
-       '\033', '[', '2', '0', '~', 0, 
-       '\033', '[', '2', '1', '~', 0, 
-       '\033', '[', '2', '3', '~', 0, 
-       '\033', '[', '2', '4', '~', 0, 
-       '\033', '[', '2', '5', '~', 0, 
-       '\033', '[', '2', '6', '~', 0, 
-       '\033', '[', '2', '8', '~', 0, 
-       '\033', '[', '2', '9', '~', 0, 
-       '\033', '[', '3', '1', '~', 0, 
-       '\033', '[', '3', '2', '~', 0, 
-       '\033', '[', '3', '3', '~', 0, 
-       '\033', '[', '3', '4', '~', 0, 
-       '\033', '[', '1', '~', 0, 
-       '\033', '[', '2', '~', 0, 
-       '\033', '[', '3', '~', 0, 
-       '\033', '[', '4', '~', 0, 
-       '\033', '[', '5', '~', 0, 
-       '\033', '[', '6', '~', 0, 
-       '\033', '[', 'M', 0, 
-       '\033', '[', 'P', 0, 
-};
-
-
-char *funcbufptr = func_buf;
-int funcbufsize = sizeof(func_buf);
-int funcbufleft = 0;          /* space left */
-
-char *func_table[MAX_NR_FUNC] = {
-       func_buf + 0,
-       func_buf + 5,
-       func_buf + 10,
-       func_buf + 15,
-       func_buf + 20,
-       func_buf + 25,
-       func_buf + 31,
-       func_buf + 37,
-       func_buf + 43,
-       func_buf + 49,
-       func_buf + 55,
-       func_buf + 61,
-       func_buf + 67,
-       func_buf + 73,
-       func_buf + 79,
-       func_buf + 85,
-       func_buf + 91,
-       func_buf + 97,
-       func_buf + 103,
-       func_buf + 109,
-       func_buf + 115,
-       func_buf + 120,
-       func_buf + 125,
-       func_buf + 130,
-       func_buf + 135,
-       func_buf + 140,
-       func_buf + 145,
-       0,
-       0,
-       func_buf + 149,
-       0,
-};
-
-struct kbdiacr accent_table[MAX_DIACR] = {
-       {'`', 'A', 'À'},        {'`', 'a', 'à'},
-       {'\'', 'A', 'Á'},       {'\'', 'a', 'á'},
-       {'^', 'A', 'Â'},        {'^', 'a', 'â'},
-       {'~', 'A', 'Ã'},        {'~', 'a', 'ã'},
-       {'"', 'A', 'Ä'},        {'"', 'a', 'ä'},
-       {'O', 'A', 'Å'},        {'o', 'a', 'å'},
-       {'0', 'A', 'Å'},        {'0', 'a', 'å'},
-       {'A', 'A', 'Å'},        {'a', 'a', 'å'},
-       {'A', 'E', 'Æ'},        {'a', 'e', 'æ'},
-       {',', 'C', 'Ç'},        {',', 'c', 'ç'},
-       {'`', 'E', 'È'},        {'`', 'e', 'è'},
-       {'\'', 'E', 'É'},       {'\'', 'e', 'é'},
-       {'^', 'E', 'Ê'},        {'^', 'e', 'ê'},
-       {'"', 'E', 'Ë'},        {'"', 'e', 'ë'},
-       {'`', 'I', 'Ì'},        {'`', 'i', 'ì'},
-       {'\'', 'I', 'Í'},       {'\'', 'i', 'í'},
-       {'^', 'I', 'Î'},        {'^', 'i', 'î'},
-       {'"', 'I', 'Ï'},        {'"', 'i', 'ï'},
-       {'-', 'D', 'Ð'},        {'-', 'd', 'ð'},
-       {'~', 'N', 'Ñ'},        {'~', 'n', 'ñ'},
-       {'`', 'O', 'Ò'},        {'`', 'o', 'ò'},
-       {'\'', 'O', 'Ó'},       {'\'', 'o', 'ó'},
-       {'^', 'O', 'Ô'},        {'^', 'o', 'ô'},
-       {'~', 'O', 'Õ'},        {'~', 'o', 'õ'},
-       {'"', 'O', 'Ö'},        {'"', 'o', 'ö'},
-       {'/', 'O', 'Ø'},        {'/', 'o', 'ø'},
-       {'`', 'U', 'Ù'},        {'`', 'u', 'ù'},
-       {'\'', 'U', 'Ú'},       {'\'', 'u', 'ú'},
-       {'^', 'U', 'Û'},        {'^', 'u', 'û'},
-       {'"', 'U', 'Ü'},        {'"', 'u', 'ü'},
-       {'\'', 'Y', 'Ý'},       {'\'', 'y', 'ý'},
-       {'T', 'H', 'Þ'},        {'t', 'h', 'þ'},
-       {'s', 's', 'ß'},        {'"', 'y', 'ÿ'},
-       {'s', 'z', 'ß'},        {'i', 'j', 'ÿ'},
-};
-
-unsigned int accent_table_size = 68;
diff --git a/drivers/char/qtronixmap.map b/drivers/char/qtronixmap.map
deleted file mode 100644 (file)
index 8d1ff5c..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-# Default kernel keymap. This uses 7 modifier combinations.
-keymaps 0-2,4-5,8,12
-# Change the above line into
-#      keymaps 0-2,4-6,8,12
-# in case you want the entries
-#      altgr   control keycode  83 = Boot            
-#      altgr   control keycode 111 = Boot            
-# below.
-#
-# In fact AltGr is used very little, and one more keymap can
-# be saved by mapping AltGr to Alt (and adapting a few entries):
-# keycode 100 = Alt
-#
-keycode   1 = grave        asciitilde
-       alt     keycode   1 = Meta_Escape     
-keycode   2 = one              exclam          
-       alt     keycode   2 = Meta_one        
-keycode   3 = two              at               at              
-       control keycode   3 = nul             
-       shift   control keycode   3 = nul             
-       alt     keycode   3 = Meta_two        
-keycode   4 = three            numbersign      
-       control keycode   4 = Escape          
-       alt     keycode   4 = Meta_three      
-keycode   5 = four             dollar           dollar          
-       control keycode   5 = Control_backslash
-       alt     keycode   5 = Meta_four       
-keycode   6 = five             percent         
-       control keycode   6 = Control_bracketright
-       alt     keycode   6 = Meta_five       
-keycode   7 = six              asciicircum     
-       control keycode   7 = Control_asciicircum
-       alt     keycode   7 = Meta_six        
-keycode   8 = seven            ampersand        braceleft       
-       control keycode   8 = Control_underscore
-       alt     keycode   8 = Meta_seven      
-keycode   9 = eight            asterisk         bracketleft     
-       control keycode   9 = Delete          
-       alt     keycode   9 = Meta_eight      
-keycode  10 = nine             parenleft        bracketright    
-       alt     keycode  10 = Meta_nine       
-keycode  11 = zero             parenright       braceright      
-       alt     keycode  11 = Meta_zero       
-keycode  12 = minus            underscore       backslash       
-       control keycode  12 = Control_underscore
-       shift   control keycode  12 = Control_underscore
-       alt     keycode  12 = Meta_minus      
-keycode  13 = equal            plus            
-       alt     keycode  13 = Meta_equal      
-keycode  15 = Delete           Delete          
-       control keycode  15 = BackSpace
-       alt     keycode  15 = Meta_Delete     
-keycode  16 = Tab              Tab             
-       alt     keycode  16 = Meta_Tab        
-keycode  17 = q               
-keycode  18 = w               
-keycode  19 = e
-keycode  20 = r               
-keycode  21 = t               
-keycode  22 = y               
-keycode  23 = u         
-keycode  24 = i               
-keycode  25 = o               
-keycode  26 = p               
-keycode  27 = bracketleft      braceleft       
-       control keycode  27 = Escape          
-       alt     keycode  27 = Meta_bracketleft
-keycode  28 = bracketright     braceright
-       control keycode  28 = Control_bracketright
-       alt     keycode  28 = Meta_bracketright
-keycode  29 = backslash        bar             
-       control keycode  29 = Control_backslash
-       alt     keycode  29 = Meta_backslash  
-keycode  30 = Caps_Lock
-keycode  31 = a               
-keycode  32 = s
-keycode  33 = d
-keycode  34 = f               
-keycode  35 = g               
-keycode  36 = h               
-keycode  37 = j               
-keycode  38 = k               
-keycode  39 = l               
-keycode  40 = semicolon        colon           
-       alt     keycode  39 = Meta_semicolon  
-keycode  41 = apostrophe       quotedbl        
-       control keycode  40 = Control_g       
-       alt     keycode  40 = Meta_apostrophe 
-keycode  42 = grave            asciitilde      
-       control keycode  41 = nul             
-       alt     keycode  41 = Meta_grave      
-keycode  43 = Return          
-       alt     keycode  43 = Meta_Control_m  
-keycode  44 = Shift               
-keycode  46 = z
-keycode  47 = x               
-keycode  48 = c
-keycode  49 = v               
-keycode  50 = b               
-keycode  51 = n
-keycode  52 = m
-keycode  53 = comma            less            
-       alt     keycode  51 = Meta_comma      
-keycode  54 = period           greater         
-       control keycode  52 = Compose         
-       alt     keycode  52 = Meta_period     
-keycode  55 = slash            question        
-       control keycode  53 = Delete          
-       alt     keycode  53 = Meta_slash      
-keycode  57 = Shift
-keycode  58 = Control
-keycode  60 = Alt
-keycode  61 = space            space           
-       control keycode  61 = nul             
-       alt     keycode  61 = Meta_space      
-keycode  62 = Alt
-
-keycode 75 = Insert          
-keycode 76 = Delete          
-
-keycode 83 = Up              
-keycode 84 = Down              
-
-keycode 85 = Prior           
-       shift   keycode 85 = Scroll_Backward 
-keycode 86 = Next            
-       shift   keycode 86 = Scroll_Forward  
-keycode 89 = Right           
-       alt     keycode 89 = Incr_Console
-keycode 79 = Left            
-       alt     keycode 79 = Decr_Console
-
-keycode  90 = Num_Lock
-       shift   keycode  90 = Bare_Num_Lock
-
-keycode 91 = minus
-keycode 92 = plus
-keycode 93 = KP_Multiply
-keycode 94 = period
-keycode 95 = KP_Divide
-
-keycode 107 = Select          
-keycode 108 = Down            
-
-keycode 110 = Escape           Escape          
-       alt     keycode   1 = Meta_Escape     
-
-keycode  112 = F1              F11              Console_13      
-       control keycode  112 = F1              
-       alt     keycode  112 = Console_1       
-       control alt     keycode  112 = Console_1       
-keycode  113 = F2              F12              Console_14      
-       control keycode  113 = F2              
-       alt     keycode  113 = Console_2       
-       control alt     keycode  113 = Console_2       
-keycode  114 = F3              F13              Console_15      
-       control keycode  114 = F3              
-       alt     keycode  114 = Console_3       
-       control alt     keycode  114 = Console_3       
-keycode  115 = F4              F14              Console_16      
-       control keycode  115 = F4              
-       alt     keycode  115 = Console_4       
-       control alt     keycode  115 = Console_4       
-keycode  116 = F5              F15              Console_17      
-       control keycode  116 = F5              
-       alt     keycode  116 = Console_5       
-       control alt     keycode  116 = Console_5       
-keycode  117 = F6              F16              Console_18      
-       control keycode  117 = F6              
-       alt     keycode  117 = Console_6       
-       control alt     keycode  117 = Console_6       
-keycode  118 = F7              F17              Console_19      
-       control keycode  118 = F7              
-       alt     keycode  118 = Console_7       
-       control alt     keycode  118 = Console_7       
-keycode  119 = F8              F18              Console_20      
-       control keycode  119 = F8              
-       alt     keycode  119 = Console_8       
-       control alt     keycode  119 = Console_8       
-keycode  120 = F9              F19              Console_21      
-       control keycode  120 = F9              
-       alt     keycode  120 = Console_9       
-       control alt     keycode  120 = Console_9       
-keycode  121 = F10             F20              Console_22      
-       control keycode  121 = F10             
-       alt     keycode  121 = Console_10      
-       control alt     keycode  121 = Console_10      
-       
-keycode 126 = Pause           
-
-
-string F1 = "\033[[A"
-string F2 = "\033[[B"
-string F3 = "\033[[C"
-string F4 = "\033[[D"
-string F5 = "\033[[E"
-string F6 = "\033[17~"
-string F7 = "\033[18~"
-string F8 = "\033[19~"
-string F9 = "\033[20~"
-string F10 = "\033[21~"
-string F11 = "\033[23~"
-string F12 = "\033[24~"
-string F13 = "\033[25~"
-string F14 = "\033[26~"
-string F15 = "\033[28~"
-string F16 = "\033[29~"
-string F17 = "\033[31~"
-string F18 = "\033[32~"
-string F19 = "\033[33~"
-string F20 = "\033[34~"
-string Find = "\033[1~"
-string Insert = "\033[2~"
-string Remove = "\033[3~"
-string Select = "\033[4~"
-string Prior = "\033[5~"
-string Next = "\033[6~"
-string Macro = "\033[M"
-string Pause = "\033[P"
-compose '`' 'A' to 'À'
-compose '`' 'a' to 'à'
-compose '\'' 'A' to 'Á'
-compose '\'' 'a' to 'á'
-compose '^' 'A' to 'Â'
-compose '^' 'a' to 'â'
-compose '~' 'A' to 'Ã'
-compose '~' 'a' to 'ã'
-compose '"' 'A' to 'Ä'
-compose '"' 'a' to 'ä'
-compose 'O' 'A' to 'Å'
-compose 'o' 'a' to 'å'
-compose '0' 'A' to 'Å'
-compose '0' 'a' to 'å'
-compose 'A' 'A' to 'Å'
-compose 'a' 'a' to 'å'
-compose 'A' 'E' to 'Æ'
-compose 'a' 'e' to 'æ'
-compose ',' 'C' to 'Ç'
-compose ',' 'c' to 'ç'
-compose '`' 'E' to 'È'
-compose '`' 'e' to 'è'
-compose '\'' 'E' to 'É'
-compose '\'' 'e' to 'é'
-compose '^' 'E' to 'Ê'
-compose '^' 'e' to 'ê'
-compose '"' 'E' to 'Ë'
-compose '"' 'e' to 'ë'
-compose '`' 'I' to 'Ì'
-compose '`' 'i' to 'ì'
-compose '\'' 'I' to 'Í'
-compose '\'' 'i' to 'í'
-compose '^' 'I' to 'Î'
-compose '^' 'i' to 'î'
-compose '"' 'I' to 'Ï'
-compose '"' 'i' to 'ï'
-compose '-' 'D' to 'Ð'
-compose '-' 'd' to 'ð'
-compose '~' 'N' to 'Ñ'
-compose '~' 'n' to 'ñ'
-compose '`' 'O' to 'Ò'
-compose '`' 'o' to 'ò'
-compose '\'' 'O' to 'Ó'
-compose '\'' 'o' to 'ó'
-compose '^' 'O' to 'Ô'
-compose '^' 'o' to 'ô'
-compose '~' 'O' to 'Õ'
-compose '~' 'o' to 'õ'
-compose '"' 'O' to 'Ö'
-compose '"' 'o' to 'ö'
-compose '/' 'O' to 'Ø'
-compose '/' 'o' to 'ø'
-compose '`' 'U' to 'Ù'
-compose '`' 'u' to 'ù'
-compose '\'' 'U' to 'Ú'
-compose '\'' 'u' to 'ú'
-compose '^' 'U' to 'Û'
-compose '^' 'u' to 'û'
-compose '"' 'U' to 'Ü'
-compose '"' 'u' to 'ü'
-compose '\'' 'Y' to 'Ý'
-compose '\'' 'y' to 'ý'
-compose 'T' 'H' to 'Þ'
-compose 't' 'h' to 'þ'
-compose 's' 's' to 'ß'
-compose '"' 'y' to 'ÿ'
-compose 's' 'z' to 'ß'
-compose 'i' 'j' to 'ÿ'
index 06f3fa2fe877dd335fd59bd0a8b1b35cd6331046..89e46d6dfc4ef789af2e5cfe3f89631607f4c345 100644 (file)
@@ -316,6 +316,27 @@ config I8XX_TCO
          To compile this driver as a module, choose M here: the
          module will be called i8xx_tco.
 
+config ITCO_WDT
+       tristate "Intel TCO Timer/Watchdog (EXPERIMENTAL)"
+       depends on WATCHDOG && (X86 || IA64) && PCI && EXPERIMENTAL
+       ---help---
+         Hardware driver for the intel TCO timer based watchdog devices.
+         These drivers are included in the Intel 82801 I/O Controller
+         Hub family 'from ICH0 up to ICH7) and in the Intel 6300ESB
+         controller hub.
+
+         The TCO (Total Cost of Ownership) timer is a watchdog timer
+         that will reboot the machine after its second expiration. The
+         expiration time can be configured with the "heartbeat" parameter.
+
+         On some motherboards the driver may fail to reset the chipset's
+         NO_REBOOT flag which prevents the watchdog from rebooting the
+         machine. If this is the case you will get a kernel message like
+         "failed to reset NO_REBOOT flag, reboot disabled by hardware".
+
+         To compile this driver as a module, choose M here: the
+         module will be called iTCO_wdt.
+
 config SC1200_WDT
        tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog"
        depends on WATCHDOG && X86
index 6ffca7cb56ab65756a70e22025004c5f691ef07e..7f70abad465a3b846d2c1b5558c23496b9ea965c 100644 (file)
@@ -47,6 +47,7 @@ obj-$(CONFIG_IBMASR) += ibmasr.o
 obj-$(CONFIG_WAFER_WDT) += wafer5823wdt.o
 obj-$(CONFIG_I6300ESB_WDT) += i6300esb.o
 obj-$(CONFIG_I8XX_TCO) += i8xx_tco.o
+obj-$(CONFIG_ITCO_WDT) += iTCO_wdt.o
 obj-$(CONFIG_SC1200_WDT) += sc1200wdt.o
 obj-$(CONFIG_SCx200_WDT) += scx200_wdt.o
 obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o
diff --git a/drivers/char/watchdog/iTCO_wdt.c b/drivers/char/watchdog/iTCO_wdt.c
new file mode 100644 (file)
index 0000000..8f89948
--- /dev/null
@@ -0,0 +1,735 @@
+/*
+ *     intel TCO Watchdog Driver (Used in i82801 and i6300ESB chipsets)
+ *
+ *     (c) Copyright 2006 Wim Van Sebroeck <wim@iguana.be>.
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License
+ *     as published by the Free Software Foundation; either version
+ *     2 of the License, or (at your option) any later version.
+ *
+ *     Neither Wim Van Sebroeck nor Iguana vzw. admit liability nor
+ *     provide warranty for any of this software. This material is
+ *     provided "AS-IS" and at no charge.
+ *
+ *     The TCO watchdog is implemented in the following I/O controller hubs:
+ *     (See the intel documentation on http://developer.intel.com.)
+ *     82801AA  (ICH)       : document number 290655-003, 290677-014,
+ *     82801AB  (ICHO)      : document number 290655-003, 290677-014,
+ *     82801BA  (ICH2)      : document number 290687-002, 298242-027,
+ *     82801BAM (ICH2-M)    : document number 290687-002, 298242-027,
+ *     82801CA  (ICH3-S)    : document number 290733-003, 290739-013,
+ *     82801CAM (ICH3-M)    : document number 290716-001, 290718-007,
+ *     82801DB  (ICH4)      : document number 290744-001, 290745-020,
+ *     82801DBM (ICH4-M)    : document number 252337-001, 252663-005,
+ *     82801E   (C-ICH)     : document number 273599-001, 273645-002,
+ *     82801EB  (ICH5)      : document number 252516-001, 252517-003,
+ *     82801ER  (ICH5R)     : document number 252516-001, 252517-003,
+ *     82801FB  (ICH6)      : document number 301473-002, 301474-007,
+ *     82801FR  (ICH6R)     : document number 301473-002, 301474-007,
+ *     82801FBM (ICH6-M)    : document number 301473-002, 301474-007,
+ *     82801FW  (ICH6W)     : document number 301473-001, 301474-007,
+ *     82801FRW (ICH6RW)    : document number 301473-001, 301474-007,
+ *     82801GB  (ICH7)      : document number 307013-002, 307014-009,
+ *     82801GR  (ICH7R)     : document number 307013-002, 307014-009,
+ *     82801GDH (ICH7DH)    : document number 307013-002, 307014-009,
+ *     82801GBM (ICH7-M)    : document number 307013-002, 307014-009,
+ *     82801GHM (ICH7-M DH) : document number 307013-002, 307014-009,
+ *     6300ESB  (6300ESB)   : document number 300641-003
+ */
+
+/*
+ *     Includes, defines, variables, module parameters, ...
+ */
+
+/* Module and version information */
+#define DRV_NAME        "iTCO_wdt"
+#define DRV_VERSION     "1.00"
+#define DRV_RELDATE     "30-Jul-2006"
+#define PFX            DRV_NAME ": "
+
+/* Includes */
+#include <linux/config.h>              /* For CONFIG_WATCHDOG_NOWAYOUT/... */
+#include <linux/module.h>              /* For module specific items */
+#include <linux/moduleparam.h>         /* For new moduleparam's */
+#include <linux/types.h>               /* For standard types (like size_t) */
+#include <linux/errno.h>               /* For the -ENODEV/... values */
+#include <linux/kernel.h>              /* For printk/panic/... */
+#include <linux/miscdevice.h>          /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
+#include <linux/watchdog.h>            /* For the watchdog specific items */
+#include <linux/init.h>                        /* For __init/__exit/... */
+#include <linux/fs.h>                  /* For file operations */
+#include <linux/platform_device.h>     /* For platform_driver framework */
+#include <linux/pci.h>                 /* For pci functions */
+#include <linux/ioport.h>              /* For io-port access */
+#include <linux/spinlock.h>            /* For spin_lock/spin_unlock/... */
+
+#include <asm/uaccess.h>               /* For copy_to_user/put_user/... */
+#include <asm/io.h>                    /* For inb/outb/... */
+
+/* TCO related info */
+enum iTCO_chipsets {
+       TCO_ICH = 0,    /* ICH */
+       TCO_ICH0,       /* ICH0 */
+       TCO_ICH2,       /* ICH2 */
+       TCO_ICH2M,      /* ICH2-M */
+       TCO_ICH3,       /* ICH3-S */
+       TCO_ICH3M,      /* ICH3-M */
+       TCO_ICH4,       /* ICH4 */
+       TCO_ICH4M,      /* ICH4-M */
+       TCO_CICH,       /* C-ICH */
+       TCO_ICH5,       /* ICH5 & ICH5R */
+       TCO_6300ESB,    /* 6300ESB */
+       TCO_ICH6,       /* ICH6 & ICH6R */
+       TCO_ICH6M,      /* ICH6-M */
+       TCO_ICH6W,      /* ICH6W & ICH6RW */
+       TCO_ICH7,       /* ICH7 & ICH7R */
+       TCO_ICH7M,      /* ICH7-M */
+       TCO_ICH7MDH,    /* ICH7-M DH */
+};
+
+static struct {
+       char *name;
+       unsigned int iTCO_version;
+} iTCO_chipset_info[] __devinitdata = {
+       {"ICH", 1},
+       {"ICH0", 1},
+       {"ICH2", 1},
+       {"ICH2-M", 1},
+       {"ICH3-S", 1},
+       {"ICH3-M", 1},
+       {"ICH4", 1},
+       {"ICH4-M", 1},
+       {"C-ICH", 1},
+       {"ICH5 or ICH5R", 1},
+       {"6300ESB", 1},
+       {"ICH6 or ICH6R", 2},
+       {"ICH6-M", 2},
+       {"ICH6W or ICH6RW", 2},
+       {"ICH7 or ICH7R", 2},
+       {"ICH7-M", 2},
+       {"ICH7-M DH", 2},
+       {NULL,0}
+};
+
+/*
+ * This data only exists for exporting the supported PCI ids
+ * via MODULE_DEVICE_TABLE.  We do not actually register a
+ * pci_driver, because the I/O Controller Hub has also other
+ * functions that probably will be registered by other drivers.
+ */
+static struct pci_device_id iTCO_wdt_pci_tbl[] = {
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH     },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH0    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH2    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH2M   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH3    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH3M   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH4    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH4M   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0,    PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_CICH    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH5    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1,       PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_6300ESB },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH6    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH6M   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH6W   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7    },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7M   },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31,     PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7MDH },
+       { 0, },                 /* End of list */
+};
+MODULE_DEVICE_TABLE (pci, iTCO_wdt_pci_tbl);
+
+/* Address definitions for the TCO */
+#define        TCOBASE         iTCO_wdt_private.ACPIBASE + 0x60        /* TCO base address                */
+#define        SMI_EN          iTCO_wdt_private.ACPIBASE + 0x30        /* SMI Control and Enable Register */
+
+#define TCO_RLD                TCOBASE + 0x00  /* TCO Timer Reload and Current Value */
+#define TCOv1_TMR      TCOBASE + 0x01  /* TCOv1 Timer Initial Value    */
+#define        TCO_DAT_IN      TCOBASE + 0x02  /* TCO Data In Register         */
+#define        TCO_DAT_OUT     TCOBASE + 0x03  /* TCO Data Out Register        */
+#define        TCO1_STS        TCOBASE + 0x04  /* TCO1 Status Register         */
+#define        TCO2_STS        TCOBASE + 0x06  /* TCO2 Status Register         */
+#define TCO1_CNT       TCOBASE + 0x08  /* TCO1 Control Register        */
+#define TCO2_CNT       TCOBASE + 0x0a  /* TCO2 Control Register        */
+#define TCOv2_TMR      TCOBASE + 0x12  /* TCOv2 Timer Initial Value    */
+
+/* internal variables */
+static unsigned long is_active;
+static char expect_release;
+static struct {                                /* this is private data for the iTCO_wdt device */
+       unsigned int iTCO_version;      /* TCO version/generation */
+       unsigned long ACPIBASE;         /* The cards ACPIBASE address (TCOBASE = ACPIBASE+0x60) */
+       unsigned long __iomem *gcs;     /* NO_REBOOT flag is Memory-Mapped GCS register bit 5 (TCO version 2) */
+       spinlock_t io_lock;             /* the lock for io operations */
+       struct pci_dev *pdev;           /* the PCI-device */
+} iTCO_wdt_private;
+
+static struct platform_device *iTCO_wdt_platform_device;       /* the watchdog platform device */
+
+/* module parameters */
+#define WATCHDOG_HEARTBEAT 30  /* 30 sec default heartbeat */
+static int heartbeat = WATCHDOG_HEARTBEAT;  /* in seconds */
+module_param(heartbeat, int, 0);
+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<heartbeat<39 (TCO v1) or 613 (TCO v2), default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
+
+static int nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, int, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+
+/*
+ * Some TCO specific functions
+ */
+
+static inline unsigned int seconds_to_ticks(int seconds)
+{
+       /* the internal timer is stored as ticks which decrement
+        * every 0.6 seconds */
+       return (seconds * 10) / 6;
+}
+
+static void iTCO_wdt_set_NO_REBOOT_bit(void)
+{
+       u32 val32;
+
+       /* Set the NO_REBOOT bit: this disables reboots */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               val32 = readl(iTCO_wdt_private.gcs);
+               val32 |= 0x00000020;
+               writel(val32, iTCO_wdt_private.gcs);
+       } else if (iTCO_wdt_private.iTCO_version == 1) {
+               pci_read_config_dword(iTCO_wdt_private.pdev, 0xd4, &val32);
+               val32 |= 0x00000002;
+               pci_write_config_dword(iTCO_wdt_private.pdev, 0xd4, val32);
+       }
+}
+
+static int iTCO_wdt_unset_NO_REBOOT_bit(void)
+{
+       int ret = 0;
+       u32 val32;
+
+       /* Unset the NO_REBOOT bit: this enables reboots */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               val32 = readl(iTCO_wdt_private.gcs);
+               val32 &= 0xffffffdf;
+               writel(val32, iTCO_wdt_private.gcs);
+
+               val32 = readl(iTCO_wdt_private.gcs);
+               if (val32 & 0x00000020)
+                       ret = -EIO;
+       } else if (iTCO_wdt_private.iTCO_version == 1) {
+               pci_read_config_dword(iTCO_wdt_private.pdev, 0xd4, &val32);
+               val32 &= 0xfffffffd;
+               pci_write_config_dword(iTCO_wdt_private.pdev, 0xd4, val32);
+
+               pci_read_config_dword(iTCO_wdt_private.pdev, 0xd4, &val32);
+               if (val32 & 0x00000002)
+                       ret = -EIO;
+       }
+
+       return ret; /* returns: 0 = OK, -EIO = Error */
+}
+
+static int iTCO_wdt_start(void)
+{
+       unsigned int val;
+
+       spin_lock(&iTCO_wdt_private.io_lock);
+
+       /* disable chipset's NO_REBOOT bit */
+       if (iTCO_wdt_unset_NO_REBOOT_bit()) {
+               printk(KERN_ERR PFX "failed to reset NO_REBOOT flag, reboot disabled by hardware\n");
+               return -EIO;
+       }
+
+       /* Bit 11: TCO Timer Halt -> 0 = The TCO timer is enabled to count */
+       val = inw(TCO1_CNT);
+       val &= 0xf7ff;
+       outw(val, TCO1_CNT);
+       val = inw(TCO1_CNT);
+       spin_unlock(&iTCO_wdt_private.io_lock);
+
+       if (val & 0x0800)
+               return -1;
+       return 0;
+}
+
+static int iTCO_wdt_stop(void)
+{
+       unsigned int val;
+
+       spin_lock(&iTCO_wdt_private.io_lock);
+
+       /* Bit 11: TCO Timer Halt -> 1 = The TCO timer is disabled */
+       val = inw(TCO1_CNT);
+       val |= 0x0800;
+       outw(val, TCO1_CNT);
+       val = inw(TCO1_CNT);
+
+       /* Set the NO_REBOOT bit to prevent later reboots, just for sure */
+       iTCO_wdt_set_NO_REBOOT_bit();
+
+       spin_unlock(&iTCO_wdt_private.io_lock);
+
+       if ((val & 0x0800) == 0)
+               return -1;
+       return 0;
+}
+
+static int iTCO_wdt_keepalive(void)
+{
+       spin_lock(&iTCO_wdt_private.io_lock);
+
+       /* Reload the timer by writing to the TCO Timer Counter register */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               outw(0x01, TCO_RLD);
+       } else if (iTCO_wdt_private.iTCO_version == 1) {
+               outb(0x01, TCO_RLD);
+       }
+
+       spin_unlock(&iTCO_wdt_private.io_lock);
+       return 0;
+}
+
+static int iTCO_wdt_set_heartbeat(int t)
+{
+       unsigned int val16;
+       unsigned char val8;
+       unsigned int tmrval;
+
+       tmrval = seconds_to_ticks(t);
+       /* from the specs: */
+       /* "Values of 0h-3h are ignored and should not be attempted" */
+       if (tmrval < 0x04)
+               return -EINVAL;
+       if (((iTCO_wdt_private.iTCO_version == 2) && (tmrval > 0x3ff)) ||
+           ((iTCO_wdt_private.iTCO_version == 1) && (tmrval > 0x03f)))
+               return -EINVAL;
+
+       /* Write new heartbeat to watchdog */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               spin_lock(&iTCO_wdt_private.io_lock);
+               val16 = inw(TCOv2_TMR);
+               val16 &= 0xfc00;
+               val16 |= tmrval;
+               outw(val16, TCOv2_TMR);
+               val16 = inw(TCOv2_TMR);
+               spin_unlock(&iTCO_wdt_private.io_lock);
+
+               if ((val16 & 0x3ff) != tmrval)
+                       return -EINVAL;
+       } else if (iTCO_wdt_private.iTCO_version == 1) {
+               spin_lock(&iTCO_wdt_private.io_lock);
+               val8 = inb(TCOv1_TMR);
+               val8 &= 0xc0;
+               val8 |= (tmrval & 0xff);
+               outb(val8, TCOv1_TMR);
+               val8 = inb(TCOv1_TMR);
+               spin_unlock(&iTCO_wdt_private.io_lock);
+
+               if ((val8 & 0x3f) != tmrval)
+                       return -EINVAL;
+       }
+
+       heartbeat = t;
+       return 0;
+}
+
+static int iTCO_wdt_get_timeleft (int *time_left)
+{
+       unsigned int val16;
+       unsigned char val8;
+
+       /* read the TCO Timer */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               spin_lock(&iTCO_wdt_private.io_lock);
+               val16 = inw(TCO_RLD);
+               val16 &= 0x3ff;
+               spin_unlock(&iTCO_wdt_private.io_lock);
+
+               *time_left = (val16 * 6) / 10;
+       } else if (iTCO_wdt_private.iTCO_version == 1) {
+               spin_lock(&iTCO_wdt_private.io_lock);
+               val8 = inb(TCO_RLD);
+               val8 &= 0x3f;
+               spin_unlock(&iTCO_wdt_private.io_lock);
+
+               *time_left = (val8 * 6) / 10;
+       }
+       return 0;
+}
+
+/*
+ *     /dev/watchdog handling
+ */
+
+static int iTCO_wdt_open (struct inode *inode, struct file *file)
+{
+       /* /dev/watchdog can only be opened once */
+       if (test_and_set_bit(0, &is_active))
+               return -EBUSY;
+
+       /*
+        *      Reload and activate timer
+        */
+       iTCO_wdt_keepalive();
+       iTCO_wdt_start();
+       return nonseekable_open(inode, file);
+}
+
+static int iTCO_wdt_release (struct inode *inode, struct file *file)
+{
+       /*
+        *      Shut off the timer.
+        */
+       if (expect_release == 42) {
+               iTCO_wdt_stop();
+       } else {
+               printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n");
+               iTCO_wdt_keepalive();
+       }
+       clear_bit(0, &is_active);
+       expect_release = 0;
+       return 0;
+}
+
+static ssize_t iTCO_wdt_write (struct file *file, const char __user *data,
+                             size_t len, loff_t * ppos)
+{
+       /* See if we got the magic character 'V' and reload the timer */
+       if (len) {
+               if (!nowayout) {
+                       size_t i;
+
+                       /* note: just in case someone wrote the magic character
+                        * five months ago... */
+                       expect_release = 0;
+
+                       /* scan to see whether or not we got the magic character */
+                       for (i = 0; i != len; i++) {
+                               char c;
+                               if (get_user(c, data+i))
+                                       return -EFAULT;
+                               if (c == 'V')
+                                       expect_release = 42;
+                       }
+               }
+
+               /* someone wrote to us, we should reload the timer */
+               iTCO_wdt_keepalive();
+       }
+       return len;
+}
+
+static int iTCO_wdt_ioctl (struct inode *inode, struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       int new_options, retval = -EINVAL;
+       int new_heartbeat;
+       int time_left;
+       void __user *argp = (void __user *)arg;
+       int __user *p = argp;
+       static struct watchdog_info ident = {
+               .options =              WDIOF_SETTIMEOUT |
+                                       WDIOF_KEEPALIVEPING |
+                                       WDIOF_MAGICCLOSE,
+               .firmware_version =     0,
+               .identity =             DRV_NAME,
+       };
+
+       switch (cmd) {
+               case WDIOC_GETSUPPORT:
+                       return copy_to_user(argp, &ident,
+                               sizeof (ident)) ? -EFAULT : 0;
+
+               case WDIOC_GETSTATUS:
+               case WDIOC_GETBOOTSTATUS:
+                       return put_user(0, p);
+
+               case WDIOC_KEEPALIVE:
+                       iTCO_wdt_keepalive();
+                       return 0;
+
+               case WDIOC_SETOPTIONS:
+               {
+                       if (get_user(new_options, p))
+                               return -EFAULT;
+
+                       if (new_options & WDIOS_DISABLECARD) {
+                               iTCO_wdt_stop();
+                               retval = 0;
+                       }
+
+                       if (new_options & WDIOS_ENABLECARD) {
+                               iTCO_wdt_keepalive();
+                               iTCO_wdt_start();
+                               retval = 0;
+                       }
+
+                       return retval;
+               }
+
+               case WDIOC_SETTIMEOUT:
+               {
+                       if (get_user(new_heartbeat, p))
+                               return -EFAULT;
+
+                       if (iTCO_wdt_set_heartbeat(new_heartbeat))
+                               return -EINVAL;
+
+                       iTCO_wdt_keepalive();
+                       /* Fall */
+               }
+
+               case WDIOC_GETTIMEOUT:
+                       return put_user(heartbeat, p);
+
+               case WDIOC_GETTIMELEFT:
+               {
+                       if (iTCO_wdt_get_timeleft(&time_left))
+                               return -EINVAL;
+
+                       return put_user(time_left, p);
+               }
+
+               default:
+                       return -ENOTTY;
+       }
+}
+
+/*
+ *     Kernel Interfaces
+ */
+
+static struct file_operations iTCO_wdt_fops = {
+       .owner =        THIS_MODULE,
+       .llseek =       no_llseek,
+       .write =        iTCO_wdt_write,
+       .ioctl =        iTCO_wdt_ioctl,
+       .open =         iTCO_wdt_open,
+       .release =      iTCO_wdt_release,
+};
+
+static struct miscdevice iTCO_wdt_miscdev = {
+       .minor =        WATCHDOG_MINOR,
+       .name =         "watchdog",
+       .fops =         &iTCO_wdt_fops,
+};
+
+/*
+ *     Init & exit routines
+ */
+
+static int iTCO_wdt_init(struct pci_dev *pdev, const struct pci_device_id *ent, struct platform_device *dev)
+{
+       int ret;
+       u32 base_address;
+       unsigned long RCBA;
+       unsigned long val32;
+
+       /*
+        *      Find the ACPI/PM base I/O address which is the base
+        *      for the TCO registers (TCOBASE=ACPIBASE + 0x60)
+        *      ACPIBASE is bits [15:7] from 0x40-0x43
+        */
+       pci_read_config_dword(pdev, 0x40, &base_address);
+       base_address &= 0x00007f80;
+       if (base_address == 0x00000000) {
+               /* Something's wrong here, ACPIBASE has to be set */
+               printk(KERN_ERR PFX "failed to get TCOBASE address\n");
+               pci_dev_put(pdev);
+               return -ENODEV;
+       }
+       iTCO_wdt_private.iTCO_version = iTCO_chipset_info[ent->driver_data].iTCO_version;
+       iTCO_wdt_private.ACPIBASE = base_address;
+       iTCO_wdt_private.pdev = pdev;
+
+       /* Get the Memory-Mapped GCS register, we need it for the NO_REBOOT flag (TCO v2) */
+       /* To get access to it you have to read RCBA from PCI Config space 0xf0
+          and use it as base. GCS = RCBA + ICH6_GCS(0x3410). */
+       if (iTCO_wdt_private.iTCO_version == 2) {
+               pci_read_config_dword(pdev, 0xf0, &base_address);
+               RCBA = base_address & 0xffffc000;
+               iTCO_wdt_private.gcs = ioremap((RCBA + 0x3410),4);
+       }
+
+       /* Check chipset's NO_REBOOT bit */
+       if (iTCO_wdt_unset_NO_REBOOT_bit()) {
+               printk(KERN_ERR PFX "failed to reset NO_REBOOT flag, reboot disabled by hardware\n");
+               ret = -ENODEV;  /* Cannot reset NO_REBOOT bit */
+               goto out;
+       }
+
+       /* Set the NO_REBOOT bit to prevent later reboots, just for sure */
+       iTCO_wdt_set_NO_REBOOT_bit();
+
+       /* Set the TCO_EN bit in SMI_EN register */
+       if (!request_region(SMI_EN, 4, "iTCO_wdt")) {
+               printk(KERN_ERR PFX "I/O address 0x%04lx already in use\n",
+                       SMI_EN );
+               ret = -EIO;
+               goto out;
+       }
+       val32 = inl(SMI_EN);
+       val32 &= 0xffffdfff;    /* Turn off SMI clearing watchdog */
+       outl(val32, SMI_EN);
+       release_region(SMI_EN, 4);
+
+       /* The TCO I/O registers reside in a 32-byte range pointed to by the TCOBASE value */
+       if (!request_region (TCOBASE, 0x20, "iTCO_wdt")) {
+               printk (KERN_ERR PFX "I/O address 0x%04lx already in use\n",
+                       TCOBASE);
+               ret = -EIO;
+               goto out;
+       }
+
+       printk(KERN_INFO PFX "Found a %s TCO device (Version=%d, TCOBASE=0x%04lx)\n",
+               iTCO_chipset_info[ent->driver_data].name,
+               iTCO_chipset_info[ent->driver_data].iTCO_version,
+               TCOBASE);
+
+       /* Clear out the (probably old) status */
+       outb(0, TCO1_STS);
+       outb(3, TCO2_STS);
+
+       /* Make sure the watchdog is not running */
+       iTCO_wdt_stop();
+
+       /* Check that the heartbeat value is within it's range ; if not reset to the default */
+       if (iTCO_wdt_set_heartbeat(heartbeat)) {
+               iTCO_wdt_set_heartbeat(WATCHDOG_HEARTBEAT);
+               printk(KERN_INFO PFX "heartbeat value must be 2<heartbeat<39 (TCO v1) or 613 (TCO v2), using %d\n",
+                       heartbeat);
+       }
+
+       ret = misc_register(&iTCO_wdt_miscdev);
+       if (ret != 0) {
+               printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
+                       WATCHDOG_MINOR, ret);
+               goto unreg_region;
+       }
+
+       printk (KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n",
+               heartbeat, nowayout);
+
+       return 0;
+
+unreg_region:
+       release_region (TCOBASE, 0x20);
+out:
+       if (iTCO_wdt_private.iTCO_version == 2)
+               iounmap(iTCO_wdt_private.gcs);
+       pci_dev_put(iTCO_wdt_private.pdev);
+       iTCO_wdt_private.ACPIBASE = 0;
+       return ret;
+}
+
+static void iTCO_wdt_cleanup(void)
+{
+       /* Stop the timer before we leave */
+       if (!nowayout)
+               iTCO_wdt_stop();
+
+       /* Deregister */
+       misc_deregister(&iTCO_wdt_miscdev);
+       release_region(TCOBASE, 0x20);
+       if (iTCO_wdt_private.iTCO_version == 2)
+               iounmap(iTCO_wdt_private.gcs);
+       pci_dev_put(iTCO_wdt_private.pdev);
+       iTCO_wdt_private.ACPIBASE = 0;
+}
+
+static int iTCO_wdt_probe(struct platform_device *dev)
+{
+       int found = 0;
+       struct pci_dev *pdev = NULL;
+       const struct pci_device_id *ent;
+
+       spin_lock_init(&iTCO_wdt_private.io_lock);
+
+       for_each_pci_dev(pdev) {
+               ent = pci_match_id(iTCO_wdt_pci_tbl, pdev);
+               if (ent) {
+                       if (!(iTCO_wdt_init(pdev, ent, dev))) {
+                               found++;
+                               break;
+                       }
+               }
+       }
+
+       if (!found) {
+               printk(KERN_INFO PFX "No card detected\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+static int iTCO_wdt_remove(struct platform_device *dev)
+{
+       if (iTCO_wdt_private.ACPIBASE)
+               iTCO_wdt_cleanup();
+
+       return 0;
+}
+
+static void iTCO_wdt_shutdown(struct platform_device *dev)
+{
+       iTCO_wdt_stop();
+}
+
+#define iTCO_wdt_suspend NULL
+#define iTCO_wdt_resume  NULL
+
+static struct platform_driver iTCO_wdt_driver = {
+       .probe          = iTCO_wdt_probe,
+       .remove         = iTCO_wdt_remove,
+       .shutdown       = iTCO_wdt_shutdown,
+       .suspend        = iTCO_wdt_suspend,
+       .resume         = iTCO_wdt_resume,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init iTCO_wdt_init_module(void)
+{
+       int err;
+
+       printk(KERN_INFO PFX "Intel TCO WatchDog Timer Driver v%s (%s)\n",
+               DRV_VERSION, DRV_RELDATE);
+
+       err = platform_driver_register(&iTCO_wdt_driver);
+       if (err)
+               return err;
+
+       iTCO_wdt_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
+       if (IS_ERR(iTCO_wdt_platform_device)) {
+               err = PTR_ERR(iTCO_wdt_platform_device);
+               goto unreg_platform_driver;
+       }
+
+       return 0;
+
+unreg_platform_driver:
+       platform_driver_unregister(&iTCO_wdt_driver);
+       return err;
+}
+
+static void __exit iTCO_wdt_cleanup_module(void)
+{
+       platform_device_unregister(iTCO_wdt_platform_device);
+       platform_driver_unregister(&iTCO_wdt_driver);
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
+}
+
+module_init(iTCO_wdt_init_module);
+module_exit(iTCO_wdt_cleanup_module);
+
+MODULE_AUTHOR("Wim Van Sebroeck <wim@iguana.be>");
+MODULE_DESCRIPTION("Intel TCO WatchDog Timer Driver");
+MODULE_VERSION(DRV_VERSION);
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
index e7f0450a939d9cf686f78ba957052e15d4b1285f..db2731ba88e303c48a2333cf424fff0937acbceb 100644 (file)
@@ -184,7 +184,7 @@ static int
 pnx4008_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                  unsigned long arg)
 {
-       int ret = -ENOIOCTLCMD;
+       int ret = -ENOTTY;
        int time;
 
        switch (cmd) {
index abcabb2955925f09583d6da02a5ce8c7b7cace0b..0c68d0f0d8e513e028784faf5e5ef7c3a524f599 100644 (file)
@@ -614,15 +614,6 @@ config BLK_DEV_PIIX
          the kernel to change PIO, DMA and UDMA speeds and to configure
          the chip to optimum performance.
 
-config BLK_DEV_IT8172
-       bool "IT8172 IDE support"
-       depends on (MIPS_ITE8172 || MIPS_IVR)
-       help
-         Say Y here to support the on-board IDE controller on the Integrated
-         Technology Express, Inc. ITE8172 SBC.  Vendor page at
-         <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-         board at <http://www.mvista.com/partners/semiconductor/ite.html>.
-
 config BLK_DEV_IT821X
        tristate "IT821X IDE support"
        help
index 640a54b09b5a2f094e8d66fdf5ab623cfd67b03f..fef08960aa4ce2309fa1bc31f076c0da8850dcd4 100644 (file)
@@ -12,7 +12,6 @@ obj-$(CONFIG_BLK_DEV_CY82C693)                += cy82c693.o
 obj-$(CONFIG_BLK_DEV_HPT34X)           += hpt34x.o
 obj-$(CONFIG_BLK_DEV_HPT366)           += hpt366.o
 #obj-$(CONFIG_BLK_DEV_HPT37X)          += hpt37x.o
-obj-$(CONFIG_BLK_DEV_IT8172)           += it8172.o
 obj-$(CONFIG_BLK_DEV_IT821X)           += it821x.o
 obj-$(CONFIG_BLK_DEV_JMICRON)          += jmicron.o
 obj-$(CONFIG_BLK_DEV_NS87415)          += ns87415.o
diff --git a/drivers/ide/pci/it8172.c b/drivers/ide/pci/it8172.c
deleted file mode 100644 (file)
index 0fc89fa..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *      IT8172 IDE controller support
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *              stevel@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/hdreg.h>
-#include <linux/ide.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/it8172/it8172_int.h>
-
-/*
- * Prototypes
- */
-static u8 it8172_ratemask (ide_drive_t *drive)
-{
-       return 1;
-}
-
-static void it8172_tune_drive (ide_drive_t *drive, u8 pio)
-{
-       ide_hwif_t *hwif        = HWIF(drive);
-       struct pci_dev *dev     = hwif->pci_dev;
-       int is_slave            = (&hwif->drives[1] == drive);
-       unsigned long flags;
-       u16 drive_enables;
-       u32 drive_timing;
-
-       pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
-       spin_lock_irqsave(&ide_lock, flags);
-       pci_read_config_word(dev, 0x40, &drive_enables);
-       pci_read_config_dword(dev, 0x44, &drive_timing);
-
-       /*
-        * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
-        * are being left at the default values of 8 PCI clocks (242 nsec
-        * for a 33 MHz clock). These can be safely shortened at higher
-        * PIO modes. The DIOR/DIOW pulse width and recovery times only
-        * apply to PIO modes, not to the DMA modes.
-        */
-
-       /*
-        * Enable port 0x44. The IT8172G spec is confused; it calls
-        * this register the "Slave IDE Timing Register", but in fact,
-        * it controls timing for both master and slave drives.
-        */
-       drive_enables |= 0x4000;
-
-       if (is_slave) {
-               drive_enables &= 0xc006;
-               if (pio > 1)
-                       /* enable prefetch and IORDY sample-point */
-                       drive_enables |= 0x0060;
-       } else {
-               drive_enables &= 0xc060;
-               if (pio > 1)
-                       /* enable prefetch and IORDY sample-point */
-                       drive_enables |= 0x0006;
-       }
-
-       pci_write_config_word(dev, 0x40, drive_enables);
-       spin_unlock_irqrestore(&ide_lock, flags);
-}
-
-static u8 it8172_dma_2_pio (u8 xfer_rate)
-{
-       switch(xfer_rate) {
-               case XFER_UDMA_5:
-               case XFER_UDMA_4:
-               case XFER_UDMA_3:
-               case XFER_UDMA_2:
-               case XFER_UDMA_1:
-               case XFER_UDMA_0:
-               case XFER_MW_DMA_2:
-               case XFER_PIO_4:
-                       return 4;
-               case XFER_MW_DMA_1:
-               case XFER_PIO_3:
-                       return 3;
-               case XFER_SW_DMA_2:
-               case XFER_PIO_2:
-                       return 2;
-               case XFER_MW_DMA_0:
-               case XFER_SW_DMA_1:
-               case XFER_SW_DMA_0:
-               case XFER_PIO_1:
-               case XFER_PIO_0:
-               case XFER_PIO_SLOW:
-               default:
-                       return 0;
-       }
-}
-
-static int it8172_tune_chipset (ide_drive_t *drive, u8 xferspeed)
-{
-       ide_hwif_t *hwif        = HWIF(drive);
-       struct pci_dev *dev     = hwif->pci_dev;
-       u8 speed        = ide_rate_filter(it8172_ratemask(drive), xferspeed);
-       int a_speed             = 3 << (drive->dn * 4);
-       int u_flag              = 1 << drive->dn;
-       int u_speed             = 0;
-       u8 reg48, reg4a;
-
-       pci_read_config_byte(dev, 0x48, &reg48);
-       pci_read_config_byte(dev, 0x4a, &reg4a);
-
-    /*
-     * Setting the DMA cycle time to 2 or 3 PCI clocks (60 and 91 nsec
-     * at 33 MHz PCI clock) seems to cause BadCRC errors during DMA
-     * transfers on some drives, even though both numbers meet the minimum
-     * ATAPI-4 spec of 73 and 54 nsec for UDMA 1 and 2 respectively.
-     * So the faster times are just commented out here. The good news is
-     * that the slower cycle time has very little affect on transfer
-     * performance.
-     */
-    
-       switch(speed) {
-               case XFER_UDMA_4:
-               case XFER_UDMA_2:       //u_speed = 2 << (drive->dn * 4); break;
-               case XFER_UDMA_5:
-               case XFER_UDMA_3:
-               case XFER_UDMA_1:       //u_speed = 1 << (drive->dn * 4); break;
-               case XFER_UDMA_0:       u_speed = 0 << (drive->dn * 4); break;
-               case XFER_MW_DMA_2:
-               case XFER_MW_DMA_1:
-               case XFER_MW_DMA_0:
-               case XFER_SW_DMA_2:     break;
-               case XFER_PIO_4:
-               case XFER_PIO_3:
-               case XFER_PIO_2:
-               case XFER_PIO_0:        break;
-               default:                return -1;
-       }
-
-       if (speed >= XFER_UDMA_0) {
-               pci_write_config_byte(dev, 0x48, reg48 | u_flag);
-               reg4a &= ~a_speed;
-               pci_write_config_byte(dev, 0x4a, reg4a | u_speed);
-       } else {
-               pci_write_config_byte(dev, 0x48, reg48 & ~u_flag);
-               pci_write_config_byte(dev, 0x4a, reg4a & ~a_speed);
-       }
-
-       it8172_tune_drive(drive, it8172_dma_2_pio(speed));
-       return (ide_config_drive_speed(drive, speed));
-}
-
-static int it8172_config_chipset_for_dma (ide_drive_t *drive)
-{
-       u8 speed = ide_dma_speed(drive, it8172_ratemask(drive));
-
-       if (!(speed)) {
-               u8 tspeed = ide_get_best_pio_mode(drive, 255, 4, NULL);
-               speed = it8172_dma_2_pio(XFER_PIO_0 + tspeed);
-       }
-
-       (void) it8172_tune_chipset(drive, speed);
-       return ide_dma_enable(drive);
-}
-
-static int it8172_config_drive_xfer_rate (ide_drive_t *drive)
-{
-       ide_hwif_t *hwif        = HWIF(drive);
-       struct hd_driveid *id   = drive->id;
-
-       drive->init_speed = 0;
-
-       if (id && (id->capability & 1) && drive->autodma) {
-
-               if (ide_use_dma(drive)) {
-                       if (it8172_config_chipset_for_dma(drive))
-                               return hwif->ide_dma_on(drive);
-               }
-
-               goto fast_ata_pio;
-
-       } else if ((id->capability & 8) || (id->field_valid & 2)) {
-fast_ata_pio:
-               it8172_tune_drive(drive, 5);
-               return hwif->ide_dma_off_quietly(drive);
-       }
-       /* IORDY not supported */
-       return 0;
-}
-
-static unsigned int __devinit init_chipset_it8172 (struct pci_dev *dev, const char *name)
-{
-       unsigned char progif;
-    
-       /*
-        * Place both IDE interfaces into PCI "native" mode
-        */
-       pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
-       pci_write_config_byte(dev, PCI_CLASS_PROG, progif | 0x05);    
-
-       return IT8172_IDE_IRQ;
-}
-
-
-static void __devinit init_hwif_it8172 (ide_hwif_t *hwif)
-{
-       struct pci_dev* dev = hwif->pci_dev;
-       unsigned long cmdBase, ctrlBase;
-    
-       hwif->autodma = 0;
-       hwif->tuneproc = &it8172_tune_drive;
-       hwif->speedproc = &it8172_tune_chipset;
-
-       cmdBase = dev->resource[0].start;
-       ctrlBase = dev->resource[1].start;
-    
-       ide_init_hwif_ports(&hwif->hw, cmdBase, ctrlBase | 2, NULL);
-       memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
-       hwif->noprobe = 0;
-
-       if (!hwif->dma_base) {
-               hwif->drives[0].autotune = 1;
-               hwif->drives[1].autotune = 1;
-               return;
-       }
-
-       hwif->atapi_dma = 1;
-       hwif->ultra_mask = 0x07;
-       hwif->mwdma_mask = 0x06;
-       hwif->swdma_mask = 0x04;
-
-       hwif->ide_dma_check = &it8172_config_drive_xfer_rate;
-       if (!noautodma)
-               hwif->autodma = 1;
-       hwif->drives[0].autodma = hwif->autodma;
-       hwif->drives[1].autodma = hwif->autodma;
-}
-
-static ide_pci_device_t it8172_chipsets[] __devinitdata = {
-       {       /* 0 */
-               .name           = "IT8172G",
-               .init_chipset   = init_chipset_it8172,
-               .init_hwif      = init_hwif_it8172,
-               .channels       = 2,
-               .autodma        = AUTODMA,
-               .enablebits     = {{0x00,0x00,0x00}, {0x40,0x00,0x01}},
-               .bootable       = ON_BOARD,
-       }
-};
-
-static int __devinit it8172_init_one(struct pci_dev *dev, const struct pci_device_id *id)
-{
-        if ((!(PCI_FUNC(dev->devfn) & 1) ||
-            (!((dev->class >> 8) == PCI_CLASS_STORAGE_IDE))))
-               return -ENODEV; /* IT8172 is more than an IDE controller */
-       return ide_setup_pci_device(dev, &it8172_chipsets[id->driver_data]);
-}
-
-static struct pci_device_id it8172_pci_tbl[] = {
-       { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_IT8172G, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { 0, },
-};
-MODULE_DEVICE_TABLE(pci, it8172_pci_tbl);
-
-static struct pci_driver driver = {
-       .name           = "IT8172_IDE",
-       .id_table       = it8172_pci_tbl,
-       .probe          = it8172_init_one,
-};
-
-static int it8172_ide_init(void)
-{
-       return ide_pci_register_driver(&driver);
-}
-
-module_init(it8172_ide_init);
-
-MODULE_AUTHOR("SteveL@mvista.com");
-MODULE_DESCRIPTION("PCI driver module for ITE 8172 IDE");
-MODULE_LICENSE("GPL");
index 3dd5dbafb330634c400e57d58b198eb21ef5c9a0..53304e6991ac61326fbec9001d362530f62bd8d9 100644 (file)
@@ -1014,6 +1014,13 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
        if ((ret = dvb_generic_open (inode, file)) < 0)
                return ret;
 
+       if (fe->ops.ts_bus_ctrl) {
+               if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) {
+                       dvb_generic_release (inode, file);
+                       return ret;
+               }
+       }
+
        if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
 
                /* normal tune mode when opened R/W */
@@ -1043,6 +1050,9 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
        if ((file->f_flags & O_ACCMODE) != O_RDONLY)
                fepriv->release_jiffies = jiffies;
 
+       if (fe->ops.ts_bus_ctrl)
+               fe->ops.ts_bus_ctrl (fe, 0);
+
        return dvb_generic_release (inode, file);
 }
 
index e5d5028b3694fc68663da122664e6172095c596f..f233d78bc3644bfdd93670ac7447bb280e852e94 100644 (file)
@@ -129,6 +129,7 @@ struct dvb_frontend_ops {
        int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
        int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
        int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
+       int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
 
        struct dvb_tuner_ops tuner_ops;
 };
index 0a3c35399bea7480ef9bdcc84bc510e43704ade2..67cefdd2334a5d31ec486f9e1cf996b70acc0852 100644 (file)
@@ -39,20 +39,8 @@ config DVB_USB_DIBUSB_MB
          Support for USB 1.1 and 2.0 DVB-T receivers based on reference designs made by
          DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-B demodulator.
 
-         Devices supported by this driver:
-           Artec T1 USB1.1 boxes
-           Avermedia AverTV DVBT USB1.1
-           Compro Videomate DVB-U2000 - DVB-T USB
-           DiBcom USB1.1 reference devices (non-public)
-           Grandtec DVB-T USB
-           Hama DVB-T USB1.1-Box
-           KWorld/JetWay/ADSTech V-Stream XPERT DTV - DVB-T USB1.1 and USB2.0
-           TwinhanDTV Magic Box (VP7041e)
-           TwinhanDTV USB-Ter (VP7041)
-           Ultima Electronic/Artec T1 USB TVBOX
-
-         The VP7041 seems to be identical to "CTS Portable" (Chinese
-         Television System).
+         For an up-to-date list of devices supported by this driver, have a look
+         on the Linux-DVB Wiki at www.linuxtv.org.
 
          Say Y if you own such a device and want to use it. You should build it as
          a module.
@@ -69,12 +57,29 @@ config DVB_USB_DIBUSB_MC
        select DVB_DIB3000MC
        select DVB_TUNER_MT2060
        help
-         Support for 2.0 DVB-T receivers based on reference designs made by
+         Support for USB2.0 DVB-T receivers based on reference designs made by
          DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-C/P demodulator.
 
-         Devices supported by this driver:
-           Artec T1 USB2.0 boxes
-           DiBcom USB2.0 reference devices (non-public)
+         For an up-to-date list of devices supported by this driver, have a look
+         on the Linux-DVB Wiki at www.linuxtv.org.
+
+         Say Y if you own such a device and want to use it. You should build it as
+         a module.
+
+config DVB_USB_DIB0700
+       tristate "DiBcom DiB0700 USB DVB devices (see help for supported devices)"
+       depends on DVB_USB
+       select DVB_DIB7000M
+       select DVB_DIB3000MC
+       select DVB_TUNER_MT2060
+       help
+         Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. The
+         USB bridge is also present in devices having the DiB7700 DVB-T-USB
+         silicon. This chip can be found in devices offered by Hauppauge,
+         Avermedia and other big and small companies.
+
+         For an up-to-date list of devices supported by this driver, have a look
+         on the Linux-DVB Wiki at www.linuxtv.org.
 
          Say Y if you own such a device and want to use it. You should build it as
          a module.
index 9643f56c7fe9a02e3f5e88e3d01bbd4875bf852a..e239107998e58d7b236ff90a3d75bdbf4b82fb44 100644 (file)
@@ -1,4 +1,4 @@
-dvb-usb-objs = dvb-usb-firmware.o dvb-usb-init.o dvb-usb-urb.o dvb-usb-i2c.o dvb-usb-dvb.o dvb-usb-remote.o
+dvb-usb-objs = dvb-usb-firmware.o dvb-usb-init.o dvb-usb-urb.o dvb-usb-i2c.o dvb-usb-dvb.o dvb-usb-remote.o usb-urb.o
 obj-$(CONFIG_DVB_USB) += dvb-usb.o
 
 dvb-usb-vp7045-objs = vp7045.o vp7045-fe.o
@@ -36,4 +36,7 @@ obj-$(CONFIG_DVB_USB_DIGITV) += dvb-usb-digitv.o
 dvb-usb-cxusb-objs = cxusb.o
 obj-$(CONFIG_DVB_USB_CXUSB) += dvb-usb-cxusb.o
 
+dvb-usb-dib0700-objs = dib0700_core.o dib0700_devices.o
+obj-$(CONFIG_DVB_USB_DIB0700) += dvb-usb-dib0700.o
+
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
index df0c384bd4ca8a0d677afcd2507e04685d068648..2ed3eb62d787c49d8cde32491f6e27dbf53a6e14 100644 (file)
@@ -27,7 +27,8 @@ static int a800_power_ctrl(struct dvb_usb_device *d, int onoff)
 }
 
 /* assure to put cold to 0 for iManufacturer == 1 */
-static int a800_identify_state(struct usb_device *udev, struct dvb_usb_properties *props,struct dvb_usb_device_description **desc, int *cold)
+static int a800_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
+       struct dvb_usb_device_description **desc, int *cold)
 {
        *cold = udev->descriptor.iManufacturer != 1;
        return 0;
@@ -88,7 +89,7 @@ static int a800_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 }
 
 /* USB Driver stuff */
-static struct dvb_usb_properties a800_properties;
+static struct dvb_usb_device_properties a800_properties;
 
 static int a800_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -104,35 +105,27 @@ static struct usb_device_id a800_table [] = {
 };
 MODULE_DEVICE_TABLE (usb, a800_table);
 
-static struct dvb_usb_properties a800_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 32,
+static struct dvb_usb_device_properties a800_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
-
        .firmware = "dvb-usb-avertv-a800-02.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
-
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 32,
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = a800_power_ctrl,
+
        .frontend_attach  = dibusb_dib3000mc_frontend_attach,
        .tuner_attach     = dibusb_dib3000mc_tuner_attach,
-       .identify_state   = a800_identify_state,
-
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = a800_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(a800_rc_keys),
-       .rc_query         = a800_rc_query,
 
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x06,
                .u = {
@@ -142,6 +135,21 @@ static struct dvb_usb_properties a800_properties = {
                }
        },
 
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               },
+       },
+
+       .power_ctrl       = a800_power_ctrl,
+       .identify_state   = a800_identify_state,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = a800_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(a800_rc_keys),
+       .rc_query         = a800_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
        .num_device_descs = 1,
        .devices = {
                {   "AVerMedia AverTV DVB-T USB 2.0 (A800)",
index c710c0176e0737e9174d3529b88e3e5db69d3dc8..43f39069ef34551eadbf746ba3da2bf5e9291db3 100644 (file)
@@ -161,13 +161,13 @@ static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
                return 0;
 }
 
-static int cxusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
+static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
        u8 buf[2] = { 0x03, 0x00 };
        if (onoff)
-               cxusb_ctrl_msg(d,CMD_STREAMING_ON, buf, 2, NULL, 0);
+               cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
        else
-               cxusb_ctrl_msg(d,CMD_STREAMING_OFF, NULL, 0, NULL, 0);
+               cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
 
        return 0;
 }
@@ -327,8 +327,8 @@ static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
 static int cxusb_lgh064f_tuner_set_params(struct dvb_frontend *fe,
                                          struct dvb_frontend_parameters *fep)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
-       return lg_h06xf_pll_set(fe, &d->i2c_adap, fep);
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+       return lg_h06xf_pll_set(fe, &adap->dev->i2c_adap, fep);
 }
 
 static struct cx22702_config cxusb_cx22702_config = {
@@ -359,98 +359,99 @@ static struct mt352_config cxusb_mt352_config = {
 };
 
 /* Callbacks for DVB USB */
-static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_device *d)
+static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
        u8 bpll[4] = { 0x0b, 0xdc, 0x9c, 0xa0 };
-       d->pll_addr = 0x61;
-       memcpy(d->pll_init, bpll, 4);
-       d->pll_desc = &dvb_pll_fmd1216me;
+       adap->pll_addr = 0x61;
+       memcpy(adap->pll_init, bpll, 4);
+       adap->pll_desc = &dvb_pll_fmd1216me;
 
-       d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
-       d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
+       adap->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
+       adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
 
        return 0;
 }
 
-static int cxusb_dee1601_tuner_attach(struct dvb_usb_device *d)
+static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x61;
-       d->pll_desc = &dvb_pll_thomson_dtt7579;
-       d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
+       adap->pll_addr = 0x61;
+       adap->pll_desc = &dvb_pll_thomson_dtt7579;
+       adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
        return 0;
 }
 
-static int cxusb_lgz201_tuner_attach(struct dvb_usb_device *d)
+static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x61;
-       d->pll_desc = &dvb_pll_lg_z201;
-       d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
+       adap->pll_addr = 0x61;
+       adap->pll_desc = &dvb_pll_lg_z201;
+       adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
        return 0;
 }
 
-static int cxusb_dtt7579_tuner_attach(struct dvb_usb_device *d)
+static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x60;
-       d->pll_desc = &dvb_pll_thomson_dtt7579;
-       d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
+       adap->pll_addr = 0x60;
+       adap->pll_desc = &dvb_pll_thomson_dtt7579;
+       adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
        return 0;
 }
 
-static int cxusb_lgdt3303_tuner_attach(struct dvb_usb_device *d)
+static int cxusb_lgdt3303_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->fe->ops.tuner_ops.set_params = cxusb_lgh064f_tuner_set_params;
+       adap->fe->ops.tuner_ops.set_params = cxusb_lgh064f_tuner_set_params;
        return 0;
 }
 
-static int cxusb_cx22702_frontend_attach(struct dvb_usb_device *d)
+static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
 {
        u8 b;
-       if (usb_set_interface(d->udev,0,6) < 0)
+       if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
                err("set interface failed");
 
-       cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, &b, 1);
+       cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
 
-       if ((d->fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config, &d->i2c_adap)) != NULL)
+       if ((adap->fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config, &adap->dev->i2c_adap)) != NULL)
                return 0;
 
        return -EIO;
 }
 
-static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_device *d)
+static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       if (usb_set_interface(d->udev,0,7) < 0)
+       if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
                err("set interface failed");
 
-       cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0);
+       cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((d->fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config, &d->i2c_adap)) != NULL)
+       if ((adap->fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config, &adap->dev->i2c_adap)) != NULL)
                return 0;
 
        return -EIO;
 }
 
-static int cxusb_mt352_frontend_attach(struct dvb_usb_device *d)
-{      /* used in both lgz201 and th7579 */
-       if (usb_set_interface(d->udev,0,0) < 0)
+static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
+{
+       /* used in both lgz201 and th7579 */
+       if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
                err("set interface failed");
 
-       cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0);
+       cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((d->fe = dvb_attach(mt352_attach, &cxusb_mt352_config, &d->i2c_adap)) != NULL)
+       if ((adap->fe = dvb_attach(mt352_attach, &cxusb_mt352_config, &adap->dev->i2c_adap)) != NULL)
                return 0;
 
        return -EIO;
 }
 
-static int cxusb_dee1601_frontend_attach(struct dvb_usb_device *d)
+static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       if (usb_set_interface(d->udev,0,0) < 0)
+       if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
                err("set interface failed");
 
-       cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0);
+       cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if (((d->fe = dvb_attach(mt352_attach, &cxusb_dee1601_config, &d->i2c_adap)) != NULL) ||
-               ((d->fe = dvb_attach(zl10353_attach, &cxusb_zl10353_dee1601_config, &d->i2c_adap)) != NULL))
+       if (((adap->fe = dvb_attach(mt352_attach, &cxusb_dee1601_config, &adap->dev->i2c_adap)) != NULL) ||
+               ((adap->fe = dvb_attach(zl10353_attach, &cxusb_zl10353_dee1601_config, &adap->dev->i2c_adap)) != NULL))
                return 0;
 
        return -EIO;
@@ -480,11 +481,11 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev, const
 }
 
 /* DVB USB Driver stuff */
-static struct dvb_usb_properties cxusb_medion_properties;
-static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties;
-static struct dvb_usb_properties cxusb_bluebird_dee1601_properties;
-static struct dvb_usb_properties cxusb_bluebird_lgz201_properties;
-static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties;
+static struct dvb_usb_device_properties cxusb_medion_properties;
+static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
+static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
+static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
+static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
 
 static int cxusb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -504,36 +505,36 @@ static struct usb_device_id cxusb_table [] = {
                { USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM) },
-               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_COLD) },
-               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_WARM) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD) },
                { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM) },
-               { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DEE1601_COLD) },
-               { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DEE1601_WARM) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD) },
+               { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM) },
                {}              /* Terminating entry */
 };
 MODULE_DEVICE_TABLE (usb, cxusb_table);
 
-static struct dvb_usb_properties cxusb_medion_properties = {
+static struct dvb_usb_device_properties cxusb_medion_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
 
        .size_of_priv     = sizeof(struct cxusb_state),
 
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = cxusb_streaming_ctrl,
-       .power_ctrl       = cxusb_power_ctrl,
        .frontend_attach  = cxusb_cx22702_frontend_attach,
        .tuner_attach     = cxusb_fmd1216me_tuner_attach,
-
-       .i2c_algo         = &cxusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 5,
                .endpoint = 0x02,
                .u = {
@@ -543,6 +544,14 @@ static struct dvb_usb_properties cxusb_medion_properties = {
                }
        },
 
+               },
+       },
+       .power_ctrl       = cxusb_power_ctrl,
+
+       .i2c_algo         = &cxusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
+
        .num_device_descs = 1,
        .devices = {
                {   "Medion MD95700 (MDUSBTV-HYBRID)",
@@ -552,7 +561,7 @@ static struct dvb_usb_properties cxusb_medion_properties = {
        }
 };
 
-static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
+static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl          = DEVICE_SPECIFIC,
@@ -563,22 +572,16 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
 
        .size_of_priv     = sizeof(struct cxusb_state),
 
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = cxusb_streaming_ctrl,
-       .power_ctrl       = cxusb_bluebird_power_ctrl,
        .frontend_attach  = cxusb_lgdt3303_frontend_attach,
        .tuner_attach     = cxusb_lgdt3303_tuner_attach,
 
-       .i2c_algo         = &cxusb_i2c_algo,
-
-       .rc_interval      = 100,
-       .rc_key_map       = dvico_portable_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
-       .rc_query         = cxusb_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 5,
                .endpoint = 0x02,
                .u = {
@@ -587,6 +590,19 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
                        }
                }
        },
+               },
+       },
+
+       .power_ctrl       = cxusb_bluebird_power_ctrl,
+
+       .i2c_algo         = &cxusb_i2c_algo,
+
+       .rc_interval      = 100,
+       .rc_key_map       = dvico_portable_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
+       .rc_query         = cxusb_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
@@ -597,7 +613,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
        }
 };
 
-static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
+static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl          = DEVICE_SPECIFIC,
@@ -608,22 +624,15 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
 
        .size_of_priv     = sizeof(struct cxusb_state),
 
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = cxusb_streaming_ctrl,
-       .power_ctrl       = cxusb_bluebird_power_ctrl,
        .frontend_attach  = cxusb_dee1601_frontend_attach,
        .tuner_attach     = cxusb_dee1601_tuner_attach,
-
-       .i2c_algo         = &cxusb_i2c_algo,
-
-       .rc_interval      = 150,
-       .rc_key_map       = dvico_mce_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(dvico_mce_rc_keys),
-       .rc_query         = cxusb_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 5,
                .endpoint = 0x04,
                .u = {
@@ -632,8 +641,21 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
                        }
                }
        },
+               },
+       },
+
+       .power_ctrl       = cxusb_bluebird_power_ctrl,
 
-       .num_device_descs = 2,
+       .i2c_algo         = &cxusb_i2c_algo,
+
+       .rc_interval      = 150,
+       .rc_key_map       = dvico_mce_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(dvico_mce_rc_keys),
+       .rc_query         = cxusb_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
+
+       .num_device_descs = 3,
        .devices = {
                {   "DViCO FusionHDTV DVB-T Dual USB",
                        { &cxusb_table[3], NULL },
@@ -643,10 +665,14 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
                        { &cxusb_table[9],  NULL },
                        { &cxusb_table[10], NULL },
                },
+               {   "DViCO FusionHDTV DVB-T Dual Digital 2",
+                       { &cxusb_table[11], NULL },
+                       { &cxusb_table[12], NULL },
+               },
        }
 };
 
-static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
+static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl          = DEVICE_SPECIFIC,
@@ -657,22 +683,16 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
 
        .size_of_priv     = sizeof(struct cxusb_state),
 
+       .num_adapters = 2,
+       .adapter = {
+               {
        .streaming_ctrl   = cxusb_streaming_ctrl,
-       .power_ctrl       = cxusb_bluebird_power_ctrl,
        .frontend_attach  = cxusb_mt352_frontend_attach,
        .tuner_attach     = cxusb_lgz201_tuner_attach,
 
-       .i2c_algo         = &cxusb_i2c_algo,
-
-       .rc_interval      = 100,
-       .rc_key_map       = dvico_portable_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
-       .rc_query         = cxusb_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 5,
                .endpoint = 0x04,
                .u = {
@@ -681,7 +701,18 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
                        }
                }
        },
+               },
+       },
+       .power_ctrl       = cxusb_bluebird_power_ctrl,
+
+       .i2c_algo         = &cxusb_i2c_algo,
 
+       .rc_interval      = 100,
+       .rc_key_map       = dvico_portable_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
+       .rc_query         = cxusb_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
        .num_device_descs = 1,
        .devices = {
                {   "DViCO FusionHDTV DVB-T USB (LGZ201)",
@@ -691,7 +722,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
        }
 };
 
-static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
+static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl          = DEVICE_SPECIFIC,
@@ -702,22 +733,16 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
 
        .size_of_priv     = sizeof(struct cxusb_state),
 
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = cxusb_streaming_ctrl,
-       .power_ctrl       = cxusb_bluebird_power_ctrl,
        .frontend_attach  = cxusb_mt352_frontend_attach,
        .tuner_attach     = cxusb_dtt7579_tuner_attach,
 
-       .i2c_algo         = &cxusb_i2c_algo,
-
-       .rc_interval      = 100,
-       .rc_key_map       = dvico_portable_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
-       .rc_query         = cxusb_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 5,
                .endpoint = 0x04,
                .u = {
@@ -726,6 +751,18 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
                        }
                }
        },
+               },
+       },
+       .power_ctrl       = cxusb_bluebird_power_ctrl,
+
+       .i2c_algo         = &cxusb_i2c_algo,
+
+       .rc_interval      = 100,
+       .rc_key_map       = dvico_portable_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
+       .rc_query         = cxusb_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h
new file mode 100644 (file)
index 0000000..ac84347
--- /dev/null
@@ -0,0 +1,49 @@
+/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
+ *
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the Free
+ *     Software Foundation, version 2.
+ *
+ *  Copyright (C) 2005-6 DiBcom, SA
+ */
+#ifndef _DIB0700_H_
+#define _DIB0700_H_
+
+#define DVB_USB_LOG_PREFIX "dib0700"
+#include "dvb-usb.h"
+
+#include "dib07x0.h"
+
+extern int dvb_usb_dib0700_debug;
+#define deb_info(args...)   dprintk(dvb_usb_dib0700_debug,0x01,args)
+#define deb_fw(args...)     dprintk(dvb_usb_dib0700_debug,0x02,args)
+#define deb_fwdata(args...) dprintk(dvb_usb_dib0700_debug,0x04,args)
+#define deb_data(args...)   dprintk(dvb_usb_dib0700_debug,0x08,args)
+
+#define REQUEST_I2C_READ     0x2
+#define REQUEST_I2C_WRITE    0x3
+#define REQUEST_POLL_RC      0x4
+#define REQUEST_JUMPRAM      0x8
+#define REQUEST_SET_GPIO     0xC
+#define REQUEST_ENABLE_VIDEO 0xF
+       // 1 Byte: 4MSB(1 = enable streaming, 0 = disable streaming) 4LSB(Video Mode: 0 = MPEG2 188Bytes, 1 = Analog)
+       // 2 Byte: MPEG2 mode:  4MSB(1 = Master Mode, 0 = Slave Mode) 4LSB(Channel 1 = bit0, Channel 2 = bit1)
+       // 2 Byte: Analog mode: 4MSB(0 = 625 lines, 1 = 525 lines)    4LSB(     "                "           )
+
+struct dib0700_state {
+       u8 channel_state;
+       u16 mt2060_if1[2];
+};
+
+extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val);
+extern int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw);
+extern int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff);
+extern struct i2c_algorithm dib0700_i2c_algo;
+extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
+                       struct dvb_usb_device_description **desc, int *cold);
+
+extern int dib0700_device_count;
+extern struct dvb_usb_device_properties dib0700_devices[];
+extern struct usb_device_id dib0700_usb_id_table[];
+
+#endif
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c
new file mode 100644 (file)
index 0000000..dca6c69
--- /dev/null
@@ -0,0 +1,279 @@
+/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
+ *
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the Free
+ *     Software Foundation, version 2.
+ *
+ *  Copyright (C) 2005-6 DiBcom, SA
+ */
+#include "dib0700.h"
+
+/* debug */
+int dvb_usb_dib0700_debug;
+module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
+MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);
+
+/* expecting rx buffer: request data[0] data[1] ... data[2] */
+static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
+{
+       int status;
+
+       deb_data(">>> ");
+       debug_dump(tx,txlen,deb_data);
+
+       status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
+               tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
+               USB_CTRL_GET_TIMEOUT);
+
+       if (status != txlen)
+               deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
+
+       return status < 0 ? status : 0;
+}
+
+/* expecting tx buffer: request data[0] ... data[n] (n <= 4) */
+static int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
+{
+       u16 index, value;
+       int status;
+
+       if (txlen < 2) {
+               err("tx buffer length is smaller than 2. Makes no sense.");
+               return -EINVAL;
+       }
+       if (txlen > 4) {
+               err("tx buffer length is larger than 4. Not supported.");
+               return -EINVAL;
+       }
+
+       deb_data(">>> ");
+       debug_dump(tx,txlen,deb_data);
+
+       value = ((txlen - 2) << 8) | tx[1];
+       index = 0;
+       if (txlen > 2)
+               index |= (tx[2] << 8);
+       if (txlen > 3)
+               index |= tx[3];
+
+       /* think about swapping here */
+       value = le16_to_cpu(value);
+       index = le16_to_cpu(index);
+
+       status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
+                       USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
+                       USB_CTRL_GET_TIMEOUT);
+
+       if (status < 0)
+               deb_info("ep 0 read error (status = %d)\n",status);
+
+       deb_data("<<< ");
+       debug_dump(rx,rxlen,deb_data);
+
+       return status; /* length in case of success */
+}
+
+int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
+{
+       u8 buf[3] = { REQUEST_SET_GPIO, gpio, ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6) };
+       return dib0700_ctrl_wr(d,buf,3);
+}
+
+/*
+ * I2C master xfer function
+ */
+static int dib0700_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msg,int num)
+{
+       struct dvb_usb_device *d = i2c_get_adapdata(adap);
+       int i,len;
+       u8 buf[255];
+
+       if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
+               return -EAGAIN;
+
+       for (i = 0; i < num; i++) {
+               /* fill in the address */
+               buf[1] = (msg[i].addr << 1);
+               /* fill the buffer */
+               memcpy(&buf[2], msg[i].buf, msg[i].len);
+
+               /* write/read request */
+               if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
+                       buf[0] = REQUEST_I2C_READ;
+                       buf[1] |= 1;
+
+                       /* special thing in the current firmware: when length is zero the read-failed */
+                       if ((len = dib0700_ctrl_rd(d, buf, msg[i].len + 2, msg[i+1].buf, msg[i+1].len)) <= 0) {
+                               deb_info("I2C read failed on address %x\n", msg[i].addr);
+                               break;
+                       }
+
+                       msg[i+1].len = len;
+
+                       i++;
+               } else {
+                       buf[0] = REQUEST_I2C_WRITE;
+                       if (dib0700_ctrl_wr(d, buf, msg[i].len + 2) < 0)
+                               break;
+               }
+       }
+
+       mutex_unlock(&d->i2c_mutex);
+       return i;
+}
+
+static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_I2C;
+}
+
+struct i2c_algorithm dib0700_i2c_algo = {
+       .master_xfer   = dib0700_i2c_xfer,
+       .functionality = dib0700_i2c_func,
+};
+
+int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
+                       struct dvb_usb_device_description **desc, int *cold)
+{
+       u8 buf[3] = { REQUEST_SET_GPIO, 4, (GPIO_IN << 7) | (0 << 6) }; // GPIO4 is save - used for I2C
+       *cold = usb_control_msg(udev, usb_sndctrlpipe(udev,0),
+               buf[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, buf, 3, USB_CTRL_GET_TIMEOUT) != 3;
+
+       deb_info("cold: %d\n", *cold);
+       return 0;
+}
+
+static int dib0700_jumpram(struct usb_device *udev, u32 address)
+{
+       int ret, actlen;
+       u8 buf[8] = { REQUEST_JUMPRAM, 0, 0, 0,
+               (address >> 24) & 0xff,
+               (address >> 16) & 0xff,
+               (address >> 8)  & 0xff,
+                address        & 0xff };
+
+       if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
+               deb_fw("jumpram to 0x%x failed\n",address);
+               return ret;
+       }
+       if (actlen != 8) {
+               deb_fw("jumpram to 0x%x failed\n",address);
+               return -EIO;
+       }
+       return 0;
+}
+
+int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
+{
+       struct hexline hx;
+       int pos = 0, ret, act_len;
+
+       u8 buf[260];
+
+       while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
+               deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",hx.addr, hx.len, hx.chk);
+
+               buf[0] = hx.len;
+               buf[1] = (hx.addr >> 8) & 0xff;
+               buf[2] =  hx.addr       & 0xff;
+               buf[3] = hx.type;
+               memcpy(&buf[4],hx.data,hx.len);
+               buf[4+hx.len] = hx.chk;
+
+               ret = usb_bulk_msg(udev,
+                       usb_sndbulkpipe(udev, 0x01),
+                       buf,
+                       hx.len + 5,
+                       &act_len,
+                       1000);
+
+               if (ret < 0) {
+                       err("firmware download failed at %d with %d",pos,ret);
+                       return ret;
+               }
+       }
+
+       if (ret == 0) {
+               /* start the firmware */
+               if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
+                       info("firmware started successfully.");
+                       msleep(100);
+               }
+       } else
+               ret = -EIO;
+
+       return ret;
+}
+
+int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
+{
+       struct dib0700_state *st = adap->dev->priv;
+       u8 b[4];
+
+       b[0] = REQUEST_ENABLE_VIDEO;
+       b[1] = 0x00;
+       b[2] = (0x01 << 4); /* Master mode */
+       b[3] = 0x00;
+
+       deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
+
+       if (onoff)
+               st->channel_state |=   1 << adap->id;
+       else
+               st->channel_state &= ~(1 << adap->id);
+
+       b[2] |= st->channel_state;
+
+       if (st->channel_state) /* if at least one channel is active */
+               b[1] = (0x01 << 4) | 0x00;
+
+       deb_info("data for streaming: %x %x\n",b[1],b[2]);
+
+       return dib0700_ctrl_wr(adap->dev, b, 4);
+}
+
+static int dib0700_probe(struct usb_interface *intf,
+               const struct usb_device_id *id)
+{
+       int i;
+
+       for (i = 0; i < dib0700_device_count; i++)
+               if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE, NULL) == 0)
+                       return 0;
+
+       return -ENODEV;
+}
+
+static struct usb_driver dib0700_driver = {
+       .name       = "dvb_usb_dib0700",
+       .probe      = dib0700_probe,
+       .disconnect = dvb_usb_device_exit,
+       .id_table   = dib0700_usb_id_table,
+};
+
+/* module stuff */
+static int __init dib0700_module_init(void)
+{
+       int result;
+       info("loaded with support for %d different device-types", dib0700_device_count);
+       if ((result = usb_register(&dib0700_driver))) {
+               err("usb_register failed. Error number %d",result);
+               return result;
+       }
+
+       return 0;
+}
+
+static void __exit dib0700_module_exit(void)
+{
+       /* deregister this driver from the USB subsystem */
+       usb_deregister(&dib0700_driver);
+}
+
+module_init (dib0700_module_init);
+module_exit (dib0700_module_exit);
+
+MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
+MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
+MODULE_VERSION("1.0");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
new file mode 100644 (file)
index 0000000..e473bfe
--- /dev/null
@@ -0,0 +1,212 @@
+/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
+ *
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the Free
+ *     Software Foundation, version 2.
+ *
+ *  Copyright (C) 2005-6 DiBcom, SA
+ */
+#include "dib0700.h"
+
+#include "dib3000mc.h"
+#include "mt2060.h"
+
+static int force_lna_activation;
+module_param(force_lna_activation, int, 0644);
+MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
+               "if applicable for the device (default: 0=automatic/off).");
+
+/* Hauppauge Nova-T 500
+ *  has a LNA on GPIO0 which is enabled by setting 1 */
+static struct mt2060_config bristol_mt2060_config[2] = {
+       {
+               .i2c_address = 0x60,
+               .clock_out   = 3,
+       }, {
+               .i2c_address = 0x61,
+       }
+};
+
+static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
+       .band_caps = BAND_VHF | BAND_UHF,
+       .setup     = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
+
+       .agc1_max = 42598,
+       .agc1_min = 17694,
+       .agc2_max = 45875,
+       .agc2_min = 0,
+
+       .agc1_pt1 = 0,
+       .agc1_pt2 = 59,
+
+       .agc1_slope1 = 0,
+       .agc1_slope2 = 69,
+
+       .agc2_pt1 = 0,
+       .agc2_pt2 = 59,
+
+       .agc2_slope1 = 111,
+       .agc2_slope2 = 28,
+};
+
+static struct dib3000mc_config bristol_dib3000mc_config[2] = {
+       {       .agc          = &bristol_dib3000p_mt2060_agc_config,
+               .max_time     = 0x196,
+               .ln_adc_level = 0x1cc7,
+               .output_mpeg2_in_188_bytes = 1,
+       },
+       {       .agc          = &bristol_dib3000p_mt2060_agc_config,
+               .max_time     = 0x196,
+               .ln_adc_level = 0x1cc7,
+               .output_mpeg2_in_188_bytes = 1,
+       }
+};
+
+static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
+{
+       struct dib0700_state *st = adap->dev->priv;
+       if (adap->id == 0) {
+               dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(10);
+               dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
+               dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
+               dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
+
+               if (force_lna_activation)
+                       dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
+               else
+                       dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
+
+               if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
+                       dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
+                       return -ENODEV;
+               }
+       }
+       st->mt2060_if1[adap->id] = 1220;
+       return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
+               (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
+}
+
+static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
+{
+       struct dib0700_state *st = adap->dev->priv;
+       struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
+       return dvb_attach(mt2060_attach,adap->fe, tun_i2c, &bristol_mt2060_config[adap->id],
+               st->mt2060_if1[adap->id]) == NULL ? -ENODEV : 0;
+}
+
+/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
+/*
+static struct mt2060_config stk7000p_mt2060_config = {
+       0x60
+};
+*/
+
+static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
+{
+       /* unless there is no real power management in DVB - we leave the device on GPIO6 */
+       dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
+       dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
+       dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
+       dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
+
+//     adap->fe = dib7000m_attach(&adap->dev->i2c_adap, &stk7700p_dib7000m_config, 18);
+       return 0;
+}
+
+static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
+{
+//     tun_i2c = dib7000m_get_tuner_i2c_master(adap->fe, 1);
+//     return mt2060_attach(adap->fe, tun_i2c, &stk3000p_mt2060_config, if1);
+       return 0;
+}
+
+struct usb_device_id dib0700_usb_id_table[] = {
+               { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
+               { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
+               { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
+               { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
+               { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
+               { }             /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
+
+#define DIB0700_DEFAULT_DEVICE_PROPERTIES \
+       .caps              = DVB_USB_IS_AN_I2C_ADAPTER, \
+       .usb_ctrl          = DEVICE_SPECIFIC, \
+       .firmware          = "dvb-usb-dib0700-01.fw", \
+       .download_firmware = dib0700_download_firmware, \
+       .no_reconnect      = 1, \
+       .size_of_priv      = sizeof(struct dib0700_state), \
+       .i2c_algo          = &dib0700_i2c_algo, \
+       .identify_state    = dib0700_identify_state
+
+#define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
+       .streaming_ctrl   = dib0700_streaming_ctrl, \
+       .stream = { \
+               .type = USB_BULK, \
+               .count = 4, \
+               .endpoint = ep, \
+               .u = { \
+                       .bulk = { \
+                               .buffersize = 39480, \
+                       } \
+               } \
+       }
+
+struct dvb_usb_device_properties dib0700_devices[] = {
+       {
+               DIB0700_DEFAULT_DEVICE_PROPERTIES,
+
+               .num_adapters = 1,
+               .adapter = {
+                       {
+                               .frontend_attach  = stk7700p_frontend_attach,
+                               .tuner_attach     = stk7700p_tuner_attach,
+
+                               DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       },
+               },
+
+               .num_device_descs = 3,
+               .devices = {
+                       {   "DiBcom STK7700P reference design",
+                               { &dib0700_usb_id_table[0], NULL },
+                               { NULL },
+                       },
+                       {   "Hauppauge Nova-T Stick",
+                               { &dib0700_usb_id_table[3], NULL },
+                               { NULL },
+                       },
+                       {   "AVerMedia AVerTV DVB-T Volar",
+                               { &dib0700_usb_id_table[4], NULL },
+                               { NULL },
+                       },
+               }
+       }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
+
+               .num_adapters = 2,
+               .adapter = {
+                       {
+                               .frontend_attach  = bristol_frontend_attach,
+                               .tuner_attach     = bristol_tuner_attach,
+
+                               DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       }, {
+                               .frontend_attach  = bristol_frontend_attach,
+                               .tuner_attach     = bristol_tuner_attach,
+
+                               DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
+                       }
+               },
+
+               .num_device_descs = 1,
+               .devices = {
+                       {   "Hauppauge Nova-T 500 Dual DVB-T",
+                               { &dib0700_usb_id_table[1], &dib0700_usb_id_table[2], NULL },
+                               { NULL },
+                       },
+               }
+       }
+};
+
+int dib0700_device_count = ARRAY_SIZE(dib0700_devices);
diff --git a/drivers/media/dvb/dvb-usb/dib07x0.h b/drivers/media/dvb/dvb-usb/dib07x0.h
new file mode 100644 (file)
index 0000000..7e62c10
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _DIB07X0_H_
+#define _DIB07X0_H_
+
+enum dib07x0_gpios {
+       GPIO0  =  0,
+       GPIO1  =  2,
+       GPIO2  =  3,
+       GPIO3  =  4,
+       GPIO4  =  5,
+       GPIO5  =  6,
+       GPIO6  =  8,
+       GPIO7  = 10,
+       GPIO8  = 11,
+       GPIO9  = 14,
+       GPIO10 = 15,
+};
+
+#define GPIO_IN  0
+#define GPIO_OUT 1
+
+#endif
index 124e25ac53b3ce625660ed6819a2d92833fe1ab8..fd3a9902f98d472662f69ee96690c5d11d673814 100644 (file)
@@ -18,12 +18,12 @@ MODULE_LICENSE("GPL");
 #define deb_info(args...) dprintk(debug,0x01,args)
 
 /* common stuff used by the different dibusb modules */
-int dibusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
+int dibusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
-       if (d->priv != NULL) {
-               struct dibusb_state *st = d->priv;
+       if (adap->priv != NULL) {
+               struct dibusb_state *st = adap->priv;
                if (st->ops.fifo_ctrl != NULL)
-                       if (st->ops.fifo_ctrl(d->fe,onoff)) {
+                       if (st->ops.fifo_ctrl(adap->fe,onoff)) {
                                err("error while controlling the fifo of the demod.");
                                return -ENODEV;
                        }
@@ -32,23 +32,23 @@ int dibusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
 }
 EXPORT_SYMBOL(dibusb_streaming_ctrl);
 
-int dibusb_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff)
+int dibusb_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
 {
-       if (d->priv != NULL) {
-               struct dibusb_state *st = d->priv;
+       if (adap->priv != NULL) {
+               struct dibusb_state *st = adap->priv;
                if (st->ops.pid_ctrl != NULL)
-                       st->ops.pid_ctrl(d->fe,index,pid,onoff);
+                       st->ops.pid_ctrl(adap->fe,index,pid,onoff);
        }
        return 0;
 }
 EXPORT_SYMBOL(dibusb_pid_filter);
 
-int dibusb_pid_filter_ctrl(struct dvb_usb_device *d, int onoff)
+int dibusb_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
-       if (d->priv != NULL) {
-               struct dibusb_state *st = d->priv;
+       if (adap->priv != NULL) {
+               struct dibusb_state *st = adap->priv;
                if (st->ops.pid_parse != NULL)
-                       if (st->ops.pid_parse(d->fe,onoff) < 0)
+                       if (st->ops.pid_parse(adap->fe,onoff) < 0)
                                err("could not handle pid_parser");
        }
        return 0;
@@ -68,24 +68,24 @@ int dibusb_power_ctrl(struct dvb_usb_device *d, int onoff)
 }
 EXPORT_SYMBOL(dibusb_power_ctrl);
 
-int dibusb2_0_streaming_ctrl(struct dvb_usb_device *d, int onoff)
+int dibusb2_0_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
        u8 b[3] = { 0 };
        int ret;
 
-       if ((ret = dibusb_streaming_ctrl(d,onoff)) < 0)
+       if ((ret = dibusb_streaming_ctrl(adap,onoff)) < 0)
                return ret;
 
        if (onoff) {
                b[0] = DIBUSB_REQ_SET_STREAMING_MODE;
                b[1] = 0x00;
-               if ((ret = dvb_usb_generic_write(d,b,2)) < 0)
+               if ((ret = dvb_usb_generic_write(adap->dev,b,2)) < 0)
                        return ret;
        }
 
        b[0] = DIBUSB_REQ_SET_IOCTL;
        b[1] = onoff ? DIBUSB_IOCTL_CMD_ENABLE_STREAM : DIBUSB_IOCTL_CMD_DISABLE_STREAM;
-       return dvb_usb_generic_write(d,b,3);
+       return dvb_usb_generic_write(adap->dev,b,3);
 }
 EXPORT_SYMBOL(dibusb2_0_streaming_ctrl);
 
@@ -228,12 +228,12 @@ static struct dib3000mc_config mod3000p_dib3000p_config = {
        .output_mpeg2_in_188_bytes = 1,
 };
 
-int dibusb_dib3000mc_frontend_attach(struct dvb_usb_device *d)
+int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       if (dib3000mc_attach(&d->i2c_adap, 1, DEFAULT_DIB3000P_I2C_ADDRESS, 0, &mod3000p_dib3000p_config, &d->fe) == 0 ||
-               dib3000mc_attach(&d->i2c_adap, 1, DEFAULT_DIB3000MC_I2C_ADDRESS, 0, &mod3000p_dib3000p_config, &d->fe) == 0) {
-               if (d->priv != NULL) {
-                       struct dibusb_state *st = d->priv;
+       if ((adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS,  &mod3000p_dib3000p_config)) != NULL ||
+               (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
+               if (adap->priv != NULL) {
+                       struct dibusb_state *st = adap->priv;
                        st->ops.pid_parse = dib3000mc_pid_parse;
                        st->ops.pid_ctrl  = dib3000mc_pid_control;
                }
@@ -247,20 +247,19 @@ static struct mt2060_config stk3000p_mt2060_config = {
        0x60
 };
 
-int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *d)
+int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       struct dibusb_state *st = d->priv;
-       int ret;
+       struct dibusb_state *st = adap->priv;
        u8 a,b;
        u16 if1 = 1220;
        struct i2c_adapter *tun_i2c;
 
        // First IF calibration for Liteon Sticks
-       if (d->udev->descriptor.idVendor == USB_VID_LITEON &&
-               d->udev->descriptor.idProduct == USB_PID_LITEON_DVB_T_WARM) {
+       if (adap->dev->udev->descriptor.idVendor  == USB_VID_LITEON &&
+               adap->dev->udev->descriptor.idProduct == USB_PID_LITEON_DVB_T_WARM) {
 
-               dibusb_read_eeprom_byte(d,0x7E,&a);
-               dibusb_read_eeprom_byte(d,0x7F,&b);
+               dibusb_read_eeprom_byte(adap->dev,0x7E,&a);
+               dibusb_read_eeprom_byte(adap->dev,0x7F,&b);
 
                if (a == 0x00)
                        if1 += b;
@@ -269,14 +268,14 @@ int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *d)
                else
                        warn("LITE-ON DVB-T: Strange IF1 calibration :%2X %2X\n", a, b);
 
-       } else if (d->udev->descriptor.idVendor  == USB_VID_DIBCOM &&
-                  d->udev->descriptor.idProduct == USB_PID_DIBCOM_MOD3001_WARM) {
+       } else if (adap->dev->udev->descriptor.idVendor  == USB_VID_DIBCOM &&
+                  adap->dev->udev->descriptor.idProduct == USB_PID_DIBCOM_MOD3001_WARM) {
                u8 desc;
-               dibusb_read_eeprom_byte(d, 7, &desc);
+               dibusb_read_eeprom_byte(adap->dev, 7, &desc);
                if (desc == 2) {
                        a = 127;
                        do {
-                               dibusb_read_eeprom_byte(d, a, &desc);
+                               dibusb_read_eeprom_byte(adap->dev, a, &desc);
                                a--;
                        } while (a > 7 && (desc == 0xff || desc == 0x00));
                        if (desc & 0x80)
@@ -286,15 +285,15 @@ int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *d)
                }
        }
 
-       tun_i2c = dib3000mc_get_tuner_i2c_master(d->fe, 1);
-       if ((ret = mt2060_attach(d->fe, tun_i2c, &stk3000p_mt2060_config, if1)) != 0) {
+       tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
+       if (dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
                /* not found - use panasonic pll parameters */
-               if (dvb_pll_attach(d->fe, 0x60, tun_i2c, &dvb_pll_env57h1xd5) == NULL)
+               if (dvb_attach(dvb_pll_attach, adap->fe, 0x60, tun_i2c, &dvb_pll_env57h1xd5) == NULL)
                        return -ENOMEM;
        } else {
                st->mt2060_present = 1;
                /* set the correct parameters for the dib3000p */
-               dib3000mc_set_config(d->fe, &stk3000p_dib3000p_config);
+               dib3000mc_set_config(adap->fe, &stk3000p_dib3000p_config);
        }
        return 0;
 }
index effd34cc4b02d23601086904734a3b0ce78db57c..4fe363e48352b753b0359706bc33c3731582fb36 100644 (file)
  */
 #include "dibusb.h"
 
-static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_device *d)
+static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
 {
        struct dib3000_config demod_cfg;
-       struct dibusb_state *st = d->priv;
+       struct dibusb_state *st = adap->priv;
 
        demod_cfg.demod_address = 0x8;
 
-       if ((d->fe = dib3000mb_attach(&demod_cfg,&d->i2c_adap,&st->ops)) == NULL)
+       if ((adap->fe = dib3000mb_attach(&demod_cfg,&adap->dev->i2c_adap,&st->ops)) == NULL)
                return -ENODEV;
 
-       d->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
-       d->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
+       adap->fe->ops.tuner_ops.init       = dvb_usb_tuner_init_i2c;
+       adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
 
-       d->tuner_pass_ctrl = st->ops.tuner_pass_ctrl;
+       adap->tuner_pass_ctrl = st->ops.tuner_pass_ctrl;
 
        return 0;
 }
 
-static int dibusb_thomson_tuner_attach(struct dvb_usb_device *d)
+static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x61;
-       d->pll_desc = &dvb_pll_tua6010xs;
+       adap->pll_addr = 0x61;
+       adap->pll_desc = &dvb_pll_tua6010xs;
        return 0;
 }
 
 /* Some of the Artec 1.1 device aren't equipped with the default tuner
  * (Thomson Cable), but with a Panasonic ENV77H11D5.  This function figures
  * this out. */
-static int dibusb_tuner_probe_and_attach(struct dvb_usb_device *d)
+static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
 {
        u8 b[2] = { 0,0 }, b2[1];
        int ret = 0;
@@ -54,36 +54,36 @@ static int dibusb_tuner_probe_and_attach(struct dvb_usb_device *d)
        /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
        msg[0].addr = msg[1].addr = 0x60;
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(d->fe,1,msg[0].addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(adap->fe,1,msg[0].addr);
 
-       if (i2c_transfer (&d->i2c_adap, msg, 2) != 2) {
+       if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
                err("tuner i2c write failed.");
                ret = -EREMOTEIO;
        }
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(d->fe,0,msg[0].addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(adap->fe,0,msg[0].addr);
 
        if (b2[0] == 0xfe) {
                info("This device has the Thomson Cable onboard. Which is default.");
-               dibusb_thomson_tuner_attach(d);
+               dibusb_thomson_tuner_attach(adap);
        } else {
                u8 bpll[4] = { 0x0b, 0xf5, 0x85, 0xab };
                info("This device has the Panasonic ENV77H11D5 onboard.");
-               d->pll_addr = 0x60;
-               memcpy(d->pll_init,bpll,4);
-               d->pll_desc = &dvb_pll_tda665x;
+               adap->pll_addr = 0x60;
+               memcpy(adap->pll_init,bpll,4);
+               adap->pll_desc = &dvb_pll_tda665x;
        }
 
        return ret;
 }
 
 /* USB Driver stuff */
-static struct dvb_usb_properties dibusb1_1_properties;
-static struct dvb_usb_properties dibusb1_1_an2235_properties;
-static struct dvb_usb_properties dibusb2_0b_properties;
-static struct dvb_usb_properties artec_t1_usb2_properties;
+static struct dvb_usb_device_properties dibusb1_1_properties;
+static struct dvb_usb_device_properties dibusb1_1_an2235_properties;
+static struct dvb_usb_device_properties dibusb2_0b_properties;
+static struct dvb_usb_device_properties artec_t1_usb2_properties;
 
 static int dibusb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -150,34 +150,28 @@ static struct usb_device_id dibusb_dib3000mb_table [] = {
 };
 MODULE_DEVICE_TABLE (usb, dibusb_dib3000mb_table);
 
-static struct dvb_usb_properties dibusb1_1_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 16,
+static struct dvb_usb_device_properties dibusb1_1_properties = {
+       .caps =  DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_AN2135,
 
        .firmware = "dvb-usb-dibusb-5.0.0.11.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 16,
 
        .streaming_ctrl   = dibusb_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb_power_ctrl,
        .frontend_attach  = dibusb_dib3000mb_frontend_attach,
        .tuner_attach     = dibusb_tuner_probe_and_attach,
 
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = dibusb_rc_keys,
-       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
-       .rc_query         = dibusb_rc_query,
-
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -186,6 +180,20 @@ static struct dvb_usb_properties dibusb1_1_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+
+       .power_ctrl       = dibusb_power_ctrl,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = dibusb_rc_keys,
+       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
+       .rc_query         = dibusb_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 9,
        .devices = {
@@ -228,34 +236,27 @@ static struct dvb_usb_properties dibusb1_1_properties = {
        }
 };
 
-static struct dvb_usb_properties dibusb1_1_an2235_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 16,
-
+static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
        .usb_ctrl = CYPRESS_AN2235,
 
        .firmware = "dvb-usb-dibusb-an2235-01.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER,
+                       .pid_filter_count = 16,
 
        .streaming_ctrl   = dibusb_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb_power_ctrl,
        .frontend_attach  = dibusb_dib3000mb_frontend_attach,
        .tuner_attach     = dibusb_tuner_probe_and_attach,
 
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = dibusb_rc_keys,
-       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
-       .rc_query         = dibusb_rc_query,
-
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -264,6 +265,19 @@ static struct dvb_usb_properties dibusb1_1_an2235_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               },
+       },
+       .power_ctrl       = dibusb_power_ctrl,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = dibusb_rc_keys,
+       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
+       .rc_query         = dibusb_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
 #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
        .num_device_descs = 2,
@@ -285,34 +299,27 @@ static struct dvb_usb_properties dibusb1_1_an2235_properties = {
        }
 };
 
-static struct dvb_usb_properties dibusb2_0b_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 16,
+static struct dvb_usb_device_properties dibusb2_0b_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
 
        .firmware = "dvb-usb-adstech-usb2-02.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 16,
 
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb2_0_power_ctrl,
        .frontend_attach  = dibusb_dib3000mb_frontend_attach,
        .tuner_attach     = dibusb_thomson_tuner_attach,
-
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = dibusb_rc_keys,
-       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
-       .rc_query         = dibusb_rc_query,
-
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x06,
                .u = {
@@ -321,6 +328,19 @@ static struct dvb_usb_properties dibusb2_0b_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+       .power_ctrl       = dibusb2_0_power_ctrl,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = dibusb_rc_keys,
+       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
+       .rc_query         = dibusb_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 2,
        .devices = {
@@ -336,34 +356,27 @@ static struct dvb_usb_properties dibusb2_0b_properties = {
        }
 };
 
-static struct dvb_usb_properties artec_t1_usb2_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 16,
+static struct dvb_usb_device_properties artec_t1_usb2_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
 
        .firmware = "dvb-usb-dibusb-6.0.0.8.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 16,
 
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb2_0_power_ctrl,
        .frontend_attach  = dibusb_dib3000mb_frontend_attach,
        .tuner_attach     = dibusb_tuner_probe_and_attach,
-
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = dibusb_rc_keys,
-       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
-       .rc_query         = dibusb_rc_query,
-
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x06,
                .u = {
@@ -372,6 +385,19 @@ static struct dvb_usb_properties artec_t1_usb2_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+       .power_ctrl       = dibusb2_0_power_ctrl,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = dibusb_rc_keys,
+       .rc_key_map_size  = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
+       .rc_query         = dibusb_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
index eca4082a61ae4920b0e49b045b4d55ab21f6e837..a0fd37efc04b0706a92c7bc192e00571d65528d6 100644 (file)
@@ -15,7 +15,7 @@
 #include "dibusb.h"
 
 /* USB Driver stuff */
-static struct dvb_usb_properties dibusb_mc_properties;
+static struct dvb_usb_device_properties dibusb_mc_properties;
 
 static int dibusb_mc_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -43,33 +43,26 @@ static struct usb_device_id dibusb_dib3000mc_table [] = {
 };
 MODULE_DEVICE_TABLE (usb, dibusb_dib3000mc_table);
 
-static struct dvb_usb_properties dibusb_mc_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 32,
+static struct dvb_usb_device_properties dibusb_mc_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-dibusb-6.0.0.8.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
-
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 32,
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb2_0_power_ctrl,
        .frontend_attach  = dibusb_dib3000mc_frontend_attach,
        .tuner_attach     = dibusb_dib3000mc_tuner_attach,
 
-       .rc_interval      = DEFAULT_RC_INTERVAL,
-       .rc_key_map       = dibusb_rc_keys,
-       .rc_key_map_size  = 111, /* FIXME */
-       .rc_query         = dibusb_rc_query,
-
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x06,
                .u = {
@@ -78,6 +71,19 @@ static struct dvb_usb_properties dibusb_mc_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+       .power_ctrl       = dibusb2_0_power_ctrl,
+
+       .rc_interval      = DEFAULT_RC_INTERVAL,
+       .rc_key_map       = dibusb_rc_keys,
+       .rc_key_map_size  = 111, /* FIXME */
+       .rc_query         = dibusb_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 7,
        .devices = {
index a43f87480cf608810a20c9c320a5f764770780e4..5153fb943da1fce0e429648acb495d644e2cba7c 100644 (file)
@@ -107,14 +107,15 @@ struct dibusb_state {
 
 extern struct i2c_algorithm dibusb_i2c_algo;
 
-extern int dibusb_dib3000mc_frontend_attach(struct dvb_usb_device *);
-extern int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *);
+extern int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *);
+extern int dibusb_dib3000mc_tuner_attach (struct dvb_usb_adapter *);
+
+extern int dibusb_streaming_ctrl(struct dvb_usb_adapter *, int);
+extern int dibusb_pid_filter(struct dvb_usb_adapter *, int, u16, int);
+extern int dibusb_pid_filter_ctrl(struct dvb_usb_adapter *, int);
+extern int dibusb2_0_streaming_ctrl(struct dvb_usb_adapter *, int);
 
-extern int dibusb_streaming_ctrl(struct dvb_usb_device *, int);
-extern int dibusb_pid_filter(struct dvb_usb_device *, int, u16, int);
-extern int dibusb_pid_filter_ctrl(struct dvb_usb_device *, int);
 extern int dibusb_power_ctrl(struct dvb_usb_device *, int);
-extern int dibusb2_0_streaming_ctrl(struct dvb_usb_device *, int);
 extern int dibusb2_0_power_ctrl(struct dvb_usb_device *, int);
 
 #define DEFAULT_RC_INTERVAL 150
index 015854487308b7b7f9c452dd429eb002d1350a3f..8fb34375c1fbeb1548c931de9b00cc419e88117d 100644 (file)
@@ -83,7 +83,7 @@ static struct i2c_algorithm digitv_i2c_algo = {
 
 /* Callbacks for DVB USB */
 static int digitv_identify_state (struct usb_device *udev, struct
-               dvb_usb_properties *props, struct dvb_usb_device_description **desc,
+               dvb_usb_device_properties *props, struct dvb_usb_device_description **desc,
                int *cold)
 {
        *cold = udev->descriptor.iManufacturer == 0 && udev->descriptor.iProduct == 0;
@@ -116,33 +116,33 @@ static struct mt352_config digitv_mt352_config = {
 
 static int digitv_nxt6000_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
        u8 b[5];
        dvb_usb_tuner_calc_regs(fe,fep,b, 5);
-       return digitv_ctrl_msg(d,USB_WRITE_TUNER,0,&b[1],4,NULL,0);
+       return digitv_ctrl_msg(adap->dev, USB_WRITE_TUNER, 0, &b[1], 4, NULL, 0);
 }
 
 static struct nxt6000_config digitv_nxt6000_config = {
        .clock_inversion = 1,
 };
 
-static int digitv_frontend_attach(struct dvb_usb_device *d)
+static int digitv_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       if ((d->fe = dvb_attach(mt352_attach, &digitv_mt352_config, &d->i2c_adap)) != NULL) {
-               d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
+       if ((adap->fe = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
+               adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
                return 0;
        }
-       if ((d->fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &d->i2c_adap)) != NULL) {
-               d->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
+       if ((adap->fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
+               adap->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
                return 0;
        }
        return -EIO;
 }
 
-static int digitv_tuner_attach(struct dvb_usb_device *d)
+static int digitv_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x60;
-       d->pll_desc = &dvb_pll_tded4;
+       adap->pll_addr = 0x60;
+       adap->pll_desc = &dvb_pll_tded4;
        return 0;
 }
 
@@ -238,7 +238,7 @@ static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 }
 
 /* DVB USB Driver stuff */
-static struct dvb_usb_properties digitv_properties;
+static struct dvb_usb_device_properties digitv_properties;
 
 static int digitv_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -265,30 +265,21 @@ static struct usb_device_id digitv_table [] = {
 };
 MODULE_DEVICE_TABLE (usb, digitv_table);
 
-static struct dvb_usb_properties digitv_properties = {
+static struct dvb_usb_device_properties digitv_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-digitv-02.fw",
 
-       .size_of_priv     = 0,
-
+       .num_adapters = 1,
+       .adapter = {
+               {
        .frontend_attach  = digitv_frontend_attach,
        .tuner_attach     = digitv_tuner_attach,
 
-       .rc_interval      = 1000,
-       .rc_key_map       = digitv_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(digitv_rc_keys),
-       .rc_query         = digitv_rc_query,
-
-       .identify_state   = digitv_identify_state,
-
-       .i2c_algo         = &digitv_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -297,6 +288,18 @@ static struct dvb_usb_properties digitv_properties = {
                        }
                }
        },
+               }
+       },
+       .identify_state   = digitv_identify_state,
+
+       .rc_interval      = 1000,
+       .rc_key_map       = digitv_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(digitv_rc_keys),
+       .rc_query         = digitv_rc_query,
+
+       .i2c_algo         = &digitv_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
index 27af4e43647936fe72a6db60704fcb5eaa804068..fa43a41d753b6a8b1e99b9e7512aaf83141699f8 100644 (file)
@@ -28,19 +28,19 @@ static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff)
        return 0;
 }
 
-static int dtt200u_streaming_ctrl(struct dvb_usb_device *d, int onoff)
+static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
        u8 b_streaming[2] = { SET_STREAMING, onoff };
        u8 b_rst_pid = RESET_PID_FILTER;
 
-       dvb_usb_generic_write(d,b_streaming,2);
+       dvb_usb_generic_write(adap->dev, b_streaming, 2);
 
        if (onoff == 0)
-               dvb_usb_generic_write(d,&b_rst_pid,1);
+               dvb_usb_generic_write(adap->dev, &b_rst_pid, 1);
        return 0;
 }
 
-static int dtt200u_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff)
+static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
 {
        u8 b_pid[4];
        pid = onoff ? pid : 0;
@@ -50,7 +50,7 @@ static int dtt200u_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int
        b_pid[2] = pid & 0xff;
        b_pid[3] = (pid >> 8) & 0x1f;
 
-       return dvb_usb_generic_write(d,b_pid,4);
+       return dvb_usb_generic_write(adap->dev, b_pid, 4);
 }
 
 /* remote control */
@@ -86,16 +86,16 @@ static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
        return 0;
 }
 
-static int dtt200u_frontend_attach(struct dvb_usb_device *d)
+static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       d->fe = dtt200u_fe_attach(d);
+       adap->fe = dtt200u_fe_attach(adap->dev);
        return 0;
 }
 
-static struct dvb_usb_properties dtt200u_properties;
-static struct dvb_usb_properties wt220u_fc_properties;
-static struct dvb_usb_properties wt220u_properties;
-static struct dvb_usb_properties wt220u_zl0353_properties;
+static struct dvb_usb_device_properties dtt200u_properties;
+static struct dvb_usb_device_properties wt220u_fc_properties;
+static struct dvb_usb_device_properties wt220u_properties;
+static struct dvb_usb_device_properties wt220u_zl0353_properties;
 
 static int dtt200u_usb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -123,28 +123,22 @@ static struct usb_device_id dtt200u_usb_table [] = {
 };
 MODULE_DEVICE_TABLE(usb, dtt200u_usb_table);
 
-static struct dvb_usb_properties dtt200u_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
-       .pid_filter_count = 15,
-
+static struct dvb_usb_device_properties dtt200u_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-dtt200u-01.fw",
 
-       .power_ctrl      = dtt200u_power_ctrl,
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
+                       .pid_filter_count = 15,
+
        .streaming_ctrl  = dtt200u_streaming_ctrl,
        .pid_filter      = dtt200u_pid_filter,
        .frontend_attach = dtt200u_frontend_attach,
-
-       .rc_interval     = 300,
-       .rc_key_map      = dtt200u_rc_keys,
-       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
-       .rc_query        = dtt200u_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
-
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -153,6 +147,16 @@ static struct dvb_usb_properties dtt200u_properties = {
                        }
                }
        },
+               }
+       },
+       .power_ctrl      = dtt200u_power_ctrl,
+
+       .rc_interval     = 300,
+       .rc_key_map      = dtt200u_rc_keys,
+       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
+       .rc_query        = dtt200u_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
@@ -164,28 +168,22 @@ static struct dvb_usb_properties dtt200u_properties = {
        }
 };
 
-static struct dvb_usb_properties wt220u_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
-       .pid_filter_count = 15,
-
+static struct dvb_usb_device_properties wt220u_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-wt220u-02.fw",
 
-       .power_ctrl      = dtt200u_power_ctrl,
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
+                       .pid_filter_count = 15,
+
        .streaming_ctrl  = dtt200u_streaming_ctrl,
        .pid_filter      = dtt200u_pid_filter,
        .frontend_attach = dtt200u_frontend_attach,
-
-       .rc_interval     = 300,
-       .rc_key_map      = dtt200u_rc_keys,
-       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
-       .rc_query        = dtt200u_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
-
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -194,6 +192,16 @@ static struct dvb_usb_properties wt220u_properties = {
                        }
                }
        },
+               }
+       },
+       .power_ctrl      = dtt200u_power_ctrl,
+
+       .rc_interval     = 300,
+       .rc_key_map      = dtt200u_rc_keys,
+       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
+       .rc_query        = dtt200u_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
@@ -205,36 +213,40 @@ static struct dvb_usb_properties wt220u_properties = {
        }
 };
 
-static struct dvb_usb_properties wt220u_fc_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
-       .pid_filter_count = 15,
-
+static struct dvb_usb_device_properties wt220u_fc_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-wt220u-fc03.fw",
 
-       .power_ctrl      = dtt200u_power_ctrl,
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
+                       .pid_filter_count = 15,
+
        .streaming_ctrl  = dtt200u_streaming_ctrl,
        .pid_filter      = dtt200u_pid_filter,
        .frontend_attach = dtt200u_frontend_attach,
-
-       .rc_interval     = 300,
-       .rc_key_map      = dtt200u_rc_keys,
-       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
-       .rc_query        = dtt200u_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
-
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
-               .endpoint = 0x86,
+                               .endpoint = 0x06,
                .u = {
                        .bulk = {
                                .buffersize = 4096,
                        }
                }
        },
+               }
+       },
+       .power_ctrl      = dtt200u_power_ctrl,
+
+       .rc_interval     = 300,
+       .rc_key_map      = dtt200u_rc_keys,
+       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
+       .rc_query        = dtt200u_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
@@ -246,28 +258,22 @@ static struct dvb_usb_properties wt220u_fc_properties = {
        }
 };
 
-static struct dvb_usb_properties wt220u_zl0353_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
-       .pid_filter_count = 15,
-
+static struct dvb_usb_device_properties wt220u_zl0353_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-wt220u-zl0353-01.fw",
 
-       .power_ctrl      = dtt200u_power_ctrl,
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
+                       .pid_filter_count = 15,
+
        .streaming_ctrl  = dtt200u_streaming_ctrl,
        .pid_filter      = dtt200u_pid_filter,
        .frontend_attach = dtt200u_frontend_attach,
-
-       .rc_interval     = 300,
-       .rc_key_map      = dtt200u_rc_keys,
-       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
-       .rc_query        = dtt200u_rc_query,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
-
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -276,6 +282,16 @@ static struct dvb_usb_properties wt220u_zl0353_properties = {
                        }
                }
        },
+               }
+       },
+       .power_ctrl      = dtt200u_power_ctrl,
+
+       .rc_interval     = 300,
+       .rc_key_map      = dtt200u_rc_keys,
+       .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
+       .rc_query        = dtt200u_rc_query,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
index a3460bf2d9fa56eb1ab4495678a51ede6b0d4b63..35ab68f6dcf6346e5748e775c95a722c478295e5 100644 (file)
 extern int dvb_usb_debug;
 extern int dvb_usb_disable_rc_polling;
 
-#define deb_info(args...) dprintk(dvb_usb_debug,0x01,args)
-#define deb_xfer(args...) dprintk(dvb_usb_debug,0x02,args)
-#define deb_pll(args...)  dprintk(dvb_usb_debug,0x04,args)
-#define deb_ts(args...)   dprintk(dvb_usb_debug,0x08,args)
-#define deb_err(args...)  dprintk(dvb_usb_debug,0x10,args)
-#define deb_rc(args...)   dprintk(dvb_usb_debug,0x20,args)
-#define deb_fw(args...)   dprintk(dvb_usb_debug,0x40,args)
-#define deb_mem(args...)  dprintk(dvb_usb_debug,0x80,args)
+#define deb_info(args...)  dprintk(dvb_usb_debug,0x001,args)
+#define deb_xfer(args...)  dprintk(dvb_usb_debug,0x002,args)
+#define deb_pll(args...)   dprintk(dvb_usb_debug,0x004,args)
+#define deb_ts(args...)    dprintk(dvb_usb_debug,0x008,args)
+#define deb_err(args...)   dprintk(dvb_usb_debug,0x010,args)
+#define deb_rc(args...)    dprintk(dvb_usb_debug,0x020,args)
+#define deb_fw(args...)    dprintk(dvb_usb_debug,0x040,args)
+#define deb_mem(args...)   dprintk(dvb_usb_debug,0x080,args)
+#define deb_uxfer(args...) dprintk(dvb_usb_debug,0x100,args)
 
 /* commonly used  methods */
-extern int dvb_usb_download_firmware(struct usb_device *, struct dvb_usb_properties *);
+extern int dvb_usb_download_firmware(struct usb_device *, struct dvb_usb_device_properties *);
 
-extern int dvb_usb_urb_submit(struct dvb_usb_device *);
-extern int dvb_usb_urb_kill(struct dvb_usb_device *);
-extern int dvb_usb_urb_init(struct dvb_usb_device *);
-extern int dvb_usb_urb_exit(struct dvb_usb_device *);
+extern int dvb_usb_device_power_ctrl(struct dvb_usb_device *d, int onoff);
+
+extern int usb_urb_init(struct usb_data_stream *stream, struct usb_data_stream_properties *props);
+extern int usb_urb_exit(struct usb_data_stream *stream);
+extern int usb_urb_submit(struct usb_data_stream *stream);
+extern int usb_urb_kill(struct usb_data_stream *stream);
+
+extern int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap);
+extern int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap);
 
 extern int dvb_usb_i2c_init(struct dvb_usb_device *);
 extern int dvb_usb_i2c_exit(struct dvb_usb_device *);
 
-extern int dvb_usb_dvb_init(struct dvb_usb_device *);
-extern int dvb_usb_dvb_exit(struct dvb_usb_device *);
-
-extern int dvb_usb_fe_init(struct dvb_usb_device *);
-extern int dvb_usb_fe_exit(struct dvb_usb_device *);
+extern int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap);
+extern int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap);
+extern int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap);
+extern int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap);
 
 extern int dvb_usb_remote_init(struct dvb_usb_device *);
 extern int dvb_usb_remote_exit(struct dvb_usb_device *);
index fe6208ada9037c916ffdb62c594bbe1a9f3b7dd6..4561a672da924c70ab9ba121c056b4591b1f55e4 100644 (file)
@@ -1,6 +1,6 @@
 /* dvb-usb-dvb.c is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
  * This file contains functions for initializing and handling the
@@ -8,55 +8,55 @@
  */
 #include "dvb-usb-common.h"
 
+/* does the complete input transfer handling */
 static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
 {
-       struct dvb_usb_device *d = dvbdmxfeed->demux->priv;
+       struct dvb_usb_adapter *adap = dvbdmxfeed->demux->priv;
        int newfeedcount,ret;
 
-       if (d == NULL)
+       if (adap == NULL)
                return -ENODEV;
 
-       newfeedcount = d->feedcount + (onoff ? 1 : -1);
+       newfeedcount = adap->feedcount + (onoff ? 1 : -1);
 
-       /*
-        * stop feed before setting a new pid if there will be no pid anymore
-        */
+       /* stop feed before setting a new pid if there will be no pid anymore */
        if (newfeedcount == 0) {
                deb_ts("stop feeding\n");
-               dvb_usb_urb_kill(d);
+               usb_urb_kill(&adap->stream);
 
-               if (d->props.streaming_ctrl != NULL)
-                       if ((ret = d->props.streaming_ctrl(d,0)))
+               if (adap->props.streaming_ctrl != NULL)
+                       if ((ret = adap->props.streaming_ctrl(adap,0)))
                                err("error while stopping stream.");
-
        }
 
-       d->feedcount = newfeedcount;
+       adap->feedcount = newfeedcount;
 
        /* activate the pid on the device specific pid_filter */
-       deb_ts("setting pid: %5d %04x at index %d '%s'\n",dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ? "on" : "off");
-       if (d->props.caps & DVB_USB_HAS_PID_FILTER &&
-               d->pid_filtering &&
-               d->props.pid_filter != NULL)
-               d->props.pid_filter(d,dvbdmxfeed->index,dvbdmxfeed->pid,onoff);
+       deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->pid_filtering ?
+               "yes" : "no", dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ?
+               "on" : "off");
+       if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER &&
+               adap->pid_filtering &&
+               adap->props.pid_filter != NULL)
+               adap->props.pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid,onoff);
 
        /* start the feed if this was the first feed and there is still a feed
         * for reception.
         */
-       if (d->feedcount == onoff && d->feedcount > 0) {
+       if (adap->feedcount == onoff && adap->feedcount > 0) {
                deb_ts("submitting all URBs\n");
-               dvb_usb_urb_submit(d);
+               usb_urb_submit(&adap->stream);
 
                deb_ts("controlling pid parser\n");
-               if (d->props.caps & DVB_USB_HAS_PID_FILTER &&
-                       d->props.caps & DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF &&
-                       d->props.pid_filter_ctrl != NULL)
-                       if (d->props.pid_filter_ctrl(d,d->pid_filtering) < 0)
+               if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER &&
+                       adap->props.caps & DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF &&
+                       adap->props.pid_filter_ctrl != NULL)
+                       if (adap->props.pid_filter_ctrl(adap,adap->pid_filtering) < 0)
                                err("could not handle pid_parser");
 
                deb_ts("start feeding\n");
-               if (d->props.streaming_ctrl != NULL)
-                       if (d->props.streaming_ctrl(d,1)) {
+               if (adap->props.streaming_ctrl != NULL)
+                       if (adap->props.streaming_ctrl(adap,1)) {
                                err("error while enabling fifo.");
                                return -ENODEV;
                        }
@@ -77,134 +77,130 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
        return dvb_usb_ctrl_feed(dvbdmxfeed,0);
 }
 
-int dvb_usb_dvb_init(struct dvb_usb_device *d)
+int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap)
 {
        int ret;
 
-       if ((ret = dvb_register_adapter(&d->dvb_adap, d->desc->name,
-                       d->owner, &d->udev->dev)) < 0) {
+       if ((ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name,
+                       adap->dev->owner, &adap->dev->udev->dev)) < 0) {
                deb_info("dvb_register_adapter failed: error %d", ret);
                goto err;
        }
-       d->dvb_adap.priv = d;
-
-       if (d->props.read_mac_address) {
-               if (d->props.read_mac_address(d,d->dvb_adap.proposed_mac) == 0)
-                       info("MAC address: %02x:%02x:%02x:%02x:%02x:%02x",d->dvb_adap.proposed_mac[0],
-                                       d->dvb_adap.proposed_mac[1],d->dvb_adap.proposed_mac[2],
-                                       d->dvb_adap.proposed_mac[3],d->dvb_adap.proposed_mac[4],
-                                       d->dvb_adap.proposed_mac[5]);
+       adap->dvb_adap.priv = adap;
+
+       if (adap->dev->props.read_mac_address) {
+               if (adap->dev->props.read_mac_address(adap->dev,adap->dvb_adap.proposed_mac) == 0)
+                       info("MAC address: %02x:%02x:%02x:%02x:%02x:%02x",adap->dvb_adap.proposed_mac[0],
+                                       adap->dvb_adap.proposed_mac[1], adap->dvb_adap.proposed_mac[2],
+                                       adap->dvb_adap.proposed_mac[3], adap->dvb_adap.proposed_mac[4],
+                                       adap->dvb_adap.proposed_mac[5]);
                else
                        err("MAC address reading failed.");
        }
 
 
-       d->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
-       d->demux.priv = d;
+       adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
+       adap->demux.priv             = adap;
 
-       d->demux.feednum = d->demux.filternum = d->max_feed_count;
-       d->demux.start_feed = dvb_usb_start_feed;
-       d->demux.stop_feed  = dvb_usb_stop_feed;
-       d->demux.write_to_decoder = NULL;
-       if ((ret = dvb_dmx_init(&d->demux)) < 0) {
+       adap->demux.feednum          = adap->demux.filternum = adap->max_feed_count;
+       adap->demux.start_feed       = dvb_usb_start_feed;
+       adap->demux.stop_feed        = dvb_usb_stop_feed;
+       adap->demux.write_to_decoder = NULL;
+       if ((ret = dvb_dmx_init(&adap->demux)) < 0) {
                err("dvb_dmx_init failed: error %d",ret);
                goto err_dmx;
        }
 
-       d->dmxdev.filternum = d->demux.filternum;
-       d->dmxdev.demux = &d->demux.dmx;
-       d->dmxdev.capabilities = 0;
-       if ((ret = dvb_dmxdev_init(&d->dmxdev, &d->dvb_adap)) < 0) {
+       adap->dmxdev.filternum       = adap->demux.filternum;
+       adap->dmxdev.demux           = &adap->demux.dmx;
+       adap->dmxdev.capabilities    = 0;
+       if ((ret = dvb_dmxdev_init(&adap->dmxdev, &adap->dvb_adap)) < 0) {
                err("dvb_dmxdev_init failed: error %d",ret);
                goto err_dmx_dev;
        }
 
-       dvb_net_init(&d->dvb_adap, &d->dvb_net, &d->demux.dmx);
+       dvb_net_init(&adap->dvb_adap, &adap->dvb_net, &adap->demux.dmx);
 
-       d->state |= DVB_USB_STATE_DVB;
+       adap->state |= DVB_USB_ADAP_STATE_DVB;
        return 0;
 
 err_dmx_dev:
-       dvb_dmx_release(&d->demux);
+       dvb_dmx_release(&adap->demux);
 err_dmx:
-       dvb_unregister_adapter(&d->dvb_adap);
+       dvb_unregister_adapter(&adap->dvb_adap);
 err:
        return ret;
 }
 
-int dvb_usb_dvb_exit(struct dvb_usb_device *d)
+int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap)
 {
-       if (d->state & DVB_USB_STATE_DVB) {
+       if (adap->state & DVB_USB_ADAP_STATE_DVB) {
                deb_info("unregistering DVB part\n");
-               dvb_net_release(&d->dvb_net);
-               d->demux.dmx.close(&d->demux.dmx);
-               dvb_dmxdev_release(&d->dmxdev);
-               dvb_dmx_release(&d->demux);
-               dvb_unregister_adapter(&d->dvb_adap);
-               d->state &= ~DVB_USB_STATE_DVB;
+               dvb_net_release(&adap->dvb_net);
+               adap->demux.dmx.close(&adap->demux.dmx);
+               dvb_dmxdev_release(&adap->dmxdev);
+               dvb_dmx_release(&adap->demux);
+               dvb_unregister_adapter(&adap->dvb_adap);
+               adap->state &= ~DVB_USB_ADAP_STATE_DVB;
        }
        return 0;
 }
 
 static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
 
-       if (d->props.power_ctrl)
-               d->props.power_ctrl(d,1);
+       dvb_usb_device_power_ctrl(adap->dev, 1);
 
-       if (d->fe_init)
-               d->fe_init(fe);
+       if (adap->fe_init)
+               adap->fe_init(fe);
 
        return 0;
 }
 
 static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
 
-       if (d->fe_sleep)
-               d->fe_sleep(fe);
+       if (adap->fe_sleep)
+               adap->fe_sleep(fe);
 
-       if (d->props.power_ctrl)
-               d->props.power_ctrl(d,0);
-
-       return 0;
+       return dvb_usb_device_power_ctrl(adap->dev, 0);
 }
 
-int dvb_usb_fe_init(struct dvb_usb_device* d)
+int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
 {
-       if (d->props.frontend_attach == NULL) {
-               err("strange: '%s' doesn't want to attach a frontend.",d->desc->name);
+       if (adap->props.frontend_attach == NULL) {
+               err("strange: '%s' #%d doesn't want to attach a frontend.",adap->dev->desc->name, adap->id);
                return 0;
        }
 
        /* re-assign sleep and wakeup functions */
-       if (d->props.frontend_attach(d) == 0 && d->fe != NULL) {
-               d->fe_init = d->fe->ops.init;   d->fe->ops.init  = dvb_usb_fe_wakeup;
-               d->fe_sleep = d->fe->ops.sleep; d->fe->ops.sleep = dvb_usb_fe_sleep;
+       if (adap->props.frontend_attach(adap) == 0 && adap->fe != NULL) {
+               adap->fe_init  = adap->fe->ops.init;  adap->fe->ops.init  = dvb_usb_fe_wakeup;
+               adap->fe_sleep = adap->fe->ops.sleep; adap->fe->ops.sleep = dvb_usb_fe_sleep;
 
-               if (dvb_register_frontend(&d->dvb_adap, d->fe)) {
+               if (dvb_register_frontend(&adap->dvb_adap, adap->fe)) {
                        err("Frontend registration failed.");
-                       dvb_frontend_detach(d->fe);
-                       d->fe = NULL;
+                       dvb_frontend_detach(adap->fe);
+                       adap->fe = NULL;
                        return -ENODEV;
                }
 
                /* only attach the tuner if the demod is there */
-               if (d->props.tuner_attach != NULL)
-                       d->props.tuner_attach(d);
+               if (adap->props.tuner_attach != NULL)
+                       adap->props.tuner_attach(adap);
        } else
-               err("no frontend was attached by '%s'",d->desc->name);
+               err("no frontend was attached by '%s'",adap->dev->desc->name);
 
        return 0;
 }
 
-int dvb_usb_fe_exit(struct dvb_usb_device *d)
+int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap)
 {
-       if (d->fe != NULL) {
-               dvb_unregister_frontend(d->fe);
-               dvb_frontend_detach(d->fe);
+       if (adap->fe != NULL) {
+               dvb_unregister_frontend(adap->fe);
+               dvb_frontend_detach(adap->fe);
        }
        return 0;
 }
index 9222b0a81f748646f82eda2ec382e16af1d2db7d..e1112e39fb638e4d9731510afd7a22667ba434ea 100644 (file)
@@ -1,6 +1,6 @@
 /* dvb-usb-firmware.c is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
  * This file contains functions for downloading the firmware to Cypress FX 1 and 2 based devices.
@@ -24,9 +24,6 @@ static struct usb_cypress_controller cypress[] = {
        { .id = CYPRESS_FX2,     .name = "Cypress FX2",     .cpu_cs_register = 0xe600 },
 };
 
-static int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx,
-                              int *pos);
-
 /*
  * load a firmware packet to the device
  */
@@ -78,7 +75,7 @@ int usb_cypress_load_firmware(struct usb_device *udev, const struct firmware *fw
 }
 EXPORT_SYMBOL(usb_cypress_load_firmware);
 
-int dvb_usb_download_firmware(struct usb_device *udev, struct dvb_usb_properties *props)
+int dvb_usb_download_firmware(struct usb_device *udev, struct dvb_usb_device_properties *props)
 {
        int ret;
        const struct firmware *fw = NULL;
@@ -115,7 +112,7 @@ int dvb_usb_download_firmware(struct usb_device *udev, struct dvb_usb_properties
        return ret;
 }
 
-static int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx,
+int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx,
                               int *pos)
 {
        u8 *b = (u8 *) &fw->data[*pos];
@@ -146,3 +143,4 @@ static int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx,
 
        return *pos;
 }
+EXPORT_SYMBOL(dvb_usb_get_hexline);
index 6b611a72509309d4c4eefd84f513687df785ee5e..55ba020386c97d32db99f288250c5d603a382789 100644 (file)
@@ -1,6 +1,6 @@
 /* dvb-usb-i2c.c is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
  * This file contains functions for (de-)initializing an I2C adapter.
@@ -48,48 +48,48 @@ int dvb_usb_i2c_exit(struct dvb_usb_device *d)
 
 int dvb_usb_tuner_init_i2c(struct dvb_frontend *fe)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
-       struct i2c_msg msg = { .addr = d->pll_addr, .flags = 0, .buf = d->pll_init, .len = 4 };
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+       struct i2c_msg msg = { .addr = adap->pll_addr, .flags = 0, .buf = adap->pll_init, .len = 4 };
        int ret = 0;
 
        /* if pll_desc is not used */
-       if (d->pll_desc == NULL)
+       if (adap->pll_desc == NULL)
                return 0;
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(fe,1,d->pll_addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(fe, 1, adap->pll_addr);
 
-       deb_pll("pll init: %x\n",d->pll_addr);
-       deb_pll("pll-buf: %x %x %x %x\n",d->pll_init[0],d->pll_init[1],
-                       d->pll_init[2],d->pll_init[3]);
+       deb_pll("pll init: %x\n",adap->pll_addr);
+       deb_pll("pll-buf: %x %x %x %x\n",adap->pll_init[0], adap->pll_init[1],
+                       adap->pll_init[2], adap->pll_init[3]);
 
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
-       if (i2c_transfer (&d->i2c_adap, &msg, 1) != 1) {
+       if (i2c_transfer (&adap->dev->i2c_adap, &msg, 1) != 1) {
                err("tuner i2c write failed for pll_init.");
                ret = -EREMOTEIO;
        }
        msleep(1);
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(fe,0,d->pll_addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(fe,0,adap->pll_addr);
        return ret;
 }
 EXPORT_SYMBOL(dvb_usb_tuner_init_i2c);
 
 int dvb_usb_tuner_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep, u8 *b, int buf_len)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
 
        if (buf_len != 5)
                return -EINVAL;
-       if (d->pll_desc == NULL)
+       if (adap->pll_desc == NULL)
                return 0;
 
-       deb_pll("pll addr: %x, freq: %d %p\n",d->pll_addr,fep->frequency,d->pll_desc);
+       deb_pll("pll addr: %x, freq: %d %p\n",adap->pll_addr, fep->frequency, adap->pll_desc);
 
-       b[0] = d->pll_addr;
-       dvb_pll_configure(d->pll_desc,&b[1],fep->frequency,fep->u.ofdm.bandwidth);
+       b[0] = adap->pll_addr;
+       dvb_pll_configure(adap->pll_desc, &b[1], fep->frequency, fep->u.ofdm.bandwidth);
 
        deb_pll("pll-buf: %x %x %x %x %x\n",b[0],b[1],b[2],b[3],b[4]);
 
@@ -99,26 +99,27 @@ EXPORT_SYMBOL(dvb_usb_tuner_calc_regs);
 
 int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
 {
-       struct dvb_usb_device *d = fe->dvb->priv;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
        int ret = 0;
        u8 b[5];
-       struct i2c_msg msg = { .addr = d->pll_addr, .flags = 0, .buf = &b[1], .len = 4 };
+       struct i2c_msg msg = { .addr = adap->pll_addr, .flags = 0, .buf = &b[1], .len = 4 };
 
        dvb_usb_tuner_calc_regs(fe,fep,b,5);
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(fe,1,d->pll_addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(fe, 1, adap->pll_addr);
 
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
-       if (i2c_transfer (&d->i2c_adap, &msg, 1) != 1) {
+
+       if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) {
                err("tuner i2c write failed for pll_set.");
                ret = -EREMOTEIO;
        }
        msleep(1);
 
-       if (d->tuner_pass_ctrl)
-               d->tuner_pass_ctrl(fe,0,d->pll_addr);
+       if (adap->tuner_pass_ctrl)
+               adap->tuner_pass_ctrl(fe, 0, adap->pll_addr);
 
        return ret;
 }
index 57a10de1d3dd113c986fd858d7b07d7707e72713..4d6b069536ce387575dacf11278f1d73c61862f9 100644 (file)
@@ -52,8 +52,7 @@
 #define USB_PID_DIBCOM_MOD3000_WARM                    0x0bb9
 #define USB_PID_DIBCOM_MOD3001_COLD                    0x0bc6
 #define USB_PID_DIBCOM_MOD3001_WARM                    0x0bc7
-#define USB_PID_DIBCOM_STK7700                         0x1e14
-#define USB_PID_DIBCOM_STK7700_REENUM                  0x1e15
+#define USB_PID_DIBCOM_STK7700P                                0x1e14
 #define USB_PID_DIBCOM_ANCHOR_2135_COLD                        0x2131
 #define USB_PID_GRANDTEC_DVBT_USB_COLD                 0x0fa0
 #define USB_PID_GRANDTEC_DVBT_USB_WARM                 0x0fa1
 #define USB_PID_WT220U_ZL0353_WARM                     0x022b
 #define USB_PID_WINTV_NOVA_T_USB2_COLD                 0x9300
 #define USB_PID_WINTV_NOVA_T_USB2_WARM                 0x9301
+#define USB_PID_HAUPPAUGE_NOVA_T_500                   0x9941
+#define USB_PID_HAUPPAUGE_NOVA_T_500_2                 0x9950
+#define USB_PID_HAUPPAUGE_NOVA_T_STICK                 0x7050
+#define USB_PID_AVERMEDIA_VOLAR                                0x1234
 #define USB_PID_NEBULA_DIGITV                          0x0201
 #define USB_PID_DVICO_BLUEBIRD_LGDT                    0xd820
 #define USB_PID_DVICO_BLUEBIRD_LG064F_COLD             0xd500
 #define USB_PID_DVICO_BLUEBIRD_LGZ201_WARM             0xdb01
 #define USB_PID_DVICO_BLUEBIRD_TH7579_COLD             0xdb10
 #define USB_PID_DVICO_BLUEBIRD_TH7579_WARM             0xdb11
-#define USB_PID_DVICO_BLUEBIRD_DEE1601_COLD            0xdb50
-#define USB_PID_DVICO_BLUEBIRD_DEE1601_WARM            0xdb51
-#define USB_PID_DIGITALNOW_BLUEBIRD_DEE1601_COLD       0xdb54
-#define USB_PID_DIGITALNOW_BLUEBIRD_DEE1601_WARM       0xdb55
+#define USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD             0xdb50
+#define USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM             0xdb51
+#define USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD             0xdb58
+#define USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM             0xdb59
+#define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD        0xdb54
+#define USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM        0xdb55
 #define USB_PID_MEDION_MD95700                         0x0932
 #define USB_PID_KYE_DVB_T_COLD                         0x701e
 #define USB_PID_KYE_DVB_T_WARM                         0x701f
index a1705ecb9a544ac8c99872daa9f658a0f4051815..ffdde83d1e77be6be34e5068f9a1b34adbdcd5e6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * dvb-usb-init.c
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  *
  *     This program is free software; you can redistribute it and/or modify it
  *     under the terms of the GNU General Public License as published by the Free
 /* debug */
 int dvb_usb_debug;
 module_param_named(debug,dvb_usb_debug, int, 0644);
-MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))." DVB_USB_DEBUG_STATUS);
+MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64,mem=128,uxfer=256  (or-able))." DVB_USB_DEBUG_STATUS);
 
 int dvb_usb_disable_rc_polling;
 module_param_named(disable_rc_polling, dvb_usb_disable_rc_polling, int, 0644);
 MODULE_PARM_DESC(disable_rc_polling, "disable remote control polling (default: 0).");
 
+static int dvb_usb_force_pid_filter_usage;
+module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444);
+MODULE_PARM_DESC(disable_rc_polling, "force all dvb-usb-devices to use a PID filter, if any (default: 0).");
+
+static int dvb_usb_adapter_init(struct dvb_usb_device *d)
+{
+       struct dvb_usb_adapter *adap;
+       int ret,n;
+
+       for (n = 0; n < d->props.num_adapters; n++) {
+               adap = &d->adapter[n];
+               adap->dev = d;
+               adap->id  = n;
+
+               memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties));
+
+/* speed - when running at FULL speed we need a HW PID filter */
+               if (d->udev->speed == USB_SPEED_FULL && !(adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER)) {
+                       err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
+                       return -ENODEV;
+               }
+
+               if ((d->udev->speed == USB_SPEED_FULL && adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) ||
+                       (adap->props.caps & DVB_USB_ADAP_NEED_PID_FILTERING)) {
+                       info("will use the device's hardware PID filter (table count: %d).",adap->props.pid_filter_count);
+                       adap->pid_filtering  = 1;
+                       adap->max_feed_count = adap->props.pid_filter_count;
+               } else {
+                       info("will pass the complete MPEG2 transport stream to the software demuxer.");
+                       adap->pid_filtering  = 0;
+                       adap->max_feed_count = 255;
+               }
+
+               if (!adap->pid_filtering &&
+                       dvb_usb_force_pid_filter_usage &&
+                       adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) {
+                       info("pid filter enabled by module option.");
+                       adap->pid_filtering  = 1;
+                       adap->max_feed_count = adap->props.pid_filter_count;
+               }
+
+               if (adap->props.size_of_priv > 0) {
+                       adap->priv = kzalloc(adap->props.size_of_priv,GFP_KERNEL);
+                       if (adap->priv == NULL) {
+                               err("no memory for priv for adapter %d.",n);
+                               return -ENOMEM;
+                       }
+               }
+
+               if ((ret = dvb_usb_adapter_stream_init(adap)) ||
+                       (ret = dvb_usb_adapter_dvb_init(adap)) ||
+                       (ret = dvb_usb_adapter_frontend_init(adap))) {
+                       return ret;
+               }
+
+               d->num_adapters_initialized++;
+               d->state |= DVB_USB_STATE_DVB;
+       }
+
+       /*
+        * when reloading the driver w/o replugging the device
+        * sometimes a timeout occures, this helps
+        */
+       if (d->props.generic_bulk_ctrl_endpoint != 0) {
+               usb_clear_halt(d->udev,usb_sndbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
+               usb_clear_halt(d->udev,usb_rcvbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
+       }
+
+       return 0;
+}
+
+static int dvb_usb_adapter_exit(struct dvb_usb_device *d)
+{
+       int n;
+       for (n = 0; n < d->num_adapters_initialized; n++) {
+               dvb_usb_adapter_frontend_exit(&d->adapter[n]);
+               dvb_usb_adapter_dvb_exit(&d->adapter[n]);
+               dvb_usb_adapter_stream_exit(&d->adapter[n]);
+               kfree(d->adapter[n].priv);
+       }
+       d->num_adapters_initialized = 0;
+       d->state &= ~DVB_USB_STATE_DVB;
+       return 0;
+}
+
+
 /* general initialization functions */
 static int dvb_usb_exit(struct dvb_usb_device *d)
 {
        deb_info("state before exiting everything: %x\n",d->state);
        dvb_usb_remote_exit(d);
-       dvb_usb_fe_exit(d);
+       dvb_usb_adapter_exit(d);
        dvb_usb_i2c_exit(d);
-       dvb_usb_dvb_exit(d);
-       dvb_usb_urb_exit(d);
        deb_info("state should be zero now: %x\n",d->state);
        d->state = DVB_USB_STATE_INIT;
        kfree(d->priv);
@@ -47,32 +131,19 @@ static int dvb_usb_init(struct dvb_usb_device *d)
 
        d->state = DVB_USB_STATE_INIT;
 
-/* check the capabilities and set appropriate variables */
-
-/* speed - when running at FULL speed we need a HW PID filter */
-       if (d->udev->speed == USB_SPEED_FULL && !(d->props.caps & DVB_USB_HAS_PID_FILTER)) {
-               err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
-               return -ENODEV;
-       }
-
-       if ((d->udev->speed == USB_SPEED_FULL && d->props.caps & DVB_USB_HAS_PID_FILTER) ||
-               (d->props.caps & DVB_USB_NEED_PID_FILTERING)) {
-               info("will use the device's hardware PID filter (table count: %d).",d->props.pid_filter_count);
-               d->pid_filtering = 1;
-               d->max_feed_count = d->props.pid_filter_count;
-       } else {
-               info("will pass the complete MPEG2 transport stream to the software demuxer.");
-               d->pid_filtering = 0;
-               d->max_feed_count = 255;
+       if (d->props.size_of_priv > 0) {
+               d->priv = kzalloc(d->props.size_of_priv,GFP_KERNEL);
+               if (d->priv == NULL) {
+                       err("no memory for priv in 'struct dvb_usb_device'");
+                       return -ENOMEM;
+               }
        }
 
-       if (d->props.power_ctrl)
-               d->props.power_ctrl(d,1);
+/* check the capabilities and set appropriate variables */
+       dvb_usb_device_power_ctrl(d, 1);
 
-       if ((ret = dvb_usb_urb_init(d)) ||
-               (ret = dvb_usb_dvb_init(d)) ||
-               (ret = dvb_usb_i2c_init(d)) ||
-               (ret = dvb_usb_fe_init(d))) {
+       if ((ret = dvb_usb_i2c_init(d)) ||
+               (ret = dvb_usb_adapter_init(d))) {
                dvb_usb_exit(d);
                return ret;
        }
@@ -80,14 +151,13 @@ static int dvb_usb_init(struct dvb_usb_device *d)
        if ((ret = dvb_usb_remote_init(d)))
                err("could not initialize remote control.");
 
-       if (d->props.power_ctrl)
-               d->props.power_ctrl(d,0);
+       dvb_usb_device_power_ctrl(d, 0);
 
        return 0;
 }
 
 /* determine the name and the state of the just found USB device */
-static struct dvb_usb_device_description * dvb_usb_find_device(struct usb_device *udev,struct dvb_usb_properties *props, int *cold)
+static struct dvb_usb_device_description * dvb_usb_find_device(struct usb_device *udev,struct dvb_usb_device_properties *props, int *cold)
 {
        int i,j;
        struct dvb_usb_device_description *desc = NULL;
@@ -125,11 +195,25 @@ static struct dvb_usb_device_description * dvb_usb_find_device(struct usb_device
        return desc;
 }
 
+int dvb_usb_device_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+       if (onoff)
+               d->powered++;
+       else
+               d->powered--;
+
+       if (d->powered == 0 || (onoff && d->powered == 1)) { // when switching from 1 to 0 or from 0 to 1
+               deb_info("power control: %d\n", onoff);
+               if (d->props.power_ctrl)
+                       return d->props.power_ctrl(d, onoff);
+       }
+       return 0;
+}
+
 /*
  * USB
  */
-
-int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties
+int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_device_properties
                *props, struct module *owner,struct dvb_usb_device **du)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
@@ -149,7 +233,7 @@ int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties
        if (cold) {
                info("found a '%s' in cold state, will try to load a firmware",desc->name);
                ret = dvb_usb_download_firmware(udev,props);
-               if (!props->no_reconnect)
+               if (!props->no_reconnect || ret != 0)
                        return ret;
        }
 
@@ -161,19 +245,10 @@ int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties
        }
 
        d->udev = udev;
-       memcpy(&d->props,props,sizeof(struct dvb_usb_properties));
+       memcpy(&d->props,props,sizeof(struct dvb_usb_device_properties));
        d->desc = desc;
        d->owner = owner;
 
-       if (d->props.size_of_priv > 0) {
-                       d->priv = kzalloc(d->props.size_of_priv,GFP_KERNEL);
-               if (d->priv == NULL) {
-                       err("no memory for priv in 'struct dvb_usb_device'");
-                       kfree(d);
-                       return -ENOMEM;
-               }
-       }
-
        usb_set_intfdata(intf, d);
 
        if (du != NULL)
@@ -204,7 +279,7 @@ void dvb_usb_device_exit(struct usb_interface *intf)
 }
 EXPORT_SYMBOL(dvb_usb_device_exit);
 
-MODULE_VERSION("0.3");
+MODULE_VERSION("1.0");
 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
 MODULE_DESCRIPTION("A library module containing commonly used USB and DVB function USB DVB devices");
 MODULE_LICENSE("GPL");
index 380b2a45ee4c2accc59d0b8af0da13e6dc980dc5..0a3a0b6c23509f8e80c95dae37d595bbd516d50e 100644 (file)
@@ -1,6 +1,6 @@
 /* dvb-usb-remote.c is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
  * This file contains functions for initializing the the input-device and for handling remote-control-queries.
index 88b283731bb8c84e1dcf7c4a90cc15b0604fd1c6..5cef12a07f72d8beae5757fe9b7596b7406721ad 100644 (file)
@@ -1,9 +1,9 @@
 /* dvb-usb-urb.c is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
- * This file contains functions for initializing and handling the
+ * This file keeps functions for initializing and handling the
  * USB and URB stuff.
  */
 #include "dvb-usb-common.h"
@@ -64,260 +64,32 @@ int dvb_usb_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len)
 }
 EXPORT_SYMBOL(dvb_usb_generic_write);
 
-
-/* URB stuff for streaming */
-static void dvb_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
-{
-       struct dvb_usb_device *d = urb->context;
-       int ptype = usb_pipetype(urb->pipe);
-       int i;
-       u8 *b;
-
-       deb_ts("'%s' urb completed. feedcount: %d, status: %d, length: %d/%d, pack_num: %d, errors: %d\n",
-                       ptype == PIPE_ISOCHRONOUS ? "isoc" : "bulk", d->feedcount,
-                       urb->status,urb->actual_length,urb->transfer_buffer_length,
-                       urb->number_of_packets,urb->error_count);
-
-       switch (urb->status) {
-               case 0:         /* success */
-                       break;
-               case -ECONNRESET:   /* kill */
-               case -ENOENT:
-               case -ESHUTDOWN:
-                       return;
-               default:        /* error */
-                       deb_ts("urb completition error %d.", urb->status);
-                       break;
-       }
-
-       if (d->feedcount > 0) {
-               if (d->state & DVB_USB_STATE_DVB) {
-                       switch (ptype) {
-                               case PIPE_ISOCHRONOUS:
-                                       b = (u8 *) urb->transfer_buffer;
-                                       for (i = 0; i < urb->number_of_packets; i++) {
-                                               if (urb->iso_frame_desc[i].status != 0)
-                                                       deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frame_desc[i].status);
-                                               else if (urb->iso_frame_desc[i].actual_length > 0) {
-                                                               dvb_dmx_swfilter(&d->demux,b + urb->iso_frame_desc[i].offset,
-                                                                               urb->iso_frame_desc[i].actual_length);
-                                                       }
-                                               urb->iso_frame_desc[i].status = 0;
-                                               urb->iso_frame_desc[i].actual_length = 0;
-                                       }
-                                       debug_dump(b,20,deb_ts);
-                                       break;
-                               case PIPE_BULK:
-                                       if (urb->actual_length > 0)
-                                               dvb_dmx_swfilter(&d->demux, (u8 *) urb->transfer_buffer,urb->actual_length);
-                                       break;
-                               default:
-                                       err("unkown endpoint type in completition handler.");
-                                       return;
-                       }
-               }
-       }
-
-       usb_submit_urb(urb,GFP_ATOMIC);
-}
-
-int dvb_usb_urb_kill(struct dvb_usb_device *d)
-{
-       int i;
-       for (i = 0; i < d->urbs_submitted; i++) {
-               deb_ts("killing URB no. %d.\n",i);
-
-               /* stop the URB */
-               usb_kill_urb(d->urb_list[i]);
-       }
-       d->urbs_submitted = 0;
-       return 0;
-}
-
-int dvb_usb_urb_submit(struct dvb_usb_device *d)
-{
-       int i,ret;
-       for (i = 0; i < d->urbs_initialized; i++) {
-               deb_ts("submitting URB no. %d\n",i);
-               if ((ret = usb_submit_urb(d->urb_list[i],GFP_ATOMIC))) {
-                       err("could not submit URB no. %d - get them all back",i);
-                       dvb_usb_urb_kill(d);
-                       return ret;
-               }
-               d->urbs_submitted++;
-       }
-       return 0;
-}
-
-static int dvb_usb_free_stream_buffers(struct dvb_usb_device *d)
-{
-       if (d->state & DVB_USB_STATE_URB_BUF) {
-               while (d->buf_num) {
-                       d->buf_num--;
-                       deb_mem("freeing buffer %d\n",d->buf_num);
-                       usb_buffer_free(d->udev, d->buf_size,
-                                       d->buf_list[d->buf_num], d->dma_addr[d->buf_num]);
-               }
-               kfree(d->buf_list);
-               kfree(d->dma_addr);
-       }
-
-       d->state &= ~DVB_USB_STATE_URB_BUF;
-
-       return 0;
-}
-
-static int dvb_usb_allocate_stream_buffers(struct dvb_usb_device *d, int num, unsigned long size)
-{
-       d->buf_num = 0;
-       d->buf_size = size;
-
-       deb_mem("all in all I will use %lu bytes for streaming\n",num*size);
-
-       if ((d->buf_list = kcalloc(num, sizeof(u8 *), GFP_ATOMIC)) == NULL)
-               return -ENOMEM;
-
-       if ((d->dma_addr = kcalloc(num, sizeof(dma_addr_t), GFP_ATOMIC)) == NULL) {
-               kfree(d->buf_list);
-               return -ENOMEM;
-       }
-
-       d->state |= DVB_USB_STATE_URB_BUF;
-
-       for (d->buf_num = 0; d->buf_num < num; d->buf_num++) {
-               deb_mem("allocating buffer %d\n",d->buf_num);
-               if (( d->buf_list[d->buf_num] =
-                                       usb_buffer_alloc(d->udev, size, SLAB_ATOMIC,
-                                       &d->dma_addr[d->buf_num]) ) == NULL) {
-                       deb_mem("not enough memory for urb-buffer allocation.\n");
-                       dvb_usb_free_stream_buffers(d);
-                       return -ENOMEM;
-               }
-               deb_mem("buffer %d: %p (dma: %llu)\n",
-                       d->buf_num, d->buf_list[d->buf_num],
-                       (unsigned long long)d->dma_addr[d->buf_num]);
-               memset(d->buf_list[d->buf_num],0,size);
-       }
-       deb_mem("allocation successful\n");
-
-       return 0;
-}
-
-static int dvb_usb_bulk_urb_init(struct dvb_usb_device *d)
+static void dvb_usb_data_complete(struct usb_data_stream *stream, u8 *buffer, size_t length)
 {
-       int i;
-
-       if ((i = dvb_usb_allocate_stream_buffers(d,d->props.urb.count,
-                                       d->props.urb.u.bulk.buffersize)) < 0)
-               return i;
-
-       /* allocate the URBs */
-       for (i = 0; i < d->props.urb.count; i++) {
-               if ((d->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL)
-                       return -ENOMEM;
-
-               usb_fill_bulk_urb( d->urb_list[i], d->udev,
-                               usb_rcvbulkpipe(d->udev,d->props.urb.endpoint),
-                               d->buf_list[i],
-                               d->props.urb.u.bulk.buffersize,
-                               dvb_usb_urb_complete, d);
-
-               d->urb_list[i]->transfer_flags = 0;
-               d->urbs_initialized++;
-       }
-       return 0;
+       struct dvb_usb_adapter *adap = stream->user_priv;
+       if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
+               dvb_dmx_swfilter(&adap->demux, buffer, length);
 }
 
-static int dvb_usb_isoc_urb_init(struct dvb_usb_device *d)
+static void dvb_usb_data_complete_204(struct usb_data_stream *stream, u8 *buffer, size_t length)
 {
-       int i,j;
-
-       if ((i = dvb_usb_allocate_stream_buffers(d,d->props.urb.count,
-                                       d->props.urb.u.isoc.framesize*d->props.urb.u.isoc.framesperurb)) < 0)
-               return i;
-
-       /* allocate the URBs */
-       for (i = 0; i < d->props.urb.count; i++) {
-               struct urb *urb;
-               int frame_offset = 0;
-               if ((d->urb_list[i] =
-                                       usb_alloc_urb(d->props.urb.u.isoc.framesperurb,GFP_ATOMIC)) == NULL)
-                       return -ENOMEM;
-
-               urb = d->urb_list[i];
-
-               urb->dev = d->udev;
-               urb->context = d;
-               urb->complete = dvb_usb_urb_complete;
-               urb->pipe = usb_rcvisocpipe(d->udev,d->props.urb.endpoint);
-               urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
-               urb->interval = d->props.urb.u.isoc.interval;
-               urb->number_of_packets = d->props.urb.u.isoc.framesperurb;
-               urb->transfer_buffer_length = d->buf_size;
-               urb->transfer_buffer = d->buf_list[i];
-               urb->transfer_dma = d->dma_addr[i];
-
-               for (j = 0; j < d->props.urb.u.isoc.framesperurb; j++) {
-                       urb->iso_frame_desc[j].offset = frame_offset;
-                       urb->iso_frame_desc[j].length = d->props.urb.u.isoc.framesize;
-                       frame_offset += d->props.urb.u.isoc.framesize;
-               }
-
-               d->urbs_initialized++;
-       }
-       return 0;
-
+       struct dvb_usb_adapter *adap = stream->user_priv;
+       if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
+               dvb_dmx_swfilter_204(&adap->demux, buffer, length);
 }
 
-int dvb_usb_urb_init(struct dvb_usb_device *d)
+int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
 {
-       /*
-        * when reloading the driver w/o replugging the device
-        * sometimes a timeout occures, this helps
-        */
-       if (d->props.generic_bulk_ctrl_endpoint != 0) {
-               usb_clear_halt(d->udev,usb_sndbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
-               usb_clear_halt(d->udev,usb_rcvbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
-       }
-       usb_clear_halt(d->udev,usb_rcvbulkpipe(d->udev,d->props.urb.endpoint));
-
-       /* allocate the array for the data transfer URBs */
-       d->urb_list = kzalloc(d->props.urb.count * sizeof(struct urb *),GFP_KERNEL);
-       if (d->urb_list == NULL)
-               return -ENOMEM;
-       d->state |= DVB_USB_STATE_URB_LIST;
-
-       switch (d->props.urb.type) {
-               case DVB_USB_BULK:
-                       return dvb_usb_bulk_urb_init(d);
-               case DVB_USB_ISOC:
-                       return dvb_usb_isoc_urb_init(d);
-               default:
-                       err("unkown URB-type for data transfer.");
-                       return -EINVAL;
-       }
+       adap->stream.udev      = adap->dev->udev;
+       if (adap->props.caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
+               adap->stream.complete = dvb_usb_data_complete_204;
+       else
+       adap->stream.complete  = dvb_usb_data_complete;
+       adap->stream.user_priv = adap;
+       return usb_urb_init(&adap->stream, &adap->props.stream);
 }
 
-int dvb_usb_urb_exit(struct dvb_usb_device *d)
+int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
 {
-       int i;
-
-       dvb_usb_urb_kill(d);
-
-       if (d->state & DVB_USB_STATE_URB_LIST) {
-               for (i = 0; i < d->urbs_initialized; i++) {
-                       if (d->urb_list[i] != NULL) {
-                               deb_mem("freeing URB no. %d.\n",i);
-                               /* free the URBs */
-                               usb_free_urb(d->urb_list[i]);
-                       }
-               }
-               d->urbs_initialized = 0;
-               /* free the urb array */
-               kfree(d->urb_list);
-               d->state &= ~DVB_USB_STATE_URB_LIST;
-       }
-
-       dvb_usb_free_stream_buffers(d);
-       return 0;
+       return usb_urb_exit(&adap->stream);
 }
index 97f8ea9624385ae828834209bcf2ee872ab2e66f..376c45a8e77991712260386717a22c12757930a6 100644 (file)
@@ -1,9 +1,11 @@
 /* dvb-usb.h is part of the DVB USB library.
  *
- * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  * see dvb-usb-init.c for copyright information.
  *
  * the headerfile, all dvb-usb-drivers have to include.
+ *
+ * TODO: clean-up the structures for unused fields and update the comments
  */
 #ifndef __DVB_USB_H__
 #define __DVB_USB_H__
@@ -84,36 +86,84 @@ struct dvb_usb_rc_key {
 };
 
 struct dvb_usb_device;
+struct dvb_usb_adapter;
+struct usb_data_stream;
+
+/**
+ * Properties of USB streaming - TODO this structure should be somewhere else
+ * describes the kind of USB transfer used for data-streaming.
+ *  (BULK or ISOC)
+ */
+struct usb_data_stream_properties {
+#define USB_BULK  1
+#define USB_ISOC  2
+       int type;
+       int count;
+       int endpoint;
+
+       union {
+               struct {
+                       int buffersize; /* per URB */
+               } bulk;
+               struct {
+                       int framesperurb;
+                       int framesize;
+                       int interval;
+               } isoc;
+       } u;
+};
 
 /**
- * struct dvb_usb_properties - properties of a dvb-usb-device
+ * struct dvb_usb_adapter_properties - properties of a dvb-usb-adapter.
+ *    A DVB-USB-Adapter is basically a dvb_adapter which is present on a USB-device.
  * @caps: capabilities of the DVB USB device.
  * @pid_filter_count: number of PID filter position in the optional hardware
  *  PID-filter.
- *
+ * @streaming_crtl: called to start and stop the MPEG2-TS streaming of the
+ *  device (not URB submitting/killing).
+ * @pid_filter_ctrl: called to en/disable the PID filter, if any.
+ * @pid_filter: called to set/unset a PID for filtering.
+ * @frontend_attach: called to attach the possible frontends (fill fe-field
+ *  of struct dvb_usb_device).
+ * @tuner_attach: called to attach the correct tuner and to fill pll_addr,
+ *  pll_desc and pll_init_buf of struct dvb_usb_device).
+ * @stream: configuration of the USB streaming
+ */
+struct dvb_usb_adapter_properties {
+#define DVB_USB_ADAP_HAS_PID_FILTER               0x01
+#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02
+#define DVB_USB_ADAP_NEED_PID_FILTERING           0x04
+#define DVB_USB_ADAP_RECEIVES_204_BYTE_TS         0x08
+       int caps;
+       int pid_filter_count;
+
+       int (*streaming_ctrl)  (struct dvb_usb_adapter *, int);
+       int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int);
+       int (*pid_filter)      (struct dvb_usb_adapter *, int, u16, int);
+
+       int (*frontend_attach) (struct dvb_usb_adapter *);
+       int (*tuner_attach)    (struct dvb_usb_adapter *);
+
+       struct usb_data_stream_properties stream;
+
+       int size_of_priv;
+};
+
+/**
+ * struct dvb_usb_device_properties - properties of a dvb-usb-device
  * @usb_ctrl: which USB device-side controller is in use. Needed for firmware
  *  download.
  * @firmware: name of the firmware file.
  * @download_firmware: called to download the firmware when the usb_ctrl is
  *  DEVICE_SPECIFIC.
  * @no_reconnect: device doesn't do a reconnect after downloading the firmware,
   so do the warm initialization right after it
-
*  so do the warm initialization right after it
+ *
  * @size_of_priv: how many bytes shall be allocated for the private field
  *  of struct dvb_usb_device.
  *
  * @power_ctrl: called to enable/disable power of the device.
- * @streaming_crtl: called to start and stop the MPEG2-TS streaming of the
- *  device (not URB submitting/killing).
- * @pid_filter_ctrl: called to en/disable the PID filter, if any.
- * @pid_filter: called to set/unset a PID for filtering.
- *
  * @read_mac_address: called to read the MAC address of the device.
- *
- * @frontend_attach: called to attach the possible frontends (fill fe-field
- *  of struct dvb_usb_device).
- * @tuner_attach: called to attach the correct tuner and to fill pll_addr,
- *  pll_desc and pll_init_buf of struct dvb_usb_device).
  * @identify_state: called to determine the state (cold or warm), when it
  *  is not distinguishable by the USB IDs.
  *
@@ -130,50 +180,40 @@ struct dvb_usb_device;
  *  is non-zero, one can use dvb_usb_generic_rw and dvb_usb_generic_write-
  *  helper functions.
  *
- * @urb: describes the kind of USB transfer used for MPEG2-TS-streaming.
- *  (BULK or ISOC)
- *
  * @num_device_descs: number of struct dvb_usb_device_description in @devices
  * @devices: array of struct dvb_usb_device_description compatibles with these
  *  properties.
  */
-struct dvb_usb_properties {
+#define MAX_NO_OF_ADAPTER_PER_DEVICE 2
+struct dvb_usb_device_properties {
 
-#define DVB_USB_HAS_PID_FILTER               0x01
-#define DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF 0x02
-#define DVB_USB_NEED_PID_FILTERING           0x04
-#define DVB_USB_IS_AN_I2C_ADAPTER            0x08
+#define DVB_USB_IS_AN_I2C_ADAPTER            0x01
        int caps;
-       int pid_filter_count;
 
 #define DEVICE_SPECIFIC 0
 #define CYPRESS_AN2135  1
 #define CYPRESS_AN2235  2
 #define CYPRESS_FX2     3
-       int usb_ctrl;
+       int        usb_ctrl;
+       int        (*download_firmware) (struct usb_device *, const struct firmware *);
        const char firmware[FIRMWARE_NAME_MAX];
-       int (*download_firmware) (struct usb_device *, const struct firmware *);
-       int no_reconnect;
+       int        no_reconnect;
 
        int size_of_priv;
 
-       int (*power_ctrl) (struct dvb_usb_device *, int);
-       int (*streaming_ctrl) (struct dvb_usb_device *, int);
-       int (*pid_filter_ctrl) (struct dvb_usb_device *, int);
-       int (*pid_filter) (struct dvb_usb_device *, int, u16, int);
+       int num_adapters;
+       struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
 
+       int (*power_ctrl)       (struct dvb_usb_device *, int);
        int (*read_mac_address) (struct dvb_usb_device *, u8 []);
-       int (*frontend_attach) (struct dvb_usb_device *);
-       int (*tuner_attach) (struct dvb_usb_device *);
-
-       int (*identify_state) (struct usb_device *, struct dvb_usb_properties *,
+       int (*identify_state)   (struct usb_device *, struct dvb_usb_device_properties *,
                        struct dvb_usb_device_description **, int *);
 
 /* remote control properties */
 #define REMOTE_NO_KEY_PRESSED      0x00
 #define REMOTE_KEY_PRESSED         0x01
 #define REMOTE_KEY_REPEAT          0x02
-       struct dvb_usb_rc_key *rc_key_map;
+       struct dvb_usb_rc_key  *rc_key_map;
        int rc_key_map_size;
        int (*rc_query) (struct dvb_usb_device *, u32 *, int *);
        int rc_interval;
@@ -182,40 +222,12 @@ struct dvb_usb_properties {
 
        int generic_bulk_ctrl_endpoint;
 
-       struct {
-#define DVB_USB_BULK  1
-#define DVB_USB_ISOC  2
-               int type;
-               int count;
-               int endpoint;
-
-               union {
-                       struct {
-                               int buffersize; /* per URB */
-                       } bulk;
-                       struct {
-                               int framesperurb;
-                               int framesize;
-                               int interval;
-                       } isoc;
-               } u;
-       } urb;
-
        int num_device_descs;
        struct dvb_usb_device_description devices[9];
 };
 
-
 /**
- * struct dvb_usb_device - object of a DVB USB device
- * @props: copy of the struct dvb_usb_properties this device belongs to.
- * @desc: pointer to the device's struct dvb_usb_device_description.
- * @state: initialization and runtime state of the device.
- *
- * @udev: pointer to the device's struct usb_device.
- * @urb_list: array of dynamically allocated struct urb for the MPEG2-TS-
- *  streaming.
- *
+ * struct usb_data_stream - generic object of an USB stream
  * @buf_num: number of buffer allocated.
  * @buf_size: size of each buffer in buf_list.
  * @buf_list: array containing all allocate buffers for streaming.
@@ -223,18 +235,40 @@ struct dvb_usb_properties {
  *
  * @urbs_initialized: number of URBs initialized.
  * @urbs_submitted: number of URBs submitted.
+ */
+#define MAX_NO_URBS_FOR_DATA_STREAM 10
+struct usb_data_stream {
+       struct usb_device                 *udev;
+       struct usb_data_stream_properties  props;
+
+#define USB_STATE_INIT    0x00
+#define USB_STATE_URB_BUF 0x01
+       int state;
+
+       void (*complete) (struct usb_data_stream *, u8 *, size_t);
+
+       struct urb    *urb_list[MAX_NO_URBS_FOR_DATA_STREAM];
+       int            buf_num;
+       unsigned long  buf_size;
+       u8            *buf_list[MAX_NO_URBS_FOR_DATA_STREAM];
+       dma_addr_t     dma_addr[MAX_NO_URBS_FOR_DATA_STREAM];
+
+       int urbs_initialized;
+       int urbs_submitted;
+
+       void *user_priv;
+};
+
+/**
+ * struct dvb_usb_adapter - a DVB adapter on a USB device
+ * @id: index of this adapter (starting with 0).
  *
  * @feedcount: number of reqested feeds (used for streaming-activation)
  * @pid_filtering: is hardware pid_filtering used or not.
  *
- * @usb_mutex: semaphore of USB control messages (reading needs two messages)
- * @i2c_mutex: semaphore for i2c-transfers
- *
- * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB
  * @pll_addr: I2C address of the tuner for programming
  * @pll_init: array containing the initialization buffer
  * @pll_desc: pointer to the appropriate struct dvb_pll_desc
- *
  * @tuner_pass_ctrl: called to (de)activate tuner passthru of the demod or the board
  *
  * @dvb_adap: device's dvb_adapter.
@@ -244,8 +278,62 @@ struct dvb_usb_properties {
  * @dvb_frontend: device's frontend.
  * @max_feed_count: how many feeds can be handled simultaneously by this
  *  device
+ *
+ * @fe_init:  rerouted frontend-init (wakeup) function.
  * @fe_sleep: rerouted frontend-sleep function.
- * @fe_init: rerouted frontend-init (wakeup) function.
+ *
+ * @stream: the usb data stream.
+ */
+struct dvb_usb_adapter {
+       struct dvb_usb_device *dev;
+       struct dvb_usb_adapter_properties props;
+
+#define DVB_USB_ADAP_STATE_INIT 0x000
+#define DVB_USB_ADAP_STATE_DVB  0x001
+       int state;
+
+       u8  id;
+
+       int feedcount;
+       int pid_filtering;
+
+       /* tuner programming information */
+       u8 pll_addr;
+       u8 pll_init[4];
+       struct dvb_pll_desc *pll_desc;
+       int (*tuner_pass_ctrl) (struct dvb_frontend *, int, u8);
+
+       /* dvb */
+       struct dvb_adapter   dvb_adap;
+       struct dmxdev        dmxdev;
+       struct dvb_demux     demux;
+       struct dvb_net       dvb_net;
+       struct dvb_frontend *fe;
+       int                  max_feed_count;
+
+       int (*fe_init)  (struct dvb_frontend *);
+       int (*fe_sleep) (struct dvb_frontend *);
+
+       struct usb_data_stream stream;
+
+       void *priv;
+};
+
+/**
+ * struct dvb_usb_device - object of a DVB USB device
+ * @props: copy of the struct dvb_usb_properties this device belongs to.
+ * @desc: pointer to the device's struct dvb_usb_device_description.
+ * @state: initialization and runtime state of the device.
+ *
+ * @powered: indicated whether the device is power or not.
+ *  Powered is in/decremented for each call to modify the state.
+ * @udev: pointer to the device's struct usb_device.
+ *
+ * @usb_mutex: semaphore of USB control messages (reading needs two messages)
+ * @i2c_mutex: semaphore for i2c-transfers
+ *
+ * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB
+ *
  * @rc_input_dev: input device for the remote control.
  * @rc_query_work: struct work_struct frequent rc queries
  * @last_event: last triggered event
@@ -255,32 +343,18 @@ struct dvb_usb_properties {
  *  in size_of_priv of dvb_usb_properties).
  */
 struct dvb_usb_device {
-       struct dvb_usb_properties props;
+       struct dvb_usb_device_properties props;
        struct dvb_usb_device_description *desc;
 
-#define DVB_USB_STATE_INIT        0x000
-#define DVB_USB_STATE_URB_LIST    0x001
-#define DVB_USB_STATE_URB_BUF     0x002
-#define DVB_USB_STATE_DVB         0x004
-#define DVB_USB_STATE_I2C         0x008
-#define DVB_USB_STATE_REMOTE      0x010
-#define DVB_USB_STATE_URB_SUBMIT  0x020
-       int state;
-
-       /* usb */
        struct usb_device *udev;
-       struct urb **urb_list;
 
-       int buf_num;
-       unsigned long buf_size;
-       u8 **buf_list;
-       dma_addr_t *dma_addr;
-
-       int urbs_initialized;
-       int urbs_submitted;
+#define DVB_USB_STATE_INIT        0x000
+#define DVB_USB_STATE_I2C         0x001
+#define DVB_USB_STATE_DVB         0x002
+#define DVB_USB_STATE_REMOTE      0x004
+       int state;
 
-       int feedcount;
-       int pid_filtering;
+       int powered;
 
        /* locking */
        struct mutex usb_mutex;
@@ -289,22 +363,8 @@ struct dvb_usb_device {
        struct mutex i2c_mutex;
        struct i2c_adapter i2c_adap;
 
-       /* tuner programming information */
-       u8 pll_addr;
-       u8 pll_init[4];
-       struct dvb_pll_desc *pll_desc;
-       int (*tuner_pass_ctrl)(struct dvb_frontend *, int, u8);
-
-       /* dvb */
-       struct dvb_adapter dvb_adap;
-       struct dmxdev dmxdev;
-       struct dvb_demux demux;
-       struct dvb_net dvb_net;
-       struct dvb_frontend* fe;
-       int max_feed_count;
-
-       int (*fe_sleep) (struct dvb_frontend *);
-       int (*fe_init)  (struct dvb_frontend *);
+       int                    num_adapters_initialized;
+       struct dvb_usb_adapter adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
 
        /* remote control */
        struct input_dev *rc_input_dev;
@@ -318,7 +378,7 @@ struct dvb_usb_device {
        void *priv;
 };
 
-extern int dvb_usb_device_init(struct usb_interface *, struct dvb_usb_properties *, struct module *, struct dvb_usb_device **);
+extern int dvb_usb_device_init(struct usb_interface *, struct dvb_usb_device_properties *, struct module *, struct dvb_usb_device **);
 extern void dvb_usb_device_exit(struct usb_interface *);
 
 /* the generic read/write method for device control */
@@ -342,5 +402,7 @@ struct hexline {
        u8 chk;
 };
 extern int usb_cypress_load_firmware(struct usb_device *udev, const struct firmware *fw, int type);
+extern int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx, int *pos);
+
 
 #endif
index 9a98f3fdae318c98a019ce20497372ce3fb9d8e9..7375eb20166dfecb39497d5d91abf3f138c17eeb 100644 (file)
@@ -161,19 +161,18 @@ static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff)
 }
 
 
-static int gp8psk_streaming_ctrl(struct dvb_usb_device *d, int onoff)
+static int gp8psk_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
-       return gp8psk_usb_out_op(d, ARM_TRANSFER, onoff, 0 , NULL, 0);
+       return gp8psk_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0);
 }
 
-static int gp8psk_frontend_attach(struct dvb_usb_device *d)
+static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       d->fe = gp8psk_fe_attach(d);
-
+       adap->fe = gp8psk_fe_attach(adap->dev);
        return 0;
 }
 
-static struct dvb_usb_properties gp8psk_properties;
+static struct dvb_usb_device_properties gp8psk_properties;
 
 static int gp8psk_usb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -188,20 +187,18 @@ static struct usb_device_id gp8psk_usb_table [] = {
 };
 MODULE_DEVICE_TABLE(usb, gp8psk_usb_table);
 
-static struct dvb_usb_properties gp8psk_properties = {
-       .caps = 0,
-
+static struct dvb_usb_device_properties gp8psk_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-gp8psk-01.fw",
 
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = gp8psk_streaming_ctrl,
-       .power_ctrl       = gp8psk_power_ctrl,
        .frontend_attach  = gp8psk_frontend_attach,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x82,
                .u = {
@@ -210,6 +207,11 @@ static struct dvb_usb_properties gp8psk_properties = {
                        }
                }
        },
+               }
+       },
+       .power_ctrl       = gp8psk_power_ctrl,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
 
        .num_device_descs = 1,
        .devices = {
@@ -217,7 +219,7 @@ static struct dvb_usb_properties gp8psk_properties = {
                  .cold_ids = { &gp8psk_usb_table[0], NULL },
                  .warm_ids = { &gp8psk_usb_table[1], NULL },
                },
-               { 0 },
+               { NULL },
        }
 };
 
index 79f0a02ce98719742b3ad83791145c0041e2228d..a9219bf69b8927faf0da389c1dddddc06742ef7e 100644 (file)
@@ -135,7 +135,7 @@ static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])
 }
 
 /* USB Driver stuff */
-static struct dvb_usb_properties nova_t_properties;
+static struct dvb_usb_device_properties nova_t_properties;
 
 static int nova_t_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -151,34 +151,27 @@ static struct usb_device_id nova_t_table [] = {
 };
 MODULE_DEVICE_TABLE(usb, nova_t_table);
 
-static struct dvb_usb_properties nova_t_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_IS_AN_I2C_ADAPTER,
-       .pid_filter_count = 32,
+static struct dvb_usb_device_properties nova_t_properties = {
+       .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-nova-t-usb2-02.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
+       .num_adapters     = 1,
+       .adapter          = {
+               {
+                       .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+                       .pid_filter_count = 32,
 
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
        .pid_filter       = dibusb_pid_filter,
        .pid_filter_ctrl  = dibusb_pid_filter_ctrl,
-       .power_ctrl       = dibusb2_0_power_ctrl,
        .frontend_attach  = dibusb_dib3000mc_frontend_attach,
        .tuner_attach     = dibusb_dib3000mc_tuner_attach,
-       .read_mac_address = nova_t_read_mac_address,
-
-       .rc_interval      = 100,
-       .rc_key_map       = haupp_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(haupp_rc_keys),
-       .rc_query         = nova_t_rc_query,
 
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x06,
                .u = {
@@ -188,6 +181,22 @@ static struct dvb_usb_properties nova_t_properties = {
                }
        },
 
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+
+       .power_ctrl       = dibusb2_0_power_ctrl,
+       .read_mac_address = nova_t_read_mac_address,
+
+       .rc_interval      = 100,
+       .rc_key_map       = haupp_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(haupp_rc_keys),
+       .rc_query         = nova_t_rc_query,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
+
        .num_device_descs = 1,
        .devices = {
                {   "Hauppauge WinTV-NOVA-T usb2",
index 418a0b707151c9071f9833d6e52f49027bd1e20f..f9941ea88b3e5996de3d7ecbbc061fc0e44b3b5e 100644 (file)
@@ -50,7 +50,7 @@ static int umt_mt352_demod_init(struct dvb_frontend *fe)
        return 0;
 }
 
-static int umt_mt352_frontend_attach(struct dvb_usb_device *d)
+static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap)
 {
        struct mt352_config umt_config;
 
@@ -58,21 +58,21 @@ static int umt_mt352_frontend_attach(struct dvb_usb_device *d)
        umt_config.demod_init = umt_mt352_demod_init;
        umt_config.demod_address = 0xf;
 
-       d->fe = dvb_attach(mt352_attach, &umt_config, &d->i2c_adap);
+       adap->fe = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
 
        return 0;
 }
 
-static int umt_tuner_attach (struct dvb_usb_device *d)
+static int umt_tuner_attach (struct dvb_usb_adapter *adap)
 {
-       d->pll_addr = 0x61;
-       d->pll_desc = &dvb_pll_tua6034;
-       d->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
+       adap->pll_addr = 0x61;
+       adap->pll_desc = &dvb_pll_tua6034;
+       adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
        return 0;
 }
 
 /* USB Driver stuff */
-static struct dvb_usb_properties umt_properties;
+static struct dvb_usb_device_properties umt_properties;
 
 static int umt_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -90,25 +90,22 @@ static struct usb_device_id umt_table [] = {
 };
 MODULE_DEVICE_TABLE (usb, umt_table);
 
-static struct dvb_usb_properties umt_properties = {
+static struct dvb_usb_device_properties umt_properties = {
        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
 
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-umt-010-02.fw",
 
-       .size_of_priv     = sizeof(struct dibusb_state),
-
+       .num_adapters = 1,
+       .adapter = {
+               {
        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
-       .power_ctrl       = dibusb_power_ctrl,
        .frontend_attach  = umt_mt352_frontend_attach,
        .tuner_attach     = umt_tuner_attach,
 
-       .i2c_algo         = &dibusb_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 0x01,
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 20,
                .endpoint = 0x06,
                .u = {
@@ -118,6 +115,15 @@ static struct dvb_usb_properties umt_properties = {
                }
        },
 
+                       .size_of_priv     = sizeof(struct dibusb_state),
+               }
+       },
+       .power_ctrl       = dibusb_power_ctrl,
+
+       .i2c_algo         = &dibusb_i2c_algo,
+
+       .generic_bulk_ctrl_endpoint = 0x01,
+
        .num_device_descs = 1,
        .devices = {
                {       "Hanftek UMT-010 DVB-T USB2.0",
diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c
new file mode 100644 (file)
index 0000000..8728cf3
--- /dev/null
@@ -0,0 +1,242 @@
+/* usb-urb.c is part of the DVB USB library.
+ *
+ * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
+ * see dvb-usb-init.c for copyright information.
+ *
+ * This file keeps functions for initializing and handling the
+ * BULK and ISOC USB data transfers in a generic way.
+ * Can be used for DVB-only and also, that's the plan, for
+ * Hybrid USB devices (analog and DVB).
+ */
+#include "dvb-usb-common.h"
+
+/* URB stuff for streaming */
+static void usb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
+{
+       struct usb_data_stream *stream = urb->context;
+       int ptype = usb_pipetype(urb->pipe);
+       int i;
+       u8 *b;
+
+       deb_uxfer("'%s' urb completed. status: %d, length: %d/%d, pack_num: %d, errors: %d\n",
+               ptype == PIPE_ISOCHRONOUS ? "isoc" : "bulk",
+               urb->status,urb->actual_length,urb->transfer_buffer_length,
+               urb->number_of_packets,urb->error_count);
+
+       switch (urb->status) {
+               case 0:         /* success */
+               case -ETIMEDOUT:    /* NAK */
+                       break;
+               case -ECONNRESET:   /* kill */
+               case -ENOENT:
+               case -ESHUTDOWN:
+                       return;
+               default:        /* error */
+                       deb_ts("urb completition error %d.\n", urb->status);
+                       break;
+       }
+
+       b = (u8 *) urb->transfer_buffer;
+       switch (ptype) {
+               case PIPE_ISOCHRONOUS:
+                       for (i = 0; i < urb->number_of_packets; i++) {
+
+                               if (urb->iso_frame_desc[i].status != 0)
+                                       deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frame_desc[i].status);
+                               else if (urb->iso_frame_desc[i].actual_length > 0)
+                                       stream->complete(stream, b + urb->iso_frame_desc[i].offset, urb->iso_frame_desc[i].actual_length);
+
+                               urb->iso_frame_desc[i].status = 0;
+                               urb->iso_frame_desc[i].actual_length = 0;
+                       }
+                       debug_dump(b,20,deb_uxfer);
+                       break;
+               case PIPE_BULK:
+                       if (urb->actual_length > 0)
+                               stream->complete(stream, b, urb->actual_length);
+                       break;
+               default:
+                       err("unkown endpoint type in completition handler.");
+                       return;
+       }
+       usb_submit_urb(urb,GFP_ATOMIC);
+}
+
+int usb_urb_kill(struct usb_data_stream *stream)
+{
+       int i;
+       for (i = 0; i < stream->urbs_submitted; i++) {
+               deb_ts("killing URB no. %d.\n",i);
+
+               /* stop the URB */
+               usb_kill_urb(stream->urb_list[i]);
+       }
+       stream->urbs_submitted = 0;
+       return 0;
+}
+
+int usb_urb_submit(struct usb_data_stream *stream)
+{
+       int i,ret;
+       for (i = 0; i < stream->urbs_initialized; i++) {
+               deb_ts("submitting URB no. %d\n",i);
+               if ((ret = usb_submit_urb(stream->urb_list[i],GFP_ATOMIC))) {
+                       err("could not submit URB no. %d - get them all back",i);
+                       usb_urb_kill(stream);
+                       return ret;
+               }
+               stream->urbs_submitted++;
+       }
+       return 0;
+}
+
+static int usb_free_stream_buffers(struct usb_data_stream *stream)
+{
+       if (stream->state & USB_STATE_URB_BUF) {
+               while (stream->buf_num) {
+                       stream->buf_num--;
+                       deb_mem("freeing buffer %d\n",stream->buf_num);
+                       usb_buffer_free(stream->udev, stream->buf_size,
+                                       stream->buf_list[stream->buf_num], stream->dma_addr[stream->buf_num]);
+               }
+       }
+
+       stream->state &= ~USB_STATE_URB_BUF;
+
+       return 0;
+}
+
+static int usb_allocate_stream_buffers(struct usb_data_stream *stream, int num, unsigned long size)
+{
+       stream->buf_num = 0;
+       stream->buf_size = size;
+
+       deb_mem("all in all I will use %lu bytes for streaming\n",num*size);
+
+       for (stream->buf_num = 0; stream->buf_num < num; stream->buf_num++) {
+               deb_mem("allocating buffer %d\n",stream->buf_num);
+               if (( stream->buf_list[stream->buf_num] =
+                                       usb_buffer_alloc(stream->udev, size, SLAB_ATOMIC,
+                                       &stream->dma_addr[stream->buf_num]) ) == NULL) {
+                       deb_mem("not enough memory for urb-buffer allocation.\n");
+                       usb_free_stream_buffers(stream);
+                       return -ENOMEM;
+               }
+               deb_mem("buffer %d: %p (dma: %u)\n",
+                       stream->buf_num, stream->buf_list[stream->buf_num], stream->dma_addr[stream->buf_num]);
+               memset(stream->buf_list[stream->buf_num],0,size);
+               stream->state |= USB_STATE_URB_BUF;
+       }
+       deb_mem("allocation successful\n");
+
+       return 0;
+}
+
+static int usb_bulk_urb_init(struct usb_data_stream *stream)
+{
+       int i;
+
+       if ((i = usb_allocate_stream_buffers(stream,stream->props.count,
+                                       stream->props.u.bulk.buffersize)) < 0)
+               return i;
+
+       /* allocate the URBs */
+       for (i = 0; i < stream->props.count; i++) {
+               if ((stream->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL)
+                       return -ENOMEM;
+
+               usb_fill_bulk_urb( stream->urb_list[i], stream->udev,
+                               usb_rcvbulkpipe(stream->udev,stream->props.endpoint),
+                               stream->buf_list[i],
+                               stream->props.u.bulk.buffersize,
+                               usb_urb_complete, stream);
+
+               stream->urb_list[i]->transfer_flags = 0;
+               stream->urbs_initialized++;
+       }
+       return 0;
+}
+
+static int usb_isoc_urb_init(struct usb_data_stream *stream)
+{
+       int i,j;
+
+       if ((i = usb_allocate_stream_buffers(stream,stream->props.count,
+                                       stream->props.u.isoc.framesize*stream->props.u.isoc.framesperurb)) < 0)
+               return i;
+
+       /* allocate the URBs */
+       for (i = 0; i < stream->props.count; i++) {
+               struct urb *urb;
+               int frame_offset = 0;
+               if ((stream->urb_list[i] =
+                                       usb_alloc_urb(stream->props.u.isoc.framesperurb,GFP_ATOMIC)) == NULL)
+                       return -ENOMEM;
+
+               urb = stream->urb_list[i];
+
+               urb->dev = stream->udev;
+               urb->context = stream;
+               urb->complete = usb_urb_complete;
+               urb->pipe = usb_rcvisocpipe(stream->udev,stream->props.endpoint);
+               urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
+               urb->interval = stream->props.u.isoc.interval;
+               urb->number_of_packets = stream->props.u.isoc.framesperurb;
+               urb->transfer_buffer_length = stream->buf_size;
+               urb->transfer_buffer = stream->buf_list[i];
+               urb->transfer_dma = stream->dma_addr[i];
+
+               for (j = 0; j < stream->props.u.isoc.framesperurb; j++) {
+                       urb->iso_frame_desc[j].offset = frame_offset;
+                       urb->iso_frame_desc[j].length = stream->props.u.isoc.framesize;
+                       frame_offset += stream->props.u.isoc.framesize;
+               }
+
+               stream->urbs_initialized++;
+       }
+       return 0;
+}
+
+int usb_urb_init(struct usb_data_stream *stream, struct usb_data_stream_properties *props)
+{
+       if (stream == NULL || props == NULL)
+               return -EINVAL;
+
+       memcpy(&stream->props, props, sizeof(*props));
+
+       usb_clear_halt(stream->udev,usb_rcvbulkpipe(stream->udev,stream->props.endpoint));
+
+       if (stream->complete == NULL) {
+               err("there is no data callback - this doesn't make sense.");
+               return -EINVAL;
+       }
+
+       switch (stream->props.type) {
+               case USB_BULK:
+                       return usb_bulk_urb_init(stream);
+               case USB_ISOC:
+                       return usb_isoc_urb_init(stream);
+               default:
+                       err("unkown URB-type for data transfer.");
+                       return -EINVAL;
+       }
+}
+
+int usb_urb_exit(struct usb_data_stream *stream)
+{
+       int i;
+
+       usb_urb_kill(stream);
+
+       for (i = 0; i < stream->urbs_initialized; i++) {
+               if (stream->urb_list[i] != NULL) {
+                       deb_mem("freeing URB no. %d.\n",i);
+                       /* free the URBs */
+                       usb_free_urb(stream->urb_list[i]);
+               }
+       }
+       stream->urbs_initialized = 0;
+
+       usb_free_stream_buffers(stream);
+       return 0;
+}
index d4da494132ec7814f0d818ce3fda6d21dcc9a201..3ecb2e0ce80f7ec986023b014a8a249b1fe7dadb 100644 (file)
@@ -24,6 +24,8 @@ struct vp702x_fe_state {
        struct dvb_frontend fe;
        struct dvb_usb_device *d;
 
+       struct dvb_frontend_ops ops;
+
        fe_sec_voltage_t voltage;
        fe_sec_tone_mode_t tone_mode;
 
@@ -72,9 +74,6 @@ static int vp702x_fe_read_status(struct dvb_frontend* fe, fe_status_t *status)
        else
                *status = 0;
 
-       deb_fe("real state: %x\n",*status);
-       *status = 0x1f;
-
        if (*status & FE_HAS_LOCK)
                st->status_check_interval = 1000;
        else
@@ -171,8 +170,6 @@ static int vp702x_fe_set_frontend(struct dvb_frontend* fe,
        st->status_check_interval = 250;
        st->next_status_check = jiffies;
 
-       vp702x_usb_in_op(st->d, RESET_TUNER, 0, 0, NULL, 0);
-       msleep(30);
        vp702x_usb_inout_op(st->d,cmd,8,ibuf,10,100);
 
        if (ibuf[2] == 0 && ibuf[3] == 0)
@@ -183,6 +180,20 @@ static int vp702x_fe_set_frontend(struct dvb_frontend* fe,
        return 0;
 }
 
+static int vp702x_fe_init(struct dvb_frontend *fe)
+{
+       struct vp702x_fe_state *st = fe->demodulator_priv;
+       deb_fe("%s\n",__FUNCTION__);
+       vp702x_usb_in_op(st->d, RESET_TUNER, 0, 0, NULL, 0);
+       return 0;
+}
+
+static int vp702x_fe_sleep(struct dvb_frontend *fe)
+{
+       deb_fe("%s\n",__FUNCTION__);
+       return 0;
+}
+
 static int vp702x_fe_get_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep)
 {
@@ -193,8 +204,8 @@ static int vp702x_fe_get_frontend(struct dvb_frontend* fe,
 static int vp702x_fe_send_diseqc_msg (struct dvb_frontend* fe,
                                    struct dvb_diseqc_master_cmd *m)
 {
-       struct vp702x_fe_state *st = fe->demodulator_priv;
-       u8 cmd[8],ibuf[10];
+       //struct vp702x_fe_state *st = fe->demodulator_priv;
+       u8 cmd[8];//,ibuf[10];
        memset(cmd,0,8);
 
        deb_fe("%s\n",__FUNCTION__);
@@ -207,12 +218,12 @@ static int vp702x_fe_send_diseqc_msg (struct dvb_frontend* fe,
        memcpy(&cmd[3], m->msg, m->msg_len);
        cmd[7] = vp702x_chksum(cmd,0,7);
 
-       vp702x_usb_inout_op(st->d,cmd,8,ibuf,10,100);
+//     vp702x_usb_inout_op(st->d,cmd,8,ibuf,10,100);
 
-       if (ibuf[2] == 0 && ibuf[3] == 0)
-               deb_fe("diseqc cmd failed.\n");
-       else
-               deb_fe("diseqc cmd succeeded.\n");
+//     if (ibuf[2] == 0 && ibuf[3] == 0)
+//             deb_fe("diseqc cmd failed.\n");
+//     else
+//             deb_fe("diseqc cmd succeeded.\n");
 
        return 0;
 }
@@ -318,8 +329,8 @@ static struct dvb_frontend_ops vp702x_fe_ops = {
        },
        .release = vp702x_fe_release,
 
-       .init = NULL,
-       .sleep = NULL,
+       .init  = vp702x_fe_init,
+       .sleep = vp702x_fe_sleep,
 
        .set_frontend = vp702x_fe_set_frontend,
        .get_frontend = vp702x_fe_get_frontend,
index b2f098a2d5f7ee31f8baa891fcd784a0d2497532..02bd61aaac666b3c6d1b5156ccc1d597dbda2f0b 100644 (file)
@@ -22,50 +22,54 @@ module_param_named(debug,dvb_usb_vp702x_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS);
 
 struct vp702x_state {
-       u8 pid_table[17]; /* [16] controls the pid_table state */
+       int pid_filter_count;
+       int pid_filter_can_bypass;
+       u8  pid_filter_state;
+};
+
+struct vp702x_device_state {
+       u8 power_state;
 };
 
 /* check for mutex FIXME */
 int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
 {
-       int ret = 0,try = 0;
+       int ret = -1;
 
-       while (ret >= 0 && ret != blen && try < 3) {
                ret = usb_control_msg(d->udev,
                        usb_rcvctrlpipe(d->udev,0),
                        req,
                        USB_TYPE_VENDOR | USB_DIR_IN,
                        value,index,b,blen,
                        2000);
-               deb_info("reading number %d (ret: %d)\n",try,ret);
-               try++;
-       }
 
-       if (ret < 0 || ret != blen) {
-               warn("usb in operation failed.");
+       if (ret < 0) {
+               warn("usb in operation failed. (%d)", ret);
                ret = -EIO;
        } else
                ret = 0;
 
-       deb_xfer("in: req. %x, val: %x, ind: %x, buffer: ",req,value,index);
+
+       deb_xfer("in: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
        debug_dump(b,blen,deb_xfer);
 
        return ret;
 }
 
-static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
+int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
                             u16 index, u8 *b, int blen)
 {
-       deb_xfer("out: req. %x, val: %x, ind: %x, buffer: ",req,value,index);
+       int ret;
+       deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
        debug_dump(b,blen,deb_xfer);
 
-       if (usb_control_msg(d->udev,
+       if ((ret = usb_control_msg(d->udev,
                        usb_sndctrlpipe(d->udev,0),
                        req,
                        USB_TYPE_VENDOR | USB_DIR_OUT,
                        value,index,b,blen,
-                       2000) != blen) {
-               warn("usb out operation failed.");
+                       2000)) != blen) {
+               warn("usb out operation failed. (%d)",ret);
                return -EIO;
        } else
                return 0;
@@ -78,12 +82,10 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il
        if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
                return ret;
 
-       if ((ret = vp702x_usb_out_op(d,REQUEST_OUT,0,0,o,olen)) < 0)
-               goto unlock;
+       ret = vp702x_usb_out_op(d,REQUEST_OUT,0,0,o,olen);
        msleep(msec);
        ret = vp702x_usb_in_op(d,REQUEST_IN,0,0,i,ilen);
 
-unlock:
        mutex_unlock(&d->usb_mutex);
 
        return ret;
@@ -108,29 +110,65 @@ static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o,
        return ret;
 }
 
-static int vp702x_pid_filter(struct dvb_usb_device *d, int index, u16 pid, int onoff)
+static int vp702x_set_pld_mode(struct dvb_usb_adapter *adap, u8 bypass)
+{
+       u8 buf[16] = { 0 };
+       return vp702x_usb_in_op(adap->dev, 0xe0, (bypass << 8) | 0x0e, 0, buf, 16);
+}
+
+static int vp702x_set_pld_state(struct dvb_usb_adapter *adap, u8 state)
+{
+       u8 buf[16] = { 0 };
+       return vp702x_usb_in_op(adap->dev, 0xe0, (state << 8) | 0x0f, 0, buf, 16);
+}
+
+static int vp702x_set_pid(struct dvb_usb_adapter *adap, u16 pid, u8 id, int onoff)
 {
-       struct vp702x_state *st = d->priv;
-       u8 buf[9];
-
-       if (onoff) {
-               st->pid_table[16]   |=   1 << index;
-               st->pid_table[index*2]   = (pid >> 8) & 0xff;
-               st->pid_table[index*2+1] =  pid       & 0xff;
-       } else {
-               st->pid_table[16]   &= ~(1 << index);
-               st->pid_table[index*2] = st->pid_table[index*2+1] = 0;
+       struct vp702x_state *st = adap->priv;
+       u8 buf[16] = { 0 };
+
+       if (onoff)
+               st->pid_filter_state |=  (1 << id);
+       else {
+               st->pid_filter_state &= ~(1 << id);
+               pid = 0xffff;
        }
 
-       return vp702x_usb_inout_cmd(d,SET_PID_FILTER,st->pid_table,17,buf,9,10);
+       id = 0x10 + id*2;
+
+       vp702x_set_pld_state(adap, st->pid_filter_state);
+       vp702x_usb_in_op(adap->dev, 0xe0, (((pid >> 8) & 0xff) << 8) | (id), 0, buf, 16);
+       vp702x_usb_in_op(adap->dev, 0xe0, (((pid     ) & 0xff) << 8) | (id+1), 0, buf, 16);
+       return 0;
 }
 
-static int vp702x_power_ctrl(struct dvb_usb_device *d, int onoff)
+
+static int vp702x_init_pid_filter(struct dvb_usb_adapter *adap)
 {
-       vp702x_usb_in_op(d,RESET_TUNER,0,0,NULL,0);
+       struct vp702x_state *st = adap->priv;
+       int i;
+       u8 b[10] = { 0 };
+
+       st->pid_filter_count = 8;
+       st->pid_filter_can_bypass = 1;
+       st->pid_filter_state = 0x00;
+
+       vp702x_set_pld_mode(adap, 1); // bypass
+
+       for (i = 0; i < st->pid_filter_count; i++)
+               vp702x_set_pid(adap, 0xffff, i, 1);
 
-       vp702x_usb_in_op(d,SET_TUNER_POWER_REQ,0,onoff,NULL,0);
-       return vp702x_usb_in_op(d,SET_TUNER_POWER_REQ,0,onoff,NULL,0);
+       vp702x_usb_in_op(adap->dev, 0xb5, 3, 0, b, 10);
+       vp702x_usb_in_op(adap->dev, 0xb5, 0, 0, b, 10);
+       vp702x_usb_in_op(adap->dev, 0xb5, 1, 0, b, 10);
+
+       //vp702x_set_pld_mode(d, 0); // filter
+       return 0;
+}
+
+static int vp702x_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
+{
+       return 0;
 }
 
 /* keys for the enclosed remote control */
@@ -166,74 +204,83 @@ static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
        return 0;
 }
 
+int vp702x_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+       struct vp702x_device_state *st = d->priv;
+
+       if (st->power_state == 0 && onoff)
+               vp702x_usb_out_op(d, SET_TUNER_POWER_REQ, 1, 7, NULL, 0);
+       else if (st->power_state == 1 && onoff == 0)
+               vp702x_usb_out_op(d, SET_TUNER_POWER_REQ, 0, 7, NULL, 0);
+
+       st->power_state = onoff;
+
+       return 0;
+}
+
 static int vp702x_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])
 {
-       u8 macb[9];
-       if (vp702x_usb_inout_cmd(d, GET_MAC_ADDRESS, NULL, 0, macb, 9, 10))
-               return -EIO;
-       memcpy(mac,&macb[3],6);
+       u8 i;
+       for (i = 6; i < 12; i++)
+               vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &mac[i - 6], 1);
        return 0;
 }
 
-static int vp702x_frontend_attach(struct dvb_usb_device *d)
+static int vp702x_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       u8 buf[9] = { 0 };
+       u8 buf[10] = { 0 };
+
+       vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 0, 7, NULL, 0);
 
-       if (vp702x_usb_inout_cmd(d, GET_SYSTEM_STRING, NULL, 0, buf, 9, 10))
+       if (vp702x_usb_inout_cmd(adap->dev, GET_SYSTEM_STRING, NULL, 0, buf, 10, 10))
                return -EIO;
 
-       buf[8] = '\0';
+       buf[9] = '\0';
        info("system string: %s",&buf[1]);
 
-       d->fe = vp702x_fe_attach(d);
+       vp702x_init_pid_filter(adap);
+
+       adap->fe = vp702x_fe_attach(adap->dev);
+       vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0);
+
        return 0;
 }
 
-static struct dvb_usb_properties vp702x_properties;
+static struct dvb_usb_device_properties vp702x_properties;
 
 static int vp702x_usb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
 {
-       struct usb_device *udev = interface_to_usbdev(intf);
-
-       usb_clear_halt(udev,usb_sndctrlpipe(udev,0));
-       usb_clear_halt(udev,usb_rcvctrlpipe(udev,0));
-
        return dvb_usb_device_init(intf,&vp702x_properties,THIS_MODULE,NULL);
 }
 
 static struct usb_device_id vp702x_usb_table [] = {
            { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7021_COLD) },
-           { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7021_WARM) },
-           { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7020_COLD) },
-           { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7020_WARM) },
+//         { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7020_COLD) },
+//         { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7020_WARM) },
            { 0 },
 };
 MODULE_DEVICE_TABLE(usb, vp702x_usb_table);
 
-static struct dvb_usb_properties vp702x_properties = {
-       .caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
-       .pid_filter_count = 8, /* !!! */
-
+static struct dvb_usb_device_properties vp702x_properties = {
        .usb_ctrl = CYPRESS_FX2,
-       .firmware = "dvb-usb-vp702x-01.fw",
+       .firmware            = "dvb-usb-vp702x-02.fw",
+       .no_reconnect        = 1,
 
-       .pid_filter       = vp702x_pid_filter,
-       .power_ctrl       = vp702x_power_ctrl,
-       .frontend_attach  = vp702x_frontend_attach,
-       .read_mac_address = vp702x_read_mac_addr,
+       .size_of_priv     = sizeof(struct vp702x_device_state),
 
-       .rc_key_map       = vp702x_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(vp702x_rc_keys),
-       .rc_interval      = 400,
-       .rc_query         = vp702x_rc_query,
+       .num_adapters = 1,
+       .adapter = {
+               {
+                       .caps             = DVB_USB_ADAP_RECEIVES_204_BYTE_TS,
 
-       .size_of_priv     = sizeof(struct vp702x_state),
+                       .streaming_ctrl   = vp702x_streaming_ctrl,
+       .frontend_attach  = vp702x_frontend_attach,
 
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
-               .count = 7,
+                       .stream = {
+                               .type = USB_BULK,
+                               .count = 10,
                .endpoint = 0x02,
                .u = {
                        .bulk = {
@@ -241,24 +288,33 @@ static struct dvb_usb_properties vp702x_properties = {
                        }
                }
        },
+                       .size_of_priv     = sizeof(struct vp702x_state),
+               }
+               },
+       .read_mac_address = vp702x_read_mac_addr,
+
+       .rc_key_map       = vp702x_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(vp702x_rc_keys),
+       .rc_interval      = 400,
+       .rc_query         = vp702x_rc_query,
 
-       .num_device_descs = 2,
+       .num_device_descs = 1,
        .devices = {
                { .name = "TwinhanDTV StarBox DVB-S USB2.0 (VP7021)",
                  .cold_ids = { &vp702x_usb_table[0], NULL },
-                 .warm_ids = { &vp702x_usb_table[1], NULL },
+                 .warm_ids = { NULL },
                },
-               { .name = "TwinhanDTV StarBox DVB-S USB2.0 (VP7020)",
+/*             { .name = "TwinhanDTV StarBox DVB-S USB2.0 (VP7020)",
                  .cold_ids = { &vp702x_usb_table[2], NULL },
                  .warm_ids = { &vp702x_usb_table[3], NULL },
                },
-               { 0 },
+*/             { NULL },
        }
 };
 
 /* usb specific object needed to register this driver with the usb subsystem */
 static struct usb_driver vp702x_usb_driver = {
-       .name           = "dvb-usb-vp702x",
+       .name           = "dvb_usb_vp702x",
        .probe          = vp702x_usb_probe,
        .disconnect = dvb_usb_device_exit,
        .id_table       = vp702x_usb_table,
@@ -287,5 +343,5 @@ module_exit(vp702x_usb_module_exit);
 
 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
 MODULE_DESCRIPTION("Driver for Twinhan StarBox DVB-S USB2.0 and clones");
-MODULE_VERSION("1.0-alpha");
+MODULE_VERSION("1.0");
 MODULE_LICENSE("GPL");
index c2f97f96c21fc1feae79ac7caa455cb641d1e8f0..25a9dee4c824328fc6c27be4fd4730f1c2632efe 100644 (file)
@@ -102,5 +102,7 @@ extern struct dvb_frontend * vp702x_fe_attach(struct dvb_usb_device *d);
 
 extern int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec);
 extern int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen);
+extern int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen);
+extern int vp702x_power_ctrl(struct dvb_usb_device *d, int onoff);
 
 #endif
index 8ea3834a6cf8a2091d9908081c6e5f85ee69d618..b4cf002703a753dd0e4be529ca5e29b7d92d9952 100644 (file)
@@ -169,31 +169,31 @@ static int vp7045_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])
        return vp7045_read_eeprom(d,mac, 6, MAC_0_ADDR);
 }
 
-static int vp7045_frontend_attach(struct dvb_usb_device *d)
+static int vp7045_frontend_attach(struct dvb_usb_adapter *adap)
 {
        u8 buf[255] = { 0 };
 
-       vp7045_usb_op(d,VENDOR_STRING_READ,NULL,0,buf,20,0);
+       vp7045_usb_op(adap->dev,VENDOR_STRING_READ,NULL,0,buf,20,0);
        buf[10] = '\0';
        deb_info("firmware says: %s ",buf);
 
-       vp7045_usb_op(d,PRODUCT_STRING_READ,NULL,0,buf,20,0);
+       vp7045_usb_op(adap->dev,PRODUCT_STRING_READ,NULL,0,buf,20,0);
        buf[10] = '\0';
        deb_info("%s ",buf);
 
-       vp7045_usb_op(d,FW_VERSION_READ,NULL,0,buf,20,0);
+       vp7045_usb_op(adap->dev,FW_VERSION_READ,NULL,0,buf,20,0);
        buf[10] = '\0';
        deb_info("v%s\n",buf);
 
 /*     Dump the EEPROM */
 /*     vp7045_read_eeprom(d,buf, 255, FX2_ID_ADDR); */
 
-       d->fe = vp7045_fe_attach(d);
+       adap->fe = vp7045_fe_attach(adap->dev);
 
        return 0;
 }
 
-static struct dvb_usb_properties vp7045_properties;
+static struct dvb_usb_device_properties vp7045_properties;
 
 static int vp7045_usb_probe(struct usb_interface *intf,
                const struct usb_device_id *id)
@@ -210,24 +210,17 @@ static struct usb_device_id vp7045_usb_table [] = {
 };
 MODULE_DEVICE_TABLE(usb, vp7045_usb_table);
 
-static struct dvb_usb_properties vp7045_properties = {
-       .caps = 0,
-
+static struct dvb_usb_device_properties vp7045_properties = {
        .usb_ctrl = CYPRESS_FX2,
        .firmware = "dvb-usb-vp7045-01.fw",
 
-       .power_ctrl       = vp7045_power_ctrl,
+       .num_adapters = 1,
+       .adapter = {
+               {
        .frontend_attach  = vp7045_frontend_attach,
-       .read_mac_address = vp7045_read_mac_addr,
-
-       .rc_interval      = 400,
-       .rc_key_map       = vp7045_rc_keys,
-       .rc_key_map_size  = ARRAY_SIZE(vp7045_rc_keys),
-       .rc_query         = vp7045_rc_query,
-
        /* parameter for the MPEG2-data transfer */
-       .urb = {
-               .type = DVB_USB_BULK,
+                       .stream = {
+                               .type = USB_BULK,
                .count = 7,
                .endpoint = 0x02,
                .u = {
@@ -236,6 +229,15 @@ static struct dvb_usb_properties vp7045_properties = {
                        }
                }
        },
+               }
+       },
+       .power_ctrl       = vp7045_power_ctrl,
+       .read_mac_address = vp7045_read_mac_addr,
+
+       .rc_interval      = 400,
+       .rc_key_map       = vp7045_rc_keys,
+       .rc_key_map_size  = ARRAY_SIZE(vp7045_rc_keys),
+       .rc_query         = vp7045_rc_query,
 
        .num_device_descs = 2,
        .devices = {
index 62d69a6ea699269e2a937c1a764fd28e1cc3976c..a356d28fc3bb25af35b9b32e6ae2d0c138a1bf14 100644 (file)
@@ -553,8 +553,8 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa
        ndiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) / 32) & 0x1ff;
        adiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) % 32) & 0x1f;
 
-       if (adiv == 0)
-               ndiv++;
+       if (adiv == 0 && ndiv > 0)
+               ndiv--;
 
        /* control bits 11, refdiv 11, charge pump polarity 1, charge pump current, ndiv, adiv */
        state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (pump << 14) | (ndiv << 5) | adiv;
index cc28417fa33ac7fb6bc1eef2e496cd0ec682ec6e..ccc813b525d6d084217bc952a7bffe3bc2d63302 100644 (file)
@@ -37,6 +37,8 @@ struct dib3000mc_state {
 
        struct dibx000_i2c_master i2c_master;
 
+       u32 timf;
+
        fe_bandwidth_t current_bandwidth;
 
        u16 dev_id;
@@ -92,50 +94,31 @@ static int dib3000mc_identify(struct dib3000mc_state *state)
 
 static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u8 bw, u8 update_offset)
 {
-/*
-       u32 timf_msb, timf_lsb, i;
-       int tim_sgn ;
-       LUInt comp1, comp2, comp ;
-//     u32 tim_offset ;
-       comp = 27700 * BW_INDEX_TO_KHZ(bw) / 1000;
-       timf_msb = (comp >> 16) & 0x00FF;
-       timf_lsb =  comp        & 0xFFFF;
-
-       // Update the timing offset ;
-       if (update_offset) {
-               if (state->timing_offset_comp_done == 0) {
-                       usleep(200000);
-                       state->timing_offset_comp_done = 1;
-               }
-               tim_offset = dib3000mc_read_word(state, 416);
-               if ((tim_offset & 0x2000) == 0x2000)
-                       tim_offset |= 0xC000; // PB: This only works if tim_offset is s16 - weird
-
-               if (nfft == 0)
-                       tim_offset = tim_offset << 2; // PB: Do not store the offset for different things in one variable
-               state->timing_offset += tim_offset;
-       }
-       tim_offset = state->timing_offset;
+       u32 timf;
 
-       if (tim_offset < 0) {
-               tim_sgn = 1;
-               tim_offset = -tim_offset;
+       if (state->timf == 0) {
+               timf = 1384402; // default value for 8MHz
+               if (update_offset)
+                       msleep(200); // first time we do an update
        } else
-               tim_sgn = 0;
+               timf = state->timf;
 
-       comp1 = tim_offset * timf_lsb;
-       comp2 = tim_offset * timf_msb;
-       comp  = ((comp1 >> 16) + comp2) >> 7;
+       timf *= (BW_INDEX_TO_KHZ(bw) / 1000);
 
-       if (tim_sgn == 0)
-               comp = timf_msb * (1<<16) + timf_lsb + comp;
-       else
-               comp = timf_msb * (1<<16) + timf_lsb - comp;
+       if (update_offset) {
+               s16 tim_offs = dib3000mc_read_word(state, 416);
+
+               if (tim_offs &  0x2000)
+                       tim_offs -= 0x4000;
 
-       timf_msb = (comp>>16)&0xFF ;
-       timf_lsb = comp&0xFFFF;
-*/
-       u32 timf = 1384402 * (BW_INDEX_TO_KHZ(bw) / 1000);
+               if (nfft == 0)
+                       tim_offs *= 4;
+
+               timf += tim_offs;
+               state->timf = timf / (BW_INDEX_TO_KHZ(bw) / 1000);
+       }
+
+       dprintk("timf: %d\n", timf);
 
        dib3000mc_write_word(state, 23, timf >> 16);
        dib3000mc_write_word(state, 24, timf & 0xffff);
@@ -143,15 +126,18 @@ static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u8 bw,
        return 0;
 }
 
-static int dib3000mc_setup_pwm3_state(struct dib3000mc_state *state)
+static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
 {
+       u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
     if (state->cfg->pwm3_inversion) {
-               dib3000mc_write_word(state, 51, (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0));
-               dib3000mc_write_word(state, 52, (0 << 8) | (5 << 5) | (1 << 4) | (1 << 3) | (1 << 2) | (2 << 0));
+               reg_51 =  (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
+               reg_52 |= (1 << 2);
        } else {
-               dib3000mc_write_word(state, 51, (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0));
-               dib3000mc_write_word(state, 52, (1 << 8) | (5 << 5) | (1 << 4) | (1 << 3) | (0 << 2) | (2 << 0));
+               reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
+               reg_52 |= (1 << 8);
        }
+       dib3000mc_write_word(state, 51, reg_51);
+       dib3000mc_write_word(state, 52, reg_52);
 
     if (state->cfg->use_pwm3)
                dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
@@ -326,10 +312,10 @@ static int dib3000mc_init(struct dvb_frontend *demod)
                dib3000mc_write_word(state, 175,  0x0000);
                dib3000mc_write_word(state, 1032, 0x012C);
        }
-       dib3000mc_write_word(state, 1033, 0);
+       dib3000mc_write_word(state, 1033, 0x0000);
 
        // P_clk_cfg
-       dib3000mc_write_word(state, 1037, 12592);
+       dib3000mc_write_word(state, 1037, 0x3130);
 
        // other configurations
 
@@ -350,7 +336,7 @@ static int dib3000mc_init(struct dvb_frontend *demod)
        dib3000mc_write_word(state, 50, 0x8000);
 
        // agc setup misc
-       dib3000mc_setup_pwm3_state(state);
+       dib3000mc_setup_pwm_state(state);
 
        // P_agc_counter_lock
        dib3000mc_write_word(state, 53, 0x87);
@@ -426,10 +412,9 @@ static int dib3000mc_sleep(struct dvb_frontend *demod)
 {
        struct dib3000mc_state *state = demod->demodulator_priv;
 
-       dib3000mc_write_word(state, 1037, dib3000mc_read_word(state, 1037) | 0x0003);
        dib3000mc_write_word(state, 1031, 0xFFFF);
        dib3000mc_write_word(state, 1032, 0xFFFF);
-       dib3000mc_write_word(state, 1033, 0xFFF4);   // ****  Bin2
+       dib3000mc_write_word(state, 1033, 0xFFF0);
 
     return 0;
 }
@@ -539,6 +524,7 @@ static int dib3000mc_autosearch_start(struct dvb_frontend *demod, struct dibx000
 
        reg = dib3000mc_read_word(state, 0);
        dib3000mc_write_word(state, 0, reg | (1 << 8));
+       dib3000mc_read_word(state, 511);
        dib3000mc_write_word(state, 0, reg);
 
        return 0;
@@ -578,59 +564,9 @@ static int dib3000mc_tune(struct dvb_frontend *demod, struct dibx000_ofdm_channe
                dib3000mc_write_word(state, 33, 6);
        }
 
-       // if (lock)
-       //      dib3000mc_set_timing(state, ch->nfft, ch->Bw, 1);
-
-       return 0;
-}
-
-static int dib3000mc_demod_output_mode(struct dvb_frontend *demod, int mode)
-{
-       struct dib3000mc_state *state = demod->demodulator_priv;
-       return dib3000mc_set_output_mode(state, mode);
-}
-
-static int dib3000mc_i2c_enumeration(struct dvb_frontend *demod[], int no_of_demods, u8 default_addr)
-{
-       struct dib3000mc_state *st;
-       int k,ret=0;
-       u8 new_addr;
-
-       static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
-
-       for (k = no_of_demods-1; k >= 0; k--) {
-               st = demod[k]->demodulator_priv;
-
-               /* designated i2c address */
-               new_addr          = DIB3000MC_I2C_ADDRESS[k];
-
-               st->i2c_addr = new_addr;
-               if (dib3000mc_identify(st) != 0) {
-                       st->i2c_addr = default_addr;
-                       if (dib3000mc_identify(st) != 0) {
-                               dprintk("-E-  DiB3000P/MC #%d: not identified\n", k);
-                               return -EINVAL;
-                       }
-               }
-
-               /* turn on div_out */
-               dib3000mc_demod_output_mode(demod[k], OUTMODE_MPEG2_PAR_CONT_CLK);
-
-               // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
-               ret |= dib3000mc_write_word(st, 1024, (new_addr << 3) | 0x1);
-               st->i2c_addr = new_addr;
-       }
-
-       for (k = 0; k < no_of_demods; k++) {
-               st = demod[k]->demodulator_priv;
-
-               ret |= dib3000mc_write_word(st, 1024, st->i2c_addr << 3);
-
-               /* turn off data output */
-               dib3000mc_demod_output_mode(demod[k],OUTMODE_HIGH_Z);
-               dib3000mc_write_word(st, 769, (1 << 7) );
+       if (dib3000mc_read_word(state, 509) & 0x80)
+               dib3000mc_set_timing(state, ch->nfft, ch->Bw, 1);
 
-       }
        return 0;
 }
 
@@ -826,61 +762,79 @@ void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
 }
 EXPORT_SYMBOL(dib3000mc_set_config);
 
-static struct dvb_frontend_ops dib3000mc_ops;
-
-int dib3000mc_attach(struct i2c_adapter *i2c_adap, int no_of_demods, u8        default_addr,                           u8 do_i2c_enum, struct dib3000mc_config cfg[], struct dvb_frontend *demod[])
+int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
 {
-       struct dib3000mc_state *st;
-       int k, num=0;
-
-       if (no_of_demods < 1)
-               return -EINVAL;
+       struct dib3000mc_state st = { .i2c_adap = i2c };
+       int k;
+       u8 new_addr;
 
-       for (k = 0; k < no_of_demods; k++) {
-               st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
-               if (st == NULL)
-                       goto error;
+       static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
 
-               num++;
+       for (k = no_of_demods-1; k >= 0; k--) {
+               st.cfg = &cfg[k];
 
-               st->cfg = &cfg[k];
-       //      st->gpio_val = cfg[k].gpio_val;
-       //      st->gpio_dir = cfg[k].gpio_dir;
-               st->i2c_adap = i2c_adap;
+               /* designated i2c address */
+               new_addr          = DIB3000MC_I2C_ADDRESS[k];
+               st.i2c_addr = new_addr;
+               if (dib3000mc_identify(&st) != 0) {
+                       st.i2c_addr = default_addr;
+                       if (dib3000mc_identify(&st) != 0) {
+                               dprintk("-E-  DiB3000P/MC #%d: not identified\n", k);
+                               return -ENODEV;
+                       }
+               }
 
-               demod[k]           = &st->demod;
-               demod[k]->demodulator_priv     = st;
-               memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
+               dib3000mc_set_output_mode(&st, OUTMODE_MPEG2_PAR_CONT_CLK);
 
-//             INIT_COMPONENT_REGISTER_ACCESS(&st->register_access, 12, 16, dib7000p_register_read, dib7000p_register_write, st);
-//             demod[k]->register_access = &st->register_access;
+               // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
+               dib3000mc_write_word(&st, 1024, (new_addr << 3) | 0x1);
+               st.i2c_addr = new_addr;
        }
 
-       if (do_i2c_enum) {
-               if (dib3000mc_i2c_enumeration(demod,no_of_demods,default_addr) != 0)
-                       goto error;
-       } else {
-               st = demod[0]->demodulator_priv;
-               st->i2c_addr = default_addr;
-               if (dib3000mc_identify(st) != 0)
-                       goto error;
-       }
+       for (k = 0; k < no_of_demods; k++) {
+               st.cfg = &cfg[k];
+               st.i2c_addr = DIB3000MC_I2C_ADDRESS[k];
 
-       for (k = 0; k < num; k++) {
-               st = demod[k]->demodulator_priv;
-               dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
-       }
+               dib3000mc_write_word(&st, 1024, st.i2c_addr << 3);
 
+               /* turn off data output */
+               dib3000mc_set_output_mode(&st, OUTMODE_HIGH_Z);
+       }
        return 0;
+}
+EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
+
+static struct dvb_frontend_ops dib3000mc_ops;
+
+struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
+{
+       struct dvb_frontend *demod;
+       struct dib3000mc_state *st;
+       st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
+       if (st == NULL)
+               return NULL;
+
+       st->cfg = cfg;
+       st->i2c_adap = i2c_adap;
+       st->i2c_addr = i2c_addr;
+
+       demod                   = &st->demod;
+       demod->demodulator_priv = st;
+       memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
+
+       if (dib3000mc_identify(st) != 0)
+               goto error;
+
+       dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
+
+       dib3000mc_write_word(st, 1037, 0x3130);
+
+       return demod;
 
 error:
-       for (k = 0; k < num; k++) {
-               kfree(demod[k]->demodulator_priv);
-               demod[k] = NULL;
-       }
-       return -EINVAL;
+       kfree(st);
+       return NULL;
 }
-
 EXPORT_SYMBOL(dib3000mc_attach);
 
 static struct dvb_frontend_ops dib3000mc_ops = {
index fd0b2e755993be75afd64e532819080d17637668..b198cd5b18436c65890bcef1a507f3a53dc0f6fe 100644 (file)
@@ -37,17 +37,17 @@ struct dib3000mc_config {
 #define DEFAULT_DIB3000P_I2C_ADDRESS  24
 
 #if defined(CONFIG_DVB_DIB3000MC) || defined(CONFIG_DVB_DIB3000MC_MODULE)
-extern int dib3000mc_attach(struct i2c_adapter *i2c_adap, int no_of_demods, u8 default_addr,
-    u8 do_i2c_enum, struct dib3000mc_config cfg[], struct dvb_frontend *demod[]);
+extern struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg);
 #else
-static inline struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config,
-                                            struct i2c_adapter* i2c, struct dib_fe_xfer_ops *xfer_ops)
+static inline struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
 {
        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
        return NULL;
 }
 #endif // CONFIG_DVB_DIB3000MC
 
+extern int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[]);
+
 extern struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating);
 
 extern int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff);
index 508ec1b6d1fb3af79208fb733013787e8ab0df01..450fad8d9b65099ced8ca7f99a789fce9e3636ad 100644 (file)
@@ -247,6 +247,9 @@ static void mt2060_calibrate(struct mt2060_priv *priv)
        if (mt2060_writeregs(priv,mt2060_config2,sizeof(mt2060_config2)))
                return;
 
+       /* initialize the clock output */
+       mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x30);
+
        do {
                b |= (1 << 6); // FM1SS;
                mt2060_writereg(priv, REG_LO2C1,b);
@@ -294,13 +297,13 @@ static int mt2060_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
 static int mt2060_init(struct dvb_frontend *fe)
 {
        struct mt2060_priv *priv = fe->tuner_priv;
-       return mt2060_writereg(priv, REG_VGAG,0x33);
+       return mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x33);
 }
 
 static int mt2060_sleep(struct dvb_frontend *fe)
 {
        struct mt2060_priv *priv = fe->tuner_priv;
-       return mt2060_writereg(priv, REG_VGAG,0x30);
+       return mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x30);
 }
 
 static int mt2060_release(struct dvb_frontend *fe)
@@ -329,14 +332,14 @@ static const struct dvb_tuner_ops mt2060_tuner_ops = {
 };
 
 /* This functions tries to identify a MT2060 tuner by reading the PART/REV register. This is hasty. */
-int mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1)
+struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1)
 {
        struct mt2060_priv *priv = NULL;
        u8 id = 0;
 
        priv = kzalloc(sizeof(struct mt2060_priv), GFP_KERNEL);
        if (priv == NULL)
-               return -ENOMEM;
+               return NULL;
 
        priv->cfg      = cfg;
        priv->i2c      = i2c;
@@ -344,12 +347,12 @@ int mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt206
 
        if (mt2060_readreg(priv,REG_PART_REV,&id) != 0) {
                kfree(priv);
-               return -ENODEV;
+               return NULL;
        }
 
        if (id != PART_REV) {
                kfree(priv);
-               return -ENODEV;
+               return NULL;
        }
        printk(KERN_INFO "MT2060: successfully identified (IF1 = %d)\n", if1);
        memcpy(&fe->ops.tuner_ops, &mt2060_tuner_ops, sizeof(struct dvb_tuner_ops));
@@ -358,7 +361,7 @@ int mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt206
 
        mt2060_calibrate(priv);
 
-       return 0;
+       return fe;
 }
 EXPORT_SYMBOL(mt2060_attach);
 
index c58b03e823455b66c596053f6c926b13bfc7223f..34a37c2b556f01762970d40ea7869f8f8a6cd772 100644 (file)
@@ -27,9 +27,9 @@ struct i2c_adapter;
 
 struct mt2060_config {
        u8 i2c_address;
-       /* Shall we add settings for the discrete outputs ? */
+       u8 clock_out; /* 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1 */
 };
 
-extern int mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1);
+extern struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1);
 
 #endif
index f6779a422f1b858df45707f8ec47c2d9d9c382b4..afb734df6e0591ac461572c9d998f670a633aac5 100644 (file)
@@ -36,7 +36,7 @@ config VIDEO_HELPER_CHIPS_AUTO
 menu "Encoders/decoders and other helper chips"
        depends on VIDEO_DEV && !VIDEO_HELPER_CHIPS_AUTO
 
-comment "Audio Decoders"
+comment "Audio decoders"
 
 config VIDEO_TVAUDIO
        tristate "Simple audio decoder chips"
@@ -51,7 +51,7 @@ config VIDEO_TVAUDIO
          module will be called tvaudio.
 
 config VIDEO_TDA7432
-       tristate "Philips TDA7432 audio processor chip"
+       tristate "Philips TDA7432 audio processor"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for tda7432 audio decoder chip found on some bt8xx boards.
@@ -60,7 +60,7 @@ config VIDEO_TDA7432
          module will be called tda7432.
 
 config VIDEO_TDA9840
-       tristate "Philips TDA9840 audio processor chip"
+       tristate "Philips TDA9840 audio processor"
        depends on VIDEO_DEV && I2C
        ---help---
          Support for tda9840 audio decoder chip found on some Zoran boards.
@@ -69,7 +69,7 @@ config VIDEO_TDA9840
          module will be called tda9840.
 
 config VIDEO_TDA9875
-       tristate "Philips TDA9875 audio processor chip"
+       tristate "Philips TDA9875 audio processor"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for tda9875 audio decoder chip found on some bt8xx boards.
@@ -78,7 +78,7 @@ config VIDEO_TDA9875
          module will be called tda9875.
 
 config VIDEO_TEA6415C
-       tristate "Philips TEA6415C audio processor chip"
+       tristate "Philips TEA6415C audio processor"
        depends on VIDEO_DEV && I2C
        ---help---
          Support for tea6415c audio decoder chip found on some bt8xx boards.
@@ -87,7 +87,7 @@ config VIDEO_TEA6415C
          module will be called tea6415c.
 
 config VIDEO_TEA6420
-       tristate "Philips TEA6420 audio processor chip"
+       tristate "Philips TEA6420 audio processor"
        depends on VIDEO_DEV && I2C
        ---help---
          Support for tea6420 audio decoder chip found on some bt8xx boards.
@@ -143,64 +143,10 @@ config VIDEO_WM8739
          To compile this driver as a module, choose M here: the
          module will be called wm8739.
 
-comment "MPEG video encoders"
-
-config VIDEO_CX2341X
-       tristate "Conexant CX2341x MPEG encoders"
-       depends on VIDEO_V4L2 && EXPERIMENTAL
-       ---help---
-         Support for the Conexant CX23416 MPEG encoders
-         and CX23415 MPEG encoder/decoders.
-
-         This module currently supports the encoding functions only.
-
-         To compile this driver as a module, choose M here: the
-         module will be called cx2341x.
-
-source "drivers/media/video/cx25840/Kconfig"
-
-comment "Video encoders"
-
-config VIDEO_SAA7127
-       tristate "Philips SAA7127/9 digital video encoders"
-       depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
-       ---help---
-         Support for the Philips SAA7127/9 digital video encoders.
-
-         To compile this driver as a module, choose M here: the
-         module will be called saa7127.
-
-config VIDEO_SAA7185
-       tristate "Philips SAA7185 video encoder"
-       depends on VIDEO_V4L1 && I2C
-       ---help---
-         Support for the Philips SAA7185 video encoder.
-
-         To compile this driver as a module, choose M here: the
-         module will be called saa7185.
-
-config VIDEO_ADV7170
-       tristate "Analog Devices ADV7170 video encoder driver"
-       depends on VIDEO_V4L1 && I2C
-       ---help---
-         Support for the Analog Devices ADV7170 video encoder driver
-
-         To compile this driver as a module, choose M here: the
-         module will be called adv7170.
-
-config VIDEO_ADV7175
-       tristate "Analog Devices ADV7175 video encoder driver"
-       depends on VIDEO_V4L1 && I2C
-       ---help---
-         Support for the Analog Devices ADV7175 video encoder driver
-
-         To compile this driver as a module, choose M here: the
-         module will be called adv7175.
-
 comment "Video decoders"
 
 config VIDEO_BT819
-       tristate "BT819A VideoStream Decoder"
+       tristate "BT819A VideoStream decoder"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for BT819A video decoder.
@@ -209,7 +155,7 @@ config VIDEO_BT819
          module will be called bt819.
 
 config VIDEO_BT856
-       tristate "BT856 VideoStream Decoder"
+       tristate "BT856 VideoStream decoder"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for BT856 video decoder.
@@ -218,7 +164,7 @@ config VIDEO_BT856
          module will be called bt856.
 
 config VIDEO_BT866
-       tristate "BT866 VideoStream Decoder"
+       tristate "BT866 VideoStream decoder"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for BT866 video decoder.
@@ -295,7 +241,7 @@ config VIDEO_TVP5150
          module will be called tvp5150.
 
 config VIDEO_VPX3220
-       tristate "vpx3220a, vpx3216b & vpx3214c video decoder driver"
+       tristate "vpx3220a, vpx3216b & vpx3214c video decoders"
        depends on VIDEO_V4L1 && I2C
        ---help---
          Support for VPX322x video decoders.
@@ -303,6 +249,62 @@ config VIDEO_VPX3220
          To compile this driver as a module, choose M here: the
          module will be called vpx3220.
 
+comment "Video and audio decoders"
+
+source "drivers/media/video/cx25840/Kconfig"
+
+comment "MPEG video encoders"
+
+config VIDEO_CX2341X
+       tristate "Conexant CX2341x MPEG encoders"
+       depends on VIDEO_V4L2 && EXPERIMENTAL
+       ---help---
+         Support for the Conexant CX23416 MPEG encoders
+         and CX23415 MPEG encoder/decoders.
+
+         This module currently supports the encoding functions only.
+
+         To compile this driver as a module, choose M here: the
+         module will be called cx2341x.
+
+comment "Video encoders"
+
+config VIDEO_SAA7127
+       tristate "Philips SAA7127/9 digital video encoders"
+       depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
+       ---help---
+         Support for the Philips SAA7127/9 digital video encoders.
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7127.
+
+config VIDEO_SAA7185
+       tristate "Philips SAA7185 video encoder"
+       depends on VIDEO_V4L1 && I2C
+       ---help---
+         Support for the Philips SAA7185 video encoder.
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7185.
+
+config VIDEO_ADV7170
+       tristate "Analog Devices ADV7170 video encoder"
+       depends on VIDEO_V4L1 && I2C
+       ---help---
+         Support for the Analog Devices ADV7170 video encoder driver
+
+         To compile this driver as a module, choose M here: the
+         module will be called adv7170.
+
+config VIDEO_ADV7175
+       tristate "Analog Devices ADV7175 video encoder"
+       depends on VIDEO_V4L1 && I2C
+       ---help---
+         Support for the Analog Devices ADV7175 video encoder driver
+
+         To compile this driver as a module, choose M here: the
+         module will be called adv7175.
+
 comment "Video improvement chips"
 
 config VIDEO_UPD64031A
index d23a42b1504f907e16d7736a6771e99982a554ac..a84903e0d810233440ebfb63b549f8b0b51fae39 100644 (file)
@@ -2000,7 +2000,7 @@ struct tvcard bttv_tvcards[] = {
                .no_msp34xx     = 1,
                .no_tda9875     = 1,
                .no_tda7432     = 1,
-               .muxsel         = { 3, 0, 1, 2 },
+               .muxsel         = { 3, 1 },
                .pll            = PLL_28,
                .no_gpioirq     = 1,
                .has_dvb        = 1,
index a7921f9d45d844d77e1a5019fe1d2f477863cfa7..46738321adafe22367e319c205adf24054fee166 100644 (file)
@@ -896,7 +896,7 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
                snprintf(name, sizeof(name), "%s/2", core->name);
                printk("%s/2: ============  START LOG STATUS  ============\n",
                       core->name);
-               cx88_call_i2c_clients(core, VIDIOC_LOG_STATUS, 0);
+               cx88_call_i2c_clients(core, VIDIOC_LOG_STATUS, NULL);
                cx2341x_log_status(&dev->params, name);
                printk("%s/2: =============  END LOG STATUS  =============\n",
                       core->name);
@@ -1086,7 +1086,7 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev,
                return -EINVAL;
 
        err = -ENODEV;
-       if (!cx88_boards[core->board].blackbird)
+       if (!(cx88_boards[core->board].mpeg & CX88_MPEG_BLACKBIRD))
                goto fail_core;
 
        err = -ENOMEM;
index 6214eb823b29afffc94b0da20d628846ed72c41c..af71d4225c763eefafa18907a9efd4c8c805a133 100644 (file)
@@ -294,7 +294,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_RADIO,
                        .gpio0  = 0x0000bd62,
                },
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_IODATA_GVVCP3PCI] = {
                .name           = "IODATA GV-VCP3/PCI",
@@ -358,7 +358,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_RADIO,
                        .gpio0  = 0x0000fde2,
                },
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_MSI_TVANYWHERE] = {
                .name           = "MSI TV-@nywhere",
@@ -401,7 +401,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0x0700,
                        .gpio2  = 0x0101,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
                .name           = "DViCO FusionHDTV DVB-T1",
@@ -418,7 +418,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x000027df,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_KWORLD_LTV883] = {
                .name           = "KWorld LTV883RF",
@@ -488,7 +488,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x0f00,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_DVB_T1] = {
                .name           = "Hauppauge Nova-T DVB-T",
@@ -500,7 +500,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_DVB,
                        .vmux   = 0,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_CONEXANT_DVB_T1] = {
                .name           = "Conexant DVB-T reference design",
@@ -512,7 +512,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_DVB,
                        .vmux   = 0,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_PROVIDEO_PV259] = {
                .name           = "Provideo PV259",
@@ -524,7 +524,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_TELEVISION,
                        .vmux   = 0,
                }},
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
                .name           = "DViCO FusionHDTV DVB-T Plus",
@@ -541,7 +541,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x000027df,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_DNTV_LIVE_DVB_T] = {
                .name           = "digitalnow DNTV Live! DVB-T",
@@ -560,7 +560,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0x00000700,
                        .gpio2  = 0x00000101,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_PCHDTV_HD3000] = {
                .name           = "pcHDTV HD3000 HDTV",
@@ -599,7 +599,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio2  = 0x00000000,
                        .gpio3  = 0x00000000,
                },
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_ROSLYN] = {
                // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
@@ -633,7 +633,7 @@ struct cx88_board cx88_boards[] = {
                         .gpio0  = 0xed96,
                         .gpio2  = 0x00ff,
                 },
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_DIGITALLOGIC_MEC] = {
                .name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
@@ -659,7 +659,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_RADIO,
                        .gpio0  = 0x00009d00,
                },
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_IODATA_GVBCTV7E] = {
                .name           = "IODATA GV/BCTV7E",
@@ -727,7 +727,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x97e9,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_ADSTECH_DVB_T_PCI] = {
                .name           = "ADS Tech Instant TV DVB-T PCI",
@@ -746,7 +746,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0x0700,
                        .gpio2  = 0x0101,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
                .name           = "TerraTec Cinergy 1400 DVB-T",
@@ -755,7 +755,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_DVB,
                        .vmux   = 0,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
                .name           = "DViCO FusionHDTV 5 Gold",
@@ -777,7 +777,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x87f9,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
                .name           = "AverMedia UltraTV Media Center PCI 550",
@@ -786,7 +786,7 @@ struct cx88_board cx88_boards[] = {
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .tda9887_conf   = TDA9887_PRESENT,
-               .blackbird      = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
                .input          = {{
                        .type   = CX88_VMUX_COMPOSITE1,
                        .vmux   = 0,
@@ -854,7 +854,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio2  = 0x00000001,
                        .gpio3  = 0x00000000,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_WINFAST_DTV1000] = {
                .name           = "WinFast DTV1000-T",
@@ -866,7 +866,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_DVB,
                        .vmux   = 0,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_AVERTV_303] = {
                .name           = "AVerTV 303 (M126)",
@@ -914,7 +914,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_SVIDEO,
                        .vmux   = 2,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
                .name           = "Hauppauge Nova-SE2 DVB-S",
@@ -926,7 +926,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_DVB,
                        .vmux   = 0,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_KWORLD_DVBS_100] = {
                .name           = "KWorld DVB-S 100",
@@ -944,7 +944,7 @@ struct cx88_board cx88_boards[] = {
                        .type   = CX88_VMUX_SVIDEO,
                        .vmux   = 2,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_HVR1100] = {
                .name           = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
@@ -964,7 +964,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                }},
                /* fixme: Add radio support */
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
                .name           = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
@@ -981,7 +981,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 1,
                }},
                /* fixme: Add radio support */
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
                .name           = "digitalnow DNTV Live! DVB-T Pro",
@@ -1008,7 +1008,7 @@ struct cx88_board cx88_boards[] = {
                         .type  = CX88_RADIO,
                         .gpio0 = 0xf80808,
                },
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_KWORLD_DVB_T_CX22702] = {
                /* Kworld V-stream Xpert DVB-T with Thomson tuner */
@@ -1030,7 +1030,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0x0700,
                        .gpio2  = 0x0101,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
                .name           = "DViCO FusionHDTV DVB-T Dual Digital",
@@ -1047,7 +1047,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x000067df,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
                /* FIXME: Audio not working for s-video / composite inputs. */
@@ -1075,7 +1075,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0x3de6,
                        .gpio2  = 0x00ff,
                },
-               .blackbird      = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
                .name           = "DViCO FusionHDTV DVB-T Hybrid",
@@ -1096,7 +1096,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x0000a75b,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_PCHDTV_HD5500] = {
                .name           = "pcHDTV HD5500 HDTV",
@@ -1118,7 +1118,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 2,
                        .gpio0  = 0x87f9,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_KWORLD_MCE200_DELUXE] = {
                /* FIXME: tested TV input only, disabled composite,
@@ -1134,7 +1134,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 0,
                        .gpio0  = 0x0000BDE6
                }},
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
                /* FIXME: SVideo, Composite and FM inputs are untested */
@@ -1150,7 +1150,7 @@ struct cx88_board cx88_boards[] = {
                        .vmux   = 0,
                        .gpio0  = 0x5da6,
                }},
-               .blackbird = 1,
+               .mpeg           = CX88_MPEG_BLACKBIRD,
        },
        [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
                .name           = "NPG Tech Real TV FM Top 10",
@@ -1192,7 +1192,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio2  = 0x00017304,
                        .gpio3  = 0x02000000,
                }},
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_GENIATECH_DVBS] = {
                .name          = "Geniatech DVB-S",
@@ -1207,7 +1207,7 @@ struct cx88_board cx88_boards[] = {
                        .type  = CX88_VMUX_COMPOSITE1,
                        .vmux  = 1,
                }},
-               .dvb      = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
        [CX88_BOARD_HAUPPAUGE_HVR3000] = {
                /* FIXME: Add dvb & radio support */
@@ -1287,6 +1287,7 @@ struct cx88_board cx88_boards[] = {
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .tda9887_conf   = TDA9887_PRESENT,
+               .audio_chip     = AUDIO_CHIP_WM8775,
                .input          = {{
                        .type   = CX88_VMUX_TELEVISION,
                        .vmux   = 0,
@@ -1301,7 +1302,7 @@ struct cx88_board cx88_boards[] = {
                        .gpio0  = 0xe780,
                }},
                /* fixme: Add radio support */
-               .dvb            = 1,
+               .mpeg           = CX88_MPEG_DVB,
        },
 };
 const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
@@ -1581,6 +1582,14 @@ struct cx88_subid cx88_subids[] = {
                .subvendor = 0x107d,
                .subdevice = 0x6632,
                .card      = CX88_BOARD_LEADTEK_PVR2000,
+       },{
+               .subvendor = 0x12ab,
+               .subdevice = 0x2300, /* Club3D Zap TV2100 */
+               .card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
+       },{
+               .subvendor = 0x0070,
+               .subdevice = 0x9000,
+               .card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
        },
 };
 const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
index f379ede3049a5cfce78002b62f83346b9e72e52c..4b655f2ef27880038222e9795302887571325086 100644 (file)
@@ -658,13 +658,6 @@ static unsigned int inline norm_fsc8(struct cx88_tvnorm *norm)
        return (norm->id & V4L2_STD_625_50) ? pal : ntsc;
 }
 
-static unsigned int inline norm_notchfilter(struct cx88_tvnorm *norm)
-{
-       return (norm->id & V4L2_STD_625_50)
-               ? HLNotchFilter135PAL
-               : HLNotchFilter135NTSC;
-}
-
 static unsigned int inline norm_htotal(struct cx88_tvnorm *norm)
 {
        /* Should always be Line Draw Time / (4*FSC) */
@@ -937,7 +930,7 @@ int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm)
        // htotal
        tmp64 = norm_htotal(norm) * (u64)vdec_clock;
        do_div(tmp64, fsc8);
-       htotal = (u32)tmp64 | (norm_notchfilter(norm) << 11);
+       htotal = (u32)tmp64 | (HLNotchFilter4xFsc << 11);
        dprintk(1,"set_tvnorm: MO_HTOTAL        0x%08x [old=0x%08x,htotal=%d]\n",
                htotal, cx_read(MO_HTOTAL), (u32)tmp64);
        cx_write(MO_HTOTAL, htotal);
index c87041dee21e7d677b835fdc6683da01e1a110ef..bd0c8797f26d6289898dcf1de0e5480a4b02c7b6 100644 (file)
@@ -802,7 +802,7 @@ static int __devinit dvb_probe(struct pci_dev *pci_dev,
                return -EINVAL;
 
        err = -ENODEV;
-       if (!cx88_boards[core->board].dvb)
+       if (!(cx88_boards[core->board].mpeg & CX88_MPEG_DVB))
                goto fail_core;
 
        err = -ENOMEM;
index 27b5dbb2ca1a12d5ddb33a6249987f6f4947ea7a..88af23a938702335697fb18bb1ce33526fa79dad 100644 (file)
@@ -145,7 +145,7 @@ void cx88_call_i2c_clients(struct cx88_core *core, unsigned int cmd, void *arg)
        if (0 != core->i2c_rc)
                return;
 
-       if (core->dvbdev) {
+       if ( (core->dvbdev) && (core->dvbdev->dvb.frontend) ) {
                if (core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl)
                        core->dvbdev->dvb.frontend->ops.i2c_gate_ctrl(core->dvbdev->dvb.frontend, 1);
 
@@ -220,7 +220,7 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci)
 
        if (core->tuner_type != TUNER_ABSENT)
                core->i2c_adap.class |= I2C_CLASS_TV_ANALOG;
-       if (cx88_boards[core->board].dvb)
+       if (cx88_boards[core->board].mpeg & CX88_MPEG_DVB)
                core->i2c_adap.class |= I2C_CLASS_TV_DIGITAL;
 
        core->i2c_adap.dev.parent = &pci->dev;
index 138a4f692501786bcda6227baf75a62e20c84120..d6d980774c21bbbe20491f9a1d4c18a2488dfb3f 100644 (file)
@@ -65,8 +65,17 @@ static int cx8802_start_dma(struct cx8802_dev    *dev,
 
        /* FIXME: this needs a review.
         * also: move to cx88-blackbird + cx88-dvb source files? */
+       if (cx88_boards[core->board].mpeg == (CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD) ) {
+               /* Report a warning until the mini driver patch is applied,
+                * else the following conditions will set the dma registers incorrectly.
+                * This will be removed in the next major patch and changes to the conditions
+                * will be made.
+                */
+               printk(KERN_INFO "%s() board->(CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD) is invalid\n", __FUNCTION__);
+               return -EINVAL;
+       }
 
-       if (cx88_boards[core->board].dvb) {
+       if (cx88_boards[core->board].mpeg & CX88_MPEG_DVB) {
                /* negedge driven & software reset */
                cx_write(TS_GEN_CNTRL, 0x0040 | dev->ts_gen_cntrl);
                udelay(100);
@@ -92,7 +101,7 @@ static int cx8802_start_dma(struct cx8802_dev    *dev,
                udelay(100);
        }
 
-       if (cx88_boards[core->board].blackbird) {
+       if (cx88_boards[core->board].mpeg & CX88_MPEG_BLACKBIRD) {
                cx_write(MO_PINMUX_IO, 0x88); /* enable MPEG parallel IO */
 
                cx_write(TS_GEN_CNTRL, 0x46); /* punctured clock TS & posedge driven & software reset */
index 741e7c5e69ec7085d2d68cb53f05dddef74ad9e1..58ba9f773524605833a7bdc0b6267ba149b0d025 100644 (file)
@@ -142,7 +142,7 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
        cx_write(AUD_RATE_THRES_DMD, 0x000000C0);
        cx88_start_audio_dma(core);
 
-       if (cx88_boards[core->board].blackbird) {
+       if (cx88_boards[core->board].mpeg & CX88_MPEG_BLACKBIRD) {
                /* sets sound input from external adc */
                switch (core->board) {
                case CX88_BOARD_HAUPPAUGE_ROSLYN:
@@ -164,7 +164,7 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
                cx_write(AUD_I2SCNTL, 0);
                /* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
        }
-       if ((always_analog) || (!cx88_boards[core->board].blackbird)) {
+       if ((always_analog) || (!(cx88_boards[core->board].mpeg & CX88_MPEG_BLACKBIRD))) {
                ctl |= EN_DAC_ENABLE;
                cx_write(AUD_CTL, ctl);
        }
index fbc79e9842aa70299c2d4b98147805eaffdc2996..cb0c0eea20f956e392ddfac737e87116e1f4b0f6 100644 (file)
@@ -1928,6 +1928,9 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
        if (TUNER_ABSENT != core->tuner_type)
                request_module("tuner");
 
+       if (cx88_boards[ core->board ].audio_chip == AUDIO_CHIP_WM8775)
+               request_module("wm8775");
+
        /* register v4l devices */
        dev->video_dev = cx88_vdev_init(core,dev->pci,
                                        &cx8800_video_template,"video");
index 89f12e273b7f83a5ac7f47e241028e321f9dd839..3bc91aad4fe5df80b4d3d9bcea67ce3807b71462 100644 (file)
@@ -30,6 +30,7 @@
 #include <media/tveeprom.h>
 #include <media/video-buf.h>
 #include <media/cx2341x.h>
+#include <media/audiochip.h>
 #include <media/video-buf-dvb.h>
 
 #include "btcx-risc.h"
 #include <linux/mutex.h>
 #define CX88_VERSION_CODE KERNEL_VERSION(0,0,6)
 
-#ifndef TRUE
-# define TRUE (1==1)
-#endif
-#ifndef FALSE
-# define FALSE (1==0)
-#endif
 #define UNSET (-1U)
 
 #define CX88_MAXBOARDS 8
@@ -73,6 +68,12 @@ enum cx88_deemph_type {
        FM_DEEMPH_75
 };
 
+enum cx88_board_type {
+       CX88_BOARD_NONE = 0,
+       CX88_MPEG_DVB,
+       CX88_MPEG_BLACKBIRD
+};
+
 /* ----------------------------------------------------------- */
 /* tv norms                                                    */
 
@@ -230,8 +231,8 @@ struct cx88_board {
        int                     tda9887_conf;
        struct cx88_input       input[MAX_CX88_INPUT];
        struct cx88_input       radio;
-       unsigned int            blackbird:1;
-       unsigned int            dvb:1;
+       enum cx88_board_type    mpeg;
+       enum audiochip          audio_chip;
 };
 
 struct cx88_subid {
index fba30a40e9c6fface92fe3909314e64fefd39057..1457b1602221d9d9d430ae3445c5314dd6472a97 100644 (file)
@@ -64,23 +64,32 @@ MODULE_PARM_DESC(hauppauge, "Specify Hauppauge remote: 0=black, 1=grey (defaults
 static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
 {
        unsigned char buf[3];
-       int start, toggle, dev, code;
+       int start, range, toggle, dev, code;
 
        /* poll IR chip */
        if (3 != i2c_master_recv(&ir->c,buf,3))
                return -EIO;
 
        /* split rc5 data block ... */
-       start  = (buf[0] >> 6) &    3;
+       start  = (buf[0] >> 7) &    1;
+       range  = (buf[0] >> 6) &    1;
        toggle = (buf[0] >> 5) &    1;
        dev    =  buf[0]       & 0x1f;
        code   = (buf[1] >> 2) & 0x3f;
 
-       if (3 != start)
+       /* rc5 has two start bits
+        * the first bit must be one
+        * the second bit defines the command range (1 = 0-63, 0 = 64 - 127)
+        */
+       if (!start)
                /* no key pressed */
                return 0;
-       dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
-               start, toggle, dev, code);
+
+       if (!range)
+               code += 64;
+
+       dprintk(1,"ir hauppauge (rc5): s%d r%d t%d dev=%d code=%d\n",
+               start, range, toggle, dev, code);
 
        /* return key */
        *ir_key = code;
index 56246b8578f32039d68c7098d70598b33fe7db1f..cf43df3fe708c8eeba0fb4da03ab61b2fe5f7f7d 100644 (file)
@@ -904,6 +904,8 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
        state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1;
        /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */
        state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2;
+       /* The msp343xG supports BTSC only and cannot do Automatic Standard Detection. */
+       state->force_btsc = msp_family == 3 && msp_revision == 'G' && msp_prod_hi == 3;
 
        state->opmode = opmode;
        if (state->opmode == OPMODE_AUTO) {
index 545e4ac094f2e2dd513a275a8a730db4fdbe83bb..7531efa1615e726d57ece12fbe11cb35e0fa3bf5 100644 (file)
@@ -64,6 +64,7 @@ struct msp_state {
        u8 has_sound_processing;
        u8 has_virtual_dolby_surround;
        u8 has_dolby_pro_logic;
+       u8 force_btsc;
 
        int radio;
        int opmode;
index ed02ff81138865c27b7b28a80a455af34aae313d..4c7f85b566a0ad222013e3f1871f4973e76dc859 100644 (file)
@@ -960,9 +960,10 @@ int msp34xxg_thread(void *data)
 
                /* setup the chip*/
                msp34xxg_reset(client);
-               state->std = state->radio ? 0x40 : msp_standard;
-               /* start autodetect */
+               state->std = state->radio ? 0x40 :
+                       (state->force_btsc && msp_standard == 1) ? 32 : msp_standard;
                msp_write_dem(client, 0x20, state->std);
+               /* start autodetect */
                if (state->std != 1)
                        goto unmute;
 
index a52171ef6134ca6bf77c1c82f3f972e65209e9e5..5645c9318890d6c701f3bfb9aed7729830fa42fb 100644 (file)
@@ -18,8 +18,8 @@ config VIDEO_PVRUSB2_29XXX
        select VIDEO_SAA711X
        select VIDEO_MSP3400
        ---help---
-         This option enables support for WinTV-PVR USB2 devices whose 
-         model number is of the form "29xxx" (leading prefix of "29" 
+         This option enables support for WinTV-PVR USB2 devices whose
+         model number is of the form "29xxx" (leading prefix of "29"
          followed by 3 digits).
          To see if you may need this option, examine the white
          sticker on the underside of your device.
@@ -37,14 +37,9 @@ config VIDEO_PVRUSB2_24XXX
          form "24xxx" (leading prefix of "24" followed by 3 digits).
          To see if you may need this option, examine the white
          sticker on the underside of your device.  Enabling this
-         option will not harm support for older devices, however it
-         is a separate option because of the experimental nature of
-         this new feature.
+         option will not harm support for older devices.
 
-         If you are in doubt, say N.
-
-         Note: This feature is _very_ experimental.  You have been
-         warned.
+         If you are in doubt, say Y.
 
 config VIDEO_PVRUSB2_SYSFS
        bool "pvrusb2 sysfs support (EXPERIMENTAL)"
index 88604365777c32c936bec578935ce3337ceb2dd5..3d8cd0daf6a9314d1dbc1a37194a57d7a05ac510 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/slab.h>
 #include <linux/firmware.h>
 #include <linux/videodev2.h>
+#include <media/v4l2-common.h>
 #include <asm/semaphore.h>
 #include "pvrusb2.h"
 #include "pvrusb2-std.h"
@@ -3131,6 +3132,42 @@ static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
 }
 
 
+int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
+                            u32 chip_id,unsigned long reg_id,
+                            int setFl,u32 *val_ptr)
+{
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       struct list_head *item;
+       struct pvr2_i2c_client *cp;
+       struct v4l2_register req;
+       int stat = 0;
+       int okFl = 0;
+
+       req.i2c_id = chip_id;
+       req.reg = reg_id;
+       if (setFl) req.val = *val_ptr;
+       mutex_lock(&hdw->i2c_list_lock); do {
+               list_for_each(item,&hdw->i2c_clients) {
+                       cp = list_entry(item,struct pvr2_i2c_client,list);
+                       if (cp->client->driver->id != chip_id) continue;
+                       stat = pvr2_i2c_client_cmd(
+                               cp,(setFl ? VIDIOC_INT_S_REGISTER :
+                                   VIDIOC_INT_G_REGISTER),&req);
+                       if (!setFl) *val_ptr = req.val;
+                       okFl = !0;
+                       break;
+               }
+       } while (0); mutex_unlock(&hdw->i2c_list_lock);
+       if (okFl) {
+               return stat;
+       }
+       return -EINVAL;
+#else
+       return -ENOSYS;
+#endif
+}
+
+
 /*
   Stuff for Emacs to see, in order to encourage consistent editing style:
   *** Local Variables: ***
index fd931b5da490b4bc66c8538923ac80eb98cd118a..29979bb2a7689fd3d43bb9d2f5634ade6fb4c1c1 100644 (file)
@@ -211,6 +211,14 @@ int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *);
 /* Store the v4l minor device number */
 void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,int);
 
+/* Direct read/write access to chip's registers:
+   chip_id - unique id of chip (e.g. I2C_DRIVERD_xxxx)
+   reg_id  - register number to access
+   setFl   - true to set the register, false to read it
+   val_ptr - storage location for source / result. */
+int pvr2_hdw_register_access(struct pvr2_hdw *,
+                            u32 chip_id,unsigned long reg_id,
+                            int setFl,u32 *val_ptr);
 
 /* The following entry points are all lower level things you normally don't
    want to worry about. */
index ed3e8105292a23b807c5267e1216ab851d524821..05121666b9ba5c6a516dcf76023c7a4602ac8401 100644 (file)
@@ -19,6 +19,7 @@
  *
  */
 
+#include <linux/kernel.h>
 #include "pvrusb2-i2c-core.h"
 #include "pvrusb2-hdw-internal.h"
 #include "pvrusb2-debug.h"
@@ -89,7 +90,8 @@ void pvr2_i2c_probe(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp)
 
 const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx)
 {
-       if (idx >= sizeof(ops)/sizeof(ops[0])) return 0;
+       if (idx >= ARRAY_SIZE(ops))
+               return NULL;
        return ops[idx];
 }
 
index 3608c2f81df912fa91a6bc33a7db57691d452cd9..97e974d9b9c34ba8b215f0a61eb9a04f96e34008 100644 (file)
 #include "pvrusb2-v4l2.h"
 #include "pvrusb2-ioread.h"
 #include <linux/videodev2.h>
+#include <media/v4l2-dev.h>
 #include <media/v4l2-common.h>
 
 struct pvr2_v4l2_dev;
 struct pvr2_v4l2_fh;
 struct pvr2_v4l2;
 
-/* V4L no longer provide the ability to set / get a private context pointer
-   (i.e. video_get_drvdata / video_set_drvdata), which means we have to
-   concoct our own context locating mechanism.  Supposedly this is intended
-   to simplify driver implementation.  It's not clear to me how that can
-   possibly be true.  Our solution here is to maintain a lookup table of
-   our context instances, indexed by the minor device number of the V4L
-   device.  See pvr2_v4l2_open() for some implications of this approach. */
-static struct pvr2_v4l2_dev *devices[256];
-static DEFINE_MUTEX(device_lock);
-
 struct pvr2_v4l2_dev {
+       struct video_device devbase; /* MUST be first! */
        struct pvr2_v4l2 *v4lp;
-       struct video_device *vdev;
        struct pvr2_context_stream *stream;
-       int ctxt_idx;
        enum pvr2_config config;
 };
 
@@ -74,7 +64,7 @@ struct pvr2_v4l2 {
        struct v4l2_prio_state prio;
 
        /* streams */
-       struct pvr2_v4l2_dev video_dev;
+       struct pvr2_v4l2_dev *vdev;
 };
 
 static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
@@ -671,6 +661,20 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
                ret = 0;
                break;
        }
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       case VIDIOC_INT_G_REGISTER:
+       case VIDIOC_INT_S_REGISTER:
+       {
+               u32 val;
+               struct v4l2_register *req = (struct v4l2_register *)arg;
+               if (cmd == VIDIOC_INT_S_REGISTER) val = req->val;
+               ret = pvr2_hdw_register_access(
+                       hdw,req->i2c_id,req->reg,
+                       cmd == VIDIOC_INT_S_REGISTER,&val);
+               if (cmd == VIDIOC_INT_G_REGISTER) req->val = val;
+               break;
+       }
+#endif
 
        default :
                ret = v4l_compat_translate_ioctl(inode,file,cmd,
@@ -704,21 +708,22 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
 {
        printk(KERN_INFO "pvrusb2: unregistering device video%d [%s]\n",
-              dip->vdev->minor,pvr2_config_get_name(dip->config));
-       if (dip->ctxt_idx >= 0) {
-               mutex_lock(&device_lock);
-               devices[dip->ctxt_idx] = NULL;
-               dip->ctxt_idx = -1;
-               mutex_unlock(&device_lock);
-       }
-       video_unregister_device(dip->vdev);
+              dip->devbase.minor,pvr2_config_get_name(dip->config));
+
+       /* Paranoia */
+       dip->v4lp = 0;
+       dip->stream = 0;
+
+       /* Actual deallocation happens later when all internal references
+          are gone. */
+       video_unregister_device(&dip->devbase);
 }
 
 
 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
 {
        pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,-1);
-       pvr2_v4l2_dev_destroy(&vp->video_dev);
+       pvr2_v4l2_dev_destroy(vp->vdev);
 
        pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp);
        pvr2_channel_done(&vp->channel);
@@ -726,6 +731,14 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
 }
 
 
+static void pvr2_video_device_release(struct video_device *vdev)
+{
+       struct pvr2_v4l2_dev *dev;
+       dev = container_of(vdev,struct pvr2_v4l2_dev,devbase);
+       kfree(dev);
+}
+
+
 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
 {
        struct pvr2_v4l2 *vp;
@@ -797,40 +810,12 @@ static int pvr2_v4l2_release(struct inode *inode, struct file *file)
 
 static int pvr2_v4l2_open(struct inode *inode, struct file *file)
 {
-       struct pvr2_v4l2_dev *dip = NULL; /* Our own context pointer */
+       struct pvr2_v4l2_dev *dip; /* Our own context pointer */
        struct pvr2_v4l2_fh *fhp;
        struct pvr2_v4l2 *vp;
        struct pvr2_hdw *hdw;
 
-       mutex_lock(&device_lock);
-       /* MCI 7-Jun-2006 Even though we're just doing what amounts to an
-          atomic read of the device mapping array here, we still need the
-          mutex.  The problem is that there is a tiny race possible when
-          we register the device.  We can't update the device mapping
-          array until after the device has been registered, owing to the
-          fact that we can't know the minor device number until after the
-          registration succeeds.  And if another thread tries to open the
-          device in the window of time after registration but before the
-          map is updated, then it will get back an erroneous null pointer
-          and the open will result in a spurious failure.  The only way to
-          prevent that is to (a) be inside the mutex here before we access
-          the array, and (b) cover the entire registration process later
-          on with this same mutex.  Thus if we get inside the mutex here,
-          then we can be assured that the registration process actually
-          completed correctly.  This is an unhappy complication from the
-          use of global data in a driver that lives in a preemptible
-          environment.  It sure would be nice if the video device itself
-          had a means for storing and retrieving a local context pointer.
-          Oh wait.  It did.  But now it's gone.  Silly me. */
-       {
-               unsigned int midx = iminor(file->f_dentry->d_inode);
-               if (midx < sizeof(devices)/sizeof(devices[0])) {
-                       dip = devices[midx];
-               }
-       }
-       mutex_unlock(&device_lock);
-
-       if (!dip) return -ENODEV; /* Should be impossible but I'm paranoid */
+       dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
 
        vp = dip->v4lp;
        hdw = vp->channel.hdw;
@@ -1060,38 +1045,24 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
                return;
        }
 
-       dip->vdev = video_device_alloc();
-       if (!dip->vdev) {
-               err("Alloc of pvrusb2 v4l video device failed");
-               return;
-       }
-
-       memcpy(dip->vdev,&vdev_template,sizeof(vdev_template));
-       dip->vdev->release = video_device_release;
-       mutex_lock(&device_lock);
+       memcpy(&dip->devbase,&vdev_template,sizeof(vdev_template));
+       dip->devbase.release = pvr2_video_device_release;
 
        mindevnum = -1;
        unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw);
        if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
                mindevnum = video_nr[unit_number];
        }
-       if ((video_register_device(dip->vdev, v4l_type, mindevnum) < 0) &&
-           (video_register_device(dip->vdev, v4l_type, -1) < 0)) {
+       if ((video_register_device(&dip->devbase, v4l_type, mindevnum) < 0) &&
+           (video_register_device(&dip->devbase, v4l_type, -1) < 0)) {
                err("Failed to register pvrusb2 v4l video device");
        } else {
                printk(KERN_INFO "pvrusb2: registered device video%d [%s]\n",
-                      dip->vdev->minor,pvr2_config_get_name(dip->config));
-       }
-
-       if ((dip->vdev->minor < sizeof(devices)/sizeof(devices[0])) &&
-           (devices[dip->vdev->minor] == NULL)) {
-               dip->ctxt_idx = dip->vdev->minor;
-               devices[dip->ctxt_idx] = dip;
+                      dip->devbase.minor,pvr2_config_get_name(dip->config));
        }
-       mutex_unlock(&device_lock);
 
        pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
-                                       dip->vdev->minor);
+                                       dip->devbase.minor);
 }
 
 
@@ -1102,15 +1073,19 @@ struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
        vp = kmalloc(sizeof(*vp),GFP_KERNEL);
        if (!vp) return vp;
        memset(vp,0,sizeof(*vp));
-       vp->video_dev.ctxt_idx = -1;
+       vp->vdev = kmalloc(sizeof(*vp->vdev),GFP_KERNEL);
+       if (!vp->vdev) {
+               kfree(vp);
+               return 0;
+       }
+       memset(vp->vdev,0,sizeof(*vp->vdev));
        pvr2_channel_init(&vp->channel,mnp);
        pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp);
 
        vp->channel.check_func = pvr2_v4l2_internal_check;
 
        /* register streams */
-       pvr2_v4l2_dev_init(&vp->video_dev,vp,pvr2_config_mpeg);
-
+       pvr2_v4l2_dev_init(vp->vdev,vp,pvr2_config_mpeg);
 
        return vp;
 }
index aa1db509f3d477ec895a42c33a90b21ebe976787..fe3c83ca3de3b2af716c64e5afc3d1cd35e17911 100644 (file)
@@ -2965,6 +2965,35 @@ struct saa7134_board saa7134_boards[] = {
                        .amux = LINE1,
                },
        },
+       [SAA7134_BOARD_AVERMEDIA_A16AR] = {
+               /* Petr Baudis <pasky@ucw.cz> */
+               .name           = "AVerMedia TV Hybrid A16AR",
+               .audio_clock    = 0x187de7,
+               .tuner_type     = TUNER_PHILIPS_TDA8290, /* untested */
+               .radio_type     = TUNER_TEA5767, /* untested */
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .tda9887_conf   = TDA9887_PRESENT,
+               .mpeg           = SAA7134_MPEG_DVB,
+               .inputs         = {{
+                       .name = name_tv,
+                       .vmux = 1,
+                       .amux = TV,
+                       .tv   = 1,
+               },{
+                       .name = name_comp1,
+                       .vmux = 3,
+                       .amux = LINE2,
+               },{
+                       .name = name_svideo,
+                       .vmux = 8,
+                       .amux = LINE1,
+               }},
+               .radio = {
+                       .name = name_radio,
+                       .amux = LINE1,
+               },
+       },
 };
 
 const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -3561,6 +3590,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subvendor    = 0x0919, /* Philips Proteus PRO 2309 */
                .subdevice    = 0x2003,
                .driver_data  = SAA7134_BOARD_PROTEUS_2309,
+       },{
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+               .subvendor    = 0x1461,
+               .subdevice    = 0x2c00,
+               .driver_data  = SAA7134_BOARD_AVERMEDIA_A16AR,
        },{
                /* --- boards without eeprom + subsystem ID --- */
                .vendor       = PCI_VENDOR_ID_PHILIPS,
@@ -3703,6 +3738,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
                saa_writeb(SAA7134_GPIO_GPMODE3, 0x08);
                saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00);
                break;
+       case SAA7134_BOARD_AVERMEDIA_A16AR:
        case SAA7134_BOARD_AVERMEDIA_CARDBUS:
                /* power-up tuner chip */
                saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   0xffffffff, 0xffffffff);
index b6881541e704ab0192834af210a33d2594009d2e..fb741fa465a500effd4dd193f7aad4175309340c 100644 (file)
@@ -1055,6 +1055,7 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_AVERMEDIA_777:
+       case SAA7134_BOARD_AVERMEDIA_A16AR:
                printk("%s: avertv 777 dvb setup\n",dev->name);
                dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
                                               &dev->i2c_adap);
index f7ea857d5d73e540eda9913bab293de9450b5d7a..ff5991136f4ec409b0c5ecd03b7dcfbe957fde9d 100644 (file)
@@ -185,6 +185,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
        case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
        case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
        case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
+       case SAA7134_BOARD_AVERMEDIA_A16AR:
                ir_codes     = ir_codes_avermedia;
                mask_keycode = 0x0007C8;
                mask_keydown = 0x000010;
index 7db7b970595388865d3374918b2c3d7ae0a17a34..701a90942108d2946c8e04b6e4336923713b95a8 100644 (file)
@@ -226,6 +226,7 @@ struct saa7134_format {
 #define SAA7134_BOARD_MEDION_MD8800_QUADRO 96
 #define SAA7134_BOARD_FLYDVBS_LR300 97
 #define SAA7134_BOARD_PROTEUS_2309 98
+#define SAA7134_BOARD_AVERMEDIA_A16AR   99
 
 #define SAA7134_MAXBOARDS 8
 #define SAA7134_INPUT_MAX 8
index acc5ea936687a02ed7b52b049b2c894a828daa74..f429f49901b9a0394980f1aea61f2715eb9ddc63 100644 (file)
@@ -365,7 +365,12 @@ videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb,
                if (NULL == fbuf)
                        return -EINVAL;
                /* FIXME: need sanity checks for vb->boff */
-               bus   = (dma_addr_t)fbuf->base + vb->boff;
+               /*
+                * Using a double cast to avoid compiler warnings when
+                * building for PAE. Compiler doesn't like direct casting
+                * of a 32 bit ptr to 64 bit integer.
+                */
+               bus   = (dma_addr_t)(unsigned long)fbuf->base + vb->boff;
                pages = PAGE_ALIGN(vb->size) >> PAGE_SHIFT;
                err = videobuf_dma_init_overlay(&vb->dma,PCI_DMA_FROMDEVICE,
                                                bus, pages);
index 78c35ec463624d2c4d337f9dbd2d2c2a25701301..1e5ccdad3b0213db17810f813b649357a147aa17 100644 (file)
 #define  MACH_MOMENCO_JAGUAR_ATX 3
 #define  MACH_MOMENCO_OCELOT_3 4
 
-/*
- * Valid machtype for group ITE
- */
-#define MACH_GROUP_ITE         13      /* ITE Semi Eval Boards         */
-#define  MACH_QED_4N_S01B      0       /* ITE8172 based eval board */
-
 /*
  * Valid machtype for group PHILIPS
  */
 #define  MACH_PHILIPS_VELO     1       /* Velo */
 #define  MACH_PHILIPS_JBS      2       /* JBS */
 
-/*
- * Valid machtype for group Globespan
- */
-#define MACH_GROUP_GLOBESPAN   15      /* Globespan */
-#define  MACH_IVR              0       /* IVR eval board */
-
 /*
  * Valid machtype for group SIBYTE
  */
diff --git a/include/asm-mips/it8172/it8172.h b/include/asm-mips/it8172/it8172.h
deleted file mode 100644 (file)
index 8f23af0..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     IT8172 system controller defines.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __IT8172__H__
-#define __IT8172__H__
-
-#include <asm/addrspace.h>
-
-#define IT8172_BASE                    0x18000000
-#define IT8172_PCI_IO_BASE             0x14000000
-#define IT8172_PCI_MEM_BASE            0x10000000
-
-// System registers offsets from IT8172_BASE
-#define IT_CMFPCR                      0x0
-#define IT_DSRR                                0x2
-#define IT_PCDCR                       0x4
-#define IT_SPLLCR                      0x6
-#define IT_CIDR                                0x10
-#define IT_CRNR                                0x12
-#define IT_CPUTR                       0x14
-#define IT_CTCR                                0x16
-#define IT_SDPR                                0xF0
-
-// Power management register offset from IT8172_PCI_IO_BASE
-// Power Management Device Standby Register
-#define IT_PM_DSR              0x15800
-
-#define IT_PM_DSR_TMR0SB       0x0001
-#define IT_PM_DSR_TMR1SB       0x0002
-#define IT_PM_DSR_CIR0SB       0x0004
-#define IT_PM_DSR_CIR1SB       0x0008
-#define IT_PM_DSR_SCR0SB       0x0010
-#define IT_PM_DSR_SCR1SB       0x0020
-#define IT_PM_DSR_PPSB         0x0040
-#define IT_PM_DSR_I2CSB                0x0080
-#define IT_PM_DSR_UARTSB       0x0100
-#define IT_PM_DSR_IDESB                0x0200
-#define IT_PM_DSR_ACSB         0x0400
-#define IT_PM_DSR_M68KSB       0x0800
-
-// Power Management PCI Device Software Reset Register
-#define IT_PM_PCISR             0x15802
-
-#define IT_PM_PCISR_IDESR       0x0001
-#define IT_PM_PCISR_CDMASR      0x0002
-#define IT_PM_PCISR_USBSR       0x0004
-#define IT_PM_PCISR_DMASR       0x0008
-#define IT_PM_PCISR_ACSR        0x0010
-#define IT_PM_PCISR_MEMSR       0x0020
-#define IT_PM_PCISR_68KSR       0x0040
-
-
-// PCI Configuration address and data register offsets
-// from IT8172_BASE
-#define IT_CONFADDR                    0x4000
-#define IT_BUSNUM_SHF                   16
-#define IT_DEVNUM_SHF                   11
-#define IT_FUNCNUM_SHF                  8
-#define IT_REGNUM_SHF                   2
-
-#define IT_CONFDATA                    0x4004
-
-// PCI configuration header common register offsets
-#define IT_VID                         0x00
-#define IT_DID                         0x02
-#define IT_PCICMD                      0x04
-#define IT_PCISTS                      0x06
-#define IT_RID                         0x08
-#define IT_CLASSC                      0x09
-#define IT_HEADT                       0x0E
-#define IT_SERIRQC                     0x49
-
-// PCI to Internal/LPC Bus Bridge configuration header register offset
-#define IT_P2I_BCR                             0x4C
-#define IT_P2I_D0IOSC                          0x50
-#define IT_P2I_D1IOSC                          0x54
-#define IT_P2I_D2IOSC                          0x58
-#define IT_P2I_D3IOSC                          0x5C
-#define IT_P2I_D4IOSC                          0x60
-#define IT_P2I_D5IOSC                          0x64
-#define IT_P2I_D6IOSC                          0x68
-#define IT_P2I_D7IOSC                          0x6C
-#define IT_P2I_D8IOSC                          0x70
-#define IT_P2I_D9IOSC                          0x74
-#define IT_P2I_D10IOSC                         0x78
-#define IT_P2I_D11IOSC                         0x7C
-
-// Memory controller register offsets from IT8172_BASE
-#define IT_MC_SDRMR                                    0x1000
-#define IT_MC_SDRTR                                    0x1004
-#define IT_MC_MCR                                      0x1008
-#define IT_MC_SDTYPE                                   0x100C
-#define IT_MC_WPBA                                     0x1010
-#define IT_MC_WPTA                                     0x1014
-#define IT_MC_HATR                                     0x1018
-#define IT_MC_PCICR                                    0x101C
-
-// Flash/ROM control register offsets from IT8172_BASE
-#define IT_FC_BRCR                                     0x2000
-#define IT_FC_FCR                                      0x2004
-#define IT_FC_DCR                                      0x2008
-
-// M68K interface bridge configuration header register offset
-#define IT_M68K_MBCSR                                  0x54
-#define IT_M68K_TMR                                    0x58
-#define IT_M68K_BCR                                    0x5C
-#define IT_M68K_BSR                                    0x5D
-#define IT_M68K_DTR                                    0x5F
-
-// Register offset from IT8172_PCI_IO_BASE
-// These registers are accessible through 8172 PCI IO window.
-
-// INTC
-#define IT_INTC_BASE                           0x10000
-#define IT_INTC_LBDNIRR                                0x10000
-#define IT_INTC_LBDNIMR                                0x10002
-#define IT_INTC_LBDNITR                                0x10004
-#define IT_INTC_LBDNIAR                                0x10006
-#define IT_INTC_LPCNIRR                                0x10010
-#define IT_INTC_LPCNIMR                                0x10012
-#define IT_INTC_LPCNITR                                0x10014
-#define IT_INTC_LPCNIAR                                0x10016
-#define IT_INTC_PDNIRR                         0x10020
-#define IT_INTC_PDNIMR                         0x10022
-#define IT_INTC_PDNITR                         0x10024
-#define IT_INTC_PDNIAR                         0x10026
-#define IT_INTC_UMNIRR                         0x10030
-#define IT_INTC_UMNITR                         0x10034
-#define IT_INTC_UMNIAR                         0x10036
-#define IT_INTC_TYPER                          0x107FE
-
-// IT8172 PCI device number
-#define IT_C2P_DEVICE                          0
-#define IT_AUDIO_DEVICE                                1
-#define IT_DMAC_DEVICE                         1
-#define IT_CDMAC_DEVICE                                1
-#define IT_USB_DEVICE                          1
-#define IT_P2I_DEVICE                          1
-#define IT_IDE_DEVICE                          1
-#define IT_M68K_DEVICE                         1
-
-// IT8172 PCI function number
-#define IT_C2P_FUNCION                         0
-#define IT_AUDIO_FUNCTION                      0
-#define IT_DMAC_FUNCTION                       1
-#define IT_CDMAC_FUNCTION                      2
-#define IT_USB_FUNCTION                                3
-#define IT_P2I_FUNCTION                                4
-#define IT_IDE_FUNCTION                                5
-#define IT_M68K_FUNCTION                       6
-
-// IT8172 GPIO
-#define IT_GPADR                               0x13800
-#define IT_GPBDR                               0x13808
-#define IT_GPCDR                               0x13810
-#define IT_GPACR                               0x13802
-#define IT_GPBCR                               0x1380A
-#define IT_GPCCR                               0x13812
-#define IT_GPAICR                              0x13804
-#define IT_GPBICR                              0x1380C
-#define IT_GPCICR                              0x13814
-#define IT_GPAISR                              0x13806
-#define IT_GPBISR                              0x1380E
-#define IT_GPCISR                              0x13816
-#define IT_GCR                                 0x13818
-
-// IT8172 RTC
-#define IT_RTC_BASE                            0x14800
-#define IT_RTC_CENTURY                         0x14808
-
-#define IT_RTC_RIR0                            0x00
-#define IT_RTC_RTR0                            0x01
-#define IT_RTC_RIR1                            0x02
-#define IT_RTC_RTR1                            0x03
-#define IT_RTC_RIR2                            0x04
-#define IT_RTC_RTR2                            0x05
-#define IT_RTC_RCTR                            0x08
-#define IT_RTC_RA                              0x0A
-#define IT_RTC_RB                              0x0B
-#define IT_RTC_RC                              0x0C
-#define IT_RTC_RD                              0x0D
-
-#define RTC_SEC_INDEX                          0x00
-#define RTC_MIN_INDEX                          0x02
-#define RTC_HOUR_INDEX                         0x04
-#define RTC_DAY_INDEX                          0x06
-#define RTC_DATE_INDEX                         0x07
-#define RTC_MONTH_INDEX                                0x08
-#define RTC_YEAR_INDEX                         0x09
-
-// IT8172 internal device registers
-#define IT_TIMER_BASE                          0x10800
-#define IT_CIR0_BASE                           0x11000
-#define IT_UART_BASE                           0x11800
-#define IT_SCR0_BASE                           0x12000
-#define IT_SCR1_BASE                           0x12800
-#define IT_PP_BASE                             0x13000
-#define IT_I2C_BASE                            0x14000
-#define IT_CIR1_BASE                           0x15000
-
-// IT8172 Smart Card Reader offsets from IT_SCR*_BASE
-#define IT_SCR_SFR                             0x08
-#define IT_SCR_SCDR                            0x09
-
-// IT8172 IT_SCR_SFR bit definition & mask
-#define        IT_SCR_SFR_GATE_UART                    0x40
-#define        IT_SCR_SFR_GATE_UART_BIT                6
-#define IT_SCR_SFR_GATE_UART_OFF               0
-#define        IT_SCR_SFR_GATE_UART_ON                 1
-#define        IT_SCR_SFR_FET_CHARGE                   0x30
-#define        IT_SCR_SFR_FET_CHARGE_BIT               4
-#define IT_SCR_SFR_FET_CHARGE_3_3_US           3
-#define IT_SCR_SFR_FET_CHARGE_13_US            2
-#define IT_SCR_SFR_FET_CHARGE_53_US            1
-#define IT_SCR_SFR_FET_CHARGE_213_US           0
-#define        IT_SCR_SFR_CARD_FREQ                    0x0C
-#define        IT_SCR_SFR_CARD_FREQ_BIT                2
-#define IT_SCR_SFR_CARD_FREQ_STOP              3
-#define IT_SCR_SFR_CARD_FREQ_3_5_MHZ           0
-#define IT_SCR_SFR_CARD_FREQ_7_1_MHZ           2
-#define IT_SCR_SFR_CARD_FREQ_96_DIV_MHZ                1
-#define        IT_SCR_SFR_FET_ACTIVE                   0x02
-#define        IT_SCR_SFR_FET_ACTIVE_BIT               1
-#define IT_SCR_SFR_FET_ACTIVE_INVERT           0
-#define IT_SCR_SFR_FET_ACTIVE_NONINVERT                1
-#define        IT_SCR_SFR_ENABLE                       0x01
-#define        IT_SCR_SFR_ENABLE_BIT                   0
-#define IT_SCR_SFR_ENABLE_OFF                  0
-#define IT_SCR_SFR_ENABLE_ON                   1
-
-// IT8172 IT_SCR_SCDR bit definition & mask
-#define        IT_SCR_SCDR_RESET_MODE                  0x80
-#define        IT_SCR_SCDR_RESET_MODE_BIT              7
-#define        IT_SCR_SCDR_RESET_MODE_ASYNC            0
-#define IT_SCR_SCDR_RESET_MODE_SYNC            1
-#define        IT_SCR_SCDR_DIVISOR                     0x7F
-#define        IT_SCR_SCDR_DIVISOR_BIT                 0
-#define        IT_SCR_SCDR_DIVISOR_STOP_VAL_1          0x00
-#define        IT_SCR_SCDR_DIVISOR_STOP_VAL_2          0x01
-#define        IT_SCR_SCDR_DIVISOR_STOP_VAL_3          0x7F
-
-// IT8172 DMA
-#define IT_DMAC_BASE                           0x16000
-#define IT_DMAC_BCAR0                          0x00
-#define IT_DMAC_BCAR1                          0x04
-#define IT_DMAC_BCAR2                          0x08
-#define IT_DMAC_BCAR3                          0x0C
-#define IT_DMAC_BCCR0                          0x02
-#define IT_DMAC_BCCR1                          0x06
-#define IT_DMAC_BCCR2                          0x0a
-#define IT_DMAC_BCCR3                          0x0e
-#define IT_DMAC_CR                             0x10
-#define IT_DMAC_SR                             0x12
-#define IT_DMAC_ESR                            0x13
-#define IT_DMAC_RQR                            0x14
-#define IT_DMAC_MR                             0x16
-#define IT_DMAC_EMR                            0x17
-#define IT_DMAC_MKR                            0x18
-#define IT_DMAC_PAR0                           0x20
-#define IT_DMAC_PAR1                           0x22
-#define IT_DMAC_PAR2                           0x24
-#define IT_DMAC_PAR3                           0x26
-
-// IT8172 IDE
-#define IT_IDE_BASE                            0x17800
-#define IT_IDE_STATUS                          0x1F7
-
-// IT8172 Audio Controller
-#define IT_AC_BASE                             0x17000
-#define        IT_AC_PCMOV                             0x00
-#define IT_AC_FMOV                             0x02
-#define        IT_AC_I2SV                              0x04
-#define IT_AC_DRSS                             0x06
-#define IT_AC_PCC                              0x08
-#define IT_AC_PCDL                             0x0A
-#define IT_AC_PCB1STA                          0x0C
-#define IT_AC_PCB2STA                          0x10
-#define IT_AC_CAPCC                            0x14
-#define IT_AC_CAPCDL                           0x16
-#define IT_AC_CAPB1STA                         0x18
-#define IT_AC_CAPB2STA                         0x1C
-#define IT_AC_CODECC                           0x22
-#define IT_AC_I2SMC                            0x24
-#define IT_AC_VS                               0x26
-#define IT_AC_SRCS                             0x28
-#define IT_AC_CIRCP                            0x2A
-#define IT_AC_CIRDP                            0x2C
-#define IT_AC_TM                               0x4A
-#define IT_AC_PFDP                             0x4C
-#define IT_AC_GC                               0x54
-#define IT_AC_IMC                              0x56
-#define IT_AC_ISC                              0x5B
-#define IT_AC_OPL3SR                           0x68
-#define IT_AC_OPL3DWDR                         0x69
-#define IT_AC_OPL3AB1W                         0x6A
-#define IT_AC_OPL3DW                           0x6B
-#define IT_AC_BPDC                             0x70
-
-
-// IT8172 Timer
-#define IT_TIMER_BASE                          0x10800
-#define        TIMER_TCVR0                             0x00
-#define TIMER_TRVR0                            0x02
-#define        TIMER_TCR0                              0x04
-#define TIMER_TIRR                             0x06
-#define        TIMER_TCVR1                             0x08
-#define TIMER_TRVR1                            0x0A
-#define        TIMER_TCR1                              0x0C
-#define TIMER_TIDR                             0x0E
-
-
-#define IT_WRITE(ofs, data) *(volatile u32 *)KSEG1ADDR((IT8172_BASE+ofs)) = data
-#define IT_READ(ofs, data)  data = *(volatile u32 *)KSEG1ADDR((IT8172_BASE+ofs))
-
-#define IT_IO_WRITE(ofs, data) *(volatile u32 *)KSEG1ADDR((IT8172_PCI_IO_BASE+ofs)) = data
-#define IT_IO_READ(ofs, data)  data = *(volatile u32 *)KSEG1ADDR((IT8172_PCI_IO_BASE+ofs))
-
-#define IT_IO_WRITE16(ofs, data) *(volatile u16 *)KSEG1ADDR((IT8172_PCI_IO_BASE+ofs)) = data
-#define IT_IO_READ16(ofs, data)  data = *(volatile u16 *)KSEG1ADDR((IT8172_PCI_IO_BASE+ofs))
-
-#endif
diff --git a/include/asm-mips/it8172/it8172_cir.h b/include/asm-mips/it8172/it8172_cir.h
deleted file mode 100644 (file)
index 6a1dbd2..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     IT8172 Consumer IR port defines.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#define NUM_CIR_PORTS 2
-
-/* Master Control Register */
-#define CIR_RESET              0x1
-#define CIR_FIFO_CLEAR         0x2
-#define CIR_SET_FIFO_TL(x)     (((x)&0x3)<<2)
-#define CIR_ILE                0x10
-#define CIR_ILSEL              0x20
-
-/* Interrupt Enable Register */
-#define CIR_TLDLIE             0x1
-#define CIR_RDAIE              0x2
-#define CIR_RFOIE              0x4
-#define CIR_IEC                0x80
-
-/* Interrupt Identification Register */
-#define CIR_TLDLI              0x1
-#define CIR_RDAI               0x2
-#define CIR_RFOI               0x4
-#define CIR_NIP                0x80
-
-/* Carrier Frequency Register */
-#define CIR_SET_CF(x)          ((x)&0x1f)
-  #define CFQ_38_480           0xB       /* 38 KHz low, 480 KHz high */
-#define CIR_HCFS               0x20
-  #define CIR_SET_HS(x)        (((x)&0x1)<<5)
-
-
-/* Receiver Control Register */
-#define CIR_SET_RXDCR(x)       ((x)&0x7)
-#define CIR_RXACT              0x8
-#define CIR_RXEND              0x10
-#define CIR_RDWOS              0x20
-  #define CIR_SET_RDWOS(x)     (((x)&0x1)<<5)
-#define CIR_RXEN               0x80
-
-/* Transmitter Control Register */
-#define CIR_SET_TXMPW(x)       ((x)&0x7)
-#define CIR_SET_TXMPM(x)       (((x)&0x3)<<3)
-#define CIR_TXENDF             0x20
-#define CIR_TXRLE              0x40
-
-/* Receiver FIFO Status Register */
-#define CIR_RXFBC_MASK         0x3f
-#define CIR_RXFTO              0x80
-
-/* Wakeup Code Length Register */
-#define CIR_SET_WCL            ((x)&0x3f)
-#define CIR_WCL_MASK(x)        ((x)&0x3f)
-
-/* Wakeup Power Control/Status Register */
-#define CIR_BTMON              0x2
-#define CIR_CIRON              0x4
-#define CIR_RCRST              0x10
-#define CIR_WCRST              0x20
-
-struct cir_port {
-       int port;
-       unsigned short baud_rate;
-       unsigned char fifo_tl;
-       unsigned char cfq;
-       unsigned char hcfs;
-       unsigned char rdwos;
-       unsigned char rxdcr;
-};
-
-struct it8172_cir_regs {
-       unsigned char dr;       /* data                        */
-       char pad;
-       unsigned char mstcr;    /* master control              */
-       char pad1;
-       unsigned char ier;      /* interrupt enable            */
-       char pad2;
-       unsigned char iir;      /* interrupt identification    */
-       char pad3;
-       unsigned char cfr;      /* carrier frequency           */
-       char pad4;
-       unsigned char rcr;      /* receiver control            */
-       char pad5;
-       unsigned char tcr;      /* transmitter control         */
-       char pad6;
-       char pad7;
-       char pad8;
-       unsigned char bdlr;     /* baud rate divisor low byte  */
-       char pad9;
-       unsigned char bdhr;     /* baud rate divisor high byte */
-       char pad10;
-       unsigned char tfsr;     /* tx fifo byte count          */
-       char pad11;
-       unsigned char rfsr;     /* rx fifo status              */
-       char pad12;
-       unsigned char wcl;      /* wakeup code length          */
-       char pad13;
-       unsigned char wcr;      /* wakeup code read/write      */
-       char pad14;
-       unsigned char wps;      /* wakeup power control/status */
-};
-
-int cir_port_init(struct cir_port *cir);
-extern void clear_fifo(struct cir_port *cir);
-extern void enable_receiver(struct cir_port *cir);
-extern void disable_receiver(struct cir_port *cir);
-extern void enable_rx_demodulation(struct cir_port *cir);
-extern void disable_rx_demodulation(struct cir_port *cir);
-extern void set_rx_active(struct cir_port *cir);
-extern void int_enable(struct cir_port *cir);
-extern void rx_int_enable(struct cir_port *cir);
-extern char get_int_status(struct cir_port *cir);
-extern int cir_get_rx_count(struct cir_port *cir);
-extern char cir_read_data(struct cir_port *cir);
diff --git a/include/asm-mips/it8172/it8172_dbg.h b/include/asm-mips/it8172/it8172_dbg.h
deleted file mode 100644 (file)
index f404ec7..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Function prototypes for low level uart routines to
- *     directly access a 16550 uart.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/types.h>
-
-extern void putch(const unsigned char c);
-extern void puts(unsigned char *cp);
-extern void fputs(unsigned char *cp);
-extern void put64(uint64_t ul);
-extern void put32(unsigned u);
diff --git a/include/asm-mips/it8172/it8172_int.h b/include/asm-mips/it8172/it8172_int.h
deleted file mode 100644 (file)
index 837e83a..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     ITE 8172 Interrupt Numbering
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _MIPS_ITEINT_H
-#define _MIPS_ITEINT_H
-
-/*
- * Here's the "strategy":
- * We number the LPC serial irqs from 0 to 15,
- * the local bus irqs from 16 to 31,
- * the pci dev register interrupts from 32 to 47,
- * and the non-maskable ints from 48 to 53.
- */
-
-#define IT8172_LPC_IRQ_BASE  0    /* first LPC int number */
-#define IT8172_SERIRQ_0      (IT8172_LPC_IRQ_BASE + 0)
-#define IT8172_SERIRQ_1      (IT8172_LPC_IRQ_BASE + 1)
-#define IT8172_SERIRQ_2      (IT8172_LPC_IRQ_BASE + 2)
-#define IT8172_SERIRQ_3      (IT8172_LPC_IRQ_BASE + 3)
-#define IT8172_SERIRQ_4      (IT8172_LPC_IRQ_BASE + 4)
-#define IT8172_SERIRQ_5      (IT8172_LPC_IRQ_BASE + 5)
-#define IT8172_SERIRQ_6      (IT8172_LPC_IRQ_BASE + 6)
-#define IT8172_SERIRQ_7      (IT8172_LPC_IRQ_BASE + 7)
-#define IT8172_SERIRQ_8      (IT8172_LPC_IRQ_BASE + 8)
-#define IT8172_SERIRQ_9      (IT8172_LPC_IRQ_BASE + 9)
-#define IT8172_SERIRQ_10     (IT8172_LPC_IRQ_BASE + 10)
-#define IT8172_SERIRQ_11     (IT8172_LPC_IRQ_BASE + 11)
-#define IT8172_SERIRQ_12     (IT8172_LPC_IRQ_BASE + 12)
-#define IT8172_SERIRQ_13     (IT8172_LPC_IRQ_BASE + 13)
-#define IT8172_SERIRQ_14     (IT8172_LPC_IRQ_BASE + 14)
-#define IT8172_SERIRQ_15     (IT8172_LPC_IRQ_BASE + 15)
-
-#define IT8172_LB_IRQ_BASE  16   /* first local bus int number */
-#define IT8172_PPR_IRQ          (IT8172_LB_IRQ_BASE + 0) /* parallel port */
-#define IT8172_TIMER0_IRQ       (IT8172_LB_IRQ_BASE + 1)
-#define IT8172_TIMER1_IRQ       (IT8172_LB_IRQ_BASE + 2)
-#define IT8172_I2C_IRQ          (IT8172_LB_IRQ_BASE + 3)
-#define IT8172_GPIO_IRQ         (IT8172_LB_IRQ_BASE + 4)
-#define IT8172_CIR0_IRQ         (IT8172_LB_IRQ_BASE + 5)
-#define IT8172_CIR1_IRQ         (IT8172_LB_IRQ_BASE + 6)
-#define IT8172_UART_IRQ         (IT8172_LB_IRQ_BASE + 7)
-#define IT8172_SCR0_IRQ         (IT8172_LB_IRQ_BASE + 8)
-#define IT8172_SCR1_IRQ         (IT8172_LB_IRQ_BASE + 9)
-#define IT8172_RTC_IRQ          (IT8172_LB_IRQ_BASE + 10)
-#define IT8172_IOCHK_IRQ        (IT8172_LB_IRQ_BASE + 11)
-/* 12 - 15 reserved */
-
-/*
- * Note here that the pci dev registers includes bits for more than
- * just the pci devices.
- */
-#define IT8172_PCI_DEV_IRQ_BASE  32   /* first pci dev irq */
-#define IT8172_AC97_IRQ          (IT8172_PCI_DEV_IRQ_BASE + 0)
-#define IT8172_MC68K_IRQ         (IT8172_PCI_DEV_IRQ_BASE + 1)
-#define IT8172_IDE_IRQ           (IT8172_PCI_DEV_IRQ_BASE + 2)
-#define IT8172_USB_IRQ           (IT8172_PCI_DEV_IRQ_BASE + 3)
-#define IT8172_BRIDGE_MASTER_IRQ (IT8172_PCI_DEV_IRQ_BASE + 4)
-#define IT8172_BRIDGE_TARGET_IRQ (IT8172_PCI_DEV_IRQ_BASE + 5)
-#define IT8172_PCI_INTA_IRQ      (IT8172_PCI_DEV_IRQ_BASE + 6)
-#define IT8172_PCI_INTB_IRQ      (IT8172_PCI_DEV_IRQ_BASE + 7)
-#define IT8172_PCI_INTC_IRQ      (IT8172_PCI_DEV_IRQ_BASE + 8)
-#define IT8172_PCI_INTD_IRQ      (IT8172_PCI_DEV_IRQ_BASE + 9)
-#define IT8172_S_INTA_IRQ        (IT8172_PCI_DEV_IRQ_BASE + 10)
-#define IT8172_S_INTB_IRQ        (IT8172_PCI_DEV_IRQ_BASE + 11)
-#define IT8172_S_INTC_IRQ        (IT8172_PCI_DEV_IRQ_BASE + 12)
-#define IT8172_S_INTD_IRQ        (IT8172_PCI_DEV_IRQ_BASE + 13)
-#define IT8172_CDMA_IRQ          (IT8172_PCI_DEV_IRQ_BASE + 14)
-#define IT8172_DMA_IRQ           (IT8172_PCI_DEV_IRQ_BASE + 15)
-
-#define IT8172_NMI_IRQ_BASE      48
-#define IT8172_SER_NMI_IRQ       (IT8172_NMI_IRQ_BASE + 0)
-#define IT8172_PCI_NMI_IRQ       (IT8172_NMI_IRQ_BASE + 1)
-#define IT8172_RTC_NMI_IRQ       (IT8172_NMI_IRQ_BASE + 2)
-#define IT8172_CPUIF_NMI_IRQ     (IT8172_NMI_IRQ_BASE + 3)
-#define IT8172_PMER_NMI_IRQ      (IT8172_NMI_IRQ_BASE + 4)
-#define IT8172_POWER_NMI_IRQ     (IT8172_NMI_IRQ_BASE + 5)
-
-#define IT8172_LAST_IRQ          (IT8172_POWER_NMI_IRQ)
-/* Finally, let's move over here the mips cpu timer interrupt.
- */
-#define MIPS_CPU_TIMER_IRQ       (NR_IRQS-1)
-
-/*
- * IT8172 Interrupt Controller Registers
- */
-struct it8172_intc_regs {
-        volatile unsigned short lb_req;      /* offset 0 */
-        volatile unsigned short lb_mask;
-        volatile unsigned short lb_trigger;
-        volatile unsigned short lb_level;
-       unsigned char pad0[8];
-
-        volatile unsigned short lpc_req;     /* offset 0x10 */
-        volatile unsigned short lpc_mask;
-        volatile unsigned short lpc_trigger;
-        volatile unsigned short lpc_level;
-       unsigned char pad1[8];
-
-        volatile unsigned short pci_req;     /* offset 0x20 */
-        volatile unsigned short pci_mask;
-        volatile unsigned short pci_trigger;
-        volatile unsigned short pci_level;
-       unsigned char pad2[8];
-
-        volatile unsigned short nmi_req;     /* offset 0x30 */
-        volatile unsigned short nmi_mask;
-        volatile unsigned short nmi_trigger;
-        volatile unsigned short nmi_level;
-       unsigned char pad3[6];
-
-        volatile unsigned short nmi_redir;   /* offset 0x3E */
-       unsigned char pad4[0xBE];
-
-        volatile unsigned short intstatus;    /* offset 0xFE */
-};
-
-#endif /* _MIPS_ITEINT_H */
diff --git a/include/asm-mips/it8172/it8172_pci.h b/include/asm-mips/it8172/it8172_pci.h
deleted file mode 100644 (file)
index 42c61f5..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     IT8172 system controller specific pci defines.
- *
- * Copyright 2000 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _8172PCI_H_
-#define _8172PCI_H_
-
-// PCI configuration space Type0
-#define        PCI_IDREG       0x00
-#define        PCI_CMDSTSREG   0x04
-#define        PCI_CLASSREG    0x08
-#define        PCI_BHLCREG     0x0C
-#define        PCI_BASE1REG    0x10
-#define        PCI_BASE2REG    0x14
-#define        PCI_BASE3REG    0x18
-#define        PCI_BASE4REG    0x1C
-#define        PCI_BASE5REG    0x20
-#define        PCI_BASE6REG    0x24
-#define        PCI_ROMBASEREG  0x30
-#define        PCI_INTRREG     0x3C
-
-// PCI configuration space Type1
-#define        PCI_BUSNOREG    0x18
-
-#define        IT_PCI_VENDORID(x)      ((x) & 0xFFFF)
-#define        IT_PCI_DEVICEID(x)      (((x)>>16) & 0xFFFF)
-
-// Command register
-#define        PCI_CMD_IOEN            0x00000001
-#define        PCI_CMD_MEMEN           0x00000002
-#define        PCI_CMD_BUSMASTER       0x00000004
-#define        PCI_CMD_SPCYCLE         0x00000008
-#define        PCI_CMD_WRINV           0x00000010
-#define        PCI_CMD_VGASNOOP        0x00000020
-#define        PCI_CMD_PERR            0x00000040
-#define        PCI_CMD_WAITCTRL        0x00000080
-#define        PCI_CMD_SERR            0x00000100
-#define        PCI_CMD_FAST_BACKTOBACK 0x00000200
-
-// Status register
-#define        PCI_STS_66MHZ           0x00200000
-#define        PCI_STS_SUPPORT_UDF     0x00400000
-#define        PCI_STS_FAST_BACKTOBACK 0x00800000
-#define        PCI_STS_DATA_PERR       0x01000000
-#define        PCI_STS_DEVSEL0         0x02000000
-#define        PCI_STS_DEVSEL1         0x04000000
-#define        PCI_STS_SIG_TGTABORT    0x08000000
-#define        PCI_STS_RCV_TGTABORT    0x10000000
-#define        PCI_STS_RCV_MSTABORT    0x20000000
-#define        PCI_STS_SYSERR          0x40000000
-#define        PCI_STS_DETCT_PERR      0x80000000
-
-#define        IT_PCI_CLASS(x)         (((x)>>24) & 0xFF)
-#define        IT_PCI_SUBCLASS(x)              (((x)>>16) & 0xFF)
-#define        IT_PCI_INTERFACE(x)     (((x)>>8) & 0xFF)
-#define        IT_PCI_REVISION(x)              ((x) & 0xFF)
-
-// PCI class code
-#define        PCI_CLASS_BRIDGE                        0x06
-
-// bridge subclass
-#define        PCI_SUBCLASS_BRIDGE_HOST                0x00
-#define        PCI_SUBCLASS_BRIDGE_PCI                 0x04
-
-// BHLCREG
-#define        IT_PCI_BIST(x)          (((x)>>24) & 0xFF)
-#define        IT_PCI_HEADERTYPE(x)    (((x)>>16) & 0xFF)
-#define        IT_PCI_LATENCYTIMER(x)  (((x)>>8) & 0xFF)
-#define        IT_PCI_CACHELINESIZE(x) ((x) & 0xFF)
-
-#define        PCI_MULTIFUNC   0x80
-
-// INTRREG
-#define        IT_PCI_MAXLAT(x)                (((x)>>24) & 0xFF)
-#define        IT_PCI_MINGNT(x)                (((x)>>16) & 0xFF)
-#define        IT_PCI_INTRPIN(x)               (((x)>>8) & 0xFF)
-#define        IT_PCI_INTRLINE(x)              ((x) & 0xFF)
-
-#define        PCI_VENDOR_NEC  0x1033
-#define PCI_VENDOR_DEC 0x1101
-
-#endif // _8172PCI_H_
diff --git a/include/asm-mips/it8712.h b/include/asm-mips/it8712.h
deleted file mode 100644 (file)
index ca2dee0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#ifndef __IT8712_H__
-#define __IT8712_H__
-
-#define LPC_BASE_ADDR  0x14000000
-
-// MB PnP configuration register
-#define LPC_KEY_ADDR   0x1400002E
-#define LPC_DATA_ADDR  0x1400002F
-
-// Device LDN
-#define LDN_SERIAL1    0x01
-#define LDN_SERIAL2    0x02
-#define LDN_PARALLEL   0x03
-#define LDN_KEYBOARD   0x05
-#define LDN_MOUSE      0x06
-
-#define IT8712_UART1_PORT      0x3F8
-#define IT8712_UART2_PORT      0x2F8
-
-#ifndef ASM_ONLY
-
-void LPCSetConfig(char LdnNumber, char Index, char data);
-char LPCGetConfig(char LdnNumber, char Index);
-
-#endif
-
-#endif
index 4fb0fc43ffd71af828d8362052612b32b7fcafc1..5f3a9075cd28eaf2d0ad432a22fcd805e6aa63dc 100644 (file)
@@ -44,9 +44,8 @@ struct pt_regs {
        unsigned long cp0_epc;
 #ifdef CONFIG_MIPS_MT_SMTC
        unsigned long cp0_tcstatus;
-       unsigned long smtc_pad;
 #endif /* CONFIG_MIPS_MT_SMTC */
-};
+} __attribute__ ((aligned (8)));
 
 /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
 #define PTRACE_GETREGS         12
index c882e04e1497ea71e86fd90af1950c3f7ac192be..d7a65135d837ec20056d81083929836dc0e2782e 100644 (file)
 #define EV64120_SERIAL_PORT_DEFNS
 #endif
 
-#ifdef CONFIG_MIPS_ITE8172
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_int.h>
-#include <asm/it8712.h>
-#define ITE_SERIAL_PORT_DEFNS                                  \
-    { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \
-      .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \
-    { .baud_base = (24000000/(16*13)), .port = (IT8172_PCI_IO_BASE + IT8712_UART1_PORT), \
-      .irq = IT8172_SERIRQ_4, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \
-    /* Smart Card Reader 0 */ \
-    { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR0_BASE), \
-      .irq = IT8172_SCR0_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \
-    /* Smart Card Reader 1 */ \
-    { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \
-      .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 },
-#else
-#define ITE_SERIAL_PORT_DEFNS
-#endif
-
-#ifdef CONFIG_MIPS_IVR
-#include <asm/it8172/it8172.h>
-#include <asm/it8172/it8172_int.h>
-#define IVR_SERIAL_PORT_DEFNS                                  \
-    { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \
-      .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 },         \
-    /* Smart Card Reader 1 */ \
-    { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \
-      .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 },
-#else
-#define IVR_SERIAL_PORT_DEFNS
-#endif
-
 #ifdef CONFIG_HAVE_STD_PC_SERIAL_PORT
 #define STD_SERIAL_PORT_DEFNS                  \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        DDB5477_SERIAL_PORT_DEFNS                       \
        EV64120_SERIAL_PORT_DEFNS                       \
        IP32_SERIAL_PORT_DEFNS                          \
-       ITE_SERIAL_PORT_DEFNS                           \
-       IVR_SERIAL_PORT_DEFNS                           \
        JAZZ_SERIAL_PORT_DEFNS                          \
        STD_SERIAL_PORT_DEFNS                           \
        MOMENCO_OCELOT_G_SERIAL_PORT_DEFNS              \
diff --git a/include/linux/ite_gpio.h b/include/linux/ite_gpio.h
deleted file mode 100644 (file)
index b123a14..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * FILE NAME ite_gpio.h
- *
- * BRIEF MODULE DESCRIPTION
- *     Generic gpio.
- *
- *  Author: MontaVista Software, Inc.  <source@mvista.com>
- *          Hai-Pao Fan <haipao@mvista.com>
- *
- * Copyright 2001 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __ITE_GPIO_H
-#define __ITE_GPIO_H
-
-#include <linux/ioctl.h>
-
-struct ite_gpio_ioctl_data {
-       __u32 device;
-       __u32 mask;
-       __u32 data;
-};
-
-#define ITE_GPIO_IOCTL_BASE    'Z'
-
-#define ITE_GPIO_IN            _IOWR(ITE_GPIO_IOCTL_BASE, 0, struct ite_gpio_ioctl_data)
-#define ITE_GPIO_OUT           _IOW (ITE_GPIO_IOCTL_BASE, 1, struct ite_gpio_ioctl_data)
-#define        ITE_GPIO_INT_CTRL       _IOW (ITE_GPIO_IOCTL_BASE, 2, struct ite_gpio_ioctl_data)
-#define        ITE_GPIO_IN_STATUS      _IOW (ITE_GPIO_IOCTL_BASE, 3, struct ite_gpio_ioctl_data)
-#define        ITE_GPIO_OUT_STATUS     _IOW (ITE_GPIO_IOCTL_BASE, 4, struct ite_gpio_ioctl_data)
-#define ITE_GPIO_GEN_CTRL      _IOW (ITE_GPIO_IOCTL_BASE, 5, struct ite_gpio_ioctl_data)
-#define ITE_GPIO_INT_WAIT      _IOW (ITE_GPIO_IOCTL_BASE, 6, struct ite_gpio_ioctl_data)
-
-#define        ITE_GPIO_PORTA  0x01
-#define        ITE_GPIO_PORTB  0x02
-#define        ITE_GPIO_PORTC  0x04
-
-extern int ite_gpio_in(__u32 device, __u32 mask, volatile __u32 *data);
-extern int ite_gpio_out(__u32 device, __u32 mask, __u32 data);
-extern int ite_gpio_int_ctrl(__u32 device, __u32 mask, __u32 data);
-extern int ite_gpio_in_status(__u32 device, __u32 mask, volatile __u32 *data);
-extern int ite_gpio_out_status(__u32 device, __u32 mask, __u32 data);
-extern int ite_gpio_gen_ctrl(__u32 device, __u32 mask, __u32 data);
-extern int ite_gpio_int_wait(__u32 device, __u32 mask, __u32 data);
-
-#endif
index c9ffbc3843d57894d44474bf841664203d60091a..f069df2454699b408fa311d619cd9d3f780663da 100644 (file)
 #define PCI_VENDOR_ID_ROCKWELL         0x127A
 
 #define PCI_VENDOR_ID_ITE              0x1283
-#define PCI_DEVICE_ID_ITE_IT8172G      0x8172
-#define PCI_DEVICE_ID_ITE_IT8172G_AUDIO 0x0801
 #define PCI_DEVICE_ID_ITE_8211         0x8211
 #define PCI_DEVICE_ID_ITE_8212         0x8212
 #define PCI_DEVICE_ID_ITE_8872         0x8872
 #define PCI_DEVICE_ID_PANACOM_QUADMODEM        0x0400
 #define PCI_DEVICE_ID_PANACOM_DUALMODEM        0x0402
 
+#define PCI_VENDOR_ID_SIPACKETS                0x14d9
+#define PCI_DEVICE_ID_SP1011           0x0010
 
 #define PCI_VENDOR_ID_AFAVLAB          0x14db
 #define PCI_DEVICE_ID_AFAVLAB_P028     0x2180
 #define PCI_DEVICE_ID_FARSITE_TE1C      0x1612
 
 #define PCI_VENDOR_ID_SIBYTE           0x166d
+#define PCI_DEVICE_ID_BCM1250_PCI      0x0001
 #define PCI_DEVICE_ID_BCM1250_HT       0x0002
 
 #define PCI_VENDOR_ID_NETCELL          0x169c
index 44c59da26ed2673c10c62fc54e50712cd6f3cff5..c5fdf62595483430ea42dec5d483a6503e11c312 100644 (file)
@@ -276,6 +276,82 @@ struct v4l2_fmtdesc
 
 #define V4L2_FMT_FLAG_COMPRESSED 0x0001
 
+#if 1
+       /* Experimental Frame Size and frame rate enumeration */
+/*
+ *     F R A M E   S I Z E   E N U M E R A T I O N
+ */
+enum v4l2_frmsizetypes
+{
+       V4L2_FRMSIZE_TYPE_DISCRETE      = 1,
+       V4L2_FRMSIZE_TYPE_CONTINUOUS    = 2,
+       V4L2_FRMSIZE_TYPE_STEPWISE      = 3,
+};
+
+struct v4l2_frmsize_discrete
+{
+       __u32                   width;          /* Frame width [pixel] */
+       __u32                   height;         /* Frame height [pixel] */
+};
+
+struct v4l2_frmsize_stepwise
+{
+       __u32                   min_width;      /* Minimum frame width [pixel] */
+       __u32                   max_width;      /* Maximum frame width [pixel] */
+       __u32                   step_width;     /* Frame width step size [pixel] */
+       __u32                   min_height;     /* Minimum frame height [pixel] */
+       __u32                   max_height;     /* Maximum frame height [pixel] */
+       __u32                   step_height;    /* Frame height step size [pixel] */
+};
+
+struct v4l2_frmsizeenum
+{
+       __u32                   index;          /* Frame size number */
+       __u32                   pixel_format;   /* Pixel format */
+       __u32                   type;           /* Frame size type the device supports. */
+
+       union {                                 /* Frame size */
+               struct v4l2_frmsize_discrete    discrete;
+               struct v4l2_frmsize_stepwise    stepwise;
+       };
+
+       __u32   reserved[2];                    /* Reserved space for future use */
+};
+
+/*
+ *     F R A M E   R A T E   E N U M E R A T I O N
+ */
+enum v4l2_frmivaltypes
+{
+       V4L2_FRMIVAL_TYPE_DISCRETE      = 1,
+       V4L2_FRMIVAL_TYPE_CONTINUOUS    = 2,
+       V4L2_FRMIVAL_TYPE_STEPWISE      = 3,
+};
+
+struct v4l2_frmival_stepwise
+{
+       struct v4l2_fract       min;            /* Minimum frame interval [s] */
+       struct v4l2_fract       max;            /* Maximum frame interval [s] */
+       struct v4l2_fract       step;           /* Frame interval step size [s] */
+};
+
+struct v4l2_frmivalenum
+{
+       __u32                   index;          /* Frame format index */
+       __u32                   pixel_format;   /* Pixel format */
+       __u32                   width;          /* Frame width */
+       __u32                   height;         /* Frame height */
+       __u32                   type;           /* Frame interval type the device supports. */
+
+       union {                                 /* Frame interval */
+               struct v4l2_fract               discrete;
+               struct v4l2_frmival_stepwise    stepwise;
+       };
+
+       __u32   reserved[2];                    /* Reserved space for future use */
+};
+#endif
+
 /*
  *     T I M E C O D E
  */
@@ -1249,6 +1325,10 @@ struct v4l2_streamparm
 #define VIDIOC_G_EXT_CTRLS     _IOWR ('V', 71, struct v4l2_ext_controls)
 #define VIDIOC_S_EXT_CTRLS     _IOWR ('V', 72, struct v4l2_ext_controls)
 #define VIDIOC_TRY_EXT_CTRLS   _IOWR ('V', 73, struct v4l2_ext_controls)
+#if 1
+#define VIDIOC_ENUM_FRAMESIZES _IOWR ('V', 74, struct v4l2_frmsizeenum)
+#define VIDIOC_ENUM_FRAMEINTERVALS     _IOWR ('V', 75, struct v4l2_frmivalenum)
+#endif
 
 #ifdef __OLD_VIDIOC_
 /* for compatibility, will go away some day */
index 1fd4a2207574670846c9a85fbd43e99564d4e543..db8823d45a7d7936fc855706787bfce855cf723c 100644 (file)
@@ -18,7 +18,9 @@ enum audiochip {
        AUDIO_CHIP_TDA9874,
        AUDIO_CHIP_PIC16C54,
        /* Provided by msp3400.c */
-       AUDIO_CHIP_MSP34XX
+       AUDIO_CHIP_MSP34XX,
+       /* Provided by wm8775.c */
+       AUDIO_CHIP_WM8775
 };
 
 #endif /* AUDIOCHIP_H */
index f08396c3f61a8c2d5287dfb0728d212c08c39570..cc2b9ab7f4e5355d490aeebff240240b2a9446f1 100644 (file)
@@ -115,10 +115,6 @@ config SOUND_HAL2
          Say Y or M if you have an SGI Indy or Indigo2 system and want to be able to
          use its on-board A2 audio system.
 
-config SOUND_IT8172
-       tristate "IT8172G Sound"
-       depends on SOUND_PRIME && (MIPS_ITE8172 || MIPS_IVR)
-
 config SOUND_VRC5477
        tristate "NEC Vrc5477 AC97 sound"
        depends on SOUND_PRIME && DDB5477
index 9bf3ee544d86e62987c2d23e20bea83b5bfcd0c2..86811792002f82194783d8e191528ad49e34360c 100644 (file)
@@ -77,7 +77,6 @@ obj-$(CONFIG_SOUND_BCM_CS4297A)       += swarm_cs4297a.o
 obj-$(CONFIG_SOUND_RME96XX)     += rme96xx.o
 obj-$(CONFIG_SOUND_BT878)      += btaudio.o
 obj-$(CONFIG_SOUND_ALI5455)    += ali5455.o ac97_codec.o
-obj-$(CONFIG_SOUND_IT8172)     += ite8172.o ac97_codec.o
 obj-$(CONFIG_SOUND_FORTE)      += forte.o ac97_codec.o
 
 obj-$(CONFIG_SOUND_AD1980)     += ac97_plugin_ad1980.o ac97_codec.o
diff --git a/sound/oss/ite8172.c b/sound/oss/ite8172.c
deleted file mode 100644 (file)
index 68aab36..0000000
+++ /dev/null
@@ -1,2261 +0,0 @@
-/*
- *      ite8172.c  --  ITE IT8172G Sound Driver.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             stevel@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- * Module command line parameters:
- *
- *  Supported devices:
- *  /dev/dsp    standard OSS /dev/dsp device
- *  /dev/mixer  standard OSS /dev/mixer device
- *
- * Notes:
- *
- *  1. Much of the OSS buffer allocation, ioctl's, and mmap'ing are
- *     taken, slightly modified or not at all, from the ES1371 driver,
- *     so refer to the credits in es1371.c for those. The rest of the
- *     code (probe, open, read, write, the ISR, etc.) is new.
- *  2. The following support is untested:
- *      * Memory mapping the audio buffers, and the ioctl controls that go
- *        with it.
- *      * S/PDIF output.
- *      * I2S support.
- *  3. The following is not supported:
- *      * legacy audio mode.
- *  4. Support for volume button interrupts is implemented but doesn't
- *     work yet.
- *
- *  Revision history
- *    02.08.2001  Initial release
- *    06.22.2001  Added I2S support
- *    07.30.2003  Removed initialisation to zero for static variables
- *                (spdif[NR_DEVICE], i2s_fmt[NR_DEVICE], and devindex)
- */
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-#include <linux/sound.h>
-#include <linux/slab.h>
-#include <linux/soundcard.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/poll.h>
-#include <linux/bitops.h>
-#include <linux/proc_fs.h>
-#include <linux/spinlock.h>
-#include <linux/smp_lock.h>
-#include <linux/ac97_codec.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/uaccess.h>
-#include <asm/it8172/it8172.h>
-
-/* --------------------------------------------------------------------- */
-
-#undef OSS_DOCUMENTED_MIXER_SEMANTICS
-#define IT8172_DEBUG
-#undef IT8172_VERBOSE_DEBUG
-#define DBG(x) {}
-
-#define IT8172_MODULE_NAME "IT8172 audio"
-#define PFX IT8172_MODULE_NAME
-
-#ifdef IT8172_DEBUG
-#define dbg(format, arg...) printk(KERN_DEBUG PFX ": " format "\n" , ## arg)
-#else
-#define dbg(format, arg...) do {} while (0)
-#endif
-#define err(format, arg...) printk(KERN_ERR PFX ": " format "\n" , ## arg)
-#define info(format, arg...) printk(KERN_INFO PFX ": " format "\n" , ## arg)
-#define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg)
-
-
-#define IT8172_MODULE_NAME "IT8172 audio"
-#define PFX IT8172_MODULE_NAME
-
-#ifdef IT8172_DEBUG
-#define dbg(format, arg...) printk(KERN_DEBUG PFX ": " format "\n" , ## arg)
-#else
-#define dbg(format, arg...) do {} while (0)
-#endif
-#define err(format, arg...) printk(KERN_ERR PFX ": " format "\n" , ## arg)
-#define info(format, arg...) printk(KERN_INFO PFX ": " format "\n" , ## arg)
-#define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg)
-
-
-static const unsigned sample_shift[] = { 0, 1, 1, 2 };
-
-
-/*
- * Audio Controller register bit definitions follow. See
- * include/asm/it8172/it8172.h for register offsets.
- */
-
-/* PCM Out Volume Reg */
-#define PCMOV_PCMOM    (1<<15) /* PCM Out Mute default 1: mute */
-#define        PCMOV_PCMRCG_BIT 8      /* PCM Right channel Gain */
-#define        PCMOV_PCMRCG_MASK (0x1f<<PCMOV_PCMRCG_BIT)
-#define PCMOV_PCMLCG_BIT 0     /* PCM Left channel gain  */
-#define PCMOV_PCMLCG_MASK 0x1f
-
-/* FM Out Volume Reg */
-#define FMOV_FMOM       (1<<15)        /* FM Out Mute default 1: mute */
-#define        FMOV_FMRCG_BIT  8       /* FM Right channel Gain */
-#define        FMOV_FMRCG_MASK (0x1f<<FMOV_FMRCG_BIT)
-#define FMOV_FMLCG_BIT 0       /* FM Left channel gain  */
-#define FMOV_FMLCG_MASK 0x1f
-
-/* I2S Out Volume Reg */
-#define I2SV_I2SOM      (1<<15) /* I2S Out Mute default 1: mute */
-#define        I2SV_I2SRCG_BIT  8       /* I2S Right channel Gain */
-#define        I2SV_I2SRCG_MASK (0x1f<<I2SV_I2SRCG_BIT)
-#define I2SV_I2SLCG_BIT         0       /* I2S Left channel gain  */
-#define I2SV_I2SLCG_MASK 0x1f
-
-/* Digital Recording Source Select Reg */
-#define        DRSS_BIT   0
-#define        DRSS_MASK  0x07
-#define   DRSS_AC97_PRIM 0
-#define   DRSS_FM        1
-#define   DRSS_I2S       2
-#define   DRSS_PCM       3
-#define   DRSS_AC97_SEC  4
-
-/* Playback/Capture Channel Control Registers */
-#define        CC_SM           (1<<15) /* Stereo, Mone 0: mono 1: stereo */
-#define        CC_DF           (1<<14) /* Data Format 0: 8 bit 1: 16 bit */
-#define CC_FMT_BIT      14
-#define CC_FMT_MASK     (0x03<<CC_FMT_BIT)
-#define CC_CF_BIT       12      /* Channel format (Playback only) */
-#define CC_CF_MASK      (0x03<<CC_CF_BIT)
-#define          CC_CF_2       0
-#define   CC_CF_4      (1<<CC_CF_BIT)
-#define   CC_CF_6      (2<<CC_CF_BIT)
-#define CC_SR_BIT       8       /* sample Rate */
-#define CC_SR_MASK      (0x0f<<CC_SR_BIT)
-#define          CC_SR_5500    0
-#define          CC_SR_8000    (1<<CC_SR_BIT)
-#define          CC_SR_9600    (2<<CC_SR_BIT)
-#define          CC_SR_11025   (3<<CC_SR_BIT)
-#define          CC_SR_16000   (4<<CC_SR_BIT)
-#define          CC_SR_19200   (5<<CC_SR_BIT)
-#define          CC_SR_22050   (6<<CC_SR_BIT)
-#define          CC_SR_32000   (7<<CC_SR_BIT)
-#define          CC_SR_38400   (8<<CC_SR_BIT)
-#define          CC_SR_44100   (9<<CC_SR_BIT)
-#define          CC_SR_48000   (10<<CC_SR_BIT)
-#define        CC_CSP          (1<<7)  /* Channel stop 
-                                * 0: End of Current buffer
-                                * 1: Immediately stop when rec stop */
-#define CC_CP          (1<<6)  /* Channel pause 0: normal, 1: pause */
-#define        CC_CA           (1<<5)  /* Channel Action 0: Stop , 1: start */
-#define        CC_CB2L         (1<<2)  /* Cur. buf. 2 xfr is last 0: No, 1: Yes */
-#define CC_CB1L         (1<<1) /* Cur. buf. 1 xfr is last 0: No, 1: Yes */
-#define CC_DE          1       /* DFC/DFIFO Data Empty 1: empty, 0: not empty
-                                * (Playback only)
-                                */
-
-/* Codec Control Reg */
-#define CODECC_GME     (1<<9)  /* AC97 GPIO Mode enable */
-#define        CODECC_ATM      (1<<8)  /* AC97 ATE test mode 0: test 1: normal */
-#define        CODECC_WR       (1<<6)  /* AC97 Warn reset 1: warm reset , 0: Normal */
-#define        CODECC_CR       (1<<5)  /* AC97 Cold reset 1: Cold reset , 0: Normal */
-
-
-/* I2S Control Reg     */
-#define        I2SMC_SR_BIT     6      /* I2S Sampling rate 
-                                * 00: 48KHz, 01: 44.1 KHz, 10: 32 32 KHz */
-#define        I2SMC_SR_MASK    (0x03<<I2SMC_SR_BIT)
-#define          I2SMC_SR_48000 0
-#define          I2SMC_SR_44100 (1<<I2SMC_SR_BIT)
-#define          I2SMC_SR_32000 (2<<I2SMC_SR_BIT)
-#define        I2SMC_SRSS       (1<<5) /* Sample Rate Source Select 1:S/W, 0: H/W */
-#define I2SMC_I2SF_BIT  0      /* I2S Format */
-#define I2SMC_I2SF_MASK  0x03
-#define   I2SMC_I2SF_DAC 0
-#define   I2SMC_I2SF_ADC 2
-#define   I2SMC_I2SF_I2S 3
-
-
-/* Volume up, Down, Mute */
-#define        VS_VMP  (1<<2)  /* Volume mute 1: pushed, 0: not */
-#define        VS_VDP  (1<<1)  /* Volume Down 1: pushed, 0: not */
-#define VS_VUP 1       /* Volime Up 1: pushed, 0: not */
-
-/* SRC, Mixer test control/DFC status reg */
-#define SRCS_DPUSC      (1<<5) /* DFC Playback underrun Status/clear */
-#define        SRCS_DCOSC      (1<<4)  /* DFC Capture Overrun Status/clear */
-#define SRCS_SIS       (1<<3)  /* SRC input select 1: Mixer, 0: Codec I/F */
-#define SRCS_CDIS_BIT  0       /* Codec Data Input Select */
-#define SRCS_CDIS_MASK  0x07
-#define   SRCS_CDIS_MIXER 0
-#define   SRCS_CDIS_PCM   1
-#define   SRCS_CDIS_I2S   2
-#define   SRCS_CDIS_FM    3
-#define   SRCS_CDIS_DFC   4
-
-
-/* Codec Index Reg command Port */
-#define CIRCP_CID_BIT   10
-#define CIRCP_CID_MASK  (0x03<<CIRCP_CID_BIT)
-#define CIRCP_CPS      (1<<9)  /* Command Port Status 0: ready, 1: busy */
-#define        CIRCP_DPVF      (1<<8)  /* Data Port Valid Flag 0: invalis, 1: valid */
-#define CIRCP_RWC      (1<<7)  /* Read/write command */
-#define CIRCP_CIA_BIT   0
-#define CIRCP_CIA_MASK  0x007F /* Codec Index Address */
-
-/* Test Mode Control/Test group Select Control */
-
-/* General Control Reg */
-#define GC_VDC_BIT     6       /* Volume Division Control */
-#define GC_VDC_MASK     (0x03<<GC_VDC_BIT)
-#define   GC_VDC_NONE   0
-#define   GC_VDC_DIV2   (1<<GC_VDC_BIT)
-#define   GC_VDC_DIV4   (2<<GC_VDC_BIT)
-#define        GC_SOE          (1<<2)  /* S/PDIF Output enable */
-#define        GC_SWR          1       /* Software warn reset */
-
-/* Interrupt mask Control Reg */
-#define        IMC_VCIM        (1<<6)  /* Volume CNTL interrupt mask */
-#define        IMC_CCIM        (1<<1)  /* Capture Chan. iterrupt mask */
-#define        IMC_PCIM        1       /* Playback Chan. interrupt mask */
-
-/* Interrupt status/clear reg */
-#define        ISC_VCI         (1<<6)  /* Volume CNTL interrupt 1: clears */
-#define        ISC_CCI         (1<<1)  /* Capture Chan. interrupt 1: clears  */
-#define        ISC_PCI         1       /* Playback Chan. interrupt 1: clears */
-
-/* misc stuff */
-#define POLL_COUNT   0x5000
-
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Define DIGITAL1 as the I2S channel, since it is not listed in
- * soundcard.h.
- */
-#define SOUND_MIXER_I2S        SOUND_MIXER_DIGITAL1
-#define SOUND_MASK_I2S         SOUND_MASK_DIGITAL1
-#define SOUND_MIXER_READ_I2S   MIXER_READ(SOUND_MIXER_I2S)
-#define SOUND_MIXER_WRITE_I2S  MIXER_WRITE(SOUND_MIXER_I2S)
-
-/* --------------------------------------------------------------------- */
-
-struct it8172_state {
-       /* list of it8172 devices */
-       struct list_head devs;
-
-       /* the corresponding pci_dev structure */
-       struct pci_dev *dev;
-
-       /* soundcore stuff */
-       int dev_audio;
-
-       /* hardware resources */
-       unsigned long io;
-       unsigned int irq;
-
-       /* PCI ID's */
-       u16 vendor;
-       u16 device;
-       u8 rev; /* the chip revision */
-
-       /* options */
-       int spdif_volume; /* S/PDIF output is enabled if != -1 */
-       int i2s_volume;   /* current I2S out volume, in OSS format */
-       int i2s_recording;/* 1 = recording from I2S, 0 = not */
-    
-#ifdef IT8172_DEBUG
-       /* debug /proc entry */
-       struct proc_dir_entry *ps;
-       struct proc_dir_entry *ac97_ps;
-#endif /* IT8172_DEBUG */
-
-       struct ac97_codec codec;
-
-       unsigned short pcc, capcc;
-       unsigned dacrate, adcrate;
-
-       spinlock_t lock;
-       struct mutex open_mutex;
-       mode_t open_mode;
-       wait_queue_head_t open_wait;
-
-       struct dmabuf {
-               void *rawbuf;
-               dma_addr_t dmaaddr;
-               unsigned buforder;
-               unsigned numfrag;
-               unsigned fragshift;
-               void* nextIn;
-               void* nextOut;
-               int count;
-               int curBufPtr;
-               unsigned total_bytes;
-               unsigned error; /* over/underrun */
-               wait_queue_head_t wait;
-               /* redundant, but makes calculations easier */
-               unsigned fragsize;
-               unsigned dmasize;
-               unsigned fragsamples;
-               /* OSS stuff */
-               unsigned mapped:1;
-               unsigned ready:1;
-               unsigned stopped:1;
-               unsigned ossfragshift;
-               int ossmaxfrags;
-               unsigned subdivision;
-       } dma_dac, dma_adc;
-};
-
-/* --------------------------------------------------------------------- */
-
-static LIST_HEAD(devs);
-
-/* --------------------------------------------------------------------- */
-
-static inline unsigned ld2(unsigned int x)
-{
-       unsigned r = 0;
-       
-       if (x >= 0x10000) {
-               x >>= 16;
-               r += 16;
-       }
-       if (x >= 0x100) {
-               x >>= 8;
-               r += 8;
-       }
-       if (x >= 0x10) {
-               x >>= 4;
-               r += 4;
-       }
-       if (x >= 4) {
-               x >>= 2;
-               r += 2;
-       }
-       if (x >= 2)
-               r++;
-       return r;
-}
-
-/* --------------------------------------------------------------------- */
-
-static void it8172_delay(int msec)
-{
-       unsigned long tmo;
-       signed long tmo2;
-
-       if (in_interrupt())
-               return;
-    
-       tmo = jiffies + (msec*HZ)/1000;
-       for (;;) {
-               tmo2 = tmo - jiffies;
-               if (tmo2 <= 0)
-                       break;
-               schedule_timeout(tmo2);
-       }
-}
-
-
-static unsigned short
-get_compat_rate(unsigned* rate)
-{
-       unsigned rate_out = *rate;
-       unsigned short sr;
-    
-       if (rate_out >= 46050) {
-               sr = CC_SR_48000; rate_out = 48000;
-       } else if (rate_out >= 41250) {
-               sr = CC_SR_44100; rate_out = 44100;
-       } else if (rate_out >= 35200) {
-               sr = CC_SR_38400; rate_out = 38400;
-       } else if (rate_out >= 27025) {
-               sr = CC_SR_32000; rate_out = 32000;
-       } else if (rate_out >= 20625) {
-               sr = CC_SR_22050; rate_out = 22050;
-       } else if (rate_out >= 17600) {
-               sr = CC_SR_19200; rate_out = 19200;
-       } else if (rate_out >= 13513) {
-               sr = CC_SR_16000; rate_out = 16000;
-       } else if (rate_out >= 10313) {
-               sr = CC_SR_11025; rate_out = 11025;
-       } else if (rate_out >= 8800) {
-               sr = CC_SR_9600; rate_out = 9600;
-       } else if (rate_out >= 6750) {
-               sr = CC_SR_8000; rate_out = 8000;
-       } else {
-               sr = CC_SR_5500; rate_out = 5500;
-       }
-
-       *rate = rate_out;
-       return sr;
-}
-
-static void set_adc_rate(struct it8172_state *s, unsigned rate)
-{
-       unsigned long flags;
-       unsigned short sr;
-    
-       sr = get_compat_rate(&rate);
-
-       spin_lock_irqsave(&s->lock, flags);
-       s->capcc &= ~CC_SR_MASK;
-       s->capcc |= sr;
-       outw(s->capcc, s->io+IT_AC_CAPCC);
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       s->adcrate = rate;
-}
-
-
-static void set_dac_rate(struct it8172_state *s, unsigned rate)
-{
-       unsigned long flags;
-       unsigned short sr;
-    
-       sr = get_compat_rate(&rate);
-
-       spin_lock_irqsave(&s->lock, flags);
-       s->pcc &= ~CC_SR_MASK;
-       s->pcc |= sr;
-       outw(s->pcc, s->io+IT_AC_PCC);
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       s->dacrate = rate;
-}
-
-
-/* --------------------------------------------------------------------- */
-
-static u16 rdcodec(struct ac97_codec *codec, u8 addr)
-{
-       struct it8172_state *s = (struct it8172_state *)codec->private_data;
-       unsigned long flags;
-       unsigned short circp, data;
-       int i;
-    
-       spin_lock_irqsave(&s->lock, flags);
-
-       for (i = 0; i < POLL_COUNT; i++)
-               if (!(inw(s->io+IT_AC_CIRCP) & CIRCP_CPS))
-                       break;
-       if (i == POLL_COUNT)
-               err("rdcodec: codec ready poll expired!");
-
-       circp = addr & CIRCP_CIA_MASK;
-       circp |= (codec->id << CIRCP_CID_BIT);
-       circp |= CIRCP_RWC; // read command
-       outw(circp, s->io+IT_AC_CIRCP);
-
-       /* now wait for the data */
-       for (i = 0; i < POLL_COUNT; i++)
-               if (inw(s->io+IT_AC_CIRCP) & CIRCP_DPVF)
-                       break;
-       if (i == POLL_COUNT)
-               err("rdcodec: read poll expired!");
-
-       data = inw(s->io+IT_AC_CIRDP);
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       return data;
-}
-
-
-static void wrcodec(struct ac97_codec *codec, u8 addr, u16 data)
-{
-       struct it8172_state *s = (struct it8172_state *)codec->private_data;
-       unsigned long flags;
-       unsigned short circp;
-       int i;
-    
-       spin_lock_irqsave(&s->lock, flags);
-
-       for (i = 0; i < POLL_COUNT; i++)
-               if (!(inw(s->io+IT_AC_CIRCP) & CIRCP_CPS))
-                       break;
-       if (i == POLL_COUNT)
-               err("wrcodec: codec ready poll expired!");
-
-       circp = addr & CIRCP_CIA_MASK;
-       circp |= (codec->id << CIRCP_CID_BIT);
-       circp &= ~CIRCP_RWC; // write command
-
-       outw(data,  s->io+IT_AC_CIRDP);  // send data first
-       outw(circp, s->io+IT_AC_CIRCP);
-
-       spin_unlock_irqrestore(&s->lock, flags);
-}
-
-
-static void waitcodec(struct ac97_codec *codec)
-{
-       unsigned short temp;
-
-       /* codec_wait is used to wait for a ready state after
-          an AC97_RESET. */
-       it8172_delay(10);
-
-       temp = rdcodec(codec, 0x26);
-
-       // If power down, power up
-       if (temp & 0x3f00) {
-               // Power on
-               wrcodec(codec, 0x26, 0);
-               it8172_delay(100);
-               // Reread
-               temp = rdcodec(codec, 0x26);
-       }
-    
-       // Check if Codec REF,ANL,DAC,ADC ready***/
-       if ((temp & 0x3f0f) != 0x000f) {
-               err("codec reg 26 status (0x%x) not ready!!", temp);
-               return;
-       }
-}
-
-
-/* --------------------------------------------------------------------- */
-
-static inline void stop_adc(struct it8172_state *s)
-{
-       struct dmabuf* db = &s->dma_adc;
-       unsigned long flags;
-       unsigned char imc;
-    
-       if (db->stopped)
-               return;
-
-       spin_lock_irqsave(&s->lock, flags);
-
-       s->capcc &= ~(CC_CA | CC_CP | CC_CB2L | CC_CB1L);
-       s->capcc |= CC_CSP;
-       outw(s->capcc, s->io+IT_AC_CAPCC);
-    
-       // disable capture interrupt
-       imc = inb(s->io+IT_AC_IMC);
-       outb(imc | IMC_CCIM, s->io+IT_AC_IMC);
-
-       db->stopped = 1;
-
-       spin_unlock_irqrestore(&s->lock, flags);
-}      
-
-static inline void stop_dac(struct it8172_state *s)
-{
-       struct dmabuf* db = &s->dma_dac;
-       unsigned long flags;
-       unsigned char imc;
-    
-       if (db->stopped)
-               return;
-
-       spin_lock_irqsave(&s->lock, flags);
-
-       s->pcc &= ~(CC_CA | CC_CP | CC_CB2L | CC_CB1L);
-       s->pcc |= CC_CSP;
-       outw(s->pcc, s->io+IT_AC_PCC);
-    
-       // disable playback interrupt
-       imc = inb(s->io+IT_AC_IMC);
-       outb(imc | IMC_PCIM, s->io+IT_AC_IMC);
-
-       db->stopped = 1;
-    
-       spin_unlock_irqrestore(&s->lock, flags);
-}      
-
-static void start_dac(struct it8172_state *s)
-{
-       struct dmabuf* db = &s->dma_dac;
-       unsigned long flags;
-       unsigned char imc;
-       unsigned long buf1, buf2;
-    
-       if (!db->stopped)
-               return;
-    
-       spin_lock_irqsave(&s->lock, flags);
-
-       // reset Buffer 1 and 2 pointers to nextOut and nextOut+fragsize
-       buf1 = virt_to_bus(db->nextOut);
-       buf2 = buf1 + db->fragsize;
-       if (buf2 >= db->dmaaddr + db->dmasize)
-               buf2 -= db->dmasize;
-    
-       outl(buf1, s->io+IT_AC_PCB1STA);
-       outl(buf2, s->io+IT_AC_PCB2STA);
-       db->curBufPtr = IT_AC_PCB1STA;
-    
-       // enable playback interrupt
-       imc = inb(s->io+IT_AC_IMC);
-       outb(imc & ~IMC_PCIM, s->io+IT_AC_IMC);
-
-       s->pcc &= ~(CC_CSP | CC_CP | CC_CB2L | CC_CB1L);
-       s->pcc |= CC_CA;
-       outw(s->pcc, s->io+IT_AC_PCC);
-    
-       db->stopped = 0;
-
-       spin_unlock_irqrestore(&s->lock, flags);
-}      
-
-static void start_adc(struct it8172_state *s)
-{
-       struct dmabuf* db = &s->dma_adc;
-       unsigned long flags;
-       unsigned char imc;
-       unsigned long buf1, buf2;
-    
-       if (!db->stopped)
-               return;
-
-       spin_lock_irqsave(&s->lock, flags);
-
-       // reset Buffer 1 and 2 pointers to nextIn and nextIn+fragsize
-       buf1 = virt_to_bus(db->nextIn);
-       buf2 = buf1 + db->fragsize;
-       if (buf2 >= db->dmaaddr + db->dmasize)
-               buf2 -= db->dmasize;
-    
-       outl(buf1, s->io+IT_AC_CAPB1STA);
-       outl(buf2, s->io+IT_AC_CAPB2STA);
-       db->curBufPtr = IT_AC_CAPB1STA;
-
-       // enable capture interrupt
-       imc = inb(s->io+IT_AC_IMC);
-       outb(imc & ~IMC_CCIM, s->io+IT_AC_IMC);
-
-       s->capcc &= ~(CC_CSP | CC_CP | CC_CB2L | CC_CB1L);
-       s->capcc |= CC_CA;
-       outw(s->capcc, s->io+IT_AC_CAPCC);
-    
-       db->stopped = 0;
-
-       spin_unlock_irqrestore(&s->lock, flags);
-}      
-
-/* --------------------------------------------------------------------- */
-
-#define DMABUF_DEFAULTORDER (17-PAGE_SHIFT)
-#define DMABUF_MINORDER 1
-
-static inline void dealloc_dmabuf(struct it8172_state *s, struct dmabuf *db)
-{
-       struct page *page, *pend;
-
-       if (db->rawbuf) {
-               /* undo marking the pages as reserved */
-               pend = virt_to_page(db->rawbuf +
-                                   (PAGE_SIZE << db->buforder) - 1);
-               for (page = virt_to_page(db->rawbuf); page <= pend; page++)
-                       ClearPageReserved(page);
-               pci_free_consistent(s->dev, PAGE_SIZE << db->buforder,
-                                   db->rawbuf, db->dmaaddr);
-       }
-       db->rawbuf = db->nextIn = db->nextOut = NULL;
-       db->mapped = db->ready = 0;
-}
-
-static int prog_dmabuf(struct it8172_state *s, struct dmabuf *db,
-                      unsigned rate, unsigned fmt, unsigned reg)
-{
-       int order;
-       unsigned bytepersec;
-       unsigned bufs;
-       struct page *page, *pend;
-
-       if (!db->rawbuf) {
-               db->ready = db->mapped = 0;
-               for (order = DMABUF_DEFAULTORDER;
-                    order >= DMABUF_MINORDER; order--)
-                       if ((db->rawbuf =
-                            pci_alloc_consistent(s->dev,
-                                                 PAGE_SIZE << order,
-                                                 &db->dmaaddr)))
-                               break;
-               if (!db->rawbuf)
-                       return -ENOMEM;
-               db->buforder = order;
-               /* now mark the pages as reserved;
-                  otherwise remap_pfn_range doesn't do what we want */
-               pend = virt_to_page(db->rawbuf +
-                                   (PAGE_SIZE << db->buforder) - 1);
-               for (page = virt_to_page(db->rawbuf); page <= pend; page++)
-                       SetPageReserved(page);
-       }
-
-       db->count = 0;
-       db->nextIn = db->nextOut = db->rawbuf;
-    
-       bytepersec = rate << sample_shift[fmt];
-       bufs = PAGE_SIZE << db->buforder;
-       if (db->ossfragshift) {
-               if ((1000 << db->ossfragshift) < bytepersec)
-                       db->fragshift = ld2(bytepersec/1000);
-               else
-                       db->fragshift = db->ossfragshift;
-       } else {
-               db->fragshift = ld2(bytepersec/100/(db->subdivision ?
-                                                   db->subdivision : 1));
-               if (db->fragshift < 3)
-                       db->fragshift = 3;
-       }
-       db->numfrag = bufs >> db->fragshift;
-       while (db->numfrag < 4 && db->fragshift > 3) {
-               db->fragshift--;
-               db->numfrag = bufs >> db->fragshift;
-       }
-       db->fragsize = 1 << db->fragshift;
-       if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
-               db->numfrag = db->ossmaxfrags;
-       db->fragsamples = db->fragsize >> sample_shift[fmt];
-       db->dmasize = db->numfrag << db->fragshift;
-       memset(db->rawbuf, (fmt & (CC_DF>>CC_FMT_BIT)) ? 0 : 0x80, bufs);
-    
-#ifdef IT8172_VERBOSE_DEBUG
-       dbg("rate=%d, fragsize=%d, numfrag=%d, dmasize=%d",
-           rate, db->fragsize, db->numfrag, db->dmasize);
-#endif
-
-       // set data length register
-       outw(db->fragsize, s->io+reg+2);
-       db->ready = 1;
-
-       return 0;
-}
-
-static inline int prog_dmabuf_adc(struct it8172_state *s)
-{
-       stop_adc(s);
-       return prog_dmabuf(s, &s->dma_adc, s->adcrate,
-                          (s->capcc & CC_FMT_MASK) >> CC_FMT_BIT,
-                          IT_AC_CAPCC);
-}
-
-static inline int prog_dmabuf_dac(struct it8172_state *s)
-{
-       stop_dac(s);
-       return prog_dmabuf(s, &s->dma_dac, s->dacrate,
-                          (s->pcc & CC_FMT_MASK) >> CC_FMT_BIT,
-                          IT_AC_PCC);
-}
-
-
-/* hold spinlock for the following! */
-
-static irqreturn_t it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct it8172_state *s = (struct it8172_state *)dev_id;
-       struct dmabuf* dac = &s->dma_dac;
-       struct dmabuf* adc = &s->dma_adc;
-       unsigned char isc, vs;
-       unsigned short vol, mute;
-       unsigned long newptr;
-    
-       spin_lock(&s->lock);
-
-       isc = inb(s->io+IT_AC_ISC);
-
-       /* fastpath out, to ease interrupt sharing */
-       if (!(isc & (ISC_VCI | ISC_CCI | ISC_PCI))) {
-               spin_unlock(&s->lock);
-               return IRQ_NONE;
-       }
-    
-       /* clear audio interrupts first */
-       outb(isc | ISC_VCI | ISC_CCI | ISC_PCI, s->io+IT_AC_ISC);
-    
-       /* handle volume button events (ignore if S/PDIF enabled) */
-       if ((isc & ISC_VCI) && s->spdif_volume == -1) {
-               vs = inb(s->io+IT_AC_VS);
-               outb(0, s->io+IT_AC_VS);
-               vol = inw(s->io+IT_AC_PCMOV);
-               mute = vol & PCMOV_PCMOM;
-               vol &= PCMOV_PCMLCG_MASK;
-               if ((vs & VS_VUP) && vol > 0)
-                       vol--;
-               if ((vs & VS_VDP) && vol < 0x1f)
-                       vol++;
-               vol |= (vol << PCMOV_PCMRCG_BIT);
-               if (vs & VS_VMP)
-                       vol |= (mute ^ PCMOV_PCMOM);
-               outw(vol, s->io+IT_AC_PCMOV);
-       }
-    
-       /* update capture pointers */
-       if (isc & ISC_CCI) {
-               if (adc->count > adc->dmasize - adc->fragsize) {
-                       // Overrun. Stop ADC and log the error
-                       stop_adc(s);
-                       adc->error++;
-                       dbg("adc overrun");
-               } else {
-                       newptr = virt_to_bus(adc->nextIn) + 2*adc->fragsize;
-                       if (newptr >= adc->dmaaddr + adc->dmasize)
-                               newptr -= adc->dmasize;
-           
-                       outl(newptr, s->io+adc->curBufPtr);
-                       adc->curBufPtr = (adc->curBufPtr == IT_AC_CAPB1STA) ?
-                               IT_AC_CAPB2STA : IT_AC_CAPB1STA;
-           
-                       adc->nextIn += adc->fragsize;
-                       if (adc->nextIn >= adc->rawbuf + adc->dmasize)
-                               adc->nextIn -= adc->dmasize;
-           
-                       adc->count += adc->fragsize;
-                       adc->total_bytes += adc->fragsize;
-
-                       /* wake up anybody listening */
-                       if (waitqueue_active(&adc->wait))
-                               wake_up_interruptible(&adc->wait);
-               }
-       }
-    
-       /* update playback pointers */
-       if (isc & ISC_PCI) {
-               newptr = virt_to_bus(dac->nextOut) + 2*dac->fragsize;
-               if (newptr >= dac->dmaaddr + dac->dmasize)
-                       newptr -= dac->dmasize;
-       
-               outl(newptr, s->io+dac->curBufPtr);
-               dac->curBufPtr = (dac->curBufPtr == IT_AC_PCB1STA) ?
-                       IT_AC_PCB2STA : IT_AC_PCB1STA;
-       
-               dac->nextOut += dac->fragsize;
-               if (dac->nextOut >= dac->rawbuf + dac->dmasize)
-                       dac->nextOut -= dac->dmasize;
-       
-               dac->count -= dac->fragsize;
-               dac->total_bytes += dac->fragsize;
-
-               /* wake up anybody listening */
-               if (waitqueue_active(&dac->wait))
-                       wake_up_interruptible(&dac->wait);
-       
-               if (dac->count <= 0)
-                       stop_dac(s);
-       }
-    
-       spin_unlock(&s->lock);
-       return IRQ_HANDLED;
-}
-
-/* --------------------------------------------------------------------- */
-
-static int it8172_open_mixdev(struct inode *inode, struct file *file)
-{
-       int minor = iminor(inode);
-       struct list_head *list;
-       struct it8172_state *s;
-
-       for (list = devs.next; ; list = list->next) {
-               if (list == &devs)
-                       return -ENODEV;
-               s = list_entry(list, struct it8172_state, devs);
-               if (s->codec.dev_mixer == minor)
-                       break;
-       }
-       file->private_data = s;
-       return nonseekable_open(inode, file);
-}
-
-static int it8172_release_mixdev(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-
-static u16
-cvt_ossvol(unsigned int gain)
-{
-       u16 ret;
-    
-       if (gain == 0)
-               return 0;
-    
-       if (gain > 100)
-               gain = 100;
-    
-       ret = (100 - gain + 32) / 4;
-       ret = ret > 31 ? 31 : ret;
-       return ret;
-}
-
-
-static int mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
-                       unsigned long arg)
-{
-       struct it8172_state *s = (struct it8172_state *)codec->private_data;
-       unsigned int left, right;
-       unsigned long flags;
-       int val;
-       u16 vol;
-    
-       /*
-        * When we are in S/PDIF mode, we want to disable any analog output so
-        * we filter the master/PCM channel volume ioctls.
-        *
-        * Also filter I2S channel, which AC'97 knows nothing about.
-        */
-
-       switch (cmd) {
-       case SOUND_MIXER_WRITE_VOLUME:
-               // if not in S/PDIF mode, pass to AC'97
-               if (s->spdif_volume == -1)
-                       break;
-               return 0;
-       case SOUND_MIXER_WRITE_PCM:
-               // if not in S/PDIF mode, pass to AC'97
-               if (s->spdif_volume == -1)
-                       break;
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               right = ((val >> 8)  & 0xff);
-               left = (val  & 0xff);
-               if (right > 100)
-                       right = 100;
-               if (left > 100)
-                       left = 100;
-               s->spdif_volume = (right << 8) | left;
-               vol = cvt_ossvol(left);
-               vol |= (cvt_ossvol(right) << PCMOV_PCMRCG_BIT);
-               if (vol == 0)
-                       vol = PCMOV_PCMOM; // mute
-               spin_lock_irqsave(&s->lock, flags);
-               outw(vol, s->io+IT_AC_PCMOV);
-               spin_unlock_irqrestore(&s->lock, flags);
-               return put_user(s->spdif_volume, (int *)arg);
-       case SOUND_MIXER_READ_PCM:
-               // if not in S/PDIF mode, pass to AC'97
-               if (s->spdif_volume == -1)
-                       break;
-               return put_user(s->spdif_volume, (int *)arg);
-       case SOUND_MIXER_WRITE_I2S:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               right = ((val >> 8)  & 0xff);
-               left = (val  & 0xff);
-               if (right > 100)
-                       right = 100;
-               if (left > 100)
-                       left = 100;
-               s->i2s_volume = (right << 8) | left;
-               vol = cvt_ossvol(left);
-               vol |= (cvt_ossvol(right) << I2SV_I2SRCG_BIT);
-               if (vol == 0)
-                       vol = I2SV_I2SOM; // mute
-               outw(vol, s->io+IT_AC_I2SV);
-               return put_user(s->i2s_volume, (int *)arg);
-       case SOUND_MIXER_READ_I2S:
-               return put_user(s->i2s_volume, (int *)arg);
-       case SOUND_MIXER_WRITE_RECSRC:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (val & SOUND_MASK_I2S) {
-                       s->i2s_recording = 1;
-                       outb(DRSS_I2S, s->io+IT_AC_DRSS);
-                       return 0;
-               } else {
-                       s->i2s_recording = 0;
-                       outb(DRSS_AC97_PRIM, s->io+IT_AC_DRSS);
-                       // now let AC'97 select record source
-                       break;
-               }
-       case SOUND_MIXER_READ_RECSRC:
-               if (s->i2s_recording)
-                       return put_user(SOUND_MASK_I2S, (int *)arg);
-               else
-                       // let AC'97 report recording source
-                       break;
-       }
-
-       return codec->mixer_ioctl(codec, cmd, arg);
-}
-
-static int it8172_ioctl_mixdev(struct inode *inode, struct file *file,
-                              unsigned int cmd, unsigned long arg)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       struct ac97_codec *codec = &s->codec;
-
-       return mixdev_ioctl(codec, cmd, arg);
-}
-
-static /*const*/ struct file_operations it8172_mixer_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .ioctl          = it8172_ioctl_mixdev,
-       .open           = it8172_open_mixdev,
-       .release        = it8172_release_mixdev,
-};
-
-/* --------------------------------------------------------------------- */
-
-static int drain_dac(struct it8172_state *s, int nonblock)
-{
-       unsigned long flags;
-       int count, tmo;
-       
-       if (s->dma_dac.mapped || !s->dma_dac.ready || s->dma_dac.stopped)
-               return 0;
-
-       for (;;) {
-               spin_lock_irqsave(&s->lock, flags);
-               count = s->dma_dac.count;
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count <= 0)
-                       break;
-               if (signal_pending(current))
-                       break;
-               //if (nonblock)
-               //return -EBUSY;
-               tmo = 1000 * count / s->dacrate;
-               tmo >>= sample_shift[(s->pcc & CC_FMT_MASK) >> CC_FMT_BIT];
-               it8172_delay(tmo);
-       }
-       if (signal_pending(current))
-               return -ERESTARTSYS;
-       return 0;
-}
-
-/* --------------------------------------------------------------------- */
-
-
-/*
- * Copy audio data to/from user buffer from/to dma buffer, taking care
- * that we wrap when reading/writing the dma buffer. Returns actual byte
- * count written to or read from the dma buffer.
- */
-static int copy_dmabuf_user(struct dmabuf *db, char* userbuf,
-                           int count, int to_user)
-{
-       char* bufptr = to_user ? db->nextOut : db->nextIn;
-       char* bufend = db->rawbuf + db->dmasize;
-       
-       if (bufptr + count > bufend) {
-               int partial = (int)(bufend - bufptr);
-               if (to_user) {
-                       if (copy_to_user(userbuf, bufptr, partial))
-                               return -EFAULT;
-                       if (copy_to_user(userbuf + partial, db->rawbuf,
-                                        count - partial))
-                               return -EFAULT;
-               } else {
-                       if (copy_from_user(bufptr, userbuf, partial))
-                               return -EFAULT;
-                       if (copy_from_user(db->rawbuf,
-                                          userbuf + partial,
-                                          count - partial))
-                               return -EFAULT;
-               }
-       } else {
-               if (to_user) {
-                       if (copy_to_user(userbuf, bufptr, count))
-                               return -EFAULT;
-               } else {
-                       if (copy_from_user(bufptr, userbuf, count))
-                               return -EFAULT;
-               }
-       }
-       
-       return count;
-}
-
-
-static ssize_t it8172_read(struct file *file, char *buffer,
-                          size_t count, loff_t *ppos)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       struct dmabuf *db = &s->dma_adc;
-       ssize_t ret;
-       unsigned long flags;
-       int cnt, remainder, avail;
-
-       if (db->mapped)
-               return -ENXIO;
-       if (!access_ok(VERIFY_WRITE, buffer, count))
-               return -EFAULT;
-       ret = 0;
-
-       while (count > 0) {
-               // wait for samples in capture buffer
-               do {
-                       spin_lock_irqsave(&s->lock, flags);
-                       if (db->stopped)
-                               start_adc(s);
-                       avail = db->count;
-                       spin_unlock_irqrestore(&s->lock, flags);
-                       if (avail <= 0) {
-                               if (file->f_flags & O_NONBLOCK) {
-                                       if (!ret)
-                                               ret = -EAGAIN;
-                                       return ret;
-                               }
-                               interruptible_sleep_on(&db->wait);
-                               if (signal_pending(current)) {
-                                       if (!ret)
-                                               ret = -ERESTARTSYS;
-                                       return ret;
-                               }
-                       }
-               } while (avail <= 0);
-
-               // copy from nextOut to user
-               if ((cnt = copy_dmabuf_user(db, buffer, count > avail ?
-                                           avail : count, 1)) < 0) {
-                       if (!ret)
-                               ret = -EFAULT;
-                       return ret;
-               }
-
-               spin_lock_irqsave(&s->lock, flags);
-               db->count -= cnt;
-               spin_unlock_irqrestore(&s->lock, flags);
-
-               db->nextOut += cnt;
-               if (db->nextOut >= db->rawbuf + db->dmasize)
-                       db->nextOut -= db->dmasize;     
-
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-       } // while (count > 0)
-
-       /*
-        * See if the dma buffer count after this read call is
-        * aligned on a fragsize boundary. If not, read from
-        * buffer until we reach a boundary, and let's hope this
-        * is just the last remainder of an audio record. If not
-        * it means the user is not reading in fragsize chunks, in
-        * which case it's his/her fault that there are audio gaps
-        * in their record.
-        */
-       spin_lock_irqsave(&s->lock, flags);
-       remainder = db->count % db->fragsize;
-       if (remainder) {
-               db->nextOut += remainder;
-               if (db->nextOut >= db->rawbuf + db->dmasize)
-                       db->nextOut -= db->dmasize;
-               db->count -= remainder;
-       }
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       return ret;
-}
-
-static ssize_t it8172_write(struct file *file, const char *buffer,
-                           size_t count, loff_t *ppos)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       struct dmabuf *db = &s->dma_dac;
-       ssize_t ret;
-       unsigned long flags;
-       int cnt, remainder, avail;
-
-       if (db->mapped)
-               return -ENXIO;
-       if (!access_ok(VERIFY_READ, buffer, count))
-               return -EFAULT;
-       ret = 0;
-    
-       while (count > 0) {
-               // wait for space in playback buffer
-               do {
-                       spin_lock_irqsave(&s->lock, flags);
-                       avail = db->dmasize - db->count;
-                       spin_unlock_irqrestore(&s->lock, flags);
-                       if (avail <= 0) {
-                               if (file->f_flags & O_NONBLOCK) {
-                                       if (!ret)
-                                               ret = -EAGAIN;
-                                       return ret;
-                               }
-                               interruptible_sleep_on(&db->wait);
-                               if (signal_pending(current)) {
-                                       if (!ret)
-                                               ret = -ERESTARTSYS;
-                                       return ret;
-                               }
-                       }
-               } while (avail <= 0);
-       
-               // copy to nextIn
-               if ((cnt = copy_dmabuf_user(db, (char*)buffer,
-                                           count > avail ?
-                                           avail : count, 0)) < 0) {
-                       if (!ret)
-                               ret = -EFAULT;
-                       return ret;
-               }
-
-               spin_lock_irqsave(&s->lock, flags);
-               db->count += cnt;
-               if (db->stopped)
-                       start_dac(s);
-               spin_unlock_irqrestore(&s->lock, flags);
-       
-               db->nextIn += cnt;
-               if (db->nextIn >= db->rawbuf + db->dmasize)
-                       db->nextIn -= db->dmasize;
-       
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-       } // while (count > 0)
-       
-       /*
-        * See if the dma buffer count after this write call is
-        * aligned on a fragsize boundary. If not, fill buffer
-        * with silence to the next boundary, and let's hope this
-        * is just the last remainder of an audio playback. If not
-        * it means the user is not sending us fragsize chunks, in
-        * which case it's his/her fault that there are audio gaps
-        * in their playback.
-        */
-       spin_lock_irqsave(&s->lock, flags);
-       remainder = db->count % db->fragsize;
-       if (remainder) {
-               int fill_cnt = db->fragsize - remainder;
-               memset(db->nextIn, 0, fill_cnt);
-               db->nextIn += fill_cnt;
-               if (db->nextIn >= db->rawbuf + db->dmasize)
-                       db->nextIn -= db->dmasize;
-               db->count += fill_cnt;
-       }
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       return ret;
-}
-
-/* No kernel lock - we have our own spinlock */
-static unsigned int it8172_poll(struct file *file,
-                               struct poll_table_struct *wait)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       unsigned long flags;
-       unsigned int mask = 0;
-
-       if (file->f_mode & FMODE_WRITE) {
-               if (!s->dma_dac.ready)
-                       return 0;
-               poll_wait(file, &s->dma_dac.wait, wait);
-       }
-       if (file->f_mode & FMODE_READ) {
-               if (!s->dma_adc.ready)
-                       return 0;
-               poll_wait(file, &s->dma_adc.wait, wait);
-       }
-       
-       spin_lock_irqsave(&s->lock, flags);
-       if (file->f_mode & FMODE_READ) {
-               if (s->dma_adc.count >= (signed)s->dma_adc.fragsize)
-                       mask |= POLLIN | POLLRDNORM;
-       }
-       if (file->f_mode & FMODE_WRITE) {
-               if (s->dma_dac.mapped) {
-                       if (s->dma_dac.count >= (signed)s->dma_dac.fragsize) 
-                               mask |= POLLOUT | POLLWRNORM;
-               } else {
-                       if ((signed)s->dma_dac.dmasize >=
-                           s->dma_dac.count + (signed)s->dma_dac.fragsize)
-                               mask |= POLLOUT | POLLWRNORM;
-               }
-       }
-       spin_unlock_irqrestore(&s->lock, flags);
-       return mask;
-}
-
-static int it8172_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       struct dmabuf *db;
-       unsigned long size;
-
-       lock_kernel();
-       if (vma->vm_flags & VM_WRITE)
-               db = &s->dma_dac;
-       else if (vma->vm_flags & VM_READ)
-               db = &s->dma_adc;
-       else {
-               unlock_kernel();
-               return -EINVAL;
-       }
-       if (vma->vm_pgoff != 0) {
-               unlock_kernel();
-               return -EINVAL;
-       }
-       size = vma->vm_end - vma->vm_start;
-       if (size > (PAGE_SIZE << db->buforder)) {
-               unlock_kernel();
-               return -EINVAL;
-       }
-       if (remap_pfn_range(vma, vma->vm_start,
-                            virt_to_phys(db->rawbuf) >> PAGE_SHIFT,
-                            size, vma->vm_page_prot)) {
-               unlock_kernel();
-               return -EAGAIN;
-       }
-       db->mapped = 1;
-       unlock_kernel();
-       return 0;
-}
-
-
-#ifdef IT8172_VERBOSE_DEBUG
-static struct ioctl_str_t {
-       unsigned int cmd;
-       const char* str;
-} ioctl_str[] = {
-       {SNDCTL_DSP_RESET, "SNDCTL_DSP_RESET"},
-       {SNDCTL_DSP_SYNC, "SNDCTL_DSP_SYNC"},
-       {SNDCTL_DSP_SPEED, "SNDCTL_DSP_SPEED"},
-       {SNDCTL_DSP_STEREO, "SNDCTL_DSP_STEREO"},
-       {SNDCTL_DSP_GETBLKSIZE, "SNDCTL_DSP_GETBLKSIZE"},
-       {SNDCTL_DSP_SAMPLESIZE, "SNDCTL_DSP_SAMPLESIZE"},
-       {SNDCTL_DSP_CHANNELS, "SNDCTL_DSP_CHANNELS"},
-       {SOUND_PCM_WRITE_CHANNELS, "SOUND_PCM_WRITE_CHANNELS"},
-       {SOUND_PCM_WRITE_FILTER, "SOUND_PCM_WRITE_FILTER"},
-       {SNDCTL_DSP_POST, "SNDCTL_DSP_POST"},
-       {SNDCTL_DSP_SUBDIVIDE, "SNDCTL_DSP_SUBDIVIDE"},
-       {SNDCTL_DSP_SETFRAGMENT, "SNDCTL_DSP_SETFRAGMENT"},
-       {SNDCTL_DSP_GETFMTS, "SNDCTL_DSP_GETFMTS"},
-       {SNDCTL_DSP_SETFMT, "SNDCTL_DSP_SETFMT"},
-       {SNDCTL_DSP_GETOSPACE, "SNDCTL_DSP_GETOSPACE"},
-       {SNDCTL_DSP_GETISPACE, "SNDCTL_DSP_GETISPACE"},
-       {SNDCTL_DSP_NONBLOCK, "SNDCTL_DSP_NONBLOCK"},
-       {SNDCTL_DSP_GETCAPS, "SNDCTL_DSP_GETCAPS"},
-       {SNDCTL_DSP_GETTRIGGER, "SNDCTL_DSP_GETTRIGGER"},
-       {SNDCTL_DSP_SETTRIGGER, "SNDCTL_DSP_SETTRIGGER"},
-       {SNDCTL_DSP_GETIPTR, "SNDCTL_DSP_GETIPTR"},
-       {SNDCTL_DSP_GETOPTR, "SNDCTL_DSP_GETOPTR"},
-       {SNDCTL_DSP_MAPINBUF, "SNDCTL_DSP_MAPINBUF"},
-       {SNDCTL_DSP_MAPOUTBUF, "SNDCTL_DSP_MAPOUTBUF"},
-       {SNDCTL_DSP_SETSYNCRO, "SNDCTL_DSP_SETSYNCRO"},
-       {SNDCTL_DSP_SETDUPLEX, "SNDCTL_DSP_SETDUPLEX"},
-       {SNDCTL_DSP_GETODELAY, "SNDCTL_DSP_GETODELAY"},
-       {SNDCTL_DSP_GETCHANNELMASK, "SNDCTL_DSP_GETCHANNELMASK"},
-       {SNDCTL_DSP_BIND_CHANNEL, "SNDCTL_DSP_BIND_CHANNEL"},
-       {OSS_GETVERSION, "OSS_GETVERSION"},
-       {SOUND_PCM_READ_RATE, "SOUND_PCM_READ_RATE"},
-       {SOUND_PCM_READ_CHANNELS, "SOUND_PCM_READ_CHANNELS"},
-       {SOUND_PCM_READ_BITS, "SOUND_PCM_READ_BITS"},
-       {SOUND_PCM_READ_FILTER, "SOUND_PCM_READ_FILTER"}
-};
-#endif    
-
-static int it8172_ioctl(struct inode *inode, struct file *file,
-                       unsigned int cmd, unsigned long arg)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-       unsigned long flags;
-       audio_buf_info abinfo;
-       count_info cinfo;
-       int count;
-       int val, mapped, ret, diff;
-
-       mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
-               ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
-
-#ifdef IT8172_VERBOSE_DEBUG
-       for (count=0; count<sizeof(ioctl_str)/sizeof(ioctl_str[0]); count++) {
-               if (ioctl_str[count].cmd == cmd)
-                       break;
-       }
-       if (count < sizeof(ioctl_str)/sizeof(ioctl_str[0]))
-               dbg("ioctl %s, arg=0x%08x",
-                   ioctl_str[count].str, (unsigned int)arg);
-       else
-               dbg("ioctl unknown, 0x%x", cmd);
-#endif
-    
-       switch (cmd) {
-       case OSS_GETVERSION:
-               return put_user(SOUND_VERSION, (int *)arg);
-
-       case SNDCTL_DSP_SYNC:
-               if (file->f_mode & FMODE_WRITE)
-                       return drain_dac(s, file->f_flags & O_NONBLOCK);
-               return 0;
-               
-       case SNDCTL_DSP_SETDUPLEX:
-               return 0;
-
-       case SNDCTL_DSP_GETCAPS:
-               return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
-                               DSP_CAP_TRIGGER | DSP_CAP_MMAP, (int *)arg);
-               
-       case SNDCTL_DSP_RESET:
-               if (file->f_mode & FMODE_WRITE) {
-                       stop_dac(s);
-                       synchronize_irq(s->irq);
-                       s->dma_dac.count = s->dma_dac.total_bytes = 0;
-                       s->dma_dac.nextIn = s->dma_dac.nextOut =
-                               s->dma_dac.rawbuf;
-               }
-               if (file->f_mode & FMODE_READ) {
-                       stop_adc(s);
-                       synchronize_irq(s->irq);
-                       s->dma_adc.count = s->dma_adc.total_bytes = 0;
-                       s->dma_adc.nextIn = s->dma_adc.nextOut =
-                               s->dma_adc.rawbuf;
-               }
-               return 0;
-
-       case SNDCTL_DSP_SPEED:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (val >= 0) {
-                       if (file->f_mode & FMODE_READ) {
-                               stop_adc(s);
-                               set_adc_rate(s, val);
-                               if ((ret = prog_dmabuf_adc(s)))
-                                       return ret;
-                       }
-                       if (file->f_mode & FMODE_WRITE) {
-                               stop_dac(s);
-                               set_dac_rate(s, val);
-                               if ((ret = prog_dmabuf_dac(s)))
-                                       return ret;
-                       }
-               }
-               return put_user((file->f_mode & FMODE_READ) ?
-                               s->adcrate : s->dacrate, (int *)arg);
-
-       case SNDCTL_DSP_STEREO:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_READ) {
-                       stop_adc(s);
-                       if (val)
-                               s->capcc |= CC_SM;
-                       else
-                               s->capcc &= ~CC_SM;
-                       outw(s->capcc, s->io+IT_AC_CAPCC);
-                       if ((ret = prog_dmabuf_adc(s)))
-                               return ret;
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       stop_dac(s);
-                       if (val)
-                               s->pcc |= CC_SM;
-                       else
-                               s->pcc &= ~CC_SM;
-                       outw(s->pcc, s->io+IT_AC_PCC);
-                       if ((ret = prog_dmabuf_dac(s)))
-                               return ret;
-               }
-               return 0;
-
-       case SNDCTL_DSP_CHANNELS:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (val != 0) {
-                       if (file->f_mode & FMODE_READ) {
-                               stop_adc(s);
-                               if (val >= 2) {
-                                       val = 2;
-                                       s->capcc |= CC_SM;
-                               }
-                               else
-                                       s->capcc &= ~CC_SM;
-                               outw(s->capcc, s->io+IT_AC_CAPCC);
-                               if ((ret = prog_dmabuf_adc(s)))
-                                       return ret;
-                       }
-                       if (file->f_mode & FMODE_WRITE) {
-                               stop_dac(s);
-                               switch (val) {
-                               case 1:
-                                       s->pcc &= ~CC_SM;
-                                       break;
-                               case 2:
-                                       s->pcc |= CC_SM;
-                                       break;
-                               default:
-                                       // FIX! support multichannel???
-                                       val = 2;
-                                       s->pcc |= CC_SM;
-                                       break;
-                               }
-                               outw(s->pcc, s->io+IT_AC_PCC);
-                               if ((ret = prog_dmabuf_dac(s)))
-                                       return ret;
-                       }
-               }
-               return put_user(val, (int *)arg);
-               
-       case SNDCTL_DSP_GETFMTS: /* Returns a mask */
-               return put_user(AFMT_S16_LE|AFMT_U8, (int *)arg);
-               
-       case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (val != AFMT_QUERY) {
-                       if (file->f_mode & FMODE_READ) {
-                               stop_adc(s);
-                               if (val == AFMT_S16_LE)
-                                       s->capcc |= CC_DF;
-                               else {
-                                       val = AFMT_U8;
-                                       s->capcc &= ~CC_DF;
-                               }
-                               outw(s->capcc, s->io+IT_AC_CAPCC);
-                               if ((ret = prog_dmabuf_adc(s)))
-                                       return ret;
-                       }
-                       if (file->f_mode & FMODE_WRITE) {
-                               stop_dac(s);
-                               if (val == AFMT_S16_LE)
-                                       s->pcc |= CC_DF;
-                               else {
-                                       val = AFMT_U8;
-                                       s->pcc &= ~CC_DF;
-                               }
-                               outw(s->pcc, s->io+IT_AC_PCC);
-                               if ((ret = prog_dmabuf_dac(s)))
-                                       return ret;
-                       }
-               } else {
-                       if (file->f_mode & FMODE_READ)
-                               val = (s->capcc & CC_DF) ?
-                                       AFMT_S16_LE : AFMT_U8;
-                       else
-                               val = (s->pcc & CC_DF) ?
-                                       AFMT_S16_LE : AFMT_U8;
-               }
-               return put_user(val, (int *)arg);
-               
-       case SNDCTL_DSP_POST:
-               return 0;
-
-       case SNDCTL_DSP_GETTRIGGER:
-               val = 0;
-               spin_lock_irqsave(&s->lock, flags);
-               if (file->f_mode & FMODE_READ && !s->dma_adc.stopped)
-                       val |= PCM_ENABLE_INPUT;
-               if (file->f_mode & FMODE_WRITE && !s->dma_dac.stopped)
-                       val |= PCM_ENABLE_OUTPUT;
-               spin_unlock_irqrestore(&s->lock, flags);
-               return put_user(val, (int *)arg);
-               
-       case SNDCTL_DSP_SETTRIGGER:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_READ) {
-                       if (val & PCM_ENABLE_INPUT)
-                               start_adc(s);
-                       else
-                               stop_adc(s);
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       if (val & PCM_ENABLE_OUTPUT)
-                               start_dac(s);
-                       else
-                               stop_dac(s);
-               }
-               return 0;
-
-       case SNDCTL_DSP_GETOSPACE:
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-               abinfo.fragsize = s->dma_dac.fragsize;
-               spin_lock_irqsave(&s->lock, flags);
-               count = s->dma_dac.count;
-               if (!s->dma_dac.stopped)
-                       count -= (s->dma_dac.fragsize -
-                                 inw(s->io+IT_AC_PCDL));
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count < 0)
-                       count = 0;
-               abinfo.bytes = s->dma_dac.dmasize - count;
-               abinfo.fragstotal = s->dma_dac.numfrag;
-               abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;      
-               return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ?
-                       -EFAULT : 0;
-
-       case SNDCTL_DSP_GETISPACE:
-               if (!(file->f_mode & FMODE_READ))
-                       return -EINVAL;
-               abinfo.fragsize = s->dma_adc.fragsize;
-               spin_lock_irqsave(&s->lock, flags);
-               count = s->dma_adc.count;
-               if (!s->dma_adc.stopped)
-                       count += (s->dma_adc.fragsize -
-                                 inw(s->io+IT_AC_CAPCDL));
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count < 0)
-                       count = 0;
-               abinfo.bytes = count;
-               abinfo.fragstotal = s->dma_adc.numfrag;
-               abinfo.fragments = abinfo.bytes >> s->dma_adc.fragshift;      
-               return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ?
-                       -EFAULT : 0;
-               
-       case SNDCTL_DSP_NONBLOCK:
-               file->f_flags |= O_NONBLOCK;
-               return 0;
-
-       case SNDCTL_DSP_GETODELAY:
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-               spin_lock_irqsave(&s->lock, flags);
-               count = s->dma_dac.count;
-               if (!s->dma_dac.stopped)
-                       count -= (s->dma_dac.fragsize -
-                                 inw(s->io+IT_AC_PCDL));
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count < 0)
-                       count = 0;
-               return put_user(count, (int *)arg);
-
-       case SNDCTL_DSP_GETIPTR:
-               if (!(file->f_mode & FMODE_READ))
-                       return -EINVAL;
-               spin_lock_irqsave(&s->lock, flags);
-               cinfo.bytes = s->dma_adc.total_bytes;
-               count = s->dma_adc.count;
-               if (!s->dma_adc.stopped) {
-                       diff = s->dma_adc.fragsize - inw(s->io+IT_AC_CAPCDL);
-                       count += diff;
-                       cinfo.bytes += diff;
-                       cinfo.ptr = inl(s->io+s->dma_adc.curBufPtr) -
-                               s->dma_adc.dmaaddr;
-               } else
-                       cinfo.ptr = virt_to_bus(s->dma_adc.nextIn) -
-                               s->dma_adc.dmaaddr;
-               if (s->dma_adc.mapped)
-                       s->dma_adc.count &= s->dma_adc.fragsize-1;
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count < 0)
-                       count = 0;
-               cinfo.blocks = count >> s->dma_adc.fragshift;
-               if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
-                       return -EFAULT;
-               return 0;
-
-       case SNDCTL_DSP_GETOPTR:
-               if (!(file->f_mode & FMODE_READ))
-                       return -EINVAL;
-               spin_lock_irqsave(&s->lock, flags);
-               cinfo.bytes = s->dma_dac.total_bytes;
-               count = s->dma_dac.count;
-               if (!s->dma_dac.stopped) {
-                       diff = s->dma_dac.fragsize - inw(s->io+IT_AC_CAPCDL);
-                       count -= diff;
-                       cinfo.bytes += diff;
-                       cinfo.ptr = inl(s->io+s->dma_dac.curBufPtr) -
-                               s->dma_dac.dmaaddr;
-               } else
-                       cinfo.ptr = virt_to_bus(s->dma_dac.nextOut) -
-                               s->dma_dac.dmaaddr;
-               if (s->dma_dac.mapped)
-                       s->dma_dac.count &= s->dma_dac.fragsize-1;
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count < 0)
-                       count = 0;
-               cinfo.blocks = count >> s->dma_dac.fragshift;
-               if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
-                       return -EFAULT;
-               return 0;
-
-       case SNDCTL_DSP_GETBLKSIZE:
-               if (file->f_mode & FMODE_WRITE)
-                       return put_user(s->dma_dac.fragsize, (int *)arg);
-               else
-                       return put_user(s->dma_adc.fragsize, (int *)arg);
-
-       case SNDCTL_DSP_SETFRAGMENT:
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_READ) {
-                       stop_adc(s);
-                       s->dma_adc.ossfragshift = val & 0xffff;
-                       s->dma_adc.ossmaxfrags = (val >> 16) & 0xffff;
-                       if (s->dma_adc.ossfragshift < 4)
-                               s->dma_adc.ossfragshift = 4;
-                       if (s->dma_adc.ossfragshift > 15)
-                               s->dma_adc.ossfragshift = 15;
-                       if (s->dma_adc.ossmaxfrags < 4)
-                               s->dma_adc.ossmaxfrags = 4;
-                       if ((ret = prog_dmabuf_adc(s)))
-                               return ret;
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       stop_dac(s);
-                       s->dma_dac.ossfragshift = val & 0xffff;
-                       s->dma_dac.ossmaxfrags = (val >> 16) & 0xffff;
-                       if (s->dma_dac.ossfragshift < 4)
-                               s->dma_dac.ossfragshift = 4;
-                       if (s->dma_dac.ossfragshift > 15)
-                               s->dma_dac.ossfragshift = 15;
-                       if (s->dma_dac.ossmaxfrags < 4)
-                               s->dma_dac.ossmaxfrags = 4;
-                       if ((ret = prog_dmabuf_dac(s)))
-                               return ret;
-               }
-               return 0;
-
-       case SNDCTL_DSP_SUBDIVIDE:
-               if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
-                   (file->f_mode & FMODE_WRITE && s->dma_dac.subdivision))
-                       return -EINVAL;
-               if (get_user(val, (int *)arg))
-                       return -EFAULT;
-               if (val != 1 && val != 2 && val != 4)
-                       return -EINVAL;
-               if (file->f_mode & FMODE_READ) {
-                       stop_adc(s);
-                       s->dma_adc.subdivision = val;
-                       if ((ret = prog_dmabuf_adc(s)))
-                               return ret;
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       stop_dac(s);
-                       s->dma_dac.subdivision = val;
-                       if ((ret = prog_dmabuf_dac(s)))
-                               return ret;
-               }
-               return 0;
-
-       case SOUND_PCM_READ_RATE:
-               return put_user((file->f_mode & FMODE_READ) ?
-                               s->adcrate : s->dacrate, (int *)arg);
-
-       case SOUND_PCM_READ_CHANNELS:
-               if (file->f_mode & FMODE_READ)
-                       return put_user((s->capcc & CC_SM) ? 2 : 1,
-                                       (int *)arg);
-               else
-                       return put_user((s->pcc & CC_SM) ? 2 : 1,
-                                       (int *)arg);
-           
-       case SOUND_PCM_READ_BITS:
-               if (file->f_mode & FMODE_READ)
-                       return put_user((s->capcc & CC_DF) ? 16 : 8,
-                                       (int *)arg);
-               else
-                       return put_user((s->pcc & CC_DF) ? 16 : 8,
-                                       (int *)arg);
-
-       case SOUND_PCM_WRITE_FILTER:
-       case SNDCTL_DSP_SETSYNCRO:
-       case SOUND_PCM_READ_FILTER:
-               return -EINVAL;
-       }
-
-       return mixdev_ioctl(&s->codec, cmd, arg);
-}
-
-
-static int it8172_open(struct inode *inode, struct file *file)
-{
-       int minor = iminor(inode);
-       DECLARE_WAITQUEUE(wait, current);
-       unsigned long flags;
-       struct list_head *list;
-       struct it8172_state *s;
-       int ret;
-    
-#ifdef IT8172_VERBOSE_DEBUG
-       if (file->f_flags & O_NONBLOCK)
-               dbg("%s: non-blocking", __FUNCTION__);
-       else
-               dbg("%s: blocking", __FUNCTION__);
-#endif
-       
-       for (list = devs.next; ; list = list->next) {
-               if (list == &devs)
-                       return -ENODEV;
-               s = list_entry(list, struct it8172_state, devs);
-               if (!((s->dev_audio ^ minor) & ~0xf))
-                       break;
-       }
-       file->private_data = s;
-       /* wait for device to become free */
-       mutex_lock(&s->open_mutex);
-       while (s->open_mode & file->f_mode) {
-               if (file->f_flags & O_NONBLOCK) {
-                       mutex_unlock(&s->open_mutex);
-                       return -EBUSY;
-               }
-               add_wait_queue(&s->open_wait, &wait);
-               __set_current_state(TASK_INTERRUPTIBLE);
-               mutex_unlock(&s->open_mutex);
-               schedule();
-               remove_wait_queue(&s->open_wait, &wait);
-               set_current_state(TASK_RUNNING);
-               if (signal_pending(current))
-                       return -ERESTARTSYS;
-               mutex_lock(&s->open_mutex);
-       }
-
-       spin_lock_irqsave(&s->lock, flags);
-
-       if (file->f_mode & FMODE_READ) {
-               s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
-                       s->dma_adc.subdivision = s->dma_adc.total_bytes = 0;
-               s->capcc &= ~(CC_SM | CC_DF);
-               set_adc_rate(s, 8000);
-               if ((minor & 0xf) == SND_DEV_DSP16)
-                       s->capcc |= CC_DF;
-               outw(s->capcc, s->io+IT_AC_CAPCC);
-               if ((ret = prog_dmabuf_adc(s))) {
-                       spin_unlock_irqrestore(&s->lock, flags);
-                       return ret;
-               }
-       }
-       if (file->f_mode & FMODE_WRITE) {
-               s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
-                       s->dma_dac.subdivision = s->dma_dac.total_bytes = 0;
-               s->pcc &= ~(CC_SM | CC_DF);
-               set_dac_rate(s, 8000);
-               if ((minor & 0xf) == SND_DEV_DSP16)
-                       s->pcc |= CC_DF;
-               outw(s->pcc, s->io+IT_AC_PCC);
-               if ((ret = prog_dmabuf_dac(s))) {
-                       spin_unlock_irqrestore(&s->lock, flags);
-                       return ret;
-               }
-       }
-    
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       s->open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
-       mutex_unlock(&s->open_mutex);
-       return nonseekable_open(inode, file);
-}
-
-static int it8172_release(struct inode *inode, struct file *file)
-{
-       struct it8172_state *s = (struct it8172_state *)file->private_data;
-
-#ifdef IT8172_VERBOSE_DEBUG
-       dbg("%s", __FUNCTION__);
-#endif
-       lock_kernel();
-       if (file->f_mode & FMODE_WRITE)
-               drain_dac(s, file->f_flags & O_NONBLOCK);
-       mutex_lock(&s->open_mutex);
-       if (file->f_mode & FMODE_WRITE) {
-               stop_dac(s);
-               dealloc_dmabuf(s, &s->dma_dac);
-       }
-       if (file->f_mode & FMODE_READ) {
-               stop_adc(s);
-               dealloc_dmabuf(s, &s->dma_adc);
-       }
-       s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE));
-       mutex_unlock(&s->open_mutex);
-       wake_up(&s->open_wait);
-       unlock_kernel();
-       return 0;
-}
-
-static /*const*/ struct file_operations it8172_audio_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .read           = it8172_read,
-       .write          = it8172_write,
-       .poll           = it8172_poll,
-       .ioctl          = it8172_ioctl,
-       .mmap           = it8172_mmap,
-       .open           = it8172_open,
-       .release        = it8172_release,
-};
-
-
-/* --------------------------------------------------------------------- */
-
-
-/* --------------------------------------------------------------------- */
-
-/*
- * for debugging purposes, we'll create a proc device that dumps the
- * CODEC chipstate
- */
-
-#ifdef IT8172_DEBUG
-static int proc_it8172_dump (char *buf, char **start, off_t fpos,
-                            int length, int *eof, void *data)
-{
-       struct it8172_state *s;
-       int cnt, len = 0;
-
-       if (list_empty(&devs))
-               return 0;
-       s = list_entry(devs.next, struct it8172_state, devs);
-
-       /* print out header */
-       len += sprintf(buf + len, "\n\t\tIT8172 Audio Debug\n\n");
-
-       // print out digital controller state
-       len += sprintf (buf + len, "IT8172 Audio Controller registers\n");
-       len += sprintf (buf + len, "---------------------------------\n");
-       cnt=0;
-       while (cnt < 0x72) {
-               if (cnt == IT_AC_PCB1STA || cnt == IT_AC_PCB2STA ||
-                   cnt == IT_AC_CAPB1STA || cnt == IT_AC_CAPB2STA ||
-                   cnt == IT_AC_PFDP) {
-                       len+= sprintf (buf + len, "reg %02x = %08x\n",
-                                      cnt, inl(s->io+cnt));
-                       cnt += 4;
-               } else {
-                       len+= sprintf (buf + len, "reg %02x = %04x\n",
-                                      cnt, inw(s->io+cnt));
-                       cnt += 2;
-               }
-       }
-    
-       /* print out CODEC state */
-       len += sprintf (buf + len, "\nAC97 CODEC registers\n");
-       len += sprintf (buf + len, "----------------------\n");
-       for (cnt=0; cnt <= 0x7e; cnt = cnt +2)
-               len+= sprintf (buf + len, "reg %02x = %04x\n",
-                              cnt, rdcodec(&s->codec, cnt));
-
-       if (fpos >=len){
-               *start = buf;
-               *eof =1;
-               return 0;
-       }
-       *start = buf + fpos;
-       if ((len -= fpos) > length)
-               return length;
-       *eof =1;
-       return len;
-
-}
-#endif /* IT8172_DEBUG */
-
-/* --------------------------------------------------------------------- */
-
-/* maximum number of devices; only used for command line params */
-#define NR_DEVICE 5
-
-static int spdif[NR_DEVICE];
-static int i2s_fmt[NR_DEVICE];
-
-static unsigned int devindex;
-
-module_param_array(spdif, int, NULL, 0);
-MODULE_PARM_DESC(spdif, "if 1 the S/PDIF digital output is enabled");
-module_param_array(i2s_fmt, int, NULL, 0);
-MODULE_PARM_DESC(i2s_fmt, "the format of I2S");
-
-MODULE_AUTHOR("Monta Vista Software, stevel@mvista.com");
-MODULE_DESCRIPTION("IT8172 Audio Driver");
-
-/* --------------------------------------------------------------------- */
-
-static int __devinit it8172_probe(struct pci_dev *pcidev,
-                                 const struct pci_device_id *pciid)
-{
-       struct it8172_state *s;
-       int i, val;
-       unsigned short pcisr, vol;
-       unsigned char legacy, imc;
-       char proc_str[80];
-    
-       if (pcidev->irq == 0) 
-               return -1;
-
-       if (!(s = kmalloc(sizeof(struct it8172_state), GFP_KERNEL))) {
-               err("alloc of device struct failed");
-               return -1;
-       }
-       
-       memset(s, 0, sizeof(struct it8172_state));
-       init_waitqueue_head(&s->dma_adc.wait);
-       init_waitqueue_head(&s->dma_dac.wait);
-       init_waitqueue_head(&s->open_wait);
-       mutex_init(&s->open_mutex);
-       spin_lock_init(&s->lock);
-       s->dev = pcidev;
-       s->io = pci_resource_start(pcidev, 0);
-       s->irq = pcidev->irq;
-       s->vendor = pcidev->vendor;
-       s->device = pcidev->device;
-       pci_read_config_byte(pcidev, PCI_REVISION_ID, &s->rev);
-       s->codec.private_data = s;
-       s->codec.id = 0;
-       s->codec.codec_read = rdcodec;
-       s->codec.codec_write = wrcodec;
-       s->codec.codec_wait = waitcodec;
-
-       if (!request_region(s->io, pci_resource_len(pcidev,0),
-                           IT8172_MODULE_NAME)) {
-               err("io ports %#lx->%#lx in use",
-                   s->io, s->io + pci_resource_len(pcidev,0)-1);
-               goto err_region;
-       }
-       if (request_irq(s->irq, it8172_interrupt, IRQF_DISABLED,
-                       IT8172_MODULE_NAME, s)) {
-               err("irq %u in use", s->irq);
-               goto err_irq;
-       }
-
-       info("IO at %#lx, IRQ %d", s->io, s->irq);
-
-       /* register devices */
-       if ((s->dev_audio = register_sound_dsp(&it8172_audio_fops, -1)) < 0)
-               goto err_dev1;
-       if ((s->codec.dev_mixer =
-            register_sound_mixer(&it8172_mixer_fops, -1)) < 0)
-               goto err_dev2;
-
-#ifdef IT8172_DEBUG
-       /* initialize the debug proc device */
-       s->ps = create_proc_read_entry(IT8172_MODULE_NAME, 0, NULL,
-                                      proc_it8172_dump, NULL);
-#endif /* IT8172_DEBUG */
-       
-       /*
-        * Reset the Audio device using the IT8172 PCI Reset register. This
-        * creates an audible double click on a speaker connected to Line-out.
-        */
-       IT_IO_READ16(IT_PM_PCISR, pcisr);
-       pcisr |= IT_PM_PCISR_ACSR;
-       IT_IO_WRITE16(IT_PM_PCISR, pcisr);
-       /* wait up to 100msec for reset to complete */
-       for (i=0; pcisr & IT_PM_PCISR_ACSR; i++) {
-               it8172_delay(10);
-               if (i == 10)
-                       break;
-               IT_IO_READ16(IT_PM_PCISR, pcisr);
-       }
-       if (i == 10) {
-               err("chip reset timeout!");
-               goto err_dev3;
-       }
-    
-       /* enable pci io and bus mastering */
-       if (pci_enable_device(pcidev))
-               goto err_dev3;
-       pci_set_master(pcidev);
-
-       /* get out of legacy mode */
-       pci_read_config_byte (pcidev, 0x40, &legacy);
-       pci_write_config_byte (pcidev, 0x40, legacy & ~1);
-    
-       s->spdif_volume = -1;
-       /* check to see if s/pdif mode is being requested */
-       if (spdif[devindex]) {
-               info("enabling S/PDIF output");
-               s->spdif_volume = 0;
-               outb(GC_SOE, s->io+IT_AC_GC);
-       } else {
-               info("disabling S/PDIF output");
-               outb(0, s->io+IT_AC_GC);
-       }
-    
-       /* check to see if I2S format requested */
-       if (i2s_fmt[devindex]) {
-               info("setting I2S format to 0x%02x", i2s_fmt[devindex]);
-               outb(i2s_fmt[devindex], s->io+IT_AC_I2SMC);
-       } else {
-               outb(I2SMC_I2SF_I2S, s->io+IT_AC_I2SMC);
-       }
-
-       /* cold reset the AC97 */
-       outw(CODECC_CR, s->io+IT_AC_CODECC);
-       udelay(1000);
-       outw(0, s->io+IT_AC_CODECC);
-       /* need to delay around 500msec(bleech) to give
-          some CODECs enough time to wakeup */
-       it8172_delay(500);
-    
-       /* AC97 warm reset to start the bitclk */
-       outw(CODECC_WR, s->io+IT_AC_CODECC);
-       udelay(1000);
-       outw(0, s->io+IT_AC_CODECC);
-    
-       /* codec init */
-       if (!ac97_probe_codec(&s->codec))
-               goto err_dev3;
-
-       /* add I2S as allowable recording source */
-       s->codec.record_sources |= SOUND_MASK_I2S;
-       
-       /* Enable Volume button interrupts */
-       imc = inb(s->io+IT_AC_IMC);
-       outb(imc & ~IMC_VCIM, s->io+IT_AC_IMC);
-
-       /* Un-mute PCM and FM out on the controller */
-       vol = inw(s->io+IT_AC_PCMOV);
-       outw(vol & ~PCMOV_PCMOM, s->io+IT_AC_PCMOV);
-       vol = inw(s->io+IT_AC_FMOV);
-       outw(vol & ~FMOV_FMOM, s->io+IT_AC_FMOV);
-    
-       /* set channel defaults to 8-bit, mono, 8 Khz */
-       s->pcc = 0;
-       s->capcc = 0;
-       set_dac_rate(s, 8000);
-       set_adc_rate(s, 8000);
-
-       /* set mic to be the recording source */
-       val = SOUND_MASK_MIC;
-       mixdev_ioctl(&s->codec, SOUND_MIXER_WRITE_RECSRC,
-                    (unsigned long)&val);
-
-       /* mute AC'97 master and PCM when in S/PDIF mode */
-       if (s->spdif_volume != -1) {
-               val = 0x0000;
-               s->codec.mixer_ioctl(&s->codec, SOUND_MIXER_WRITE_VOLUME,
-                                    (unsigned long)&val);
-               s->codec.mixer_ioctl(&s->codec, SOUND_MIXER_WRITE_PCM,
-                                    (unsigned long)&val);
-       }
-    
-#ifdef IT8172_DEBUG
-       sprintf(proc_str, "driver/%s/%d/ac97", IT8172_MODULE_NAME,
-               s->codec.id);
-       s->ac97_ps = create_proc_read_entry (proc_str, 0, NULL,
-                                            ac97_read_proc, &s->codec);
-#endif
-    
-       /* store it in the driver field */
-       pci_set_drvdata(pcidev, s);
-       pcidev->dma_mask = 0xffffffff;
-       /* put it into driver list */
-       list_add_tail(&s->devs, &devs);
-       /* increment devindex */
-       if (devindex < NR_DEVICE-1)
-               devindex++;
-       return 0;
-
- err_dev3:
-       unregister_sound_mixer(s->codec.dev_mixer);
- err_dev2:
-       unregister_sound_dsp(s->dev_audio);
- err_dev1:
-       err("cannot register misc device");
-       free_irq(s->irq, s);
- err_irq:
-       release_region(s->io, pci_resource_len(pcidev,0));
- err_region:
-       kfree(s);
-       return -1;
-}
-
-static void __devexit it8172_remove(struct pci_dev *dev)
-{
-       struct it8172_state *s = pci_get_drvdata(dev);
-
-       if (!s)
-               return;
-       list_del(&s->devs);
-#ifdef IT8172_DEBUG
-       if (s->ps)
-               remove_proc_entry(IT8172_MODULE_NAME, NULL);
-#endif /* IT8172_DEBUG */
-       synchronize_irq(s->irq);
-       free_irq(s->irq, s);
-       release_region(s->io, pci_resource_len(dev,0));
-       unregister_sound_dsp(s->dev_audio);
-       unregister_sound_mixer(s->codec.dev_mixer);
-       kfree(s);
-       pci_set_drvdata(dev, NULL);
-}
-
-
-
-static struct pci_device_id id_table[] = {
-       { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_IT8172G_AUDIO, PCI_ANY_ID,
-         PCI_ANY_ID, 0, 0 },
-       { 0, }
-};
-
-MODULE_DEVICE_TABLE(pci, id_table);
-
-static struct pci_driver it8172_driver = {
-       .name = IT8172_MODULE_NAME,
-       .id_table = id_table,
-       .probe = it8172_probe,
-       .remove = __devexit_p(it8172_remove)
-};
-
-static int __init init_it8172(void)
-{
-       info("version v0.5 time " __TIME__ " " __DATE__);
-       return pci_register_driver(&it8172_driver);
-}
-
-static void __exit cleanup_it8172(void)
-{
-       info("unloading");
-       pci_unregister_driver(&it8172_driver);
-}
-
-module_init(init_it8172);
-module_exit(cleanup_it8172);
-
-/* --------------------------------------------------------------------- */
-
-#ifndef MODULE
-
-/* format is: it8172=[spdif],[i2s:<I2S format>] */
-
-static int __init it8172_setup(char *options)
-{
-       char* this_opt;
-       static unsigned __initdata nr_dev = 0;
-
-       if (nr_dev >= NR_DEVICE)
-               return 0;
-
-       if (!options || !*options)
-               return 0;
-
-       while (this_opt = strsep(&options, ",")) {
-               if (!*this_opt)
-                       continue;
-               if (!strncmp(this_opt, "spdif", 5)) {
-                       spdif[nr_dev] = 1;
-               } else if (!strncmp(this_opt, "i2s:", 4)) {
-                       if (!strncmp(this_opt+4, "dac", 3))
-                               i2s_fmt[nr_dev] = I2SMC_I2SF_DAC;
-                       else if (!strncmp(this_opt+4, "adc", 3))
-                               i2s_fmt[nr_dev] = I2SMC_I2SF_ADC;
-                       else if (!strncmp(this_opt+4, "i2s", 3))
-                               i2s_fmt[nr_dev] = I2SMC_I2SF_I2S;
-               }
-       }
-
-       nr_dev++;
-       return 1;
-}
-
-__setup("it8172=", it8172_setup);
-
-#endif /* MODULE */