/*++

Copyright (c) 2015 Minoca Corp. All Rights Reserved

Module Name:

    rk32xx.h

Abstract:

    This header contains definitions for the Rockchip 32xx SoC.

Author:

    Chris Stevens 30-Jul-2015

--*/

//
// ------------------------------------------------------------------- Includes
//

//
// --------------------------------------------------------------------- Macros
//

//
// This macro computes a PLL clock frequency based on an input frequency of
// 24MHz and the formula given in section 3.9.1. PLL Usage of the RK3288 TRM.
//

#define RK32_CRU_PLL_COMPUTE_CLOCK_FREQUENCY(_Nf, _Nr, _No) \
    ((24 * (_Nf)) / ((_Nr) * (_No))) * 1000000

//
// ---------------------------------------------------------------- Definitions
//

//
// Define the number of timers in the SoC.
//

#define RK32_TIMER_COUNT 8

//
// Define the RK3288 register base map.
//

#define RK32_SD_BASE 0xFF0C0000
#define RK32_EMMC_BASE 0xFF0F0000
#define RK32_I2C_PMU_BASE 0xFF650000
#define RK32_TIMER0_5_BASE 0xFF6B0000
#define RK32_UART_DEBUG_BASE 0xFF690000
#define RK32_SRAM_BASE 0xFF700000
#define RK32_PMU_BASE 0xFF730000
#define RK32_GPIO0_BASE 0xFF750000
#define RK32_CRU_BASE 0xFF760000
#define RK32_GRF_BASE 0xFF770000
#define RK32_GPIO7_BASE 0xFF7E0000
#define RK32_WATCHDOG_BASE 0xFF800000
#define RK32_TIMER6_7_BASE 0xFF810000
#define RK32_VOP_BIG_BASE 0xFF930000
#define RK32_VOP_LITTLE_BASE 0xFF940000
#define RK32_GIC_DISTRIBUTOR_BASE 0xFFC01000
#define RK32_GIC_CPU_INTERFACE_BASE 0xFFC02000

#define RK32_I2C_PMU_SIZE 0x1000
#define RK32_GPIO0_SIZE 0x1000

//
// Define the RK3288 interrupt map.
//

#define RK32_INTERRUPT_USBOTG 55
#define RK32_INTERRUPT_EHCI   56
#define RK32_INTERRUPT_SDMMC  64
#define RK32_INTERRUPT_EMMC   67
#define RK32_INTERRUPT_OHCI   73
#define RK32_INTERRUPT_TIMER0 98
#define RK32_INTERRUPT_TIMER1 99
#define RK32_INTERRUPT_TIMER2 100
#define RK32_INTERRUPT_TIMER3 101
#define RK32_INTERRUPT_TIMER4 102
#define RK32_INTERRUPT_TIMER5 103
#define RK32_INTERRUPT_TIMER6 104
#define RK32_INTERRUPT_TIMER7 105

//
// Define the RK32 watchdog range.
//

#define RK32_WATCHDOG_MIN 0x0000FFFF
#define RK32_WATCHDOG_MAX 0x7FFFFFFF

//
// Define timer parameters.
//

#define RK32_TIMER_FREQUENCY 24000000
#define RK32_TIMER_REGISTER_STRIDE 0x00000020

//
// Define generic PLL register bits, organized by configuration register.
//

#define RK32_PLL_CONFIGURATION0_NR_MASK  (0x3F << 8)
#define RK32_PLL_CONFIGURATION0_NR_SHIFT 8
#define RK32_PLL_CONFIGURATION0_OD_MASK  (0xF << 0)
#define RK32_PLL_CONFIGURATION0_OD_SHIFT 0

#define RK32_PLL_CONFIGURATION1_NF_MASK  (0x1FFF << 0)
#define RK32_PLL_CONFIGURATION1_NF_SHIFT 0

#define RK32_PLL_CONFIGURATION2_BWADJ_MASK  (0xFFF << 0)
#define RK32_PLL_CONFIGURATION2_BWADJ_SHIFT 0

