Merge remote branch 'linux-2.6.32.y/master' into develop
author黄涛 <huangtao@rock-chips.com>
Thu, 16 Dec 2010 12:54:24 +0000 (20:54 +0800)
committer黄涛 <huangtao@rock-chips.com>
Thu, 16 Dec 2010 12:54:24 +0000 (20:54 +0800)
Conflicts:
drivers/i2c/busses/Kconfig
drivers/net/dm9000.c
drivers/net/wireless/libertas/if_sdio1.c
drivers/usb/serial/option.c
net/bluetooth/rfcomm/core.c

40 files changed:
1  2 
Makefile
arch/arm/Kconfig
arch/arm/boot/compressed/head.S
drivers/Makefile
drivers/base/firmware_class.c
drivers/bluetooth/hci_ldisc.c
drivers/char/mem.c
drivers/i2c/busses/Kconfig
drivers/i2c/i2c-core.c
drivers/net/dm9000.c
drivers/net/wireless/ath/ar9170/main.c
drivers/net/wireless/libertas/if_sdio1.c
drivers/rtc/class.c
drivers/staging/Kconfig
drivers/staging/Makefile
drivers/usb/core/hcd.c
drivers/usb/core/hub.c
drivers/usb/core/usb.c
drivers/usb/serial/option.c
fs/fs-writeback.c
fs/proc/base.c
fs/proc/task_mmu.c
include/linux/mm.h
include/linux/sched.h
include/net/tcp.h
init/initramfs.c
kernel/cgroup_freezer.c
kernel/cpuset.c
kernel/fork.c
kernel/futex.c
kernel/power/process.c
kernel/sched.c
kernel/sys.c
mm/page_alloc.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/core.c
net/bluetooth/sco.c
net/ipv4/devinet.c
net/socket.c
sound/core/pcm_native.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 51ff3ef58ec75610b70afeb0cc4428d461fa69b5,e3d4eda93ed95f915e186a2caaa7e48bf1524e6f..ac2f0f23b6eb456e9e35dffa487cee208bcc5d6b
mode 100755,100644..100755
Simple merge
index 51c404943ac85addc16f5f67cbbe31d93ec4de69,2dd2ce93cbe1566a02ec3f43facbff9a5283144a..eb6df5f1a6dea2fcdb747e353dbcc195dfd8d2a3
  
  menu "I2C Hardware Bus support"
  
 -      default y
 -      help
 -        This exposes the various PowerMac i2c interfaces to the linux i2c
 -        layer and to userland. It is used by various drivers on the PowerMac
 -        platform, and should generally be enabled.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called i2c-powermac.
 -
 -comment "I2C system bus drivers (mostly embedded / system-on-chip)"
 -
 -config I2C_AT91
 -      tristate "Atmel AT91 I2C Two-Wire interface (TWI)"
 -      depends on ARCH_AT91 && EXPERIMENTAL && BROKEN
 -      help
 -        This supports the use of the I2C interface on Atmel AT91
 -        processors.
 -
 -        This driver is BROKEN because the controller which it uses
 -        will easily trigger RX overrun and TX underrun errors.  Using
 -        low I2C clock rates may partially work around those issues
 -        on some systems.  Another serious problem is that there is no
 -        documented way to issue repeated START conditions, as needed
 -        to support combined I2C messages.  Use the i2c-gpio driver
 -        unless your system can cope with those limitations.
 -
 -config I2C_AU1550
 -      tristate "Au1550/Au1200 SMBus interface"
 -      depends on SOC_AU1550 || SOC_AU1200
 -      help
 -        If you say yes to this option, support will be included for the
 -        Au1550 and Au1200 SMBus interface.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-au1550.
 -
 -config I2C_BLACKFIN_TWI
 -      tristate "Blackfin TWI I2C support"
 -      depends on BLACKFIN
 -      depends on !BF561 && !BF531 && !BF532 && !BF533
 -      help
 -        This is the I2C bus driver for Blackfin on-chip TWI interface.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-bfin-twi.
 -
 -config I2C_BLACKFIN_TWI_CLK_KHZ
 -      int "Blackfin TWI I2C clock (kHz)"
 -      depends on I2C_BLACKFIN_TWI
 -      range 21 400
 -      default 50
 -      help
 -        The unit of the TWI clock is kHz.
 -
 -config I2C_CPM
 -      tristate "Freescale CPM1 or CPM2 (MPC8xx/826x)"
 -      depends on (CPM1 || CPM2) && OF_I2C
 -      help
 -        This supports the use of the I2C interface on Freescale
 -        processors with CPM1 or CPM2.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-cpm.
 -
 -config I2C_DAVINCI
 -      tristate "DaVinci I2C driver"
 -      depends on ARCH_DAVINCI
 -      help
 -        Support for TI DaVinci I2C controller driver.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-davinci.
 -
 -        Please note that this driver might be needed to bring up other
 -        devices such as DaVinci NIC.
 -        For details please see http://www.ti.com/davinci
 -
 -config I2C_DESIGNWARE
 -      tristate "Synopsys DesignWare"
 -      depends on HAVE_CLK
 -      help
 -        If you say yes to this option, support will be included for the
 -        Synopsys DesignWare I2C adapter. Only master mode is supported.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-designware.
 -
 -config I2C_GPIO
 -      tristate "GPIO-based bitbanging I2C"
 -      depends on GENERIC_GPIO
 -      select I2C_ALGOBIT
 -      help
 -        This is a very simple bitbanging I2C driver utilizing the
 -        arch-neutral GPIO API to control the SCL and SDA lines.
 -
 -config I2C_HIGHLANDER
 -      tristate "Highlander FPGA SMBus interface"
 -      depends on SH_HIGHLANDER
 -      help
 -        If you say yes to this option, support will be included for
 -        the SMBus interface located in the FPGA on various Highlander
 -        boards, particularly the R0P7780LC0011RL and R0P7785LC0011RL
 -        FPGAs. This is wholly unrelated to the SoC I2C.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-highlander.
 -
 -config I2C_IBM_IIC
 -      tristate "IBM PPC 4xx on-chip I2C interface"
 -      depends on 4xx
 -      help
 -        Say Y here if you want to use IIC peripheral found on
 -        embedded IBM PPC 4xx based systems.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-ibm_iic.
 -
 -config I2C_IMX
 -      tristate "IMX I2C interface"
 -      depends on ARCH_MXC
 -      help
 -        Say Y here if you want to use the IIC bus controller on
 -        the Freescale i.MX/MXC processors.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-imx.
 -
 -config I2C_IOP3XX
 -      tristate "Intel IOPx3xx and IXP4xx on-chip I2C interface"
 -      depends on ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX || ARCH_IOP13XX
 -      help
 -        Say Y here if you want to use the IIC bus controller on
 -        the Intel IOPx3xx I/O Processors or IXP4xx Network Processors.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-iop3xx.
 -
 -config I2C_IXP2000
 -      tristate "IXP2000 GPIO-Based I2C Interface (DEPRECATED)"
 -      depends on ARCH_IXP2000
 -      select I2C_ALGOBIT
 -      help
 -        Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based
 -        system and are using GPIO lines for an I2C bus.
 -
 -        This support is also available as a module. If so, the module
 -        will be called i2c-ixp2000.
 -
 -        This driver is deprecated and will be dropped soon. Use i2c-gpio
 -        instead.
 -
 -config I2C_MPC
 -      tristate "MPC107/824x/85xx/52xx/86xx"
 -      depends on PPC32
 -      help
 -        If you say yes to this option, support will be included for the
 -        built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245 and
 -        MPC85xx/MPC8641 family processors. The driver may also work on 52xx
 -        family processors, though interrupts are known not to work.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-mpc.
 -
 -config I2C_MV64XXX
 -      tristate "Marvell mv64xxx I2C Controller"
 -      depends on (MV64X60 || PLAT_ORION) && EXPERIMENTAL
 -      help
 -        If you say yes to this option, support will be included for the
 -        built-in I2C interface on the Marvell 64xxx line of host bridges.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-mv64xxx.
