Merge with ../linux-2.6
authorTony Lindgren <tony@atomide.com>
Tue, 13 Sep 2005 10:19:46 +0000 (13:19 +0300)
committerTony Lindgren <tony@atomide.com>
Tue, 13 Sep 2005 10:19:46 +0000 (13:19 +0300)
21 files changed:
1  2 
Makefile
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/mm/flush.c
drivers/Kconfig
drivers/Makefile
drivers/char/Kconfig
drivers/char/watchdog/Kconfig
drivers/char/watchdog/Makefile
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/chips/Kconfig
drivers/i2c/chips/isp1301_omap.c
drivers/media/video/Kconfig
drivers/media/video/Makefile
drivers/mmc/mmc.c
drivers/mmc/mmc_block.c
drivers/serial/8250.c
drivers/video/Makefile
include/linux/input.h
kernel/printk.c

diff --combined Makefile
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 2
  PATCHLEVEL = 6
- SUBLEVEL = 13
- EXTRAVERSION =
+ SUBLEVEL = 14
+ EXTRAVERSION =-rc1
  NAME=Affluent Albatross
  
  # *DOCUMENTATION*
@@@ -10,9 -10,6 +10,9 @@@
  # Comments in this file are targeted only to the developer, do not
  # expect to learn how to build the kernel reading this file.
  
 +# Add custom flags here to avoid conflict with updates
 +EXTRAVERSION := $(EXTRAVERSION)-omap1
 +
  # Do not print "Entering directory ..."
  MAKEFLAGS += --no-print-directory
  
@@@ -112,10 -109,9 +112,9 @@@ $(if $(KBUILD_OUTPUT),, 
  .PHONY: $(MAKECMDGOALS)
  
  $(filter-out _all,$(MAKECMDGOALS)) _all:
-       $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT)         \
-       KBUILD_SRC=$(CURDIR)         KBUILD_VERBOSE=$(KBUILD_VERBOSE)   \
-       KBUILD_CHECK=$(KBUILD_CHECK) KBUILD_EXTMOD="$(KBUILD_EXTMOD)"   \
-         -f $(CURDIR)/Makefile $@
+       $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
+       KBUILD_SRC=$(CURDIR) \
+       KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@
  
  # Leave processing to above invocation of make
  skip-makefile := 1
@@@ -173,7 -169,6 +172,7 @@@ KERNELRELEASE=$(VERSION).$(PATCHLEVEL).
  SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
                                  -e s/arm.*/arm/ -e s/sa110/arm/ \
                                  -e s/s390x/s390/ -e s/parisc64/parisc/ )
 +SUBARCH := arm
  
  # Cross compiling and selecting different set of gcc/bin-utils
  # ---------------------------------------------------------------------------
  # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
  
  ARCH          ?= $(SUBARCH)
 -CROSS_COMPILE ?=
 +CROSS_COMPILE ?= arm-linux-
  
  # Architecture as present in compile.h
  UTS_MACHINE := $(ARCH)
