]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jun 2009 20:42:43 +0000 (13:42 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jun 2009 20:42:43 +0000 (13:42 -0700)
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (417 commits)
  MAINTAINERS: EB110ATX is not ebsa110
  MAINTAINERS: update Eric Miao's email address and status
  fb: add support of LCD display controller on pxa168/910 (base layer)
  [ARM] 5552/1: ep93xx get_uart_rate(): use EP93XX_SYSCON_PWRCNT and EP93XX_SYSCON_PWRCN
  [ARM] pxa/sharpsl_pm: zaurus needs generic pxa suspend/resume routines
  [ARM] 5544/1: Trust PrimeCell resource sizes
  [ARM] pxa/sharpsl_pm: cleanup of gpio-related code.
  [ARM] pxa/sharpsl_pm: drop set_irq_type calls
  [ARM] pxa/sharpsl_pm: merge pxa-specific code into generic one
  [ARM] pxa/sharpsl_pm: merge the two sharpsl_pm.c since it's now pxa specific
  [ARM] sa1100: remove unused collie_pm.c
  [ARM] pxa: fix the conflicting non-static declarations of global_gpios[]
  [ARM] 5550/1: Add default configure file for w90p910 platform
  [ARM] 5549/1: Add clock api for w90p910 platform.
  [ARM] 5548/1: Add gpio api for w90p910 platform
  [ARM] 5551/1: Add multi-function pin api for w90p910 platform.
  [ARM] Make ARM_VIC_NR depend on ARM_VIC
  [ARM] 5546/1: ARM PL022 SSP/SPI driver v3
  ARM: OMAP4: SMP: Update defconfig for OMAP4430
  ARM: OMAP4: SMP: Enable SMP support for OMAP4430
  ...

16 files changed:
1  2 
MAINTAINERS
arch/arm/mach-mx2/clock_imx21.c
arch/arm/mach-mx3/clock-imx35.c
arch/arm/mach-mx3/clock.c
arch/arm/mach-pxa/devices.c
arch/arm/mach-pxa/imote2.c
arch/arm/mm/proc-v7.S
arch/arm/plat-mxc/include/mach/imx-uart.h
drivers/char/hw_random/Kconfig
drivers/mmc/host/omap_hsmmc.c
drivers/serial/imx.c
drivers/spi/Kconfig
drivers/video/Kconfig
include/linux/amba/serial.h
sound/soc/pxa/Kconfig
sound/soc/s3c24xx/s3c2412-i2s.c

diff --combined MAINTAINERS
index 90f81283b722d13068ccb246d3c05ea043569c7a,aed47f2d11a72f7451ddf0167966b1ce12a2bc2f..0765bb6aa3cb649219e9edd4fca45604007dd650
@@@ -71,7 -71,7 +71,7 @@@ P: Perso
  M: Mail patches to
  L: Mailing list that is relevant to this area
  W: Web-page with status/info
 -T: SCM tree type and location.  Type is one of: git, hg, quilt.
 +T: SCM tree type and location.  Type is one of: git, hg, quilt, stgit.
  S: Status, one of the following:
  
        Supported:      Someone is actually paid to look after this.
@@@ -159,8 -159,7 +159,8 @@@ F: drivers/net/r8169.
  8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
  L:    linux-serial@vger.kernel.org
  W:    http://serial.sourceforge.net
 -S:    Orphan
 +M:    alan@lxorguk.ukuu.org.uk
 +S:    Odd Fixes
  F:    drivers/serial/8250*
  F:    include/linux/serial_8250.h
  
@@@ -681,6 -680,13 +681,13 @@@ M:       sakoman@gmail.co
  L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
  S:    Maintained
  
+ ARM/H4700 (HP IPAQ HX4700) MACHINE SUPPORT
+ P:    Philipp Zabel
+ M:    philipp.zabel@gmail.com
+ S:    Maintained
+ F:    arch/arm/mach-pxa/hx4700.c
+ F:    arch/arm/mach-pxa/include/mach/hx4700.h
  ARM/HP JORNADA 7XX MACHINE SUPPORT
  P:    Kristoffer Ericson
  M:    kristoffer.ericson@gmail.com
@@@ -1802,10 -1808,10 +1809,10 @@@ F:   drivers/char/epca
  F:    drivers/char/digi*
  
  DIRECTORY NOTIFICATION (DNOTIFY)
 -P:    Stephen Rothwell
 -M:    sfr@canb.auug.org.au
 +P:    Eric Paris
 +M:    eparis@parisplace.org
  L:    linux-kernel@vger.kernel.org
 -S:    Supported
 +S:    Maintained
  F:    Documentation/filesystems/dnotify.txt
  F:    fs/notify/dnotify/
  F:    include/linux/dnotify.h
@@@ -1979,16 -1985,6 +1986,16 @@@ F:    Documentation/edac.tx
  F:    drivers/edac/edac_*
  F:    include/linux/edac.h
  
 +EDAC-AMD64
 +P:    Doug Thompson
 +M:    dougthompson@xmission.com
 +P:    Borislav Petkov
 +M:    borislav.petkov@amd.com
 +L:    bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
 +W:    bluesmoke.sourceforge.net
 +S:    Supported
 +F:    drivers/edac/amd64_edac*
 +
  EDAC-E752X
  P:    Mark Gross
  M:    mark.gross@intel.com
@@@ -2858,8 -2854,6 +2865,8 @@@ P:      John McCutcha
  M:    john@johnmccutchan.com
  P:    Robert Love
  M:    rlove@rlove.org
 +P:    Eric Paris
 +M:    eparis@parisplace.org
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/filesystems/inotify.txt
@@@ -3363,16 -3357,6 +3370,16 @@@ F:    drivers/serial/kgdboc.
  F:    include/linux/kgdb.h
  F:    kernel/kgdb.c
  
 +KMEMLEAK
 +P:    Catalin Marinas
 +M:    catalin.marinas@arm.com
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/kmemleak.txt
 +F:    include/linux/kmemleak.h
 +F:    mm/kmemleak.c
 +F:    mm/kmemleak-test.c
 +
  KMEMTRACE
  P:    Eduard - Gabriel Munteanu
  M:    eduard.munteanu@linux360.ro
@@@ -4159,6 -4143,69 +4166,69 @@@ S:    Maintaine
  F:    drivers/video/riva/
  F:    drivers/video/nvidia/
  
+ OMAP SUPPORT
+ P:    Tony Lindgren <tony@atomide.com>
+ M:    tony@atomide.com
+ L:    linux-omap@vger.kernel.org
+ W:    http://www.muru.com/linux/omap/
+ W:    http://linux.omap.com/
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git
+ S:    Maintained
+ F:    arch/arm/*omap*
+ OMAP CLOCK FRAMEWORK SUPPORT
+ P:    Paul Walmsley
+ M:    paul@pwsan.com
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    arch/arm/*omap*/*clock*
+ OMAP POWER MANAGEMENT SUPPORT
+ P:    Kevin Hilman
+ M:    khilman@deeprootsystems.com
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    arch/arm/*omap*/*pm*
+ OMAP AUDIO SUPPORT
+ P:    Jarkko Nikula
+ M:    jhnikula@gmail.com
+ L:    alsa-devel@alsa-project.org (subscribers-only)
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    sound/soc/omap/
+ OMAP FRAMEBUFFER SUPPORT
+ P:    Imre Deak
+ M:    imre.deak@nokia.com
+ L:    linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    drivers/video/omap/
+ OMAP MMC SUPPORT
+ P:    Jarkko Lavinen
+ M:    jarkko.lavinen@nokia.com
+ L:    linux-kernel@vger.kernel.org
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    drivers/mmc/host/*omap*
+ OMAP RANDOM NUMBER GENERATOR SUPPORT
+ P:    Deepak Saxena
+ M:    dsaxena@plexity.net
+ S:    Maintained
+ F:    drivers/char/hw_random/omap-rng.c
+ OMAP USB SUPPORT
+ P:    Felipe Balbi
+ M:    felipe.balbi@nokia.com
+ P:    David Brownell
+ M:    dbrownell@users.sourceforge.net
+ L:    linux-usb@vger.kernel.org
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
  OMFS FILESYSTEM
  P:    Bob Copeland
  M:    me@bobcopeland.com
@@@ -4415,16 -4462,6 +4485,16 @@@ S:    Maintaine
  F:    include/linux/delayacct.h
  F:    kernel/delayacct.c
  
 +PERFORMANCE COUNTER SUBSYSTEM
 +P:    Peter Zijlstra
 +M:    a.p.zijlstra@chello.nl
 +P:    Paul Mackerras
 +M:    paulus@samba.org
 +P:    Ingo Molnar
 +M:    mingo@elte.hu
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +
  PERSONALITY HANDLING
  P:    Christoph Hellwig
  M:    hch@infradead.org
@@@ -4597,7 -4634,7 +4667,7 @@@ F:      drivers/media/video/pvrusb2
  
  PXA2xx/PXA3xx SUPPORT
  P:    Eric Miao
- M:    eric.miao@marvell.com
+ M:    eric.y.miao@gmail.com
  P:    Russell King
  M:    linux@arm.linux.org.uk
  L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
@@@ -4607,24 -4644,23 +4677,24 @@@ F:   drivers/pcmcia/pxa2xx
  F:    drivers/spi/pxa2xx*
  F:    drivers/usb/gadget/pxa2*
  F:    include/sound/pxa2xx-lib.h
 -F:    sound/soc/pxa/pxa2xx*
 +F:    sound/arm/pxa*
 +F:    sound/soc/pxa
  
  PXA168 SUPPORT
  P:    Eric Miao
- M:    eric.miao@marvell.com
+ M:    eric.y.miao@gmail.com
  P:    Jason Chagas
  M:    jason.chagas@marvell.com
  L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
- S:    Supported
+ S:    Maintained
  
  PXA910 SUPPORT
  P:    Eric Miao
- M:    eric.miao@marvell.com
+ M:    eric.y.miao@gmail.com
  L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
- S:    Supported
+ S:    Maintained
  
  PXA MMCI DRIVER
  S:    Orphan
@@@ -5145,7 -5181,6 +5215,6 @@@ P:      Vincent Sander
  M:    support@simtec.co.uk
  W:    http://www.simtec.co.uk/products/EB110ATX/
  S:    Supported
- F:    arch/arm/mach-ebsa110/
  
  SIMTEC EB2410ITX (BAST)
  P:    Ben Dooks
@@@ -5336,12 -5371,11 +5405,12 @@@ P:   Liam Girdwoo
  M:    lrg@slimlogic.co.uk
  P:    Mark Brown
  M:    broonie@opensource.wolfsonmicro.com
 -T:    git git://opensource.wolfsonmicro.com/linux-2.6-asoc
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git
  L:    alsa-devel@alsa-project.org (subscribers-only)
  W:    http://alsa-project.org/main/index.php/ASoC
  S:    Supported
  F:    sound/soc/
 +F:    include/sound/soc*
  
  SPARC + UltraSPARC (sparc/sparc64)
  P:    David S. Miller
@@@ -5559,20 -5593,6 +5628,6 @@@ F:     drivers/misc/tifm
  F:    drivers/mmc/host/tifm_sd.c
  F:    include/linux/tifm.h
  
- TI OMAP MMC INTERFACE DRIVER
- P:    Carlos Aguiar, Anderson Briglia and Syed Khasim
- M:    linux-omap@vger.kernel.org
- W:    http://linux.omap.com
- W:    http://www.muru.com/linux/omap/
- S:    Maintained
- F:    drivers/mmc/host/omap.c
- TI OMAP RANDOM NUMBER GENERATOR SUPPORT
- P:    Deepak Saxena
- M:    dsaxena@plexity.net
- S:    Maintained
- F:    drivers/char/hw_random/omap-rng.c
  TIPC NETWORK LAYER
  P:    Per Liden
  M:    per.liden@ericsson.com
@@@ -5664,7 -5684,6 +5719,7 @@@ P:      Alan Co
  M:    alan@lxorguk.ukuu.org.uk
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
 +T:    stgit http://zeniv.linux.org.uk/~alan/ttydev/
  
  TULIP NETWORK DRIVERS
  P:    Grant Grundler
index e4b08ca804eaeded273ff239227e498d753528d8,fa2b292d7b3cec25fdea3b61fee30ee363c98364..0850fb88ec15f4dc9e41d3c4bd6e04e6a66e58ab
@@@ -48,6 -48,25 +48,25 @@@ static void _clk_disable(struct clk *cl
        __raw_writel(reg, clk->enable_reg);
  }
  
+ static unsigned long _clk_generic_round_rate(struct clk *clk,
+                       unsigned long rate,
+                       u32 max_divisor)
+ {
+       u32 div;
+       unsigned long parent_rate;
+       parent_rate = clk_get_rate(clk->parent);
+       div = parent_rate / rate;
+       if (parent_rate % rate)
+               div++;
+       if (div > max_divisor)
+               div = max_divisor;
+       return parent_rate / div;
+ }
  static int _clk_spll_enable(struct clk *clk)
  {
        u32 reg;
@@@ -78,19 -97,7 +97,7 @@@ static void _clk_spll_disable(struct cl
  static unsigned long _clk_perclkx_round_rate(struct clk *clk,
                                             unsigned long rate)
  {
-       u32 div;
-       unsigned long parent_rate;
-       parent_rate = clk_get_rate(clk->parent);
-       div = parent_rate / rate;
-       if (parent_rate % rate)
-               div++;
-       if (div > 64)
-               div = 64;
-       return parent_rate / div;
+       return _clk_generic_round_rate(clk, rate, 64);
  }
  
  static int _clk_perclkx_set_rate(struct clk *clk, unsigned long rate)
@@@ -130,6 -137,32 +137,32 @@@ static unsigned long _clk_usb_recalc(st
        return parent_rate / (usb_pdf + 1U);
  }
  
+ static unsigned long _clk_usb_round_rate(struct clk *clk,
+                                            unsigned long rate)
+ {
+       return _clk_generic_round_rate(clk, rate, 8);
+ }
+ static int _clk_usb_set_rate(struct clk *clk, unsigned long rate)
+ {
+       u32 reg;
+       u32 div;
+       unsigned long parent_rate;
+       parent_rate = clk_get_rate(clk->parent);
+       div = parent_rate / rate;
+       if (div > 8 || div < 1 || ((parent_rate / div) != rate))
+               return -EINVAL;
+       div--;
+       reg = CSCR() & ~CCM_CSCR_USB_MASK;
+       reg |= div << CCM_CSCR_USB_OFFSET;
+       __raw_writel(reg, CCM_CSCR);
+       return 0;
+ }
  static unsigned long _clk_ssix_recalc(struct clk *clk, unsigned long pdf)
  {
        unsigned long parent_rate;
@@@ -595,11 -628,14 +628,14 @@@ static struct clk csi_clk[] = 
  static struct clk usb_clk[] = {
        {
                .parent = &spll_clk,
+               .secondary = &usb_clk[1],
                .get_rate = _clk_usb_recalc,
                .enable = _clk_enable,
                .enable_reg = CCM_PCCR_USBOTG_REG,
                .enable_shift = CCM_PCCR_USBOTG_OFFSET,
                .disable = _clk_disable,
+               .round_rate = _clk_usb_round_rate,
+               .set_rate = _clk_usb_set_rate,
        }, {
                .parent = &hclk_clk,
                .enable = _clk_enable,
@@@ -768,18 -804,7 +804,7 @@@ static struct clk rtc_clk = 
  
  static unsigned long _clk_clko_round_rate(struct clk *clk, unsigned long rate)
  {
-       u32 div;
-       unsigned long parent_rate;
-       parent_rate = clk_get_rate(clk->parent);
-       div = parent_rate / rate;
-       if (parent_rate % rate)
-               div++;
-       if (div > 8)
-               div = 8;
-       return parent_rate / div;
+       return _clk_generic_round_rate(clk, rate, 8);
  }
  
  static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
@@@ -890,7 -915,7 +915,7 @@@ static struct clk clko_clk = 
                .con_id = n, \
                .clk = &c, \
        },
 -static struct clk_lookup lookups[] __initdata = {
 +static struct clk_lookup lookups[] = {
  /* It's unlikely that any driver wants one of them directly:
        _REGISTER_CLOCK(NULL, "ckih", ckih_clk)
        _REGISTER_CLOCK(NULL, "ckil", ckil_clk)
        _REGISTER_CLOCK(NULL, "cspi3", cspi_clk[2])
        _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk[0])
        _REGISTER_CLOCK(NULL, "csi", csi_clk[0])
-       _REGISTER_CLOCK(NULL, "usb", usb_clk[0])
+       _REGISTER_CLOCK("imx21-hcd.0", NULL, usb_clk[0])
        _REGISTER_CLOCK(NULL, "ssi1", ssi_clk[0])
        _REGISTER_CLOCK(NULL, "ssi2", ssi_clk[1])
        _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk)
index 3c1e06f56dd6ca60764d3f9ec349f1e1e926c8f3,0d76521cb491c6bea2b79f49a8c5af682962b392..577ee83d1f605eb748ea2921032b5901942f8529
@@@ -147,34 -147,16 +147,16 @@@ static struct arm_ahb_div clk_consumer[
        { .arm = 0, .ahb = 0, .sel = 0},
  };
  
- static struct arm_ahb_div clk_automotive[] = {
-       { .arm = 1, .ahb = 3, .sel = 0},
-       { .arm = 1, .ahb = 2, .sel = 1},
-       { .arm = 2, .ahb = 1, .sel = 1},
-       { .arm = 0, .ahb = 0, .sel = 0},
-       { .arm = 1, .ahb = 6, .sel = 0},
-       { .arm = 1, .ahb = 4, .sel = 1},
-       { .arm = 2, .ahb = 2, .sel = 1},
-       { .arm = 0, .ahb = 0, .sel = 0},
- };
  static unsigned long get_rate_arm(void)
  {
        unsigned long pdr0 = __raw_readl(CCM_BASE + CCM_PDR0);
        struct arm_ahb_div *aad;
        unsigned long fref = get_rate_mpll();
  
-       if (pdr0 & 1) {
-               /* consumer path */
-               aad = &clk_consumer[(pdr0 >> 16) & 0xf];
-               if (aad->sel)
-                       fref = fref * 2 / 3;
-       } else {
-               /* auto path */
-               aad = &clk_automotive[(pdr0 >> 9) & 0x7];
-               if (aad->sel)
-                       fref = fref * 3 / 4;
-       }
+       aad = &clk_consumer[(pdr0 >> 16) & 0xf];
+       if (aad->sel)
+               fref = fref * 2 / 3;
        return fref / aad->arm;
  }
  