#define RK32_PLL_CONFIGURATION3_RESET (1 << 5)

//
// Define the CRU codec PLL control 0 register bits.
//

#define RK32_CRU_CODEC_PLL_CONTROL0_PROTECT_SHIFT 16
#define RK32_CRU_CODEC_PLL_CONTROL0_CLKR_MASK     (0x3F << 8)
#define RK32_CRU_CODEC_PLL_CONTROL0_CLKR_SHIFT    8
#define RK32_CRU_CODEC_PLL_CONTROL0_CLKOD_MASK    (0xF << 0)
#define RK32_CRU_CODEC_PLL_CONTROL0_CLKOD_SHIFT   0

//
// Define the CRU codec PLL control 1 register bits.
//

#define RK32_CRU_CODEC_PLL_CONTROL1_LOCK       (1 << 31)
#define RK32_CRU_CODEC_PLL_CONTROL1_CLKF_MASK  (0x1FFF << 0)
#define RK32_CRU_CODEC_PLL_CONTROL1_CLKF_SHIFT 0

//
// Define the CRU general PLL control 0 register bits.
//

#define RK32_CRU_GENERAL_PLL_CONTROL0_PROTECT_SHIFT 16
#define RK32_CRU_GENERAL_PLL_CONTROL0_CLKR_MASK     (0x3F << 8)
#define RK32_CRU_GENERAL_PLL_CONTROL0_CLKR_SHIFT    8
#define RK32_CRU_GENERAL_PLL_CONTROL0_CLKOD_MASK    (0xF << 0)
#define RK32_CRU_GENERAL_PLL_CONTROL0_CLKOD_SHIFT   0

//
// Define the CRU general PLL control 1 register bits.
//

#define RK32_CRU_GENERAL_PLL_CONTROL1_LOCK       (1 << 31)
#define RK32_CRU_GENERAL_PLL_CONTROL1_CLKF_MASK  (0x1FFF << 0)
#define RK32_CRU_GENERAL_PLL_CONTROL1_CLKF_SHIFT 0

//
// Define the PLL clock mode frequencies.
//

#define RK32_CRU_PLL_SLOW_MODE_FREQUENCY 24000000
#define RK32_CRU_PLL_DEEP_SLOW_MODE_FREQUENCY 32768

//
// Define the three mode values for the CRU mode control register.
//

#define RK32_CRU_MODE_CONTROL_SLOW_MODE 0
#define RK32_CRU_MODE_CONTROL_NORMAL_MODE 1
#define RK32_CRU_MODE_CONTROL_DEEP_SLOW_MODE 2

//
// Define the CRU mode control register bits.
//

#define RK32_CRU_MODE_CONTROL_PROTECT_SHIFT          16
#define RK32_CRU_MODE_CONTROL_NEW_PLL_MODE_MASK      (0x3 << 14)
#define RK32_CRU_MODE_CONTROL_NEW_PLL_MODE_SHIFT     14
#define RK32_CRU_MODE_CONTROL_GENERAL_PLL_MODE_MASK  (0x3 << 12)
#define RK32_CRU_MODE_CONTROL_GENERAL_PLL_MODE_SHIFT 12
#define RK32_CRU_MODE_CONTROL_CODEC_PLL_MODE_MASK    (0x3 << 8)
#define RK32_CRU_MODE_CONTROL_CODEC_PLL_MODE_SHIFT   8
#define RK32_CRU_MODE_CONTROL_DDR_PLL_MODE_MASK      (0x3 << 4)
#define RK32_CRU_MODE_CONTROL_DDR_PLL_MODE_SHIFT     4
#define RK32_CRU_MODE_CONTROL_ARM_PLL_MODE_SLOW      (0x0 << 0)
#define RK32_CRU_MODE_CONTROL_ARM_PLL_MODE_NORMAL    (0x1 << 0)
#define RK32_CRU_MODE_CONTROL_ARM_PLL_MODE_DEEP_SLOW (0x2 << 0)
#define RK32_CRU_MODE_CONTROL_ARM_PLL_MODE_MASK      (0x3 << 0)
#define RK32_CRU_MODE_CONTROL_ARM_PLL_MODE_SHIFT     0