@@@ -237,7 -232,7 +236,7 @@@ ifeq ($(MAKECMDGOALS),
    KBUILD_MODULES := 1
  endif
  
- export KBUILD_MODULES KBUILD_BUILTIN KBUILD_VERBOSE
+ export KBUILD_MODULES KBUILD_BUILTIN
  export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
  
  # Beautify output
@@@ -313,6 -308,9 +312,9 @@@ cc-version = $(shell $(CONFIG_SHELL) $(
  # Look for make include files relative to root of kernel src
  MAKEFLAGS += --include-dir=$(srctree)
  
+ # We need some generic definitions
+ include  $(srctree)/scripts/Kbuild.include
  # For maximum performance (+ possibly random breakage, uncomment
  # the following)
  
@@@ -336,7 -334,7 +338,7 @@@ KALLSYMS   = scripts/kallsym
  PERL          = perl
  CHECK         = sparse
  
- CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
+ CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ $(CF)
  MODFLAGS      = -DMODULE
  CFLAGS_MODULE   = $(MODFLAGS)
  AFLAGS_MODULE   = $(MODFLAGS)
@@@ -352,7 -350,7 +354,7 @@@ LINUXINCLUDE    := -Iinclude 
  
  CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
  
- CFLAGS                := -Wall -Wstrict-prototypes -Wno-trigraphs \
+ CFLAGS                := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common \
                   -ffreestanding
  AFLAGS                := -D__ASSEMBLY__
@@@ -371,11 -369,6 +373,6 @@@ export AFLAGS AFLAGS_KERNEL AFLAGS_MODU
  # even be read-only.
  export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
  
- # The temporary file to save gcc -MD generated dependencies must not
- # contain a comma
- comma := ,
- depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
  # Files to ignore in find ... statements
  
  RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg \) -prune -o
@@@ -389,6 -382,9 +386,9 @@@ RCS_TAR_IGNORE := --exclude SCCS --excl
  scripts_basic:
        $(Q)$(MAKE) $(build)=scripts/basic
  
+ # To avoid any implicit rule to kick in, define an empty command.
+ scripts/basic/%: scripts_basic ;
  .PHONY: outputmakefile
  # outputmakefile generate a Makefile to be placed in output directory, if
  # using a seperate output directory. This allows convinient use
@@@ -451,9 -447,8 +451,8 @@@ ifeq ($(config-targets),1
  include $(srctree)/arch/$(ARCH)/Makefile
  export KBUILD_DEFCONFIG
  
- config: scripts_basic outputmakefile FORCE
-       $(Q)$(MAKE) $(build)=scripts/kconfig $@
- %config: scripts_basic outputmakefile FORCE
+ config %config: scripts_basic outputmakefile FORCE
+       $(Q)mkdir -p include/linux
        $(Q)$(MAKE) $(build)=scripts/kconfig $@
  
  else
@@@ -496,6 -491,7 +495,7 @@@ include .confi
  # If .config is newer than include/linux/autoconf.h, someone tinkered
  # with it and forgot to run make oldconfig
  include/linux/autoconf.h: .config
+       $(Q)mkdir -p include/linux
        $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
  else
  # Dummy target needed, because used as prerequisite
@@@ -555,6 -551,26 +555,26 @@@ export KBUILD_IMAGE ?= vmlinu
  # images. Default is /boot, but you can set it to other values
  export        INSTALL_PATH ?= /boot
  
+ # If CONFIG_LOCALVERSION_AUTO is set, we automatically perform some tests
+ # and try to determine if the current source tree is a release tree, of any sort,
+ # or if is a pure development tree.
+ #
+ # A 'release tree' is any tree with a git TAG associated
+ # with it.  The primary goal of this is to make it safe for a native
+ # git/CVS/SVN user to build a release tree (i.e, 2.6.9) and also to
+ # continue developing against the current Linus tree, without having the Linus
+ # tree overwrite the 2.6.9 tree when installed.
+ #
+ # Currently, only git is supported.
+ # Other SCMs can edit scripts/setlocalversion and add the appropriate
+ # checks as needed.
+ ifdef CONFIG_LOCALVERSION_AUTO
+       localversion-auto := $(shell $(PERL) $(srctree)/scripts/setlocalversion $(srctree))
+       LOCALVERSION := $(LOCALVERSION)$(localversion-auto)
+ endif
  #
  # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
  # relocations required by build roots.  This is not defined in the
@@@ -628,8 -644,13 +648,13 @@@ quiet_cmd_vmlinux__ ?= LD      $
  # Generate new vmlinux version
  quiet_cmd_vmlinux_version = GEN     .version
        cmd_vmlinux_version = set -e;                     \
-       . $(srctree)/scripts/mkversion > .tmp_version;  \
-       mv -f .tmp_version .version;                    \
+       if [ ! -r .version ]; then                      \
+         rm -f .version;                               \
+         echo 1 >.version;                             \
+       else                                            \
+         mv .version .old_version;                     \
+         expr 0$$(cat .old_version) + 1 >.version;     \
+       fi;                                             \
        $(MAKE) $(build)=init
  
  # Generate System.map
@@@ -695,8 -716,10 +720,10 @@@ ende
  
  # Update vmlinux version before link
  # Use + in front of this rule to silent warning about make -j1
+ # First command is ':' to allow us to use + in front of this rule
  cmd_ksym_ld = $(cmd_vmlinux__)
  define rule_ksym_ld
+       : 
        +$(call cmd,vmlinux_version)
        $(call cmd,vmlinux__)
        $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
@@@ -726,11 -749,22 +753,22 @@@ quiet_cmd_kallsyms = KSYM    $
  # Needs to visit scripts/ before $(KALLSYMS) can be used.
  $(KALLSYMS): scripts ;
  
+ # Generate some data for debugging strange kallsyms problems
+ debug_kallsyms: .tmp_map$(last_kallsyms)
+ .tmp_map%: .tmp_vmlinux% FORCE
+       ($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
+ .tmp_map3: .tmp_map2
+ .tmp_map2: .tmp_map1
  endif # ifdef CONFIG_KALLSYMS
  
  # vmlinux image - including updated kernel symbols
  vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
        $(call if_changed_rule,vmlinux__)
+       $(Q)rm -f .old_version
  
  # The actual objects are generated when descending, 
  # make sure no implicit rule kicks in
@@@ -743,25 -777,30 +781,30 @@@ $(sort $(vmlinux-init) $(vmlinux-main)
  # Error messages still appears in the original language
  
  .PHONY: $(vmlinux-dirs)
- $(vmlinux-dirs): prepare-all scripts
+ $(vmlinux-dirs): prepare scripts
        $(Q)$(MAKE) $(build)=$@
  
  # Things we need to do before we recursively start building the kernel
- # or the modules are listed in "prepare-all".
- # A multi level approach is used. prepare1 is updated first, then prepare0.
- # prepare-all is the collection point for the prepare targets.
+ # or the modules are listed in "prepare".
+ # A multi level approach is used. prepareN is processed before prepareN-1.
+ # archprepare is used in arch Makefiles and when processed asm symlink,
+ # version.h and scripts_basic is processed / created.
+ # Listed in dependency order
+ .PHONY: prepare archprepare prepare0 prepare1 prepare2 prepare3
  
- .PHONY: prepare-all prepare prepare0 prepare1 prepare2
+ # prepare-all is deprecated, use prepare as valid replacement
+ .PHONY: prepare-all
  
- # prepare2 is used to check if we are building in a separate output directory,
+ # prepare3 is used to check if we are building in a separate output directory,
  # and if so do:
  # 1) Check that make has not been executed in the kernel src $(srctree)
  # 2) Create the include2 directory, used for the second asm symlink
  
- prepare2:
+ prepare3:
  ifneq ($(KBUILD_SRC),)
        @echo '  Using $(srctree) as source for kernel'
-       $(Q)if [ -h $(srctree)/include/asm -o -f $(srctree)/.config ]; then \
+       $(Q)if [ -f $(srctree)/.config ]; then \
                echo "  $(srctree) is not clean, please run 'make mrproper'";\
                echo "  in the '$(srctree)' directory.";\
                /bin/false; \
        $(Q)ln -fsn $(srctree)/include/asm-$(ARCH) include2/asm
  endif
  
- # prepare1 creates a makefile if using a separate output directory
- prepare1: prepare2 outputmakefile
+ # prepare2 creates a makefile if using a separate output directory
+ prepare2: prepare3 outputmakefile
  
- prepare0: prepare1 include/linux/version.h include/asm include/config/MARKER
+ prepare1: prepare2 include/linux/version.h include/asm \
+                    include/config/MARKER
  ifneq ($(KBUILD_MODULES),)
        $(Q)rm -rf $(MODVERDIR)
        $(Q)mkdir -p $(MODVERDIR)
  endif
  
+ archprepare: prepare1 scripts_basic
+ prepare0: archprepare FORCE
+       $(Q)$(MAKE) $(build)=.
  # All the preparing..
- prepare-all: prepare0 prepare
+ prepare prepare-all: prepare0
  
  #     Leave this as default for preprocessing vmlinux.lds.S, which is now
  #     done in arch/$(ARCH)/kernel/Makefile
@@@ -819,7 -864,7 +868,7 @@@ include/asm
  
  #     Split autoconf.h into include/linux/config/*
  
- include/config/MARKER: include/linux/autoconf.h
+ include/config/MARKER: scripts/basic/split-include include/linux/autoconf.h
        @echo '  SPLIT   include/linux/autoconf.h -> include/config/*'
        @scripts/basic/split-include include/linux/autoconf.h include/config
        @touch $@
@@@ -871,7 -916,7 +920,7 @@@ modules: $(vmlinux-dirs) $(if $(KBUILD_
  
  # Target to prepare building external modules
  .PHONY: modules_prepare
- modules_prepare: prepare-all scripts
+ modules_prepare: prepare scripts
  
  # Target to install modules
  .PHONY: modules_install
@@@ -879,7 -924,7 +928,7 @@@ modules_install: _modinst_ _modinst_pos
  
  .PHONY: _modinst_
  _modinst_:
-       @if [ -z "`$(DEPMOD) -V | grep module-init-tools`" ]; then \
+       @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
                echo "Warning: you may need to install module-init-tools"; \
                echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
                sleep 1; \
@@@ -923,26 -968,6 +972,6 @@@ modules modules_install: FORC
  
  endif # CONFIG_MODULES
  
- # Generate asm-offsets.h 
- # ---------------------------------------------------------------------------
- define filechk_gen-asm-offsets
-       (set -e; \
-        echo "#ifndef __ASM_OFFSETS_H__"; \
-        echo "#define __ASM_OFFSETS_H__"; \
-        echo "/*"; \
-        echo " * DO NOT MODIFY."; \
-        echo " *"; \
-        echo " * This file was generated by arch/$(ARCH)/Makefile"; \
-        echo " *"; \
-        echo " */"; \
-        echo ""; \
-        sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"; \
-        echo ""; \
-        echo "#endif" )
- endef
  ###
  # Cleaning is done on three levels.
  # make clean     Delete most generated files
@@@ -965,7 -990,7 +994,7 @@@ MRPROPER_FILES += .config .config.old i
  #
  clean: rm-dirs  := $(CLEAN_DIRS)
  clean: rm-files := $(CLEAN_FILES)
- clean-dirs      := $(addprefix _clean_,$(vmlinux-alldirs))
+ clean-dirs      := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs))
  
  .PHONY: $(clean-dirs) clean archclean
  $(clean-dirs):
@@@ -1044,6 -1069,7 +1073,7 @@@ help
        @echo  '  rpm             - Build a kernel as an RPM package'
        @echo  '  tags/TAGS       - Generate tags file for editors'
        @echo  '  cscope          - Generate cscope index'
+       @echo  '  kernelrelease   - Output the release version string'
        @echo  ''
        @echo  'Static analysers'
        @echo  '  buildcheck      - List dangling references to vmlinux discarded sections'
  __srctree = $(srctree)/
  endif
  
+ ALLSOURCE_ARCHS := $(ARCH)
  define all-sources
        ( find $(__srctree) $(RCS_FIND_IGNORE) \
               \( -name include -o -name arch \) -prune -o \
               -name '*.[chS]' -print; \
-         find $(__srctree)arch/$(ARCH) $(RCS_FIND_IGNORE) \
-              -name '*.[chS]' -print; \
+         for ARCH in $(ALLSOURCE_ARCHS) ; do \
+              find $(__srctree)arch/$${ARCH} $(RCS_FIND_IGNORE) \
+                   -name '*.[chS]' -print; \
+         done ; \
          find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \
               -name '*.[chS]' -print; \
          find $(__srctree)include $(RCS_FIND_IGNORE) \
               \( -name config -o -name 'asm-*' \) -prune \
               -o -name '*.[chS]' -print; \
-         find $(__srctree)include/asm-$(ARCH) $(RCS_FIND_IGNORE) \
-              -name '*.[chS]' -print; \
+         for ARCH in $(ALLSOURCE_ARCHS) ; do \
+              find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
+                   -name '*.[chS]' -print; \
+         done ; \
          find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
               -name '*.[chS]' -print )
  endef
  
  quiet_cmd_cscope-file = FILELST cscope.files
-       cmd_cscope-file = $(all-sources) > cscope.files
+       cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
  
  quiet_cmd_cscope = MAKE    cscope.out
-       cmd_cscope = cscope -k -b -q
+       cmd_cscope = cscope -b
  
  cscope: FORCE
        $(call cmd,cscope-file)
        $(call cmd,cscope)
  
  quiet_cmd_TAGS = MAKE   $@
- cmd_TAGS = $(all-sources) | etags -
+ define cmd_TAGS
+       rm -f $@; \
+       ETAGSF=`etags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL --extra=+f"`; \
+       $(all-sources) | xargs etags $$ETAGSF -a
+ endef
+ TAGS: FORCE
+       $(call cmd,TAGS)
  
- #     Exuberant ctags works better with -I
  
  quiet_cmd_tags = MAKE   $@
  define cmd_tags
        $(all-sources) | xargs ctags $$CTAGSF -a
  endef
  
- TAGS: FORCE
-       $(call cmd,TAGS)
  tags: FORCE
        $(call cmd,tags)
  
@@@ -1272,82 -1307,11 +1311,11 @@@ ifneq ($(cmd_files),
    include $(cmd_files)
  endif
  
- # Execute command and generate cmd file
- if_changed = $(if $(strip $? \
-                         $(filter-out $(cmd_$(1)),$(cmd_$@))\
-                         $(filter-out $(cmd_$@),$(cmd_$(1)))),\
-       @set -e; \
-       $(if $($(quiet)cmd_$(1)),echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';) \
-       $(cmd_$(1)); \
-       echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).cmd)
- # execute the command and also postprocess generated .d dependencies
- # file
- if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\
-                         $(filter-out $(cmd_$(1)),$(cmd_$@))\
-                         $(filter-out $(cmd_$@),$(cmd_$(1)))),\
-       $(Q)set -e; \
-       $(if $($(quiet)cmd_$(1)),echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';) \
-       $(cmd_$(1)); \
-       scripts/basic/fixdep $(depfile) $@ '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \
-       rm -f $(depfile); \
-       mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)
- # Usage: $(call if_changed_rule,foo)
- # will check if $(cmd_foo) changed, or any of the prequisites changed,
- # and if so will execute $(rule_foo)
- if_changed_rule = $(if $(strip $? \
-                              $(filter-out $(cmd_$(1)),$(cmd_$(@F)))\
-                              $(filter-out $(cmd_$(@F)),$(cmd_$(1)))),\
-                      $(Q)$(rule_$(1)))
- # If quiet is set, only print short version of command
- cmd = @$(if $($(quiet)cmd_$(1)),echo '  $($(quiet)cmd_$(1))' &&) $(cmd_$(1))
- # filechk is used to check if the content of a generated file is updated.
- # Sample usage:
- # define filechk_sample
- #     echo $KERNELRELEASE
- # endef
- # version.h : Makefile
- #     $(call filechk,sample)
- # The rule defined shall write to stdout the content of the new file.
- # The existing file will be compared with the new one.
- # - If no file exist it is created
- # - If the content differ the new file is used
- # - If they are equal no change, and no timestamp update
- define filechk
-       @set -e;                                \
-       echo '  CHK     $@';                    \
-       mkdir -p $(dir $@);                     \
-       $(filechk_$(1)) < $< > $@.tmp;          \
-       if [ -r $@ ] && cmp -s $@ $@.tmp; then  \
-               rm -f $@.tmp;                   \
-       else                                    \
-               echo '  UPD     $@';            \
-               mv -f $@.tmp $@;                \
-       fi
- endef
- # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=dir
- # Usage:
- # $(Q)$(MAKE) $(build)=dir
- build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
  # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
  # Usage:
  # $(Q)$(MAKE) $(clean)=dir
  clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
  
- #     $(call descend,<dir>,<target>)
- #     Recursively call a sub-make in <dir> with target <target>
- # Usage is deprecated, because make does not see this as an invocation of make.
- descend =$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=$(1) $(2)
  endif # skip-makefile
  
  FORCE:
diff --combined arch/arm/Kconfig
@@@ -64,6 -64,9 +64,9 @@@ config GENERIC_CALIBRATE_DELA
  config GENERIC_BUST_SPINLOCK
        bool
  
+ config ARCH_MAY_HAVE_PC_FDC
+       bool
  config GENERIC_ISA_DMA
        bool
  
@@@ -150,6 -153,7 +153,7 @@@ config ARCH_RP
        select ARCH_ACORN
        select FIQ
        select TIMER_ACORN
+       select ARCH_MAY_HAVE_PC_FDC
        help
          On the Acorn Risc-PC, Linux can support the internal IDE disk and
          CD-ROM interface, serial and parallel port, and the floppy drive.
@@@ -227,8 -231,6 +231,8 @@@ source "arch/arm/plat-omap/Kconfig
  
  source "arch/arm/mach-omap1/Kconfig"
  
 +source "arch/arm/mach-omap2/Kconfig"
 +
  source "arch/arm/mach-s3c2410/Kconfig"
  
  source "arch/arm/mach-lh7a40x/Kconfig"
@@@ -324,8 -326,8 +328,8 @@@ config SM
          processor machines. On a single processor machine, the kernel will
          run faster if you say N here.
  
-         See also the <file:Documentation/smp.tex>,
-         <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
+         See also the <file:Documentation/smp.txt>,
+         <file:Documentation/i386/IO-APIC.txt>,
          <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
          <http://www.linuxdoc.org/docs.html#howto>.
  
@@@ -400,7 -402,8 +404,7 @@@ config LED
          system, but the driver will do nothing.
  
  config LEDS_TIMER
 -      bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \
 -                          MACH_OMAP_H2 || MACH_OMAP_PERSEUS2
 +      bool "Timer LED" if !ARCH_CDB89712
        depends on LEDS
        default y if ARCH_EBSA110
        help
          will overrule the CPU usage LED.
  
  config LEDS_CPU
 -      bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110 && \
 -                      !ARCH_OMAP) || MACH_OMAP_H2 || MACH_OMAP_PERSEUS2
 +      bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110)
        depends on LEDS
        help
          If you say Y here, the red LED will be used to give a good real
@@@ -727,8 -731,6 +731,8 @@@ source "drivers/usb/Kconfig
  
  source "drivers/mmc/Kconfig"
  
 +source "drivers/ssi/Kconfig"
 +
  endmenu
  
  source "fs/Kconfig"
diff --combined arch/arm/Makefile
@@@ -53,7 -53,7 +53,7 @@@ tune-$(CONFIG_CPU_ARM926T)    :=-mtune=arm
  tune-$(CONFIG_CPU_SA110)      :=-mtune=strongarm110
  tune-$(CONFIG_CPU_SA1100)     :=-mtune=strongarm1100
  tune-$(CONFIG_CPU_XSCALE)     :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale
 -tune-$(CONFIG_CPU_V6)         :=-mtune=strongarm
 +tune-$(CONFIG_CPU_V6)         :=$(call cc-option,-mtune=arm1136jf-s,-mtune=arm1136jfs)
  
  # Need -Uarm for gcc < 3.x
  CFLAGS_ABI    :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
@@@ -92,7 -92,6 +92,7 @@@ textaddr-$(CONFIG_ARCH_FORTUNET)   := 0
   machine-$(CONFIG_ARCH_IXP4XX)           := ixp4xx
   machine-$(CONFIG_ARCH_IXP2000)    := ixp2000
   machine-$(CONFIG_ARCH_OMAP1)    := omap1
 + machine-$(CONFIG_ARCH_OMAP2)    := omap2
    incdir-$(CONFIG_ARCH_OMAP)     := omap
   machine-$(CONFIG_ARCH_S3C2410)          := s3c2410
   machine-$(CONFIG_ARCH_LH7A40X)          := lh7a40x
@@@ -176,10 -175,10 +176,10 @@@ els
  endif
        @touch $@
  
- prepare: maketools include/asm-arm/.arch
archprepare: maketools include/asm-arm/.arch
  
  .PHONY: maketools FORCE
- maketools: include/asm-arm/constants.h include/linux/version.h FORCE
+ maketools: include/linux/version.h FORCE
        $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h
  
  # Convert bzImage to zImage
@@@ -191,7 -190,7 +191,7 @@@ zImage Image xipImage bootpImage uImage
  zinstall install: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
  
- CLEAN_FILES += include/asm-arm/constants.h* include/asm-arm/mach-types.h \
+ CLEAN_FILES += include/asm-arm/mach-types.h \
               include/asm-arm/arch include/asm-arm/.arch
  
  # We use MRPROPER_FILES and CLEAN_FILES now
@@@ -202,11 -201,6 +202,6 @@@ archclean
  bp:;  $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/bootpImage
  i zi:;        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
  
- arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
-                                  include/asm-arm/.arch
- include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s
-       $(call filechk,gen-asm-offsets)
  
  define archhelp
    echo  '* zImage        - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
diff --combined arch/arm/mm/flush.c
  #include <linux/module.h>
  #include <linux/mm.h>
  #include <linux/pagemap.h>
 +#include <linux/shm.h>
  
  #include <asm/cacheflush.h>
  #include <asm/system.h>
  #include <asm/tlbflush.h>
  
  #ifdef CONFIG_CPU_CACHE_VIPT
+ void flush_cache_mm(struct mm_struct *mm)
+ {
+       if (cache_is_vivt()) {
+               if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
+                       __cpuc_flush_user_all();
+               return;
+       }
+       if (cache_is_vipt_aliasing()) {
+               asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
+               "       mcr     p15, 0, %0, c7, c5, 0\n"
+               "       mcr     p15, 0, %0, c7, c10, 4"
+                   :
+                   : "r" (0)
+                   : "cc");
+       }
+ }
+ void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
+ {
+       if (cache_is_vivt()) {
+               if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask))
+                       __cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
+                                               vma->vm_flags);
+               return;
+       }
+       if (cache_is_vipt_aliasing()) {
+               asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
+               "       mcr     p15, 0, %0, c7, c5, 0\n"
+               "       mcr     p15, 0, %0, c7, c10, 4"
+                   :
+                   : "r" (0)
+                   : "cc");
+       }
+ }
+ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)
+ {
+       if (cache_is_vivt()) {
+               if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
+                       unsigned long addr = user_addr & PAGE_MASK;
+                       __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
+               }
+               return;
+       }
+       if (cache_is_vipt_aliasing())
+               flush_pfn_alias(pfn, user_addr);
+ }
  #define ALIAS_FLUSH_START     0xffff4000
  
  #define TOP_PTE(x)    pte_offset_kernel(top_pmd, x)