@@@ -184,12 -166,7 +166,7 @@@ static unsigned long get_rate_ahb(struc
        struct arm_ahb_div *aad;
        unsigned long fref = get_rate_mpll();
  
-       if (pdr0 & 1)
-               /* consumer path */
-               aad = &clk_consumer[(pdr0 >> 16) & 0xf];
-       else
-               /* auto path */
-               aad = &clk_automotive[(pdr0 >> 9) & 0x7];
+       aad = &clk_consumer[(pdr0 >> 16) & 0xf];
  
        return fref / aad->ahb;
  }
@@@ -404,7 -381,7 +381,7 @@@ DEFINE_CLOCK(gpu2d_clk,  0, CCM_CGR3,  
                .clk = &c,              \
        },
  
 -static struct clk_lookup lookups[] __initdata = {
 +static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK(NULL, "asrc", asrc_clk)
        _REGISTER_CLOCK(NULL, "ata", ata_clk)
        _REGISTER_CLOCK(NULL, "audmux", audmux_clk)
        _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
        _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_clk)
        _REGISTER_CLOCK(NULL, "iomuxc", iomuxc_clk)
-       _REGISTER_CLOCK(NULL, "ipu", ipu_clk)
+       _REGISTER_CLOCK("ipu-core", NULL, ipu_clk)
+       _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk)
        _REGISTER_CLOCK(NULL, "kpp", kpp_clk)
        _REGISTER_CLOCK(NULL, "mlb", mlb_clk)
        _REGISTER_CLOCK(NULL, "mshc", mshc_clk)