+ comment "PC SMBus host controller drivers"
+       depends on PCI
+ config I2C_ALI1535
+       tristate "ALI 1535"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the SMB
+         Host controller on Acer Labs Inc. (ALI) M1535 South Bridges.  The SMB
+         controller is part of the 7101 device, which is an ACPI-compliant
+         Power Management Unit (PMU).
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-ali1535.
+ config I2C_ALI1563
+       tristate "ALI 1563"
+       depends on PCI && EXPERIMENTAL
+       help
+         If you say yes to this option, support will be included for the SMB
+         Host controller on Acer Labs Inc. (ALI) M1563 South Bridges.  The SMB
+         controller is part of the 7101 device, which is an ACPI-compliant
+         Power Management Unit (PMU).
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-ali1563.
+ config I2C_ALI15X3
+       tristate "ALI 15x3"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the
+         Acer Labs Inc. (ALI) M1514 and M1543 motherboard I2C interfaces.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-ali15x3.
+ config I2C_AMD756
+       tristate "AMD 756/766/768/8111 and nVidia nForce"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the AMD
+         756/766/768 mainboard I2C interfaces.  The driver also includes
+         support for the first (SMBus 1.0) I2C interface of the AMD 8111 and
+         the nVidia nForce I2C interface.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-amd756.
+ config I2C_AMD756_S4882
+       tristate "SMBus multiplexing on the Tyan S4882"
+       depends on I2C_AMD756 && X86 && EXPERIMENTAL
+       help
+         Enabling this option will add specific SMBus support for the Tyan
+         S4882 motherboard.  On this 4-CPU board, the SMBus is multiplexed
+         over 8 different channels, where the various memory module EEPROMs
+         and temperature sensors live.  Saying yes here will give you access
+         to these in addition to the trunk.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-amd756-s4882.
+ config I2C_AMD8111
+       tristate "AMD 8111"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the
+         second (SMBus 2.0) AMD 8111 mainboard I2C interface.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-amd8111.
+ config I2C_I801
+       tristate "Intel 82801 (ICH/PCH)"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the Intel
+         801 family of mainboard I2C interfaces.  Specifically, the following
+         versions of the chipset are supported:
+           82801AA
+           82801AB
+           82801BA
+           82801CA/CAM
+           82801DB
+           82801EB/ER (ICH5/ICH5R)
+           6300ESB
+           ICH6
+           ICH7
+           ESB2
+           ICH8
+           ICH9
+           Tolapai
+           ICH10
+           3400/5 Series (PCH)
+           Cougar Point (PCH)
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-i801.
+ config I2C_ISCH
+       tristate "Intel SCH SMBus 1.0"
+       depends on PCI
+       help
+         Say Y here if you want to use SMBus controller on the Intel SCH
+         based systems.
+         This driver can also be built as a module. If so, the module
+         will be called i2c-isch.
+ config I2C_PIIX4
+       tristate "Intel PIIX4 and compatible (ATI/AMD/Serverworks/Broadcom/SMSC)"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the Intel
+         PIIX4 family of mainboard I2C interfaces.  Specifically, the following
+         versions of the chipset are supported (note that Serverworks is part
+         of Broadcom):
+           Intel PIIX4
+           Intel 440MX
+           ATI IXP200
+           ATI IXP300
+           ATI IXP400
+           ATI SB600
+           ATI SB700
+           ATI SB800
+           AMD Hudson-2
+           Serverworks OSB4
+           Serverworks CSB5
+           Serverworks CSB6
+           Serverworks HT-1000
+           Serverworks HT-1100
+           SMSC Victory66
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-piix4.
+ config I2C_NFORCE2
+       tristate "Nvidia nForce2, nForce3 and nForce4"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the Nvidia
+         nForce2, nForce3 and nForce4 families of mainboard I2C interfaces.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-nforce2.
+ config I2C_NFORCE2_S4985
+       tristate "SMBus multiplexing on the Tyan S4985"
+       depends on I2C_NFORCE2 && X86 && EXPERIMENTAL
+       help
+         Enabling this option will add specific SMBus support for the Tyan
+         S4985 motherboard.  On this 4-CPU board, the SMBus is multiplexed
+         over 4 different channels, where the various memory module EEPROMs
+         live.  Saying yes here will give you access to these in addition
+         to the trunk.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-nforce2-s4985.
+ config I2C_SIS5595
+       tristate "SiS 5595"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the
+         SiS5595 SMBus (a subset of I2C) interface.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-sis5595.
+ config I2C_SIS630
+       tristate "SiS 630/730"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the
+         SiS630 and SiS730 SMBus (a subset of I2C) interface.
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-sis630.
+ config I2C_SIS96X
+       tristate "SiS 96x"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the SiS
+         96x SMBus (a subset of I2C) interfaces.  Specifically, the following
+         chipsets are supported:
+           645/961
+           645DX/961
+           645DX/962
+           648/961
+           650/961
+           735
+           745
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-sis96x.
+ config I2C_VIA
+       tristate "VIA VT82C586B"
+       depends on PCI && EXPERIMENTAL
+       select I2C_ALGOBIT
+       help
+         If you say yes to this option, support will be included for the VIA
+           82C586B I2C interface
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-via.
+ config I2C_VIAPRO
+       tristate "VIA VT82C596/82C686/82xx and CX700/VX8xx"
+       depends on PCI
+       help
+         If you say yes to this option, support will be included for the VIA
+         VT82C596 and later SMBus interface.  Specifically, the following
+         chipsets are supported:
+           VT82C596A/B
+           VT82C686A/B
+           VT8231
+           VT8233/A
+           VT8235
+           VT8237R/A/S
+           VT8251
+           CX700
+           VX800/VX820
+           VX855/VX875
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-viapro.
+ if ACPI
+ comment "ACPI drivers"
+ config I2C_SCMI
+       tristate "SMBus Control Method Interface"
+       help
+         This driver supports the SMBus Control Method Interface. It needs the
+         BIOS to declare ACPI control methods as described in the SMBus Control
+         Method Interface specification.
+         To compile this driver as a module, choose M here:
+         the module will be called i2c-scmi.
+ endif # ACPI
+ comment "Mac SMBus host controller drivers"
+       depends on PPC_CHRP || PPC_PMAC
+ config I2C_HYDRA
+       tristate "CHRP Apple Hydra Mac I/O I2C interface"
+       depends on PCI && PPC_CHRP && EXPERIMENTAL
+       select I2C_ALGOBIT
+       help
+         This supports the use of the I2C interface in the Apple Hydra Mac
+         I/O chip on some CHRP machines (e.g. the LongTrail).  Say Y if you
+         have such a machine.
+         This support is also available as a module.  If so, the module
+         will be called i2c-hydra.
+ config I2C_POWERMAC
+       tristate "Powermac I2C interface"
+       depends on PPC_PMAC
 -config I2C_OCORES
 -      tristate "OpenCores I2C Controller"
 -      depends on EXPERIMENTAL
 -      help
 -        If you say yes to this option, support will be included for the
 -        OpenCores I2C controller. For details see
 -        http://www.opencores.org/projects.cgi/web/i2c/overview
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-ocores.
 -
 -config I2C_OMAP
 -      tristate "OMAP I2C adapter"
 -      depends on ARCH_OMAP
 -      default y if MACH_OMAP_H3 || MACH_OMAP_OSK
 -      help
 -        If you say yes to this option, support will be included for the
 -        I2C interface on the Texas Instruments OMAP1/2 family of processors.
 -        Like OMAP1510/1610/1710/5912 and OMAP242x.
 -        For details see http://www.ti.com/omap.
 -
 -config I2C_PASEMI
 -      tristate "PA Semi SMBus interface"
 -      depends on PPC_PASEMI && PCI
 -      help
 -        Supports the PA Semi PWRficient on-chip SMBus interfaces.
 -
 -config I2C_PNX
 -      tristate "I2C bus support for Philips PNX targets"
 -      depends on ARCH_PNX4008
 -      help
 -        This driver supports the Philips IP3204 I2C IP block master and/or
 -        slave controller
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-pnx.
 -
 -config I2C_PXA
 -      tristate "Intel PXA2XX I2C adapter"
 -      depends on ARCH_PXA || ARCH_MMP
 -      help
 -        If you have devices in the PXA I2C bus, say yes to this option.
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-pxa.
 -
 -config I2C_PXA_SLAVE
 -      bool "Intel PXA2XX I2C Slave comms support"
 -      depends on I2C_PXA
 -      help
 -        Support I2C slave mode communications on the PXA I2C bus.  This
 -        is necessary for systems where the PXA may be a target on the
 -        I2C bus.
 -
 -config I2C_S3C2410
 -      tristate "S3C2410 I2C Driver"
 -      depends on ARCH_S3C2410 || ARCH_S3C64XX
 -      help
 -        Say Y here to include support for I2C controller in the
 -        Samsung S3C2410 based System-on-Chip devices.
 -
 -config I2C_S6000
 -      tristate "S6000 I2C support"
 -      depends on XTENSA_VARIANT_S6000
 -      help
 -        This driver supports the on chip I2C device on the
 -        S6000 xtensa processor family.
 -
 -        To compile this driver as a module, choose M here. The module
 -        will be called i2c-s6000.
 -
 -config I2C_SH7760
 -      tristate "Renesas SH7760 I2C Controller"
 -      depends on CPU_SUBTYPE_SH7760
 -      help
 -        This driver supports the 2 I2C interfaces on the Renesas SH7760.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-sh7760.
 -
 -config I2C_SH_MOBILE
 -      tristate "SuperH Mobile I2C Controller"
 -      depends on SUPERH
 -      help
 -        If you say yes to this option, support will be included for the
 -        built-in I2C interface on the Renesas SH-Mobile processor.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-sh_mobile.
 -
 -config I2C_SIMTEC
 -      tristate "Simtec Generic I2C interface"
 -      select I2C_ALGOBIT
 -      help
 -        If you say yes to this option, support will be included for
 -        the Simtec Generic I2C interface. This driver is for the
 -        simple I2C bus used on newer Simtec products for general
 -        I2C, such as DDC on the Simtec BBD2016A.
 -
 -        This driver can also be built as a module. If so, the module
 -        will be called i2c-simtec.
 -
 -config I2C_STU300
 -      tristate "ST Microelectronics DDC I2C interface"
 -      depends on MACH_U300
 -      default y if MACH_U300
 -      help
 -        If you say yes to this option, support will be included for the
 -        I2C interface from ST Microelectronics simply called "DDC I2C"
 -        supporting both I2C and DDC, used in e.g. the U300 series
 -        mobile platforms.
 -
 -        This driver can also be built as a module. If so, the module
 -        will be called i2c-stu300.
 -
 -config I2C_VERSATILE
 -      tristate "ARM Versatile/Realview I2C bus support"
 -      depends on ARCH_VERSATILE || ARCH_REALVIEW
 -      select I2C_ALGOBIT
 -      help
 -        Say yes if you want to support the I2C serial bus on ARMs Versatile
 -        range of platforms.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-versatile.
 -
 -comment "External I2C/SMBus adapter drivers"
 -
 -config I2C_PARPORT
 -      tristate "Parallel port adapter"
 -      depends on PARPORT
 -      select I2C_ALGOBIT
 -      help
 -        This supports parallel port I2C adapters such as the ones made by
 -        Philips or Velleman, Analog Devices evaluation boards, and more.
 -        Basically any adapter using the parallel port as an I2C bus with
 -        no extra chipset is supported by this driver, or could be.
 -
 -        This driver is a replacement for (and was inspired by) an older
 -        driver named i2c-philips-par.  The new driver supports more devices,
 -        and makes it easier to add support for new devices.
 -
 -        An adapter type parameter is now mandatory.  Please read the file
 -        Documentation/i2c/busses/i2c-parport for details.
 -
 -        Another driver exists, named i2c-parport-light, which doesn't depend
 -        on the parport driver.  This is meant for embedded systems. Don't say
 -        Y here if you intend to say Y or M there.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called i2c-parport.
 -
 -config I2C_PARPORT_LIGHT
 -      tristate "Parallel port adapter (light)"
 -      select I2C_ALGOBIT
 -      help
 -        This supports parallel port I2C adapters such as the ones made by
 -        Philips or Velleman, Analog Devices evaluation boards, and more.
 -        Basically any adapter using the parallel port as an I2C bus with
 -        no extra chipset is supported by this driver, or could be.
 -
 -        This driver is a light version of i2c-parport.  It doesn't depend
 -        on the parport driver, and uses direct I/O access instead.  This
 -        might be preferred on embedded systems where wasting memory for
 -        the clean but heavy parport handling is not an option.  The
 -        drawback is a reduced portability and the impossibility to
 -        daisy-chain other parallel port devices.
 -
 -        Don't say Y here if you said Y or M to i2c-parport.  Saying M to
 -        both is possible but both modules should not be loaded at the same
 -        time.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called i2c-parport-light.
 -
 -config I2C_TAOS_EVM
 -      tristate "TAOS evaluation module"
 -      depends on EXPERIMENTAL
 -      select SERIO
 -      select SERIO_SERPORT
 -      default n
 -      help
 -        This supports TAOS evaluation modules on serial port. In order to
 -        use this driver, you will need the inputattach tool, which is part
 -        of the input-utils package.
 -
 -        If unsure, say N.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called i2c-taos-evm.
 -
 -config I2C_TINY_USB
 -      tristate "Tiny-USB adapter"
 -      depends on USB
 -      help
 -        If you say yes to this option, support will be included for the
 -        i2c-tiny-usb, a simple do-it-yourself USB to I2C interface. See
 -        http://www.harbaum.org/till/i2c_tiny_usb for hardware details.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-tiny-usb.
 -
 -comment "Graphics adapter I2C/DDC channel drivers"
 -      depends on PCI
 -
 -config I2C_VOODOO3
 -      tristate "Voodoo 3 (DEPRECATED)"
 -      depends on PCI
 -      select I2C_ALGOBIT
 -      help
 -        If you say yes to this option, support will be included for the
 -        Voodoo 3 I2C interface. This driver is deprecated and you should
 -        use the tdfxfb driver instead, which additionally provides
 -        framebuffer support.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-voodoo3.
 -
 -comment "Other I2C/SMBus bus drivers"
 -
 -config I2C_ACORN
 -      tristate "Acorn IOC/IOMD I2C bus support"
 -      depends on ARCH_ACORN
 +config I2C_RK2818
 +      tristate "RK2818 i2c interface (I2C)"
 +      depends on ARCH_RK2818
        default y
 -      select I2C_ALGOBIT
 -      help
 -        Say yes if you want to support the I2C bus on Acorn platforms.
 -
 -        If you don't know, say Y.
 -
 -config I2C_ELEKTOR
 -      tristate "Elektor ISA card"
 -      depends on ISA && BROKEN_ON_SMP
 -      select I2C_ALGOPCF
 -      help
 -        This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
 -        such an adapter.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called i2c-elektor.
 -
 -config I2C_PCA_ISA
 -      tristate "PCA9564/PCA9665 on an ISA bus"
 -      depends on ISA
 -      select I2C_ALGOPCA
 -      default n
 -      help
 -        This driver supports ISA boards using the Philips PCA9564/PCA9665
 -        parallel bus to I2C bus controller.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-pca-isa.
 -
 -        This device is almost undetectable and using this driver on a
 -        system which doesn't have this device will result in long
 -        delays when I2C/SMBus chip drivers are loaded (e.g. at boot
 -        time).  If unsure, say N.
 -
 -config I2C_PCA_PLATFORM
 -      tristate "PCA9564/PCA9665 as platform device"
 -      select I2C_ALGOPCA
 -      default n
 -      help
 -        This driver supports a memory mapped Philips PCA9564/PCA9665
 -        parallel bus to I2C bus controller.
 -
 -        This driver can also be built as a module.  If so, the module
 -        will be called i2c-pca-platform.
 -
 -config I2C_PMCMSP
 -      tristate "PMC MSP I2C TWI Controller"
 -      depends on PMC_MSP
 -      help
 -        This driver supports the PMC TWI controller on MSP devices.
 -
 -        This driver can also be built as module. If so, the module
 -        will be called i2c-pmcmsp.
 -
 -config I2C_SIBYTE
 -      tristate "SiByte SMBus interface"
 -      depends on SIBYTE_SB1xxx_SOC
 -      help
 -        Supports the SiByte SOC on-chip I2C interfaces (2 channels).
 -
 -config I2C_STUB
 -      tristate "I2C/SMBus Test Stub"
 -      depends on EXPERIMENTAL && m
 -      default 'n'
 -      help
 -        This module may be useful to developers of SMBus client drivers,
 -        especially for certain kinds of sensor chips.
 -
 -        If you do build this module, be sure to read the notes and warnings
 -        in <file:Documentation/i2c/i2c-stub>.
 -
 -        If you don't know what to do here, definitely say N.
 -
 -config SCx200_I2C
 -      tristate "NatSemi SCx200 I2C using GPIO pins (DEPRECATED)"
 -      depends on SCx200_GPIO
 -      select I2C_ALGOBIT
        help
 -        Enable the use of two GPIO pins of a SCx200 processor as an I2C bus.
 -
 -        If you don't know what to do here, say N.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called scx200_i2c.
 -
 -        This driver is deprecated and will be dropped soon. Use i2c-gpio
 -        (or scx200_acb) instead.
 -
 -config SCx200_I2C_SCL
 -      int "GPIO pin used for SCL"
 -      depends on SCx200_I2C
 -      default "12"
 -      help
 -        Enter the GPIO pin number used for the SCL signal.  This value can
 -        also be specified with a module parameter.
 -
 -config SCx200_I2C_SDA
 -      int "GPIO pin used for SDA"
 -      depends on SCx200_I2C
 -      default "13"
 -      help
 -        Enter the GPIO pin number used for the SSA signal.  This value can
 -        also be specified with a module parameter.
 -
 -config SCx200_ACB
 -      tristate "Geode ACCESS.bus support"
 -      depends on X86_32 && PCI
 +              This supports the use of the I2C interface on rk2818 processors.
 +
 +if I2C_RK2818
 +      comment "Now, there are two I2C interfaces selected by developer."
 +      
 +      config I2C0_RK2818
 +              bool "RK2818 I2C0 interface support"
 +              default y
 +              depends on ARCH_RK2818
 +              help
 +                      This supports the use of the I2C0 interface on rk2818 processors.
 +      config I2C1_RK2818
 +              bool "RK2818 I2C1 interface support"
 +              default y
 +              depends on ARCH_RK2818
 +              help
 +                      This supports the use of the I2C1 interface on rk2818 processors.
 +endif
 +config I2C_RK29
 +      tristate "RK29 i2c interface (I2C)"
 +      depends on ARCH_RK29
 +      default y
        help
 -        Enable the use of the ACCESS.bus controllers on the Geode SCx200 and
 -        SC1100 processors and the CS5535 and CS5536 Geode companion devices.
 -
 -        If you don't know what to do here, say N.
 -
 -        This support is also available as a module.  If so, the module
 -        will be called scx200_acb.
 -
 +              This supports the use of the I2C interface(i2c0 ~ i2c3) on rk29 processors.
 +
 +if I2C_RK29
 +      comment "Now, there are four I2C interfaces selected by developer."
 +      
 +      config I2C0_RK29
 +              bool "RK29 I2C0 interface support"
 +              default y
 +              depends on ARCH_RK29
 +              help
 +                      This supports the use of the I2C0 interface on rk29 processors.
 +
 +      config I2C1_RK29
 +              bool "RK29 I2C1 interface support"
 +              default y
 +              depends on ARCH_RK29
 +              help
 +                      This supports the use of the I2C1 interface on rk29 processors.
 +
 +      config I2C2_RK29
 +              bool "RK29 I2C2 interface support"
 +              default y
 +              depends on ARCH_RK29
 +              help
 +                      This supports the use of the I2C2 interface on rk29 processors.
 +
 +      config I2C3_RK29
 +              bool "RK29 I2C3 interface support"
 +              default y
 +              depends on ARCH_RK29 && !UART3_CTS_RTS_RK29
 +              help
 +                      This supports the use of the I2C3 interface on rk29 processors.
 +endif
 +config I2C_DEV_RK29
 +      tristate "RK29 I2C device interface support"
 +              default n
 +              depends on I2C_RK29
 +              help
 +                      Nothing
  endmenu
