summaryrefslogtreecommitdiff
path: root/packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch
diff options
context:
space:
mode:
authorMichael Lauer <mickey@vanille-media.de>2007-12-28 13:10:28 +0000
committerMichael Lauer <mickey@vanille-media.de>2007-12-28 13:10:28 +0000
commitbe3e650d031916b132b4cef9d19e7844cca3440b (patch)
tree96dea5f2866a9c43bee966b9d01753467f19a9a3 /packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch
parent518fac47b16e548ace1e23d1bc6f4a38b44670bb (diff)
rename uboot directory for more consistency
Diffstat (limited to 'packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch')
-rw-r--r--packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch1301
1 files changed, 0 insertions, 1301 deletions
diff --git a/packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch b/packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch
deleted file mode 100644
index da0fb8cf2d..0000000000
--- a/packages/uboot/u-boot-mkimage-openmoko-native/uboot-s3c2440.patch
+++ /dev/null
@@ -1,1301 +0,0 @@
-Add proper support for S3C2440 CPU's
-
-Index: u-boot/include/s3c24x0.h
-===================================================================
---- u-boot.orig/include/s3c24x0.h
-+++ u-boot/include/s3c24x0.h
-@@ -82,7 +82,7 @@
- S3C24X0_REG32 PRIORITY;
- S3C24X0_REG32 INTPND;
- S3C24X0_REG32 INTOFFSET;
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- S3C24X0_REG32 SUBSRCPND;
- S3C24X0_REG32 INTSUBMSK;
- #endif
-@@ -92,11 +92,11 @@
- /* DMAS (see manual chapter 8) */
- typedef struct {
- S3C24X0_REG32 DISRC;
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- S3C24X0_REG32 DISRCC;
- #endif
- S3C24X0_REG32 DIDST;
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- S3C24X0_REG32 DIDSTC;
- #endif
- S3C24X0_REG32 DCON;
-@@ -107,7 +107,7 @@
- #ifdef CONFIG_S3C2400
- S3C24X0_REG32 res[1];
- #endif
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- S3C24X0_REG32 res[7];
- #endif
- } /*__attribute__((__packed__))*/ S3C24X0_DMA;
-@@ -126,6 +126,9 @@
- S3C24X0_REG32 CLKCON;
- S3C24X0_REG32 CLKSLOW;
- S3C24X0_REG32 CLKDIVN;
-+#ifdef CONFIG_S3C2440
-+ S3C24X0_REG32 CAMDIVN;
-+#endif
- } /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
-
-
-@@ -145,7 +148,7 @@
- S3C24X0_REG32 res[8];
- S3C24X0_REG32 DITHMODE;
- S3C24X0_REG32 TPAL;
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- S3C24X0_REG32 LCDINTPND;
- S3C24X0_REG32 LCDSRCPND;
- S3C24X0_REG32 LCDINTMSK;
-@@ -157,6 +160,9 @@
- /* NAND FLASH (see S3C2410 manual chapter 6) */
- typedef struct {
- S3C24X0_REG32 NFCONF;
-+#ifdef CONFIG_S3C2440
-+ S3C24X0_REG32 NFCONT;
-+#endif
- S3C24X0_REG32 NFCMD;
- S3C24X0_REG32 NFADDR;
- S3C24X0_REG32 NFDATA;
-@@ -164,6 +170,15 @@
- S3C24X0_REG32 NFECC;
- } /*__attribute__((__packed__))*/ S3C2410_NAND;
-
-+/* NAND FLASH (see S3C2440 manual chapter 6) */
-+typedef struct {
-+ S3C24X0_REG32 NFCONF;
-+ S3C24X0_REG32 NFCMD;
-+ S3C24X0_REG32 NFADDR;
-+ S3C24X0_REG32 NFDATA;
-+ S3C24X0_REG32 NFSTAT;
-+ S3C24X0_REG32 NFECC;
-+} /*__attribute__((__packed__))*/ S3C2440_NAND;
-
- /* UART (see manual chapter 11) */
- typedef struct {
-@@ -451,6 +466,65 @@
- S3C24X0_REG32 GSTATUS3;
- S3C24X0_REG32 GSTATUS4;
- #endif
-+#ifdef CONFIG_S3C2440
-+ S3C24X0_REG32 GPACON;
-+ S3C24X0_REG32 GPADAT;
-+ S3C24X0_REG32 res1[2];
-+ S3C24X0_REG32 GPBCON;
-+ S3C24X0_REG32 GPBDAT;
-+ S3C24X0_REG32 GPBUP;
-+ S3C24X0_REG32 res2;
-+ S3C24X0_REG32 GPCCON;
-+ S3C24X0_REG32 GPCDAT;
-+ S3C24X0_REG32 GPCUP;
-+ S3C24X0_REG32 res3;
-+ S3C24X0_REG32 GPDCON;
-+ S3C24X0_REG32 GPDDAT;
-+ S3C24X0_REG32 GPDUP;
-+ S3C24X0_REG32 res4;
-+ S3C24X0_REG32 GPECON;
-+ S3C24X0_REG32 GPEDAT;
-+ S3C24X0_REG32 GPEUP;
-+ S3C24X0_REG32 res5;
-+ S3C24X0_REG32 GPFCON;
-+ S3C24X0_REG32 GPFDAT;
-+ S3C24X0_REG32 GPFUP;
-+ S3C24X0_REG32 res6;
-+ S3C24X0_REG32 GPGCON;
-+ S3C24X0_REG32 GPGDAT;
-+ S3C24X0_REG32 GPGUP;
-+ S3C24X0_REG32 res7;
-+ S3C24X0_REG32 GPHCON;
-+ S3C24X0_REG32 GPHDAT;
-+ S3C24X0_REG32 GPHUP;
-+ S3C24X0_REG32 res8;
-+
-+ S3C24X0_REG32 MISCCR;
-+ S3C24X0_REG32 DCLKCON;
-+ S3C24X0_REG32 EXTINT0;
-+ S3C24X0_REG32 EXTINT1;
-+ S3C24X0_REG32 EXTINT2;
-+ S3C24X0_REG32 EINTFLT0;
-+ S3C24X0_REG32 EINTFLT1;
-+ S3C24X0_REG32 EINTFLT2;
-+ S3C24X0_REG32 EINTFLT3;
-+ S3C24X0_REG32 EINTMASK;
-+ S3C24X0_REG32 EINTPEND;
-+ S3C24X0_REG32 GSTATUS0;
-+ S3C24X0_REG32 GSTATUS1;
-+ S3C24X0_REG32 GSTATUS2;
-+ S3C24X0_REG32 GSTATUS3;
-+ S3C24X0_REG32 GSTATUS4;
-+
-+ S3C24X0_REG32 res9;
-+ S3C24X0_REG32 DSC0;
-+ S3C24X0_REG32 DSC1;
-+ S3C24X0_REG32 MSLCON;
-+ S3C24X0_REG32 GPJCON;
-+ S3C24X0_REG32 GPJDAT;
-+ S3C24X0_REG32 GPJUP;
-+ S3C24X0_REG32 res10;
-+#endif
- } /*__attribute__((__packed__))*/ S3C24X0_GPIO;
-
-
-@@ -637,8 +711,13 @@
- S3C24X0_REG32 SDIDCNT;
- S3C24X0_REG32 SDIDSTA;
- S3C24X0_REG32 SDIFSTA;
-+#if defined(CONFIG_S3C2410)
- S3C24X0_REG32 SDIDAT;
- S3C24X0_REG32 SDIIMSK;
-+#elif defined(CONFIG_S3C2440)
-+ S3C24X0_REG32 SDIIMSK;
-+ S3C24X0_REG32 SDIDAT;
-+#endif
- } /*__attribute__((__packed__))*/ S3C2410_SDI;
-
-
-Index: u-boot/rtc/s3c24x0_rtc.c
-===================================================================
---- u-boot.orig/rtc/s3c24x0_rtc.c
-+++ u-boot/rtc/s3c24x0_rtc.c
-@@ -34,6 +34,8 @@
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
-
- #include <rtc.h>
-Index: u-boot/include/s3c2440.h
-===================================================================
---- /dev/null
-+++ u-boot/include/s3c2440.h
-@@ -0,0 +1,300 @@
-+/*
-+ * (C) Copyright 2003
-+ * David Müller ELSOFT AG Switzerland. d.mueller@elsoft.ch
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/************************************************
-+ * NAME : s3c2440.h
-+ * Version : 2007.
-+ *
-+ * Based on S3C2410X User's manual Rev 1.1
-+ ************************************************/
-+
-+#ifndef __S3C2440_H__
-+#define __S3C2440_H__
-+
-+#define S3C24X0_UART_CHANNELS 3
-+#define S3C24X0_SPI_CHANNELS 2
-+
-+/* S3C2440 only supports 512 Byte HW ECC */
-+#define S3C2440_ECCSIZE 512
-+#define S3C2440_ECCBYTES 3
-+
-+/* S3C2440 device base addresses */
-+#define S3C24X0_MEMCTL_BASE 0x48000000
-+#define S3C24X0_USB_HOST_BASE 0x49000000
-+#define S3C24X0_INTERRUPT_BASE 0x4A000000
-+#define S3C24X0_DMA_BASE 0x4B000000
-+#define S3C24X0_CLOCK_POWER_BASE 0x4C000000
-+#define S3C24X0_LCD_BASE 0x4D000000
-+#define S3C2440_NAND_BASE 0x4E000000
-+#define S3C24X0_UART_BASE 0x50000000
-+#define S3C24X0_TIMER_BASE 0x51000000
-+#define S3C24X0_USB_DEVICE_BASE 0x52000140
-+#define USB_DEVICE_PHYS_ADR 0x52000000
-+#define S3C24X0_WATCHDOG_BASE 0x53000000
-+#define S3C24X0_I2C_BASE 0x54000000
-+#define S3C24X0_I2S_BASE 0x55000000
-+#define S3C24X0_GPIO_BASE 0x56000000
-+#define S3C24X0_RTC_BASE 0x57000000
-+#define S3C2440_ADC_BASE 0x58000000
-+#define S3C24X0_SPI_BASE 0x59000000
-+#define S3C2440_SDI_BASE 0x5A000000
-+
-+#define oNFCONF 0x00
-+#define oNFCONT 0x04
-+
-+#ifndef __ASSEMBLER__
-+
-+/* include common stuff */
-+#include <s3c24x0.h>
-+
-+typedef enum {
-+ S3C24X0_UART0,
-+ S3C24X0_UART1,
-+ S3C24X0_UART2
-+} S3C24X0_UARTS_NR;
-+
-+static inline S3C24X0_MEMCTL * S3C24X0_GetBase_MEMCTL(void)
-+{
-+ return (S3C24X0_MEMCTL * const)S3C24X0_MEMCTL_BASE;
-+}
-+static inline S3C24X0_USB_HOST * S3C24X0_GetBase_USB_HOST(void)
-+{
-+ return (S3C24X0_USB_HOST * const)S3C24X0_USB_HOST_BASE;
-+}
-+static inline S3C24X0_INTERRUPT * S3C24X0_GetBase_INTERRUPT(void)
-+{
-+ return (S3C24X0_INTERRUPT * const)S3C24X0_INTERRUPT_BASE;
-+}
-+static inline S3C24X0_DMAS * S3C24X0_GetBase_DMAS(void)
-+{
-+ return (S3C24X0_DMAS * const)S3C24X0_DMA_BASE;
-+}
-+static inline S3C24X0_CLOCK_POWER * S3C24X0_GetBase_CLOCK_POWER(void)
-+{
-+ return (S3C24X0_CLOCK_POWER * const)S3C24X0_CLOCK_POWER_BASE;
-+}
-+static inline S3C24X0_LCD * S3C24X0_GetBase_LCD(void)
-+{
-+ return (S3C24X0_LCD * const)S3C24X0_LCD_BASE;
-+}
-+static inline S3C2440_NAND * S3C2440_GetBase_NAND(void)
-+{
-+ return (S3C2440_NAND * const)S3C2440_NAND_BASE;
-+}
-+static inline S3C24X0_UART * S3C24X0_GetBase_UART(S3C24X0_UARTS_NR nr)
-+{
-+ return (S3C24X0_UART * const)(S3C24X0_UART_BASE + (nr * 0x4000));
-+}
-+static inline S3C24X0_TIMERS * S3C24X0_GetBase_TIMERS(void)
-+{
-+ return (S3C24X0_TIMERS * const)S3C24X0_TIMER_BASE;
-+}
-+static inline S3C24X0_USB_DEVICE * S3C24X0_GetBase_USB_DEVICE(void)
-+{
-+ return (S3C24X0_USB_DEVICE * const)S3C24X0_USB_DEVICE_BASE;
-+}
-+static inline S3C24X0_WATCHDOG * S3C24X0_GetBase_WATCHDOG(void)
-+{
-+ return (S3C24X0_WATCHDOG * const)S3C24X0_WATCHDOG_BASE;
-+}
-+static inline S3C24X0_I2C * S3C24X0_GetBase_I2C(void)
-+{
-+ return (S3C24X0_I2C * const)S3C24X0_I2C_BASE;
-+}
-+static inline S3C24X0_I2S * S3C24X0_GetBase_I2S(void)
-+{
-+ return (S3C24X0_I2S * const)S3C24X0_I2S_BASE;
-+}
-+static inline S3C24X0_GPIO * S3C24X0_GetBase_GPIO(void)
-+{
-+ return (S3C24X0_GPIO * const)S3C24X0_GPIO_BASE;
-+}
-+static inline S3C24X0_RTC * S3C24X0_GetBase_RTC(void)
-+{
-+ return (S3C24X0_RTC * const)S3C24X0_RTC_BASE;
-+}
-+/*
-+static inline S3C2440_ADC * S3C2440_GetBase_ADC(void)
-+{
-+ return (S3C2440_ADC * const)S3C2440_ADC_BASE;
-+}
-+static inline S3C24X0_SPI * S3C24X0_GetBase_SPI(void)
-+{
-+ return (S3C24X0_SPI * const)S3C24X0_SPI_BASE;
-+}
-+*/
-+static inline S3C2410_SDI * S3C2410_GetBase_SDI(void)
-+{
-+ return (S3C2410_SDI * const)S3C2440_SDI_BASE;
-+}
-+
-+#endif /* __ASSEMBLER__ */
-+
-+/* ISR */
-+#define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))
-+#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))
-+#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))
-+#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xC))
-+#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))
-+#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
-+#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))
-+#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1C))
-+
-+#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
-+#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))
-+#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))
-+#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2C))
-+#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30))
-+#define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))
-+#define pISR_BAT_FLT (*(unsigned *)(_ISR_STARTADDRESS+0x3C))
-+#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x40))
-+#define pISR_WDT (*(unsigned *)(_ISR_STARTADDRESS+0x44))
-+#define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48))
-+#define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x4C))
-+#define pISR_TIMER2 (*(unsigned *)(_ISR_STARTADDRESS+0x50))
-+#define pISR_TIMER3 (*(unsigned *)(_ISR_STARTADDRESS+0x54))
-+#define pISR_TIMER4 (*(unsigned *)(_ISR_STARTADDRESS+0x58))
-+#define pISR_UART2 (*(unsigned *)(_ISR_STARTADDRESS+0x5C))
-+#define pISR_NOTUSED (*(unsigned *)(_ISR_STARTADDRESS+0x60))
-+#define pISR_DMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x64))
-+#define pISR_DMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x68))
-+#define pISR_DMA2 (*(unsigned *)(_ISR_STARTADDRESS+0x6C))
-+#define pISR_DMA3 (*(unsigned *)(_ISR_STARTADDRESS+0x70))
-+#define pISR_SDI (*(unsigned *)(_ISR_STARTADDRESS+0x74))
-+#define pISR_SPI0 (*(unsigned *)(_ISR_STARTADDRESS+0x78))
-+#define pISR_UART1 (*(unsigned *)(_ISR_STARTADDRESS+0x7C))
-+#define pISR_USBD (*(unsigned *)(_ISR_STARTADDRESS+0x84))
-+#define pISR_USBH (*(unsigned *)(_ISR_STARTADDRESS+0x88))
-+#define pISR_IIC (*(unsigned *)(_ISR_STARTADDRESS+0x8C))
-+#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90))
-+#define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))
-+#define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))
-+#define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0xA0))
-+
-+
-+/* PENDING BIT */
-+#define BIT_EINT0 (0x1)
-+#define BIT_EINT1 (0x1<<1)
-+#define BIT_EINT2 (0x1<<2)
-+#define BIT_EINT3 (0x1<<3)
-+#define BIT_EINT4_7 (0x1<<4)
-+#define BIT_EINT8_23 (0x1<<5)
-+#define BIT_BAT_FLT (0x1<<7)
-+#define BIT_TICK (0x1<<8)
-+#define BIT_WDT (0x1<<9)
-+#define BIT_TIMER0 (0x1<<10)
-+#define BIT_TIMER1 (0x1<<11)
-+#define BIT_TIMER2 (0x1<<12)
-+#define BIT_TIMER3 (0x1<<13)
-+#define BIT_TIMER4 (0x1<<14)
-+#define BIT_UART2 (0x1<<15)
-+#define BIT_LCD (0x1<<16)
-+#define BIT_DMA0 (0x1<<17)
-+#define BIT_DMA1 (0x1<<18)
-+#define BIT_DMA2 (0x1<<19)
-+#define BIT_DMA3 (0x1<<20)
-+#define BIT_SDI (0x1<<21)
-+#define BIT_SPI0 (0x1<<22)
-+#define BIT_UART1 (0x1<<23)
-+#define BIT_USBD (0x1<<25)
-+#define BIT_USBH (0x1<<26)
-+#define BIT_IIC (0x1<<27)
-+#define BIT_UART0 (0x1<<28)
-+#define BIT_SPI1 (0x1<<29)
-+#define BIT_RTC (0x1<<30)
-+#define BIT_ADC (0x1<<31)
-+#define BIT_ALLMSK (0xFFFFFFFF)
-+
-+#define ClearPending(bit) {\
-+ rSRCPND = bit;\
-+ rINTPND = bit;\
-+ rINTPND;\
-+ }
-+/* Wait until rINTPND is changed for the case that the ISR is very short. */
-+
-+#define __REG(x) (*(volatile unsigned long *)(x))
-+#define __REGl(x) (*(volatile unsigned long *)(x))
-+#define __REGw(x) (*(volatile unsigned short *)(x))
-+#define __REGb(x) (*(volatile unsigned char *)(x))
-+#define __REG2(x,y) (*(volatile unsigned long *)((x) + (y)))
-+
-+/*
-+ * * Nand flash controller
-+ * */
-+
-+#define NFDATA8 (*(volatile unsigned char *)0x4E000010)
-+#define NFDATA16 (*(volatile unsigned short *)0x4E000010)
-+#define NFDATA32 (*(volatile unsigned *)0x4E000010)
-+
-+#define NFCONF __REG(0x4E000000)
-+#define NFCONT __REG(0x4E000004)
-+#define NFCMD __REG(0x4E000008)
-+#define NFADDR __REGb(0x4E00000C)
-+#define NFMECCD0 __REG(0x4E000014)
-+#define NFMECCD1 __REG(0x4E000018)
-+#define NFSECCD __REG(0x4E00001C)
-+#define NFSTAT __REG(0x4E000020)
-+#define NFESTAT0 __REG(0x4E000024)
-+#define NFESTAT1 __REG(0x4E000028)
-+#define NFMECC0 __REG(0x4E00002C)
-+#define NFMECC1 __REG(0x4E000030)
-+#define NFSECC __REG(0x4E000034)
-+#define NFSBLK __REG(0x4E000038)
-+
-+
-+#define S3C2410_MISCCR_USBDEV (0<<3)
-+#define S3C2410_MISCCR_USBHOST (1<<3)
-+
-+#define S3C2410_MISCCR_CLK0_MPLL (0<<4)
-+#define S3C2410_MISCCR_CLK0_UPLL (1<<4)
-+#define S3C2410_MISCCR_CLK0_FCLK (2<<4)
-+#define S3C2410_MISCCR_CLK0_HCLK (3<<4)
-+#define S3C2410_MISCCR_CLK0_PCLK (4<<4)
-+#define S3C2410_MISCCR_CLK0_DCLK0 (5<<4)
-+#define S3C2410_MISCCR_CLK0_MASK (7<<4)
-+
-+#define S3C2410_MISCCR_CLK1_MPLL (0<<8)
-+#define S3C2410_MISCCR_CLK1_UPLL (1<<8)
-+#define S3C2410_MISCCR_CLK1_FCLK (2<<8)
-+#define S3C2410_MISCCR_CLK1_HCLK (3<<8)
-+#define S3C2410_MISCCR_CLK1_PCLK (4<<8)
-+#define S3C2410_MISCCR_CLK1_DCLK1 (5<<8)
-+#define S3C2410_MISCCR_CLK1_MASK (7<<8)
-+
-+#define S3C2410_MISCCR_USBSUSPND0 (1<<12)
-+#define S3C2410_MISCCR_USBSUSPND1 (1<<13)
-+
-+#define S3C2410_MISCCR_nRSTCON (1<<16)
-+
-+#define S3C2410_MISCCR_nEN_SCLK0 (1<<17)
-+#define S3C2410_MISCCR_nEN_SCLK1 (1<<18)
-+#define S3C2410_MISCCR_nEN_SCLKE (1<<19)
-+#define S3C2410_MISCCR_SDSLEEP (7<<17)
-+
-+#define S3C2410_CLKSLOW_UCLK_OFF (1<<7)
-+#define S3C2410_CLKSLOW_MPLL_OFF (1<<5)
-+#define S3C2410_CLKSLOW_SLOW (1<<4)
-+#define S3C2410_CLKSLOW_SLOWVAL(x) (x)
-+#define S3C2410_CLKSLOW_GET_SLOWVAL(x) ((x) & 7)
-+
-+#endif /*__S3C2440_H__*/
-Index: u-boot/include/common.h
-===================================================================
---- u-boot.orig/include/common.h
-+++ u-boot/include/common.h
-@@ -454,7 +454,7 @@
- ulong get_OPB_freq (void);
- ulong get_PCI_freq (void);
- #endif
--#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X)
-+#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_LH7A40X)
- void s3c2410_irq(void);
- #define ARM920_IRQ_CALLBACK s3c2410_irq
- ulong get_FCLK (void);
-Index: u-boot/cpu/arm920t/s3c24x0/usb_ohci.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/usb_ohci.c
-+++ u-boot/cpu/arm920t/s3c24x0/usb_ohci.c
-@@ -44,6 +44,8 @@
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
-
- #include <malloc.h>
-Index: u-boot/cpu/arm920t/s3c24x0/speed.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/speed.c
-+++ u-boot/cpu/arm920t/s3c24x0/speed.c
-@@ -30,12 +30,15 @@
- */
-
- #include <common.h>
--#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)
-+#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || \
-+ defined (CONFIG_S3C2440) || defined (CONFIG_TRAB)
-
- #if defined(CONFIG_S3C2400)
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
-
- #define MPLL 0
-@@ -66,8 +69,12 @@
- m = ((r & 0xFF000) >> 12) + 8;
- p = ((r & 0x003F0) >> 4) + 2;
- s = r & 0x3;
--
-+#ifndef CONFIG_S3C2440
- return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
-+#else
-+ /* To avoid integer overflow, changed the calc order */
-+ return( 2 * m * (CONFIG_SYS_CLK_FREQ / (p << s )) );
-+#endif
- }
-
- /* return FCLK frequency */
-@@ -81,7 +88,21 @@
- {
- S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
-
-+#ifndef CONFIG_S3C2440
- return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
-+#else
-+ switch (clk_power->CLKDIVN & 0x6) {
-+ case 0x0:
-+ return get_FCLK();
-+ case 0x2:
-+ return get_FCLK()/2;
-+ case 0x4:
-+ return (clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4;
-+ case 0x6:
-+ return (clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3;
-+ }
-+ return 0;
-+#endif
- }
-
- /* return PCLK frequency */
-@@ -98,4 +119,5 @@
- return(get_PLLCLK(UPLL));
- }
-
--#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) */
-+#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) ||
-+ defined(CONFIG_S3C2440) || defined (CONFIG_TRAB) */
-Index: u-boot/cpu/arm920t/s3c24x0/interrupts.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/interrupts.c
-+++ u-boot/cpu/arm920t/s3c24x0/interrupts.c
-@@ -30,13 +30,16 @@
- */
-
- #include <common.h>
--#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)
-+#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || \
-+ defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)
-
- #include <arm920t.h>
- #if defined(CONFIG_S3C2400)
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
-
- int timer_load_val = 0;
-@@ -59,6 +62,7 @@
- /* use PWM Timer 4 because it has no output */
- /* prescaler for Timer 4 is 16 */
- timers->TCFG0 = 0x0f00;
-+#ifndef CONFIG_S3C2440
- if (timer_load_val == 0)
- {
- /*
-@@ -68,6 +72,9 @@
- */
- timer_load_val = get_PCLK()/(2 * 16 * 100);
- }
-+#else
-+ timer_load_val = get_PCLK()/(2 * 16 * 100);
-+#endif
- /* load value for 10 ms timeout */
- lastdec = timers->TCNTB4 = timer_load_val;
- /* auto load, manual update of Timer 4 */
-@@ -178,6 +185,7 @@
- tbclk = timer_load_val * 100;
- #elif defined(CONFIG_SBC2410X) || \
- defined(CONFIG_SMDK2410) || \
-+ defined(CONFIG_SMDK2440) || \
- defined(CONFIG_VCMA9)
- tbclk = CFG_HZ;
- #else
-@@ -232,4 +240,5 @@
- }
- #endif /* USE_IRQ */
-
--#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) */
-+#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) ||
-+ defined(CONFIG_S3C2440) || defined (CONFIG_TRAB) */
-Index: u-boot/cpu/arm920t/s3c24x0/serial.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/serial.c
-+++ u-boot/cpu/arm920t/s3c24x0/serial.c
-@@ -19,12 +19,15 @@
- */
-
- #include <common.h>
--#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)
-+#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || \
-+ defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)
-
- #if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
-
- DECLARE_GLOBAL_DATA_PTR;
-@@ -180,4 +183,5 @@
- }
- }
-
--#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) */
-+#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) ||
-+ defined(CONFIG_S3C2440) || defined (CONFIG_TRAB) */
-Index: u-boot/cpu/arm920t/s3c24x0/i2c.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/i2c.c
-+++ u-boot/cpu/arm920t/s3c24x0/i2c.c
-@@ -34,6 +34,8 @@
- #include <s3c2400.h>
- #elif defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
- #endif
- #include <i2c.h>
-
-@@ -63,7 +65,7 @@
- {
- S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
-
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- return (gpio->GPEDAT & 0x8000) >> 15;
- #endif
- #ifdef CONFIG_S3C2400
-@@ -82,7 +84,7 @@
- {
- S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
-
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- gpio->GPEDAT = (gpio->GPEDAT & ~0x4000) | (x&1) << 14;
- #endif
- #ifdef CONFIG_S3C2400
-@@ -139,7 +141,7 @@
- }
-
- if ((status & I2CSTAT_BSY) || GetI2CSDA () == 0) {
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- ulong old_gpecon = gpio->GPECON;
- #endif
- #ifdef CONFIG_S3C2400
-@@ -147,7 +149,7 @@
- #endif
- /* bus still busy probably by (most) previously interrupted transfer */
-
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- /* set I2CSDA and I2CSCL (GPE15, GPE14) to GPIO */
- gpio->GPECON = (gpio->GPECON & ~0xF0000000) | 0x10000000;
- #endif
-@@ -171,7 +173,7 @@
- udelay (1000);
-
- /* restore pin functions */
--#ifdef CONFIG_S3C2410
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- gpio->GPECON = old_gpecon;
- #endif
- #ifdef CONFIG_S3C2400
-Index: u-boot/drivers/usbdcore_s3c2410.c
-===================================================================
---- u-boot.orig/drivers/usbdcore_s3c2410.c
-+++ u-boot/drivers/usbdcore_s3c2410.c
-@@ -24,7 +24,7 @@
-
- #include <config.h>
-
--#if defined(CONFIG_S3C2410) && defined(CONFIG_USB_DEVICE)
-+#if (defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)) && defined(CONFIG_USB_DEVICE)
-
- #include <common.h>
-
-Index: u-boot/drivers/usbtty.h
-===================================================================
---- u-boot.orig/drivers/usbtty.h
-+++ u-boot/drivers/usbtty.h
-@@ -29,7 +29,7 @@
- #include "usbdcore_mpc8xx.h"
- #elif defined(CONFIG_OMAP1510)
- #include "usbdcore_omap1510.h"
--#elif defined(CONFIG_S3C2410)
-+#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- #include "usbdcore_s3c2410.h"
- #endif
-
-Index: u-boot/cpu/arm920t/start.S
-===================================================================
---- u-boot.orig/cpu/arm920t/start.S
-+++ u-boot/cpu/arm920t/start.S
-@@ -31,7 +31,11 @@
-
- #include <config.h>
- #include <version.h>
-+#if defined(CONFIG_S3C2410)
- #include <s3c2410.h>
-+#elif defined(CONFIG_S3C2440)
-+#include <s3c2440.h>
-+#endif
-
-
- /*
-@@ -142,14 +146,32 @@
- # define pWTCON 0x15300000
- # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
- # define CLKDIVN 0x14800014 /* clock divisor register */
--#elif defined(CONFIG_S3C2410)
-+#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
- # define pWTCON 0x53000000
- # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
- # define INTSUBMSK 0x4A00001C
- # define CLKDIVN 0x4C000014 /* clock divisor register */
- #endif
-
--#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
-+#if defined(CONFIG_S3C2410)
-+# define INTSUBMSK_val 0x7ff
-+# define MPLLCON_val ((0x90 << 12) + (0x7 << 4) + 0x0) /* 202 MHz */
-+# define UPLLCON_val ((0x78 << 12) + (0x2 << 4) + 0x3)
-+# define CLKDIVN_val 3 /* FCLK:HCLK:PCLK = 1:2:4 */
-+#elif defined(CONFIG_S3C2440)
-+# define INTSUBMSK_val 0xffff
-+#if (CONFIG_SYS_CLK_FREQ == 16934400)
-+# define MPLLCON_val ((0x61 << 12) + (0x1 << 4) + 0x2) /* 296.35 MHz */
-+# define UPLLCON_val ((0x3c << 12) + (0x4 << 4) + 0x2) /* 47.98 MHz */
-+#else if (CONFIG_SYS_CLK_FREQ == 12000000)
-+# define MPLLCON_val ((0x44 << 12) + (0x1 << 4) + 0x1) /* 304.00 MHz */
-+# define UPLLCON_val ((0x38 << 12) + (0x2 << 4) + 0x2) /* 48.00 MHz */
-+#endif
-+# define CLKDIVN_val 7 /* FCLK:HCLK:PCLK = 1:3:6 */
-+# define CAMDIVN 0x4C000018
-+#endif
-+
-+#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- ldr r0, =pWTCON
- mov r1, #0x0
- str r1, [r0]
-@@ -160,24 +182,34 @@
- mov r1, #0xffffffff
- ldr r0, =INTMSK
- str r1, [r0]
--# if defined(CONFIG_S3C2410)
-- ldr r1, =0x3ff
-+# if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
-+ ldr r1, =INTSUBMSK_val
- ldr r0, =INTSUBMSK
- str r1, [r0]
- # endif
-
-- /* default FCLK is 202 MHz ! */
-+#if defined(CONFIG_S3C2440)
-+ /* Make sure we get FCLK:HCLK:PCLK = 1:3:6 */
-+ ldr r0, =CAMDIVN
-+ mov r1, #0
-+ str r1, [r0]
-+#endif
-+
-+ /* Clock asynchronous mode */
-+ mrc p15, 0, r1, c1, c0, 0
-+ orr r1, r1, #0xc0000000
-+ mcr p15, 0, r1, c1, c0, 0
-+
-+
- #define LOCKTIME 0x4c000000
- #define UPLLCON 0x4c000008
--//#define MPLLCFG ((0x90 << 12) + (0x2 << 4) + 0x2)
--#define MPLLCFG ((0x90 << 12) + (0x7 << 4) + 0x0)
--#define UPLLCFG ((0x78 << 12) + (0x2 << 4) + 0x3)
-+
- ldr r0, =LOCKTIME
- mov r1, #0xffffff
- str r1, [r0]
-
- ldr r0, =UPLLCON
-- ldr r1, =UPLLCFG
-+ ldr r1, =UPLLCON_val
- str r1, [r0]
-
- /* Page 7-19, seven nops between UPLL and MPLL */
-@@ -189,12 +221,12 @@
- nop
- nop
-
-- ldr r1, =MPLLCFG
-+ ldr r1, =MPLLCON_val
- str r1, [r0, #-4] /* MPLLCON */
-
- /* FCLK:HCLK:PCLK = 1:2:4 */
- ldr r0, =CLKDIVN
-- mov r1, #3
-+ mov r1, #CLKDIVN_val
- str r1, [r0]
-
- #if 1
-@@ -222,7 +254,7 @@
- str r1, [r0, #0x28]
- #endif
-
--#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
-+#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */
-
- #ifndef CONFIG_SKIP_LOWLEVEL_INIT
- #ifndef CONFIG_LL_INIT_NAND_ONLY
-@@ -279,7 +311,7 @@
- #if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && defined(CONFIG_LL_INIT_NAND_ONLY)
- bl cpu_init_crit
- #endif
--#if defined(CONFIG_S3C2410)
-+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
- /* ensure some refresh has happened */
- ldr r1, =0xfffff
- 1: subs r1, r1, #1
-@@ -290,11 +322,12 @@
- ldr r0, [ r1 ]
- tst r0, #0x02 /* is this resume from power down */
- ldrne pc, [r1, #4] /* gstatus3 */
--#endif /* CONFIG_S3C2410 */
-+#endif /* CONFIG_S3C2410 || CONFIG_S3C2440 */
- #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
-
- /* mov r10, lr */
-
-+#if defined(CONFIG_S3C2410)
- @ reset NAND
- mov r1, #S3C2410_NAND_BASE
- ldr r2, =0xf842 @ initial value enable tacls=3,rph0=6,rph1=0
-@@ -314,6 +347,17 @@
- ldr r2, [r1, #oNFCONF]
- orr r2, r2, #0x800 @ disable chip
- str r2, [r1, #oNFCONF]
-+#elif defined(CONFIG_S3C2440)
-+ mov r1, #S3C2440_NAND_BASE
-+ ldr r2, =0xfff0 @ initial value tacls=3,rph0=7,rph1=7
-+ ldr r3, [r1, #oNFCONF]
-+ orr r3, r3, r2
-+ str r3, [r1, #oNFCONF]
-+
-+ ldr r3, [r1, #oNFCONT]
-+ orr r3, r3, #1 @ enable nand controller
-+ str r3, [r1, #oNFCONT]
-+#endif
-
- #if 0
- @ get ready to call C functions (for nand_read())
-@@ -382,7 +426,7 @@
- #endif /* CONFIG_S3C2410_NAND_BOOT */
- done_relocate:
-
--#if defined(CONFIG_USE_IRQ) && defined(CONFIG_S3C2410)
-+#if defined(CONFIG_USE_IRQ) && (defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440))
- /* In the case of the S3C2410, if we've somehow magically (JTAG, ...)
- ended up in RAM, then that ram is mapped to 0x30000000 and not 0.
- So we need to copy the interrupt vectors, etc. */
-Index: u-boot/cpu/arm920t/s3c24x0/nand_read.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/nand_read.c
-+++ u-boot/cpu/arm920t/s3c24x0/nand_read.c
-@@ -16,30 +16,141 @@
- */
-
- #include <common.h>
-+#include <linux/mtd/nand.h>
-
- #ifdef CONFIG_S3C2410_NAND_BOOT
-
- #define __REGb(x) (*(volatile unsigned char *)(x))
-+#define __REGw(x) (*(volatile unsigned short *)(x))
- #define __REGi(x) (*(volatile unsigned int *)(x))
- #define NF_BASE 0x4e000000
-+#if defined(CONFIG_S3C2410)
- #define NFCONF __REGi(NF_BASE + 0x0)
- #define NFCMD __REGb(NF_BASE + 0x4)
- #define NFADDR __REGb(NF_BASE + 0x8)
- #define NFDATA __REGb(NF_BASE + 0xc)
- #define NFSTAT __REGb(NF_BASE + 0x10)
-+#define NFSTAT_BUSY 1
-+#define nand_select() (NFCONF &= ~0x800)
-+#define nand_deselect() (NFCONF |= 0x800)
-+#define nand_clear_RnB() do {} while (0)
-+#elif defined(CONFIG_S3C2440)
-+#define NFCONF __REGi(NF_BASE + 0x0)
-+#define NFCONT __REGi(NF_BASE + 0x4)
-+#define NFCMD __REGb(NF_BASE + 0x8)
-+#define NFADDR __REGb(NF_BASE + 0xc)
-+#define NFDATA __REGb(NF_BASE + 0x10)
-+#define NFDATA16 __REGw(NF_BASE + 0x10)
-+#define NFSTAT __REGb(NF_BASE + 0x20)
-+#define NFSTAT_BUSY 1
-+#define nand_select() (NFCONT &= ~(1 << 1))
-+#define nand_deselect() (NFCONT |= (1 << 1))
-+#define nand_clear_RnB() (NFSTAT |= (1 << 2))
-+#endif
-
--#define BUSY 1
--inline void wait_idle(void)
-+static inline void nand_wait(void)
- {
- int i;
-
-- while (!(NFSTAT & BUSY))
-+ while (!(NFSTAT & NFSTAT_BUSY))
- for (i=0; i<10; i++);
- }
-
--#define NAND_SECTOR_SIZE 512
--#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
--#define NAND_PAGE_SIZE 0x4000
-+#if defined(CONFIG_S3C2410)
-+/* configuration for 2410 with 512byte sized flash */
-+#define NAND_PAGE_SIZE 512
-+#define BAD_BLOCK_OFFSET 517
-+#define NAND_BLOCK_MASK (NAND_PAGE_SIZE - 1)
-+#define NAND_BLOCK_SIZE 0x4000
-+#else
-+/* configuration for 2440 with 2048byte sized flash */
-+#define NAND_5_ADDR_CYCLE
-+#define NAND_PAGE_SIZE 2048
-+#define BAD_BLOCK_OFFSET NAND_PAGE_SIZE
-+#define NAND_BLOCK_MASK (NAND_PAGE_SIZE - 1)
-+#define NAND_BLOCK_SIZE (NAND_PAGE_SIZE * 64)
-+#endif
-+
-+/* compile time failure in case of an invalid configuration */
-+#if defined(CONFIG_S3C2410) && (NAND_PAGE_SIZE != 512)
-+#error "S3C2410 does not support nand page size != 512"
-+#endif
-+
-+static int is_bad_block(unsigned long i)
-+{
-+ unsigned char data;
-+ unsigned long page_num;
-+
-+ /* FIXME: do this twice, for first and second page in block */
-+
-+ nand_clear_RnB();
-+#if (NAND_PAGE_SIZE == 512)
-+ NFCMD = NAND_CMD_READOOB; /* 0x50 */
-+ NFADDR = BAD_BLOCK_OFFSET & 0xf;
-+ NFADDR = (i >> 9) & 0xff;
-+ NFADDR = (i >> 17) & 0xff;
-+ NFADDR = (i >> 25) & 0xff;
-+#elif (NAND_PAGE_SIZE == 2048)
-+ page_num = i >> 11; /* addr / 2048 */
-+ NFCMD = NAND_CMD_READ0;
-+ NFADDR = BAD_BLOCK_OFFSET & 0xff;
-+ NFADDR = (BAD_BLOCK_OFFSET >> 8) & 0xff;
-+ NFADDR = page_num & 0xff;
-+ NFADDR = (page_num >> 8) & 0xff;
-+ NFADDR = (page_num >> 16) & 0xff;
-+ NFCMD = NAND_CMD_READSTART;
-+#endif
-+ nand_wait();
-+ data = (NFDATA & 0xff);
-+ if (data != 0xff)
-+ return 1;
-+
-+ return 0;
-+}
-+
-+static int nand_read_page_ll(unsigned char *buf, unsigned long addr)
-+{
-+ unsigned short *ptr16 = (unsigned short *)buf;
-+ unsigned int i, page_num;
-+
-+ nand_clear_RnB();
-+
-+ NFCMD = NAND_CMD_READ0;
-+
-+#if (NAND_PAGE_SIZE == 512)
-+ /* Write Address */
-+ NFADDR = addr & 0xff;
-+ NFADDR = (addr >> 9) & 0xff;
-+ NFADDR = (addr >> 17) & 0xff;
-+ NFADDR = (addr >> 25) & 0xff;
-+#elif (NAND_PAGE_SIZE == 2048)
-+ page_num = addr >> 11; /* addr / 2048 */
-+ /* Write Address */
-+ NFADDR = 0;
-+ NFADDR = 0;
-+ NFADDR = page_num & 0xff;
-+ NFADDR = (page_num >> 8) & 0xff;
-+ NFADDR = (page_num >> 16) & 0xff;
-+ NFCMD = NAND_CMD_READSTART;
-+#else
-+#error "unsupported nand page size"
-+#endif
-+ nand_wait();
-+
-+#if defined(CONFIG_S3C2410)
-+ for (i = 0; i < NAND_PAGE_SIZE; i++) {
-+ *buf = (NFDATA & 0xff);
-+ buf++;
-+ }
-+#elif defined(CONFIG_S3C2440)
-+ for (i = 0; i < NAND_PAGE_SIZE/2; i++) {
-+ *ptr16 = NFDATA16;
-+ ptr16++;
-+ }
-+#endif
-+
-+ return NAND_PAGE_SIZE;
-+}
-
- /* low level nand read function */
- int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
-@@ -50,47 +161,28 @@
- return -1; /* invalid alignment */
-
- /* chip Enable */
-- NFCONF &= ~0x800;
-+ nand_select();
-+ nand_clear_RnB();
- for (i=0; i<10; i++);
-
- for (i=start_addr; i < (start_addr + size);) {
- #ifdef CONFIG_S3C2410_NAND_SKIP_BAD
-- if (start_addr % NAND_PAGE_SIZE == 0) {
-- unsigned char data;
-- NFCMD = 0x50;
-- NFADDR = 517&0xf;
-- NFADDR = (i >> 9) & 0xff;
-- NFADDR = (i >> 17) & 0xff;
-- NFADDR = (i >> 25) & 0xff;
-- wait_idle();
-- data = (NFDATA & 0xff);
-- if (data != 0xff) {
-+ if (start_addr % NAND_BLOCK_SIZE == 0) {
-+ if (is_bad_block(i)) {
- /* Bad block */
-- i += NAND_PAGE_SIZE;
-- size += NAND_PAGE_SIZE;
-+ i += NAND_BLOCK_SIZE;
-+ size += NAND_BLOCK_SIZE;
- continue;
- }
- }
- #endif
-- /* READ0 */
-- NFCMD = 0;
--
-- /* Write Address */
-- NFADDR = i & 0xff;
-- NFADDR = (i >> 9) & 0xff;
-- NFADDR = (i >> 17) & 0xff;
-- NFADDR = (i >> 25) & 0xff;
--
-- wait_idle();
--
-- for (j=0; j < NAND_SECTOR_SIZE; j++, i++) {
-- *buf = (NFDATA & 0xff);
-- buf++;
-- }
-+ j = nand_read_page_ll(buf, i);
-+ i += j;
-+ buf += j;
- }
-
- /* chip Disable */
-- NFCONF |= 0x800; /* chip disable */
-+ nand_deselect();
-
- return 0;
- }
-Index: u-boot/cpu/arm920t/s3c24x0/nand.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/nand.c
-+++ u-boot/cpu/arm920t/s3c24x0/nand.c
-@@ -36,24 +36,54 @@
- #define __REGi(x) (*(volatile unsigned int *)(x))
-
- #define NF_BASE 0x4e000000
-+
- #define NFCONF __REGi(NF_BASE + 0x0)
--#define NFCMD __REGb(NF_BASE + 0x4)
--#define NFADDR __REGb(NF_BASE + 0x8)
--#define NFDATA __REGb(NF_BASE + 0xc)
--#define NFSTAT __REGb(NF_BASE + 0x10)
-+
-+#if defined(CONFIG_S3C2410)
-+
-+#define oNFCMD 0x4
-+#define oNFADDR 0x8
-+#define oNFDATA 0xc
-+#define oNFSTAT 0x10
- #define NFECC0 __REGb(NF_BASE + 0x14)
- #define NFECC1 __REGb(NF_BASE + 0x15)
- #define NFECC2 __REGb(NF_BASE + 0x16)
-+#define NFCONF_nFCE (1<<11)
-
- #define S3C2410_NFCONF_EN (1<<15)
- #define S3C2410_NFCONF_512BYTE (1<<14)
- #define S3C2410_NFCONF_4STEP (1<<13)
- #define S3C2410_NFCONF_INITECC (1<<12)
--#define S3C2410_NFCONF_nFCE (1<<11)
- #define S3C2410_NFCONF_TACLS(x) ((x)<<8)
- #define S3C2410_NFCONF_TWRPH0(x) ((x)<<4)
- #define S3C2410_NFCONF_TWRPH1(x) ((x)<<0)
-
-+#elif defined(CONFIG_S3C2440)
-+
-+#define oNFCMD 0x8
-+#define oNFADDR 0xc
-+#define oNFDATA 0x10
-+#define oNFSTAT 0x20
-+
-+#define NFCONT __REGi(NF_BASE + 0x04)
-+#define NFMECC0 __REGi(NF_BASE + 0x2C)
-+#define NFCONF_nFCE (1<<1)
-+#define S3C2440_NFCONF_INITECC (1<<4)
-+#define S3C2440_NFCONF_MAINECCLOCK (1<<5)
-+#define nand_select() (NFCONT &= ~(1 << 1))
-+#define nand_deselect() (NFCONT |= (1 << 1))
-+#define nand_clear_RnB() (NFSTAT |= (1 << 2))
-+#define nand_detect_RB() { while(!(NFSTAT&(1<<2))); }
-+#define nand_wait() { while(!(NFSTAT & 0x4)); } /* RnB_TransDectect */
-+
-+#endif
-+
-+#define NFCMD __REGb(NF_BASE + oNFCMD)
-+#define NFADDR __REGb(NF_BASE + oNFADDR)
-+#define NFDATA __REGb(NF_BASE + oNFDATA)
-+#define NFSTAT __REGb(NF_BASE + oNFSTAT)
-+
-+
- static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd)
- {
- struct nand_chip *chip = mtd->priv;
-@@ -62,23 +92,31 @@
-
- switch (cmd) {
- case NAND_CTL_SETNCE:
-- NFCONF &= ~S3C2410_NFCONF_nFCE;
-+#if defined(CONFIG_S3C2410)
-+ NFCONF &= ~NFCONF_nFCE;
-+#elif defined(CONFIG_S3C2440)
-+ NFCONT &= ~NFCONF_nFCE;
-+#endif
- DEBUGN("NFCONF=0x%08x\n", NFCONF);
- break;
- case NAND_CTL_CLRNCE:
-- NFCONF |= S3C2410_NFCONF_nFCE;
-+#if defined(CONFIG_S3C2410)
-+ NFCONF |= NFCONF_nFCE;
-+#elif defined(CONFIG_S3C2440)
-+ NFCONT &= ~NFCONF_nFCE;
-+#endif
- DEBUGN("NFCONF=0x%08x\n", NFCONF);
- break;
- case NAND_CTL_SETALE:
-- chip->IO_ADDR_W = NF_BASE + 0x8;
-+ chip->IO_ADDR_W = NF_BASE + oNFADDR;
- DEBUGN("SETALE\n");
- break;
- case NAND_CTL_SETCLE:
-- chip->IO_ADDR_W = NF_BASE + 0x4;
-+ chip->IO_ADDR_W = NF_BASE + oNFCMD;
- DEBUGN("SETCLE\n");
- break;
- default:
-- chip->IO_ADDR_W = NF_BASE + 0xc;
-+ chip->IO_ADDR_W = NF_BASE + oNFDATA;
- break;
- }
- return;
-@@ -180,16 +218,21 @@
- /* initialize hardware */
- twrph0 = 3; twrph1 = 0; tacls = 0;
-
-+#if defined(CONFIG_S3C2410)
- cfg = S3C2410_NFCONF_EN;
- cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
- cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
- cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
-
- NFCONF = cfg;
-- //NFCONF = 0xf842;
-+#elif defined(CONFIG_S3C2440)
-+ twrph0 = 7; twrph1 = 7; tacls = 7;
-+ NFCONF = (tacls<<12)|(twrph0<<8)|(twrph1<<4)|(0<<0);
-+ NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
-+#endif
-
- /* initialize nand_chip data structure */
-- nand->IO_ADDR_R = nand->IO_ADDR_W = 0x4e00000c;
-+ nand->IO_ADDR_R = nand->IO_ADDR_W = NF_BASE + oNFDATA;
-
- /* read_buf and write_buf are default */
- /* read_byte and write_byte are default */
-@@ -214,12 +257,23 @@
- nand->options = 0;
- #endif
-
-+#if defined(CONFIG_S3C2440)
-+/*
-+ nand_select();
-+ nand_clear_RnB();
-+ NFCMD = NAND_CMD_RESET;
-+ { volatile int i; for (i = 0; i < 10; i ++); }
-+ nand_detect_RB();
-+ nand_deselect();
-+*/
-+#endif
-+
- DEBUGN("end of nand_init\n");
-
- return 0;
- }
-
- #else
-- #error "U-Boot legacy NAND support not available for S3C2410"
-+ #error "U-Boot legacy NAND support not available for S3C24xx"
- #endif
- #endif
-Index: u-boot/cpu/arm920t/s3c24x0/mmc.c
-===================================================================
---- u-boot.orig/cpu/arm920t/s3c24x0/mmc.c
-+++ u-boot/cpu/arm920t/s3c24x0/mmc.c
-@@ -137,6 +137,9 @@
- dcon |= S3C2410_SDIDCON_RXAFTERCMD|S3C2410_SDIDCON_XFER_RXSTART;
- if (wide)
- dcon |= S3C2410_SDIDCON_WIDEBUS;
-+#if defined(CONFIG_S3C2440)
-+ dcon |= S3C2440_SDIDCON_DS_WORD | S3C2440_SDIDCON_DATSTART;
-+#endif
- sdi->SDIDCON = dcon;
-
- /* send read command */
-@@ -394,13 +397,18 @@
-
- clk_power->CLKCON |= (1 << 9);
-
-+ sdi->SDIBSIZE = 512;
-+#if defined(CONFIG_S3C2410)
- /* S3C2410 has some bug that prevents reliable operation at higher speed */
- //sdi->SDIPRE = 0x3e; /* SDCLK = PCLK/2 / (SDIPRE+1) = 396kHz */
-- sdi->SDIPRE = 0x02; /* SDCLK = PCLK/2 / (SDIPRE+1) = 396kHz */
-- sdi->SDIBSIZE = 512;
-+ sdi->SDIPRE = 0x02; /* 2410: SDCLK = PCLK/2 / (SDIPRE+1) = 11MHz */
- sdi->SDIDTIMER = 0xffff;
-+#elif defined(CONFIG_S3C2440)
-+ sdi->SDIPRE = 0x05; /* 2410: SDCLK = PCLK / (SDIPRE+1) = 11MHz */
-+ sdi->SDIDTIMER = 0x7fffff;
-+#endif
- sdi->SDIIMSK = 0x0;
-- sdi->SDICON = S3C2410_SDICON_FIFORESET|S3C2440_SDICON_MMCCLOCK;
-+ sdi->SDICON = S3C2410_SDICON_FIFORESET|S3C2410_SDICON_CLOCKTYPE;
- udelay(125000); /* FIXME: 74 SDCLK cycles */
-
- mmc_csd.c_size = 0;