#ifndef __S3C2440_H__ #define __S3C2440_H__ #define S3C2440_UART_CHANNELS 3 #define S3C2440_SPI_CHANNELS 2 /* Memory controller (see manual chapter 5) */ struct s3c2440_memctl { volatile unsigned int BWSCON; volatile unsigned int BANKCON[8]; volatile unsigned int REFRESH; volatile unsigned int BANKSIZE; volatile unsigned int MRSRB6; volatile unsigned int MRSRB7; }; /* USB HOST (see manual chapter 12) */ struct s3c2440_usb_host { volatile unsigned int HcRevision; volatile unsigned int HcControl; volatile unsigned int HcCommonStatus; volatile unsigned int HcInterruptStatus; volatile unsigned int HcInterruptEnable; volatile unsigned int HcInterruptDisable; volatile unsigned int HcHCCA; volatile unsigned int HcPeriodCuttendED; volatile unsigned int HcControlHeadED; volatile unsigned int HcControlCurrentED; volatile unsigned int HcBulkHeadED; volatile unsigned int HcBuldCurrentED; volatile unsigned int HcDoneHead; volatile unsigned int HcRmInterval; volatile unsigned int HcFmRemaining; volatile unsigned int HcFmNumber; volatile unsigned int HcPeriodicStart; volatile unsigned int HcLSThreshold; volatile unsigned int HcRhDescriptorA; volatile unsigned int HcRhDescriptorB; volatile unsigned int HcRhStatus; volatile unsigned int HcRhPortStatus1; volatile unsigned int HcRhPortStatus2; }; /* INTERRUPT (see manual chapter 14) */ struct s3c2440_interrupt { volatile unsigned int SRCPND; volatile unsigned int INTMOD; volatile unsigned int INTMSK; volatile unsigned int PRIORITY; volatile unsigned int INTPND; volatile unsigned int INTOFFSET; volatile unsigned int SUBSRCPND; volatile unsigned int INTSUBMSK; }; /* DMAS (see manual chapter 8) */ struct s3c2440_dma { volatile unsigned int DISRC; volatile unsigned int DISRCC; volatile unsigned int DIDST; volatile unsigned int DIDSTC; volatile unsigned int DCON; volatile unsigned int DSTAT; volatile unsigned int DCSRC; volatile unsigned int DCDST; volatile unsigned int DMASKTRIG; volatile unsigned int res[7]; }; struct s3c2440_dmas { struct s3c2440_dma dma[4]; }; struct s3c2440_clock_power { volatile unsigned int LOCKTIME; volatile unsigned int MPLLCON; volatile unsigned int UPLLCON; volatile unsigned int CLKCON; volatile unsigned int CLKSLOW; volatile unsigned int CLKDIVN; volatile unsigned int CAMDIVN; }; /* LCD CONTROLLER (see manual chapter 15) */ struct s3c2440_lcd { volatile unsigned int LCDCON1; volatile unsigned int LCDCON2; volatile unsigned int LCDCON3; volatile unsigned int LCDCON4; volatile unsigned int LCDCON5; volatile unsigned int LCDSADDR1; volatile unsigned int LCDSADDR2; volatile unsigned int LCDSADDR3; volatile unsigned int REDLUT; volatile unsigned int GREENLUT; volatile unsigned int BLUELUT; volatile unsigned int res[8]; volatile unsigned int DITHMODE; volatile unsigned int TPAL; volatile unsigned int LCDINTPND; volatile unsigned int LCDSRCPND; volatile unsigned int LCDINTMSK; volatile unsigned int TCONSEL; }; /* NAND FLASH (see S3C2440 manual chapter 6) */ struct s3c2440_nand { volatile unsigned int NFCONF; volatile unsigned int NFCONT; volatile unsigned int NFCMD; volatile unsigned int NFADDR; volatile unsigned int NFDATA; volatile unsigned int NFMECCD0; volatile unsigned int NFMECCD1; volatile unsigned int NFSECCD; volatile unsigned int NFSTAT; volatile unsigned int NFESTAT0; volatile unsigned int NFESTAT1; volatile unsigned int NFMECC0; volatile unsigned int NFMECC1; volatile unsigned int NFSECC; volatile unsigned int NFSBLK; volatile unsigned int NFEBLK; }; /* UART (see manual chapter 11) */ struct s3c2440_uart { volatile unsigned int ULCON; volatile unsigned int UCON; volatile unsigned int UFCON; volatile unsigned int UMCON; volatile unsigned int UTRSTAT; volatile unsigned int UERSTAT; volatile unsigned int UFSTAT; volatile unsigned int UMSTAT; #ifdef __BIG_ENDIAN volatile unsigned char res1[3]; volatile unsigned char UTXH; volatile unsigned char res2[3]; volatile unsigned char URXH; #else /* Little Endian */ volatile unsigned char UTXH; volatile unsigned char res1[3]; volatile unsigned char URXH; volatile unsigned char res2[3]; #endif volatile unsigned int UBRDIV; }; /* PWM TIMER (see manual chapter 10) */ struct s3c2440_timer { volatile unsigned int TCNTB; volatile unsigned int TCMPB; volatile unsigned int TCNTO; }; struct s3c2440_timers { volatile unsigned int TCFG0; volatile unsigned int TCFG1; volatile unsigned int TCON; struct s3c2440_timer ch[4]; volatile unsigned int TCNTB4; volatile unsigned int TCNTO4; }; /* USB DEVICE (see manual chapter 13) */ struct s3c2440_usb_dev_fifos { #ifdef __BIG_ENDIAN volatile unsigned char res[3]; volatile unsigned char EP_FIFO_REG; #else /* little endian */ volatile unsigned char EP_FIFO_REG; volatile unsigned char res[3]; #endif }; struct s3c2440_usb_dev_dmas { #ifdef __BIG_ENDIAN volatile unsigned char res1[3]; volatile unsigned char EP_DMA_CON; volatile unsigned char res2[3]; volatile unsigned char EP_DMA_UNIT; volatile unsigned char res3[3]; volatile unsigned char EP_DMA_FIFO; volatile unsigned char res4[3]; volatile unsigned char EP_DMA_TTC_L; volatile unsigned char res5[3]; volatile unsigned char EP_DMA_TTC_M; volatile unsigned char res6[3]; volatile unsigned char EP_DMA_TTC_H; #else /* little endian */ volatile unsigned char EP_DMA_CON; volatile unsigned char res1[3]; volatile unsigned char EP_DMA_UNIT; volatile unsigned char res2[3]; volatile unsigned char EP_DMA_FIFO; volatile unsigned char res3[3]; volatile unsigned char EP_DMA_TTC_L; volatile unsigned char res4[3]; volatile unsigned char EP_DMA_TTC_M; volatile unsigned char res5[3]; volatile unsigned char EP_DMA_TTC_H; volatile unsigned char res6[3]; #endif }; struct s3c2440_usb_device { #ifdef __BIG_ENDIAN volatile unsigned char res1[3]; volatile unsigned char FUNC_ADDR_REG; volatile unsigned char res2[3]; volatile unsigned char PWR_REG; volatile unsigned char res3[3]; volatile unsigned char EP_INT_REG; volatile unsigned char res4[15]; volatile unsigned char USB_INT_REG; volatile unsigned char res5[3]; volatile unsigned char EP_INT_EN_REG; volatile unsigned char res6[15]; volatile unsigned char USB_INT_EN_REG; volatile unsigned char res7[3]; volatile unsigned char FRAME_NUM1_REG; volatile unsigned char res8[3]; volatile unsigned char FRAME_NUM2_REG; volatile unsigned char res9[3]; volatile unsigned char INDEX_REG; volatile unsigned char res10[7]; volatile unsigned char MAXP_REG; volatile unsigned char res11[3]; volatile unsigned char EP0_CSR_IN_CSR1_REG; volatile unsigned char res12[3]; volatile unsigned char IN_CSR2_REG; volatile unsigned char res13[7]; volatile unsigned char OUT_CSR1_REG; volatile unsigned char res14[3]; volatile unsigned char OUT_CSR2_REG; volatile unsigned char res15[3]; volatile unsigned char OUT_FIFO_CNT1_REG; volatile unsigned char res16[3]; volatile unsigned char OUT_FIFO_CNT2_REG; #else /* little endian */ volatile unsigned char FUNC_ADDR_REG; volatile unsigned char res1[3]; volatile unsigned char PWR_REG; volatile unsigned char res2[3]; volatile unsigned char EP_INT_REG; volatile unsigned char res3[15]; volatile unsigned char USB_INT_REG; volatile unsigned char res4[3]; volatile unsigned char EP_INT_EN_REG; volatile unsigned char res5[15]; volatile unsigned char USB_INT_EN_REG; volatile unsigned char res6[3]; volatile unsigned char FRAME_NUM1_REG; volatile unsigned char res7[3]; volatile unsigned char FRAME_NUM2_REG; volatile unsigned char res8[3]; volatile unsigned char INDEX_REG; volatile unsigned char res9[7]; volatile unsigned char MAXP_REG; volatile unsigned char res10[7]; volatile unsigned char EP0_CSR_IN_CSR1_REG; volatile unsigned char res11[3]; volatile unsigned char IN_CSR2_REG; volatile unsigned char res12[3]; volatile unsigned char OUT_CSR1_REG; volatile unsigned char res13[7]; volatile unsigned char OUT_CSR2_REG; volatile unsigned char res14[3]; volatile unsigned char OUT_FIFO_CNT1_REG; volatile unsigned char res15[3]; volatile unsigned char OUT_FIFO_CNT2_REG; volatile unsigned char res16[3]; #endif /* __BIG_ENDIAN */ struct s3c2440_usb_dev_fifos fifo[5]; struct s3c2440_usb_dev_dmas dma[5]; }; /* WATCH DOG TIMER (see manual chapter 18) */ struct s3c2440_watchdog { volatile unsigned int WTCON; volatile unsigned int WTDAT; volatile unsigned int WTCNT; }; /* IIC (see manual chapter 20) */ struct s3c2440_i2c { volatile unsigned int IICCON; volatile unsigned int IICSTAT; volatile unsigned int IICADD; volatile unsigned int IICDS; }; /* IIS (see manual chapter 21) */ struct s3c2440_i2s { #ifdef __BIG_ENDIAN volatile unsigned short res1; volatile unsigned short IISCON; volatile unsigned short res2; volatile unsigned short IISMOD; volatile unsigned short res3; volatile unsigned short IISPSR; volatile unsigned short res4; volatile unsigned short IISFCON; volatile unsigned short res5; volatile unsigned short IISFIFO; #else /* little endian */ volatile unsigned short IISCON; volatile unsigned short res1; volatile unsigned short IISMOD; volatile unsigned short res2; volatile unsigned short IISPSR; volatile unsigned short res3; volatile unsigned short IISFCON; volatile unsigned short res4; volatile unsigned short IISFIFO; volatile unsigned short res5; #endif }; /* I/O PORT (see manual chapter 9) */ struct s3c2440_gpio { volatile unsigned int GPACON; volatile unsigned int GPADAT; volatile unsigned int res1[2]; volatile unsigned int GPBCON; volatile unsigned int GPBDAT; volatile unsigned int GPBUP; volatile unsigned int res2; volatile unsigned int GPCCON; volatile unsigned int GPCDAT; volatile unsigned int GPCUP; volatile unsigned int res3; volatile unsigned int GPDCON; volatile unsigned int GPDDAT; volatile unsigned int GPDUP; volatile unsigned int res4; volatile unsigned int GPECON; volatile unsigned int GPEDAT; volatile unsigned int GPEUP; volatile unsigned int res5; volatile unsigned int GPFCON; volatile unsigned int GPFDAT; volatile unsigned int GPFUP; volatile unsigned int res6; volatile unsigned int GPGCON; volatile unsigned int GPGDAT; volatile unsigned int GPGUP; volatile unsigned int res7; volatile unsigned int GPHCON; volatile unsigned int GPHDAT; volatile unsigned int GPHUP; volatile unsigned int res8; volatile unsigned int MISCCR; volatile unsigned int DCLKCON; volatile unsigned int EXTINT0; volatile unsigned int EXTINT1; volatile unsigned int EXTINT2; volatile unsigned int EINTFLT0; volatile unsigned int EINTFLT1; volatile unsigned int EINTFLT2; volatile unsigned int EINTFLT3; volatile unsigned int EINTMASK; volatile unsigned int EINTPEND; volatile unsigned int GSTATUS0; volatile unsigned int GSTATUS1; volatile unsigned int GSTATUS2; volatile unsigned int GSTATUS3; volatile unsigned int GSTATUS4; }; /* RTC (see manual chapter 17) */ struct s3c2440_rtc { #ifdef __BIG_ENDIAN volatile unsigned char res1[67]; volatile unsigned char RTCCON; volatile unsigned char res2[3]; volatile unsigned char TICNT; volatile unsigned char res3[11]; volatile unsigned char RTCALM; volatile unsigned char res4[3]; volatile unsigned char ALMSEC; volatile unsigned char res5[3]; volatile unsigned char ALMMIN; volatile unsigned char res6[3]; volatile unsigned char ALMHOUR; volatile unsigned char res7[3]; volatile unsigned char ALMDATE; volatile unsigned char res8[3]; volatile unsigned char ALMMON; volatile unsigned char res9[3]; volatile unsigned char ALMYEAR; volatile unsigned char res10[3]; volatile unsigned char RTCRST; volatile unsigned char res11[3]; volatile unsigned char BCDSEC; volatile unsigned char res12[3]; volatile unsigned char BCDMIN; volatile unsigned char res13[3]; volatile unsigned char BCDHOUR; volatile unsigned char res14[3]; volatile unsigned char BCDDATE; volatile unsigned char res15[3]; volatile unsigned char BCDDAY; volatile unsigned char res16[3]; volatile unsigned char BCDMON; volatile unsigned char res17[3]; volatile unsigned char BCDYEAR; #else /* little endian */ volatile unsigned char res0[64]; volatile unsigned char RTCCON; volatile unsigned char res1[3]; volatile unsigned char TICNT; volatile unsigned char res2[11]; volatile unsigned char RTCALM; volatile unsigned char res3[3]; volatile unsigned char ALMSEC; volatile unsigned char res4[3]; volatile unsigned char ALMMIN; volatile unsigned char res5[3]; volatile unsigned char ALMHOUR; volatile unsigned char res6[3]; volatile unsigned char ALMDATE; volatile unsigned char res7[3]; volatile unsigned char ALMMON; volatile unsigned char res8[3]; volatile unsigned char ALMYEAR; volatile unsigned char res9[3]; volatile unsigned char RTCRST; volatile unsigned char res10[3]; volatile unsigned char BCDSEC; volatile unsigned char res11[3]; volatile unsigned char BCDMIN; volatile unsigned char res12[3]; volatile unsigned char BCDHOUR; volatile unsigned char res13[3]; volatile unsigned char BCDDATE; volatile unsigned char res14[3]; volatile unsigned char BCDDAY; volatile unsigned char res15[3]; volatile unsigned char BCDMON; volatile unsigned char res16[3]; volatile unsigned char BCDYEAR; volatile unsigned char res17[3]; #endif }; /* ADC (see manual chapter 16) */ struct s3c2440_adc { volatile unsigned int ADCCON; volatile unsigned int ADCTSC; volatile unsigned int ADCDLY; volatile unsigned int ADCDAT0; volatile unsigned int ADCDAT1; volatile unsigned int ADCUPDN; }; /* SPI (see manual chapter 22) */ struct s3c2440_spi_channel { volatile unsigned char SPCON; volatile unsigned char res1[3]; volatile unsigned char SPSTA; volatile unsigned char res2[3]; volatile unsigned char SPPIN; volatile unsigned char res3[3]; volatile unsigned char SPPRE; volatile unsigned char res4[3]; volatile unsigned char SPTDAT; volatile unsigned char res5[3]; volatile unsigned char SPRDAT; volatile unsigned char res6[3]; volatile unsigned char res7[16]; }; struct s3c2440_spi { struct s3c2440_spi_channel ch[S3C2440_SPI_CHANNELS]; }; struct s3c2440_sdi { volatile unsigned int SDICON; volatile unsigned int SDIPRE; volatile unsigned int SDICARG; volatile unsigned int SDICCON; volatile unsigned int SDICSTA; volatile unsigned int SDIRSP0; volatile unsigned int SDIRSP1; volatile unsigned int SDIRSP2; volatile unsigned int SDIRSP3; volatile unsigned int SDIDTIMER; volatile unsigned int SDIBSIZE; volatile unsigned int SDIDCON; volatile unsigned int SDIDCNT; volatile unsigned int SDIDSTA; volatile unsigned int SDIFSTA; #ifdef __BIG_ENDIAN volatile unsigned char res[3]; volatile unsigned char SDIDAT; #else volatile unsigned char SDIDAT; volatile unsigned char res[3]; #endif volatile unsigned int SDIIMSK; }; /* S3C2440 only supports 512 Byte HW ECC */ #define S3C2440_ECCSIZE 512 #define S3C2440_ECCBYTES 3 enum s3c2440_uarts_nr { S3C2440_UART0 = 0, S3C2440_UART1 = 1, S3C2440_UART2 = 2 }; /* S3C2440 device base addresses */ #define S3C2440_MEMCTL_BASE 0x48000000 #define S3C2440_USB_HOST_BASE 0x49000000 #define S3C2440_INTERRUPT_BASE 0x4A000000 #define S3C2440_DMA_BASE 0x4B000000 #define S3C2440_CLOCK_POWER_BASE 0x4C000000 #define S3C2440_LCD_BASE 0x4D000000 #define S3C2440_NAND_BASE 0x4E000000 #define S3C2440_UART_BASE 0x50000000 #define S3C2440_TIMER_BASE 0x51000000 #define S3C2440_USB_DEVICE_BASE 0x52000140 #define S3C2440_WATCHDOG_BASE 0x53000000 #define S3C2440_I2C_BASE 0x54000000 #define S3C2440_I2S_BASE 0x55000000 #define S3C2440_GPIO_BASE 0x56000000 #define S3C2440_RTC_BASE 0x57000000 #define S3C2440_ADC_BASE 0x58000000 #define S3C2440_SPI_BASE 0x59000000 #define S3C2440_SDI_BASE 0x5A000000 static inline struct s3c2440_memctl *s3c2440_get_base_memctl(void) { return (struct s3c2440_memctl *)S3C2440_MEMCTL_BASE; } static inline struct s3c2440_usb_host *s3c2440_get_base_usb_host(void) { return (struct s3c2440_usb_host *)S3C2440_USB_HOST_BASE; } static inline struct s3c2440_interrupt *s3c2440_get_base_interrupt(void) { return (struct s3c2440_interrupt *)S3C2440_INTERRUPT_BASE; } static inline struct s3c2440_dmas *s3c2440_get_base_dmas(void) { return (struct s3c2440_dmas *)S3C2440_DMA_BASE; } static inline struct s3c2440_clock_power *s3c2440_get_base_clock_power(void) { return (struct s3c2440_clock_power *)S3C2440_CLOCK_POWER_BASE; } static inline struct s3c2440_lcd *s3c2440_get_base_lcd(void) { return (struct s3c2440_lcd *)S3C2440_LCD_BASE; } static inline struct s3c2440_nand *s3c2440_get_base_nand(void) { return (struct s3c2440_nand *)S3C2440_NAND_BASE; } static inline struct s3c2440_uart *s3c2440_get_base_uart(enum s3c2440_uarts_nr n) { return (struct s3c2440_uart *)(S3C2440_UART_BASE + (n * 0x4000)); } static inline struct s3c2440_timers *s3c2440_get_base_timers(void) { return (struct s3c2440_timers *)S3C2440_TIMER_BASE; } static inline struct s3c2440_usb_device *s3c2440_get_base_usb_device(void) { return (struct s3c2440_usb_device *)S3C2440_USB_DEVICE_BASE; } static inline struct s3c2440_watchdog *s3c2440_get_base_watchdog(void) { return (struct s3c2440_watchdog *)S3C2440_WATCHDOG_BASE; } static inline struct s3c2440_i2c *s3c2440_get_base_i2c(void) { return (struct s3c2440_i2c *)S3C2440_I2C_BASE; } static inline struct s3c2440_i2s *s3c2440_get_base_i2s(void) { return (struct s3c2440_i2s *)S3C2440_I2S_BASE; } static inline struct s3c2440_gpio *s3c2440_get_base_gpio(void) { return (struct s3c2440_gpio *)S3C2440_GPIO_BASE; } static inline struct s3c2440_rtc *s3c2440_get_base_rtc(void) { return (struct s3c2440_rtc *)S3C2440_RTC_BASE; } static inline struct s3c2440_adc *s3c2440_get_base_adc(void) { return (struct s3c2440_adc *)S3C2440_ADC_BASE; } static inline struct s3c2440_spi *s3c2440_get_base_spi(void) { return (struct s3c2440_spi *)S3C2440_SPI_BASE; } static inline struct s3c2440_sdi *s3c2440_get_base_sdi(void) { return (struct s3c2440_sdi *)S3C2440_SDI_BASE; } #endif /*__S3C2440_H__*/