@@@ -462,8 -440,6 +440,6 @@@ int __init mx35_clocks_init(
        int i;
        unsigned int ll = 0;
  
-       mxc_set_cpu_type(MXC_CPU_MX35);
  #ifdef CONFIG_DEBUG_LL_CONSOLE
        ll = (3 << 16);
  #endif
index a68fcf981edf124678efa99695cf7efe6cd2cbc4,217d114b177a87a90b91708e8c6687e91af7c060..8b14239724c97fe90746878f6c3727f62bdf7066
@@@ -483,7 -483,7 +483,7 @@@ DEFINE_CLOCK(i2c3_clk,    2, MXC_CCM_CG
  DEFINE_CLOCK(mpeg4_clk,   0, MXC_CCM_CGR1,  0, NULL, NULL, &ahb_clk);
  DEFINE_CLOCK(mstick1_clk, 0, MXC_CCM_CGR1,  2, mstick1_get_rate, NULL, &usb_pll_clk);
  DEFINE_CLOCK(mstick2_clk, 1, MXC_CCM_CGR1,  4, mstick2_get_rate, NULL, &usb_pll_clk);
- DEFINE_CLOCK1(csi_clk,    0, MXC_CCM_CGR1,  6, csi, NULL, &ahb_clk);
+ DEFINE_CLOCK1(csi_clk,    0, MXC_CCM_CGR1,  6, csi, NULL, &serial_pll_clk);
  DEFINE_CLOCK(rtc_clk,     0, MXC_CCM_CGR1,  8, NULL, NULL, &ipg_clk);
  DEFINE_CLOCK(wdog_clk,    0, MXC_CCM_CGR1, 10, NULL, NULL, &ipg_clk);
  DEFINE_CLOCK(pwm_clk,     0, MXC_CCM_CGR1, 12, NULL, NULL, &perclk_clk);
@@@ -516,7 -516,7 +516,7 @@@ DEFINE_CLOCK(ipg_clk,     0, NULL
                .clk = &c, \
        },
  
 -static struct clk_lookup lookups[] __initdata = {
 +static struct clk_lookup lookups[] = {
        _REGISTER_CLOCK(NULL, "emi", emi_clk)
        _REGISTER_CLOCK(NULL, "cspi", cspi1_clk)
        _REGISTER_CLOCK(NULL, "cspi", cspi2_clk)
@@@ -566,13 -566,18 +566,18 @@@ int __init mx31_clocks_init(unsigned lo
        u32 reg;
        int i;
  
-       mxc_set_cpu_type(MXC_CPU_MX31);
        ckih_rate = fref;
  
        for (i = 0; i < ARRAY_SIZE(lookups); i++)
                clkdev_add(&lookups[i]);
  
+       /* change the csi_clk parent if necessary */
+       reg = __raw_readl(MXC_CCM_CCMR);
+       if (!(reg & MXC_CCM_CCMR_CSCS))
+               if (clk_set_parent(&csi_clk, &usb_pll_clk))
+                       pr_err("%s: error changing csi_clk parent\n", __func__);
        /* Turn off all possible clocks */
        __raw_writel((3 << 4), MXC_CCM_CGR0);
        __raw_writel(0, MXC_CCM_CGR1);
                                           MX32, but still required to be set */
                     MXC_CCM_CGR2);
  
+       /*
+        * Before turning off usb_pll make sure ipg_per_clk is generated
+        * by ipg_clk and not usb_pll.
+        */
+       __raw_writel(__raw_readl(MXC_CCM_CCMR) | (1 << 24), MXC_CCM_CCMR);
        usb_pll_disable(&usb_pll_clk);
  
        pr_info("Clock input source is %ld\n", clk_get_rate(&ckih_clk));
index 29970f703f3cc6d33ddc19635f1b56a6df3d9777,d3c3b7b025ae72fcf7826a365bd3e720a0602f6f..ecc08f360b68a28df3da71c1d98040a9a760b511
@@@ -8,7 -8,7 +8,7 @@@
  #include <mach/pxafb.h>
  #include <mach/mmc.h>
  #include <mach/irda.h>
- #include <mach/i2c.h>
+ #include <plat/i2c.h>
  #include <mach/ohci.h>
  #include <mach/pxa27x_keypad.h>
  #include <mach/pxa2xx_spi.h>
@@@ -72,10 -72,7 +72,10 @@@ void __init pxa_set_mci_info(struct pxa
  }
  
  
 -static struct pxa2xx_udc_mach_info pxa_udc_info;
 +static struct pxa2xx_udc_mach_info pxa_udc_info = {
 +      .gpio_pullup = -1,
 +      .gpio_vbus   = -1,
 +};
  
  void __init pxa_set_udc_info(struct pxa2xx_udc_mach_info *info)
  {
@@@ -290,7 -287,7 +290,7 @@@ static struct resource pxa3xx_resources
  };
  
  struct platform_device pxa3xx_device_i2c_power = {
-       .name           = "pxa2xx-i2c",
+       .name           = "pxa3xx-pwri2c",
        .id             = 1,
        .resource       = pxa3xx_resources_i2c_power,
        .num_resources  = ARRAY_SIZE(pxa3xx_resources_i2c_power),
index 2b27336c29f1b6ec517a63fd0881f8e964ff507d,be7be72dace10c1aa97b9329e97decf612f8b0ac..961807dc64670781eec4b282ff1fe6b18aea2b22
@@@ -22,6 -22,7 +22,7 @@@
  #include <linux/spi/spi.h>
  #include <linux/i2c.h>
  #include <linux/mfd/da903x.h>
+ #include <linux/sht15.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
@@@ -29,7 -30,7 +30,7 @@@
  #include <asm/mach/flash.h>
  
  #include <mach/pxa27x.h>
- #include <mach/i2c.h>
+ #include <plat/i2c.h>
  #include <mach/udc.h>
  #include <mach/mmc.h>
  #include <mach/pxa2xx_spi.h>
@@@ -102,6 -103,10 +103,10 @@@ static unsigned long imote2_pin_config[
        GPIO96_GPIO,    /* accelerometer interrupt */
        GPIO99_GPIO,    /* ADC interrupt */
  
+       /* SHT15 */
+       GPIO100_GPIO,
+       GPIO98_GPIO,
        /* Connector pins specified as gpios */
        GPIO94_GPIO, /* large basic connector pin 14 */
        GPIO10_GPIO, /* large basic connector pin 23 */
        GPIO105_GPIO, /* blue led */
  };
  
+ static struct sht15_platform_data platform_data_sht15 = {
+       .gpio_data =  100,
+       .gpio_sck  =  98,
+ };
+ static struct platform_device sht15 = {
+       .name = "sht15",
+       .id = -1,
+       .dev = {
+               .platform_data = &platform_data_sht15,
+       },
+ };
+ static struct regulator_consumer_supply imote2_sensor_3_con[] = {
+       {
+               .dev = &sht15.dev,
+               .supply = "vcc",
+       },
+ };
  static struct gpio_led imote2_led_pins[] = {
        {
                .name       =  "imote2:red",
@@@ -257,6 -282,8 +282,8 @@@ static struct regulator_init_data imote
                        .min_uV = 2800000,
                        .max_uV = 3000000,
                },
+               .num_consumer_supplies = ARRAY_SIZE(imote2_sensor_3_con),
+               .consumer_supplies = imote2_sensor_3_con,
        },
        [vcc_pxa_pll] = { /* 1.17V - 1.43V, default 1.3V*/
                .constraints = {
@@@ -412,7 -439,7 +439,7 @@@ static struct platform_device imote2_fl
   */
  static struct i2c_board_info __initdata imote2_i2c_board_info[] = {
        { /* UCAM sensor board */
 -              .type = "max1238",
 +              .type = "max1239",
                .addr = 0x35,
        }, { /* ITS400 Sensor board only */
                .type = "max1363",
                .type = "tmp175",
                .addr = 0x4A,
                .irq = IRQ_GPIO(96),
+       }, { /* IMB400 Multimedia board */
+               .type = "wm8940",
+               .addr = 0x1A,
        },
  };
  
@@@ -456,25 -486,12 +486,12 @@@ static struct pxa2xx_spi_master pxa_ssp
        .num_chipselect = 1,
  };
  
- /* Patch posted by Eric Miao <eric.miao@marvell.com> will remove
-  * the need for these functions.
-  */
- static void spi1control(u32 command)
- {
-       gpio_set_value(24, command & PXA2XX_CS_ASSERT ? 0 : 1);
- };
- static void spi3control(u32 command)
- {
-       gpio_set_value(39, command & PXA2XX_CS_ASSERT ? 0 : 1);
- };
  static struct pxa2xx_spi_chip staccel_chip_info = {
        .tx_threshold = 8,
        .rx_threshold = 8,
        .dma_burst_size = 8,
        .timeout = 235,
-       .cs_control = spi1control,
+       .gpio_cs = 24,
  };
  
  static struct pxa2xx_spi_chip cc2420_info = {
        .rx_threshold = 8,
        .dma_burst_size = 8,
        .timeout = 235,
-       .cs_control = spi3control,
+       .gpio_cs = 39,
  };
  
  static struct spi_board_info spi_board_info[] __initdata = {
@@@ -521,6 -538,7 +538,7 @@@ static struct pxa2xx_udc_mach_info imot
  static struct platform_device *imote2_devices[] = {
        &imote2_flash_device,
        &imote2_leds,
+       &sht15,
  };
  
  static struct i2c_pxa_platform_data i2c_pwr_pdata = {
@@@ -538,8 -556,6 +556,6 @@@ static void __init imote2_init(void
        /* SPI chip select directions - all other directions should
         * be handled by drivers.*/
        gpio_direction_output(37, 0);
-       gpio_direction_output(24, 0);
-       gpio_direction_output(39, 0);
  
        platform_add_devices(imote2_devices, ARRAY_SIZE(imote2_devices));
  
diff --combined arch/arm/mm/proc-v7.S
index a08d9d2380d3e357dedbf743111e0eac45721b09,4f8486475a7937d57bca29ff5bbbbfe327301b0c..180a08d03a03b60a46433017782c4586286fd735
  
  #include "proc-macros.S"
  
- #define TTB_C         (1 << 0)
  #define TTB_S         (1 << 1)
  #define TTB_RGN_NC    (0 << 3)
  #define TTB_RGN_OC_WBWA       (1 << 3)
  #define TTB_RGN_OC_WT (2 << 3)
  #define TTB_RGN_OC_WB (3 << 3)
+ #define TTB_NOS               (1 << 5)
+ #define TTB_IRGN_NC   ((0 << 0) | (0 << 6))
+ #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6))
+ #define TTB_IRGN_WT   ((1 << 0) | (0 << 6))
+ #define TTB_IRGN_WB   ((1 << 0) | (1 << 6))
  
  #ifndef CONFIG_SMP
- #define TTB_FLAGS     TTB_C|TTB_RGN_OC_WB             @ mark PTWs cacheable, outer WB
+ /* PTWs cacheable, inner WB not shareable, outer WB not shareable */
+ #define TTB_FLAGS     TTB_IRGN_WB|TTB_RGN_OC_WB
  #else
- #define TTB_FLAGS     TTB_C|TTB_S|TTB_RGN_OC_WBWA     @ mark PTWs cacheable and shared, outer WBWA
+ /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */
+ #define TTB_FLAGS     TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA
  #endif
  
  ENTRY(cpu_v7_proc_init)
@@@ -176,45 -182,31 +182,45 @@@ cpu_v7_name
   */
  __v7_setup:
  #ifdef CONFIG_SMP
-       mrc     p15, 0, r0, c1, c0, 1           @ Enable SMP/nAMP mode
-       orr     r0, r0, #(0x1 << 6)
+       mrc     p15, 0, r0, c1, c0, 1           @ Enable SMP/nAMP mode and
+       orr     r0, r0, #(1 << 6) | (1 << 0)    @ TLB ops broadcasting
        mcr     p15, 0, r0, c1, c0, 1
  #endif
        adr     r12, __v7_setup_stack           @ the local stack
        stmia   r12, {r0-r5, r7, r9, r11, lr}
        bl      v7_flush_dcache_all
        ldmia   r12, {r0-r5, r7, r9, r11, lr}
 +
 +      mrc     p15, 0, r0, c0, c0, 0           @ read main ID register
 +      and     r10, r0, #0xff000000            @ ARM?
 +      teq     r10, #0x41000000
 +      bne     2f
 +      and     r5, r0, #0x00f00000             @ variant
 +      and     r6, r0, #0x0000000f             @ revision
 +      orr     r0, r6, r5, lsr #20-4           @ combine variant and revision
 +
  #ifdef CONFIG_ARM_ERRATA_430973
 -      mrc     p15, 0, r10, c1, c0, 1          @ read aux control register
 -      orr     r10, r10, #(1 << 6)             @ set IBE to 1
 -      mcr     p15, 0, r10, c1, c0, 1          @ write aux control register
 +      teq     r5, #0x00100000                 @ only present in r1p*
 +      mrceq   p15, 0, r10, c1, c0, 1          @ read aux control register
 +      orreq   r10, r10, #(1 << 6)             @ set IBE to 1
 +      mcreq   p15, 0, r10, c1, c0, 1          @ write aux control register
  #endif
  #ifdef CONFIG_ARM_ERRATA_458693
 -      mrc     p15, 0, r10, c1, c0, 1          @ read aux control register
 -      orr     r10, r10, #(1 << 5)             @ set L1NEON to 1
 -      orr     r10, r10, #(1 << 9)             @ set PLDNOP to 1
 -      mcr     p15, 0, r10, c1, c0, 1          @ write aux control register
 +      teq     r0, #0x20                       @ only present in r2p0
 +      mrceq   p15, 0, r10, c1, c0, 1          @ read aux control register
 +      orreq   r10, r10, #(1 << 5)             @ set L1NEON to 1
 +      orreq   r10, r10, #(1 << 9)             @ set PLDNOP to 1
 +      mcreq   p15, 0, r10, c1, c0, 1          @ write aux control register
  #endif
  #ifdef CONFIG_ARM_ERRATA_460075
 -      mrc     p15, 1, r10, c9, c0, 2          @ read L2 cache aux ctrl register
 -      orr     r10, r10, #(1 << 22)            @ set the Write Allocate disable bit
 -      mcr     p15, 1, r10, c9, c0, 2          @ write the L2 cache aux ctrl register
 +      teq     r0, #0x20                       @ only present in r2p0
 +      mrceq   p15, 1, r10, c9, c0, 2          @ read L2 cache aux ctrl register
 +      tsteq   r10, #1 << 22
 +      orreq   r10, r10, #(1 << 22)            @ set the Write Allocate disable bit
 +      mcreq   p15, 1, r10, c9, c0, 2          @ write the L2 cache aux ctrl register
  #endif
 -      mov     r10, #0
 +
 +2:    mov     r10, #0
  #ifdef HARVARD_CACHE
        mcr     p15, 0, r10, c7, c5, 0          @ I+BTB cache invalidate
  #endif
        mov     r10, #0x1f                      @ domains 0, 1 = manager
        mcr     p15, 0, r10, c3, c0, 0          @ load domain access register
  #endif
-       ldr     r5, =0xff0aa1a8
-       ldr     r6, =0x40e040e0
+       /*
+        * Memory region attributes with SCTLR.TRE=1
+        *
+        *   n = TEX[0],C,B
+        *   TR = PRRR[2n+1:2n]         - memory type
+        *   IR = NMRR[2n+1:2n]         - inner cacheable property
+        *   OR = NMRR[2n+17:2n+16]     - outer cacheable property
+        *
+        *                      n       TR      IR      OR
+        *   UNCACHED           000     00
+        *   BUFFERABLE         001     10      00      00
+        *   WRITETHROUGH       010     10      10      10
+        *   WRITEBACK          011     10      11      11
+        *   reserved           110
+        *   WRITEALLOC         111     10      01      01
+        *   DEV_SHARED         100     01
+        *   DEV_NONSHARED      100     01
+        *   DEV_WC             001     10
+        *   DEV_CACHED         011     10
+        *
+        * Other attributes:
+        *
+        *   DS0 = PRRR[16] = 0         - device shareable property
+        *   DS1 = PRRR[17] = 1         - device shareable property
+        *   NS0 = PRRR[18] = 0         - normal shareable property
+        *   NS1 = PRRR[19] = 1         - normal shareable property
+        *   NOS = PRRR[24+n] = 1       - not outer shareable
+        */
+       ldr     r5, =0xff0a81a8                 @ PRRR
+       ldr     r6, =0x40e040e0                 @ NMRR
        mcr     p15, 0, r5, c10, c2, 0          @ write PRRR
        mcr     p15, 0, r6, c10, c2, 1          @ write NMRR
        adr     r5, v7_crval
        ldmia   r5, {r5, r6}
+ #ifdef CONFIG_CPU_ENDIAN_BE8
+       orr     r6, r6, #1 << 25                @ big-endian page tables
+ #endif
        mrc     p15, 0, r0, c1, c0, 0           @ read control register
        bic     r0, r0, r5                      @ clear bits them
        orr     r0, r0, r6                      @ set them
  ENDPROC(__v7_setup)
  
        /*   AT
-        *  TFR   EV X F   I D LR
-        * .EEE ..EE PUI. .T.T 4RVI ZFRS BLDP WCAM
+        *  TFR   EV X F   I D LR    S
+        * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM
         * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced
-        *    1    0 110       0011 1.00 .111 1101 < we want
+        *    1    0 110       0011 1100 .111 1101 < we want
         */
        .type   v7_crval, #object
  v7_crval:
-       crval   clear=0x0120c302, mmuset=0x10c0387d, ucset=0x00c0187c
+       crval   clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c
  
  __v7_setup_stack:
        .space  4 * 11                          @ 11 registers
index f9bd17dd8dd71af1fd6d6c05f7c7781b51daea26,90af4d9bc19e9b79ec8e19b362cf7b525676313c..4adec9b154dd6b91904aad2f542aef1730c22f72
  #define ASMARM_ARCH_UART_H
  
  #define IMXUART_HAVE_RTSCTS (1<<0)
 +#define IMXUART_IRDA        (1<<1)
  
  struct imxuart_platform_data {
        int (*init)(struct platform_device *pdev);
-       int (*exit)(struct platform_device *pdev);
+       void (*exit)(struct platform_device *pdev);
        unsigned int flags;
 +      void (*irda_enable)(int enable);
 +      unsigned int irda_inv_rx:1;
 +      unsigned int irda_inv_tx:1;
 +      unsigned short transceiver_delay;
  };
  
  #endif
index 9c00440dcf86a4e0bf433f9a4caa7caa70b1a073,26c93c75e62df02d46b7c74b1f58ae347133c9c2..f4b3f7293feb92b69d13a8c60531522d37335712
@@@ -88,7 -88,7 +88,7 @@@ config HW_RANDOM_N2RN
  
  config HW_RANDOM_VIA
        tristate "VIA HW Random Number Generator support"
 -      depends on HW_RANDOM && X86_32
 +      depends on HW_RANDOM && X86
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@@ -148,3 -148,15 +148,15 @@@ config HW_RANDOM_VIRTI
  
          To compile this driver as a module, choose M here: the
          module will be called virtio-rng.  If unsure, say N.
+ config HW_RANDOM_MXC_RNGA
+       tristate "Freescale i.MX RNGA Random Number Generator"
+       depends on HW_RANDOM && ARCH_HAS_RNGA
+       ---help---
+         This driver provides kernel-side support for the Random Number
+         Generator hardware found on Freescale i.MX processors.
+         To compile this driver as a module, choose M here: the
+         module will be called mxc-rnga.
+         If unsure, say Y.
index c40cb96255a2c92a6e395df960dd7989b9143800,2f19c635bc6e8243a38157364e91fccb8133d186..1cf9cfb3b64fb13f262f652ef74323e4bb1392ec
@@@ -680,7 -680,7 +680,7 @@@ static void mmc_omap_dma_cb(int lch, u1
        host->dma_ch = -1;
        /*
         * DMA Callback: run in interrupt context.
 -       * mutex_unlock will through a kernel warning if used.
 +       * mutex_unlock will throw a kernel warning if used.
         */
        up(&host->sem);
  }
@@@ -1073,7 -1073,6 +1073,6 @@@ static int __init omap_mmc_probe(struc
        mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
        mmc->max_seg_size = mmc->max_req_size;
  
-       mmc->ocr_avail = mmc_slot(host).ocr_mask;
        mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED;
  
        if (pdata->slots[host->slot_id].wires >= 8)
                goto err_irq;
        }
  
+       /* initialize power supplies, gpios, etc */
        if (pdata->init != NULL) {
                if (pdata->init(&pdev->dev) != 0) {
-                       dev_dbg(mmc_dev(host->mmc),
-                               "Unable to configure MMC IRQs\n");
+                       dev_dbg(mmc_dev(host->mmc), "late init error\n");
                        goto err_irq_cd_init;
                }
        }
+       mmc->ocr_avail = mmc_slot(host).ocr_mask;
  
        /* Request IRQ for card detect */
        if ((mmc_slot(host).card_detect_irq)) {
diff --combined drivers/serial/imx.c
index 7b5d1de9cfe39c3436d1074bb3b9c77933743507,738c8a5f64f26227899b58fe2181d158ad5f3a2c..285b414f30546d0a89285f823d802979adbbcac9
@@@ -8,9 -8,6 +8,9 @@@
   *  Author: Sascha Hauer <sascha@saschahauer.de>
   *  Copyright (C) 2004 Pengutronix
   *
 + *  Copyright (C) 2009 emlix GmbH
 + *  Author: Fabian Godehardt (added IrDA support for iMX)
 + *
   * 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
@@@ -44,8 -41,6 +44,8 @@@
  #include <linux/serial_core.h>
  #include <linux/serial.h>
  #include <linux/clk.h>
 +#include <linux/delay.h>
 +#include <linux/rational.h>
  
  #include <asm/io.h>
  #include <asm/irq.h>
@@@ -71,7 -66,7 +71,7 @@@
  #define ONEMS 0xb0 /* One Millisecond register */
  #define UTS   0xb4 /* UART Test Register */
  #endif
- #if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1)
+ #ifdef CONFIG_ARCH_MX1
  #define BIPR1 0xb0 /* Incremental Preset Register 1 */
  #define BIPR2 0xb4 /* Incremental Preset Register 2 */
  #define BIPR3 0xb8 /* Incremental Preset Register 3 */
  #define  UCR1_RTSDEN     (1<<5)        /* RTS delta interrupt enable */
  #define  UCR1_SNDBRK     (1<<4)        /* Send break */
  #define  UCR1_TDMAEN     (1<<3)        /* Transmitter ready DMA enable */
- #if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1)
+ #ifdef CONFIG_ARCH_MX1
  #define  UCR1_UARTCLKEN  (1<<2)        /* UART clock enabled */
  #endif
  #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2
  #define  UCR3_RXDSEN   (1<<6)  /* Receive status interrupt enable */
  #define  UCR3_AIRINTEN   (1<<5)  /* Async IR wake interrupt enable */
  #define  UCR3_AWAKEN   (1<<4)  /* Async wake interrupt enable */
- #ifdef CONFIG_ARCH_IMX
+ #ifdef CONFIG_ARCH_MX1
  #define  UCR3_REF25    (1<<3)  /* Ref freq 25 MHz, only on mx1 */
  #define  UCR3_REF30    (1<<2)  /* Ref Freq 30 MHz, only on mx1 */
  #endif
  #define  UCR4_DREN     (1<<0)  /* Recv data ready interrupt enable */
  #define  UFCR_RXTL_SHF   0       /* Receiver trigger level shift */
  #define  UFCR_RFDIV      (7<<7)  /* Reference freq divider mask */
 +#define  UFCR_RFDIV_REG(x)    (((x) < 7 ? 6 - (x) : 6) << 7)
  #define  UFCR_TXTL_SHF   10      /* Transmitter trigger level shift */
  #define  USR1_PARITYERR  (1<<15) /* Parity error interrupt flag */
  #define  USR1_RTSS     (1<<14) /* RTS pin status */
  #define  UTS_SOFTRST   (1<<0)  /* Software reset */
  
  /* We've been assigned a range on the "Low-density serial ports" major */
- #ifdef CONFIG_ARCH_IMX
- #define SERIAL_IMX_MAJOR      204
- #define MINOR_START           41
- #define DEV_NAME              "ttySMX"
- #define MAX_INTERNAL_IRQ      IMX_IRQS
- #endif
  #ifdef CONFIG_ARCH_MXC
  #define SERIAL_IMX_MAJOR        207
  #define MINOR_START           16
@@@ -217,20 -204,10 +210,20 @@@ struct imx_port 
        struct timer_list       timer;
        unsigned int            old_status;
        int                     txirq,rxirq,rtsirq;
 -      int                     have_rtscts:1;
 +      unsigned int            have_rtscts:1;
 +      unsigned int            use_irda:1;
 +      unsigned int            irda_inv_rx:1;
 +      unsigned int            irda_inv_tx:1;
 +      unsigned short          trcv_delay; /* transceiver delay */
        struct clk              *clk;
  };
  
 +#ifdef CONFIG_IRDA
 +#define USE_IRDA(sport)       ((sport)->use_irda)
 +#else
 +#define USE_IRDA(sport)       (0)
 +#endif
 +
  /*
   * Handle any change of modem status signal since we were last called.
   */
@@@ -284,48 -261,6 +277,48 @@@ static void imx_stop_tx(struct uart_por
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
  
 +      if (USE_IRDA(sport)) {
 +              /* half duplex - wait for end of transmission */
 +              int n = 256;
 +              while ((--n > 0) &&
 +                    !(readl(sport->port.membase + USR2) & USR2_TXDC)) {
 +                      udelay(5);
 +                      barrier();
 +              }
 +              /*
 +               * irda transceiver - wait a bit more to avoid
 +               * cutoff, hardware dependent
 +               */
 +              udelay(sport->trcv_delay);
 +
 +              /*
 +               * half duplex - reactivate receive mode,
 +               * flush receive pipe echo crap
 +               */
 +              if (readl(sport->port.membase + USR2) & USR2_TXDC) {
 +                      temp = readl(sport->port.membase + UCR1);
 +                      temp &= ~(UCR1_TXMPTYEN | UCR1_TRDYEN);
 +                      writel(temp, sport->port.membase + UCR1);
 +
 +                      temp = readl(sport->port.membase + UCR4);
 +                      temp &= ~(UCR4_TCEN);
 +                      writel(temp, sport->port.membase + UCR4);
 +
 +                      while (readl(sport->port.membase + URXD0) &
 +                             URXD_CHARRDY)
 +                              barrier();
 +
 +                      temp = readl(sport->port.membase + UCR1);
 +                      temp |= UCR1_RRDYEN;
 +                      writel(temp, sport->port.membase + UCR1);
 +
 +                      temp = readl(sport->port.membase + UCR4);
 +                      temp |= UCR4_DREN;
 +                      writel(temp, sport->port.membase + UCR4);
 +              }
 +              return;
 +      }
 +
        temp = readl(sport->port.membase + UCR1);
        writel(temp & ~UCR1_TXMPTYEN, sport->port.membase + UCR1);
  }
@@@ -360,15 -295,13 +353,15 @@@ static inline void imx_transmit_buffer(
                /* send xmit->buf[xmit->tail]
                 * out the port here */
                writel(xmit->buf[xmit->tail], sport->port.membase + URTX0);
 -              xmit->tail = (xmit->tail + 1) &
 -                       (UART_XMIT_SIZE - 1);
 +              xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                sport->port.icount.tx++;
                if (uart_circ_empty(xmit))
                        break;
        }
  
 +      if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 +              uart_write_wakeup(&sport->port);
 +
        if (uart_circ_empty(xmit))
                imx_stop_tx(&sport->port);
  }
@@@ -381,30 -314,9 +374,30 @@@ static void imx_start_tx(struct uart_po
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
  
 +      if (USE_IRDA(sport)) {
 +              /* half duplex in IrDA mode; have to disable receive mode */
 +              temp = readl(sport->port.membase + UCR4);
 +              temp &= ~(UCR4_DREN);
 +              writel(temp, sport->port.membase + UCR4);
 +
 +              temp = readl(sport->port.membase + UCR1);
 +              temp &= ~(UCR1_RRDYEN);
 +              writel(temp, sport->port.membase + UCR1);
 +      }
 +
        temp = readl(sport->port.membase + UCR1);
        writel(temp | UCR1_TXMPTYEN, sport->port.membase + UCR1);
  
 +      if (USE_IRDA(sport)) {
 +              temp = readl(sport->port.membase + UCR1);
 +              temp |= UCR1_TRDYEN;
 +              writel(temp, sport->port.membase + UCR1);
 +
 +              temp = readl(sport->port.membase + UCR4);
 +              temp |= UCR4_TCEN;
 +              writel(temp, sport->port.membase + UCR4);
 +      }
 +
        if (readl(sport->port.membase + UTS) & UTS_TXEMPTY)
                imx_transmit_buffer(sport);
  }
@@@ -476,7 -388,8 +469,7 @@@ static irqreturn_t imx_rxint(int irq, v
                                continue;
                }
  
 -              if (uart_handle_sysrq_char
 -                          (&sport->port, (unsigned char)rx))
 +              if (uart_handle_sysrq_char(&sport->port, (unsigned char)rx))
                        continue;
  
                if (rx & (URXD_PRERR | URXD_OVRRUN | URXD_FRMERR) ) {
@@@ -551,26 -464,26 +544,26 @@@ static unsigned int imx_tx_empty(struc
   */
  static unsigned int imx_get_mctrl(struct uart_port *port)
  {
 -        struct imx_port *sport = (struct imx_port *)port;
 -        unsigned int tmp = TIOCM_DSR | TIOCM_CAR;
 +      struct imx_port *sport = (struct imx_port *)port;
 +      unsigned int tmp = TIOCM_DSR | TIOCM_CAR;
  
 -        if (readl(sport->port.membase + USR1) & USR1_RTSS)
 -                tmp |= TIOCM_CTS;
 +      if (readl(sport->port.membase + USR1) & USR1_RTSS)
 +              tmp |= TIOCM_CTS;
  
 -        if (readl(sport->port.membase + UCR2) & UCR2_CTS)
 -                tmp |= TIOCM_RTS;
 +      if (readl(sport->port.membase + UCR2) & UCR2_CTS)
 +              tmp |= TIOCM_RTS;
  
 -        return tmp;
 +      return tmp;
  }
  
  static void imx_set_mctrl(struct uart_port *port, unsigned int mctrl)
  {
 -        struct imx_port *sport = (struct imx_port *)port;
 +      struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
  
        temp = readl(sport->port.membase + UCR2) & ~UCR2_CTS;
  
 -        if (mctrl & TIOCM_RTS)
 +      if (mctrl & TIOCM_RTS)
                temp |= UCR2_CTS;
  
        writel(temp, sport->port.membase + UCR2);
@@@ -614,7 -527,12 +607,7 @@@ static int imx_setup_ufcr(struct imx_po
        if(!ufcr_rfdiv)
                ufcr_rfdiv = 1;
  
 -      if(ufcr_rfdiv >= 7)
 -              ufcr_rfdiv = 6;
 -      else
 -              ufcr_rfdiv = 6 - ufcr_rfdiv;
 -
 -      val |= UFCR_RFDIV & (ufcr_rfdiv << 7);
 +      val |= UFCR_RFDIV_REG(ufcr_rfdiv);
  
        writel(val, sport->port.membase + UFCR);
  
@@@ -633,24 -551,8 +626,24 @@@ static int imx_startup(struct uart_por
         * requesting IRQs
         */
        temp = readl(sport->port.membase + UCR4);
 +
 +      if (USE_IRDA(sport))
 +              temp |= UCR4_IRSC;
 +
        writel(temp & ~UCR4_DREN, sport->port.membase + UCR4);
  
 +      if (USE_IRDA(sport)) {
 +              /* reset fifo's and state machines */
 +              int i = 100;
 +              temp = readl(sport->port.membase + UCR2);
 +              temp &= ~UCR2_SRST;
 +              writel(temp, sport->port.membase + UCR2);
 +              while (!(readl(sport->port.membase + UCR2) & UCR2_SRST) &&
 +                  (--i > 0)) {
 +                      udelay(1);
 +              }
 +      }
 +
        /*
         * Allocate the IRQ(s) i.MX1 has three interrupts whereas later
         * chips only have one interrupt.
                if (retval)
                        goto error_out2;
  
 -              retval = request_irq(sport->rtsirq, imx_rtsint,
 -                           (sport->rtsirq < MAX_INTERNAL_IRQ) ? 0 :
 -                             IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
 -                              DRIVER_NAME, sport);
 -              if (retval)
 -                      goto error_out3;
 +              /* do not use RTS IRQ on IrDA */
 +              if (!USE_IRDA(sport)) {
 +                      retval = request_irq(sport->rtsirq, imx_rtsint,
 +                                   (sport->rtsirq < MAX_INTERNAL_IRQ) ? 0 :
 +                                     IRQF_TRIGGER_FALLING |
 +                                     IRQF_TRIGGER_RISING,
 +                                      DRIVER_NAME, sport);
 +                      if (retval)
 +                              goto error_out3;
 +              }
        } else {
                retval = request_irq(sport->port.irq, imx_int, 0,
                                DRIVER_NAME, sport);
  
        temp = readl(sport->port.membase + UCR1);
        temp |= UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN;
 +
 +      if (USE_IRDA(sport)) {
 +              temp |= UCR1_IREN;
 +              temp &= ~(UCR1_RTSDEN);
 +      }
 +
        writel(temp, sport->port.membase + UCR1);
  
        temp = readl(sport->port.membase + UCR2);
        temp |= (UCR2_RXEN | UCR2_TXEN);
        writel(temp, sport->port.membase + UCR2);
  
 +      if (USE_IRDA(sport)) {
 +              /* clear RX-FIFO */
 +              int i = 64;
 +              while ((--i > 0) &&
 +                      (readl(sport->port.membase + URXD0) & URXD_CHARRDY)) {
 +                      barrier();
 +              }
 +      }
 +
  #if defined CONFIG_ARCH_MX2 || defined CONFIG_ARCH_MX3
        temp = readl(sport->port.membase + UCR3);
        temp |= UCR3_RXDMUXSEL;
        writel(temp, sport->port.membase + UCR3);
  #endif
  
 +      if (USE_IRDA(sport)) {
 +              temp = readl(sport->port.membase + UCR4);
 +              if (sport->irda_inv_rx)
 +                      temp |= UCR4_INVR;
 +              else
 +                      temp &= ~(UCR4_INVR);
 +              writel(temp | UCR4_DREN, sport->port.membase + UCR4);
 +
 +              temp = readl(sport->port.membase + UCR3);
 +              if (sport->irda_inv_tx)
 +                      temp |= UCR3_INVT;
 +              else
 +                      temp &= ~(UCR3_INVT);
 +              writel(temp, sport->port.membase + UCR3);
 +      }
 +
        /*
         * Enable modem status interrupts
         */
        imx_enable_ms(&sport->port);
        spin_unlock_irqrestore(&sport->port.lock,flags);
  
 +      if (USE_IRDA(sport)) {
 +              struct imxuart_platform_data *pdata;
 +              pdata = sport->port.dev->platform_data;
 +              sport->irda_inv_rx = pdata->irda_inv_rx;
 +              sport->irda_inv_tx = pdata->irda_inv_tx;
 +              sport->trcv_delay = pdata->transceiver_delay;
 +              if (pdata->irda_enable)
 +                      pdata->irda_enable(1);
 +      }
 +
        return 0;
  
  error_out3:
@@@ -769,17 -626,6 +762,17 @@@ static void imx_shutdown(struct uart_po
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
  
 +      temp = readl(sport->port.membase + UCR2);
 +      temp &= ~(UCR2_TXEN);
 +      writel(temp, sport->port.membase + UCR2);
 +
 +      if (USE_IRDA(sport)) {
 +              struct imxuart_platform_data *pdata;
 +              pdata = sport->port.dev->platform_data;
 +              if (pdata->irda_enable)
 +                      pdata->irda_enable(0);
 +      }
 +
        /*
         * Stop our timer.
         */
         * Free the interrupts
         */
        if (sport->txirq > 0) {
 -              free_irq(sport->rtsirq, sport);
 +              if (!USE_IRDA(sport))
 +                      free_irq(sport->rtsirq, sport);
                free_irq(sport->txirq, sport);
                free_irq(sport->rxirq, sport);
        } else
  
        temp = readl(sport->port.membase + UCR1);
        temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN);
 +      if (USE_IRDA(sport))
 +              temp &= ~(UCR1_IREN);
 +
        writel(temp, sport->port.membase + UCR1);
  }
  
@@@ -816,9 -658,7 +809,9 @@@ imx_set_termios(struct uart_port *port
        unsigned long flags;
        unsigned int ucr2, old_ucr1, old_txrxen, baud, quot;
        unsigned int old_csize = old ? old->c_cflag & CSIZE : CS8;
 -      unsigned int div, num, denom, ufcr;
 +      unsigned int div, ufcr;
 +      unsigned long num, denom;
 +      uint64_t tdiv64;
  
        /*
         * If we don't support modem control lines, don't allow
                        sport->port.membase + UCR2);
        old_txrxen &= (UCR2_TXEN | UCR2_RXEN);
  
 -      div = sport->port.uartclk / (baud * 16);
 -      if (div > 7)
 -              div = 7;
 -      if (!div)
 +      if (USE_IRDA(sport)) {
 +              /*
 +               * use maximum available submodule frequency to
 +               * avoid missing short pulses due to low sampling rate
 +               */
                div = 1;
 -
 -      num = baud;
 -      denom = port->uartclk / div / 16;
 -
 -      /* shift num and denom right until they fit into 16 bits */
 -      while (num > 0x10000 || denom > 0x10000) {
 -              num >>= 1;
 -              denom >>= 1;
 +      } else {
 +              div = sport->port.uartclk / (baud * 16);
 +              if (div > 7)
 +                      div = 7;
 +              if (!div)
 +                      div = 1;
        }
 -      if (num > 0)
 -              num -= 1;
 -      if (denom > 0)
 -              denom -= 1;
  
 -      writel(num, sport->port.membase + UBIR);
 -      writel(denom, sport->port.membase + UBMR);
 +      rational_best_approximation(16 * div * baud, sport->port.uartclk,
 +              1 << 16, 1 << 16, &num, &denom);
  
 -      if (div == 7)
 -              div = 6; /* 6 in RFDIV means divide by 7 */
 -      else
 -              div = 6 - div;
 +      tdiv64 = sport->port.uartclk;
 +      tdiv64 *= num;
 +      do_div(tdiv64, denom * 16 * div);
 +      tty_encode_baud_rate(sport->port.info->port.tty,
 +              (speed_t)tdiv64, (speed_t)tdiv64);
 +
 +      num -= 1;
 +      denom -= 1;
  
        ufcr = readl(sport->port.membase + UFCR);
 -      ufcr = (ufcr & (~UFCR_RFDIV)) |
 -          (div << 7);
 +      ufcr = (ufcr & (~UFCR_RFDIV)) | UFCR_RFDIV_REG(div);
        writel(ufcr, sport->port.membase + UFCR);
  
 +      writel(num, sport->port.membase + UBIR);
 +      writel(denom, sport->port.membase + UBMR);
 +
  #ifdef ONEMS
        writel(sport->port.uartclk / div / 1000, sport->port.membase + ONEMS);
  #endif
@@@ -1226,22 -1065,22 +1219,22 @@@ static struct uart_driver imx_reg = 
  
  static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
  {
 -        struct imx_port *sport = platform_get_drvdata(dev);
 +      struct imx_port *sport = platform_get_drvdata(dev);
  
 -        if (sport)
 -                uart_suspend_port(&imx_reg, &sport->port);
 +      if (sport)
 +              uart_suspend_port(&imx_reg, &sport->port);
  
 -        return 0;
 +      return 0;
  }
  
  static int serial_imx_resume(struct platform_device *dev)
  {
 -        struct imx_port *sport = platform_get_drvdata(dev);
 +      struct imx_port *sport = platform_get_drvdata(dev);
  
 -        if (sport)
 -                uart_resume_port(&imx_reg, &sport->port);
 +      if (sport)
 +              uart_resume_port(&imx_reg, &sport->port);
  
 -        return 0;
 +      return 0;
  }
  
  static int serial_imx_probe(struct platform_device *pdev)
        imx_ports[pdev->id] = sport;
  
        pdata = pdev->dev.platform_data;
 -      if(pdata && (pdata->flags & IMXUART_HAVE_RTSCTS))
 +      if (pdata && (pdata->flags & IMXUART_HAVE_RTSCTS))
                sport->have_rtscts = 1;
  
 +#ifdef CONFIG_IRDA
 +      if (pdata && (pdata->flags & IMXUART_IRDA))
 +              sport->use_irda = 1;
 +#endif
 +
        if (pdata->init) {
                ret = pdata->init(pdev);
                if (ret)
                        goto clkput;
        }
  
 -      uart_add_one_port(&imx_reg, &sport->port);
 +      ret = uart_add_one_port(&imx_reg, &sport->port);
 +      if (ret)
 +              goto deinit;
        platform_set_drvdata(pdev, &sport->port);
  
        return 0;
 +deinit:
 +      if (pdata->exit)
 +              pdata->exit(pdev);
  clkput:
        clk_put(sport->clk);
        clk_disable(sport->clk);
@@@ -1357,13 -1186,13 +1350,13 @@@ static int serial_imx_remove(struct pla
  }
  
  static struct platform_driver serial_imx_driver = {
 -        .probe          = serial_imx_probe,
 -        .remove         = serial_imx_remove,
 +      .probe          = serial_imx_probe,
 +      .remove         = serial_imx_remove,
  
        .suspend        = serial_imx_suspend,
        .resume         = serial_imx_resume,
        .driver         = {
 -              .name   = "imx-uart",
 +              .name   = "imx-uart",
                .owner  = THIS_MODULE,
        },
  };
diff --combined drivers/spi/Kconfig
index 957494775413006567e57de5c952d732beff3689,8e7c17e4461fb2c85e5fe7e908e4e68ca05f641a..e8aae227b5e0a3283702f5ee4f3ecd9fce3ce829
@@@ -118,7 -118,7 +118,7 @@@ config SPI_GPI
  
  config SPI_IMX
        tristate "Freescale iMX SPI controller"
-       depends on ARCH_IMX && EXPERIMENTAL
+       depends on ARCH_MX1 && EXPERIMENTAL
        help
          This enables using the Freescale iMX SPI controller in master
          mode.
@@@ -171,6 -171,15 +171,15 @@@ config SPI_ORIO
        help
          This enables using the SPI master controller on the Orion chips.
  
+ config SPI_PL022
+       tristate "ARM AMBA PL022 SSP controller (EXPERIMENTAL)"
+       depends on ARM_AMBA && EXPERIMENTAL
+       default y if MACH_U300
+       help
+         This selects the ARM(R) AMBA(R) PrimeCell PL022 SSP
+         controller. If you have an embedded system with an AMBA(R)
+         bus and a PL022 controller, say Y or M here.
  config SPI_PXA2XX
        tristate "PXA2xx SSP SPI master"
        depends on ARCH_PXA && EXPERIMENTAL
@@@ -212,7 -221,7 +221,7 @@@ config SPI_TXX
  
  config SPI_XILINX
        tristate "Xilinx SPI controller"
 -      depends on XILINX_VIRTEX && EXPERIMENTAL
 +      depends on (XILINX_VIRTEX || MICROBLAZE) && EXPERIMENTAL
        select SPI_BITBANG
        help
          This exposes the SPI controller IP from the Xilinx EDK.
diff --combined drivers/video/Kconfig
index 74712cb8399a6d7c65c93ea38d2a59a9d64d54ce,b6c0239d8d29c8f90557c37fb9713efa29eb39d8..2b5a691064b719fcfa94fdb4bcac82bf0fb26205
@@@ -397,7 -397,7 +397,7 @@@ config FB_SA110
  
  config FB_IMX
        tristate "Motorola i.MX LCD support"
-       depends on FB && (ARCH_IMX || ARCH_MX2)
+       depends on FB && (ARCH_MX1 || ARCH_MX2)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@@ -1759,6 -1759,16 +1759,16 @@@ config FB_6832
          Say Y here if you want to support the built-in frame buffer of
          the Motorola 68328 CPU family.
  
+ config FB_PXA168
+       tristate "PXA168/910 LCD framebuffer support"
+       depends on FB && (CPU_PXA168 || CPU_PXA910)
+       select FB_CFB_FILLRECT
+       select FB_CFB_COPYAREA
+       select FB_CFB_IMAGEBLIT
+       ---help---
+         Frame buffer driver for the built-in LCD controller in the Marvell
+         MMP processor.
  config FB_PXA
        tristate "PXA LCD framebuffer support"
        depends on FB && ARCH_PXA
@@@ -1996,7 -2006,7 +2006,7 @@@ config FB_PS3_DEFAULT_SIZE_
  
  config FB_XILINX
        tristate "Xilinx frame buffer support"
 -      depends on FB && XILINX_VIRTEX
 +      depends on FB && (XILINX_VIRTEX || MICROBLAZE)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
index 64a982ea5d5fc08d6c57204ebf6555ad70aa6610,42949e210cb873298ed73335bb81370e8533d3cb..5a5a7fd62490ca34fe27baa952f48de8831d8197
  #define UART011_IFLS_TX4_8    (2 << 0)
  #define UART011_IFLS_TX6_8    (3 << 0)
  #define UART011_IFLS_TX7_8    (4 << 0)
+ /* special values for ST vendor with deeper fifo */
+ #define UART011_IFLS_RX_HALF  (5 << 3)
+ #define UART011_IFLS_TX_HALF  (5 << 0)
  
  #define UART011_OEIM          (1 << 10)       /* overrun error interrupt mask */
  #define UART011_BEIM          (1 << 9)        /* break error interrupt mask */
  #define UART01x_FR_MODEM_ANY  (UART01x_FR_DCD|UART01x_FR_DSR|UART01x_FR_CTS)
  
  #ifndef __ASSEMBLY__
 +struct amba_device; /* in uncompress this is included but amba/bus.h is not */
  struct amba_pl010_data {
        void (*set_mctrl)(struct amba_device *dev, void __iomem *base, unsigned int mctrl);
  };
diff --combined sound/soc/pxa/Kconfig
index dcd163a4ee9ac02283ed1ff397822249f96c5e0d,96b2699abf61a4f5a3f5fdbe2590a4e4b8a91e6e..6375b4ea525dc572ca4feae6a8b69db703ecce1a
@@@ -89,22 -89,23 +89,23 @@@ config SND_PXA2XX_SOC_E80
          Toshiba e800 PDA
  
  config SND_PXA2XX_SOC_EM_X270
 -      tristate "SoC Audio support for CompuLab EM-x270"
 +      tristate "SoC Audio support for CompuLab EM-x270, eXeda and CM-X300"
        depends on SND_PXA2XX_SOC && MACH_EM_X270
        select SND_PXA2XX_SOC_AC97
        select SND_SOC_WM9712
        help
          Say Y if you want to add support for SoC audio on
 -        CompuLab EM-x270.
 +        CompuLab EM-x270, eXeda and CM-X300 machines.
  
  config SND_PXA2XX_SOC_PALM27X
-       bool "SoC Audio support for Palm T|X, T5 and LifeDrive"
-       depends on SND_PXA2XX_SOC && (MACH_PALMLD || MACH_PALMTX || MACH_PALMT5)
+       bool "SoC Audio support for Palm T|X, T5, E2 and LifeDrive"
+       depends on SND_PXA2XX_SOC && (MACH_PALMLD || MACH_PALMTX || \
+                       MACH_PALMT5 || MACH_PALMTE2)
        select SND_PXA2XX_SOC_AC97
        select SND_SOC_WM9712
        help
          Say Y if you want to add support for SoC audio on
-         Palm T|X, T5 or LifeDrive handheld computer.
+         Palm T|X, T5, E2 or LifeDrive handheld computer.
  
  config SND_SOC_ZYLONITE
        tristate "SoC Audio support for Marvell Zylonite"
@@@ -134,12 -135,3 +135,12 @@@ config SND_PXA2XX_SOC_MIOA70
          help
            Say Y if you want to add support for SoC audio on the
            MIO A701.
 +
 +config SND_PXA2XX_SOC_IMOTE2
 +       tristate "SoC Audio support for IMote 2"
 +       depends on SND_PXA2XX_SOC && MACH_INTELMOTE2
 +       select SND_PXA2XX_SOC_I2S
 +       select SND_SOC_WM8940
 +       help
 +         Say Y if you want to add support for SoC audio on the
 +       IMote 2.
index 168a088ba761f02c73bd93aaa859b9fefa5a44fe,c35b74b2d1dae9e215d048e7717592456225d7a1..a587ec40b449689df4d27a214d16c5d0ef28f7c4
@@@ -20,6 -20,7 +20,7 @@@
  #include <linux/module.h>
  #include <linux/device.h>
  #include <linux/delay.h>
+ #include <linux/gpio.h>
  #include <linux/clk.h>
  #include <linux/kernel.h>
  #include <linux/io.h>
@@@ -120,7 -121,7 +121,7 @@@ static int s3c2412_i2s_probe(struct pla
  
        s3c2412_i2s.iis_cclk = clk_get(&pdev->dev, "i2sclk");
        if (s3c2412_i2s.iis_cclk == NULL) {
 -              pr_debug("failed to get i2sclk clock\n");
 +              pr_err("failed to get i2sclk clock\n");
                iounmap(s3c2412_i2s.regs);
                return -ENODEV;
        }