//
// Define the CRU clock select 1 register bits.
//

#define RK32_CRU_CLOCK_SELECT1_PROTECT_SHIFT       16
#define RK32_CRU_CLOCK_SELECT1_GENERAL_PLL         (1 << 15)
#define RK32_CRU_CLOCK_SELECT1_PCLK_DIVIDER_MASK   (0x7 << 12)
#define RK32_CRU_CLOCK_SELECT1_PCLK_DIVIDER_SHIFT  12
#define RK32_CRU_CLOCK_SELECT1_HCLK_DIVIDER_MASK   (0x3 << 8)
#define RK32_CRU_CLOCK_SELECT1_HCLK_DIVIDER_SHIFT  8
#define RK32_CRU_CLOCK_SELECT1_ACLK_DIVIDER_MASK   (0x1F << 3)
#define RK32_CRU_CLOCK_SELECT1_ACLK_DIVIDER_SHIFT  3
#define RK32_CRU_CLOCK_SELECT1_ACLK_DIVIDER1_MASK  (0x7 << 0)
#define RK32_CRU_CLOCK_SELECT1_ACLK_DIVIDER1_SHIFT 0

//
// Define the CRU clock select 11 register bits.
//

#define RK32_CRU_CLOCK_SELECT11_PROTECT_SHIFT           16
#define RK32_CRU_CLOCK_SELECT11_HSIC_PHY_DIVIDER_MASK   (0x3F << 8)
#define RK32_CRU_CLOCK_SELECT11_HSIC_PHY_DIVIDER_SHIFT  8
#define RK32_CRU_CLOCK_SELECT11_MMC0_CODEC_PLL          0
#define RK32_CRU_CLOCK_SELECT11_MMC0_GENERAL_PLL        1
#define RK32_CRU_CLOCK_SELECT11_MMC0_24MHZ              2
#define RK32_CRU_CLOCK_SELECT11_MMC0_CLOCK_MASK         (0x3 << 6)
#define RK32_CRU_CLOCK_SELECT11_MMC0_CLOCK_SHIFT        6
#define RK32_CRU_CLOCK_SELECT11_MMC0_DIVIDER_MASK       (0x3F << 0)
#define RK32_CRU_CLOCK_SELECT11_MMC0_DIVIDER_SHIFT      0

//
// Define CRU clock select 12 register bits.
//

#define RK32_CRU_CLOCK_SELECT12_EMMC_CODEC_PLL          0
#define RK32_CRU_CLOCK_SELECT12_EMMC_GENERAL_PLL        1
#define RK32_CRU_CLOCK_SELECT12_EMMC_24MHZ              2
#define RK32_CRU_CLOCK_SELECT12_EMMC_CLOCK_SHIFT        14
#define RK32_CRU_CLOCK_SELECT12_EMMC_DIVIDER_SHIFT      8
#define RK32_CRU_CLOCK_SELECT12_EMMC_CLOCK_MASK         (0x3 << 14)
#define RK32_CRU_CLOCK_SELECT12_EMMC_DIVIDER_MASK       (0x3F << 8)
#define RK32_CRU_CLOCK_SELECT12_PROTECT_SHIFT           16

//
// Define the CRU clock select 33 register bits.
//

#define RK32_CRU_CLOCK_SELECT33_PROTECT_SHIFT            16
#define RK32_CRU_CLOCK_SELECT33_ALIVE_PCLK_DIVIDER_MASK  (0x1F << 8)
#define RK32_CRU_CLOCK_SELECT33_ALIVE_PCLK_DIVIDER_SHIFT 8
#define RK32_CRU_CLOCK_SELECT33_PMU_PCLK_DIVIDER_MASK    (0x1F << 0)
#define RK32_CRU_CLOCK_SELECT33_PMU_PCLK_DIVIDER_SHIFT   0

//
// Define generic CRU clock select value for SD/eMMC.
//