@@@ -118,54 -169,3 +170,54 @@@ void flush_dcache_page(struct page *pag
        }
  }
  EXPORT_SYMBOL(flush_dcache_page);
 +
 +void flush_cache_mm(struct mm_struct *mm)
 +{
 +      if (cache_is_vivt()) {
 +              if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
 +                      __cpuc_flush_user_all();
 +              return;
 +      }
 +
 +      if (cache_is_vipt_aliasing()) {
 +              asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
 +              "       mcr     p15, 0, %0, c7, c5, 0\n"
 +              "       mcr     p15, 0, %0, c7, c10, 4"
 +                  :
 +                  : "r" (0)
 +                  : "cc");
 +      }
 +}
 +
 +void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
 +{
 +      if (cache_is_vivt()) {
 +              if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask))
 +                      __cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
 +                                              vma->vm_flags);
 +              return;
 +      }
 +
 +      if (cache_is_vipt_aliasing()) {
 +              asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
 +              "       mcr     p15, 0, %0, c7, c5, 0\n"
 +              "       mcr     p15, 0, %0, c7, c10, 4"
 +                  :
 +                  : "r" (0)
 +                  : "cc");
 +      }
 +}
 +
 +void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)
 +{
 +      if (cache_is_vivt()) {
 +              if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
 +                      unsigned long addr = user_addr & PAGE_MASK;
 +                      __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
 +              }
 +              return;
 +      }
 +
 +      if (cache_is_vipt_aliasing())
 +              flush_pfn_alias(pfn, user_addr);
 +}
diff --combined drivers/Kconfig
@@@ -4,6 -4,8 +4,8 @@@ menu "Device Drivers
  
  source "drivers/base/Kconfig"
  
+ source "drivers/connector/Kconfig"
  source "drivers/mtd/Kconfig"
  
  source "drivers/parport/Kconfig"
@@@ -64,6 -66,4 +66,6 @@@ source "drivers/infiniband/Kconfig
  
  source "drivers/sn/Kconfig"
  
 +source "drivers/ssi/Kconfig"
 +
  endmenu
diff --combined drivers/Makefile
@@@ -8,7 -8,7 +8,7 @@@
  obj-$(CONFIG_PCI)             += pci/
  obj-$(CONFIG_PARISC)          += parisc/
  obj-y                         += video/
- obj-$(CONFIG_ACPI_BOOT)               += acpi/
+ obj-$(CONFIG_ACPI)            += acpi/
  # PnP must come after ACPI since it will eventually need to check if acpi
  # was used and do nothing if so
  obj-$(CONFIG_PNP)             += pnp/
@@@ -17,6 -17,8 +17,8 @@@
  # default.
  obj-y                         += char/
  
+ obj-$(CONFIG_CONNECTOR)               += connector/
  # i810fb and intelfb depend on char/agp/
  obj-$(CONFIG_FB_I810)           += video/i810/
  obj-$(CONFIG_FB_INTEL)          += video/intelfb/
@@@ -26,9 -28,7 +28,9 @@@
  obj-$(CONFIG_SERIO)           += input/serio/
  obj-y                         += serial/
  obj-$(CONFIG_PARPORT)         += parport/
 -obj-y                         += base/ block/ misc/ mfd/ net/ media/
 +obj-y                         += base/ block/ misc/ mfd/ net/
 +obj-$(CONFIG_I2C)             += i2c/
 +obj-y                         += media/ ssi/
  obj-$(CONFIG_NUBUS)           += nubus/
  obj-$(CONFIG_ATM)             += atm/
  obj-$(CONFIG_PPC_PMAC)                += macintosh/
@@@ -52,6 -52,7 +54,6 @@@ obj-$(CONFIG_USB_GADGET)      += usb/gadget
  obj-$(CONFIG_GAMEPORT)                += input/gameport/
  obj-$(CONFIG_INPUT)           += input/
  obj-$(CONFIG_I2O)             += message/
 -obj-$(CONFIG_I2C)             += i2c/
  obj-$(CONFIG_W1)              += w1/
  obj-$(CONFIG_HWMON)           += hwmon/
  obj-$(CONFIG_PHONE)           += telephony/
diff --combined drivers/char/Kconfig
@@@ -80,7 -80,7 +80,7 @@@ config SERIAL_NONSTANDAR
  
  config COMPUTONE
        tristate "Computone IntelliPort Plus serial support"
-       depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32)
+       depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
        ---help---
          This driver supports the entire family of Intelliport II/Plus
          controllers with the exception of the MicroChannel controllers and
@@@ -138,7 -138,7 +138,7 @@@ config CYZ_INT
  
  config DIGIEPCA
        tristate "Digiboard Intelligent Async Support"
-       depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (!64BIT || BROKEN)
+       depends on SERIAL_NONSTANDARD
        ---help---
          This is a driver for Digi International's Xx, Xeve, and Xem series
          of cards which provide multiple serial ports. You would need
@@@ -175,7 -175,7 +175,7 @@@ config MOXA_INTELLI
  
  config MOXA_SMARTIO
        tristate "Moxa SmartIO support"
-       depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32)
+       depends on SERIAL_NONSTANDARD
        help
          Say Y here if you have a Moxa SmartIO multiport serial card.
  
@@@ -208,7 -208,7 +208,7 @@@ config SYNCLIN
  
  config SYNCLINKMP
        tristate "SyncLink Multiport support"
-       depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32)
+       depends on SERIAL_NONSTANDARD
        help
          Enable support for the SyncLink Multiport (2 or 4 ports)
          serial adapter, running asynchronous and HDLC communications up
@@@ -659,18 -659,6 +659,18 @@@ config HW_RANDO
  
          If unsure, say N.
  
 +config OMAP16XX_RNG
 +      tristate "OMAP16xx Random Number Generator support"
 +      depends on ARCH_OMAP16XX
 +      ---help---
 +        This driver provides kernel-side support for the Random Number
 +        Generator hardware found on OMAP16xx multimedia processors.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called hw_random.
 +
 +        If unsure, say N.
 +
  config NVRAM
        tristate "/dev/nvram support"
        depends on ATARI || X86 || X86_64 || ARM || GENERIC_NVRAM
@@@ -747,7 -735,7 +747,7 @@@ config SGI_IP27_RT
  
  config GEN_RTC
        tristate "Generic /dev/rtc emulation"
-       depends on RTC!=y && !IA64 && !ARM && !PPC64 && !M32R && !SPARC32
+       depends on RTC!=y && !IA64 && !ARM && !PPC64 && !M32R && !SPARC32 && !SPARC64
        ---help---
          If you say Y here and create a character special file /dev/rtc with
          major number 10 and minor number 135 using mknod ("man mknod"), you
@@@ -773,11 -761,6 +773,11 @@@ config GEN_RTC_
  config EFI_RTC
        bool "EFI Real Time Clock Services"
        depends on IA64
 +config OMAP_RTC
 +      bool "TI OMAP Real Time Clock"
 +      depends on ARCH_OMAP1510 || ARCH_OMAP16XX || ARCH_OMAP730
 +      help
 +        Support for TI OMAP RTC
  
  config DS1302
        tristate "DS1302 RTC support"
@@@ -139,6 -139,15 +139,15 @@@ config SA1100_WATCHDO
          To compile this driver as a module, choose M here: the
          module will be called sa1100_wdt.
  
+ config MPCORE_WATCHDOG
+       tristate "MPcore watchdog"
+       depends on WATCHDOG && ARM_MPCORE_PLATFORM && LOCAL_TIMERS
+       help
+         Watchdog timer embedded into the MPcore system.
+         To compile this driver as a module, choose M here: the
+         module will be called mpcore_wdt.
  # X86 (i386 + ia64 + x86_64) Architecture
  
  config ACQUIRE_WDT
@@@ -563,11 -572,4 +572,11 @@@ config USBPCWATCHDO
  
          Most people will say N.
  
 +config OMAP16XX_WATCHDOG
 +      tristate "OMAP1610/OMAP1710 Watchdog"
 +      depends on WATCHDOG && ARCH_OMAP16XX
 +      help
 +        Support for TI OMAP1610/OMAP1710 watchdog. Say 'Y' here to enable the
 +        OMAP1610/OMAP1710 watchdog timer.
 +
  endmenu
@@@ -27,9 -27,9 +27,10 @@@ obj-$(CONFIG_21285_WATCHDOG) += wdt285.
  obj-$(CONFIG_977_WATCHDOG) += wdt977.o
  obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o
  obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
 +obj-$(CONFIG_OMAP16XX_WATCHDOG) += omap1610_wdt.o
  obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
  obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
+ obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o
  
  # X86 (i386 + ia64 + x86_64) Architecture
  obj-$(CONFIG_ACQUIRE_WDT) += acquirewdt.o
@@@ -144,6 -144,22 +144,22 @@@ config I2C_I81
          This driver can also be built as a module.  If so, the module
          will be called i2c-i810.
  
+ config I2C_PXA
+       tristate "Intel PXA2XX I2C adapter (EXPERIMENTAL)"
+       depends on I2C && EXPERIMENTAL && ARCH_PXA
+       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_PIIX4
        tristate "Intel PIIX4"
        depends on I2C && PCI
@@@ -182,14 -198,8 +198,8 @@@ config I2C_IOP3X
          will be called i2c-iop3xx.
  
  config I2C_ISA