index a59cba96f494bff3f317e275052cf1d407e3eb71,8066db706e6cffdc6b9131dc08899c6a836a06b4..398881e40f6a4ae4ff54626ffa7482c56ae959c9
mode 100755,100644..100755
index 26ad04afe73eca558218ea3b502f59cd431787f8,3f5eb81cc2aa34718e0646299ada34e61683ac45..f023d7b42ff9fcc895d2db058d17b3af17934522
mode 100755,100644..100755
@@@ -716,14 -685,9 +728,11 @@@ dm9000_hash_table_unlocked(struct net_d
        u32 hash_val;
        u16 hash_table[4];
        u8 rcr = RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN;
-       unsigned long flags;
  
        dm9000_dbg(db, 1, "entering %s\n", __func__);
 +      
 +      rk2818_nand_status_mutex_lock();
  
-       spin_lock_irqsave(&db->lock, flags);
-       
        for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++)
                iow(db, oft, dev->dev_addr[i]);
  
        }
  
        iow(db, DM9000_RCR, rcr);
+ }
+ static void
+ dm9000_hash_table(struct net_device *dev)
+ {
+       board_info_t *db = netdev_priv(dev);
+       unsigned long flags;
+       spin_lock_irqsave(&db->lock, flags);
+       dm9000_hash_table_unlocked(dev);
        spin_unlock_irqrestore(&db->lock, flags);
 +      
 +      rk2818_nand_status_mutex_unlock();
  }
  
  /*
index 90a47d35032a0ae1e4110a0156153fd8949469a4,0000000000000000000000000000000000000000..2f45d6a3269aa065eef0768aa717d0b433237ee0
mode 100755,000000..100755
--- /dev/null
@@@ -1,1251 -1,0 +1,1272 @@@
 +/*
 + *  linux/drivers/net/wireless/libertas/if_sdio.c
 + *
 + *  Copyright 2007-2008 Pierre Ossman
 + *
 + * Inspired by if_cs.c, Copyright 2007 Holger Schurig
 + *
 + * 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 hardware has more or less no CMD53 support, so all registers
 + * must be accessed using sdio_readb()/sdio_writeb().
 + *
 + * Transfers must be in one transaction or the firmware goes bonkers.
 + * This means that the transfer must either be small enough to do a
 + * byte based transfer or it must be padded to a multiple of the
 + * current block size.
 + *
 + * As SDIO is still new to the kernel, it is unfortunately common with
 + * bugs in the host controllers related to that. One such bug is that
 + * controllers cannot do transfers that aren't a multiple of 4 bytes.
 + * If you don't have time to fix the host controller driver, you can
 + * work around the problem by modifying if_sdio_host_to_card() and
 + * if_sdio_card_to_host() to pad the data.
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/moduleparam.h>
 +#include <linux/firmware.h>
 +#include <linux/netdevice.h>
 +#include <linux/delay.h>
 +#include <linux/mmc/card.h>
 +#include <linux/mmc/sdio_func.h>
 +#include <linux/mmc/sdio_ids.h>
++#include <linux/mmc/sdio.h>
 +#include <linux/mmc/host.h>
 +
 +#include "host.h"
 +#include "decl.h"
 +#include "defs.h"
 +#include "dev.h"
 +#include "cmd.h"
 +#include "if_sdio.h"
 +#include "wifi_power.h"
 +
 +extern struct mmc_host *wifi_mmc_host;
 +
 +/* The if_sdio_remove() callback function is called when
 + * user removes this module from kernel space or ejects
 + * the card from the slot. The driver handles these 2 cases
 + * differently for SD8688 combo chip.
 + * If the user is removing the module, the FUNC_SHUTDOWN
 + * command for SD8688 is sent to the firmware.
 + * If the card is removed, there is no need to send this command.
 + *
 + * The variable 'user_rmmod' is used to distinguish these two
 + * scenarios. This flag is initialized as FALSE in case the card
 + * is removed, and will be set to TRUE for module removal when
 + * module_exit function is called.
 + */
 +static u8 user_rmmod;
 +
 +struct sdio_func *wifi_sdio_func;
 +
 +EXPORT_SYMBOL(wifi_sdio_func);
 +static char *lbs_helper_name = NULL;
 +module_param_named(helper_name, lbs_helper_name, charp, 0644);
 +
 +static char *lbs_fw_name = NULL;
 +module_param_named(fw_name, lbs_fw_name, charp, 0644);
 +
 +static const struct sdio_device_id if_sdio_ids[] = {
 +      { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
 +                      SDIO_DEVICE_ID_MARVELL_LIBERTAS) },
 +      { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
 +                      SDIO_DEVICE_ID_MARVELL_8688WLAN) },
 +      { /* end: all zeroes */                         },
 +};
 +
 +MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
 +
 +struct if_sdio_model {
 +      int model;
 +      const char *helper;
 +      const char *firmware;
 +};
 +
 +static struct if_sdio_model if_sdio_models[] = {
 +      {
 +              /* 8385 */
 +              .model = IF_SDIO_MODEL_8385,
 +              .helper = "sd8385_helper.bin",
 +              .firmware = "sd8385.bin",
 +      },
 +      {
 +              /* 8686 */
 +              .model = IF_SDIO_MODEL_8686,
 +              .helper = "sd8686_helper.bin",
 +              .firmware = "sd8686.bin",
 +      },
 +      {
 +              /* 8688 */
 +              .model = IF_SDIO_MODEL_8688,
 +              .helper = "sd8688_helper.bin",
 +              .firmware = "sd8688.bin",
 +      },
 +};
 +
 +struct if_sdio_packet {
 +      struct if_sdio_packet   *next;
 +      u16                     nb;
 +      u8                      buffer[0] __attribute__((aligned(4)));
 +};
 +
 +struct if_sdio_card {
 +      struct sdio_func        *func;
 +      struct lbs_private      *priv;
 +
 +      int                     model;
 +      unsigned long           ioport;
 +      unsigned int            scratch_reg;
 +
 +      const char              *helper;
 +      const char              *firmware;
 +
 +      u8                      buffer[65536];
 +
 +      spinlock_t              lock;
 +      struct if_sdio_packet   *packets;
 +
 +      struct workqueue_struct *workqueue;
 +      struct work_struct      packet_worker;
 +
 +      u8                      rx_unit;
 +};
 +
 +/********************************************************************/
 +/* I/O                                                              */
 +/********************************************************************/
 +
 +/*
 + *  For SD8385/SD8686, this function reads firmware status after
 + *  the image is downloaded, or reads RX packet length when
 + *  interrupt (with IF_SDIO_H_INT_UPLD bit set) is received.
 + *  For SD8688, this function reads firmware status only.
 + */
 +static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err)
 +{
 +      int ret;
 +      u16 scratch;
 +
 +      scratch = sdio_readb(card->func, card->scratch_reg, &ret);
 +      if (!ret)
 +              scratch |= sdio_readb(card->func, card->scratch_reg + 1,
 +                                      &ret) << 8;
 +
 +      if (err)
 +              *err = ret;
 +
 +      if (ret)
 +              return 0xffff;
 +
 +      return scratch;
 +}
 +
 +static u8 if_sdio_read_rx_unit(struct if_sdio_card *card)
 +{
 +      int ret;
 +      u8 rx_unit;
 +
 +      rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret);
 +
 +      if (ret)
 +              rx_unit = 0;
 +
 +      return rx_unit;
 +}
 +
 +static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err)
 +{
 +      int ret;
 +      u16 rx_len;
 +
 +      switch (card->model) {
 +      case IF_SDIO_MODEL_8385:
 +      case IF_SDIO_MODEL_8686:
 +              rx_len = if_sdio_read_scratch(card, &ret);
 +              break;
 +      case IF_SDIO_MODEL_8688:
 +      default: /* for newer chipsets */
 +              rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret);
 +              if (!ret)
 +                      rx_len <<= card->rx_unit;
 +              else
 +                      rx_len = 0xffff;        /* invalid length */
 +
 +              break;
 +      }
 +
 +      if (err)
 +              *err = ret;
 +
 +      return rx_len;
 +}
 +
 +static int if_sdio_handle_cmd(struct if_sdio_card *card,
 +              u8 *buffer, unsigned size)
 +{
 +      struct lbs_private *priv = card->priv;
 +      int ret;
 +      unsigned long flags;
 +      u8 i;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      if (size > LBS_CMD_BUFFER_SIZE) {
 +              lbs_deb_sdio("response packet too large (%d bytes)\n",
 +                      (int)size);
 +              ret = -E2BIG;
 +              goto out;
 +      }
 +
 +      spin_lock_irqsave(&priv->driver_lock, flags);
 +
 +      i = (priv->resp_idx == 0) ? 1 : 0;
 +      BUG_ON(priv->resp_len[i]);
 +      priv->resp_len[i] = size;
 +      memcpy(priv->resp_buf[i], buffer, size);
 +      lbs_notify_command_response(priv, i);
 +
 +      spin_unlock_irqrestore(&card->priv->driver_lock, flags);
 +
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +      return ret;
 +}
 +
 +static int if_sdio_handle_data(struct if_sdio_card *card,
 +              u8 *buffer, unsigned size)
 +{
 +      int ret;
 +      struct sk_buff *skb;
 +      char *data;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      if (size > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
 +              lbs_deb_sdio("response packet too large (%d bytes)\n",
 +                      (int)size);
 +              ret = -E2BIG;
 +              goto out;
 +      }
 +
 +      skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + NET_IP_ALIGN);
 +      if (!skb) {
 +              ret = -ENOMEM;
 +              goto out;
 +      }
 +
 +      skb_reserve(skb, NET_IP_ALIGN);
 +
 +      data = skb_put(skb, size);
 +
 +      memcpy(data, buffer, size);
 +
 +      lbs_process_rxed_packet(card->priv, skb);
 +
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +static int if_sdio_handle_event(struct if_sdio_card *card,
 +              u8 *buffer, unsigned size)
 +{
 +      int ret;
 +      u32 event;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      if (card->model == IF_SDIO_MODEL_8385) {
 +              event = sdio_readb(card->func, IF_SDIO_EVENT, &ret);
 +              if (ret)
 +                      goto out;
 +
 +              /* right shift 3 bits to get the event id */
 +              event >>= 3;
 +      } else {
 +              if (size < 4) {
 +                      lbs_deb_sdio("event packet too small (%d bytes)\n",
 +                              (int)size);
 +                      ret = -EINVAL;
 +                      goto out;
 +              }
 +              event = buffer[3] << 24;
 +              event |= buffer[2] << 16;
 +              event |= buffer[1] << 8;
 +              event |= buffer[0] << 0;
 +      }
 +
 +      lbs_queue_event(card->priv, event & 0xFF);
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +static int if_sdio_card_to_host(struct if_sdio_card *card)
 +{
 +      int ret;
 +      u8 status;
 +      u16 size, type, chunk;
 +      unsigned long timeout;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      size = if_sdio_read_rx_len(card, &ret);
 +      if (ret)
 +              goto out;
 +
 +      if (size < 4) {
 +              lbs_deb_sdio("invalid packet size (%d bytes) from firmware\n",
 +                      (int)size);
 +              ret = -EINVAL;
 +              goto out;
 +      }
 +
 +      timeout = jiffies + HZ;
 +      while (1) {
 +              status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
 +              if (ret)
 +                      goto out;
 +              if (status & IF_SDIO_IO_RDY)
 +                      break;
 +              if (time_after(jiffies, timeout)) {
 +                      ret = -ETIMEDOUT;
 +                      goto out;
 +              }
 +              mdelay(1);
 +      }
 +
 +      /*
 +       * The transfer must be in one transaction or the firmware
 +       * goes suicidal. There's no way to guarantee that for all
 +       * controllers, but we can at least try.
 +       */
 +      chunk = sdio_align_size(card->func, size);
 +
 +      ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk);
 +      if (ret)
 +              goto out;
 +
 +      chunk = card->buffer[0] | (card->buffer[1] << 8);
 +      type = card->buffer[2] | (card->buffer[3] << 8);
 +
 +      lbs_deb_sdio("packet of type %d and size %d bytes\n",
 +              (int)type, (int)chunk);
 +
 +      if (chunk > size) {
 +              lbs_deb_sdio("packet fragment (%d > %d)\n",
 +                      (int)chunk, (int)size);
 +              ret = -EINVAL;
 +              goto out;
 +      }
 +
 +      if (chunk < size) {
 +              lbs_deb_sdio("packet fragment (%d < %d)\n",
 +                      (int)chunk, (int)size);
 +      }
 +
 +      switch (type) {
 +      case MVMS_CMD:
 +              ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4);
 +              if (ret)
 +                      goto out;
 +              break;
 +      case MVMS_DAT:
 +              ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4);
 +              if (ret)
 +                      goto out;
 +              break;
 +      case MVMS_EVENT:
 +              ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4);
 +              if (ret)
 +                      goto out;
 +              break;
 +      default:
 +              lbs_deb_sdio("invalid type (%d) from firmware\n",
 +                              (int)type);
 +              ret = -EINVAL;
 +              goto out;
 +      }
 +
 +out:
 +      if (ret)
 +              lbs_pr_err("problem fetching packet from firmware\n");
 +
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +static void if_sdio_host_to_card_worker(struct work_struct *work)
 +{
 +      struct if_sdio_card *card;
 +      struct if_sdio_packet *packet;
 +      unsigned long timeout;
 +      u8 status;
 +      int ret;
 +      unsigned long flags;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      card = container_of(work, struct if_sdio_card, packet_worker);
 +
 +      while (1) {
 +              spin_lock_irqsave(&card->lock, flags);
 +              packet = card->packets;
 +              if (packet)
 +                      card->packets = packet->next;
 +              spin_unlock_irqrestore(&card->lock, flags);
 +
 +              if (!packet)
 +                      break;
 +
 +              sdio_claim_host(card->func);
 +
 +              timeout = jiffies + HZ;
 +              while (1) {
 +                      status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
 +                      if (ret)
 +                              goto release;
 +                      if (status & IF_SDIO_IO_RDY)
 +                              break;
 +                      if (time_after(jiffies, timeout)) {
 +                              ret = -ETIMEDOUT;
 +                              goto release;
 +                      }
 +                      mdelay(1);
 +              }
 +
 +              ret = sdio_writesb(card->func, card->ioport,
 +                              packet->buffer, packet->nb);
 +              if (ret)
 +                      goto release;
 +release:
 +              sdio_release_host(card->func);
 +
 +              kfree(packet);
 +      }
 +
 +      lbs_deb_leave(LBS_DEB_SDIO);
 +}
 +
 +/********************************************************************/
 +/* Firmware                                                         */
 +/********************************************************************/
 +
 +static int if_sdio_prog_helper(struct if_sdio_card *card)
 +{
 +      int ret;
 +      u8 status;
 +      const struct firmware *fw;
 +      unsigned long timeout;
 +      u8 *chunk_buffer;
 +      u32 chunk_size;
 +      const u8 *firmware;
 +      size_t size;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      ret = request_firmware(&fw, card->helper, &card->func->dev);
 +      if (ret) {
 +              lbs_pr_err("can't load helper firmware\n");
 +              goto out;
 +      }
 +
 +      chunk_buffer = kzalloc(64, GFP_KERNEL);
 +      if (!chunk_buffer) {
 +              ret = -ENOMEM;
 +              goto release_fw;
 +      }
 +
 +      sdio_claim_host(card->func);
 +
 +      ret = sdio_set_block_size(card->func, 32);
 +      if (ret)
 +              goto release;
 +
 +      firmware = fw->data;
 +      size = fw->size;
 +
 +      while (size) {
 +              timeout = jiffies + HZ;
 +              while (1) {
 +                      status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
 +                      if (ret)
 +                              goto release;
 +                      if ((status & IF_SDIO_IO_RDY) &&
 +                                      (status & IF_SDIO_DL_RDY))
 +                              break;
 +                      if (time_after(jiffies, timeout)) {
 +                              ret = -ETIMEDOUT;
 +                              goto release;
 +                      }
 +                      mdelay(1);
 +              }
 +
 +              chunk_size = min(size, (size_t)60);
 +
 +              *((__le32*)chunk_buffer) = cpu_to_le32(chunk_size);
 +              memcpy(chunk_buffer + 4, firmware, chunk_size);
 +/*
 +              lbs_deb_sdio("sending %d bytes chunk\n", chunk_size);
 +*/
 +              ret = sdio_writesb(card->func, card->ioport,
 +                              chunk_buffer, 64);
 +              if (ret)
 +                      goto release;
 +
 +              firmware += chunk_size;
 +              size -= chunk_size;
 +      }
 +
 +      /* an empty block marks the end of the transfer */
 +      memset(chunk_buffer, 0, 4);
 +      ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64);
 +      if (ret)
 +              goto release;
 +
 +      //lbs_deb_sdio("waiting for helper to boot...\n");
 +      printk("waiting for helper to boot...\n");
 +      mdelay(3000);
 +
 +      /* wait for the helper to boot by looking at the size register */
 +      timeout = jiffies + HZ;
 +      while (1) {
 +              u16 req_size;
 +
 +              req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
 +              if (ret)
 +                      goto release;
 +
 +              req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
 +              if (ret)
 +                      goto release;
 +
 +              if (req_size != 0)
 +                      break;
 +
 +              if (time_after(jiffies, timeout)) {
 +                      ret = -ETIMEDOUT;
 +                      goto release;
 +              }
 +
 +              msleep(10);
 +      }
 +
 +      ret = 0;
 +
 +release:
 +      sdio_release_host(card->func);
 +      kfree(chunk_buffer);
 +release_fw:
 +      release_firmware(fw);
 +
 +out:
 +      if (ret)
 +              //lbs_pr_err("failed to load helper firmware\n");
 +              printk("failed to load helper firmware\n");
 +      else
 +              printk("succeed to load helper firmware\n");
 +
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +static int if_sdio_prog_real(struct if_sdio_card *card)
 +{
 +      int ret;
 +      u8 status;
 +      const struct firmware *fw;
 +      unsigned long timeout;
 +      u8 *chunk_buffer;
 +      u32 chunk_size;
 +      const u8 *firmware;
 +      size_t size, req_size;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      ret = request_firmware(&fw, card->firmware, &card->func->dev);
 +      if (ret) {
 +              lbs_pr_err("can't load firmware\n");
 +              goto out;
 +      }
 +
 +      chunk_buffer = kzalloc(512, GFP_KERNEL);
 +      if (!chunk_buffer) {
 +              ret = -ENOMEM;
 +              goto release_fw;
 +      }
 +
 +      sdio_claim_host(card->func);
 +
 +      ret = sdio_set_block_size(card->func, 32);
 +      if (ret)
 +              goto release;
 +
 +      firmware = fw->data;
 +      size = fw->size;
 +
 +      while (size) {
 +              timeout = jiffies + HZ;
 +              while (1) {
 +                      status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
 +                      if (ret)
 +                              goto release;
 +                      if ((status & IF_SDIO_IO_RDY) &&
 +                                      (status & IF_SDIO_DL_RDY))
 +                              break;
 +                      if (time_after(jiffies, timeout)) {
 +                              ret = -ETIMEDOUT;
 +                              goto release;
 +                      }
 +                      mdelay(1);
 +              }
 +
 +              req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
 +              if (ret)
 +                      goto release;
 +
 +              req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
 +              if (ret)
 +                      goto release;
 +/*
 +              lbs_deb_sdio("firmware wants %d bytes\n", (int)req_size);
 +*/
 +              if (req_size == 0) {
 +                      lbs_deb_sdio("firmware helper gave up early\n");
 +                      ret = -EIO;
 +                      goto release;
 +              }
 +
 +              if (req_size & 0x01) {
 +                      lbs_deb_sdio("firmware helper signalled error\n");
 +                      ret = -EIO;
 +                      goto release;
 +              }
 +
 +              if (req_size > size)
 +                      req_size = size;
 +
 +              while (req_size) {
 +                      chunk_size = min(req_size, (size_t)512);
 +
 +                      memcpy(chunk_buffer, firmware, chunk_size);
 +/*
 +                      lbs_deb_sdio("sending %d bytes (%d bytes) chunk\n",
 +                              chunk_size, (chunk_size + 31) / 32 * 32);
 +*/
 +                      ret = sdio_writesb(card->func, card->ioport,
 +                              chunk_buffer, roundup(chunk_size, 32));
 +                      if (ret)
 +                              goto release;
 +
 +                      firmware += chunk_size;
 +                      size -= chunk_size;
 +                      req_size -= chunk_size;
 +              }
 +      }
 +
 +      ret = 0;
 +
 +      lbs_deb_sdio("waiting for firmware to boot...\n");
 +
 +      /* wait for the firmware to boot */
 +      timeout = jiffies + HZ;
 +      while (1) {
 +              u16 scratch;
 +
 +              scratch = if_sdio_read_scratch(card, &ret);
 +              if (ret)
 +                      goto release;
 +
 +              if (scratch == IF_SDIO_FIRMWARE_OK)
 +                      break;
 +
 +              if (time_after(jiffies, timeout)) {
 +                      ret = -ETIMEDOUT;
 +                      goto release;
 +              }
 +
 +              msleep(10);
 +      }
 +
 +      ret = 0;
 +
 +release:
 +      sdio_release_host(card->func);
 +      kfree(chunk_buffer);
 +release_fw:
 +      release_firmware(fw);
 +
 +out:
 +      if (ret)
 +              lbs_pr_err("failed to load firmware\n");
 +
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +static int if_sdio_prog_firmware(struct if_sdio_card *card)
 +{
 +      int ret;
 +      u16 scratch;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      sdio_claim_host(card->func);
 +      scratch = if_sdio_read_scratch(card, &ret);
 +      sdio_release_host(card->func);
 +
 +      if (ret)
 +              goto out;
 +
 +      lbs_deb_sdio("firmware status = %#x\n", scratch);
 +
 +      if (scratch == IF_SDIO_FIRMWARE_OK) {
 +              lbs_deb_sdio("firmware already loaded\n");
 +              goto success;
 +      }
 +
 +      ret = if_sdio_prog_helper(card);
 +      if (ret)
 +              goto out;
 +
 +      ret = if_sdio_prog_real(card);
 +      if (ret)
 +              goto out;
 +
 +success:
 +      sdio_claim_host(card->func);
 +      sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE);
 +      sdio_release_host(card->func);
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +/*******************************************************************/
 +/* Libertas callbacks                                              */
 +/*******************************************************************/
 +
 +static int if_sdio_host_to_card(struct lbs_private *priv,
 +              u8 type, u8 *buf, u16 nb)
 +{
 +      int ret;
 +      struct if_sdio_card *card;
 +      struct if_sdio_packet *packet, *cur;
 +      u16 size;
 +      unsigned long flags;
 +
 +      lbs_deb_enter_args(LBS_DEB_SDIO, "type %d, bytes %d", type, nb);
 +
 +      card = priv->card;
 +
 +      if (nb > (65536 - sizeof(struct if_sdio_packet) - 4)) {
 +              ret = -EINVAL;
 +              goto out;
 +      }
 +
 +      /*
 +       * The transfer must be in one transaction or the firmware
 +       * goes suicidal. There's no way to guarantee that for all
 +       * controllers, but we can at least try.
 +       */
 +      size = sdio_align_size(card->func, nb + 4);
 +
 +      packet = kzalloc(sizeof(struct if_sdio_packet) + size,
 +                      GFP_ATOMIC);
 +      if (!packet) {
 +              ret = -ENOMEM;
 +              goto out;
 +      }
 +
 +      packet->next = NULL;
 +      packet->nb = size;
 +
 +      /*
 +       * SDIO specific header.
 +       */
 +      packet->buffer[0] = (nb + 4) & 0xff;
 +      packet->buffer[1] = ((nb + 4) >> 8) & 0xff;
 +      packet->buffer[2] = type;
 +      packet->buffer[3] = 0;
 +
 +      memcpy(packet->buffer + 4, buf, nb);
 +
 +      spin_lock_irqsave(&card->lock, flags);
 +
 +      if (!card->packets)
 +              card->packets = packet;
 +      else {
 +              cur = card->packets;
 +              while (cur->next)
 +                      cur = cur->next;
 +              cur->next = packet;
 +      }
 +
 +      switch (type) {
 +      case MVMS_CMD:
 +              priv->dnld_sent = DNLD_CMD_SENT;
 +              break;
 +      case MVMS_DAT:
 +              priv->dnld_sent = DNLD_DATA_SENT;
 +              break;
 +      default:
 +              lbs_deb_sdio("unknown packet type %d\n", (int)type);
 +      }
 +
 +      spin_unlock_irqrestore(&card->lock, flags);
 +
 +      queue_work(card->workqueue, &card->packet_worker);
 +
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +}
 +
 +/*******************************************************************/
 +/* SDIO callbacks                                                  */
 +/*******************************************************************/
 +
 +static void if_sdio_interrupt(struct sdio_func *func)
 +{
 +      int ret;
 +      struct if_sdio_card *card;
 +      u8 cause;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      card = sdio_get_drvdata(func);
 +
 +      cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret);
 +      if (ret)
 +              goto out;
 +
 +      lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause);
 +
 +      sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret);
 +      if (ret)
 +              goto out;
 +
 +      /*
 +       * Ignore the define name, this really means the card has
 +       * successfully received the command.
 +       */
 +      if (cause & IF_SDIO_H_INT_DNLD)
 +              lbs_host_to_card_done(card->priv);
 +
 +
 +      if (cause & IF_SDIO_H_INT_UPLD) {
 +              ret = if_sdio_card_to_host(card);
 +              if (ret)
 +                      goto out;
 +      }
 +
 +      ret = 0;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +}
 +
 +static int if_sdio_probe(struct sdio_func *func,
 +              const struct sdio_device_id *id)
 +{
 +      struct if_sdio_card *card;
 +      struct lbs_private *priv;
 +      int ret, i;
 +      unsigned int model;
 +      struct if_sdio_packet *packet;
++      struct mmc_host *host = func->card->host;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      for (i = 0;i < func->card->num_info;i++) {
 +              if (sscanf(func->card->info[i],
 +                              "802.11 SDIO ID: %x", &model) == 1)
 +                      break;
 +              if (sscanf(func->card->info[i],
 +                              "ID: %x", &model) == 1)
 +                      break;
 +              if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
 +                      model = IF_SDIO_MODEL_8385;
 +                      break;
 +              }
 +      }
 +
 +      if (i == func->card->num_info) {
 +              lbs_pr_err("unable to identify card model\n");
 +              return -ENODEV;
 +      }
 +
 +      card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL);
 +      if (!card)
 +              return -ENOMEM;
 +
 +      card->func = func;
 +      card->model = model;
 +
 +      switch (card->model) {
 +      case IF_SDIO_MODEL_8385:
 +              card->scratch_reg = IF_SDIO_SCRATCH_OLD;
 +              break;
 +      case IF_SDIO_MODEL_8686:
 +              card->scratch_reg = IF_SDIO_SCRATCH;
 +              break;
 +      case IF_SDIO_MODEL_8688:
 +      default: /* for newer chipsets */
 +              card->scratch_reg = IF_SDIO_FW_STATUS;
 +              break;
 +      }
 +
 +      spin_lock_init(&card->lock);
 +      card->workqueue = create_workqueue("libertas_sdio");
 +      INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
 +
 +      for (i = 0;i < ARRAY_SIZE(if_sdio_models);i++) {
 +              if (card->model == if_sdio_models[i].model)
 +                      break;
 +      }
 +
 +      if (i == ARRAY_SIZE(if_sdio_models)) {
 +              lbs_pr_err("unkown card model 0x%x\n", card->model);
 +              ret = -ENODEV;
 +              goto free;
 +      }
 +
 +      card->helper = if_sdio_models[i].helper;
 +      card->firmware = if_sdio_models[i].firmware;
 +
 +      if (lbs_helper_name) {
 +              lbs_deb_sdio("overriding helper firmware: %s\n",
 +                      lbs_helper_name);
 +              card->helper = lbs_helper_name;
 +      }
 +
 +      if (lbs_fw_name) {
 +              lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
 +              card->firmware = lbs_fw_name;
 +      }
 +
 +      sdio_claim_host(func);
 +
 +      ret = sdio_enable_func(func);
 +      if (ret)
 +              goto release;
 +
 +      ret = sdio_claim_irq(func, if_sdio_interrupt);
 +      if (ret)
 +              goto disable;
 +