#define RK32_CRU_MAX_MMC_DIVISOR 0x3F

#define RK32_CRU_CLOCK_SELECT_PROTECT_SHIFT      16
#define RK32_CRU_CLOCK_SELECT_CODEC_PLL          0
#define RK32_CRU_CLOCK_SELECT_GENERAL_PLL        1
#define RK32_CRU_CLOCK_SELECT_24MHZ              2
#define RK32_CRU_CLOCK_SELECT_CLOCK_MASK         (0x3 << 6)
#define RK32_CRU_CLOCK_SELECT_CLOCK_SHIFT        6
#define RK32_CRU_CLOCK_SELECT_DIVIDER_MASK       (0x3F << 0)
#define RK32_CRU_CLOCK_SELECT_DIVIDER_SHIFT      0

//
// Define CRU global reset values.
//

#define RK32_GLOBAL_RESET1_VALUE 0x0000FDB9
#define RK32_GLOBAL_RESET2_VALUE 0x0000ECA8

//
// Define CRU soft reset 0 register bits.
//

#define RK32_CRU_SOFT_RESET0_PROTECT_SHIFT 16
#define RK32_CRU_SOFT_RESET0_CORE0 0x00000001
#define RK32_CRU_SOFT_RESET0_CORE1 0x00000002
#define RK32_CRU_SOFT_RESET0_CORE2 0x00000004
#define RK32_CRU_SOFT_RESET0_CORE3 0x00000008

//
// Define CRU soft reset 8 register bits.
//

#define RK32_CRU_SOFT_RESET8_PROTECT_SHIFT 16
#define RK32_CRU_SOFT_RESET8_MMC0 0x00000001

//
// Define PMU power down control register bits.
//

#define RK32_PMU_POWER_DOWN_CONTROL_A17_0 0x00000001
#define RK32_PMU_POWER_DOWN_CONTROL_A17_1 0x00000002
#define RK32_PMU_POWER_DOWN_CONTROL_A17_2 0x00000004
#define RK32_PMU_POWER_DOWN_CONTROL_A17_3 0x00000008

//
// Define PMU power down status register bits.
//

#define RK32_PMU_POWER_DOWN_STATUS_A17_0 0x00000001
#define RK32_PMU_POWER_DOWN_STATUS_A17_1 0x00000002
#define RK32_PMU_POWER_DOWN_STATUS_A17_2 0x00000004
#define RK32_PMU_POWER_DOWN_STATUS_A17_3 0x00000008

//
// Define the default values for the I2C PMU iomux.
//

#define RK32_PMU_IOMUX_I2C0_SDA_DEFAULT (1 << 14)
#define RK32_PMU_IOMUX_I2C0_SCL_DEFAULT (1 << 0)

//
// Define GRF I/O Vsel register bits.
//

#define RK32_GRF_IO_VSEL_LCD_V18 0x00000001
#define RK32_GRF_IO_VSEL_PROTECT_SHIFT 16

//
// Define GPIO SoC status 1 register bits.
//

#define RK32_GRF_SOC_STATUS1_ARM_PLL_LOCK (1 << 6)

//
// Define the GRF GPIO6C IOMUX value for SD/MMC.
//

#define RK32_GRF_GPIO6C_IOMUX_VALUE 0x2AAA1555

//
// Define the GRF GPIO7CH IOMUX initialization values.
//

#define RK32_GRF_GPIO7CH_IOMUX_VALUE 0x33001100

//
// Define LCD system control register bits.
//

#define RK32_LCD_SYSTEM_CONTROL_AUTO_GATING (1 << 23)
#define RK32_LCD_SYSTEM_CONTROL_STANDBY     (1 << 22)
#define RK32_LCD_SYSTEM_CONTROL_DMA_STOP    (1 << 21)
#define RK32_LCD_SYSTEM_CONTROL_MMU_ENABLE  (1 << 20)
#define RK32_LCD_SYSTEM_CONTROL_MIPI_OUT    (1 << 15)
#define RK32_LCD_SYSTEM_CONTROL_EDP_OUT     (1 << 14)
#define RK32_LCD_SYSTEM_CONTROL_HDMI_OUT    (1 << 13)
#define RK32_LCD_SYSTEM_CONTROL_RGB_OUT     (1 << 12)