-       tristate "ISA Bus support"
+       tristate
        depends on I2C
-       help
-         If you say yes to this option, support will be included for i2c
-         interfaces that are on the ISA bus.
-         This driver can also be built as a module.  If so, the module
-         will be called i2c-isa.
  
  config I2C_ITE
        tristate "ITE I2C Adapter"
@@@ -497,11 -507,4 +507,11 @@@ config I2C_MV64XX
          This driver can also be built as a module.  If so, the module
          will be called i2c-mv64xxx.
  
 +config I2C_OMAP
 +      tristate "OMAP I2C adapter"
 +      depends on I2C && ARCH_OMAP
 +      default y if MACH_OMAP_H3 || MACH_OMAP_OSK
 +      help
 +        Support for TI OMAP I2C driver. Say yes if you want to use the OMAP
 +        I2C interface.
  endmenu
@@@ -28,6 -28,7 +28,7 @@@ obj-$(CONFIG_I2C_PARPORT_LIGHT)       += i2c-
  obj-$(CONFIG_I2C_PCA_ISA)     += i2c-pca-isa.o
  obj-$(CONFIG_I2C_PIIX4)               += i2c-piix4.o
  obj-$(CONFIG_I2C_PROSAVAGE)   += i2c-prosavage.o
+ obj-$(CONFIG_I2C_PXA)         += i2c-pxa.o
  obj-$(CONFIG_I2C_RPXLITE)     += i2c-rpx.o
  obj-$(CONFIG_I2C_S3C2410)     += i2c-s3c2410.o
  obj-$(CONFIG_I2C_SAVAGE4)     += i2c-savage4.o
@@@ -41,7 -42,6 +42,7 @@@ obj-$(CONFIG_I2C_VIAPRO)      += i2c-viapro.
  obj-$(CONFIG_I2C_VOODOO3)     += i2c-voodoo3.o
  obj-$(CONFIG_SCx200_ACB)      += scx200_acb.o
  obj-$(CONFIG_SCx200_I2C)      += scx200_i2c.o
 +obj-$(CONFIG_I2C_OMAP)          += i2c-omap.o
  
  ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
  EXTRA_CFLAGS += -DDEBUG
@@@ -2,17 -2,12 +2,12 @@@
  # Miscellaneous I2C chip drivers configuration
  #
  
- config I2C_SENSOR
-       tristate
-       default n
  menu "Miscellaneous I2C Chip support"
        depends on I2C
  
  config SENSORS_DS1337
        tristate "Dallas Semiconductor DS1337 and DS1339 Real Time Clock"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get support for Dallas Semiconductor
          DS1337 and DS1339 real-time clock chips.
@@@ -23,7 -18,6 +18,6 @@@
  config SENSORS_DS1374
        tristate "Maxim/Dallas Semiconductor DS1374 Real Time Clock"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get support for Dallas Semiconductor
          DS1374 real-time clock chips.
@@@ -34,7 -28,6 +28,6 @@@
  config SENSORS_EEPROM
        tristate "EEPROM reader"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get read-only access to the EEPROM data
          available on modern memory DIMMs and Sony Vaio laptops.  Such
@@@ -46,7 -39,6 +39,6 @@@
  config SENSORS_PCF8574
        tristate "Philips PCF8574 and PCF8574A"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get support for Philips PCF8574 and 
          PCF8574A chips.
@@@ -67,7 -59,6 +59,6 @@@ config SENSORS_PCA953
  config SENSORS_PCF8591
        tristate "Philips PCF8591"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get support for Philips PCF8591 chips.
  
@@@ -77,7 -68,6 +68,6 @@@
  config SENSORS_RTC8564
        tristate "Epson 8564 RTC chip"
        depends on I2C && EXPERIMENTAL
-       select I2C_SENSOR
        help
          If you say yes here you get support for the Epson 8564 RTC chip.
  
@@@ -112,20 -102,6 +102,20 @@@ config TPS6501
          This driver can also be built as a module.  If so, the module
          will be called tps65010.
  
 +config SENSORS_TLV320AIC23
 +      tristate "Texas Instruments TLV320AIC23 Codec"
 +      depends on I2C && I2C_OMAP
 +      help
 +        If you say yes here you get support for the I2C control
 +        interface for Texas Instruments TLV320AIC23 audio codec.
 +
 +config GPIOEXPANDER_OMAP
 +      bool "GPIO Expander PCF8574PWR for OMAP"
 +      depends on I2C && ARCH_OMAP16XX
 +      help
 +        If you say yes here you get support for I/O expander calls
 +        to configure IrDA, Camera and audio devices endmenu
 +
  config SENSORS_M41T00
        tristate "ST M41T00 RTC chip"
        depends on I2C && PPC32
  #include <linux/workqueue.h>
  
  #include <asm/irq.h>
 +#include <asm/mach-types.h>
 +
 +#include <asm/arch/gpio.h>
  #include <asm/arch/usb.h>
 +#include <asm/arch/mux.h>
  
  
  #ifndef       DEBUG
@@@ -95,11 -91,14 +95,11 @@@ struct isp1301 
  
  /*-------------------------------------------------------------------------*/
  
 -#ifdef        CONFIG_MACH_OMAP_H2
 +#if   defined(CONFIG_MACH_OMAP_H2) || \
 +      defined(CONFIG_MACH_OMAP_H3)
  
  /* board-specific PM hooks */
  
 -#include <asm/arch/gpio.h>
 -#include <asm/arch/mux.h>
 -#include <asm/mach-types.h>
 -
  
  #if   defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE)
  