++      /* For 1-bit transfers to the 8686 model, we need to enable the
++       * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0
++       * bit to allow access to non-vendor registers. */
++      if ((card->model == IF_SDIO_MODEL_8686) &&
++          (host->caps & MMC_CAP_SDIO_IRQ) &&
++          (host->ios.bus_width == MMC_BUS_WIDTH_1)) {
++              u8 reg;
++
++              func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
++              reg = sdio_f0_readb(func, SDIO_CCCR_IF, &ret);
++              if (ret)
++                      goto release_int;
++
++              reg |= SDIO_BUS_ECSI;
++              sdio_f0_writeb(func, reg, SDIO_CCCR_IF, &ret);
++              if (ret)
++                      goto release_int;
++      }
++
 +      card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret);
 +      if (ret)
 +              goto release_int;
 +
 +      card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8;
 +      if (ret)
 +              goto release_int;
 +
 +      card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16;
 +      if (ret)
 +              goto release_int;
 +
 +      sdio_release_host(func);
 +
 +      sdio_set_drvdata(func, card);
 +
 +      lbs_deb_sdio("class = 0x%X, vendor = 0x%X, "
 +                      "device = 0x%X, model = 0x%X, ioport = 0x%X\n",
 +                      func->class, func->vendor, func->device,
 +                      model, (unsigned)card->ioport);
 +
 +      ret = if_sdio_prog_firmware(card);
 +      if (ret)
 +              goto reclaim;
 +
 +      priv = lbs_add_card(card, &func->dev);
 +      if (!priv) {
 +              ret = -ENOMEM;
 +              goto reclaim;
 +      }
 +
 +      card->priv = priv;
 +
 +      priv->card = card;
 +      priv->hw_host_to_card = if_sdio_host_to_card;
 +
 +      priv->fw_ready = 1;
 +
 +      sdio_claim_host(func);
 +
 +      /*
 +       * Get rx_unit if the chip is SD8688 or newer.
 +       * SD8385 & SD8686 do not have rx_unit.
 +       */
 +      if ((card->model != IF_SDIO_MODEL_8385)
 +                      && (card->model != IF_SDIO_MODEL_8686))
 +              card->rx_unit = if_sdio_read_rx_unit(card);
 +      else
 +              card->rx_unit = 0;
 +
 +      /*
 +       * Enable interrupts now that everything is set up
 +       */
 +      sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret);
 +      sdio_release_host(func);
 +      if (ret)
 +              goto reclaim;
 +
 +      /*
 +       * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
 +       */
 +      if (card->model == IF_SDIO_MODEL_8688) {
 +              struct cmd_header cmd;
 +
 +              memset(&cmd, 0, sizeof(cmd));
 +
 +              lbs_deb_sdio("send function INIT command\n");
 +              if (__lbs_cmd(priv, CMD_FUNC_INIT, &cmd, sizeof(cmd),
 +                              lbs_cmd_copyback, (unsigned long) &cmd))
 +                      lbs_pr_alert("CMD_FUNC_INIT cmd failed\n");
 +      }
 +
 +      ret = lbs_start_card(priv);
 +      if (ret)
 +              goto err_activate_card;
 +
 +      wifi_sdio_func = func;
 +
 +out:
 +      lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +
 +      return ret;
 +
 +err_activate_card:
 +      flush_workqueue(card->workqueue);
 +      lbs_remove_card(priv);
 +reclaim:
 +      sdio_claim_host(func);
 +release_int:
 +      sdio_release_irq(func);
 +disable:
 +      sdio_disable_func(func);
 +release:
 +      sdio_release_host(func);
 +free:
 +      destroy_workqueue(card->workqueue);
 +      while (card->packets) {
 +              packet = card->packets;
 +              card->packets = card->packets->next;
 +              kfree(packet);
 +      }
 +
 +      kfree(card);
 +
 +      goto out;
 +}
 +
 +static void if_sdio_remove(struct sdio_func *func)
 +{
 +      struct if_sdio_card *card;
 +      struct if_sdio_packet *packet;
 +
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      card = sdio_get_drvdata(func);
 +
 +      if (user_rmmod && (card->model == IF_SDIO_MODEL_8688)) {
 +              /*
 +               * FUNC_SHUTDOWN is required for SD8688 WLAN/BT
 +               * multiple functions
 +               */
 +              struct cmd_header cmd;
 +
 +              memset(&cmd, 0, sizeof(cmd));
 +
 +              lbs_deb_sdio("send function SHUTDOWN command\n");
 +              if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN,
 +                              &cmd, sizeof(cmd), lbs_cmd_copyback,
 +                              (unsigned long) &cmd))
 +                      lbs_pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
 +      }
 +
 +
 +      lbs_deb_sdio("call remove card\n");
 +      lbs_stop_card(card->priv);
 +      lbs_remove_card(card->priv);
 +      card->priv->surpriseremoved = 1;
 +
 +      flush_workqueue(card->workqueue);
 +      destroy_workqueue(card->workqueue);
 +
 +      sdio_claim_host(func);
 +      sdio_release_irq(func);
 +      sdio_disable_func(func);
 +      sdio_release_host(func);
 +
 +      while (card->packets) {
 +              packet = card->packets;
 +              card->packets = card->packets->next;
 +              kfree(packet);
 +      }
 +
 +      kfree(card);
 +
 +      lbs_deb_leave(LBS_DEB_SDIO);
 +}
 +
 +static struct sdio_driver if_sdio_driver = {
 +      .name           = "libertas_sdio",
 +      .id_table       = if_sdio_ids,
 +      .probe          = if_sdio_probe,
 +      .remove         = if_sdio_remove,
 +};
 +
 +/*******************************************************************/
 +/* Module functions                                                */
 +/*******************************************************************/
 +
 +//static int __init if_sdio_init_module2(void)
 +//void if_sdio_init_module2(struct work_struct *work)
 +int wifi_no_power_gpio = 0;  /* 0-No 1-Yes */
 +void if_sdio_init_module2(void)
 +{
 +      int ret = 0,timeout;
 +      
 +      wifi_sdio_func = NULL;
 +      wifi_no_power_gpio = 0;
 +      
 +      //lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      printk(KERN_INFO "libertas_sdio: Libertas SDIO driver\n");
 +      printk(KERN_INFO "libertas_sdio: Copyright Pierre Ossman\n");
 +
 +      /* Clear the flag in case user removes the card. */
 +      user_rmmod = 0;
 +      ///lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
 +      
 +      ret = sdio_register_driver(&if_sdio_driver);
 +      
 +#ifdef WIFI_GPIO_POWER_CONTROL        
 +      if (wifi_mmc_host->bus_ops != NULL) /* mmc/card is attached already. */
 +      {
 +              printk("SDIO maybe be attached already.\n");
 +              wifi_no_power_gpio = 1;
 +              return ;
 +      }
 +      
 +      wifi_turn_on_card();
 +      wifi_power_up_wifi();
 +      
 +      mmc_detect_change(wifi_mmc_host, 2);
 +      
 +      for (timeout = 100; timeout >=0; timeout--)
 +      {
 +          if (wifi_sdio_func != NULL)
 +              break;
 +          msleep(50);
 +      }
 +      if (timeout <= 0)
 +         printk("No WiFi function card has been attached.\n");
 +#endif
 +      return ;
 +}
 +EXPORT_SYMBOL(if_sdio_init_module2);
 +
 +#if 0
 +static int __init if_sdio_init_module(void)
 +{
 +      struct delayed_work hook_worker;
 +
 +      INIT_DELAYED_WORK(&hook_worker, if_sdio_init_module2);
 +
 +      schedule_delayed_work(&hook_worker, msecs_to_jiffies(9000));
 +
 +      return 0;
 +}
 +#endif
 +
 +
 +void if_sdio_exit_module(void)
 +{
 +      int timeout;
 +      
 +      lbs_deb_enter(LBS_DEB_SDIO);
 +
 +      /* Set the flag as user is removing this module. */
 +      user_rmmod = 1;
 +
 +      sdio_unregister_driver(&if_sdio_driver);
 +      
 +#ifdef WIFI_GPIO_POWER_CONTROL
 +
 +      if (wifi_no_power_gpio == 1)
 +          return;
 +          
 +      if (wifi_mmc_host == NULL)
 +      {
 +          printk("No SDIO host is present.\n");
 +          return;
 +      }
 +      
 +      wifi_power_down_wifi();
 +      wifi_turn_off_card();
 +      
 +      mmc_detect_change(wifi_mmc_host, 2);
 +      
 +      for (timeout = 50; timeout >= 0; timeout--)
 +      {
 +              msleep(100);
 +              if (wifi_mmc_host->bus_ops == NULL)
 +              break;
 +      }
 +      if (timeout < 0)
 +              printk("Fail to release SDIO card.\n");
 +#endif
 +      lbs_deb_leave(LBS_DEB_SDIO);
 +}
 +EXPORT_SYMBOL(if_sdio_exit_module);
 +//module_init(if_sdio_init_module);
 +//module_exit(if_sdio_exit_module);
 +
 +MODULE_DESCRIPTION("Libertas SDIO WLAN Driver");
 +MODULE_AUTHOR("Pierre Ossman");
 +MODULE_LICENSE("GPL");