//
// Define LCD DSP Control 0 register bits.
//

#define RK32_LCD_DSP_CONTROL0_BLACK            (1 << 19)
#define RK32_LCD_DSP_CONTROL0_BLANK            (1 << 18)
#define RK32_LCD_DSP_CONTROL0_OUT_ZERO         (1 << 17)
#define RK32_LCD_DSP_CONTROL0_DCLOCK_POLARITY  (1 << 7)
#define RK32_LCD_DSP_CONTROL0_DENABLE_POLARITY (1 << 6)
#define RK32_LCD_DSP_CONTROL0_VSYNC_POLARITY   (1 << 5)
#define RK32_LCD_DSP_CONTROL0_HSYNC_POLARITY   (1 << 4)

//
// Define LCD DSP control 1 register bits.
//

#define RK32_LCD_DSP_CONTROL1_LAYER3_SEL_SHIFT   14
#define RK32_LCD_DSP_CONTROL1_LAYER2_SEL_SHIFT   12
#define RK32_LCD_DSP_CONTROL1_LAYER1_SEL_SHIFT   10
#define RK32_LCD_DSP_CONTROL1_LAYER0_SEL_SHIFT   8
#define RK32_LCD_DSP_CONTROL1_DITHER_UP          (1 << 6)
#define RK32_LCD_DSP_CONTROL1_DITHER_DOWN_SELECT (1 << 4)
#define RK32_LCD_DSP_CONTROL1_DITHER_DOWN_MODE   (1 << 3)
#define RK32_LCD_DSP_CONTROL1_DITHER_DOWN        (1 << 2)
#define RK32_LCD_DSP_CONTROL1_PRE_DITHER_DOWN    (1 << 1)

//
// Define the LCD display information register bits.
//

#define RK32_LCD_DSP_INFORMATION_HEIGHT_MASK  (0xFFF << 16)
#define RK32_LCD_DSP_INFORMATION_HEIGHT_SHIFT 16
#define RK32_LCD_DSP_INFORMATION_WIDTH_MASK   (0xFFF << 0)
#define RK32_LCD_DSP_INFORMATION_WIDTH_SHIFT  0

//
// Define the bits for the GPIO 7 data register.
//

#define RK32_GPIO7_BACKLIGHT_ENABLE 0x00000001
#define RK32_GPIO7_LCD_BACKLIGHT    0x00000004

//
// Define the bits for the I2C control register.
//

#define RK32_I2C_CONTROL_STOP_ON_NAK           (1 << 6)
#define RK32_I2C_CONTROL_SEND_NAK              (1 << 5)
#define RK32_I2C_CONTROL_STOP                  (1 << 4)
#define RK32_I2C_CONTROL_START                 (1 << 3)
#define RK32_I2C_CONTROL_MODE_TRANSMIT         (0x0 << 1)
#define RK32_I2C_CONTROL_MODE_TRANSMIT_RECEIVE (0x1 << 1)
#define RK32_I2C_CONTROL_MODE_RECEIVE          (0x2 << 1)
#define RK32_I2C_CONTROL_MODE_MASK             (0x3 << 1)
#define RK32_I2C_CONTROL_MODE_SHIFT            1
#define RK32_I2C_CONTROL_ENABLE                (1 << 0)

#define RK32_I2C_BUFFER_SIZE 32

//
// Define the bits for the I2C clock divisor register.
//

#define RK32_I2C_CLOCK_DIVISOR_HIGH_MASK  (0xFFFF << 16)
#define RK32_I2C_CLOCK_DIVISOR_HIGH_SHIFT 16
#define RK32_I2C_CLOCK_DIVISOR_LOW_MASK   (0xFFFF << 0)
#define RK32_I2C_CLOCK_DIVISOR_LOW_SHIFT  0