@@@ -130,30 -129,17 +130,30 @@@ static void enable_vbus_source(struct i
  }
  
  
 -/* products will deliver OTG messages with LEDs, GUI, etc */
 -static inline void notresponding(struct isp1301 *isp)
 +#else
 +
 +static void enable_vbus_draw(struct isp1301 *isp, unsigned mA)
  {
 -      printk(KERN_NOTICE "OTG device not responding.\n");
 +      pr_debug("%s UNIMPL\n", __FUNCTION__);
  }
  
 +static void enable_vbus_source(struct isp1301 *isp)
 +{
 +      pr_debug("%s UNIMPL\n", __FUNCTION__);
 +}
  
  #endif
  
  /*-------------------------------------------------------------------------*/
  
 +/* products will deliver OTG messages with LEDs, GUI, etc */
 +static inline void notresponding(struct isp1301 *isp)
 +{
 +      printk(KERN_NOTICE "OTG device not responding.\n");
 +}
 +
 +/*-------------------------------------------------------------------------*/
 +
  /* only two addresses possible */
  #define       ISP_BASE                0x2c
  static unsigned short normal_i2c[] = {
@@@ -529,7 -515,6 +529,7 @@@ static inline void check_state(struct i
  static void update_otg1(struct isp1301 *isp, u8 int_src)
  {
        u32     otg_ctrl;
 +      u8      int_id;
  
        otg_ctrl = OTG_CTRL_REG
                        & OTG_CTRL_MASK
        }
        if (int_src & INTR_VBUS_VLD)
                otg_ctrl |= OTG_VBUSVLD;
 -      if (int_src & INTR_ID_GND) {            /* default-A */
 +
 +      int_id = isp1301_get_u8(isp, ISP1301_INTERRUPT_SOURCE);
 +
 +      if (int_id & INTR_ID_GND) {             /* default-A */
                if (isp->otg.state == OTG_STATE_B_IDLE
                                || isp->otg.state == OTG_STATE_UNDEFINED) {
                        a_idle(isp, "init");
@@@ -1099,7 -1081,7 +1099,7 @@@ static void isp_update_otg(struct isp13
        /* update the OTG controller state to match the isp1301; may
         * trigger OPRT_CHG irqs for changes going to the isp1301.
         */
 -      update_otg1(isp, isp_stat);
 +      update_otg1(isp, stat); // pass the actual interrupt latch status
        update_otg2(isp, isp_bstat);
        check_state(isp, __FUNCTION__);
  #endif
@@@ -1240,9 -1222,6 +1240,9 @@@ static int isp1301_detach_client(struc
        if (machine_is_omap_h2())
                omap_free_gpio(2);
  
 +      if (machine_is_omap_h3())
 +              omap_free_gpio(14);
 +
        isp->timer.data = 0;
        set_bit(WORK_STOP, &isp->todo);
        del_timer_sync(&isp->timer);
@@@ -1321,7 -1300,7 +1321,7 @@@ isp1301_set_host(struct otg_transceive
  
        power_up(isp);
  
 -      if (machine_is_omap_h2())
 +      if (machine_is_omap_h2() || machine_is_omap_h3())
                isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0);
  
        dev_info(&isp->client.dev, "A-Host sessions ok\n");
@@@ -1384,13 -1363,13 +1384,13 @@@ isp1301_set_peripheral(struct otg_trans
        power_up(isp);
        isp->otg.state = OTG_STATE_B_IDLE;
  
 -      if (machine_is_omap_h2())
 +      if (machine_is_omap_h2() || machine_is_omap_h3())
                isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0);
  
        isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING,
 -              INTR_SESS_VLD);
 +              INTR_SESS_VLD | INTR_VBUS_VLD);
        isp1301_set_bits(isp, ISP1301_INTERRUPT_FALLING,
 -              INTR_VBUS_VLD);
 +              INTR_VBUS_VLD | INTR_SESS_VLD);
        dev_info(&isp->client.dev, "B-Peripheral sessions ok\n");
        dump_regs(isp, __FUNCTION__);
  
@@@ -1467,10 -1446,6 +1467,10 @@@ isp1301_start_hnp(struct otg_transceive
         * So do this part as early as possible...
         */
        switch (isp->otg.state) {
 +      case OTG_STATE_B_PERIPHERAL:
 +              isp->otg.state = OTG_STATE_B_WAIT_ACON;
 +              isp1301_defer_work(isp, WORK_UPDATE_ISP);
 +              break;
        case OTG_STATE_B_HOST:
                isp->otg.state = OTG_STATE_B_PERIPHERAL;
                /* caller will suspend next */
@@@ -1514,7 -1489,7 +1514,7 @@@ static int isp1301_probe(struct i2c_ada
        if (the_transceiver)
                return 0;
  
-       isp = kcalloc(1, sizeof *isp, GFP_KERNEL);
+       isp = kzalloc(sizeof *isp, GFP_KERNEL);
        if (!isp)
                return 0;
  
@@@ -1586,30 -1561,19 +1586,30 @@@ fail1
        }
  #endif
  
 -      if (machine_is_omap_h2()) {
 +      if (machine_is_omap_h2() || machine_is_omap_h3()) {
                /* full speed signaling by default */
                isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1,
                        MC1_SPEED_REG);
                isp1301_set_bits(isp, ISP1301_MODE_CONTROL_2,
                        MC2_SPD_SUSP_CTRL);
 +      }
  
 +      if (machine_is_omap_h2()) {
                /* IRQ wired at M14 */
                omap_cfg_reg(M14_1510_GPIO2);
                isp->irq = OMAP_GPIO_IRQ(2);
                omap_request_gpio(2);
                omap_set_gpio_direction(2, 1);
 -              omap_set_gpio_edge_ctrl(2, OMAP_GPIO_FALLING_EDGE);
 +              set_irq_type(isp->irq, IRQT_FALLING);
 +      }
 +
 +      if (machine_is_omap_h3()) {
 +              /* IRQ wired at N21 */
 +              omap_cfg_reg(N21_1710_GPIO14);
 +              isp->irq = OMAP_GPIO_IRQ(14);
 +              omap_request_gpio(14);
 +              omap_set_gpio_direction(14, 1);
 +              set_irq_type(isp->irq, IRQT_FALLING);
        }
  
        status = request_irq(isp->irq, isp1301_irq,
@@@ -22,12 -22,21 +22,21 @@@ config VIDEO_BT84
          the Miro, Hauppauge and STB boards. Please read the material in
          <file:Documentation/video4linux/bttv/> for more information.
  
-         If you say Y or M here, you need to say Y or M to "I2C support" and
-         "I2C bit-banging interfaces" in the device drivers section.
          To compile this driver as a module, choose M here: the
          module will be called bttv.
  
+ config VIDEO_SAA6588
+       tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
+       depends on VIDEO_DEV && I2C && VIDEO_BT848
+       help
+         Support for  Radio Data System (RDS) decoder. This allows seeing
+         radio station identification transmitted using this standard.
+         Currentlly, it works only with bt8x8 chips.
+         To compile this driver as a module, choose M here: the
+         module will be called saa6588.
  config VIDEO_PMS
        tristate "Mediavision Pro Movie Studio Video For Linux"
        depends on VIDEO_DEV && ISA
@@@ -362,10 -371,4 +371,10 @@@ config VIDEO_M32R_AR_M6427
          Say Y here to use the Renesas M64278E-800 camera module,
          which supports VGA(640x480 pixcels) size of images.
  
 +config VIDEO_OMAP_CAMERA
 +      tristate "OMAP Video for Linux camera driver"
 +      depends on VIDEO_DEV && ARCH_OMAP16XX
 +      select VIDEO_BUF
 +
 +
  endmenu
@@@ -5,6 -5,7 +5,7 @@@
  bttv-objs     :=      bttv-driver.o bttv-cards.o bttv-if.o \
                        bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o
  zoran-objs      :=    zr36120.o zr36120_i2c.o zr36120_mem.o
+ rds-objs        :=    saa6588.o
  zr36067-objs  :=      zoran_procfs.o zoran_device.o \
                        zoran_driver.o zoran_card.o
  tuner-objs    :=      tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o
@@@ -15,6 -16,7 +16,7 @@@ obj-$(CONFIG_VIDEO_BT848) += bttv.o msp
  obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o
  
  obj-$(CONFIG_VIDEO_ZR36120) += zoran.o
+ obj-$(CONFIG_VIDEO_SAA6588) += rds.o
  obj-$(CONFIG_VIDEO_SAA5246A) += saa5246a.o
  obj-$(CONFIG_VIDEO_SAA5249) += saa5249.o
  obj-$(CONFIG_VIDEO_CQCAM) += c-qcam.o
@@@ -29,7 -31,7 +31,7 @@@ obj-$(CONFIG_VIDEO_ZORAN_LML33R10) += s
  obj-$(CONFIG_VIDEO_ZORAN) += zr36067.o videocodec.o
  obj-$(CONFIG_VIDEO_PMS) += pms.o
  obj-$(CONFIG_VIDEO_PLANB) += planb.o
- obj-$(CONFIG_VIDEO_VINO) += vino.o
+ obj-$(CONFIG_VIDEO_VINO) += vino.o saa7191.o indycam.o
  obj-$(CONFIG_VIDEO_STRADIS) += stradis.o
  obj-$(CONFIG_VIDEO_CPIA) += cpia.o
  obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o
@@@ -51,6 -53,5 +53,6 @@@ obj-$(CONFIG_VIDEO_BTCX)  += btcx-risc.
  obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
  
  obj-$(CONFIG_VIDEO_M32R_AR_M64278) += arv.o
 +obj-$(CONFIG_VIDEO_OMAP_CAMERA) += omap/
  
  EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
diff --combined drivers/mmc/mmc.c
@@@ -2,6 -2,8 +2,8 @@@
   *  linux/drivers/mmc/mmc.c
   *
   *  Copyright (C) 2003-2004 Russell King, All Rights Reserved.
+  *  SD support Copyright (C) 2004 Ian Molton, All Rights Reserved.
+  *  SD support Copyright (C) 2005 Pierre Ossman, 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 version 2 as
@@@ -16,6 -18,8 +18,8 @@@
  #include <linux/delay.h>
  #include <linux/pagemap.h>
  #include <linux/err.h>
+ #include <asm/scatterlist.h>
+ #include <linux/scatterlist.h>
  
  #include <linux/mmc/card.h>
  #include <linux/mmc/host.h>
@@@ -172,7 -176,81 +176,81 @@@ int mmc_wait_for_cmd(struct mmc_host *h
  
  EXPORT_SYMBOL(mmc_wait_for_cmd);
  
+ /**
+  *    mmc_wait_for_app_cmd - start an application command and wait for
+                              completion
+  *    @host: MMC host to start command
+  *    @rca: RCA to send MMC_APP_CMD to
+  *    @cmd: MMC command to start
+  *    @retries: maximum number of retries
+  *
+  *    Sends a MMC_APP_CMD, checks the card response, sends the command
+  *    in the parameter and waits for it to complete. Return any error
+  *    that occurred while the command was executing.  Do not attempt to
+  *    parse the response.
+  */
+ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca,
+       struct mmc_command *cmd, int retries)
+ {
+       struct mmc_request mrq;
+       struct mmc_command appcmd;
+       int i, err;
+       BUG_ON(host->card_busy == NULL);
+       BUG_ON(retries < 0);
+       err = MMC_ERR_INVALID;
+       /*
+        * We have to resend MMC_APP_CMD for each attempt so
+        * we cannot use the retries field in mmc_command.
+        */
+       for (i = 0;i <= retries;i++) {
+               memset(&mrq, 0, sizeof(struct mmc_request));
+               appcmd.opcode = MMC_APP_CMD;
+               appcmd.arg = rca << 16;
+               appcmd.flags = MMC_RSP_R1;
+               appcmd.retries = 0;
+               memset(appcmd.resp, 0, sizeof(appcmd.resp));
+               appcmd.data = NULL;
+               mrq.cmd = &appcmd;
+               appcmd.data = NULL;
+               mmc_wait_for_req(host, &mrq);
+               if (appcmd.error) {
+                       err = appcmd.error;
+                       continue;
+               }
+               /* Check that card supported application commands */
+               if (!(appcmd.resp[0] & R1_APP_CMD))
+                       return MMC_ERR_FAILED;
+               memset(&mrq, 0, sizeof(struct mmc_request));
+               memset(cmd->resp, 0, sizeof(cmd->resp));
+               cmd->retries = 0;
+               mrq.cmd = cmd;
+               cmd->data = NULL;
  
+               mmc_wait_for_req(host, &mrq);
+               err = cmd->error;
+               if (cmd->error == MMC_ERR_NONE)
+                       break;
+       }
+       return err;
+ }
+ EXPORT_SYMBOL(mmc_wait_for_app_cmd);
+ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card);
  
  /**
   *    __mmc_claim_host - exclusively claim a host
@@@ -206,16 -284,10 +284,10 @@@ int __mmc_claim_host(struct mmc_host *h
        spin_unlock_irqrestore(&host->lock, flags);
        remove_wait_queue(&host->wq, &wait);
  
-       if (card != (void *)-1 && host->card_selected != card) {
-               struct mmc_command cmd;
-               host->card_selected = card;
-               cmd.opcode = MMC_SELECT_CARD;
-               cmd.arg = card->rca << 16;
-               cmd.flags = MMC_RSP_R1;
-               err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+       if (card != (void *)-1) {
+               err = mmc_select_card(host, card);
+               if (err != MMC_ERR_NONE)
+                       return err;
        }
  
        return err;
@@@ -245,6 -317,63 +317,63 @@@ void mmc_release_host(struct mmc_host *
  
  EXPORT_SYMBOL(mmc_release_host);
  
+ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
+ {
+       int err;
+       struct mmc_command cmd;
+       BUG_ON(host->card_busy == NULL);
+       if (host->card_selected == card)
+               return MMC_ERR_NONE;
+       host->card_selected = card;
+       cmd.opcode = MMC_SELECT_CARD;
+       cmd.arg = card->rca << 16;
+       cmd.flags = MMC_RSP_R1;
+       err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+       if (err != MMC_ERR_NONE)
+               return err;
+       /*
+        * Default bus width is 1 bit.
+        */
+       host->ios.bus_width = MMC_BUS_WIDTH_1;
+       /*
+        * We can only change the bus width of the selected
+        * card so therefore we have to put the handling
+        * here.
+        */
+       if (host->caps & MMC_CAP_4_BIT_DATA) {
+               /*
+                * The card is in 1 bit mode by default so
+                * we only need to change if it supports the
+                * wider version.
+                */
+               if (mmc_card_sd(card) &&
+                       (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
+                       struct mmc_command cmd;
+                       cmd.opcode = SD_APP_SET_BUS_WIDTH;
+                       cmd.arg = SD_BUS_WIDTH_4;
+                       cmd.flags = MMC_RSP_R1;
+                       err = mmc_wait_for_app_cmd(host, card->rca, &cmd,
+                               CMD_RETRIES);
+                       if (err != MMC_ERR_NONE)
+                               return err;
+                       host->ios.bus_width = MMC_BUS_WIDTH_4;
+               }
+       }
+       host->ops->set_ios(host, &host->ios);
+       return MMC_ERR_NONE;
+ }
  /*
   * Ensure that no card is selected.
   */
@@@ -322,48 -451,69 +451,69 @@@ static void mmc_decode_cid(struct mmc_c
  
        memset(&card->cid, 0, sizeof(struct mmc_cid));
  
-       /*
-        * The selection of the format here is guesswork based upon
-        * information people have sent to date.
-        */
-       switch (card->csd.mmca_vsn) {
-       case 0: /* MMC v1.? */
-       case 1: /* MMC v1.4 */
-               card->cid.manfid        = UNSTUFF_BITS(resp, 104, 24);
-               card->cid.prod_name[0]  = UNSTUFF_BITS(resp, 96, 8);
-               card->cid.prod_name[1]  = UNSTUFF_BITS(resp, 88, 8);
-               card->cid.prod_name[2]  = UNSTUFF_BITS(resp, 80, 8);
-               card->cid.prod_name[3]  = UNSTUFF_BITS(resp, 72, 8);
-               card->cid.prod_name[4]  = UNSTUFF_BITS(resp, 64, 8);
-               card->cid.prod_name[5]  = UNSTUFF_BITS(resp, 56, 8);
-               card->cid.prod_name[6]  = UNSTUFF_BITS(resp, 48, 8);
-               card->cid.hwrev         = UNSTUFF_BITS(resp, 44, 4);
-               card->cid.fwrev         = UNSTUFF_BITS(resp, 40, 4);
-               card->cid.serial        = UNSTUFF_BITS(resp, 16, 24);
-               card->cid.month         = UNSTUFF_BITS(resp, 12, 4);
-               card->cid.year          = UNSTUFF_BITS(resp, 8, 4) + 1997;
-               break;
-       case 2: /* MMC v2.x ? */
-       case 3: /* MMC v3.x ? */
-               card->cid.manfid        = UNSTUFF_BITS(resp, 120, 8);
-               card->cid.oemid         = UNSTUFF_BITS(resp, 104, 16);
-               card->cid.prod_name[0]  = UNSTUFF_BITS(resp, 96, 8);
-               card->cid.prod_name[1]  = UNSTUFF_BITS(resp, 88, 8);
-               card->cid.prod_name[2]  = UNSTUFF_BITS(resp, 80, 8);
-               card->cid.prod_name[3]  = UNSTUFF_BITS(resp, 72, 8);
-               card->cid.prod_name[4]  = UNSTUFF_BITS(resp, 64, 8);
-               card->cid.prod_name[5]  = UNSTUFF_BITS(resp, 56, 8);
-               card->cid.serial        = UNSTUFF_BITS(resp, 16, 32);
-               card->cid.month         = UNSTUFF_BITS(resp, 12, 4);
-               card->cid.year          = UNSTUFF_BITS(resp, 8, 4) + 1997;
-               break;
-       default:
-               printk("%s: card has unknown MMCA version %d\n",
-                       mmc_hostname(card->host), card->csd.mmca_vsn);
-               mmc_card_set_bad(card);
-               break;
+       if (mmc_card_sd(card)) {
+               /*
+                * SD doesn't currently have a version field so we will
+                * have to assume we can parse this.
+                */
+               card->cid.manfid                = UNSTUFF_BITS(resp, 120, 8);
+               card->cid.oemid                 = UNSTUFF_BITS(resp, 104, 16);
+               card->cid.prod_name[0]          = UNSTUFF_BITS(resp, 96, 8);
+               card->cid.prod_name[1]          = UNSTUFF_BITS(resp, 88, 8);
+               card->cid.prod_name[2]          = UNSTUFF_BITS(resp, 80, 8);
+               card->cid.prod_name[3]          = UNSTUFF_BITS(resp, 72, 8);
+               card->cid.prod_name[4]          = UNSTUFF_BITS(resp, 64, 8);
+               card->cid.hwrev                 = UNSTUFF_BITS(resp, 60, 4);
+               card->cid.fwrev                 = UNSTUFF_BITS(resp, 56, 4);
+               card->cid.serial                = UNSTUFF_BITS(resp, 24, 32);
+               card->cid.year                  = UNSTUFF_BITS(resp, 12, 8);
+               card->cid.month                 = UNSTUFF_BITS(resp, 8, 4);
+               card->cid.year += 2000; /* SD cards year offset */
+       } else {
+               /*
+                * The selection of the format here is based upon published
+                * specs from sandisk and from what people have reported.
+                */
+               switch (card->csd.mmca_vsn) {
+               case 0: /* MMC v1.0 - v1.2 */
+               case 1: /* MMC v1.4 */
+                       card->cid.manfid        = UNSTUFF_BITS(resp, 104, 24);
+                       card->cid.prod_name[0]  = UNSTUFF_BITS(resp, 96, 8);
+                       card->cid.prod_name[1]  = UNSTUFF_BITS(resp, 88, 8);
+                       card->cid.prod_name[2]  = UNSTUFF_BITS(resp, 80, 8);
+                       card->cid.prod_name[3]  = UNSTUFF_BITS(resp, 72, 8);
+                       card->cid.prod_name[4]  = UNSTUFF_BITS(resp, 64, 8);
+                       card->cid.prod_name[5]  = UNSTUFF_BITS(resp, 56, 8);
+                       card->cid.prod_name[6]  = UNSTUFF_BITS(resp, 48, 8);
+                       card->cid.hwrev         = UNSTUFF_BITS(resp, 44, 4);
+                       card->cid.fwrev         = UNSTUFF_BITS(resp, 40, 4);
+                       card->cid.serial        = UNSTUFF_BITS(resp, 16, 24);
+                       card->cid.month         = UNSTUFF_BITS(resp, 12, 4);
+                       card->cid.year          = UNSTUFF_BITS(resp, 8, 4) + 1997;
+                       break;
+               case 2: /* MMC v2.0 - v2.2 */
+               case 3: /* MMC v3.1 - v3.3 */
+                       card->cid.manfid        = UNSTUFF_BITS(resp, 120, 8);
+                       card->cid.oemid         = UNSTUFF_BITS(resp, 104, 16);
+                       card->cid.prod_name[0]  = UNSTUFF_BITS(resp, 96, 8);
+                       card->cid.prod_name[1]  = UNSTUFF_BITS(resp, 88, 8);
+                       card->cid.prod_name[2]  = UNSTUFF_BITS(resp, 80, 8);
+                       card->cid.prod_name[3]  = UNSTUFF_BITS(resp, 72, 8);
+                       card->cid.prod_name[4]  = UNSTUFF_BITS(resp, 64, 8);
+                       card->cid.prod_name[5]  = UNSTUFF_BITS(resp, 56, 8);
+                       card->cid.serial        = UNSTUFF_BITS(resp, 16, 32);
+                       card->cid.month         = UNSTUFF_BITS(resp, 12, 4);
+                       card->cid.year          = UNSTUFF_BITS(resp, 8, 4) + 1997;
+                       break;
+               default:
+                       printk("%s: card has unknown MMCA version %d\n",
+                               mmc_hostname(card->host), card->csd.mmca_vsn);
+                       mmc_card_set_bad(card);
+                       break;
+               }
        }
  }
  
@@@ -376,34 -526,86 +526,86 @@@ static void mmc_decode_csd(struct mmc_c
        unsigned int e, m, csd_struct;
        u32 *resp = card->raw_csd;
  
-       /*
-        * We only understand CSD structure v1.1 and v2.
-        * v2 has extra information in bits 15, 11 and 10.
-        */
-       csd_struct = UNSTUFF_BITS(resp, 126, 2);
-       if (csd_struct != 1 && csd_struct != 2) {
-               printk("%s: unrecognised CSD structure version %d\n",
-                       mmc_hostname(card->host), csd_struct);
-               mmc_card_set_bad(card);
-               return;
+       if (mmc_card_sd(card)) {
+               csd_struct = UNSTUFF_BITS(resp, 126, 2);
+               if (csd_struct != 0) {
+                       printk("%s: unrecognised CSD structure version %d\n",
+                               mmc_hostname(card->host), csd_struct);
+                       mmc_card_set_bad(card);
+                       return;
+               }
+               m = UNSTUFF_BITS(resp, 115, 4);
+               e = UNSTUFF_BITS(resp, 112, 3);
+               csd->tacc_ns     = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
+               csd->tacc_clks   = UNSTUFF_BITS(resp, 104, 8) * 100;
+               m = UNSTUFF_BITS(resp, 99, 4);
+               e = UNSTUFF_BITS(resp, 96, 3);
+               csd->max_dtr      = tran_exp[e] * tran_mant[m];
+               csd->cmdclass     = UNSTUFF_BITS(resp, 84, 12);
+               e = UNSTUFF_BITS(resp, 47, 3);
+               m = UNSTUFF_BITS(resp, 62, 12);
+               csd->capacity     = (1 + m) << (e + 2);
+               csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
+       } else {
+               /*
+                * We only understand CSD structure v1.1 and v1.2.
+                * v1.2 has extra information in bits 15, 11 and 10.
+                */
+               csd_struct = UNSTUFF_BITS(resp, 126, 2);
+               if (csd_struct != 1 && csd_struct != 2) {
+                       printk("%s: unrecognised CSD structure version %d\n",
+                               mmc_hostname(card->host), csd_struct);
+                       mmc_card_set_bad(card);
+                       return;
+               }
+               csd->mmca_vsn    = UNSTUFF_BITS(resp, 122, 4);
+               m = UNSTUFF_BITS(resp, 115, 4);
+               e = UNSTUFF_BITS(resp, 112, 3);
+               csd->tacc_ns     = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
+               csd->tacc_clks   = UNSTUFF_BITS(resp, 104, 8) * 100;
+               m = UNSTUFF_BITS(resp, 99, 4);
+               e = UNSTUFF_BITS(resp, 96, 3);
+               csd->max_dtr      = tran_exp[e] * tran_mant[m];
+               csd->cmdclass     = UNSTUFF_BITS(resp, 84, 12);
+               e = UNSTUFF_BITS(resp, 47, 3);
+               m = UNSTUFF_BITS(resp, 62, 12);
+               csd->capacity     = (1 + m) << (e + 2);
+               csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
        }
+ }
  
-       csd->mmca_vsn    = UNSTUFF_BITS(resp, 122, 4);
-       m = UNSTUFF_BITS(resp, 115, 4);
-       e = UNSTUFF_BITS(resp, 112, 3);
-       csd->tacc_ns     = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
-       csd->tacc_clks   = UNSTUFF_BITS(resp, 104, 8) * 100;
+ /*
+  * Given a 64-bit response, decode to our card SCR structure.
+  */
+ static void mmc_decode_scr(struct mmc_card *card)
+ {
+       struct sd_scr *scr = &card->scr;
+       unsigned int scr_struct;
+       u32 resp[4];
+       BUG_ON(!mmc_card_sd(card));
  
-       m = UNSTUFF_BITS(resp, 99, 4);
-       e = UNSTUFF_BITS(resp, 96, 3);
-       csd->max_dtr      = tran_exp[e] * tran_mant[m];
-       csd->cmdclass     = UNSTUFF_BITS(resp, 84, 12);
+       resp[3] = card->raw_scr[1];
+       resp[2] = card->raw_scr[0];
  
-       e = UNSTUFF_BITS(resp, 47, 3);
-       m = UNSTUFF_BITS(resp, 62, 12);
-       csd->capacity     = (1 + m) << (e + 2);
+       scr_struct = UNSTUFF_BITS(resp, 60, 4);
+       if (scr_struct != 0) {
+               printk("%s: unrecognised SCR structure version %d\n",
+                       mmc_hostname(card->host), scr_struct);
+               mmc_card_set_bad(card);
+               return;
+       }
  
-       csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
+       scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4);
+       scr->bus_widths = UNSTUFF_BITS(resp, 48, 4);
  }
  
  /*
@@@ -484,14 -686,15 +686,15 @@@ static void mmc_power_up(struct mmc_hos
        int bit = fls(host->ocr_avail) - 1;
  
        host->ios.vdd = bit;
 +      host->ios.clock = host->f_min;
        host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
        host->ios.chip_select = MMC_CS_DONTCARE;
        host->ios.power_mode = MMC_POWER_UP;
+       host->ios.bus_width = MMC_BUS_WIDTH_1;
        host->ops->set_ios(host, &host->ios);
  
        mmc_delay(1);
  
 -      host->ios.clock = host->f_min;
        host->ios.power_mode = MMC_POWER_ON;
        host->ops->set_ios(host, &host->ios);
  
@@@ -505,6 -708,7 +708,7 @@@ static void mmc_power_off(struct mmc_ho
        host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
        host->ios.chip_select = MMC_CS_DONTCARE;
        host->ios.power_mode = MMC_POWER_OFF;
+       host->ios.bus_width = MMC_BUS_WIDTH_1;
        host->ops->set_ios(host, &host->ios);
  }
  
@@@ -524,7 -728,7 +728,7 @@@ static int mmc_send_op_cond(struct mmc_
  
                if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)
                        break;
 -
 +              mmc_delay(1);
                err = MMC_ERR_TIMEOUT;
  
                mmc_delay(10);
        return err;
  }
  
+ static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
+ {
+       struct mmc_command cmd;
+       int i, err = 0;
+       cmd.opcode = SD_APP_OP_COND;
+       cmd.arg = ocr;
+       cmd.flags = MMC_RSP_R3;
+       for (i = 100; i; i--) {
+               err = mmc_wait_for_app_cmd(host, 0, &cmd, CMD_RETRIES);
+               if (err != MMC_ERR_NONE)
+                       break;
+               if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)
+                       break;
+               err = MMC_ERR_TIMEOUT;
+               mmc_delay(10);
+       }
+       if (rocr)
+               *rocr = cmd.resp[0];
+       return err;
+ }
  /*
   * Discover cards by requesting their CID.  If this command
   * times out, it is not an error; there are no further cards
@@@ -579,13 -811,38 +811,38 @@@ static void mmc_discover_cards(struct m
  
                card->state &= ~MMC_STATE_DEAD;
  
-               cmd.opcode = MMC_SET_RELATIVE_ADDR;
-               cmd.arg = card->rca << 16;
-               cmd.flags = MMC_RSP_R1;
+               if (host->mode == MMC_MODE_SD) {
+                       mmc_card_set_sd(card);
  
-               err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
-               if (err != MMC_ERR_NONE)
-                       mmc_card_set_dead(card);
+                       cmd.opcode = SD_SEND_RELATIVE_ADDR;
+                       cmd.arg = 0;
+                       cmd.flags = MMC_RSP_R1;
+                       err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+                       if (err != MMC_ERR_NONE)
+                               mmc_card_set_dead(card);
+                       else {
+                               card->rca = cmd.resp[0] >> 16;
+                               if (!host->ops->get_ro) {
+                                       printk(KERN_WARNING "%s: host does not "
+                                               "support reading read-only "
+                                               "switch. assuming write-enable.\n",
+                                               mmc_hostname(host));
+                               } else {
+                                       if (host->ops->get_ro(host))
+                                               mmc_card_set_readonly(card);
+                               }
+                       }
+               } else {
+                       cmd.opcode = MMC_SET_RELATIVE_ADDR;
+                       cmd.arg = card->rca << 16;
+                       cmd.flags = MMC_RSP_R1;
+                       err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+                       if (err != MMC_ERR_NONE)
+                               mmc_card_set_dead(card);
+               }
        }
  }
  
@@@ -617,6 -874,79 +874,79 @@@ static void mmc_read_csds(struct mmc_ho
        }
  }
  
+ static void mmc_read_scrs(struct mmc_host *host)
+ {
+       int err;
+       struct mmc_card *card;
+       struct mmc_request mrq;
+       struct mmc_command cmd;
+       struct mmc_data data;
+       struct scatterlist sg;
+       list_for_each_entry(card, &host->cards, node) {
+               if (card->state & (MMC_STATE_DEAD|MMC_STATE_PRESENT))
+                       continue;
+               if (!mmc_card_sd(card))
+                       continue;
+               err = mmc_select_card(host, card);
+               if (err != MMC_ERR_NONE) {
+                       mmc_card_set_dead(card);
+                       continue;
+               }
+               memset(&cmd, 0, sizeof(struct mmc_command));
+               cmd.opcode = MMC_APP_CMD;
+               cmd.arg = card->rca << 16;
+               cmd.flags = MMC_RSP_R1;
+               err = mmc_wait_for_cmd(host, &cmd, 0);
+               if ((err != MMC_ERR_NONE) || !(cmd.resp[0] & R1_APP_CMD)) {
+                       mmc_card_set_dead(card);
+                       continue;
+               }
+               memset(&cmd, 0, sizeof(struct mmc_command));
+               cmd.opcode = SD_APP_SEND_SCR;
+               cmd.arg = 0;
+               cmd.flags = MMC_RSP_R1;
+               memset(&data, 0, sizeof(struct mmc_data));
+               data.timeout_ns = card->csd.tacc_ns * 10;
+               data.timeout_clks = card->csd.tacc_clks * 10;
+               data.blksz_bits = 3;
+               data.blocks = 1;
+               data.flags = MMC_DATA_READ;
+               data.sg = &sg;
+               data.sg_len = 1;
+               memset(&mrq, 0, sizeof(struct mmc_request));
+               mrq.cmd = &cmd;
+               mrq.data = &data;
+               sg_init_one(&sg, (u8*)card->raw_scr, 8);
+               err = mmc_wait_for_req(host, &mrq);
+               if (err != MMC_ERR_NONE) {
+                       mmc_card_set_dead(card);
+                       continue;
+               }
+               card->raw_scr[0] = ntohl(card->raw_scr[0]);
+               card->raw_scr[1] = ntohl(card->raw_scr[1]);
+               mmc_decode_scr(card);
+       }
+       mmc_deselect_cards(host);
+ }
  static unsigned int mmc_calculate_clock(struct mmc_host *host)
  {
        struct mmc_card *card;
@@@ -669,12 -999,24 +999,24 @@@ static void mmc_setup(struct mmc_host *
                int err;
                u32 ocr;
  
+               host->mode = MMC_MODE_SD;
                mmc_power_up(host);
                mmc_idle_cards(host);
  
-               err = mmc_send_op_cond(host, 0, &ocr);
-               if (err != MMC_ERR_NONE)
-                       return;
+               err = mmc_send_app_op_cond(host, 0, &ocr);
+               /*
+                * If we fail to detect any SD cards then try
+                * searching for MMC cards.
+                */
+               if (err != MMC_ERR_NONE) {
+                       host->mode = MMC_MODE_MMC;
+                       err = mmc_send_op_cond(host, 0, &ocr);
+                       if (err != MMC_ERR_NONE)
+                               return;
+               }
  
                host->ocr = mmc_select_voltage(host, ocr);
  
         * all get the idea that they should be ready for CMD2.
         * (My SanDisk card seems to need this.)
         */
-       mmc_send_op_cond(host, host->ocr, NULL);
+       if (host->mode == MMC_MODE_SD)
+               mmc_send_app_op_cond(host, host->ocr, NULL);
+       else
+               mmc_send_op_cond(host, host->ocr, NULL);
  
        mmc_discover_cards(host);
  
        host->ops->set_ios(host, &host->ios);
  
        mmc_read_csds(host);
+       if (host->mode == MMC_MODE_SD)
+               mmc_read_scrs(host);
  }
  
  
  /**
   *    mmc_detect_change - process change of state on a MMC socket
   *    @host: host which changed state.
+  *    @delay: optional delay to wait before detection (jiffies)
   *
   *    All we know is that card(s) have been inserted or removed
   *    from the socket(s).  We don't know which socket or cards.
   */
- void mmc_detect_change(struct mmc_host *host)
+ void mmc_detect_change(struct mmc_host *host, unsigned long delay)
  {
-       schedule_work(&host->detect);
+       if (delay)
+               schedule_delayed_work(&host->detect, delay);
+       else
+               schedule_work(&host->detect);
  }
  
  EXPORT_SYMBOL(mmc_detect_change);
@@@ -841,7 -1193,7 +1193,7 @@@ int mmc_add_host(struct mmc_host *host
        ret = mmc_add_host_sysfs(host);
        if (ret == 0) {
                mmc_power_off(host);
-               mmc_detect_change(host);
+               mmc_detect_change(host, 0);
        }
  
        return ret;
@@@ -911,7 -1263,7 +1263,7 @@@ EXPORT_SYMBOL(mmc_suspend_host)
   */
  int mmc_resume_host(struct mmc_host *host)
  {
-       mmc_detect_change(host);
+       mmc_detect_change(host, 0);
  
        return 0;
  }
diff --combined drivers/mmc/mmc_block.c
@@@ -31,7 -31,6 +31,7 @@@
  
  #include <linux/mmc/card.h>
  #include <linux/mmc/protocol.h>
 +#include <linux/mmc/host.h>
  
  #include <asm/system.h>
  #include <asm/uaccess.h>
@@@ -55,7 -54,6 +55,7 @@@ struct mmc_blk_data 
  
        unsigned int    usage;
        unsigned int    block_bits;
 +      unsigned int    suspended;
  };
  
  static DECLARE_MUTEX(open_lock);
@@@ -97,6 -95,10 +97,10 @@@ static int mmc_blk_open(struct inode *i
                if (md->usage == 2)
                        check_disk_change(inode->i_bdev);
                ret = 0;
+               if ((filp->f_mode & FMODE_WRITE) &&
+                       mmc_card_readonly(md->queue.card))
+                       ret = -EROFS;
        }
  
        return ret;
@@@ -160,19 -162,6 +164,19 @@@ static int mmc_blk_prep_rq(struct mmc_q
                stat = BLKPREP_KILL;
        }
  
 +      if (md->suspended) {
 +              blk_plug_device(md->queue.queue);
 +              stat = BLKPREP_DEFER;
 +      }
 +
 +      /*
 +       * Check for excessive requests.
 +       */
 +      if (req->sector + req->nr_sectors > get_capacity(req->rq_disk)) {
 +              printk("bad request size\n");
 +              stat = BLKPREP_KILL;
 +      }
 +
        return stat;
  }
  
@@@ -181,25 -170,9 +185,25 @@@ static int mmc_blk_issue_rq(struct mmc_
        struct mmc_blk_data *md = mq->data;
        struct mmc_card *card = md->queue.card;
        int ret;
 +      
 +#ifdef CONFIG_MMC_BULKTRANSFER
 +      int failsafe;
 +#endif
  
        if (mmc_card_claim_host(card))
                goto cmd_err;
 +      
 +#ifdef CONFIG_MMC_BULKTRANSFER
 +      /*
 +       * We first try transfering multiple blocks. If this fails
 +       * we fall back to single block transfers.
 +       *
 +       * This gives us good performance when all is well and the
 +       * possibility to determine which sector fails when all
 +       * is not well.
 +       */
 +      failsafe = 0;
 +#endif
  
        do {
                struct mmc_blk_request brq;
                brq.stop.arg = 0;
                brq.stop.flags = MMC_RSP_R1B;
  
 +#ifdef CONFIG_MMC_BULKTRANSFER                
 +              /*
 +               * A multi-block transfer failed. Falling back to single
 +               * blocks.
 +               */
 +              if (failsafe)
 +                      brq.data.blocks = 1;
 +              
 +#else
 +              /*
 +               * Writes are done one sector at a time.
 +               */
 +              if (rq_data_dir(req) != READ)
 +                      brq.data.blocks = 1;
 +#endif
 +              
 +              ret = 1;
 +
                if (rq_data_dir(req) == READ) {
                        brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
                        brq.data.flags |= MMC_DATA_READ;
                } else {
 -                      brq.cmd.opcode = MMC_WRITE_BLOCK;
 +                      brq.cmd.opcode = brq.data.blocks > 1 ? MMC_WRITE_MULTIPLE_BLOCK :
 +                              MMC_WRITE_BLOCK;
                        brq.cmd.flags = MMC_RSP_R1B;
                        brq.data.flags |= MMC_DATA_WRITE;
 -                      brq.data.blocks = 1;
                }
                brq.mrq.stop = brq.data.blocks > 1 ? &brq.stop : NULL;
  
                if (brq.cmd.error) {
                        printk(KERN_ERR "%s: error %d sending read/write command\n",
                               req->rq_disk->disk_name, brq.cmd.error);
 -                      goto cmd_err;
 +                      goto cmd_fail;
                }
  
                if (brq.data.error) {
                        printk(KERN_ERR "%s: error %d transferring data\n",
                               req->rq_disk->disk_name, brq.data.error);
 -                      goto cmd_err;
 +                      goto cmd_fail;
                }
  
                if (brq.stop.error) {
                        printk(KERN_ERR "%s: error %d sending stop command\n",
                               req->rq_disk->disk_name, brq.stop.error);
 -                      goto cmd_err;
 +                      goto cmd_fail;
                }
  
 +              /* No need to check card status after a read */
 +              if (rq_data_dir(req) == READ)
 +                      goto card_ready;
 +
                do {
                        int err;
  
                        if (err) {
                                printk(KERN_ERR "%s: error %d requesting status\n",
                                       req->rq_disk->disk_name, err);
 -                              goto cmd_err;
 +                              goto cmd_fail;
                        }
 +#ifdef CONFIG_MMC_BLOCK_BROKEN_RFD
 +                      /* Work-around for broken cards setting READY_FOR_DATA
 +                       * when not actually ready.
 +                       */
 +                      if (R1_CURRENT_STATE(cmd.resp[0]) == 7)
 +                              cmd.resp[0] &= ~R1_READY_FOR_DATA;
 +#endif
                } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
  
  #if 0
                        goto cmd_err;
  #endif
  
 +      card_ready:
 +
                /*
                 * A block was successfully transferred.
                 */
                        end_that_request_last(req);
                }
                spin_unlock_irq(&md->lock);
 +              
 +#ifdef CONFIG_MMC_BULKTRANSFER
 +              /*
 +               * Go back to bulk mode if in failsafe mode.
 +               */
 +              failsafe = 0;
 +#endif
 +
 +              continue;
 +
 + cmd_fail:
 +
 +#ifdef CONFIG_MMC_BULKTRANSFER
 +              if (failsafe)
 +                      goto cmd_err;
 +              else
 +                      failsafe = 1;
 +#else
 +              goto cmd_err;
 +#endif
 +
        } while (ret);
  
        mmc_card_release_host(card);
        end_that_request_last(req);
        spin_unlock_irq(&md->lock);
  
 +      /* If a command fails, the card might be removed. */
 +      mmc_detect_change(card->host);
 +
        return 0;
  }
  
@@@ -489,9 -407,10 +493,10 @@@ static int mmc_blk_probe(struct mmc_car
        if (err)
                goto out;
  
-       printk(KERN_INFO "%s: %s %s %dKiB\n",
+       printk(KERN_INFO "%s: %s %s %dKiB %s\n",
                md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
-               (card->csd.capacity << card->csd.read_blkbits) / 1024);
+               (card->csd.capacity << card->csd.read_blkbits) / 1024,
+               mmc_card_readonly(card)?"(ro)":"");
  
        mmc_set_drvdata(card, md);
        add_disk(md->disk);
diff --combined drivers/serial/8250.c
@@@ -864,7 -864,7 +864,7 @@@ static void autoconfig(struct uart_8250
        /*
         * We're pretty sure there's a port here.  Lets find out what
         * type of port it is.  The IIR top two bits allows us to find
-        * out if its 8250 or 16450, 16550, 16550A or later.  This
+        * out if it's 8250 or 16450, 16550, 16550A or later.  This
         * determines what we test for next.
         *
         * We also initialise the EFR (if any) to zero for later.  The
@@@ -1280,8 -1280,7 +1280,8 @@@ static irqreturn_t serial8250_interrupt
  
        DEBUG_INTR("end.\n");
  
 -      return IRQ_RETVAL(handled);
 +      //return IRQ_RETVAL(handled);
 +      return IRQ_HANDLED;     /* FIXME: iir status not ready on 1510 */
  }
  
  /*
@@@ -1796,17 -1795,6 +1796,17 @@@ serial8250_set_termios(struct uart_por
                serial_outp(up, UART_EFR, efr);
        }
  
 +#ifdef CONFIG_ARCH_OMAP1510
 +      /* Workaround to enable 115200 baud on OMAP1510 internal ports */
 +      if (cpu_is_omap1510() && is_omap_port((unsigned int)up->port.membase)) {
 +              if (baud == 115200) {
 +                      quot = 1;
 +                      serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
 +              } else
 +                      serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
 +        }
 +#endif
 +
        if (up->capabilities & UART_NATSEMI) {
                /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
                serial_outp(up, UART_LCR, 0xe0);
@@@ -1857,11 -1845,6 +1857,11 @@@ static int serial8250_request_std_resou
        unsigned int size = 8 << up->port.regshift;
        int ret = 0;
  
 +#ifdef CONFIG_ARCH_OMAP
 +      if (is_omap_port((unsigned int)up->port.membase))
 +              size = 0x16 << up->port.regshift;
 +#endif
 +
        switch (up->port.iotype) {
        case UPIO_MEM:
                if (!up->port.mapbase)
@@@ -2553,7 -2536,7 +2553,7 @@@ static int __init serial8250_init(void
                goto out;
  
        serial8250_isa_devs = platform_device_register_simple("serial8250",
-                                                             -1, NULL, 0);
+                                        PLAT8250_DEV_LEGACY, NULL, 0);
        if (IS_ERR(serial8250_isa_devs)) {
                ret = PTR_ERR(serial8250_isa_devs);
                goto unreg;
diff --combined drivers/video/Makefile
@@@ -9,7 -9,8 +9,8 @@@ obj-$(CONFIG_LOGO)                 += logo
  obj-$(CONFIG_SYSFS)             += backlight/
  
  obj-$(CONFIG_FB)                  += fb.o
- fb-y                              := fbmem.o fbmon.o fbcmap.o fbsysfs.o modedb.o
+ fb-y                              := fbmem.o fbmon.o fbcmap.o fbsysfs.o \
+                                      modedb.o fbcvt.o
  fb-objs                           := $(fb-y)
  
  obj-$(CONFIG_FB_CFB_FILLRECT)  += cfbfillrect.o
@@@ -50,7 -51,8 +51,8 @@@ obj-$(CONFIG_FB_CT65550)          += ch
  obj-$(CONFIG_FB_IMSTT)            += imsttfb.o
  obj-$(CONFIG_FB_S3TRIO)           += S3triofb.o
  obj-$(CONFIG_FB_FM2)              += fm2fb.o
- obj-$(CONFIG_FB_TRIDENT)        += tridentfb.o
+ obj-$(CONFIG_FB_CYBLA)            += cyblafb.o
+ obj-$(CONFIG_FB_TRIDENT)          += tridentfb.o
  obj-$(CONFIG_FB_STI)              += stifb.o
  obj-$(CONFIG_FB_FFB)              += ffb.o sbuslib.o
  obj-$(CONFIG_FB_CG6)              += cg6.o sbuslib.o
@@@ -92,12 -94,12 +94,13 @@@ obj-$(CONFIG_FB_MAXINE)              += maxinefb.
  obj-$(CONFIG_FB_TX3912)                 += tx3912fb.o
  obj-$(CONFIG_FB_S1D13XXX)       += s1d13xxxfb.o
  obj-$(CONFIG_FB_IMX)              += imxfb.o
+ obj-$(CONFIG_FB_S3C2410)        += s3c2410fb.o
  
  # Platform or fallback drivers go here
  obj-$(CONFIG_FB_VESA)             += vesafb.o
  obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
  obj-$(CONFIG_FB_OF)               += offb.o
 +obj-$(CONFIG_FB_OMAP)           += omap/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o
  
  # the test framebuffer is last
  obj-$(CONFIG_FB_VIRTUAL)          += vfb.o
diff --combined include/linux/input.h
@@@ -66,6 -66,7 +66,7 @@@ struct input_absinfo 
  #define EVIOCGKEY(len)                _IOC(_IOC_READ, 'E', 0x18, len)         /* get global keystate */
  #define EVIOCGLED(len)                _IOC(_IOC_READ, 'E', 0x19, len)         /* get all LEDs */
  #define EVIOCGSND(len)                _IOC(_IOC_READ, 'E', 0x1a, len)         /* get all sounds status */
+ #define EVIOCGSW(len)         _IOC(_IOC_READ, 'E', 0x1b, len)         /* get all switch states */
  
  #define EVIOCGBIT(ev,len)     _IOC(_IOC_READ, 'E', 0x20 + ev, len)    /* get event bits */
  #define EVIOCGABS(abs)                _IOR('E', 0x40 + abs, struct input_absinfo)             /* get abs value/limits */
@@@ -86,6 -87,7 +87,7 @@@
  #define EV_REL                        0x02
  #define EV_ABS                        0x03
  #define EV_MSC                        0x04
+ #define EV_SW                 0x05
  #define EV_LED                        0x11
  #define EV_SND                        0x12
  #define EV_REP                        0x14
  #define KEY_SCROLLDOWN                178
  #define KEY_KPLEFTPAREN               179
  #define KEY_KPRIGHTPAREN      180
+ #define KEY_NEW                       181
+ #define KEY_REDO              182
  
  #define KEY_F13                       183
  #define KEY_F14                       184
  #define KEY_BRIGHTNESSUP      225
  #define KEY_MEDIA             226
  
 -#define KEY_SWITCHVIDEOMODE   227
 -#define KEY_KBDILLUMTOGGLE    228
 -#define KEY_KBDILLUMDOWN      229
 -#define KEY_KBDILLUMUP                230
 +
 +/*Zeus: these keys are defined for OMAP730 Perseus2*/
 +#define KEY_STAR              227
 +#define KEY_SHARP             228
 +#define KEY_SOFT1             229
 +#define KEY_SOFT2             230
 +#define KEY_SEND              231
 +#define KEY_CENTER            232
 +#define KEY_HEADSETHOOK               233
 +#define KEY_0_5                       234
 +#define KEY_2_5                       235
 +
 +#define KEY_SWITCHVIDEOMODE   236
 +#define KEY_KBDILLUMTOGGLE    237
 +#define KEY_KBDILLUMDOWN      238
 +#define KEY_KBDILLUMUP                239
  
+ #define KEY_SEND              231
+ #define KEY_REPLY             232
+ #define KEY_FORWARDMAIL               233
+ #define KEY_SAVE              234
+ #define KEY_DOCUMENTS         235
  #define KEY_UNKNOWN           240
  
  #define BTN_MISC              0x100
  #define ABS_MISC              0x28
  #define ABS_MAX                       0x3f
  
+ /*
+  * Switch events
+  */
+ #define SW_0          0x00
+ #define SW_1          0x01
+ #define SW_2          0x02
+ #define SW_3          0x03
+ #define SW_4          0x04
+ #define SW_5          0x05
+ #define SW_6          0x06
+ #define SW_7          0x07
+ #define SW_MAX                0x0f
  /*
   * Misc events
   */
@@@ -836,6 -848,7 +860,7 @@@ struct input_dev 
        unsigned long ledbit[NBITS(LED_MAX)];
        unsigned long sndbit[NBITS(SND_MAX)];
        unsigned long ffbit[NBITS(FF_MAX)];
+       unsigned long swbit[NBITS(SW_MAX)];
        int ff_effects_max;
  
        unsigned int keycodemax;
        unsigned long key[NBITS(KEY_MAX)];
        unsigned long led[NBITS(LED_MAX)];
        unsigned long snd[NBITS(SND_MAX)];
+       unsigned long sw[NBITS(SW_MAX)];
  
        int absmax[ABS_MAX + 1];
        int absmin[ABS_MAX + 1];
  #define INPUT_DEVICE_ID_MATCH_LEDBIT  0x200
  #define INPUT_DEVICE_ID_MATCH_SNDBIT  0x400
  #define INPUT_DEVICE_ID_MATCH_FFBIT   0x800
+ #define INPUT_DEVICE_ID_MATCH_SWBIT   0x1000
  
  #define INPUT_DEVICE_ID_MATCH_DEVICE\
        (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT)
@@@ -918,6 -933,7 +945,7 @@@ struct input_device_id 
        unsigned long ledbit[NBITS(LED_MAX)];
        unsigned long sndbit[NBITS(SND_MAX)];
        unsigned long ffbit[NBITS(FF_MAX)];
+       unsigned long swbit[NBITS(SW_MAX)];
  
        unsigned long driver_info;
  };
@@@ -1010,6 -1026,11 +1038,11 @@@ static inline void input_report_ff_stat
        input_event(dev, EV_FF_STATUS, code, value);
  }
  
+ static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value)
+ {
+       input_event(dev, EV_SW, code, !!value);
+ }
  static inline void input_regs(struct input_dev *dev, struct pt_regs *regs)
  {
        dev->regs = regs;
diff --combined kernel/printk.c
  
  #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
  
 +#ifdef        CONFIG_DEBUG_LL
 +extern void printascii(char *);
 +#endif
 +
  /* printk's without a loglevel use this.. */
  #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
  
@@@ -518,6 -514,9 +518,9 @@@ asmlinkage int printk(const char *fmt, 
        return r;
  }
  
+ /* cpu currently holding logbuf_lock */
+ static volatile unsigned int printk_cpu = UINT_MAX;
  asmlinkage int vprintk(const char *fmt, va_list args)
  {
        unsigned long flags;
        static char printk_buf[1024];
        static int log_level_unknown = 1;
  
-       if (unlikely(oops_in_progress))
+       preempt_disable();
+       if (unlikely(oops_in_progress) && printk_cpu == smp_processor_id())
+               /* If a crash is occurring during printk() on this CPU,
+                * make sure we can't deadlock */
                zap_locks();
  
        /* This stops the holder of console_sem just where we want him */
        spin_lock_irqsave(&logbuf_lock, flags);
+       printk_cpu = smp_processor_id();
  
        /* Emit the output into the temporary buffer */
        printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);
  
 +#ifdef        CONFIG_DEBUG_LL
 +      printascii(printk_buf);
 +#endif
 +
        /*
         * Copy the output into log_buf.  If the caller didn't provide
         * appropriate log level tags, we insert them here
                 * CPU until it is officially up.  We shouldn't be calling into
                 * random console drivers on a CPU which doesn't exist yet..
                 */
+               printk_cpu = UINT_MAX;
                spin_unlock_irqrestore(&logbuf_lock, flags);
                goto out;
        }
                 * We own the drivers.  We can drop the spinlock and let
                 * release_console_sem() print the text
                 */
+               printk_cpu = UINT_MAX;
                spin_unlock_irqrestore(&logbuf_lock, flags);
                console_may_schedule = 0;
                release_console_sem();
                 * allows the semaphore holder to proceed and to call the
                 * console drivers with the output which we just produced.
                 */
+               printk_cpu = UINT_MAX;
                spin_unlock_irqrestore(&logbuf_lock, flags);
        }
  out:
+       preempt_enable();
        return printed_len;
  }
  EXPORT_SYMBOL(printk);