Simple merge
index 59eaa5ac9cdfddc25d358c0e44fa987c9c05ddc8,b926b00b603e94884eab786d26bee688bb1d95c2..35fb8174dc1af52b9e3478a0e94d6430e04f7a9a
mode 100755,100644..100755
index a991d1f0055d163a680e49b5618f44b738b09c87,030d8f8f903db97b686566ff018844beeb70247e..a8951fb6bf76ac5df225ec7f4744d6308971dea3
mode 100755,100644..100755
@@@ -23,10 -23,9 +23,9 @@@ obj-$(CONFIG_ALTERA_PCIE_CHDMA)      += altp
  obj-$(CONFIG_RTL8187SE)               += rtl8187se/
  obj-$(CONFIG_RTL8192SU)               += rtl8192su/
  obj-$(CONFIG_RTL8192E)                += rtl8192e/
- obj-$(CONFIG_INPUT_MIMIO)     += mimio/
  obj-$(CONFIG_TRANZPORT)               += frontier/
  obj-$(CONFIG_ANDROID)         += android/
 -obj-$(CONFIG_ANDROID)         += dream/
 +obj-$(CONFIG_STAGING_DREAM)   += dream/
  obj-$(CONFIG_DST)             += dst/
  obj-$(CONFIG_POHMELFS)                += pohmelfs/
  obj-$(CONFIG_B3DFG)           += b3dfg/