//
// Define the bits for the I2C master receive slave address register.
//

#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_HIGH_BYTE_VALID   (1 << 26)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_MIDDLE_BYTE_VALID (1 << 25)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_LOW_BYTE_VALID    (1 << 24)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_MASK              (0x7FFFFF << 1)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_SHIFT             1
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_WRITE             (0 << 0)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_ADDRESS_READ              (1 << 0)

//
// Define the bits for the I2C master receive slave register.
//

#define RK32_I2C_MASTER_RECEIVE_SLAVE_REGISTER_HIGH_BYTE_VALID   (1 << 26)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_REGISTER_MIDDLE_BYTE_VALID (1 << 25)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_REGISTER_LOW_BYTE_VALID    (1 << 24)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_REGISTER_MASK              (0xFFFFFF << 0)
#define RK32_I2C_MASTER_RECEIVE_SLAVE_REGISTER_SHIFT             0

//
// Define the bits for the I2C master transmit count register.
//

#define RK32_I2C_MASTER_TRANSMIT_COUNT_MASK  (0x3F << 0)
#define RK32_I2C_MASTER_TRANSMIT_COUNT_SHIFT 0

//
// Define the bits for the I2C master receive count register.
//

#define RK32_I2C_MASTER_RECEIVE_COUNT_MASK  (0x3F << 0)
#define RK32_I2C_MASTER_RECEIVE_COUNT_SHIFT 0

//
// Define the bits for the I2C interrupt registers.
//

#define RK32_I2C_INTERRUPT_NAK                      (1 << 6)
#define RK32_I2C_INTERRUPT_STOP                     (1 << 5)
#define RK32_I2C_INTERRUPT_START                    (1 << 4)
#define RK32_I2C_INTERRUPT_MASTER_RECEIVE_FINISHED  (1 << 3)
#define RK32_I2C_INTERRUPT_MASTER_TRANSMIT_FINISHED (1 << 2)
#define RK32_I2C_INTERRUPT_BYTE_RECEIVE_FINISHED    (1 << 1)
#define RK32_I2C_INTERRUPT_BYTE_TRANSMIT_FINISHED   (1 << 0)

#define RK32_I2C_INTERRUPT_MASK                    \
    (RK32_I2C_INTERRUPT_NAK |                      \
     RK32_I2C_INTERRUPT_STOP |                     \
     RK32_I2C_INTERRUPT_START |                    \
     RK32_I2C_INTERRUPT_MASTER_RECEIVE_FINISHED |  \
     RK32_I2C_INTERRUPT_MASTER_TRANSMIT_FINISHED | \
     RK32_I2C_INTERRUPT_BYTE_RECEIVE_FINISHED |         \
     RK32_I2C_INTERRUPT_BYTE_TRANSMIT_FINISHED)

//
// Define the bits for the I2C finished count register.
//

#define RK32_I2C_FINISHED_COUNT_MASK  (0x3F << 0)
#define RK32_I2C_FINISHED_COUNT_SHIFT 0

//
// Define the UART parameters.
//

#define RK32_UART_BASE_BAUD 1497600
#define RK32_UART_REGISTER_OFFSET 0
#define RK32_UART_REGISTER_SHIFT 2

//
// Define the default frequency for the SD/MMC.
//

#define RK32_SDMMC_FREQUENCY_24MHZ 24000000

//
// Define attributes of the timers.
//

#define RK32_TIMER_BIT_WIDTH 64
#define RK32_TIMER_BLOCK_SIZE 0x1000

//
// Define RK32 timer register bits.
//

//
// Control bits
//

#define RK32_TIMER_CONTROL_ENABLE           0x00000001
#define RK32_TIMER_CONTROL_ONE_SHOT         0x00000002
#define RK32_TIMER_CONTROL_INTERRUPT_ENABLE 0x00000004

#define RK32_WATCHDOG_CONTROL_ENABLE     0x00000001
#define RK32_WATCHDOG_CONTROL_BARK_FIRST 0x00000002

#define RK32_WATCHDOG_RESTART_VALUE 0x00000076

//
// ------------------------------------------------------ Data Type Definitions
//

typedef enum _RK32_CRU_REGISTER {
    Rk32CruArmPllConfiguration0 = 0x00,
    Rk32CruArmPllConfiguration1 = 0x04,
    Rk32CruArmPllConfiguration2 = 0x08,
    Rk32CruArmPllConfiguration3 = 0x0C,
    Rk32CruDdrPllConfiguration0 = 0x10,
    Rk32CruDdrPllConfiguration1 = 0x14,
    Rk32CruDdrPllConfiguration2 = 0x18,
    Rk32CruDdrPllConfiguration3 = 0x1C,
    Rk32CruCodecPllConfiguration0 = 0x20,
    Rk32CruCodecPllConfiguration1 = 0x24,
    Rk32CruCodecPllConfiguration2 = 0x28,
    Rk32CruCodecPllConfiguration3 = 0x2C,
    Rk32CruGeneralPllConfiguration0 = 0x30,
    Rk32CruGeneralPllConfiguration1 = 0x34,
    Rk32CruGeneralPllConfiguration2 = 0x38,
    Rk32CruGeneralPllConfiguration3 = 0x3C,
    Rk32CruNewPllConfiguration0 = 0x40,
    Rk32CruNewPllConfiguration1 = 0x44,
    Rk32CruNewPllConfiguration2 = 0x48,
    Rk32CruNewPllConfiguration3 = 0x4C,
    Rk32CruModeControl = 0x50,
    Rk32CruClockSelect0 = 0x60,
    Rk32CruClockSelect1 = 0x64,
    Rk32CruClockSelect11 = 0x8C,
    Rk32CruClockSelect12 = 0x90,
    Rk32CruClockSelect33 = 0xE4,
    Rk32CruGlobalReset1 = 0x1B0,
    Rk32CruGlobalReset2 = 0x1B4,
    Rk32CruSoftReset0 = 0x1B8,
    Rk32CruSoftReset1 = 0x1BC,
    Rk32CruSoftReset2 = 0x1C0,
    Rk32CruSoftReset3 = 0x1C4,
    Rk32CruSoftReset4 = 0x1C8,
    Rk32CruSoftReset5 = 0x1CC,
    Rk32CruSoftReset6 = 0x1D0,
    Rk32CruSoftReset7 = 0x1D4,
    Rk32CruSoftReset8 = 0x1D8,
    Rk32CruSoftReset9 = 0x1DC,
    Rk32CruSoftReset10 = 0x1E0,
    Rk32CruSoftReset11 = 0x1E4,
} RK32_CRU_REGISTER, *PRK32_CRU_REGISTER;

typedef enum _RK32_PLL_TYPE {
    Rk32PllNew,
    Rk32PllGeneral,
    Rk32PllCodec,
    Rk32PllDdr,
    Rk32PllArm
} RK32_PLL_TYPE, *PRK32_PLL_TYPE;

typedef enum _RK32_PMU_REGISTER {
    Rk32PmuPowerDownControl = 0x08,
    Rk32PmuPowerDownStatus = 0x0C,
    Rk32PmuIomuxI2c0Sda = 0x88,
    Rk32PmuIomuxI2c0Scl = 0x8C
} RK32_PMU_REGISTER, *PRK32_PMU_REGISTER;

typedef enum _RK32_GRF_REGISTER {
    Rk32GrfGpio6cIomux = 0x64,
    Rk32GrfGpio7chIomux = 0x78,
    Rk32GrfSocStatus0 = 0x280,
    Rk32GrfSocStatus1 = 0x284,
    Rk32GrfIoVsel = 0x380,
} RK32_GRF_REGISTER, *PRK32_GRF_REGISTER;