Simple merge
index c6341922eac1a312b4faf0a6b7be0c8bb8a8e7e4,12254e1f4659454bf6a0f3709cfa4da2ad91a833..49ec81d5984ffc996ea43c3684925367bcb76ec9
@@@ -1587,18 -1587,9 +1597,20 @@@ void usb_disconnect(struct usb_device *
        spin_unlock_irq(&device_state_lock);
  
        usb_stop_pm(udev);
 +    
 +    // cmy: ²»´¦ÀíhubÉ豸
 +    if(USB_CLASS_HUB != udev->descriptor.bDeviceClass)
 +    {
 +        if(udev == g_usb_device)
 +            g_usb_device = 0;
 +
 +#ifdef CONFIG_ANDROID_POWER
 +        android_unlock_suspend(&hub_suspend_lock);
 +#endif
 +    }
  
+       hub_free_dev(udev);
        put_device(&udev->dev);
  }
  
Simple merge
index 2199e1caa8e10c2d149f27110335fa51c0292e3d,c2e69839ec5f7713fc1681ada83ac93a196324cc..774814d7a2c9ef72de4b15b2d91e9c0fa13df646
@@@ -345,13 -369,18 +370,23 @@@ static int  option_resume(struct usb_se
  #define HAIER_VENDOR_ID                               0x201e
  #define HAIER_PRODUCT_CE100                   0x2009
  
 +/* Thinkwill products */
 +#define THINKWILL_VENDOR_ID   0x19f5
 +#define THINKWILL_PRODUCT_ID  0x9909
 +
+ #define CINTERION_VENDOR_ID                   0x0681
+ /* Olivetti products */
+ #define OLIVETTI_VENDOR_ID                    0x0b3c
+ #define OLIVETTI_PRODUCT_OLICARD100           0xc000
+ /* Celot products */
+ #define CELOT_VENDOR_ID                               0x211f
+ #define CELOT_PRODUCT_CT680M                  0x6801
  static struct usb_device_id option_ids[] = {
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
 +      { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_PRODUCT_ID)},
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
Simple merge
diff --cc fs/proc/base.c
Simple merge
Simple merge
Simple merge
index 30473ee9628b710b874f03be9d2eb745297b7088,957a25fff8fc10920eee128f058f37a0697352d3..e8e90f5ed668ec220ecbaf4af2541687da423277
@@@ -1723,10 -1731,8 +1731,11 @@@ static inline void put_task_struct(stru
  extern cputime_t task_utime(struct task_struct *p);
  extern cputime_t task_stime(struct task_struct *p);
  extern cputime_t task_gtime(struct task_struct *p);
+ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st);
  
 +extern int task_free_register(struct notifier_block *n);
 +extern int task_free_unregister(struct notifier_block *n);
 +
  /*
   * Per process flags
   */
Simple merge
index f7ae1992a774cd062541390038d3c2a22d1cf3d4,1fd59b81dd9a5f1f037613db4c624d56d7f4d630..6b1ad6f388f9207de36daee1f0112c857cf145d5
@@@ -455,11 -455,10 +455,12 @@@ static char * __init unpack_to_rootfs(c
                                         compress_name);
                                message = msg_buf;
                        }
-               }
+               } else
+                       error("junk in compressed archive");
                if (state != Reset)
                        error("junk in compressed archive");
 +              else
 +                      break;
                this_header = saved_offset + my_inptr;
                buf += my_inptr;
                len -= my_inptr;
Simple merge
diff --cc kernel/cpuset.c
Simple merge
diff --cc kernel/fork.c
Simple merge
diff --cc kernel/futex.c
Simple merge
Simple merge
diff --cc kernel/sched.c
Simple merge
diff --cc kernel/sys.c
Simple merge
diff --cc mm/page_alloc.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/socket.c
Simple merge
index 9a127a033536b823ceda7903f52f030afc6ac00d,e6d2d974d23143e42b24fbd1fff56f6cc2e23eb6..d3a81c8681ba7dd46413c52422626a102c7308e1
mode 100755,100644..100755