typedef enum _RK32_LCD_REGISTER {
    Rk32LcdConfigurationDone = 0x00,
    Rk32LcdSystemControl = 0x08,
    Rk32LcdSystemControl1 = 0x0C,
    Rk32LcdDspControl0 = 0x10,
    Rk32LcdDspControl1 = 0x14,
    Rk32LcdBackground = 0x18,
    Rk32LcdMcuControl = 0x1C,
    Rk32LcdInterruptControl0 = 0x20,
    Rk32LcdInterruptControl1 = 0x24,
    Rk32LcdWin0YrgbFrameBufferBase = 0x40,
    Rk32LcdWin0ActiveInformation = 0x48,
    Rk32LcdWin0DisplayInformation = 0x4C,
} RK32_LCD_REGISTER, *PRK32_LCD_REGISTER;

typedef enum _RK32_GPIO_REGISTER {
    Rk32GpioPortAData = 0x00,
    Rk32GpioPortADirection = 0x04,
    Rk32GpioInterruptEnable = 0x30,
    Rk32GpioInterruptMask = 0x34,
    Rk32GpioInterruptLevel = 0x38,
    Rk32GpioInterruptPolarity = 0x3C,
    Rk32GpioInterruptStatus = 0x40,
    Rk32GpioRawInterruptStatus = 0x44,
    Rk32GpioDebounce = 0x48,
    Rk32GpioClearInterrupt = 0x4C,
    Rk32GpioPortAExternal = 0x50,
    Rk32GpioLevelSensitiveSync = 0x60,
} RK32_GPIO_REGISTER, *PRK32_GPIO_REGISTER;

typedef enum _RK32_I2C_REGISTER {
    Rk32I2cControl = 0x00,
    Rk32I2cClockDivisor = 0x04,
    Rk32I2cMasterReceiveSlaveAddress = 0x08,
    Rk32I2cMasterReceiveSlaveRegister = 0x0C,
    Rk32I2cMasterTransmitCount = 0x10,
    Rk32I2cMasterReceiveCount = 0x14,
    Rk32I2cInterruptEnable = 0x18,
    Rk32I2cInterruptPending = 0x1C,
    Rk32I2cFinishedCount = 0x20,
    Rk32I2cTransmitData0 = 0x100,
    Rk32I2cTransmitData1 = 0x104,
    Rk32I2cTransmitData2 = 0x108,
    Rk32I2cTransmitData3 = 0x10C,
    Rk32I2cTransmitData4 = 0x110,
    Rk32I2cTransmitData5 = 0x114,
    Rk32I2cTransmitData6 = 0x118,
    Rk32I2cTransmitData7 = 0x11C,
    Rk32I2cReceiveData0 = 0x200,
    Rk32I2cReceiveData1 = 0x204,
    Rk32I2cReceiveData2 = 0x208,
    Rk32I2cReceiveData3 = 0x20C,
    Rk32I2cReceiveData4 = 0x210,
    Rk32I2cReceiveData5 = 0x214,
    Rk32I2cReceiveData6 = 0x218,
    Rk32I2cReceiveData7 = 0x21C
} RK32_I2C_REGISTER, *PRK32_I2C_REGISTER;

typedef enum _RK32_TIMER_REGISTER {
    Rk32TimerLoadCountLow     = 0x00,
    Rk32TimerLoadCountHigh    = 0x04,
    Rk32TimerCurrentValueLow  = 0x08,
    Rk32TimerCurrentValueHigh = 0x0C,
    Rk32TimerControl          = 0x10,
    Rk32TimerInterruptStatus  = 0x18
} RK32_TIMER_REGISTER, *PRK32_TIMER_REGISTER;

typedef enum _RK32_WATCHDOG_REGISTER {
    Rk32WatchdogControl         = 0x00,
    Rk32WatchdogTimeoutRange    = 0x04,
    Rk32WatchdogCurrentCount    = 0x08,
    Rk32WatchdogCounterRestart  = 0x0C,
    Rk32WatchdogInterruptStatus = 0x10,
    Rk32WatchdogInterruptClear  = 0x14
} RK32_WATCHDOG_REGISTER, *PRK32_WATCHDOG_REGISTER;

//
// -------------------------------------------------------------------- Globals
//

//
// -------------------------------------------------------- Function Prototypes
//

