Merge branch 'master' of git://git.denx.de/u-boot-usb
authorWolfgang Denk <wd@denx.de>
Sun, 20 May 2012 20:51:41 +0000 (22:51 +0200)
committerWolfgang Denk <wd@denx.de>
Sun, 20 May 2012 20:51:41 +0000 (22:51 +0200)
* 'master' of git://git.denx.de/u-boot-usb:
  USB: S5P: Add ehci support
  usb:udc:samsung Add functions for storing private gadget data in UDC driver
  usb:gadget:composite: Support for composite at gadget.h
  usb:gadget:composite USB composite gadget support
  usb:udc:samsung:cleanup Replace DEBUG_* macros with debug_cond() calls
  usb:udc: Remove duplicated USB definitions from include/linux/usb/ch9.h file
  USB: Document the QH and qTD antics in EHCI-HCD
  USB: Drop cache flush bloat in EHCI-HCD
  USB: Drop ehci_alloc/ehci_free in ehci-hcd
  USB: Align buffers at cacheline
  usb: use noinline define

373 files changed:
MAINTAINERS
Makefile
README
arch/arm/config.mk
arch/arm/cpu/arm926ejs/config.mk
arch/arm/cpu/arm926ejs/lpc32xx/Makefile [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc32xx/clk.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc32xx/cpu.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc32xx/devices.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc32xx/timer.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/mx25/generic.c
arch/arm/cpu/arm926ejs/mx28/Makefile
arch/arm/cpu/arm926ejs/mx28/mx28.c
arch/arm/cpu/arm926ejs/mx28/mx28_init.h
arch/arm/cpu/arm926ejs/mx28/spl_boot.c
arch/arm/cpu/arm926ejs/mx28/spl_lradc_init.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c
arch/arm/cpu/arm926ejs/mx28/spl_power_init.c
arch/arm/cpu/armv7/am33xx/board.c
arch/arm/cpu/armv7/config.mk
arch/arm/cpu/armv7/exynos/Makefile
arch/arm/cpu/armv7/exynos/clock.c
arch/arm/cpu/armv7/exynos/power.c [new file with mode: 0644]
arch/arm/cpu/armv7/exynos/system.c [new file with mode: 0644]
arch/arm/cpu/armv7/imx-common/cpu.c
arch/arm/cpu/armv7/mx5/clock.c
arch/arm/cpu/armv7/mx5/lowlevel_init.S
arch/arm/cpu/armv7/mx6/clock.c
arch/arm/cpu/armv7/mx6/lowlevel_init.S
arch/arm/cpu/armv7/mx6/soc.c
arch/arm/cpu/armv7/omap-common/Makefile
arch/arm/cpu/armv7/omap-common/clocks-common.c
arch/arm/cpu/armv7/omap-common/emif-common.c
arch/arm/cpu/armv7/omap-common/hwinit-common.c
arch/arm/cpu/armv7/omap-common/lowlevel_init.S
arch/arm/cpu/armv7/omap-common/reset.S [deleted file]
arch/arm/cpu/armv7/omap-common/reset.c [new file with mode: 0644]
arch/arm/cpu/armv7/omap-common/spl.c
arch/arm/cpu/armv7/omap-common/spl_mmc.c
arch/arm/cpu/armv7/omap-common/vc.c [new file with mode: 0644]
arch/arm/cpu/armv7/omap3/board.c
arch/arm/cpu/armv7/omap3/clock.c
arch/arm/cpu/armv7/omap3/lowlevel_init.S
arch/arm/cpu/armv7/omap4/clocks.c
arch/arm/cpu/armv7/omap4/hwinit.c
arch/arm/cpu/armv7/omap4/sdram_elpida.c
arch/arm/cpu/armv7/omap5/Makefile
arch/arm/cpu/armv7/omap5/clocks.c
arch/arm/cpu/armv7/omap5/hwinit.c
arch/arm/cpu/armv7/omap5/sdram.c [new file with mode: 0644]
arch/arm/cpu/armv7/omap5/sdram_elpida.c [deleted file]
arch/arm/cpu/armv7/s5pc1xx/cache.S
arch/arm/cpu/armv7/s5pc1xx/reset.S
arch/arm/cpu/armv7/start.S
arch/arm/cpu/armv7/tegra2/Makefile
arch/arm/cpu/armv7/tegra2/ap20.c
arch/arm/cpu/armv7/tegra2/ap20.h [deleted file]
arch/arm/cpu/armv7/tegra2/board.c
arch/arm/cpu/armv7/tegra2/clock.c
arch/arm/cpu/armv7/tegra2/crypto.c [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/crypto.h [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/emc.c [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/funcmux.c
arch/arm/cpu/armv7/tegra2/lowlevel_init.S
arch/arm/cpu/armv7/tegra2/pmu.c [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/warmboot.c [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/warmboot_avp.c [new file with mode: 0644]
arch/arm/cpu/armv7/tegra2/warmboot_avp.h [new file with mode: 0644]
arch/arm/cpu/armv7/u8500/lowlevel.S
arch/arm/dts/tegra20.dtsi
arch/arm/include/asm/arch-am33xx/mmc_host_def.h
arch/arm/include/asm/arch-exynos/clk.h
arch/arm/include/asm/arch-exynos/cpu.h
arch/arm/include/asm/arch-exynos/dsim.h [new file with mode: 0644]
arch/arm/include/asm/arch-exynos/fb.h [new file with mode: 0644]
arch/arm/include/asm/arch-exynos/mipi_dsim.h [new file with mode: 0644]
arch/arm/include/asm/arch-exynos/mmc.h
arch/arm/include/asm/arch-exynos/power.h
arch/arm/include/asm/arch-exynos/system.h [new file with mode: 0644]
arch/arm/include/asm/arch-exynos/tzpc.h
arch/arm/include/asm/arch-lpc32xx/clk.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/config.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/cpu.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/emc.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/sys_proto.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/timer.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/uart.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc32xx/wdt.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx25/clock.h
arch/arm/include/asm/arch-mx25/imx-regs.h
arch/arm/include/asm/arch-mx28/imx-regs.h
arch/arm/include/asm/arch-mx28/regs-lcdif.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx28/regs-lradc.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx28/sys_proto.h
arch/arm/include/asm/arch-mx5/clock.h
arch/arm/include/asm/arch-mx5/crm_regs.h
arch/arm/include/asm/arch-mx5/imx-regs.h
arch/arm/include/asm/arch-mx5/iomux.h
arch/arm/include/asm/arch-mx5/sys_proto.h
arch/arm/include/asm/arch-mx6/ccm_regs.h [deleted file]
arch/arm/include/asm/arch-mx6/clock.h
arch/arm/include/asm/arch-mx6/crm_regs.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx6/imx-regs.h
arch/arm/include/asm/arch-mx6/iomux-v3.h
arch/arm/include/asm/arch-mx6/sys_proto.h
arch/arm/include/asm/arch-omap3/cpu.h
arch/arm/include/asm/arch-omap3/mmc_host_def.h
arch/arm/include/asm/arch-omap3/mux.h
arch/arm/include/asm/arch-omap4/clocks.h
arch/arm/include/asm/arch-omap4/cpu.h
arch/arm/include/asm/arch-omap4/mmc_host_def.h
arch/arm/include/asm/arch-omap4/mux_omap4.h
arch/arm/include/asm/arch-omap4/omap.h
arch/arm/include/asm/arch-omap4/sys_proto.h
arch/arm/include/asm/arch-omap5/clocks.h
arch/arm/include/asm/arch-omap5/cpu.h
arch/arm/include/asm/arch-omap5/mmc_host_def.h
arch/arm/include/asm/arch-omap5/mux_omap5.h
arch/arm/include/asm/arch-omap5/omap.h
arch/arm/include/asm/arch-omap5/sys_proto.h
arch/arm/include/asm/arch-s5pc1xx/mmc.h
arch/arm/include/asm/arch-tegra2/ap20.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/apb_misc.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/clk_rst.h
arch/arm/include/asm/arch-tegra2/clock.h
arch/arm/include/asm/arch-tegra2/emc.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/flow.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/fuse.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/gp_padctrl.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/pmu.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/sdram_param.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra2/tegra2.h
arch/arm/include/asm/arch-tegra2/tegra_i2c.h
arch/arm/include/asm/arch-tegra2/warmboot.h [new file with mode: 0644]
arch/arm/include/asm/emif.h
arch/arm/include/asm/linkage.h [new file with mode: 0644]
arch/arm/include/asm/omap_common.h
arch/arm/include/asm/u-boot.h
arch/arm/lib/board.c
arch/avr32/include/asm/u-boot.h
arch/avr32/lib/board.c
arch/blackfin/include/asm/u-boot.h
arch/blackfin/lib/board.c
arch/m68k/include/asm/u-boot.h
arch/m68k/lib/board.c
arch/microblaze/include/asm/u-boot.h
arch/microblaze/lib/board.c
arch/mips/include/asm/u-boot.h
arch/mips/lib/board.c
arch/nds32/include/asm/u-boot.h
arch/nds32/lib/board.c
arch/nios2/include/asm/u-boot.h
arch/nios2/lib/board.c
arch/openrisc/include/asm/u-boot.h
arch/powerpc/cpu/mpc85xx/u-boot-nand.lds
arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds
arch/powerpc/include/asm/u-boot.h
arch/powerpc/lib/board.c
arch/sandbox/include/asm/u-boot.h
arch/sandbox/lib/board.c
arch/sh/include/asm/u-boot.h
arch/sh/lib/board.c
arch/sparc/include/asm/u-boot.h
arch/sparc/lib/board.c
arch/x86/include/asm/init_helpers.h
arch/x86/include/asm/u-boot.h
arch/x86/lib/board.c
arch/x86/lib/init_helpers.c
board/cloudengines/pogo_e02/Makefile [new file with mode: 0644]
board/cloudengines/pogo_e02/kwbimage.cfg [new file with mode: 0644]
board/cloudengines/pogo_e02/pogo_e02.c [new file with mode: 0644]
board/cloudengines/pogo_e02/pogo_e02.h [new file with mode: 0644]
board/cm_t35/cm_t35.c
board/comelit/dig297/dig297.c
board/corscience/tricorder/tricorder.c
board/davinci/ea20/ea20.c
board/denx/m28evk/m28evk.c
board/denx/m28evk/spl_boot.c
board/esd/cpci405/cpci405.c
board/esg/ima3-mx53/Makefile [new file with mode: 0644]
board/esg/ima3-mx53/ima3-mx53.c [new file with mode: 0644]
board/esg/ima3-mx53/imximage.cfg [new file with mode: 0644]
board/freescale/mx28evk/iomux.c
board/freescale/mx53loco/mx53loco.c
board/freescale/mx6qsabrelite/mx6qsabrelite.c
board/htkw/mcx/mcx.c
board/isee/igep0020/igep0020.c
board/isee/igep0030/igep0030.c
board/logicpd/am3517evm/am3517evm.c
board/logicpd/omap3som/omap3logic.c
board/logicpd/zoom1/zoom1.c
board/logicpd/zoom2/zoom2.c
board/matrix_vision/mvblx/mvblx.c
board/nvidia/common/Makefile
board/nvidia/common/board.c
board/nvidia/common/emc.c [new file with mode: 0644]
board/nvidia/common/emc.h [new file with mode: 0644]
board/nvidia/dts/tegra2-seaboard.dts
board/overo/overo.c
board/pandora/pandora.c
board/pandora/pandora.h
board/raidsonic/ib62x0/Makefile [new file with mode: 0644]
board/raidsonic/ib62x0/ib62x0.c [new file with mode: 0644]
board/raidsonic/ib62x0/ib62x0.h [new file with mode: 0644]
board/raidsonic/ib62x0/kwbimage.cfg [new file with mode: 0644]
board/samsung/smdk5250/tzpc_init.c
board/samsung/trats/trats.c
board/samsung/universal_c210/universal.c
board/technexion/twister/twister.c
board/teejet/mt_ventoux/mt_ventoux.c
board/ti/am3517crane/am3517crane.c
board/ti/beagle/beagle.c
board/ti/evm/evm.c
board/ti/omap5912osk/omap5912osk.c
board/ti/omap5_evm/evm.c
board/ti/omap5_evm/mux_data.h
board/ti/omap730p2/omap730p2.c
board/ti/panda/panda.c
board/ti/panda/panda_mux_data.h
board/ti/sdp3430/sdp.c
board/ti/sdp4430/sdp.c
board/ti/sdp4430/sdp4430_mux_data.h
board/timll/devkit3250/Makefile [new file with mode: 0644]
board/timll/devkit3250/devkit3250.c [new file with mode: 0644]
board/timll/devkit8000/devkit8000.c
boards.cfg
common/cmd_bdinfo.c
common/cmd_nand.c
common/cmd_nvedit.c
common/cmd_sata.c
common/main.c
config.mk
doc/README.nand
doc/SPL/README.omap3
drivers/bios_emulator/x86emu/prim_ops.c
drivers/block/Makefile
drivers/block/dwc_ahsata.c [new file with mode: 0644]
drivers/block/dwc_ahsata.h [new file with mode: 0644]
drivers/gpio/mxc_gpio.c
drivers/i2c/tegra_i2c.c
drivers/input/Makefile
drivers/input/input.c [new file with mode: 0644]
drivers/input/key_matrix.c [new file with mode: 0644]
drivers/input/tegra-kbc.c [new file with mode: 0644]
drivers/misc/Makefile
drivers/misc/pmic_dialog.c [new file with mode: 0644]
drivers/misc/pmic_max8997.c [new file with mode: 0644]
drivers/mmc/Makefile
drivers/mmc/fsl_esdhc.c
drivers/mmc/mmc.c
drivers/mmc/mxsmmc.c
drivers/mmc/omap_hsmmc.c
drivers/mmc/s5p_mmc.c [deleted file]
drivers/mmc/s5p_sdhci.c [new file with mode: 0644]
drivers/mmc/sdhci.c
drivers/mtd/nand/fsl_ifc_nand.c
drivers/mtd/nand/mxc_nand.c
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nand_bbt.c
drivers/mtd/nand/nand_util.c
drivers/net/fec_mxc.c
drivers/net/netconsole.c
drivers/power/Makefile
drivers/power/tps6586x.c [new file with mode: 0644]
drivers/power/twl6035.c [new file with mode: 0644]
drivers/serial/Makefile
drivers/serial/lpc32xx_hsuart.c [new file with mode: 0644]
drivers/spi/mxs_spi.c
drivers/usb/host/ehci-mx6.c
drivers/usb/host/ehci-mxc.c
drivers/video/Makefile
drivers/video/exynos_fb.c [new file with mode: 0644]
drivers/video/exynos_fb.h [new file with mode: 0644]
drivers/video/exynos_fimd.c [new file with mode: 0644]
drivers/video/exynos_mipi_dsi.c [new file with mode: 0644]
drivers/video/exynos_mipi_dsi_common.c [new file with mode: 0644]
drivers/video/exynos_mipi_dsi_common.h [new file with mode: 0644]
drivers/video/exynos_mipi_dsi_lowlevel.c [new file with mode: 0644]
drivers/video/exynos_mipi_dsi_lowlevel.h [new file with mode: 0644]
drivers/video/s6e8ax0.c [new file with mode: 0644]
include/aes.h [new file with mode: 0644]
include/ahci.h
include/common.h
include/configs/P1023RDS.h
include/configs/P2020COME.h
include/configs/am3517_crane.h
include/configs/am3517_evm.h
include/configs/at91sam9263ek.h
include/configs/cam_enc_4xx.h
include/configs/cm_t35.h
include/configs/da830evm.h
include/configs/devkit3250.h [new file with mode: 0644]
include/configs/devkit8000.h
include/configs/dreamplug.h
include/configs/ea20.h
include/configs/eb_cpux9k2.h
include/configs/flea3.h
include/configs/hawkboard.h
include/configs/ib62x0.h [new file with mode: 0644]
include/configs/igep0020.h [deleted file]
include/configs/igep0030.h [deleted file]
include/configs/igep00x0.h [new file with mode: 0644]
include/configs/ima3-mx53.h [new file with mode: 0644]
include/configs/imx27lite-common.h
include/configs/m28evk.h
include/configs/mcx.h
include/configs/meesc.h
include/configs/mv-common.h
include/configs/mx25pdk.h
include/configs/mx28evk.h
include/configs/mx31pdk.h
include/configs/mx35pdk.h
include/configs/mx53loco.h
include/configs/mx6qarm2.h
include/configs/mx6qsabrelite.h
include/configs/omap3_beagle.h
include/configs/omap3_evm_common.h
include/configs/omap3_overo.h
include/configs/omap3_pandora.h
include/configs/omap4_common.h
include/configs/omap5912osk.h
include/configs/omap5_evm.h
include/configs/omap730p2.h
include/configs/origen.h
include/configs/otc570.h
include/configs/p1_p2_rdb_pc.h
include/configs/pogo_e02.h [new file with mode: 0644]
include/configs/s5p_goni.h
include/configs/s5pc210_universal.h
include/configs/seaboard.h
include/configs/smdk5250.h
include/configs/smdkv310.h
include/configs/spear-common.h
include/configs/tam3517-common.h
include/configs/tegra2-common.h
include/configs/trats.h
include/configs/tricorder.h
include/configs/tx25.h
include/configs/zmx25.h
include/dialog_pmic.h [new file with mode: 0644]
include/fdtdec.h
include/fsl_esdhc.h
include/fsl_pmic.h
include/input.h [new file with mode: 0644]
include/key_matrix.h [new file with mode: 0644]
include/lcd.h
include/linux/input.h [new file with mode: 0644]
include/linux/linkage.h
include/max8997_pmic.h [new file with mode: 0644]
include/max8998_pmic.h
include/mmc.h
include/net.h
include/pmic.h
include/sdhci.h
include/tegra-kbc.h [new file with mode: 0644]
include/tps6586x.h [new file with mode: 0644]
include/twl6035.h [new file with mode: 0644]
lib/Makefile
lib/aes.c [new file with mode: 0644]
lib/fdtdec.c
net/bootp.c
net/bootp.h
net/eth.c
net/net.c
net/nfs.c
net/nfs.h
net/rarp.c
net/rarp.h
net/sntp.c
net/sntp.h
net/tftp.c
net/tftp.h
tools/gcc-version.sh [new file with mode: 0755]

index e2441d8d3129fa4cdd78b2f2673a4159dc30672a..f796872dca27405d801f95b77d33a10fcc008c5f 100644 (file)
@@ -777,6 +777,10 @@ Linus Walleij <linus.walleij@linaro.org>
        integratorap    various
        integratorcp    various
 
+Luka Perkov <uboot@lukaperkov.net>
+
+       ib62x0          ARM926EJS
+
 Dave Peverley <dpeverley@mpc-data.co.uk>
 
        omap730p2       ARM926EJS
@@ -788,6 +792,16 @@ Stelian Pop <stelian@popies.net>
        at91sam9263ek   ARM926EJS (AT91SAM9263 SoC)
        at91sam9rlek    ARM926EJS (AT91SAM9RL SoC)
 
+Dave Purdy <david.c.purdy@gmail.com>
+
+       pogo_e02        ARM926EJS (Kirkwood SoC)
+
+Sricharan R <r.sricharan@ti.com>
+
+       omap4_panda     ARM ARMV7 (OMAP4xx SoC)
+       omap4_sdp4430   ARM ARMV7 (OMAP4xx SoC)
+       omap5_evm       ARM ARMV7 (OMAP5xx Soc)
+
 Thierry Reding <thierry.reding@avionic-design.de>
 
        plutux          Tegra2 (ARM7 & A9 Dual Core)
@@ -860,12 +874,6 @@ Greg Ungerer <greg.ungerer@opengear.com>
        cm4116          ks8695p
        cm4148          ks8695p
 
-Aneesh V <aneesh@ti.com>
-
-       omap4_panda     ARM ARMV7 (OMAP4xx SoC)
-       omap4_sdp4430   ARM ARMV7 (OMAP4xx SoC)
-       omap5_evm       ARM ARMV7 (OMAP5xx Soc)
-
 Marek Vasut <marek.vasut@gmail.com>
 
        balloon3        xscale/pxa
@@ -932,6 +940,10 @@ Sughosh Ganu <urwithsughosh@gmail.com>
 
        hawkboard       ARM926EJS (OMAP-L138)
 
+Vladimir Zapolskiy <vz@mleia.com>
+
+       devkit3250      lpc32xx
+
 -------------------------------------------------------------------------
 
 Unknown / orphaned boards:
index 023ea23a38bdb3d187eaf2950999b989820bfa92..351a8f04d22dfa25a364dfa66c262882526a63da 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -556,6 +556,13 @@ SYSTEM_MAP = \
 $(obj)System.map:      $(obj)u-boot
                @$(call SYSTEM_MAP,$<) > $(obj)System.map
 
+checkthumb:
+       @if test $(call cc-version) -lt 0404; then \
+               echo -n '*** Your GCC does not produce working '; \
+               echo 'binaries in THUMB mode.'; \
+               echo '*** Your board is configured for THUMB mode.'; \
+               false; \
+       fi
 #
 # Auto-generate the autoconf.mk file (which is included by all makefiles)
 #
diff --git a/README b/README
index 79016e690ace8899488e54ee7a35e1715018e9a2..6919392dca82c142ea00d9281393ddcde33ae981 100644 (file)
--- a/README
+++ b/README
@@ -432,6 +432,14 @@ The following options need to be configured:
                Select high exception vectors of the ARM core, e.g., do not
                clear the V bit of the c1 register of CP15.
 
+               CONFIG_SYS_THUMB_BUILD
+
+               Use this flag to build U-Boot using the Thumb instruction
+               set for ARM architectures. Thumb instruction set provides
+               better code density. For ARM architectures that support
+               Thumb2 this flag will result in Thumb2 code generated by
+               GCC.
+
 - Linux Kernel Interface:
                CONFIG_CLOCKS_IN_MHZ
 
index 3c5f9871671641f6dead045cd9238090cb215c0e..3f4453a23406ff277ce57ed1803971e60b71af9f 100644 (file)
@@ -33,25 +33,38 @@ endif
 
 PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
 
-# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb:
-PF_CPPFLAGS_ARM := $(call cc-option,-marm,)
+# Choose between ARM/Thumb instruction sets
+ifeq ($(CONFIG_SYS_THUMB_BUILD),y)
+PF_CPPFLAGS_ARM := $(call cc-option, -mthumb -mthumb-interwork,\
+                       $(call cc-option,-marm,)\
+                       $(call cc-option,-mno-thumb-interwork,)\
+               )
+else
+PF_CPPFLAGS_ARM := $(call cc-option,-marm,) \
+               $(call cc-option,-mno-thumb-interwork,)
+endif
+
+# Only test once
+ifneq ($(CONFIG_SPL_BUILD),y)
+ALL-$(CONFIG_SYS_THUMB_BUILD)  += checkthumb
+endif
 
 # Try if EABI is supported, else fall back to old API,
 # i. e. for example:
 # - with ELDK 4.2 (EABI supported), use:
-#      -mabi=aapcs-linux -mno-thumb-interwork
+#      -mabi=aapcs-linux
 # - with ELDK 4.1 (gcc 4.x, no EABI), use:
-#      -mabi=apcs-gnu -mno-thumb-interwork
+#      -mabi=apcs-gnu
 # - with ELDK 3.1 (gcc 3.x), use:
-#      -mapcs-32 -mno-thumb-interwork
+#      -mapcs-32
 PF_CPPFLAGS_ABI := $(call cc-option,\
-                       -mabi=aapcs-linux -mno-thumb-interwork,\
+                       -mabi=aapcs-linux,\
                        $(call cc-option,\
                                -mapcs-32,\
                                $(call cc-option,\
                                        -mabi=apcs-gnu,\
                                )\
-                       ) $(call cc-option,-mno-thumb-interwork,)\
+                       )\
                )
 PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARM) $(PF_CPPFLAGS_ABI)
 
index ffb2e6c3ea76bfa7b0cd7873546995a34ce47fd8..6a3a1bb354102f967718ef96061e9cfb59c9469a 100644 (file)
@@ -31,3 +31,9 @@ PLATFORM_CPPFLAGS += -march=armv5te
 # =========================================================================
 PF_RELFLAGS_SLB_AT := $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
 PLATFORM_RELFLAGS += $(PF_RELFLAGS_SLB_AT)
+
+ifneq ($(CONFIG_IMX_CONFIG),)
+
+ALL-y  += $(obj)u-boot.imx
+
+endif
diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/Makefile b/arch/arm/cpu/arm926ejs/lpc32xx/Makefile
new file mode 100644 (file)
index 0000000..ae1f0a5
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB     = $(obj)lib$(SOC).o
+
+COBJS   = cpu.o clk.o devices.o timer.o
+
+SRCS    := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS    := $(addprefix $(obj),$(COBJS) $(SOBJS))
+
+all:    $(obj).depend $(LIB)
+
+$(LIB): $(OBJS)
+       $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/clk.c b/arch/arm/cpu/arm926ejs/lpc32xx/clk.c
new file mode 100644 (file)
index 0000000..6f26d62
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <common.h>
+#include <div64.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+#include <asm/io.h>
+
+static struct clk_pm_regs *clk = (struct clk_pm_regs *)CLK_PM_BASE;
+
+unsigned int get_sys_clk_rate(void)
+{
+       if (readl(&clk->sysclk_ctrl) & CLK_SYSCLK_PLL397)
+               return RTC_CLK_FREQUENCY * 397;
+       else
+               return OSC_CLK_FREQUENCY;
+}
+
+unsigned int get_hclk_pll_rate(void)
+{
+       unsigned long long fin, fref, fcco, fout;
+       u32 val, m_div, n_div, p_div;
+
+       /*
+        * Valid frequency ranges:
+        *     1 * 10^6 <=  Fin <=  20 * 10^6
+        *     1 * 10^6 <= Fref <=  27 * 10^6
+        *   156 * 10^6 <= Fcco <= 320 * 10^6
+        */
+
+       fref = fin = get_sys_clk_rate();
+       if (fin > 20000000ULL || fin < 1000000ULL)
+               return 0;
+
+       val = readl(&clk->hclkpll_ctrl);
+       m_div = ((val & CLK_HCLK_PLL_FEEDBACK_DIV_MASK) >> 1) + 1;
+       n_div = ((val & CLK_HCLK_PLL_PREDIV_MASK) >> 9) + 1;
+       if (val & CLK_HCLK_PLL_DIRECT)
+               p_div = 0;
+       else
+               p_div = ((val & CLK_HCLK_PLL_POSTDIV_MASK) >> 11) + 1;
+       p_div = 1 << p_div;
+
+       if (val & CLK_HCLK_PLL_BYPASS) {
+               do_div(fin, p_div);
+               return fin;
+       }
+
+       do_div(fref, n_div);
+       if (fref > 27000000ULL || fref < 1000000ULL)
+               return 0;
+
+       fout = fref * m_div;
+       if (val & CLK_HCLK_PLL_FEEDBACK) {
+               fcco = fout;
+               do_div(fout, p_div);
+       } else
+               fcco = fout * p_div;
+
+       if (fcco > 320000000ULL || fcco < 156000000ULL)
+               return 0;
+
+       return fout;
+}
+
+unsigned int get_hclk_clk_div(void)
+{
+       u32 val;
+
+       val = readl(&clk->hclkdiv_ctrl) & CLK_HCLK_ARM_PLL_DIV_MASK;
+
+       return 1 << val;
+}
+
+unsigned int get_hclk_clk_rate(void)
+{
+       return get_hclk_pll_rate() / get_hclk_clk_div();
+}
+
+unsigned int get_periph_clk_div(void)
+{
+       u32 val;
+
+       val = readl(&clk->hclkdiv_ctrl) & CLK_HCLK_PERIPH_DIV_MASK;
+
+       return (val >> 2) + 1;
+}
+
+unsigned int get_periph_clk_rate(void)
+{
+       if (!(readl(&clk->pwr_ctrl) & CLK_PWR_NORMAL_RUN))
+               return get_sys_clk_rate();
+
+       return get_hclk_pll_rate() / get_periph_clk_div();
+}
+
+int get_serial_clock(void)
+{
+       return get_periph_clk_rate();
+}
diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/cpu.c b/arch/arm/cpu/arm926ejs/lpc32xx/cpu.c
new file mode 100644 (file)
index 0000000..e29e130
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/wdt.h>
+#include <asm/io.h>
+
+static struct clk_pm_regs *clk = (struct clk_pm_regs *)CLK_PM_BASE;
+static struct wdt_regs  *wdt = (struct wdt_regs *)WDT_BASE;
+
+void reset_cpu(ulong addr)
+{
+       /* Enable watchdog clock */
+       setbits_le32(&clk->timclk_ctrl, CLK_TIMCLK_WATCHDOG);
+
+       /* Reset pulse length is 13005 peripheral clock frames */
+       writel(13000, &wdt->pulse);
+
+       /* Force WDOG_RESET2 and RESOUT_N signal active */
+       writel(WDTIM_MCTRL_RESFRC2 | WDTIM_MCTRL_RESFRC1 | WDTIM_MCTRL_M_RES2,
+              &wdt->mctrl);
+
+       while (1)
+               /* NOP */;
+}
+
+#if defined(CONFIG_ARCH_CPU_INIT)
+int arch_cpu_init(void)
+{
+       /*
+        * It might be necessary to flush data cache, if U-boot is loaded
+        * from kickstart bootloader, e.g. from S1L loader
+        */
+       flush_dcache_all();
+
+       return 0;
+}
+#else
+#error "You have to select CONFIG_ARCH_CPU_INIT"
+#endif
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+       printf("CPU:   NXP LPC32XX\n");
+       printf("CPU clock:        %uMHz\n", get_hclk_pll_rate() / 1000000);
+       printf("AHB bus clock:    %uMHz\n", get_hclk_clk_rate() / 1000000);
+       printf("Peripheral clock: %uMHz\n", get_periph_clk_rate() / 1000000);
+
+       return 0;
+}
+#endif
diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/devices.c b/arch/arm/cpu/arm926ejs/lpc32xx/devices.c
new file mode 100644 (file)
index 0000000..9f305b5
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/uart.h>
+#include <asm/io.h>
+
+static struct clk_pm_regs    *clk  = (struct clk_pm_regs *)CLK_PM_BASE;
+static struct uart_ctrl_regs *ctrl = (struct uart_ctrl_regs *)UART_CTRL_BASE;
+
+void lpc32xx_uart_init(unsigned int uart_id)
+{
+       if (uart_id < 1 || uart_id > 7)
+               return;
+
+       /* Disable loopback mode, if it is set by S1L bootloader */
+       clrbits_le32(&ctrl->loop,
+                    UART_LOOPBACK(CONFIG_SYS_LPC32XX_UART));
+
+       if (uart_id < 3 || uart_id > 6)
+               return;
+
+       /* Enable UART system clock */
+       setbits_le32(&clk->uartclk_ctrl, CLK_UART(uart_id));
+
+       /* Set UART into autoclock mode */
+       clrsetbits_le32(&ctrl->clkmode,
+                       UART_CLKMODE_MASK(uart_id),
+                       UART_CLKMODE_AUTO(uart_id));
+
+       /* Bypass pre-divider of UART clock */
+       writel(CLK_UART_X_DIV(1) | CLK_UART_Y_DIV(1),
+              &clk->u3clk + (uart_id - 3));
+}
diff --git a/arch/arm/cpu/arm926ejs/lpc32xx/timer.c b/arch/arm/cpu/arm926ejs/lpc32xx/timer.c
new file mode 100644 (file)
index 0000000..1ce2358
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/timer.h>
+#include <asm/io.h>
+
+static struct timer_regs  *timer0 = (struct timer_regs *)TIMER0_BASE;
+static struct timer_regs  *timer1 = (struct timer_regs *)TIMER1_BASE;
+static struct clk_pm_regs *clk    = (struct clk_pm_regs *)CLK_PM_BASE;
+
+static void lpc32xx_timer_clock(u32 bit, int enable)
+{
+       if (enable)
+               setbits_le32(&clk->timclk_ctrl1, bit);
+       else
+               clrbits_le32(&clk->timclk_ctrl1, bit);
+}
+
+static void lpc32xx_timer_reset(struct timer_regs *timer, u32 freq)
+{
+       writel(TIMER_TCR_COUNTER_RESET,   &timer->tcr);
+       writel(TIMER_TCR_COUNTER_DISABLE, &timer->tcr);
+       writel(0, &timer->tc);
+       writel(0, &timer->pr);
+
+       /* Count mode is every rising PCLK edge */
+       writel(TIMER_CTCR_MODE_TIMER, &timer->ctcr);
+
+       /* Set prescale counter value */
+       writel((get_periph_clk_rate() / freq) - 1, &timer->pr);
+}
+
+static void lpc32xx_timer_count(struct timer_regs *timer, int enable)
+{
+       if (enable)
+               writel(TIMER_TCR_COUNTER_ENABLE,  &timer->tcr);
+       else
+               writel(TIMER_TCR_COUNTER_DISABLE, &timer->tcr);
+}
+
+int timer_init(void)
+{
+       lpc32xx_timer_clock(CLK_TIMCLK_TIMER0, 1);
+       lpc32xx_timer_reset(timer0, CONFIG_SYS_HZ);
+       lpc32xx_timer_count(timer0, 1);
+
+       return 0;
+}
+
+ulong get_timer(ulong base)
+{
+       return readl(&timer0->tc) - base;
+}
+
+void __udelay(unsigned long usec)
+{
+       lpc32xx_timer_clock(CLK_TIMCLK_TIMER1, 1);
+       lpc32xx_timer_reset(timer1, CONFIG_SYS_HZ * 1000);
+       lpc32xx_timer_count(timer1, 1);
+
+       while (readl(&timer1->tc) < usec)
+               /* NOP */;
+
+       lpc32xx_timer_count(timer1, 0);
+       lpc32xx_timer_clock(CLK_TIMCLK_TIMER1, 0);
+}
+
+unsigned long long get_ticks(void)
+{
+       return get_timer(0);
+}
+
+ulong get_tbclk(void)
+{
+       return CONFIG_SYS_HZ;
+}
index 9cadb7c34c0c6adffe68044055b4ff99c44001cf..8b07dae2b938a6cbc8021291c22f27f70e0bd4c1 100644 (file)
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/imx25-pinmux.h>
+#include <asm/arch/clock.h>
 #ifdef CONFIG_MXC_MMC
 #include <asm/arch/mxcmmc.h>
 #endif
 
+#ifdef CONFIG_FSL_ESDHC
+DECLARE_GLOBAL_DATA_PTR;
+#endif
+
 /*
  *  get the system pll clock in Hz
  *
@@ -105,6 +110,20 @@ ulong imx_get_perclk(int clk)
        return lldiv(fref, div);
 }
 
+unsigned int mxc_get_clock(enum mxc_clock clk)
+{
+       if (clk >= MXC_CLK_NUM)
+               return -1;
+       switch (clk) {
+       case MXC_ARM_CLK:
+               return imx_get_armclk();
+       case MXC_FEC_CLK:
+               return imx_get_ahbclk();
+       default:
+               return imx_get_perclk(clk);
+       }
+}
+
 u32 get_cpu_rev(void)
 {
        u32 srev;
@@ -182,6 +201,14 @@ int cpu_eth_init(bd_t *bis)
 #endif
 }
 
+int get_clocks(void)
+{
+#ifdef CONFIG_FSL_ESDHC
+       gd->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+#endif
+       return 0;
+}
+
 /*
  * Initializes on-chip MMC controllers.
  * to override, implement board_mmc_init()
index a2e3f771c26aa9835d4455c4975cf72e191b81a8..674a3af1be81aa7b63dadb1d465d15340ba16670 100644 (file)
@@ -28,7 +28,7 @@ LIB   = $(obj)lib$(SOC).o
 COBJS  = clock.o mx28.o iomux.o timer.o
 
 ifdef  CONFIG_SPL_BUILD
-COBJS  += spl_boot.o spl_mem_init.o spl_power_init.o
+COBJS  += spl_boot.o spl_lradc_init.o spl_mem_init.o spl_power_init.o
 endif
 
 SRCS   := $(START:.o=.S) $(COBJS:.o=.c)
index dc0338dfb585699bcc0850f28c19c77fdf9a8f1a..a82ff2564bdbf6c81002e63604daa5741626b02e 100644 (file)
@@ -51,9 +51,16 @@ void reset_cpu(ulong ignored) __attribute__((noreturn));
 
 void reset_cpu(ulong ignored)
 {
-
        struct mx28_rtc_regs *rtc_regs =
                (struct mx28_rtc_regs *)MXS_RTC_BASE;
+       struct mx28_lcdif_regs *lcdif_regs =
+               (struct mx28_lcdif_regs *)MXS_LCDIF_BASE;
+
+       /*
+        * Shut down the LCD controller as it interferes with BootROM boot mode
+        * pads sampling.
+        */
+       writel(LCDIF_CTRL_RUN, &lcdif_regs->hw_lcdif_ctrl_clr);
 
        /* Wait 1 uS before doing the actual watchdog reset */
        writel(1, &rtc_regs->hw_rtc_watchdog);
@@ -185,8 +192,12 @@ int arch_cpu_init(void)
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
+       struct mx28_spl_data *data = (struct mx28_spl_data *)
+               ((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf);
+
        printf("Freescale i.MX28 family at %d MHz\n",
                        mxc_get_clock(MXC_ARM_CLK) / 1000000);
+       printf("BOOT:  %s\n", mx28_boot_modes[data->boot_mode_idx].mode);
        return 0;
 }
 #endif
@@ -279,22 +290,16 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 
 int mx28_dram_init(void)
 {
-       struct mx28_digctl_regs *digctl_regs =
-               (struct mx28_digctl_regs *)MXS_DIGCTL_BASE;
-       uint32_t sz[2];
-
-       sz[0] = readl(&digctl_regs->hw_digctl_scratch0);
-       sz[1] = readl(&digctl_regs->hw_digctl_scratch1);
+       struct mx28_spl_data *data = (struct mx28_spl_data *)
+               ((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf);
 
-       if (sz[0] != sz[1]) {
+       if (data->mem_dram_size == 0) {
                printf("MX28:\n"
-                       "Error, the RAM size in HW_DIGCTRL_SCRATCH0 and\n"
-                       "HW_DIGCTRL_SCRATCH1 is not the same. Please\n"
-                       "verify these two registers contain valid RAM size!\n");
+                       "Error, the RAM size passed up from SPL is 0!\n");
                hang();
        }
 
-       gd->ram_size = sz[0];
+       gd->ram_size = data->mem_dram_size;
        return 0;
 }
 
index 98d363199dc242be5a78cbec25d992ab01694396..e3a4493fbdfa9518c433e882f13ba66447c1abec 100644 (file)
@@ -37,5 +37,9 @@ static inline void mx28_power_wait_pswitch(void) { }
 #endif
 
 void mx28_mem_init(void);
+uint32_t mx28_mem_get_size(void);
+
+void mx28_lradc_init(void);
+void mx28_lradc_enable_batt_measurement(void);
 
 #endif /* __M28_INIT_H__ */
index dfb8309e7006457975890a48cb13d657c417f6c9..a6dfca3f51f66ff87d758dbe7d9633a696191be6 100644 (file)
@@ -28,6 +28,8 @@
 #include <asm/io.h>
 #include <asm/arch/iomux-mx28.h>
 #include <asm/arch/imx-regs.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
 
 #include "mx28_init.h"
 
@@ -46,12 +48,65 @@ void early_delay(int delay)
                ;
 }
 
+#define        MUX_CONFIG_BOOTMODE_PAD (MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL)
+const iomux_cfg_t iomux_boot[] = {
+       MX28_PAD_LCD_D00__GPIO_1_0 | MUX_CONFIG_BOOTMODE_PAD,
+       MX28_PAD_LCD_D01__GPIO_1_1 | MUX_CONFIG_BOOTMODE_PAD,
+       MX28_PAD_LCD_D02__GPIO_1_2 | MUX_CONFIG_BOOTMODE_PAD,
+       MX28_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
+       MX28_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
+       MX28_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
+};
+
+uint8_t mx28_get_bootmode_index(void)
+{
+       uint8_t bootmode = 0;
+       int i;
+       uint8_t masked;
+
+       /* Setup IOMUX of bootmode pads to GPIO */
+       mxs_iomux_setup_multiple_pads(iomux_boot, ARRAY_SIZE(iomux_boot));
+
+       /* Setup bootmode pins as GPIO input */
+       gpio_direction_input(MX28_PAD_LCD_D00__GPIO_1_0);
+       gpio_direction_input(MX28_PAD_LCD_D01__GPIO_1_1);
+       gpio_direction_input(MX28_PAD_LCD_D02__GPIO_1_2);
+       gpio_direction_input(MX28_PAD_LCD_D03__GPIO_1_3);
+       gpio_direction_input(MX28_PAD_LCD_D04__GPIO_1_4);
+       gpio_direction_input(MX28_PAD_LCD_D05__GPIO_1_5);
+
+       /* Read bootmode pads */
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D00__GPIO_1_0) ? 1 : 0) << 0;
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D01__GPIO_1_1) ? 1 : 0) << 1;
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D02__GPIO_1_2) ? 1 : 0) << 2;
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D04__GPIO_1_4) ? 1 : 0) << 4;
+       bootmode |= (gpio_get_value(MX28_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
+
+       for (i = 0; i < ARRAY_SIZE(mx28_boot_modes); i++) {
+               masked = bootmode & mx28_boot_modes[i].boot_mask;
+               if (masked == mx28_boot_modes[i].boot_pads)
+                       break;
+       }
+
+       return i;
+}
+
 void mx28_common_spl_init(const iomux_cfg_t *iomux_setup,
                        const unsigned int iomux_size)
 {
+       struct mx28_spl_data *data = (struct mx28_spl_data *)
+               ((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf);
+       uint8_t bootmode = mx28_get_bootmode_index();
+
        mxs_iomux_setup_multiple_pads(iomux_setup, iomux_size);
        mx28_power_init();
+
        mx28_mem_init();
+       data->mem_dram_size = mx28_mem_get_size();
+
+       data->boot_mode_idx = bootmode;
+
        mx28_power_wait_pswitch();
 }
 
@@ -68,8 +123,10 @@ inline void board_init_r(gd_t *id, ulong dest_addr)
                ;
 }
 
+#ifndef CONFIG_SPL_SERIAL_SUPPORT
 void serial_putc(const char c) {}
 void serial_puts(const char *s) {}
+#endif
 void hang(void) __attribute__ ((noreturn));
 void hang(void)
 {
diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_lradc_init.c b/arch/arm/cpu/arm926ejs/mx28/spl_lradc_init.c
new file mode 100644 (file)
index 0000000..88a603c
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Freescale i.MX28 Battery measurement init
+ *
+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
+ * on behalf of DENX Software Engineering GmbH
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+
+#include "mx28_init.h"
+
+void mx28_lradc_init(void)
+{
+       struct mx28_lradc_regs *regs = (struct mx28_lradc_regs *)MXS_LRADC_BASE;
+
+       writel(LRADC_CTRL0_SFTRST, &regs->hw_lradc_ctrl0_clr);
+       writel(LRADC_CTRL0_CLKGATE, &regs->hw_lradc_ctrl0_clr);
+       writel(LRADC_CTRL0_ONCHIP_GROUNDREF, &regs->hw_lradc_ctrl0_clr);
+
+       clrsetbits_le32(&regs->hw_lradc_ctrl3,
+                       LRADC_CTRL3_CYCLE_TIME_MASK,
+                       LRADC_CTRL3_CYCLE_TIME_6MHZ);
+
+       clrsetbits_le32(&regs->hw_lradc_ctrl4,
+                       LRADC_CTRL4_LRADC7SELECT_MASK |
+                       LRADC_CTRL4_LRADC6SELECT_MASK,
+                       LRADC_CTRL4_LRADC7SELECT_CHANNEL7 |
+                       LRADC_CTRL4_LRADC6SELECT_CHANNEL10);
+}
+
+void mx28_lradc_enable_batt_measurement(void)
+{
+       struct mx28_lradc_regs *regs = (struct mx28_lradc_regs *)MXS_LRADC_BASE;
+
+       /* Check if the channel is present at all. */
+       if (!(readl(&regs->hw_lradc_status) & LRADC_STATUS_CHANNEL7_PRESENT))
+               return;
+
+       writel(LRADC_CTRL1_LRADC7_IRQ_EN, &regs->hw_lradc_ctrl1_clr);
+       writel(LRADC_CTRL1_LRADC7_IRQ, &regs->hw_lradc_ctrl1_clr);
+
+       clrsetbits_le32(&regs->hw_lradc_conversion,
+                       LRADC_CONVERSION_SCALE_FACTOR_MASK,
+                       LRADC_CONVERSION_SCALE_FACTOR_LI_ION);
+       writel(LRADC_CONVERSION_AUTOMATIC, &regs->hw_lradc_conversion_set);
+
+       /* Configure the channel. */
+       writel((1 << 7) << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
+               &regs->hw_lradc_ctrl2_clr);
+       writel(0xffffffff, &regs->hw_lradc_ch7_clr);
+       clrbits_le32(&regs->hw_lradc_ch7, LRADC_CH_NUM_SAMPLES_MASK);
+       writel(LRADC_CH_ACCUMULATE, &regs->hw_lradc_ch7_clr);
+
+       /* Schedule the channel. */
+       writel(1 << 7, &regs->hw_lradc_ctrl0_set);
+
+       /* Start the channel sampling. */
+       writel(((1 << 7) << LRADC_DELAY_TRIGGER_LRADCS_OFFSET) |
+               ((1 << 3) << LRADC_DELAY_TRIGGER_DELAYS_OFFSET) |
+               100, &regs->hw_lradc_delay3);
+
+       writel(0xffffffff, &regs->hw_lradc_ch7_clr);
+
+       writel(LRADC_DELAY_KICK, &regs->hw_lradc_delay3_set);
+}
index 911bbefc060f482d79c29b1b2c21b9bdbc0a6dc5..9fa5d29e6c7fbb8e82f6b48e2ccc7d25372d89ce 100644 (file)
@@ -39,7 +39,7 @@ uint32_t dram_vals[] = {
        0x00000000, 0x00000100, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00010101, 0x01010101,
-       0x000f0f01, 0x0f02010a, 0x00000000, 0x00010101,
+       0x000f0f01, 0x0f02020a, 0x00000000, 0x00010101,
        0x00000100, 0x00000100, 0x00000000, 0x00000002,
        0x01010000, 0x05060302, 0x06005003, 0x0a0000c8,
        0x02009c40, 0x0000030c, 0x0036a609, 0x031a0612,
@@ -149,6 +149,8 @@ void mx28_mem_setup_cpu_and_hbus(void)
        /* Disable CPU bypass */
        writel(CLKCTRL_CLKSEQ_BYPASS_CPU,
                &clkctrl_regs->hw_clkctrl_clkseq_clr);
+
+       early_delay(15000);
 }
 
 void mx28_mem_setup_vdda(void)
@@ -173,10 +175,8 @@ void mx28_mem_setup_vddd(void)
                &power_regs->hw_power_vdddctrl);
 }
 
-void mx28_mem_get_size(void)
+uint32_t mx28_mem_get_size(void)
 {
-       struct mx28_digctl_regs *digctl_regs =
-               (struct mx28_digctl_regs *)MXS_DIGCTL_BASE;
        uint32_t sz, da;
        uint32_t *vt = (uint32_t *)0x20;
        /* The following is "subs pc, r14, #4", used as return from DABT. */
@@ -187,11 +187,11 @@ void mx28_mem_get_size(void)
        vt[4] = data_abort_memdetect_handler;
 
        sz = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
-       writel(sz, &digctl_regs->hw_digctl_scratch0);
-       writel(sz, &digctl_regs->hw_digctl_scratch1);
 
        /* Restore the old DABT handler. */
        vt[4] = da;
+
+       return sz;
 }
 
 void mx28_mem_init(void)
@@ -239,6 +239,4 @@ void mx28_mem_init(void)
        early_delay(10000);
 
        mx28_mem_setup_cpu_and_hbus();
-
-       mx28_mem_get_size();
 }
index aa4117d3a23abbb3225ffa976cc91f7162b00539..4b09b0c3ba80353d99d7fe02a02460057717afa8 100644 (file)
@@ -45,11 +45,11 @@ void mx28_power_clock2pll(void)
        struct mx28_clkctrl_regs *clkctrl_regs =
                (struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
 
-       writel(CLKCTRL_PLL0CTRL0_POWER,
-               &clkctrl_regs->hw_clkctrl_pll0ctrl0_set);
+       setbits_le32(&clkctrl_regs->hw_clkctrl_pll0ctrl0,
+                       CLKCTRL_PLL0CTRL0_POWER);
        early_delay(100);
-       writel(CLKCTRL_CLKSEQ_BYPASS_CPU,
-               &clkctrl_regs->hw_clkctrl_clkseq_clr);
+       setbits_le32(&clkctrl_regs->hw_clkctrl_clkseq,
+                       CLKCTRL_CLKSEQ_BYPASS_CPU);
 }
 
 void mx28_power_clear_auto_restart(void)
@@ -104,6 +104,62 @@ void mx28_power_set_linreg(void)
                        POWER_VDDIOCTRL_LINREG_OFFSET_1STEPS_BELOW);
 }
 
+int mx28_get_batt_volt(void)
+{
+       struct mx28_power_regs *power_regs =
+               (struct mx28_power_regs *)MXS_POWER_BASE;
+       uint32_t volt = readl(&power_regs->hw_power_battmonitor);
+       volt &= POWER_BATTMONITOR_BATT_VAL_MASK;
+       volt >>= POWER_BATTMONITOR_BATT_VAL_OFFSET;
+       volt *= 8;
+       return volt;
+}
+
+int mx28_is_batt_ready(void)
+{
+       return (mx28_get_batt_volt() >= 3600);
+}
+
+int mx28_is_batt_good(void)
+{
+       struct mx28_power_regs *power_regs =
+               (struct mx28_power_regs *)MXS_POWER_BASE;
+       uint32_t volt = mx28_get_batt_volt();
+
+       if ((volt >= 2400) && (volt <= 4300))
+               return 1;
+
+       clrsetbits_le32(&power_regs->hw_power_5vctrl,
+               POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK,
+               0x3 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);
+       writel(POWER_5VCTRL_PWD_CHARGE_4P2_MASK,
+               &power_regs->hw_power_5vctrl_clr);
+
+       clrsetbits_le32(&power_regs->hw_power_charge,
+               POWER_CHARGE_STOP_ILIMIT_MASK | POWER_CHARGE_BATTCHRG_I_MASK,
+               POWER_CHARGE_STOP_ILIMIT_10MA | 0x3);
+
+       writel(POWER_CHARGE_PWD_BATTCHRG, &power_regs->hw_power_charge_clr);
+       writel(POWER_5VCTRL_PWD_CHARGE_4P2_MASK,
+               &power_regs->hw_power_5vctrl_clr);
+
+       early_delay(500000);
+
+       volt = mx28_get_batt_volt();
+
+       if (volt >= 3500)
+               return 0;
+
+       if (volt >= 2400)
+               return 1;
+
+       writel(POWER_CHARGE_STOP_ILIMIT_MASK | POWER_CHARGE_BATTCHRG_I_MASK,
+               &power_regs->hw_power_charge_clr);
+       writel(POWER_CHARGE_PWD_BATTCHRG, &power_regs->hw_power_charge_set);
+
+       return 0;
+}
+
 void mx28_power_setup_5v_detect(void)
 {
        struct mx28_power_regs *power_regs =
@@ -399,9 +455,14 @@ void mx28_power_enable_4p2(void)
        mx28_power_init_4p2_regulator();
 
        /* Shutdown battery (none present) */
-       clrbits_le32(&power_regs->hw_power_dcdc4p2, POWER_DCDC4P2_BO_MASK);
-       writel(POWER_CTRL_DCDC4P2_BO_IRQ, &power_regs->hw_power_ctrl_clr);
-       writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr);
+       if (!mx28_is_batt_ready()) {
+               clrbits_le32(&power_regs->hw_power_dcdc4p2,
+                               POWER_DCDC4P2_BO_MASK);
+               writel(POWER_CTRL_DCDC4P2_BO_IRQ,
+                               &power_regs->hw_power_ctrl_clr);
+               writel(POWER_CTRL_ENIRQ_DCDC4P2_BO,
+                               &power_regs->hw_power_ctrl_clr);
+       }
 
        mx28_power_init_dcdc_4p2_source();
 
@@ -459,6 +520,50 @@ void mx28_powerdown(void)
                &power_regs->hw_power_reset);
 }
 
+void mx28_batt_boot(void)
+{
+       struct mx28_power_regs *power_regs =
+               (struct mx28_power_regs *)MXS_POWER_BASE;
+
+       clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_PWDN_5VBRNOUT);
+       clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_ENABLE_DCDC);
+
+       clrbits_le32(&power_regs->hw_power_dcdc4p2,
+                       POWER_DCDC4P2_ENABLE_DCDC | POWER_DCDC4P2_ENABLE_4P2);
+       writel(POWER_CHARGE_ENABLE_LOAD, &power_regs->hw_power_charge_clr);
+
+       /* 5V to battery handoff. */
+       setbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER);
+       early_delay(30);
+       clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER);
+
+       writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr);
+
+       clrsetbits_le32(&power_regs->hw_power_minpwr,
+                       POWER_MINPWR_HALFFETS, POWER_MINPWR_DOUBLE_FETS);
+
+       mx28_power_set_linreg();
+
+       clrbits_le32(&power_regs->hw_power_vdddctrl,
+               POWER_VDDDCTRL_DISABLE_FET | POWER_VDDDCTRL_ENABLE_LINREG);
+
+       clrbits_le32(&power_regs->hw_power_vddactrl,
+               POWER_VDDACTRL_DISABLE_FET | POWER_VDDACTRL_ENABLE_LINREG);
+
+       clrbits_le32(&power_regs->hw_power_vddioctrl,
+               POWER_VDDIOCTRL_DISABLE_FET);
+
+       setbits_le32(&power_regs->hw_power_5vctrl,
+               POWER_5VCTRL_PWD_CHARGE_4P2_MASK);
+
+       setbits_le32(&power_regs->hw_power_5vctrl,
+               POWER_5VCTRL_ENABLE_DCDC);
+
+       clrsetbits_le32(&power_regs->hw_power_5vctrl,
+               POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK,
+               0x8 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);
+}
+
 void mx28_handle_5v_conflict(void)
 {
        struct mx28_power_regs *power_regs =
@@ -483,23 +588,12 @@ void mx28_handle_5v_conflict(void)
                        mx28_powerdown();
                        break;
                }
-       }
-}
 
-int mx28_get_batt_volt(void)
-{
-       struct mx28_power_regs *power_regs =
-               (struct mx28_power_regs *)MXS_POWER_BASE;
-       uint32_t volt = readl(&power_regs->hw_power_battmonitor);
-       volt &= POWER_BATTMONITOR_BATT_VAL_MASK;
-       volt >>= POWER_BATTMONITOR_BATT_VAL_OFFSET;
-       volt *= 8;
-       return volt;
-}
-
-int mx28_is_batt_ready(void)
-{
-       return (mx28_get_batt_volt() >= 3600);
+               if (tmp & POWER_STS_PSWITCH_MASK) {
+                       mx28_batt_boot();
+                       break;
+               }
+       }
 }
 
 void mx28_5v_boot(void)
@@ -553,62 +647,44 @@ void mx28_switch_vddd_to_dcdc_source(void)
                POWER_VDDDCTRL_DISABLE_STEPPING);
 }
 
-int mx28_is_batt_good(void)
+void mx28_power_configure_power_source(void)
 {
+       int batt_ready, batt_good;
        struct mx28_power_regs *power_regs =
                (struct mx28_power_regs *)MXS_POWER_BASE;
-       uint32_t volt;
-
-       volt = readl(&power_regs->hw_power_battmonitor);
-       volt &= POWER_BATTMONITOR_BATT_VAL_MASK;
-       volt >>= POWER_BATTMONITOR_BATT_VAL_OFFSET;
-       volt *= 8;
+       struct mx28_lradc_regs *lradc_regs =
+               (struct mx28_lradc_regs *)MXS_LRADC_BASE;
 
-       if ((volt >= 2400) && (volt <= 4300))
-               return 1;
-
-       clrsetbits_le32(&power_regs->hw_power_5vctrl,
-               POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK,
-               0x3 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);
-       writel(POWER_5VCTRL_PWD_CHARGE_4P2_MASK,
-               &power_regs->hw_power_5vctrl_clr);
-
-       clrsetbits_le32(&power_regs->hw_power_charge,
-               POWER_CHARGE_STOP_ILIMIT_MASK | POWER_CHARGE_BATTCHRG_I_MASK,
-               POWER_CHARGE_STOP_ILIMIT_10MA | 0x3);
-
-       writel(POWER_CHARGE_PWD_BATTCHRG, &power_regs->hw_power_charge_clr);
-       writel(POWER_5VCTRL_PWD_CHARGE_4P2_MASK,
-               &power_regs->hw_power_5vctrl_clr);
-
-       early_delay(500000);
-
-       volt = readl(&power_regs->hw_power_battmonitor);
-       volt &= POWER_BATTMONITOR_BATT_VAL_MASK;
-       volt >>= POWER_BATTMONITOR_BATT_VAL_OFFSET;
-       volt *= 8;
-
-       if (volt >= 3500)
-               return 0;
-
-       if (volt >= 2400)
-               return 1;
-
-       writel(POWER_CHARGE_STOP_ILIMIT_MASK | POWER_CHARGE_BATTCHRG_I_MASK,
-               &power_regs->hw_power_charge_clr);
-       writel(POWER_CHARGE_PWD_BATTCHRG, &power_regs->hw_power_charge_set);
+       mx28_src_power_init();
 
-       return 0;
-}
+       batt_ready = mx28_is_batt_ready();
 
-void mx28_power_configure_power_source(void)
-{
-       mx28_src_power_init();
+       if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) {
+               batt_good = mx28_is_batt_good();
+               if (batt_ready) {
+                       /* 5V source detected, good battery detected. */
+                       mx28_batt_boot();
+               } else {
+                       if (batt_good) {
+                               /* 5V source detected, low battery detceted. */
+                       } else {
+                               /* 5V source detected, bad battery detected. */
+                               writel(LRADC_CONVERSION_AUTOMATIC,
+                                       &lradc_regs->hw_lradc_conversion_clr);
+                               clrbits_le32(&power_regs->hw_power_battmonitor,
+                                       POWER_BATTMONITOR_BATT_VAL_MASK);
+                       }
+                       mx28_5v_boot();
+               }
+       } else {
+               /* 5V not detected, booting from battery. */
+               mx28_batt_boot();
+       }
 
-       mx28_5v_boot();
        mx28_power_clock2pll();
 
        mx28_init_batt_bo();
+
        mx28_switch_vddd_to_dcdc_source();
 }
 
@@ -883,6 +959,13 @@ void mx28_power_set_vddd(uint32_t new_target, uint32_t new_brownout)
                        new_brownout << POWER_VDDDCTRL_BO_OFFSET_OFFSET);
 }
 
+void mx28_setup_batt_detect(void)
+{
+       mx28_lradc_init();
+       mx28_lradc_enable_batt_measurement();
+       early_delay(10);
+}
+
 void mx28_power_init(void)
 {
        struct mx28_power_regs *power_regs =
@@ -892,6 +975,9 @@ void mx28_power_init(void)
        mx28_power_clear_auto_restart();
        mx28_power_set_linreg();
        mx28_power_setup_5v_detect();
+
+       mx28_setup_batt_detect();
+
        mx28_power_configure_power_source();
        mx28_enable_output_rail_protection();
 
index d64ae6936c5924e948026cbd0b770901b8131d02..6b7a494d7ccd44068a3cdb04e4bdebc8abf7129e 100644 (file)
@@ -105,7 +105,7 @@ void init_timer(void)
 #if defined(CONFIG_OMAP_HSMMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
index f532d62e573fc6b09f1691aadd2cf3343634b769..5407cb68a89c29f001ac58e51ee024cbde128dcf 100644 (file)
 #
 PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -msoft-float
 
-# Make ARMv5 to allow more compilers to work, even though its v7a.
-PLATFORM_CPPFLAGS += -march=armv5
+# If armv7-a is not supported by GCC fall-back to armv5, which is
+# supported by more tool-chains
+PF_CPPFLAGS_ARMV7 := $(call cc-option, -march=armv7-a, -march=armv5)
+PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARMV7)
+
 # =========================================================================
 #
 # Supply options according to compiler version
index 124c38018c85b9b9806c5d7830a75e349bba6ecf..90ec2bd40486f8abd7dfba0a466fcf3bb28a08a8 100644 (file)
@@ -22,7 +22,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(SOC).o
 
-COBJS  += clock.o soc.o
+COBJS  += clock.o power.o soc.o system.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
index 2f7048b6a33e39540d4a68e38e99522854f981de..330bd75da9a87260dfdece6587f9f3669133a57d 100644 (file)
@@ -414,6 +414,170 @@ static void exynos5_set_mmc_clk(int dev_index, unsigned int div)
        writel(val, addr);
 }
 
+/* get_lcd_clk: return lcd clock frequency */
+static unsigned long exynos4_get_lcd_clk(void)
+{
+       struct exynos4_clock *clk =
+               (struct exynos4_clock *)samsung_get_base_clock();
+       unsigned long pclk, sclk;
+       unsigned int sel;
+       unsigned int ratio;
+
+       /*
+        * CLK_SRC_LCD0
+        * FIMD0_SEL [3:0]
+        */
+       sel = readl(&clk->src_lcd0);
+       sel = sel & 0xf;
+
+       /*
+        * 0x6: SCLK_MPLL
+        * 0x7: SCLK_EPLL
+        * 0x8: SCLK_VPLL
+        */
+       if (sel == 0x6)
+               sclk = get_pll_clk(MPLL);
+       else if (sel == 0x7)
+               sclk = get_pll_clk(EPLL);
+       else if (sel == 0x8)
+               sclk = get_pll_clk(VPLL);
+       else
+               return 0;
+
+       /*
+        * CLK_DIV_LCD0
+        * FIMD0_RATIO [3:0]
+        */
+       ratio = readl(&clk->div_lcd0);
+       ratio = ratio & 0xf;
+
+       pclk = sclk / (ratio + 1);
+
+       return pclk;
+}
+
+void exynos4_set_lcd_clk(void)
+{
+       struct exynos4_clock *clk =
+           (struct exynos4_clock *)samsung_get_base_clock();
+       unsigned int cfg = 0;
+
+       /*
+        * CLK_GATE_BLOCK
+        * CLK_CAM      [0]
+        * CLK_TV       [1]
+        * CLK_MFC      [2]
+        * CLK_G3D      [3]
+        * CLK_LCD0     [4]
+        * CLK_LCD1     [5]
+        * CLK_GPS      [7]
+        */
+       cfg = readl(&clk->gate_block);
+       cfg |= 1 << 4;
+       writel(cfg, &clk->gate_block);
+
+       /*
+        * CLK_SRC_LCD0
+        * FIMD0_SEL            [3:0]
+        * MDNIE0_SEL           [7:4]
+        * MDNIE_PWM0_SEL       [8:11]
+        * MIPI0_SEL            [12:15]
+        * set lcd0 src clock 0x6: SCLK_MPLL
+        */
+       cfg = readl(&clk->src_lcd0);
+       cfg &= ~(0xf);
+       cfg |= 0x6;
+       writel(cfg, &clk->src_lcd0);
+
+       /*
+        * CLK_GATE_IP_LCD0
+        * CLK_FIMD0            [0]
+        * CLK_MIE0             [1]
+        * CLK_MDNIE0           [2]
+        * CLK_DSIM0            [3]
+        * CLK_SMMUFIMD0        [4]
+        * CLK_PPMULCD0         [5]
+        * Gating all clocks for FIMD0
+        */
+       cfg = readl(&clk->gate_ip_lcd0);
+       cfg |= 1 << 0;
+       writel(cfg, &clk->gate_ip_lcd0);
+
+       /*
+        * CLK_DIV_LCD0
+        * FIMD0_RATIO          [3:0]
+        * MDNIE0_RATIO         [7:4]
+        * MDNIE_PWM0_RATIO     [11:8]
+        * MDNIE_PWM_PRE_RATIO  [15:12]
+        * MIPI0_RATIO          [19:16]
+        * MIPI0_PRE_RATIO      [23:20]
+        * set fimd ratio
+        */
+       cfg &= ~(0xf);
+       cfg |= 0x1;
+       writel(cfg, &clk->div_lcd0);
+}
+
+void exynos4_set_mipi_clk(void)
+{
+       struct exynos4_clock *clk =
+           (struct exynos4_clock *)samsung_get_base_clock();
+       unsigned int cfg = 0;
+
+       /*
+        * CLK_SRC_LCD0
+        * FIMD0_SEL            [3:0]
+        * MDNIE0_SEL           [7:4]
+        * MDNIE_PWM0_SEL       [8:11]
+        * MIPI0_SEL            [12:15]
+        * set mipi0 src clock 0x6: SCLK_MPLL
+        */
+       cfg = readl(&clk->src_lcd0);
+       cfg &= ~(0xf << 12);
+       cfg |= (0x6 << 12);
+       writel(cfg, &clk->src_lcd0);
+
+       /*
+        * CLK_SRC_MASK_LCD0
+        * FIMD0_MASK           [0]
+        * MDNIE0_MASK          [4]
+        * MDNIE_PWM0_MASK      [8]
+        * MIPI0_MASK           [12]
+        * set src mask mipi0 0x1: Unmask
+        */
+       cfg = readl(&clk->src_mask_lcd0);
+       cfg |= (0x1 << 12);
+       writel(cfg, &clk->src_mask_lcd0);
+
+       /*
+        * CLK_GATE_IP_LCD0
+        * CLK_FIMD0            [0]
+        * CLK_MIE0             [1]
+        * CLK_MDNIE0           [2]
+        * CLK_DSIM0            [3]
+        * CLK_SMMUFIMD0        [4]
+        * CLK_PPMULCD0         [5]
+        * Gating all clocks for MIPI0
+        */
+       cfg = readl(&clk->gate_ip_lcd0);
+       cfg |= 1 << 3;
+       writel(cfg, &clk->gate_ip_lcd0);
+
+       /*
+        * CLK_DIV_LCD0
+        * FIMD0_RATIO          [3:0]
+        * MDNIE0_RATIO         [7:4]
+        * MDNIE_PWM0_RATIO     [11:8]
+        * MDNIE_PWM_PRE_RATIO  [15:12]
+        * MIPI0_RATIO          [19:16]
+        * MIPI0_PRE_RATIO      [23:20]
+        * set mipi ratio
+        */
+       cfg &= ~(0xf << 16);
+       cfg |= (0x1 << 16);
+       writel(cfg, &clk->div_lcd0);
+}
+
 unsigned long get_pll_clk(int pllreg)
 {
        if (cpu_is_exynos5())
@@ -453,3 +617,23 @@ void set_mmc_clk(int dev_index, unsigned int div)
        else
                exynos4_set_mmc_clk(dev_index, div);
 }
+
+unsigned long get_lcd_clk(void)
+{
+       if (cpu_is_exynos4())
+               return exynos4_get_lcd_clk();
+       else
+               return 0;
+}
+
+void set_lcd_clk(void)
+{
+       if (cpu_is_exynos4())
+               exynos4_set_lcd_clk();
+}
+
+void set_mipi_clk(void)
+{
+       if (cpu_is_exynos4())
+               exynos4_set_mipi_clk();
+}
diff --git a/arch/arm/cpu/armv7/exynos/power.c b/arch/arm/cpu/armv7/exynos/power.c
new file mode 100644 (file)
index 0000000..c765304
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ * Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/power.h>
+
+static void exynos4_mipi_phy_control(unsigned int dev_index,
+                                       unsigned int enable)
+{
+       struct exynos4_power *pmu =
+           (struct exynos4_power *)samsung_get_base_power();
+       unsigned int addr, cfg = 0;
+
+       if (dev_index == 0)
+               addr = (unsigned int)&pmu->mipi_phy0_control;
+       else
+               addr = (unsigned int)&pmu->mipi_phy1_control;
+
+
+       cfg = readl(addr);
+       if (enable)
+               cfg |= (EXYNOS_MIPI_PHY_MRESETN | EXYNOS_MIPI_PHY_ENABLE);
+       else
+               cfg &= ~(EXYNOS_MIPI_PHY_MRESETN | EXYNOS_MIPI_PHY_ENABLE);
+
+       writel(cfg, addr);
+}
+
+void set_mipi_phy_ctrl(unsigned int dev_index, unsigned int enable)
+{
+       if (cpu_is_exynos4())
+               exynos4_mipi_phy_control(dev_index, enable);
+}
diff --git a/arch/arm/cpu/armv7/exynos/system.c b/arch/arm/cpu/armv7/exynos/system.c
new file mode 100644 (file)
index 0000000..6c34730
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ * Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/system.h>
+
+static void exynos4_set_system_display(void)
+{
+       struct exynos4_sysreg *sysreg =
+           (struct exynos4_sysreg *)samsung_get_base_sysreg();
+       unsigned int cfg = 0;
+
+       /*
+        * system register path set
+        * 0: MIE/MDNIE
+        * 1: FIMD Bypass
+        */
+       cfg = readl(&sysreg->display_ctrl);
+       cfg |= (1 << 1);
+       writel(cfg, &sysreg->display_ctrl);
+}
+
+void set_system_display_ctrl(void)
+{
+       if (cpu_is_exynos4())
+               exynos4_set_system_display();
+}
index 3d58d8ae9160c7f0ff2e0fceeb03d7a80aeab537..b3195dd6fb2a9817d37f2d6e0e37b83833ed2d7b 100644 (file)
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/arch/crm_regs.h>
 
 #ifdef CONFIG_FSL_ESDHC
 #include <fsl_esdhc.h>
 #endif
 
-static char *get_reset_cause(void)
+char *get_reset_cause(void)
 {
        u32 cause;
        struct src *src_regs = (struct src *)SRC_BASE_ADDR;
@@ -127,3 +128,15 @@ void reset_cpu(ulong addr)
 {
        __raw_writew(4, WDOG1_BASE_ADDR);
 }
+
+u32 get_ahb_clk(void)
+{
+       struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+       u32 reg, ahb_podf;
+
+       reg = __raw_readl(&imx_ccm->cbcdr);
+       reg &= MXC_CCM_CBCDR_AHB_PODF_MASK;
+       ahb_podf = reg >> MXC_CCM_CBCDR_AHB_PODF_OFFSET;
+
+       return get_periph_clk() / (ahb_podf + 1);
+}
index e92f10623a92bb6e72c2d4c3e947f58dffcce78b..fc2406bcad7ed7e343ad0616a99c6e7d81dbeda6 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
 #include <div64.h>
+#include <asm/arch/sys_proto.h>
 
 enum pll_clocks {
        PLL1_CLOCK = 0,
@@ -48,6 +49,42 @@ struct mxc_pll_reg *mxc_plls[PLL_CLOCKS] = {
 #endif
 };
 
+#define AHB_CLK_ROOT    133333333
+#define SZ_DEC_1M       1000000
+#define PLL_PD_MAX      16      /* Actual pd+1 */
+#define PLL_MFI_MAX     15
+#define PLL_MFI_MIN     5
+#define ARM_DIV_MAX     8
+#define IPG_DIV_MAX     4
+#define AHB_DIV_MAX     8
+#define EMI_DIV_MAX     8
+#define NFC_DIV_MAX     8
+
+#define MX5_CBCMR      0x00015154
+#define MX5_CBCDR      0x02888945
+
+struct fixed_pll_mfd {
+       u32 ref_clk_hz;
+       u32 mfd;
+};
+
+const struct fixed_pll_mfd fixed_mfd[] = {
+       {CONFIG_SYS_MX5_HCLK, 24 * 16},
+};
+
+struct pll_param {
+       u32 pd;
+       u32 mfi;
+       u32 mfn;
+       u32 mfd;
+};
+
+#define PLL_FREQ_MAX(ref_clk)  (4 * (ref_clk) * PLL_MFI_MAX)
+#define PLL_FREQ_MIN(ref_clk) \
+               ((2 * (ref_clk) * (PLL_MFI_MIN - 1)) / PLL_PD_MAX)
+#define MAX_DDR_CLK     420000000
+#define NFC_CLK_MAX     34000000
+
 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;
 
 void set_usboh3_clk(void)
@@ -192,7 +229,7 @@ u32 get_mcu_main_clk(void)
 /*
  * Get the rate of peripheral's root clock.
  */
-static u32 get_periph_clk(void)
+u32 get_periph_clk(void)
 {
        u32 reg;
 
@@ -212,22 +249,6 @@ static u32 get_periph_clk(void)
        /* NOTREACHED */
 }
 
-/*
- * Get the rate of ahb clock.
- */
-static u32 get_ahb_clk(void)
-{
-       uint32_t freq, div, reg;
-
-       freq = get_periph_clk();
-
-       reg = __raw_readl(&mxc_ccm->cbcdr);
-       div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
-                       MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
-
-       return freq / div;
-}
-
 /*
  * Get the rate of ipg clock.
  */
@@ -306,7 +327,7 @@ static u32 get_uart_clk(void)
 /*
  * This function returns the low power audio clock.
  */
-u32 get_lp_apm(void)
+static u32 get_lp_apm(void)
 {
        u32 ret_val = 0;
        u32 ccsr = __raw_readl(&mxc_ccm->ccsr);
@@ -322,7 +343,7 @@ u32 get_lp_apm(void)
 /*
  * get cspi clock rate.
  */
-u32 imx_get_cspiclk(void)
+static u32 imx_get_cspiclk(void)
 {
        u32 ret_val = 0, pdf, pre_pdf, clk_sel;
        u32 cscmr1 = __raw_readl(&mxc_ccm->cscmr1);
@@ -359,8 +380,77 @@ u32 imx_get_cspiclk(void)
        return ret_val;
 }
 
+static u32 get_axi_a_clk(void)
+{
+       u32 cbcdr =  __raw_readl(&mxc_ccm->cbcdr);
+       u32 pdf = (cbcdr & MXC_CCM_CBCDR_AXI_A_PODF_MASK) \
+                       >> MXC_CCM_CBCDR_AXI_A_PODF_OFFSET;
+
+       return  get_periph_clk() / (pdf + 1);
+}
+
+static u32 get_axi_b_clk(void)
+{
+       u32 cbcdr =  __raw_readl(&mxc_ccm->cbcdr);
+       u32 pdf = (cbcdr & MXC_CCM_CBCDR_AXI_B_PODF_MASK) \
+                       >> MXC_CCM_CBCDR_AXI_B_PODF_OFFSET;
+
+       return  get_periph_clk() / (pdf + 1);
+}
+
+static u32 get_emi_slow_clk(void)
+{
+       u32 cbcdr = __raw_readl(&mxc_ccm->cbcdr);
+       u32 emi_clk_sel = cbcdr & MXC_CCM_CBCDR_EMI_CLK_SEL;
+       u32 pdf = (cbcdr & MXC_CCM_CBCDR_EMI_PODF_MASK) \
+                       >> MXC_CCM_CBCDR_EMI_PODF_OFFSET;
+
+       if (emi_clk_sel)
+               return  get_ahb_clk() / (pdf + 1);
+
+       return  get_periph_clk() / (pdf + 1);
+}
+
+static u32 get_ddr_clk(void)
+{
+       u32 ret_val = 0;
+       u32 cbcmr = __raw_readl(&mxc_ccm->cbcmr);
+       u32 ddr_clk_sel = (cbcmr & MXC_CCM_CBCMR_DDR_CLK_SEL_MASK) \
+                               >> MXC_CCM_CBCMR_DDR_CLK_SEL_OFFSET;
+#ifdef CONFIG_MX51
+       u32 cbcdr = __raw_readl(&mxc_ccm->cbcdr);
+       if (cbcdr & MXC_CCM_CBCDR_DDR_HIFREQ_SEL) {
+               u32 ddr_clk_podf = (cbcdr & MXC_CCM_CBCDR_DDR_PODF_MASK) >> \
+                                       MXC_CCM_CBCDR_DDR_PODF_OFFSET;
+
+               ret_val = decode_pll(mxc_plls[PLL1_CLOCK], CONFIG_SYS_MX5_HCLK);
+               ret_val /= ddr_clk_podf + 1;
+
+               return ret_val;
+       }
+#endif
+       switch (ddr_clk_sel) {
+       case 0:
+               ret_val = get_axi_a_clk();
+               break;
+       case 1:
+               ret_val = get_axi_b_clk();
+               break;
+       case 2:
+               ret_val = get_emi_slow_clk();
+               break;
+       case 3:
+               ret_val = get_ahb_clk();
+               break;
+       default:
+               break;
+       }
+
+       return ret_val;
+}
+
 /*
- * The API of get mxc clockes.
+ * The API of get mxc clocks.
  */
 unsigned int mxc_get_clock(enum mxc_clock clk)
 {
@@ -380,10 +470,14 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
        case MXC_FEC_CLK:
                return decode_pll(mxc_plls[PLL1_CLOCK],
                                    CONFIG_SYS_MX5_HCLK);
+       case MXC_SATA_CLK:
+               return get_ahb_clk();
+       case MXC_DDR_CLK:
+               return get_ddr_clk();
        default:
                break;
        }
-       return -1;
+       return -EINVAL;
 }
 
 u32 imx_get_uartclk(void)
@@ -397,6 +491,362 @@ u32 imx_get_fecclk(void)
        return mxc_get_clock(MXC_IPG_CLK);
 }
 
+static int gcd(int m, int n)
+{
+       int t;
+       while (m > 0) {
+               if (n > m) {
+                       t = m;
+                       m = n;
+                       n = t;
+               } /* swap */
+               m -= n;
+       }
+       return n;
+}
+
+/*
+ * This is to calculate various parameters based on reference clock and
+ * targeted clock based on the equation:
+ *      t_clk = 2*ref_freq*(mfi + mfn/(mfd+1))/(pd+1)
+ * This calculation is based on a fixed MFD value for simplicity.
+ */
+static int calc_pll_params(u32 ref, u32 target, struct pll_param *pll)
+{
+       u64 pd, mfi = 1, mfn, mfd, t1;
+       u32 n_target = target;
+       u32 n_ref = ref, i;
+
+       /*
+        * Make sure targeted freq is in the valid range.
+        * Otherwise the following calculation might be wrong!!!
+        */
+       if (n_target < PLL_FREQ_MIN(ref) ||
+               n_target > PLL_FREQ_MAX(ref)) {
+               printf("Targeted peripheral clock should be"
+                       "within [%d - %d]\n",
+                       PLL_FREQ_MIN(ref) / SZ_DEC_1M,
+                       PLL_FREQ_MAX(ref) / SZ_DEC_1M);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(fixed_mfd); i++) {
+               if (fixed_mfd[i].ref_clk_hz == ref) {
+                       mfd = fixed_mfd[i].mfd;
+                       break;
+               }
+       }
+
+       if (i == ARRAY_SIZE(fixed_mfd))
+               return -EINVAL;
+
+       /* Use n_target and n_ref to avoid overflow */
+       for (pd = 1; pd <= PLL_PD_MAX; pd++) {
+               t1 = n_target * pd;
+               do_div(t1, (4 * n_ref));
+               mfi = t1;
+               if (mfi > PLL_MFI_MAX)
+                       return -EINVAL;
+               else if (mfi < 5)
+                       continue;
+               break;
+       }
+       /*
+        * Now got pd and mfi already
+        *
+        * mfn = (((n_target * pd) / 4 - n_ref * mfi) * mfd) / n_ref;
+        */
+       t1 = n_target * pd;
+       do_div(t1, 4);
+       t1 -= n_ref * mfi;
+       t1 *= mfd;
+       do_div(t1, n_ref);
+       mfn = t1;
+       debug("ref=%d, target=%d, pd=%d," "mfi=%d,mfn=%d, mfd=%d\n",
+               ref, n_target, (u32)pd, (u32)mfi, (u32)mfn, (u32)mfd);
+       i = 1;
+       if (mfn != 0)
+               i = gcd(mfd, mfn);
+       pll->pd = (u32)pd;
+       pll->mfi = (u32)mfi;
+       do_div(mfn, i);
+       pll->mfn = (u32)mfn;
+       do_div(mfd, i);
+       pll->mfd = (u32)mfd;
+
+       return 0;
+}
+
+#define calc_div(tgt_clk, src_clk, limit) ({           \
+               u32 v = 0;                              \
+               if (((src_clk) % (tgt_clk)) <= 100)     \
+                       v = (src_clk) / (tgt_clk);      \
+               else                                    \
+                       v = ((src_clk) / (tgt_clk)) + 1;\
+               if (v > limit)                          \
+                       v = limit;                      \
+               (v - 1);                                \
+       })
+
+#define CHANGE_PLL_SETTINGS(pll, pd, fi, fn, fd) \
+       {       \
+               __raw_writel(0x1232, &pll->ctrl);               \
+               __raw_writel(0x2, &pll->config);                \
+               __raw_writel((((pd) - 1) << 0) | ((fi) << 4),   \
+                       &pll->op);                              \
+               __raw_writel(fn, &(pll->mfn));                  \
+               __raw_writel((fd) - 1, &pll->mfd);              \
+               __raw_writel((((pd) - 1) << 0) | ((fi) << 4),   \
+                       &pll->hfs_op);                          \
+               __raw_writel(fn, &pll->hfs_mfn);                \
+               __raw_writel((fd) - 1, &pll->hfs_mfd);          \
+               __raw_writel(0x1232, &pll->ctrl);               \
+               while (!__raw_readl(&pll->ctrl) & 0x1)          \
+                       ;\
+       }
+
+static int config_pll_clk(enum pll_clocks index, struct pll_param *pll_param)
+{
+       u32 ccsr = __raw_readl(&mxc_ccm->ccsr);
+       struct mxc_pll_reg *pll = mxc_plls[index];
+
+       switch (index) {
+       case PLL1_CLOCK:
+               /* Switch ARM to PLL2 clock */
+               __raw_writel(ccsr | 0x4, &mxc_ccm->ccsr);
+               CHANGE_PLL_SETTINGS(pll, pll_param->pd,
+                                       pll_param->mfi, pll_param->mfn,
+                                       pll_param->mfd);
+               /* Switch back */
+               __raw_writel(ccsr & ~0x4, &mxc_ccm->ccsr);
+               break;
+       case PLL2_CLOCK:
+               /* Switch to pll2 bypass clock */
+               __raw_writel(ccsr | 0x2, &mxc_ccm->ccsr);
+               CHANGE_PLL_SETTINGS(pll, pll_param->pd,
+                                       pll_param->mfi, pll_param->mfn,
+                                       pll_param->mfd);
+               /* Switch back */
+               __raw_writel(ccsr & ~0x2, &mxc_ccm->ccsr);
+               break;
+       case PLL3_CLOCK:
+               /* Switch to pll3 bypass clock */
+               __raw_writel(ccsr | 0x1, &mxc_ccm->ccsr);
+               CHANGE_PLL_SETTINGS(pll, pll_param->pd,
+                                       pll_param->mfi, pll_param->mfn,
+                                       pll_param->mfd);
+               /* Switch back */
+               __raw_writel(ccsr & ~0x1, &mxc_ccm->ccsr);
+               break;
+       case PLL4_CLOCK:
+               /* Switch to pll4 bypass clock */
+               __raw_writel(ccsr | 0x20, &mxc_ccm->ccsr);
+               CHANGE_PLL_SETTINGS(pll, pll_param->pd,
+                                       pll_param->mfi, pll_param->mfn,
+                                       pll_param->mfd);
+               /* Switch back */
+               __raw_writel(ccsr & ~0x20, &mxc_ccm->ccsr);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* Config CPU clock */
+static int config_core_clk(u32 ref, u32 freq)
+{
+       int ret = 0;
+       struct pll_param pll_param;
+
+       memset(&pll_param, 0, sizeof(struct pll_param));
+
+       /* The case that periph uses PLL1 is not considered here */
+       ret = calc_pll_params(ref, freq, &pll_param);
+       if (ret != 0) {
+               printf("Error:Can't find pll parameters: %d\n", ret);
+               return ret;
+       }
+
+       return config_pll_clk(PLL1_CLOCK, &pll_param);
+}
+
+static int config_nfc_clk(u32 nfc_clk)
+{
+       u32 reg;
+       u32 parent_rate = get_emi_slow_clk();
+       u32 div = parent_rate / nfc_clk;
+
+       if (nfc_clk <= 0)
+               return -EINVAL;
+       if (div == 0)
+               div++;
+       if (parent_rate / div > NFC_CLK_MAX)
+               div++;
+       reg = __raw_readl(&mxc_ccm->cbcdr);
+       reg &= ~MXC_CCM_CBCDR_NFC_PODF_MASK;
+       reg |= (div - 1) << MXC_CCM_CBCDR_NFC_PODF_OFFSET;
+       __raw_writel(reg, &mxc_ccm->cbcdr);
+       while (__raw_readl(&mxc_ccm->cdhipr) != 0)
+               ;
+       return 0;
+}
+
+/* Config main_bus_clock for periphs */
+static int config_periph_clk(u32 ref, u32 freq)
+{
+       int ret = 0;
+       struct pll_param pll_param;
+
+       memset(&pll_param, 0, sizeof(struct pll_param));
+
+       if (__raw_readl(&mxc_ccm->cbcdr) & MXC_CCM_CBCDR_PERIPH_CLK_SEL) {
+               ret = calc_pll_params(ref, freq, &pll_param);
+               if (ret != 0) {
+                       printf("Error:Can't find pll parameters: %d\n",
+                               ret);
+                       return ret;
+               }
+               switch ((__raw_readl(&mxc_ccm->cbcmr) & \
+                       MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK) >> \
+                       MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET) {
+               case 0:
+                       return config_pll_clk(PLL1_CLOCK, &pll_param);
+                       break;
+               case 1:
+                       return config_pll_clk(PLL3_CLOCK, &pll_param);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       return 0;
+}
+
+static int config_ddr_clk(u32 emi_clk)
+{
+       u32 clk_src;
+       s32 shift = 0, clk_sel, div = 1;
+       u32 cbcmr = __raw_readl(&mxc_ccm->cbcmr);
+       u32 cbcdr = __raw_readl(&mxc_ccm->cbcdr);
+
+       if (emi_clk > MAX_DDR_CLK) {
+               printf("Warning:DDR clock should not exceed %d MHz\n",
+                       MAX_DDR_CLK / SZ_DEC_1M);
+               emi_clk = MAX_DDR_CLK;
+       }
+
+       clk_src = get_periph_clk();
+       /* Find DDR clock input */
+       clk_sel = (cbcmr >> 10) & 0x3;
+       switch (clk_sel) {
+       case 0:
+               shift = 16;
+               break;
+       case 1:
+               shift = 19;
+               break;
+       case 2:
+               shift = 22;
+               break;
+       case 3:
+               shift = 10;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if ((clk_src % emi_clk) < 10000000)
+               div = clk_src / emi_clk;
+       else
+               div = (clk_src / emi_clk) + 1;
+       if (div > 8)
+               div = 8;
+
+       cbcdr = cbcdr & ~(0x7 << shift);
+       cbcdr |= ((div - 1) << shift);
+       __raw_writel(cbcdr, &mxc_ccm->cbcdr);
+       while (__raw_readl(&mxc_ccm->cdhipr) != 0)
+               ;
+       __raw_writel(0x0, &mxc_ccm->ccdr);
+
+       return 0;
+}
+
+/*
+ * This function assumes the expected core clock has to be changed by
+ * modifying the PLL. This is NOT true always but for most of the times,
+ * it is. So it assumes the PLL output freq is the same as the expected
+ * core clock (presc=1) unless the core clock is less than PLL_FREQ_MIN.
+ * In the latter case, it will try to increase the presc value until
+ * (presc*core_clk) is greater than PLL_FREQ_MIN. It then makes call to
+ * calc_pll_params() and obtains the values of PD, MFI,MFN, MFD based
+ * on the targeted PLL and reference input clock to the PLL. Lastly,
+ * it sets the register based on these values along with the dividers.
+ * Note 1) There is no value checking for the passed-in divider values
+ *         so the caller has to make sure those values are sensible.
+ *      2) Also adjust the NFC divider such that the NFC clock doesn't
+ *         exceed NFC_CLK_MAX.
+ *      3) IPU HSP clock is independent of AHB clock. Even it can go up to
+ *         177MHz for higher voltage, this function fixes the max to 133MHz.
+ *      4) This function should not have allowed diag_printf() calls since
+ *         the serial driver has been stoped. But leave then here to allow
+ *         easy debugging by NOT calling the cyg_hal_plf_serial_stop().
+ */
+int mxc_set_clock(u32 ref, u32 freq, enum mxc_clock clk)
+{
+       freq *= SZ_DEC_1M;
+
+       switch (clk) {
+       case MXC_ARM_CLK:
+               if (config_core_clk(ref, freq))
+                       return -EINVAL;
+               break;
+       case MXC_PERIPH_CLK:
+               if (config_periph_clk(ref, freq))
+                       return -EINVAL;
+               break;
+       case MXC_DDR_CLK:
+               if (config_ddr_clk(freq))
+                       return -EINVAL;
+               break;
+       case MXC_NFC_CLK:
+               if (config_nfc_clk(freq))
+                       return -EINVAL;
+               break;
+       default:
+               printf("Warning:Unsupported or invalid clock type\n");
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_MX53
+/*
+ * The clock for the external interface can be set to use internal clock
+ * if fuse bank 4, row 3, bit 2 is set.
+ * This is an undocumented feature and it was confirmed by Freescale's support:
+ * Fuses (but not pins) may be used to configure SATA clocks.
+ * Particularly the i.MX53 Fuse_Map contains the next information
+ * about configuring SATA clocks :  SATA_ALT_REF_CLK[1:0] (offset 0x180C)
+ * '00' - 100MHz (External)
+ * '01' - 50MHz (External)
+ * '10' - 120MHz, internal (USB PHY)
+ * '11' - Reserved
+*/
+void mxc_set_sata_internal_clock(void)
+{
+       u32 *tmp_base =
+               (u32 *)(IIM_BASE_ADDR + 0x180c);
+
+       set_usb_phy1_clk();
+
+       writel((readl(tmp_base) & (~0x7)) | 0x4, tmp_base);
+}
+#endif
+
 /*
  * Dump some core clockes.
  */
@@ -419,6 +869,7 @@ int do_mx5_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        printf("AHB        %8d kHz\n", mxc_get_clock(MXC_AHB_CLK) / 1000);
        printf("IPG        %8d kHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000);
        printf("IPG PERCLK %8d kHz\n", mxc_get_clock(MXC_IPG_PERCLK) / 1000);
+       printf("DDR        %8d kHz\n", mxc_get_clock(MXC_DDR_CLK) / 1000);
 
        return 0;
 }
index 74ab753a4af24915ded55df1c5ea4e34282de58b..683a7b53af84dd76ce0cc8803969b9c6032b2586 100644 (file)
@@ -22,6 +22,7 @@
 #include <config.h>
 #include <asm/arch/imx-regs.h>
 #include <generated/asm-offsets.h>
+#include <linux/linkage.h>
 
 /*
  * L2CC Cache setup/invalidation/disable
 
 .section ".text.init", "x"
 
-.globl lowlevel_init
-lowlevel_init:
+ENTRY(lowlevel_init)
 #if defined(CONFIG_MX51)
        ldr r0, =GPIO1_BASE_ADDR
        ldr r1, [r0, #0x0]
@@ -348,6 +348,7 @@ lowlevel_init:
 
        /* r12 saved upper lr*/
        mov pc,lr
+ENDPROC(lowlevel_init)
 
 /* Board level setting value */
 W_DP_OP_864:              .word DP_OP_864
index ef98563ff7639a3895e5dc00acd9cc30bb3c6772..52d5dc4d90b9614a3156dd822a28b4c15c05cdb2 100644 (file)
@@ -24,8 +24,9 @@
 #include <asm/io.h>
 #include <asm/errno.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/ccm_regs.h>
+#include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/sys_proto.h>
 
 enum pll_clocks {
        PLL_SYS,        /* System PLL */
@@ -34,7 +35,7 @@ enum pll_clocks {
        PLL_ENET,       /* ENET PLL */
 };
 
-struct imx_ccm_reg *imx_ccm = (struct imx_ccm_reg *)CCM_BASE_ADDR;
+struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
 
 void enable_usboh3_clk(unsigned char enable)
 {
@@ -92,7 +93,7 @@ static u32 get_mcu_main_clk(void)
        return freq / (reg + 1);
 }
 
-static u32 get_periph_clk(void)
+u32 get_periph_clk(void)
 {
        u32 reg, freq = 0;
 
@@ -139,18 +140,6 @@ static u32 get_periph_clk(void)
        return freq;
 }
 
-
-static u32 get_ahb_clk(void)
-{
-       u32 reg, ahb_podf;
-
-       reg = __raw_readl(&imx_ccm->cbcdr);
-       reg &= MXC_CCM_CBCDR_AHB_PODF_MASK;
-       ahb_podf = reg >> MXC_CCM_CBCDR_AHB_PODF_OFFSET;
-
-       return get_periph_clk() / (ahb_podf + 1);
-}
-
 static u32 get_ipg_clk(void)
 {
        u32 reg, ipg_podf;
@@ -303,6 +292,37 @@ u32 imx_get_fecclk(void)
        return decode_pll(PLL_ENET, CONFIG_SYS_MX6_HCLK);
 }
 
+int enable_sata_clock(void)
+{
+       u32 reg = 0;
+       s32 timeout = 100000;
+       struct mxc_ccm_reg *const imx_ccm
+               = (struct mxc_ccm_reg *) CCM_BASE_ADDR;
+
+       /* Enable sata clock */
+       reg = readl(&imx_ccm->CCGR5); /* CCGR5 */
+       reg |= MXC_CCM_CCGR5_CG2_MASK;
+       writel(reg, &imx_ccm->CCGR5);
+
+       /* Enable PLLs */
+       reg = readl(&imx_ccm->analog_pll_enet);
+       reg &= ~BM_ANADIG_PLL_SYS_POWERDOWN;
+       writel(reg, &imx_ccm->analog_pll_enet);
+       reg |= BM_ANADIG_PLL_SYS_ENABLE;
+       while (timeout--) {
+               if (readl(&imx_ccm->analog_pll_enet) & BM_ANADIG_PLL_SYS_LOCK)
+                       break;
+       }
+       if (timeout <= 0)
+               return -EIO;
+       reg &= ~BM_ANADIG_PLL_SYS_BYPASS;
+       writel(reg, &imx_ccm->analog_pll_enet);
+       reg |= BM_ANADIG_PLL_ENET_ENABLE_SATA;
+       writel(reg, &imx_ccm->analog_pll_enet);
+
+       return 0 ;
+}
+
 unsigned int mxc_get_clock(enum mxc_clock clk)
 {
        switch (clk) {
index 1864356d0bf7b54265a42442f74a3baf756028f2..acadef221c8e845873c56563be1a20385aeda964 100644 (file)
@@ -18,7 +18,8 @@
  */
 .section ".text.init", "x"
 
-.globl lowlevel_init
-lowlevel_init:
+#include <linux/linkage.h>
 
+ENTRY(lowlevel_init)
        mov pc, lr
+ENDPROC(lowlevel_init)
index 543b2cc6d8a7bbdfea138e13144463eeb11269e6..90f208809ba62a1ccd4db22f86d26791311c553a 100644 (file)
@@ -77,10 +77,40 @@ void init_aips(void)
        writel(0x00000000, &aips2->opacr4);
 }
 
+/*
+ * Set the VDDSOC
+ *
+ * Mask out the REG_CORE[22:18] bits (REG2_TRIG) and set
+ * them to the specified millivolt level.
+ * Possible values are from 0.725V to 1.450V in steps of
+ * 0.025V (25mV).
+ */
+void set_vddsoc(u32 mv)
+{
+       struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
+       u32 val, reg = readl(&anatop->reg_core);
+
+       if (mv < 725)
+               val = 0x00;     /* Power gated off */
+       else if (mv > 1450)
+               val = 0x1F;     /* Power FET switched full on. No regulation */
+       else
+               val = (mv - 700) / 25;
+
+       /*
+        * Mask out the REG_CORE[22:18] bits (REG2_TRIG)
+        * and set them to the calculated value (0.7V + val * 0.25V)
+        */
+       reg = (reg & ~(0x1F << 18)) | (val << 18);
+       writel(reg, &anatop->reg_core);
+}
+
 int arch_cpu_init(void)
 {
        init_aips();
 
+       set_vddsoc(1200);       /* Set VDDSOC to 1.2V */
+
        return 0;
 }
 #endif
index 447fcd5eff12316e97a0162dab2ac6038b0e1924..2a6625f1c4d0deb742ab0aa9846f82eecc278584 100644 (file)
@@ -37,6 +37,7 @@ ifneq ($(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
 COBJS  += hwinit-common.o
 COBJS  += clocks-common.o
 COBJS  += emif-common.o
+COBJS  += vc.o
 endif
 
 ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
index 4e7456992f744c9d075f74c0cd7be4a06c556044..10d286a6d4d84435fe485c20e618b25e75519705 100644 (file)
@@ -245,6 +245,11 @@ void configure_mpu_dpll(void)
                        CM_CLKSEL_DCC_EN_MASK);
        }
 
+       setbits_le32(&prcm->cm_mpu_mpu_clkctrl,
+               MPU_CLKCTRL_CLKSEL_EMIF_DIV_MODE_MASK);
+       setbits_le32(&prcm->cm_mpu_mpu_clkctrl,
+               MPU_CLKCTRL_CLKSEL_ABE_DIV_MODE_MASK);
+
        params = get_mpu_dpll_params();
 
        do_setup_dpll(&prcm->cm_clkmode_dpll_mpu, params, DPLL_LOCK, "mpu");
@@ -360,56 +365,51 @@ static void setup_non_essential_dplls(void)
 }
 #endif
 
-void do_scale_tps62361(u32 reg, u32 volt_mv)
+void do_scale_tps62361(int gpio, u32 reg, u32 volt_mv)
 {
-       u32 temp, step;
+       u32 step;
+       int ret = 0;
+
+       /* See if we can first get the GPIO if needed */
+       if (gpio >= 0)
+               ret = gpio_request(gpio, "TPS62361_VSEL0_GPIO");
+       if (ret < 0) {
+               printf("%s: gpio %d request failed %d\n", __func__, gpio, ret);
+               gpio = -1;
+       }
+
+       /* Pull the GPIO low to select SET0 register, while we program SET1 */
+       if (gpio >= 0)
+               gpio_direction_output(gpio, 0);
 
        step = volt_mv - TPS62361_BASE_VOLT_MV;
        step /= 10;
 
-       temp = TPS62361_I2C_SLAVE_ADDR |
-           (reg << PRM_VC_VAL_BYPASS_REGADDR_SHIFT) |
-           (step << PRM_VC_VAL_BYPASS_DATA_SHIFT) |
-           PRM_VC_VAL_BYPASS_VALID_BIT;
        debug("do_scale_tps62361: volt - %d step - 0x%x\n", volt_mv, step);
-
-       writel(temp, &prcm->prm_vc_val_bypass);
-       if (!wait_on_value(PRM_VC_VAL_BYPASS_VALID_BIT, 0,
-                               &prcm->prm_vc_val_bypass, LDELAY)) {
+       if (omap_vc_bypass_send_value(TPS62361_I2C_SLAVE_ADDR, reg, step))
                puts("Scaling voltage failed for vdd_mpu from TPS\n");
-       }
+
+       /* Pull the GPIO high to select SET1 register */
+       if (gpio >= 0)
+               gpio_direction_output(gpio, 1);
 }
 
 void do_scale_vcore(u32 vcore_reg, u32 volt_mv)
 {
-       u32 temp, offset_code;
-       u32 step = 12660; /* 12.66 mV represented in uV */
+       u32 offset_code;
        u32 offset = volt_mv;
 
        /* convert to uV for better accuracy in the calculations */
        offset *= 1000;
 
-       if (omap_revision() == OMAP4430_ES1_0)
-               offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV;
-       else
-               offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV;
-
-       offset_code = (offset + step - 1) / step;
-       /* The code starts at 1 not 0 */
-       offset_code++;
+       offset_code = get_offset_code(offset);
 
        debug("do_scale_vcore: volt - %d offset_code - 0x%x\n", volt_mv,
                offset_code);
 
-       temp = SMPS_I2C_SLAVE_ADDR |
-           (vcore_reg << PRM_VC_VAL_BYPASS_REGADDR_SHIFT) |
-           (offset_code << PRM_VC_VAL_BYPASS_DATA_SHIFT) |
-           PRM_VC_VAL_BYPASS_VALID_BIT;
-       writel(temp, &prcm->prm_vc_val_bypass);
-       if (!wait_on_value(PRM_VC_VAL_BYPASS_VALID_BIT, 0,
-                               &prcm->prm_vc_val_bypass, LDELAY)) {
+       if (omap_vc_bypass_send_value(SMPS_I2C_SLAVE_ADDR,
+                               vcore_reg, offset_code))
                printf("Scaling voltage failed for 0x%x\n", vcore_reg);
-       }
 }
 
 static inline void enable_clock_domain(u32 *const clkctrl_reg, u32 enable_mode)
@@ -452,6 +452,7 @@ void freq_update_core(void)
 {
        u32 freq_config1 = 0;
        const struct dpll_params *core_dpll_params;
+       u32 omap_rev = omap_revision();
 
        core_dpll_params = get_core_dpll_params();
        /* Put EMIF clock domain in sw wakeup mode */
@@ -477,11 +478,18 @@ void freq_update_core(void)
                hang();
        }
 
-       /* Put EMIF clock domain back in hw auto mode */
-       enable_clock_domain(&prcm->cm_memif_clkstctrl,
-                               CD_CLKCTRL_CLKTRCTRL_HW_AUTO);
-       wait_for_clk_enable(&prcm->cm_memif_emif_1_clkctrl);
-       wait_for_clk_enable(&prcm->cm_memif_emif_2_clkctrl);
+       /*
+        * Putting EMIF in HW_AUTO is seen to be causing issues with
+        * EMIF clocks and the master DLL. Put EMIF in SW_WKUP
+        * in OMAP5430 ES1.0 silicon
+        */
+       if (omap_rev != OMAP5430_ES1_0) {
+               /* Put EMIF clock domain back in hw auto mode */
+               enable_clock_domain(&prcm->cm_memif_clkstctrl,
+                                       CD_CLKCTRL_CLKTRCTRL_HW_AUTO);
+               wait_for_clk_enable(&prcm->cm_memif_emif_1_clkctrl);
+               wait_for_clk_enable(&prcm->cm_memif_emif_2_clkctrl);
+       }
 }
 
 void bypass_dpll(u32 *const base)
@@ -529,29 +537,6 @@ void setup_clocks_for_console(void)
                        CD_CLKCTRL_CLKTRCTRL_SHIFT);
 }
 
-void setup_sri2c(void)
-{
-       u32 sys_clk_khz, cycles_hi, cycles_low, temp;
-
-       sys_clk_khz = get_sys_clk_freq() / 1000;
-
-       /*
-        * Setup the dedicated I2C controller for Voltage Control
-        * I2C clk - high period 40% low period 60%
-        */
-       cycles_hi = sys_clk_khz * 4 / PRM_VC_I2C_CHANNEL_FREQ_KHZ / 10;
-       cycles_low = sys_clk_khz * 6 / PRM_VC_I2C_CHANNEL_FREQ_KHZ / 10;
-       /* values to be set in register - less by 5 & 7 respectively */
-       cycles_hi -= 5;
-       cycles_low -= 7;
-       temp = (cycles_hi << PRM_VC_CFG_I2C_CLK_SCLH_SHIFT) |
-              (cycles_low << PRM_VC_CFG_I2C_CLK_SCLL_SHIFT);
-       writel(temp, &prcm->prm_vc_cfg_i2c_clk);
-
-       /* Disable high speed mode and all advanced features */
-       writel(0x0, &prcm->prm_vc_cfg_i2c_mode);
-}
-
 void do_enable_clocks(u32 *const *clk_domains,
                            u32 *const *clk_modules_hw_auto,
                            u32 *const *clk_modules_explicit_en,
index 62678ff5d30739ce6dc0a4fdb5ea398acc3d31ea..db509c92951cd2ca3dcdd659e54949e135e02d63 100644 (file)
@@ -90,20 +90,33 @@ static void do_lpddr2_init(u32 base, u32 cs)
         * tZQINIT = 1 us
         * Enough loops assuming a maximum of 2GHz
         */
+
        sdelay(2000);
-       set_mr(base, cs, LPDDR2_MR1, MR1_BL_8_BT_SEQ_WRAP_EN_NWR_3);
+
+       if (omap_revision() >= OMAP5430_ES1_0)
+               set_mr(base, cs, LPDDR2_MR1, MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8);
+       else
+               set_mr(base, cs, LPDDR2_MR1, MR1_BL_8_BT_SEQ_WRAP_EN_NWR_3);
+
        set_mr(base, cs, LPDDR2_MR16, MR16_REF_FULL_ARRAY);
+
        /*
         * Enable refresh along with writing MR2
         * Encoding of RL in MR2 is (RL - 2)
         */
        mr_addr = LPDDR2_MR2 | EMIF_REG_REFRESH_EN_MASK;
        set_mr(base, cs, mr_addr, RL_FINAL - 2);
+
+       if (omap_revision() >= OMAP5430_ES1_0)
+               set_mr(base, cs, LPDDR2_MR3, 0x1);
 }
 
 static void lpddr2_init(u32 base, const struct emif_regs *regs)
 {
        struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
+       u32 *ext_phy_ctrl_base = 0;
+       u32 *emif_ext_phy_ctrl_base = 0;
+       u32 i = 0;
 
        /* Not NVM */
        clrbits_le32(&emif->emif_lpddr2_nvm_config, EMIF_REG_CS1NVMEN_MASK);
@@ -119,7 +132,31 @@ static void lpddr2_init(u32 base, const struct emif_regs *regs)
         * un-locked frequency & default RL
         */
        writel(regs->sdram_config_init, &emif->emif_sdram_config);
-       writel(regs->emif_ddr_phy_ctlr_1_init, &emif->emif_ddr_phy_ctrl_1);
+       writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1);
+
+       ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
+       emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
+
+       if (omap_revision() >= OMAP5430_ES1_0) {
+               /* Configure external phy control timing registers */
+               for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
+                       writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
+                       /* Update shadow registers */
+                       writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
+               }
+
+               /*
+                * external phy 6-24 registers do not change with
+                * ddr frequency
+                */
+               for (i = 0; i < EMIF_EXT_PHY_CTRL_CONST_REG; i++) {
+                       writel(ext_phy_ctrl_const_base[i],
+                                               emif_ext_phy_ctrl_base++);
+                       /* Update shadow registers */
+                       writel(ext_phy_ctrl_const_base[i],
+                                               emif_ext_phy_ctrl_base++);
+               }
+       }
 
        do_lpddr2_init(base, CS0);
        if (regs->sdram_config & EMIF_REG_EBANK_MASK)
index ab46bff5af7ab32b62e9fbb243e0896737c2a1aa..cf71ab444382c7179982eb02a44ab798c6a397a0 100644 (file)
@@ -202,22 +202,16 @@ int checkboard(void)
        return 0;
 }
 
-/*
-* This function is called by start_armboot. You can reliably use static
-* data. Any boot-time function that require static data should be
-* called from here
-*/
-int arch_cpu_init(void)
-{
-       return 0;
-}
-
 /*
  *  get_device_type(): tell if GP/HS/EMU/TST
  */
 u32 get_device_type(void)
 {
-       return 0;
+       struct omap_sys_ctrl_regs *ctrl =
+                     (struct omap_sys_ctrl_regs *) SYSCTRL_GENERAL_CORE_BASE;
+
+       return (readl(&ctrl->control_status) &
+                                     (DEVICE_TYPE_MASK)) >> DEVICE_TYPE_SHIFT;
 }
 
 /*
index 35f38acf5d09c83cba4b0bc04f62124950584055..ccc6bb6b85389c64b6ebca7787d2d33b9c2b4a92 100644 (file)
@@ -27,9 +27,9 @@
  */
 
 #include <asm/arch/omap.h>
+#include <linux/linkage.h>
 
-.global save_boot_params
-save_boot_params:
+ENTRY(save_boot_params)
        /*
         * See if the rom code passed pointer is valid:
         * It is not valid if it is not in non-secure SRAM
@@ -76,10 +76,9 @@ save_boot_params:
        strb    r2, [r3, #CH_FLAGS_OFFSET]
 1:
        bx      lr
+ENDPROC(save_boot_params)
 
-
-.globl lowlevel_init
-lowlevel_init:
+ENTRY(lowlevel_init)
        /*
         * Setup a temporary stack
         */
@@ -95,12 +94,13 @@ lowlevel_init:
         */
        bl      s_init
        pop     {ip, pc}
+ENDPROC(lowlevel_init)
 
-.globl set_pl310_ctrl_reg
-set_pl310_ctrl_reg:
+ENTRY(set_pl310_ctrl_reg)
        PUSH    {r4-r11, lr}    @ save registers - ROM code may pollute
                                @ our registers
        LDR     r12, =0x102     @ Set PL310 control register - value in R0
        .word   0xe1600070      @ SMC #0 - hand assembled because -march=armv5
                                @ call ROM Code API to set control register
        POP     {r4-r11, pc}
+ENDPROC(set_pl310_ctrl_reg)
diff --git a/arch/arm/cpu/armv7/omap-common/reset.S b/arch/arm/cpu/armv7/omap-common/reset.S
deleted file mode 100644 (file)
index 838b122..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2009 Samsung Electronics.
- * Minkyu Kang <mk7.kang@samsung.com>
- *
- * 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
- */
-
-#include <config.h>
-
-.global reset_cpu
-reset_cpu:
-       ldr     r1, rstctl                      @ get addr for global reset
-                                               @ reg
-       ldr     r3, rstbit                      @ sw reset bit
-       str     r3, [r1]                        @ force reset
-       mov     r0, r0
-_loop_forever:
-       b       _loop_forever
-rstctl:
-       .word   PRM_RSTCTRL
-rstbit:
-       .word   PRM_RSTCTRL_RESET
diff --git a/arch/arm/cpu/armv7/omap-common/reset.c b/arch/arm/cpu/armv7/omap-common/reset.c
new file mode 100644 (file)
index 0000000..234e90a
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ *
+ * Common layer for reset related functionality of OMAP based socs.
+ *
+ * (C) Copyright 2012
+ * Texas Instruments, <www.ti.com>
+ *
+ * Sricharan R <r.sricharan@ti.com>
+ *
+ * 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
+ */
+#include <config.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <linux/compiler.h>
+
+void __weak reset_cpu(unsigned long ignored)
+{
+       writel(PRM_RSTCTRL_RESET, PRM_RSTCTRL);
+}
index 0f2e0a2d27fdc588cbdb89a89951950693cf8882..4d1ac85d0091de429ccda8e341713ba0aa1c62e3 100644 (file)
@@ -162,6 +162,7 @@ void board_init_r(gd_t *id, ulong dummy)
 #ifdef CONFIG_SPL_MMC_SUPPORT
        case BOOT_DEVICE_MMC1:
        case BOOT_DEVICE_MMC2:
+       case BOOT_DEVICE_MMC2_2:
                spl_mmc_load_image();
                break;
 #endif
index 6f5b43e559f3b80b44b67f90f55844b1d3c12553..2f921bb07d4d4ea8a6914d8bfc477405fb2c4b6a 100644 (file)
@@ -39,10 +39,11 @@ int board_mmc_init(bd_t *bis)
 {
        switch (omap_boot_device()) {
        case BOOT_DEVICE_MMC1:
-               omap_mmc_init(0);
+               omap_mmc_init(0, 0, 0);
                break;
        case BOOT_DEVICE_MMC2:
-               omap_mmc_init(1);
+       case BOOT_DEVICE_MMC2_2:
+               omap_mmc_init(1, 0, 0);
                break;
        }
        return 0;
diff --git a/arch/arm/cpu/armv7/omap-common/vc.c b/arch/arm/cpu/armv7/omap-common/vc.c
new file mode 100644 (file)
index 0000000..a045b77
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * Voltage Controller implementation for OMAP
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ *     Nishanth Menon
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <asm/omap_common.h>
+#include <asm/arch/sys_proto.h>
+
+/*
+ * Define Master code if there are multiple masters on the I2C_SR bus.
+ * Normally not required
+ */
+#ifndef CONFIG_OMAP_VC_I2C_HS_MCODE
+#define CONFIG_OMAP_VC_I2C_HS_MCODE 0x0
+#endif
+
+/* Register defines and masks for VC IP Block */
+/* PRM_VC_CFG_I2C_MODE */
+#define PRM_VC_CFG_I2C_MODE_DFILTEREN_BIT      (0x1 << 6)
+#define PRM_VC_CFG_I2C_MODE_SRMODEEN_BIT       (0x1 << 4)
+#define PRM_VC_CFG_I2C_MODE_HSMODEEN_BIT       (0x1 << 3)
+#define PRM_VC_CFG_I2C_MODE_HSMCODE_SHIFT      0x0
+#define PRM_VC_CFG_I2C_MODE_HSMCODE_MASK       0x3
+
+/* PRM_VC_CFG_I2C_CLK */
+#define PRM_VC_CFG_I2C_CLK_HSCLL_SHIFT         24
+#define PRM_VC_CFG_I2C_CLK_HSCLL_MASK          0xFF
+#define PRM_VC_CFG_I2C_CLK_HSCLH_SHIFT         16
+#define PRM_VC_CFG_I2C_CLK_HSCLH_MASK          0xFF
+#define PRM_VC_CFG_I2C_CLK_SCLH_SHIFT          0
+#define PRM_VC_CFG_I2C_CLK_SCLH_MASK           0xFF
+#define PRM_VC_CFG_I2C_CLK_SCLL_SHIFT          8
+#define PRM_VC_CFG_I2C_CLK_SCLL_MASK           (0xFF << 8)
+
+/* PRM_VC_VAL_BYPASS */
+#define PRM_VC_VAL_BYPASS_VALID_BIT            (0x1 << 24)
+#define PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT      0
+#define PRM_VC_VAL_BYPASS_SLAVEADDR_MASK       0x7F
+#define PRM_VC_VAL_BYPASS_REGADDR_SHIFT                8
+#define PRM_VC_VAL_BYPASS_REGADDR_MASK         0xFF
+#define PRM_VC_VAL_BYPASS_DATA_SHIFT           16
+#define PRM_VC_VAL_BYPASS_DATA_MASK            0xFF
+
+/**
+ * omap_vc_init() - Initialization for Voltage controller
+ * @speed_khz: I2C buspeed in KHz
+ */
+void omap_vc_init(u16 speed_khz)
+{
+       u32 val;
+       u32 sys_clk_khz, cycles_hi, cycles_low;
+
+       sys_clk_khz = get_sys_clk_freq() / 1000;
+
+       if (speed_khz > 400) {
+               puts("higher speed requested - throttle to 400Khz\n");
+               speed_khz = 400;
+       }
+
+       /*
+        * Setup the dedicated I2C controller for Voltage Control
+        * I2C clk - high period 40% low period 60%
+        */
+       speed_khz /= 10;
+       cycles_hi = sys_clk_khz * 4 / speed_khz;
+       cycles_low = sys_clk_khz * 6 / speed_khz;
+       /* values to be set in register - less by 5 & 7 respectively */
+       cycles_hi -= 5;
+       cycles_low -= 7;
+       val = (cycles_hi << PRM_VC_CFG_I2C_CLK_SCLH_SHIFT) |
+              (cycles_low << PRM_VC_CFG_I2C_CLK_SCLL_SHIFT);
+       writel(val, &prcm->prm_vc_cfg_i2c_clk);
+
+       val = CONFIG_OMAP_VC_I2C_HS_MCODE <<
+               PRM_VC_CFG_I2C_MODE_HSMCODE_SHIFT;
+       /* No HS mode for now */
+       val &= ~PRM_VC_CFG_I2C_MODE_HSMODEEN_BIT;
+       writel(val, &prcm->prm_vc_cfg_i2c_mode);
+}
+
+/**
+ * omap_vc_bypass_send_value() - Send a data using VC Bypass command
+ * @sa:                7 bit I2C slave address of the PMIC
+ * @reg_addr:  I2C register address(8 bit) address in PMIC
+ * @reg_data:  what 8 bit data to write
+ */
+int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data)
+{
+       /*
+        * Unfortunately we need to loop here instead of a defined time
+        * use arbitary large value
+        */
+       u32 timeout = 0xFFFF;
+       u32 reg_val;
+
+       sa &= PRM_VC_VAL_BYPASS_SLAVEADDR_MASK;
+       reg_addr &= PRM_VC_VAL_BYPASS_REGADDR_MASK;
+       reg_data &= PRM_VC_VAL_BYPASS_DATA_MASK;
+
+       /* program VC to send data */
+       reg_val = sa << PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT |
+           reg_addr << PRM_VC_VAL_BYPASS_REGADDR_SHIFT |
+           reg_data << PRM_VC_VAL_BYPASS_DATA_SHIFT;
+       writel(reg_val, &prcm->prm_vc_val_bypass);
+
+       /* Signal VC to send data */
+       writel(reg_val | PRM_VC_VAL_BYPASS_VALID_BIT, &prcm->prm_vc_val_bypass);
+
+       /* Wait on VC to complete transmission */
+       do {
+               reg_val = readl(&prcm->prm_vc_val_bypass) &
+                               PRM_VC_VAL_BYPASS_VALID_BIT;
+               if (!reg_val)
+                       break;
+
+               sdelay(100);
+       } while (--timeout);
+
+       /* Optional: cleanup PRM_IRQSTATUS_Ax */
+       /* In case we can do something about it in future.. */
+       if (!timeout)
+               return -1;
+
+       /* All good.. */
+       return 0;
+}
index 1fee57436493e89a3bfc3ec8f980b64a0eb0c5cf..f2e52e9ce1b7c639269bf1cbce5cc2060596860f 100644 (file)
@@ -41,6 +41,7 @@
 #include <asm/arch/gpio.h>
 #include <asm/omap_common.h>
 #include <i2c.h>
+#include <linux/compiler.h>
 
 /* Declarations */
 extern omap3_sysinfo sysinfo;
@@ -244,6 +245,17 @@ void s_init(void)
                mem_init();
 }
 
+/*
+ * Routine: misc_init_r
+ * Description: A basic misc_init_r that just displays the die ID
+ */
+int __weak misc_init_r(void)
+{
+       dieid_num_r();
+
+       return 0;
+}
+
 /******************************************************************************
  * Routine: wait_for_command_complete
  * Description: Wait for posting to finish on watchdog
index 567817e0ec3b062c3ee2a66c901b14ab1b44a8b2..09c51f62aad0cf1f64b3ba171a235f546bdc139d 100644 (file)
@@ -572,6 +572,22 @@ void prcm_init(void)
        }
 
        if (get_cpu_family() == CPU_OMAP36XX) {
+               /*
+                * In warm reset conditions on OMAP36xx/AM/DM37xx
+                * the rom code incorrectly sets the DPLL4 clock
+                * input divider to /6.5. Section 3.5.3.3.3.2.1 of
+                * the AM/DM37x TRM explains that the /6.5 divider
+                * is used only when the input clock is 13MHz.
+                *
+                * If the part is in this cpu family *and* the input
+                * clock *is not* 13 MHz, then reset the DPLL4 clock
+                * input divider to /1 as it should never set to /6.5
+                * in this case.
+                */
+               if (sys_clkin_sel != 1) /* 13 MHz */
+                       /* Bit 8: DPLL4_CLKINP_DIV */
+                       sr32(&prm_base->clksrc_ctrl, 8, 1, 0);
+
                /* Unlock MPU DPLL (slows things down, and needed later) */
                sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOW_POWER_BYPASS);
                wait_on_value(ST_MPU_CLK, 0, &prcm_base->idlest_pll_mpu,
index c42c5ddcc9ffac518e4bf064e0934cd57ad82448..ebf69fa17d13cc2c67e09d8bc943e2824432d716 100644 (file)
 #include <version.h>
 #include <asm/arch/mem.h>
 #include <asm/arch/clocks_omap3.h>
+#include <linux/linkage.h>
 
 _TEXT_BASE:
        .word   CONFIG_SYS_TEXT_BASE    /* sdram load addr from config.mk */
 
 #ifdef CONFIG_SPL_BUILD
-.global save_boot_params
-save_boot_params:
+ENTRY(save_boot_params)
        ldr     r4, =omap3_boot_device
        ldr     r5, [r0, #0x4]
        and     r5, r5, #0xff
        str     r5, [r4]
        bx      lr
+ENDPROC(save_boot_params)
 #endif
 
-.global omap3_gp_romcode_call
-omap3_gp_romcode_call:
+ENTRY(omap3_gp_romcode_call)
        PUSH {r4-r12, lr} @ Save all registers from ROM code!
        MOV r12, r0     @ Copy the Service ID in R12
        MOV r0, r1      @ Copy parameter to R0
@@ -55,6 +55,7 @@ omap3_gp_romcode_call:
        .word   0xe1600070      @ SMC #0 to enter monitor - hand assembled
                                @ because we use -march=armv5
        POP {r4-r12, pc}
+ENDPROC(omap3_gp_romcode_call)
 
 /*
  * Funtion for making PPA HAL API calls in secure devices
@@ -62,8 +63,7 @@ omap3_gp_romcode_call:
  *     R0 - Service ID
  *     R1 - paramer list
  */
-.global do_omap3_emu_romcode_call
-do_omap3_emu_romcode_call:
+ENTRY(do_omap3_emu_romcode_call)
        PUSH {r4-r12, lr} @ Save all registers from ROM code!
        MOV r12, r0     @ Copy the Secure Service ID in R12
        MOV r3, r1      @ Copy the pointer to va_list in R3
@@ -76,14 +76,14 @@ do_omap3_emu_romcode_call:
        .word   0xe1600071      @ SMC #1 to call PPA service - hand assembled
                                @ because we use -march=armv5
        POP {r4-r12, pc}
+ENDPROC(do_omap3_emu_romcode_call)
 
 #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_NAND_BOOT)
 /**************************************************************************
  * cpy_clk_code: relocates clock code into SRAM where its safer to execute
  * R1 = SRAM destination address.
  *************************************************************************/
-.global cpy_clk_code
- cpy_clk_code:
+ENTRY(cpy_clk_code)
        /* Copy DPLL code into SRAM */
        adr     r0, go_to_speed         /* get addr of clock setting code */
        mov     r2, #384                /* r2 size to copy (div by 32 bytes) */
@@ -95,6 +95,7 @@ next2:
        cmp     r0, r2                  /* until source end address [r2] */
        bne     next2
        mov     pc, lr                  /* back to caller */
+ENDPROC(cpy_clk_code)
 
 /* ***************************************************************************
  *  go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
@@ -109,8 +110,7 @@ next2:
  *        L3 when its not in self refresh seems bad for it.  Normally, this
  *       code runs from flash before SDR is init so that should be ok.
  ****************************************************************************/
-.global go_to_speed
- go_to_speed:
+ENTRY(go_to_speed)
        stmfd sp!, {r4 - r6}
 
        /* move into fast relock bypass */
@@ -171,6 +171,7 @@ wait2:
        nop
        ldmfd   sp!, {r4 - r6}
        mov     pc, lr          /* back to caller, locked */
+ENDPROC(go_to_speed)
 
 _go_to_speed: .word go_to_speed
 
@@ -211,8 +212,7 @@ pll_div_val5:
 
 #endif
 
-.globl lowlevel_init
-lowlevel_init:
+ENTRY(lowlevel_init)
        ldr     sp, SRAM_STACK
        str     ip, [sp]        /* stash old link register */
        mov     ip, lr          /* save link reg across call */
@@ -230,6 +230,7 @@ lowlevel_init:
 
        /* back to arch calling code */
        mov     pc, lr
+ENDPROC(lowlevel_init)
 
        /* the literal pools origin */
        .ltorg
@@ -480,22 +481,22 @@ per_36x_dpll_param:
 .word 26000,    432,   12,     9,      16,     9,     4,      3,      1
 .word 38400,    360,   15,     9,      16,     5,     4,      3,      1
 
-.globl get_36x_mpu_dpll_param
-get_36x_mpu_dpll_param:
+ENTRY(get_36x_mpu_dpll_param)
        adr     r0, mpu_36x_dpll_param
        mov     pc, lr
+ENDPROC(get_36x_mpu_dpll_param)
 
-.globl get_36x_iva_dpll_param
-get_36x_iva_dpll_param:
+ENTRY(get_36x_iva_dpll_param)
        adr     r0, iva_36x_dpll_param
        mov     pc, lr
+ENDPROC(get_36x_iva_dpll_param)
 
-.globl get_36x_core_dpll_param
-get_36x_core_dpll_param:
+ENTRY(get_36x_core_dpll_param)
        adr     r0, core_36x_dpll_param
        mov     pc, lr
+ENDPROC(get_36x_core_dpll_param)
 
-.globl get_36x_per_dpll_param
-get_36x_per_dpll_param:
+ENTRY(get_36x_per_dpll_param)
        adr     r0, per_36x_dpll_param
        mov     pc, lr
+ENDPROC(get_36x_per_dpll_param)
index e2189f729f9e446bb56ed142e1dc884ee6b743c7..c568951a91a27b752127960883f8792816de735d 100644 (file)
@@ -46,8 +46,6 @@
 #define puts(s)
 #endif
 
-#define abs(x) (((x) < 0) ? ((x)*-1) : (x))
-
 struct omap4_prcm_regs *const prcm = (struct omap4_prcm_regs *)0x4A004100;
 
 const u32 sys_clk_array[8] = {
@@ -275,47 +273,70 @@ void scale_vcores(void)
 {
        u32 volt, omap_rev;
 
-       setup_sri2c();
+       omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
 
        omap_rev = omap_revision();
-       /* TPS - supplies vdd_mpu on 4460 */
-       if (omap_rev >= OMAP4460_ES1_0) {
-               volt = 1203;
-               do_scale_tps62361(TPS62361_REG_ADDR_SET1, volt);
-       }
 
        /*
-        * VCORE 1
-        *
-        * 4430 : supplies vdd_mpu
-        * Setting a high voltage for Nitro mode as smart reflex is not enabled.
-        * We use the maximum possible value in the AVS range because the next
-        * higher voltage in the discrete range (code >= 0b111010) is way too
-        * high
-        *
-        * 4460 : supplies vdd_core
+        * Scale Voltage rails:
+        * 1. VDD_CORE
+        * 3. VDD_MPU
+        * 3. VDD_IVA
         */
        if (omap_rev < OMAP4460_ES1_0) {
+               /*
+                * OMAP4430:
+                * VDD_CORE = TWL6030 VCORE3
+                * VDD_MPU = TWL6030 VCORE1
+                * VDD_IVA = TWL6030 VCORE2
+                */
+               volt = 1200;
+               do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
+
+               /*
+                * note on VDD_MPU:
+                * Setting a high voltage for Nitro mode as smart reflex is not
+                * enabled. We use the maximum possible value in the AVS range
+                * because the next higher voltage in the discrete range
+                * (code >= 0b111010) is way too high.
+                */
                volt = 1325;
                do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
+               volt = 1200;
+               do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
+
        } else {
+               /*
+                * OMAP4460:
+                * VDD_CORE = TWL6030 VCORE1
+                * VDD_MPU = TPS62361
+                * VDD_IVA = TWL6030 VCORE2
+                */
                volt = 1200;
                do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
+               /* TPS62361 */
+               volt = 1203;
+               do_scale_tps62361(TPS62361_VSEL0_GPIO,
+                                 TPS62361_REG_ADDR_SET1, volt);
+               /* VCORE 2 - supplies vdd_iva */
+               volt = 1200;
+               do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
        }
+}
 
-       /* VCORE 2 - supplies vdd_iva */
-       volt = 1200;
-       do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
+u32 get_offset_code(u32 offset)
+{
+       u32 offset_code, step = 12660; /* 12.66 mV represented in uV */
 
-       /*
-        * VCORE 3
-        * 4430 : supplies vdd_core
-        * 4460 : not connected
-        */
-       if (omap_rev < OMAP4460_ES1_0) {
-               volt = 1200;
-               do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
-       }
+       if (omap_revision() == OMAP4430_ES1_0)
+               offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV;
+       else
+               offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV;
+
+       offset_code = (offset + step - 1) / step;
+
+       /* The code starts at 1 not 0 */
+       return ++offset_code;
 }
 
 /*
@@ -355,7 +376,6 @@ void enable_basic_clocks(void)
                &prcm->cm_l4per_gptimer2_clkctrl,
                &prcm->cm_wkup_wdtimer2_clkctrl,
                &prcm->cm_l4per_uart3_clkctrl,
-               &prcm->cm_l3init_fsusb_clkctrl,
                &prcm->cm_l3init_hsusbhost_clkctrl,
                0
        };
@@ -432,10 +452,6 @@ void enable_non_essential_clocks(void)
        };
 
        u32 *const clk_modules_hw_auto_non_essential[] = {
-               &prcm->cm_mpu_m3_mpu_m3_clkctrl,
-               &prcm->cm_ivahd_ivahd_clkctrl,
-               &prcm->cm_ivahd_sl2_clkctrl,
-               &prcm->cm_dsp_dsp_clkctrl,
                &prcm->cm_l3_2_gpmc_clkctrl,
                &prcm->cm_l3instr_l3_3_clkctrl,
                &prcm->cm_l3instr_l3_instr_clkctrl,
@@ -482,7 +498,6 @@ void enable_non_essential_clocks(void)
                &prcm->cm_dss_dss_clkctrl,
                &prcm->cm_sgx_sgx_clkctrl,
                &prcm->cm_l3init_hsusbhost_clkctrl,
-               &prcm->cm_l3init_fsusb_clkctrl,
                0
        };
 
index 91f83205edf161de242b680c2f24bfcefb440111..187e93887b673aef636fbee7fed80c946d3bdea1 100644 (file)
@@ -37,7 +37,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-u32 *const omap4_revision = (u32 *)OMAP4_SRAM_SCRATCH_OMAP4_REV;
+u32 *const omap_si_rev = (u32 *)OMAP4_SRAM_SCRATCH_OMAP4_REV;
 
 static const struct gpio_bank gpio_bank_44xx[6] = {
        { (void *)OMAP44XX_GPIO1_BASE, METHOD_GPIO_24XX },
@@ -59,8 +59,8 @@ void do_io_settings(void)
        u32 lpddr2io;
        struct control_lpddr2io_regs *lpddr2io_regs =
                (struct control_lpddr2io_regs *)LPDDR2_IO_REGS_BASE;
-       struct omap4_sys_ctrl_regs *const ctrl =
-               (struct omap4_sys_ctrl_regs *)SYSCTRL_GENERAL_CORE_BASE;
+       struct omap_sys_ctrl_regs *const ctrl =
+               (struct omap_sys_ctrl_regs *)SYSCTRL_GENERAL_CORE_BASE;
 
        u32 omap4_rev = omap_revision();
 
@@ -129,40 +129,40 @@ void init_omap_revision(void)
 
        switch (arm_rev) {
        case MIDR_CORTEX_A9_R0P1:
-               *omap4_revision = OMAP4430_ES1_0;
+               *omap_si_rev = OMAP4430_ES1_0;
                break;
        case MIDR_CORTEX_A9_R1P2:
                switch (readl(CONTROL_ID_CODE)) {
                case OMAP4_CONTROL_ID_CODE_ES2_0:
-                       *omap4_revision = OMAP4430_ES2_0;
+                       *omap_si_rev = OMAP4430_ES2_0;
                        break;
                case OMAP4_CONTROL_ID_CODE_ES2_1:
-                       *omap4_revision = OMAP4430_ES2_1;
+                       *omap_si_rev = OMAP4430_ES2_1;
                        break;
                case OMAP4_CONTROL_ID_CODE_ES2_2:
-                       *omap4_revision = OMAP4430_ES2_2;
+                       *omap_si_rev = OMAP4430_ES2_2;
                        break;
                default:
-                       *omap4_revision = OMAP4430_ES2_0;
+                       *omap_si_rev = OMAP4430_ES2_0;
                        break;
                }
                break;
        case MIDR_CORTEX_A9_R1P3:
-               *omap4_revision = OMAP4430_ES2_3;
+               *omap_si_rev = OMAP4430_ES2_3;
                break;
        case MIDR_CORTEX_A9_R2P10:
                switch (readl(CONTROL_ID_CODE)) {
                case OMAP4460_CONTROL_ID_CODE_ES1_1:
-                       *omap4_revision = OMAP4460_ES1_1;
+                       *omap_si_rev = OMAP4460_ES1_1;
                        break;
                case OMAP4460_CONTROL_ID_CODE_ES1_0:
                default:
-                       *omap4_revision = OMAP4460_ES1_0;
+                       *omap_si_rev = OMAP4460_ES1_0;
                        break;
                }
                break;
        default:
-               *omap4_revision = OMAP4430_SILICON_ID_INVALID;
+               *omap_si_rev = OMAP4430_SILICON_ID_INVALID;
                break;
        }
 }
index a5ec7d3dcc52b7ccae525fbf2c985fd9fe00e10b..b5389606b62626d3eb88ccb2c0feaa79bdf60842 100644 (file)
@@ -89,6 +89,10 @@ const struct emif_regs emif_regs_elpida_400_mhz_2cs = {
        .emif_ddr_phy_ctlr_1_init       = 0x049ffff5,
        .emif_ddr_phy_ctlr_1            = 0x049ff418
 };
+
+/* Dummy registers for OMAP44xx */
+const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG];
+
 const struct dmm_lisa_map_regs lisa_map_2G_x_1_x_2 = {
        .dmm_lisa_map_0 = 0xFF020100,
        .dmm_lisa_map_1 = 0,
index f8ca9ac367bb08f34c1f2b8b888c37a6ae71d8e5..9b261c4df21c6dba9b4373c21253ac9c5660c855 100644 (file)
@@ -28,7 +28,7 @@ LIB   =  $(obj)lib$(SOC).o
 COBJS  += hwinit.o
 COBJS  += clocks.o
 COBJS  += emif.o
-COBJS  += sdram_elpida.o
+COBJS  += sdram.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
index dd882a202e787539e6370b8160b4b166c6f0f79a..1a59f265f7b00ca6bc020f77428eee4bb454b640 100644 (file)
@@ -88,6 +88,26 @@ static const struct dpll_params mpu_dpll_params_1100mhz[NUM_SYS_CLKS] = {
        {1375, 47, 1, -1, -1, -1, -1, -1, -1, -1}       /* 38.4 MHz */
 };
 
+static const struct dpll_params mpu_dpll_params_800mhz[NUM_SYS_CLKS] = {
+       {200, 2, 1, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {1000, 20, 1, -1, -1, -1, -1, -1, -1, -1},      /* 16.8 MHz */
+       {375, 8, 1, -1, -1, -1, -1, -1, -1, -1},        /* 19.2 MHz */
+       {400, 12, 1, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {375, 17, 1, -1, -1, -1, -1, -1, -1, -1}                /* 38.4 MHz */
+};
+
+static const struct dpll_params mpu_dpll_params_400mhz[NUM_SYS_CLKS] = {
+       {200, 2, 2, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {1000, 20, 2, -1, -1, -1, -1, -1, -1, -1},      /* 16.8 MHz */
+       {375, 8, 2, -1, -1, -1, -1, -1, -1, -1},        /* 19.2 MHz */
+       {400, 12, 2, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {375, 17, 2, -1, -1, -1, -1, -1, -1, -1}                /* 38.4 MHz */
+};
+
 static const struct dpll_params mpu_dpll_params_550mhz[NUM_SYS_CLKS] = {
        {275, 2, 2, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
@@ -100,24 +120,24 @@ static const struct dpll_params mpu_dpll_params_550mhz[NUM_SYS_CLKS] = {
 
 static const struct dpll_params
                        core_dpll_params_2128mhz_ddr532[NUM_SYS_CLKS] = {
-       {266, 2, 1, 5, 8, 4, 62, 5, 5, 7},              /* 12 MHz   */
+       {266, 2, 2, 5, 8, 4, 62, 5, 5, 7},              /* 12 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {570, 8, 1, 5, 8, 4, 62, 5, 5, 7},              /* 16.8 MHz */
-       {665, 11, 1, 5, 8, 4, 62, 5, 5, 7},             /* 19.2 MHz */
-       {532, 12, 1, 5, 8, 4, 62, 5, 5, 7},             /* 26 MHz   */
+       {570, 8, 2, 5, 8, 4, 62, 5, 5, 7},              /* 16.8 MHz */
+       {665, 11, 2, 5, 8, 4, 62, 5, 5, 7},             /* 19.2 MHz */
+       {532, 12, 2, 5, 8, 4, 62, 5, 5, 7},             /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {665, 23, 1, 5, 8, 4, 62, 5, 5, 7}              /* 38.4 MHz */
+       {665, 23, 2, 5, 8, 4, 62, 5, 5, 7}              /* 38.4 MHz */
 };
 
 static const struct dpll_params
                        core_dpll_params_2128mhz_ddr266[NUM_SYS_CLKS] = {
-       {266, 2, 2, 5, 8, 4, 62, 5, 5, 7},              /* 12 MHz   */
+       {266, 2, 4, 5, 8, 8, 62, 10, 10, 14},           /* 12 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {570, 8, 2, 5, 8, 4, 62, 5, 5, 7},              /* 16.8 MHz */
-       {665, 11, 2, 5, 8, 4, 62, 5, 5, 7},             /* 19.2 MHz */
-       {532, 12, 2, 5, 8, 4, 62, 5, 5, 7},             /* 26 MHz   */
+       {570, 8, 4, 5, 8, 8, 62, 10, 10, 14},           /* 16.8 MHz */
+       {665, 11, 4, 5, 8, 8, 62, 10, 10, 14},          /* 19.2 MHz */
+       {532, 12, 4, 8, 8, 8, 62, 10, 10, 14},          /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {665, 23, 2, 5, 8, 4, 62, 5, 5, 7}              /* 38.4 MHz */
+       {665, 23, 4, 8, 8, 8, 62, 10, 10, 14}           /* 38.4 MHz */
 };
 
 static const struct dpll_params per_dpll_params_768mhz[NUM_SYS_CLKS] = {
@@ -131,40 +151,40 @@ static const struct dpll_params per_dpll_params_768mhz[NUM_SYS_CLKS] = {
 };
 
 static const struct dpll_params iva_dpll_params_2330mhz[NUM_SYS_CLKS] = {
-       {931, 11, -1, -1, 4, 7, -1, -1},        /* 12 MHz   */
-       {931, 12, -1, -1, 4, 7, -1, -1},        /* 13 MHz   */
-       {665, 11, -1, -1, 4, 7, -1, -1},        /* 16.8 MHz */
-       {727, 14, -1, -1, 4, 7, -1, -1},        /* 19.2 MHz */
-       {931, 25, -1, -1, 4, 7, -1, -1},        /* 26 MHz   */
-       {931, 26, -1, -1, 4, 7, -1, -1},        /* 27 MHz   */
-       {412, 16, -1, -1, 4, 7, -1, -1}         /* 38.4 MHz */
+       {1165, 11, -1, -1, 5, 6, -1, -1, -1, -1},       /* 12 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {2011, 28, -1, -1, 5, 6, -1, -1, -1, -1},       /* 16.8 MHz */
+       {1881, 30, -1, -1, 5, 6, -1, -1, -1, -1},       /* 19.2 MHz */
+       {1165, 25, -1, -1, 5, 6, -1, -1, -1, -1},       /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {1972, 64, -1, -1, 5, 6, -1, -1, -1, -1}        /* 38.4 MHz */
 };
 
 /* ABE M & N values with sys_clk as source */
 static const struct dpll_params
                abe_dpll_params_sysclk_196608khz[NUM_SYS_CLKS] = {
-       {49, 5, 1, 1, -1, -1, -1, -1},  /* 12 MHz   */
-       {68, 8, 1, 1, -1, -1, -1, -1},  /* 13 MHz   */
-       {35, 5, 1, 1, -1, -1, -1, -1},  /* 16.8 MHz */
-       {46, 8, 1, 1, -1, -1, -1, -1},  /* 19.2 MHz */
-       {34, 8, 1, 1, -1, -1, -1, -1},  /* 26 MHz   */
-       {29, 7, 1, 1, -1, -1, -1, -1},  /* 27 MHz   */
-       {64, 24, 1, 1, -1, -1, -1, -1}  /* 38.4 MHz */
+       {49, 5, 1, -1, -1, -1, -1, -1, -1, -1},         /* 12 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {35, 5, 1, 1, -1, -1, -1, -1, -1, -1},          /* 16.8 MHz */
+       {46, 8, 1, 1, -1, -1, -1, -1, -1, -1},          /* 19.2 MHz */
+       {34, 8, 1, 1, -1, -1, -1, -1, -1, -1},          /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {64, 24, 1, 1, -1, -1, -1, -1, -1, -1}          /* 38.4 MHz */
 };
 
 /* ABE M & N values with 32K clock as source */
 static const struct dpll_params abe_dpll_params_32k_196608khz = {
-       750, 0, 1, 1, -1, -1, -1, -1
+       750, 0, 1, 1, -1, -1, -1, -1, -1, -1
 };
 
 static const struct dpll_params usb_dpll_params_1920mhz[NUM_SYS_CLKS] = {
-       {80, 0, 2, -1, -1, -1, -1, -1},         /* 12 MHz   */
-       {960, 12, 2, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {400, 6, 2, -1, -1, -1, -1, -1},        /* 16.8 MHz */
-       {50, 0, 2, -1, -1, -1, -1, -1},         /* 19.2 MHz */
-       {480, 12, 2, -1, -1, -1, -1, -1},       /* 26 MHz   */
-       {320, 8, 2, -1, -1, -1, -1, -1},        /* 27 MHz   */
-       {25, 0, 2, -1, -1, -1, -1, -1}          /* 38.4 MHz */
+       {400, 4, 2, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {400, 6, 2, -1, -1, -1, -1, -1, -1, -1},        /* 16.8 MHz */
+       {400, 7, 2, -1, -1, -1, -1, -1, -1, -1},        /* 19.2 MHz */
+       {480, 12, 2, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {400, 15, 2, -1, -1, -1, -1, -1, -1, -1}        /* 38.4 MHz */
 };
 
 void setup_post_dividers(u32 *const base, const struct dpll_params *params)
@@ -193,7 +213,7 @@ void setup_post_dividers(u32 *const base, const struct dpll_params *params)
 const struct dpll_params *get_mpu_dpll_params(void)
 {
        u32 sysclk_ind = get_sys_clk_index();
-       return &mpu_dpll_params_1100mhz[sysclk_ind];
+       return &mpu_dpll_params_800mhz[sysclk_ind];
 }
 
 const struct dpll_params *get_core_dpll_params(void)
@@ -201,8 +221,7 @@ const struct dpll_params *get_core_dpll_params(void)
        u32 sysclk_ind = get_sys_clk_index();
 
        /* Configuring the DDR to be at 532mhz */
-       return &core_dpll_params_2128mhz_ddr266[sysclk_ind];
-
+       return &core_dpll_params_2128mhz_ddr532[sysclk_ind];
 }
 
 const struct dpll_params *get_per_dpll_params(void)
@@ -243,19 +262,33 @@ void scale_vcores(void)
 {
        u32 volt;
 
-       setup_sri2c();
+       omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
+
+       /* Palmas settings */
+       volt = VDD_CORE;
+       do_scale_vcore(SMPS_REG_ADDR_8_CORE, volt);
 
-       /* Enable 1.22V from TPS for vdd_mpu */
-       volt = 1220;
-       do_scale_tps62361(TPS62361_REG_ADDR_SET1, volt);
+       volt = VDD_MPU;
+       do_scale_vcore(SMPS_REG_ADDR_12_MPU, volt);
 
-       /* VCORE 1 - for vdd_core */
-       volt = 1000;
-       do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
+       volt = VDD_MM;
+       do_scale_vcore(SMPS_REG_ADDR_45_IVA, volt);
 
-       /* VCORE 2 - for vdd_MM */
-       volt = 1125;
-       do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
+}
+
+u32 get_offset_code(u32 volt_offset)
+{
+       u32 offset_code, step = 10000; /* 10 mV represented in uV */
+
+       volt_offset -= PALMAS_SMPS_BASE_VOLT_UV;
+
+       offset_code = (volt_offset + step - 1) / step;
+
+       /*
+        * Offset codes 1-6 all give the base voltage in Palmas
+        * Offset code 0 switches OFF the SMPS
+        */
+       return offset_code + 6;
 }
 
 /*
@@ -306,6 +339,12 @@ void enable_basic_clocks(void)
        setbits_le32(&prcm->cm_l3init_hsmmc2_clkctrl,
                        HSMMC_CLKCTRL_CLKSEL_MASK);
 
+       /* Set the correct clock dividers for mmc */
+       setbits_le32(&prcm->cm_l3init_hsmmc1_clkctrl,
+                       HSMMC_CLKCTRL_CLKSEL_DIV_MASK);
+       setbits_le32(&prcm->cm_l3init_hsmmc2_clkctrl,
+                       HSMMC_CLKCTRL_CLKSEL_DIV_MASK);
+
        /* Select 32KHz clock as the source of GPTIMER1 */
        setbits_le32(&prcm->cm_wkup_gptimer1_clkctrl,
                        GPTIMER1_CLKCTRL_CLKSEL_MASK);
@@ -314,6 +353,18 @@ void enable_basic_clocks(void)
                         clk_modules_hw_auto_essential,
                         clk_modules_explicit_en_essential,
                         1);
+
+       /* Select 384Mhz for GPU as its the POR for ES1.0 */
+       setbits_le32(&prcm->cm_sgx_sgx_clkctrl,
+                       CLKSEL_GPU_HYD_GCLK_MASK);
+       setbits_le32(&prcm->cm_sgx_sgx_clkctrl,
+                       CLKSEL_GPU_CORE_GCLK_MASK);
+
+       /* Enable SCRM OPT clocks for PER and CORE dpll */
+       setbits_le32(&prcm->cm_wkupaon_scrm_clkctrl,
+                       OPTFCLKEN_SCRM_PER_MASK);
+       setbits_le32(&prcm->cm_wkupaon_scrm_clkctrl,
+                       OPTFCLKEN_SCRM_CORE_MASK);
 }
 
 void enable_basic_uboot_clocks(void)
@@ -371,6 +422,7 @@ void enable_non_essential_clocks(void)
                &prcm->cm_l3instr_intrconn_wp1_clkctrl,
                &prcm->cm_l3init_hsi_clkctrl,
                &prcm->cm_l3init_hsusbtll_clkctrl,
+               &prcm->cm_l4per_hdq1w_clkctrl,
                0
        };
 
@@ -393,7 +445,6 @@ void enable_non_essential_clocks(void)
                &prcm->cm_l4per_gptimer11_clkctrl,
                &prcm->cm_l4per_gptimer3_clkctrl,
                &prcm->cm_l4per_gptimer4_clkctrl,
-               &prcm->cm_l4per_hdq1w_clkctrl,
                &prcm->cm_l4per_mcspi2_clkctrl,
                &prcm->cm_l4per_mcspi3_clkctrl,
                &prcm->cm_l4per_mcspi4_clkctrl,
index fa8e390c17969704e467c957b8e4768e65014814..d01cc81333ba62c6b35e38959fbdfe10229cc4e4 100644 (file)
@@ -38,7 +38,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-u32 *const omap5_revision = (u32 *)OMAP5_SRAM_SCRATCH_OMAP5_REV;
+u32 *const omap_si_rev = (u32 *)OMAP5_SRAM_SCRATCH_OMAP5_REV;
 
 static struct gpio_bank gpio_bank_54xx[6] = {
        { (void *)OMAP54XX_GPIO1_BASE, METHOD_GPIO_24XX },
@@ -57,6 +57,89 @@ const struct gpio_bank *const omap_gpio_bank = gpio_bank_54xx;
  */
 void do_io_settings(void)
 {
+       u32 io_settings = 0, mask = 0;
+       struct omap_sys_ctrl_regs *ioregs_base =
+                     (struct omap_sys_ctrl_regs *) SYSCTRL_GENERAL_CORE_BASE;
+
+       /* Impedance settings EMMC, C2C 1,2, hsi2 */
+       mask = (ds_mask << 2) | (ds_mask << 8) |
+               (ds_mask << 16) | (ds_mask << 18);
+       io_settings = readl(&(ioregs_base->control_smart1io_padconf_0)) &
+                               (~mask);
+       io_settings |= (ds_60_ohm << 8) | (ds_45_ohm << 16) |
+                       (ds_45_ohm << 18) | (ds_60_ohm << 2);
+       writel(io_settings, &(ioregs_base->control_smart1io_padconf_0));
+
+       /* Impedance settings Mcspi2 */
+       mask = (ds_mask << 30);
+       io_settings = readl(&(ioregs_base->control_smart1io_padconf_1)) &
+                       (~mask);
+       io_settings |= (ds_60_ohm << 30);
+       writel(io_settings, &(ioregs_base->control_smart1io_padconf_1));
+
+       /* Impedance settings C2C 3,4 */
+       mask = (ds_mask << 14) | (ds_mask << 16);
+       io_settings = readl(&(ioregs_base->control_smart1io_padconf_2)) &
+                       (~mask);
+       io_settings |= (ds_45_ohm << 14) | (ds_45_ohm << 16);
+       writel(io_settings, &(ioregs_base->control_smart1io_padconf_2));
+
+       /* Slew rate settings EMMC, C2C 1,2 */
+       mask = (sc_mask << 8) | (sc_mask << 16) | (sc_mask << 18);
+       io_settings = readl(&(ioregs_base->control_smart2io_padconf_0)) &
+                       (~mask);
+       io_settings |= (sc_fast << 8) | (sc_na << 16) | (sc_na << 18);
+       writel(io_settings, &(ioregs_base->control_smart2io_padconf_0));
+
+       /* Slew rate settings hsi2, Mcspi2 */
+       mask = (sc_mask << 24) | (sc_mask << 28);
+       io_settings = readl(&(ioregs_base->control_smart2io_padconf_1)) &
+                       (~mask);
+       io_settings |= (sc_fast << 28) | (sc_fast << 24);
+       writel(io_settings, &(ioregs_base->control_smart2io_padconf_1));
+
+       /* Slew rate settings C2C 3,4 */
+       mask = (sc_mask << 16) | (sc_mask << 18);
+       io_settings = readl(&(ioregs_base->control_smart2io_padconf_2)) &
+                       (~mask);
+       io_settings |= (sc_na << 16) | (sc_na << 18);
+       writel(io_settings, &(ioregs_base->control_smart2io_padconf_2));
+
+       /* impedance and slew rate settings for usb */
+       mask = (usb_i_mask << 29) | (usb_i_mask << 26) | (usb_i_mask << 23) |
+               (usb_i_mask << 20) | (usb_i_mask << 17) | (usb_i_mask << 14);
+       io_settings = readl(&(ioregs_base->control_smart3io_padconf_1)) &
+                       (~mask);
+       io_settings |= (ds_60_ohm << 29) | (ds_60_ohm << 26) |
+                      (ds_60_ohm << 23) | (sc_fast << 20) |
+                      (sc_fast << 17) | (sc_fast << 14);
+       writel(io_settings, &(ioregs_base->control_smart3io_padconf_1));
+
+       /* LPDDR2 io settings */
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_DQ_NO_PULL_DQS_PULL_DOWN,
+                                       &(ioregs_base->control_ddrch1_0));
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_DQ_NO_PULL_DQS_PULL_DOWN,
+                                       &(ioregs_base->control_ddrch1_1));
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_DQ_NO_PULL_DQS_PULL_DOWN,
+                                       &(ioregs_base->control_ddrch2_0));
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_DQ_NO_PULL_DQS_PULL_DOWN,
+                                       &(ioregs_base->control_ddrch2_1));
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_CK_CKE_NCS_CA_PULL_DOWN,
+                                       &(ioregs_base->control_lpddr2ch1_0));
+       writel(DDR_IO_I_34OHM_SR_FASTEST_WD_CK_CKE_NCS_CA_PULL_DOWN,
+                                       &(ioregs_base->control_lpddr2ch1_1));
+       writel(DDR_IO_0_DDR2_DQ_INT_EN_ALL_DDR3_CA_DIS_ALL,
+                                       &(ioregs_base->control_ddrio_0));
+       writel(DDR_IO_1_DQ_OUT_EN_ALL_DQ_INT_EN_ALL,
+                                       &(ioregs_base->control_ddrio_1));
+       writel(DDR_IO_2_CA_OUT_EN_ALL_CA_INT_EN_ALL,
+                                       &(ioregs_base->control_ddrio_2));
+
+       /* Efuse settings */
+       writel(EFUSE_1, &(ioregs_base->control_efuse_1));
+       writel(EFUSE_2, &(ioregs_base->control_efuse_2));
+       writel(EFUSE_3, &(ioregs_base->control_efuse_3));
+       writel(EFUSE_4, &(ioregs_base->control_efuse_4));
 }
 #endif
 
@@ -71,8 +154,23 @@ void init_omap_revision(void)
 
        switch (rev) {
        case MIDR_CORTEX_A15_R0P0:
-               *omap5_revision = OMAP5430_ES1_0;
+               *omap_si_rev = OMAP5430_ES1_0;
+               break;
        default:
-               *omap5_revision = OMAP5430_SILICON_ID_INVALID;
+               *omap_si_rev = OMAP5430_SILICON_ID_INVALID;
        }
 }
+
+void reset_cpu(ulong ignored)
+{
+       u32 omap_rev = omap_revision();
+
+       /*
+        * WARM reset is not functional in case of OMAP5430 ES1.0 soc.
+        * So use cold reset in case instead.
+        */
+       if (omap_rev == OMAP5430_ES1_0)
+               writel(PRM_RSTCTRL_RESET << 0x1, PRM_RSTCTRL);
+       else
+               writel(PRM_RSTCTRL_RESET, PRM_RSTCTRL);
+}
diff --git a/arch/arm/cpu/armv7/omap5/sdram.c b/arch/arm/cpu/armv7/omap5/sdram.c
new file mode 100644 (file)
index 0000000..b2b5753
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * Timing and Organization details of the ddr device parts used in OMAP5
+ * EVM
+ *
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ *
+ * Aneesh V <aneesh@ti.com>
+ * Sricharan R <r.sricharan@ti.com>
+ *
+ * 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
+ */
+
+#include <asm/emif.h>
+#include <asm/arch/sys_proto.h>
+
+/*
+ * This file provides details of the LPDDR2 SDRAM parts used on OMAP5
+ * EVM. Since the parts used and geometry are identical for
+ * evm for a given OMAP5 revision, this information is kept
+ * here instead of being in board directory. However the key functions
+ * exported are weakly linked so that they can be over-ridden in the board
+ * directory if there is a OMAP5 board in the future that uses a different
+ * memory device or geometry.
+ *
+ * For any new board with different memory devices over-ride one or more
+ * of the following functions as per the CONFIG flags you intend to enable:
+ * - emif_get_reg_dump()
+ * - emif_get_dmm_regs()
+ * - emif_get_device_details()
+ * - emif_get_device_timings()
+ */
+
+#ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
+const struct emif_regs emif_regs_532_mhz_2cs = {
+       .sdram_config_init              = 0x80800EBA,
+       .sdram_config                   = 0x808022BA,
+       .ref_ctrl                       = 0x0000081A,
+       .sdram_tim1                     = 0x772F6873,
+       .sdram_tim2                     = 0x304a129a,
+       .sdram_tim3                     = 0x02f7e45f,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x000b3215,
+       .temp_alert_config              = 0x08000a05,
+       .emif_ddr_phy_ctlr_1_init       = 0x0E28420d,
+       .emif_ddr_phy_ctlr_1            = 0x0E28420d,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04020080,
+       .emif_ddr_ext_phy_ctrl_2        = 0x28C518A3,
+       .emif_ddr_ext_phy_ctrl_3        = 0x518A3146,
+       .emif_ddr_ext_phy_ctrl_4        = 0x0014628C,
+       .emif_ddr_ext_phy_ctrl_5        = 0x04010040
+};
+
+const struct emif_regs emif_regs_266_mhz_2cs = {
+       .sdram_config_init              = 0x80800EBA,
+       .sdram_config                   = 0x808022BA,
+       .ref_ctrl                       = 0x0000040D,
+       .sdram_tim1                     = 0x2A86B419,
+       .sdram_tim2                     = 0x1025094A,
+       .sdram_tim3                     = 0x026BA22F,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x000b3215,
+       .temp_alert_config              = 0x08000a05,
+       .emif_ddr_phy_ctlr_1_init       = 0x0E28420d,
+       .emif_ddr_phy_ctlr_1            = 0x0E28420d,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04020080,
+       .emif_ddr_ext_phy_ctrl_2        = 0x0A414829,
+       .emif_ddr_ext_phy_ctrl_3        = 0x14829052,
+       .emif_ddr_ext_phy_ctrl_4        = 0x000520A4,
+       .emif_ddr_ext_phy_ctrl_5        = 0x04010040
+};
+
+const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
+       .dmm_lisa_map_0 = 0x0,
+       .dmm_lisa_map_1 = 0,
+       .dmm_lisa_map_2 = 0,
+       .dmm_lisa_map_3 = 0x80740300
+};
+
+const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG] = {
+       0x01004010,
+       0x00001004,
+       0x04010040,
+       0x01004010,
+       0x00001004,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x80080080,
+       0x00800800,
+       0x08102040,
+       0x00000001,
+       0x540A8150,
+       0xA81502a0,
+       0x002A0540,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000077
+};
+
+static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
+{
+       *regs = &emif_regs_532_mhz_2cs;
+}
+void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
+       __attribute__((weak, alias("emif_get_reg_dump_sdp")));
+
+static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
+                                               **dmm_lisa_regs)
+{
+       *dmm_lisa_regs = &lisa_map_4G_x_2_x_2;
+}
+
+void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
+       __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
+
+#else
+
+static const struct lpddr2_device_details dev_4G_S4_details = {
+       .type           = LPDDR2_TYPE_S4,
+       .density        = LPDDR2_DENSITY_4Gb,
+       .io_width       = LPDDR2_IO_WIDTH_32,
+       .manufacturer   = LPDDR2_MANUFACTURER_SAMSUNG
+};
+
+static void emif_get_device_details_sdp(u32 emif_nr,
+               struct lpddr2_device_details *cs0_device_details,
+               struct lpddr2_device_details *cs1_device_details)
+{
+       /* EMIF1 & EMIF2 have identical configuration */
+       *cs0_device_details = dev_4G_S4_details;
+       *cs1_device_details = dev_4G_S4_details;
+}
+
+void emif_get_device_details(u32 emif_nr,
+               struct lpddr2_device_details *cs0_device_details,
+               struct lpddr2_device_details *cs1_device_details)
+       __attribute__((weak, alias("emif_get_device_details_sdp")));
+
+#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
+
+#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
+static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
+       .max_freq       = 532000000,
+       .RL             = 8,
+       .tRPab          = 21,
+       .tRCD           = 18,
+       .tWR            = 15,
+       .tRASmin        = 42,
+       .tRRD           = 10,
+       .tWTRx2         = 15,
+       .tXSR           = 140,
+       .tXPx2          = 15,
+       .tRFCab         = 130,
+       .tRTPx2         = 15,
+       .tCKE           = 3,
+       .tCKESR         = 15,
+       .tZQCS          = 90,
+       .tZQCL          = 360,
+       .tZQINIT        = 1000,
+       .tDQSCKMAXx2    = 11,
+       .tRASmax        = 70,
+       .tFAW           = 50
+};
+
+static const struct lpddr2_min_tck min_tck = {
+       .tRL            = 3,
+       .tRP_AB         = 3,
+       .tRCD           = 3,
+       .tWR            = 3,
+       .tRAS_MIN       = 3,
+       .tRRD           = 2,
+       .tWTR           = 2,
+       .tXP            = 2,
+       .tRTP           = 2,
+       .tCKE           = 3,
+       .tCKESR         = 3,
+       .tFAW           = 8
+};
+
+static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
+       &timings_jedec_532_mhz
+};
+
+static const struct lpddr2_device_timings dev_4G_S4_timings = {
+       .ac_timings     = ac_timings,
+       .min_tck        = &min_tck,
+};
+
+void emif_get_device_timings_sdp(u32 emif_nr,
+               const struct lpddr2_device_timings **cs0_device_timings,
+               const struct lpddr2_device_timings **cs1_device_timings)
+{
+       /* Identical devices on EMIF1 & EMIF2 */
+       *cs0_device_timings = &dev_4G_S4_timings;
+       *cs1_device_timings = &dev_4G_S4_timings;
+}
+
+void emif_get_device_timings(u32 emif_nr,
+               const struct lpddr2_device_timings **cs0_device_timings,
+               const struct lpddr2_device_timings **cs1_device_timings)
+       __attribute__((weak, alias("emif_get_device_timings_sdp")));
+
+#endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */
diff --git a/arch/arm/cpu/armv7/omap5/sdram_elpida.c b/arch/arm/cpu/armv7/omap5/sdram_elpida.c
deleted file mode 100644 (file)
index ad198e6..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Timing and Organization details of the Elpida parts used in OMAP5
- * EVM
- *
- * (C) Copyright 2010
- * Texas Instruments, <www.ti.com>
- *
- * Aneesh V <aneesh@ti.com>
- * Sricharan R <r.sricharan@ti.com>
- *
- * 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
- */
-
-#include <asm/emif.h>
-#include <asm/arch/sys_proto.h>
-
-/*
- * This file provides details of the LPDDR2 SDRAM parts used on OMAP5
- * EVM. Since the parts used and geometry are identical for
- * evm for a given OMAP5 revision, this information is kept
- * here instead of being in board directory. However the key functions
- * exported are weakly linked so that they can be over-ridden in the board
- * directory if there is a OMAP5 board in the future that uses a different
- * memory device or geometry.
- *
- * For any new board with different memory devices over-ride one or more
- * of the following functions as per the CONFIG flags you intend to enable:
- * - emif_get_reg_dump()
- * - emif_get_dmm_regs()
- * - emif_get_device_details()
- * - emif_get_device_timings()
- */
-
-#ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
-
-const struct emif_regs emif_regs_elpida_532_mhz_1cs = {
-       .sdram_config_init              = 0x80801aB2,
-       .sdram_config                   = 0x808022B2,
-       .ref_ctrl                       = 0x0000081A,
-       .sdram_tim1                     = 0x772F6873,
-       .sdram_tim2                     = 0x304A129A,
-       .sdram_tim3                     = 0x02F7E45F,
-       .read_idle_ctrl                 = 0x00050000,
-       .zq_config                      = 0x000B3215,
-       .temp_alert_config              = 0x08000A05,
-       .emif_ddr_phy_ctlr_1_init       = 0x0E38200D,
-       .emif_ddr_phy_ctlr_1            = 0x0E38200D
-};
-
-const struct dmm_lisa_map_regs lisa_map_4G_x_1_x_2 = {
-       .dmm_lisa_map_0 = 0xFF020100,
-       .dmm_lisa_map_1 = 0,
-       .dmm_lisa_map_2 = 0,
-       .dmm_lisa_map_3 = 0x80640300
-};
-
-static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
-{
-       *regs = &emif_regs_elpida_532_mhz_1cs;
-}
-void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
-       __attribute__((weak, alias("emif_get_reg_dump_sdp")));
-
-static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
-                                               **dmm_lisa_regs)
-{
-       *dmm_lisa_regs = &lisa_map_4G_x_1_x_2;
-}
-
-void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
-       __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
-
-#else
-
-static const struct lpddr2_device_details elpida_4G_S4_details = {
-       .type           = LPDDR2_TYPE_S4,
-       .density        = LPDDR2_DENSITY_4Gb,
-       .io_width       = LPDDR2_IO_WIDTH_32,
-       .manufacturer   = LPDDR2_MANUFACTURER_ELPIDA
-};
-
-static void emif_get_device_details_sdp(u32 emif_nr,
-               struct lpddr2_device_details *cs0_device_details,
-               struct lpddr2_device_details *cs1_device_details)
-{
-       /* EMIF1 & EMIF2 have identical configuration */
-       *cs0_device_details = elpida_4G_S4_details;
-
-       /* Nothing is conected on cs1 */
-       cs1_device_details = NULL;
-}
-
-void emif_get_device_details(u32 emif_nr,
-               struct lpddr2_device_details *cs0_device_details,
-               struct lpddr2_device_details *cs1_device_details)
-       __attribute__((weak, alias("emif_get_device_details_sdp")));
-
-#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
-
-#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
-static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
-       .max_freq       = 532000000,
-       .RL             = 8,
-       .tRPab          = 21,
-       .tRCD           = 18,
-       .tWR            = 15,
-       .tRASmin        = 42,
-       .tRRD           = 10,
-       .tWTRx2         = 15,
-       .tXSR           = 140,
-       .tXPx2          = 15,
-       .tRFCab         = 130,
-       .tRTPx2         = 15,
-       .tCKE           = 3,
-       .tCKESR         = 15,
-       .tZQCS          = 90,
-       .tZQCL          = 360,
-       .tZQINIT        = 1000,
-       .tDQSCKMAXx2    = 11,
-       .tRASmax        = 70,
-       .tFAW           = 50
-};
-
-static const struct lpddr2_min_tck min_tck_elpida = {
-       .tRL            = 3,
-       .tRP_AB         = 3,
-       .tRCD           = 3,
-       .tWR            = 3,
-       .tRAS_MIN       = 3,
-       .tRRD           = 2,
-       .tWTR           = 2,
-       .tXP            = 2,
-       .tRTP           = 2,
-       .tCKE           = 3,
-       .tCKESR         = 3,
-       .tFAW           = 8
-};
-
-static const struct lpddr2_ac_timings *elpida_ac_timings[MAX_NUM_SPEEDBINS] = {
-       &timings_jedec_532_mhz
-};
-
-static const struct lpddr2_device_timings elpida_4G_S4_timings = {
-       .ac_timings     = elpida_ac_timings,
-       .min_tck        = &min_tck_elpida,
-};
-
-void emif_get_device_timings_sdp(u32 emif_nr,
-               const struct lpddr2_device_timings **cs0_device_timings,
-               const struct lpddr2_device_timings **cs1_device_timings)
-{
-       /* Identical devices on EMIF1 & EMIF2 */
-       *cs0_device_timings = &elpida_4G_S4_timings;
-       *cs1_device_timings = NULL;
-}
-
-void emif_get_device_timings(u32 emif_nr,
-               const struct lpddr2_device_timings **cs0_device_timings,
-               const struct lpddr2_device_timings **cs1_device_timings)
-       __attribute__((weak, alias("emif_get_device_timings_sdp")));
-
-#endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */
index c7d62212bde17f7200075804c4b8444b1d5ca177..000192c254c356f04755aac3d785afffd07e43a7 100644 (file)
 
 .align 5
 
+#include <linux/linkage.h>
+
 #ifndef CONFIG_SYS_L2CACHE_OFF
-.global v7_outer_cache_enable
-v7_outer_cache_enable:
+ENTRY(v7_outer_cache_enable)
        push    {r0, r1, r2, lr}
        mrc     15, 0, r3, cr1, cr0, 1
        orr     r3, r3, #2
        mcr     15, 0, r3, cr1, cr0, 1
        pop     {r1, r2, r3, pc}
+ENDPROC(v7_outer_cache_enable)
 
-.global v7_outer_cache_disable
-v7_outer_cache_disable:
+ENTRY(v7_outer_cache_disable)
        push    {r0, r1, r2, lr}
        mrc     15, 0, r3, cr1, cr0, 1
        bic     r3, r3, #2
        mcr     15, 0, r3, cr1, cr0, 1
        pop     {r1, r2, r3, pc}
+ENDPROC(v7_outer_cache_disable)
 #endif
index 70fa146cf38501b76db5daa9c9caa7e6700f743f..c7a41d03d23f04cec72b296a190690cef3d8e990 100644 (file)
  */
 
 #include <asm/arch/cpu.h>
+#include <linux/linkage.h>
 
 #define S5PC100_SWRESET                        0xE0200000
 #define S5PC110_SWRESET                        0xE0102000
 
-.globl reset_cpu
-reset_cpu:
+ENTRY(reset_cpu)
        ldr     r1, =S5PC100_PRO_ID
        ldr     r2, [r1]
        ldr     r4, =0x00010000
@@ -45,3 +45,4 @@ reset_cpu:
        str     r2, [r1]
 _loop_forever:
        b       _loop_forever
+ENDPROC(reset_cpu)
index ef08a55abc2c6189062c9d87c36d5d042139017c..261835b6c6b22266bd0e2120bd5e7c4241101581 100644 (file)
@@ -33,6 +33,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/system.h>
+#include <linux/linkage.h>
 
 .globl _start
 _start: b      reset
@@ -172,8 +173,7 @@ call_board_init_f:
  * after relocating the monitor code.
  *
  */
-       .globl  relocate_code
-relocate_code:
+ENTRY(relocate_code)
        mov     r4, r0  /* save addr_sp */
        mov     r5, r1  /* save addr of gd */
        mov     r6, r2  /* save addr of destination */
@@ -289,6 +289,7 @@ jump_2_ram:
 
 _board_init_r_ofs:
        .word board_init_r - _start
+ENDPROC(relocate_code)
 
 /*************************************************************************
  *
@@ -298,8 +299,7 @@ _board_init_r_ofs:
  * CONFIG_SYS_ICACHE_OFF is defined.
  *
  *************************************************************************/
-.globl cpu_init_cp15
-cpu_init_cp15:
+ENTRY(cpu_init_cp15)
        /*
         * Invalidate L1 I/D
         */
@@ -325,7 +325,7 @@ cpu_init_cp15:
 #endif
        mcr     p15, 0, r0, c1, c0, 0
        mov     pc, lr                  @ back to my caller
-
+ENDPROC(cpu_init_cp15)
 
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
 /*************************************************************************
@@ -336,7 +336,7 @@ cpu_init_cp15:
  * setup memory timing
  *
  *************************************************************************/
-cpu_init_crit:
+ENTRY(cpu_init_crit)
        /*
         * Jump to board specific initialization...
         * The Mask ROM will have already initialized
@@ -347,6 +347,7 @@ cpu_init_crit:
        bl      lowlevel_init           @ go setup pll,mux,memory
        mov     lr, ip                  @ restore link
        mov     pc, lr                  @ back to my caller
+ENDPROC(cpu_init_crit)
 #endif
 
 #ifndef CONFIG_SPL_BUILD
index e9ac6c9a710906a512611c2545b44875eeb73556..08c4137a342203d7eef3075939113864359116fb 100644 (file)
@@ -27,6 +27,7 @@
 # flags for any startup files it might use.
 CFLAGS_arch/arm/cpu/armv7/tegra2/ap20.o += -march=armv4t
 CFLAGS_arch/arm/cpu/armv7/tegra2/clock.o += -march=armv4t
+CFLAGS_arch/arm/cpu/armv7/tegra2/warmboot_avp.o += -march=armv4t
 
 include $(TOPDIR)/config.mk
 
@@ -34,7 +35,10 @@ LIB  =  $(obj)lib$(SOC).o
 
 SOBJS  := lowlevel_init.o
 COBJS-y        := ap20.o board.o clock.o funcmux.o pinmux.o sys_info.o timer.o
+COBJS-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o
+COBJS-$(CONFIG_TEGRA_PMU) += pmu.o
 COBJS-$(CONFIG_USB_EHCI_TEGRA) += usb.o
+COBJS-$(CONFIG_TEGRA2_LP0) += crypto.o warmboot.o warmboot_avp.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index b749821e5abaa07048c49867f1aa09654bd8fab5..698bfd0e171c94c5ad63f77e4d9b80f7406a7c39 100644 (file)
 * MA 02111-1307 USA
 */
 
-#include "ap20.h"
 #include <asm/io.h>
 #include <asm/arch/tegra2.h>
+#include <asm/arch/ap20.h>
 #include <asm/arch/clk_rst.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/fuse.h>
+#include <asm/arch/gp_padctrl.h>
 #include <asm/arch/pmc.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/scu.h>
+#include <asm/arch/warmboot.h>
 #include <common.h>
 
+int tegra_get_chip_type(void)
+{
+       struct apb_misc_gp_ctlr *gp;
+       struct fuse_regs *fuse = (struct fuse_regs *)TEGRA2_FUSE_BASE;
+       uint tegra_sku_id, rev;
+
+       /*
+        * This is undocumented, Chip ID is bits 15:8 of the register
+        * APB_MISC + 0x804, and has value 0x20 for Tegra20, 0x30 for
+        * Tegra30
+        */
+       gp = (struct apb_misc_gp_ctlr *)TEGRA2_APB_MISC_GP_BASE;
+       rev = (readl(&gp->hidrev) & HIDREV_CHIPID_MASK) >> HIDREV_CHIPID_SHIFT;
+
+       tegra_sku_id = readl(&fuse->sku_info) & 0xff;
+
+       switch (rev) {
+       case CHIPID_TEGRA2:
+               switch (tegra_sku_id) {
+               case SKU_ID_T20:
+                       return TEGRA_SOC_T20;
+               case SKU_ID_T25SE:
+               case SKU_ID_AP25:
+               case SKU_ID_T25:
+               case SKU_ID_AP25E:
+               case SKU_ID_T25E:
+                       return TEGRA_SOC_T25;
+               }
+               break;
+       }
+       /* unknown sku id */
+       return TEGRA_SOC_UNKNOWN;
+}
+
 /* Returns 1 if the current CPU executing is a Cortex-A9, else 0 */
 static int ap20_cpu_is_cortexa9(void)
 {
@@ -286,6 +323,11 @@ void init_pmc_scratch(void)
 
        /* ODMDATA is for kernel use to determine RAM size, LP config, etc. */
        writel(CONFIG_SYS_BOARD_ODMDATA, &pmc->pmc_scratch20);
+
+#ifdef CONFIG_TEGRA2_LP0
+       /* save Sdram params to PMC 2, 4, and 24 for WB0 */
+       warmboot_save_sdram_params();
+#endif
 }
 
 void tegra2_start(void)
diff --git a/arch/arm/cpu/armv7/tegra2/ap20.h b/arch/arm/cpu/armv7/tegra2/ap20.h
deleted file mode 100644 (file)
index a4b4d73..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * (C) Copyright 2010-2011
- * NVIDIA Corporation <www.nvidia.com>
- *
- * 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
- */
-#include <asm/types.h>
-
-/* Stabilization delays, in usec */
-#define PLL_STABILIZATION_DELAY (300)
-#define IO_STABILIZATION_DELAY (1000)
-
-#define NVBL_PLLP_KHZ  (216000)
-
-#define PLLX_ENABLED           (1 << 30)
-#define CCLK_BURST_POLICY      0x20008888
-#define SUPER_CCLK_DIVIDER     0x80000000
-
-/* Calculate clock fractional divider value from ref and target frequencies */
-#define CLK_DIVIDER(REF, FREQ)  ((((REF) * 2) / FREQ) - 2)
-
-/* Calculate clock frequency value from reference and clock divider value */
-#define CLK_FREQUENCY(REF, REG)  (((REF) * 2) / (REG + 2))
-
-/* AVP/CPU ID */
-#define PG_UP_TAG_0_PID_CPU    0x55555555      /* CPU aka "a9" aka "mpcore" */
-#define PG_UP_TAG_0             0x0
-
-#define CORESIGHT_UNLOCK       0xC5ACCE55;
-
-/* AP20-Specific Base Addresses */
-
-/* AP20 Base physical address of SDRAM. */
-#define AP20_BASE_PA_SDRAM      0x00000000
-/* AP20 Base physical address of internal SRAM. */
-#define AP20_BASE_PA_SRAM       0x40000000
-/* AP20 Size of internal SRAM (256KB). */
-#define AP20_BASE_PA_SRAM_SIZE  0x00040000
-/* AP20 Base physical address of flash. */
-#define AP20_BASE_PA_NOR_FLASH  0xD0000000
-/* AP20 Base physical address of boot information table. */
-#define AP20_BASE_PA_BOOT_INFO  AP20_BASE_PA_SRAM
-
-/*
- * Super-temporary stacks for EXTREMELY early startup. The values chosen for
- * these addresses must be valid on ALL SOCs because this value is used before
- * we are able to differentiate between the SOC types.
- *
- * NOTE: The since CPU's stack will eventually be moved from IRAM to SDRAM, its
- *       stack is placed below the AVP stack. Once the CPU stack has been moved,
- *       the AVP is free to use the IRAM the CPU stack previously occupied if
- *       it should need to do so.
- *
- * NOTE: In multi-processor CPU complex configurations, each processor will have
- *       its own stack of size CPU_EARLY_BOOT_STACK_SIZE. CPU 0 will have a
- *       limit of CPU_EARLY_BOOT_STACK_LIMIT. Each successive CPU will have a
- *       stack limit that is CPU_EARLY_BOOT_STACK_SIZE less then the previous
- *       CPU.
- */
-
-/* Common AVP early boot stack limit */
-#define AVP_EARLY_BOOT_STACK_LIMIT     \
-       (AP20_BASE_PA_SRAM + (AP20_BASE_PA_SRAM_SIZE/2))
-/* Common AVP early boot stack size */
-#define AVP_EARLY_BOOT_STACK_SIZE      0x1000
-/* Common CPU early boot stack limit */
-#define CPU_EARLY_BOOT_STACK_LIMIT     \
-       (AVP_EARLY_BOOT_STACK_LIMIT - AVP_EARLY_BOOT_STACK_SIZE)
-/* Common CPU early boot stack size */
-#define CPU_EARLY_BOOT_STACK_SIZE      0x1000
-
-#define EXCEP_VECTOR_CPU_RESET_VECTOR  (NV_PA_EVP_BASE + 0x100)
-#define CSITE_CPU_DBG0_LAR             (NV_PA_CSITE_BASE + 0x10FB0)
-#define CSITE_CPU_DBG1_LAR             (NV_PA_CSITE_BASE + 0x12FB0)
-
-#define FLOW_CTLR_HALT_COP_EVENTS      (NV_PA_FLOW_BASE + 4)
-#define FLOW_MODE_STOP                 2
-#define HALT_COP_EVENT_JTAG            (1 << 28)
-#define HALT_COP_EVENT_IRQ_1           (1 << 11)
-#define HALT_COP_EVENT_FIQ_1           (1 << 9)
-
-/* Start up the tegra2 SOC */
-void tegra2_start(void);
-
-/* This is the main entry into U-Boot, used by the Cortex-A9 */
-extern void _start(void);
index a797e6fc30d9a5a4eebdc89f7bbd8525be5dc3cd..a50b1b988a23d1ced00f360ba1d1c03b17006ca7 100644 (file)
 
 #include <common.h>
 #include <asm/io.h>
-#include "ap20.h"
+#include <asm/arch/ap20.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/funcmux.h>
+#include <asm/arch/pmc.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/tegra2.h>
-#include <asm/arch/pmc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index 39376ab86ef90434dacfa5b1cae8e44fabbc987e..ccad3516398cd9d781902d3c5c070c8c0490a66d 100644 (file)
@@ -410,6 +410,16 @@ enum clock_osc_freq clock_get_osc_freq(void)
        return (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT;
 }
 
+int clock_get_osc_bypass(void)
+{
+       struct clk_rst_ctlr *clkrst =
+                       (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
+       u32 reg;
+
+       reg = readl(&clkrst->crc_osc_ctrl);
+       return (reg & OSC_XOBP_MASK) >> OSC_XOBP_SHIFT;
+}
+
 /* Returns a pointer to the registers of the given pll */
 static struct clk_pll *get_pll(enum clock_id clkid)
 {
@@ -420,6 +430,28 @@ static struct clk_pll *get_pll(enum clock_id clkid)
        return &clkrst->crc_pll[clkid];
 }
 
+int clock_ll_read_pll(enum clock_id clkid, u32 *divm, u32 *divn,
+               u32 *divp, u32 *cpcon, u32 *lfcon)
+{
+       struct clk_pll *pll = get_pll(clkid);
+       u32 data;
+
+       assert(clkid != CLOCK_ID_USB);
+
+       /* Safety check, adds to code size but is small */
+       if (!clock_id_isvalid(clkid) || clkid == CLOCK_ID_USB)
+               return -1;
+       data = readl(&pll->pll_base);
+       *divm = (data & PLL_DIVM_MASK) >> PLL_DIVM_SHIFT;
+       *divn = (data & PLL_DIVN_MASK) >> PLL_DIVN_SHIFT;
+       *divp = (data & PLL_DIVP_MASK) >> PLL_DIVP_SHIFT;
+       data = readl(&pll->pll_misc);
+       *cpcon = (data & PLL_CPCON_MASK) >> PLL_CPCON_SHIFT;
+       *lfcon = (data & PLL_LFCON_MASK) >> PLL_LFCON_SHIFT;
+
+       return 0;
+}
+
 unsigned long clock_start_pll(enum clock_id clkid, u32 divm, u32 divn,
                u32 divp, u32 cpcon, u32 lfcon)
 {
@@ -1027,7 +1059,10 @@ void clock_early_init(void)
                clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8);
                break;
 
-       case CLOCK_OSC_FREQ_13_0:
+       case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */
+               clock_set_rate(CLOCK_ID_PERIPH, 432, 13, 1, 8);
+               clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8);
+               break;
        case CLOCK_OSC_FREQ_19_2:
        default:
                /*
diff --git a/arch/arm/cpu/armv7/tegra2/crypto.c b/arch/arm/cpu/armv7/tegra2/crypto.c
new file mode 100644 (file)
index 0000000..5f0b240
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/errno.h>
+#include "crypto.h"
+#include "aes.h"
+
+static u8 zero_key[16];
+
+#define AES_CMAC_CONST_RB 0x87  /* from RFC 4493, Figure 2.2 */
+
+enum security_op {
+       SECURITY_SIGN           = 1 << 0,       /* Sign the data */
+       SECURITY_ENCRYPT        = 1 << 1,       /* Encrypt the data */
+};
+
+static void debug_print_vector(char *name, u32 num_bytes, u8 *data)
+{
+       u32 i;
+
+       debug("%s [%d] @0x%08x", name, num_bytes, (u32)data);
+       for (i = 0; i < num_bytes; i++) {
+               if (i % 16 == 0)
+                       debug(" = ");
+               debug("%02x", data[i]);
+               if ((i+1) % 16 != 0)
+                       debug(" ");
+       }
+       debug("\n");
+}
+
+/**
+ * Apply chain data to the destination using EOR
+ *
+ * Each array is of length AES_AES_KEY_LENGTH.
+ *
+ * \param cbc_chain_data       Chain data
+ * \param src                  Source data
+ * \param dst                  Destination data, which is modified here
+ */
+static void apply_cbc_chain_data(u8 *cbc_chain_data, u8 *src, u8 *dst)
+{
+       int i;
+
+       for (i = 0; i < 16; i++)
+               *dst++ = *src++ ^ *cbc_chain_data++;
+}
+
+/**
+ * Encrypt some data with AES.
+ *
+ * \param key_schedule         Expanded key to use
+ * \param src                  Source data to encrypt
+ * \param dst                  Destination buffer
+ * \param num_aes_blocks       Number of AES blocks to encrypt
+ */
+static void encrypt_object(u8 *key_schedule, u8 *src, u8 *dst,
+                          u32 num_aes_blocks)
+{
+       u8 tmp_data[AES_KEY_LENGTH];
+       u8 *cbc_chain_data;
+       u32 i;
+
+       cbc_chain_data = zero_key;      /* Convenient array of 0's for IV */
+
+       for (i = 0; i < num_aes_blocks; i++) {
+               debug("encrypt_object: block %d of %d\n", i, num_aes_blocks);
+               debug_print_vector("AES Src", AES_KEY_LENGTH, src);
+
+               /* Apply the chain data */
+               apply_cbc_chain_data(cbc_chain_data, src, tmp_data);
+               debug_print_vector("AES Xor", AES_KEY_LENGTH, tmp_data);
+
+               /* encrypt the AES block */
+               aes_encrypt(tmp_data, key_schedule, dst);
+               debug_print_vector("AES Dst", AES_KEY_LENGTH, dst);
+
+               /* Update pointers for next loop. */
+               cbc_chain_data = dst;
+               src += AES_KEY_LENGTH;
+               dst += AES_KEY_LENGTH;
+       }
+}
+
+/**
+ * Shift a vector left by one bit
+ *
+ * \param in   Input vector
+ * \param out  Output vector
+ * \param size Length of vector in bytes
+ */
+static void left_shift_vector(u8 *in, u8 *out, int size)
+{
+       int carry = 0;
+       int i;
+
+       for (i = size - 1; i >= 0; i--) {
+               out[i] = (in[i] << 1) | carry;
+               carry = in[i] >> 7;     /* get most significant bit */
+       }
+}
+
+/**
+ * Sign a block of data, putting the result into dst.
+ *
+ * \param key                  Input AES key, length AES_KEY_LENGTH
+ * \param key_schedule         Expanded key to use
+ * \param src                  Source data of length 'num_aes_blocks' blocks
+ * \param dst                  Destination buffer, length AES_KEY_LENGTH
+ * \param num_aes_blocks       Number of AES blocks to encrypt
+ */
+static void sign_object(u8 *key, u8 *key_schedule, u8 *src, u8 *dst,
+                       u32 num_aes_blocks)
+{
+       u8 tmp_data[AES_KEY_LENGTH];
+       u8 left[AES_KEY_LENGTH];
+       u8 k1[AES_KEY_LENGTH];
+       u8 *cbc_chain_data;
+       unsigned i;
+
+       cbc_chain_data = zero_key;      /* Convenient array of 0's for IV */
+
+       /* compute K1 constant needed by AES-CMAC calculation */
+       for (i = 0; i < AES_KEY_LENGTH; i++)
+               tmp_data[i] = 0;
+
+       encrypt_object(key_schedule, tmp_data, left, 1);
+       debug_print_vector("AES(key, nonce)", AES_KEY_LENGTH, left);
+
+       left_shift_vector(left, k1, sizeof(left));
+       debug_print_vector("L", AES_KEY_LENGTH, left);
+
+       if ((left[0] >> 7) != 0) /* get MSB of L */
+               k1[AES_KEY_LENGTH-1] ^= AES_CMAC_CONST_RB;
+       debug_print_vector("K1", AES_KEY_LENGTH, k1);
+
+       /* compute the AES-CMAC value */
+       for (i = 0; i < num_aes_blocks; i++) {
+               /* Apply the chain data */
+               apply_cbc_chain_data(cbc_chain_data, src, tmp_data);
+
+               /* for the final block, XOR K1 into the IV */
+               if (i == num_aes_blocks - 1)
+                       apply_cbc_chain_data(tmp_data, k1, tmp_data);
+
+               /* encrypt the AES block */
+               aes_encrypt(tmp_data, key_schedule, dst);
+
+               debug("sign_obj: block %d of %d\n", i, num_aes_blocks);
+               debug_print_vector("AES-CMAC Src", AES_KEY_LENGTH, src);
+               debug_print_vector("AES-CMAC Xor", AES_KEY_LENGTH, tmp_data);
+               debug_print_vector("AES-CMAC Dst", AES_KEY_LENGTH, dst);
+
+               /* Update pointers for next loop. */
+               cbc_chain_data = dst;
+               src += AES_KEY_LENGTH;
+       }
+
+       debug_print_vector("AES-CMAC Hash", AES_KEY_LENGTH, dst);
+}
+
+/**
+ * Encrypt and sign a block of data (depending on security mode).
+ *
+ * \param key          Input AES key, length AES_KEY_LENGTH
+ * \param oper         Security operations mask to perform (enum security_op)
+ * \param src          Source data
+ * \param length       Size of source data
+ * \param sig_dst      Destination address for signature, AES_KEY_LENGTH bytes
+ */
+static int encrypt_and_sign(u8 *key, enum security_op oper, u8 *src,
+                           u32 length, u8 *sig_dst)
+{
+       u32 num_aes_blocks;
+       u8 key_schedule[AES_EXPAND_KEY_LENGTH];
+
+       debug("encrypt_and_sign: length = %d\n", length);
+       debug_print_vector("AES key", AES_KEY_LENGTH, key);
+
+       /*
+        * The only need for a key is for signing/checksum purposes, so
+        * if not encrypting, expand a key of 0s.
+        */
+       aes_expand_key(oper & SECURITY_ENCRYPT ? key : zero_key, key_schedule);
+
+       num_aes_blocks = (length + AES_KEY_LENGTH - 1) / AES_KEY_LENGTH;
+
+       if (oper & SECURITY_ENCRYPT) {
+               /* Perform this in place, resulting in src being encrypted. */
+               debug("encrypt_and_sign: begin encryption\n");
+               encrypt_object(key_schedule, src, src, num_aes_blocks);
+               debug("encrypt_and_sign: end encryption\n");
+       }
+
+       if (oper & SECURITY_SIGN) {
+               /* encrypt the data, overwriting the result in signature. */
+               debug("encrypt_and_sign: begin signing\n");
+               sign_object(key, key_schedule, src, sig_dst, num_aes_blocks);
+               debug("encrypt_and_sign: end signing\n");
+       }
+
+       return 0;
+}
+
+int sign_data_block(u8 *source, unsigned length, u8 *signature)
+{
+       return encrypt_and_sign(zero_key, SECURITY_SIGN, source,
+                               length, signature);
+}
diff --git a/arch/arm/cpu/armv7/tegra2/crypto.h b/arch/arm/cpu/armv7/tegra2/crypto.h
new file mode 100644 (file)
index 0000000..aff67e7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _CRYPTO_H_
+#define _CRYPTO_H_
+
+/**
+ * Sign a block of data
+ *
+ * \param source       Source data
+ * \param length       Size of source data
+ * \param signature    Destination address for signature, AES_KEY_LENGTH bytes
+ */
+int sign_data_block(u8 *source, unsigned length, u8 *signature);
+
+#endif /* #ifndef _CRYPTO_H_ */
diff --git a/arch/arm/cpu/armv7/tegra2/emc.c b/arch/arm/cpu/armv7/tegra2/emc.c
new file mode 100644 (file)
index 0000000..c0e5c56
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <asm/io.h>
+#include <asm/arch/ap20.h>
+#include <asm/arch/apb_misc.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/emc.h>
+#include <asm/arch/tegra2.h>
+
+/*
+ * The EMC registers have shadow registers.  When the EMC clock is updated
+ * in the clock controller, the shadow registers are copied to the active
+ * registers, allowing glitchless memory bus frequency changes.
+ * This function updates the shadow registers for a new clock frequency,
+ * and relies on the clock lock on the emc clock to avoid races between
+ * multiple frequency changes
+ */
+
+/*
+ * This table defines the ordering of the registers provided to
+ * tegra_set_mmc()
+ * TODO: Convert to fdt version once available
+ */
+static const unsigned long emc_reg_addr[TEGRA_EMC_NUM_REGS] = {
+       0x2c,   /* RC */
+       0x30,   /* RFC */
+       0x34,   /* RAS */
+       0x38,   /* RP */
+       0x3c,   /* R2W */
+       0x40,   /* W2R */
+       0x44,   /* R2P */
+       0x48,   /* W2P */
+       0x4c,   /* RD_RCD */
+       0x50,   /* WR_RCD */
+       0x54,   /* RRD */
+       0x58,   /* REXT */
+       0x5c,   /* WDV */
+       0x60,   /* QUSE */
+       0x64,   /* QRST */
+       0x68,   /* QSAFE */
+       0x6c,   /* RDV */
+       0x70,   /* REFRESH */
+       0x74,   /* BURST_REFRESH_NUM */
+       0x78,   /* PDEX2WR */
+       0x7c,   /* PDEX2RD */
+       0x80,   /* PCHG2PDEN */
+       0x84,   /* ACT2PDEN */
+       0x88,   /* AR2PDEN */
+       0x8c,   /* RW2PDEN */
+       0x90,   /* TXSR */
+       0x94,   /* TCKE */
+       0x98,   /* TFAW */
+       0x9c,   /* TRPAB */
+       0xa0,   /* TCLKSTABLE */
+       0xa4,   /* TCLKSTOP */
+       0xa8,   /* TREFBW */
+       0xac,   /* QUSE_EXTRA */
+       0x114,  /* FBIO_CFG6 */
+       0xb0,   /* ODT_WRITE */
+       0xb4,   /* ODT_READ */
+       0x104,  /* FBIO_CFG5 */
+       0x2bc,  /* CFG_DIG_DLL */
+       0x2c0,  /* DLL_XFORM_DQS */
+       0x2c4,  /* DLL_XFORM_QUSE */
+       0x2e0,  /* ZCAL_REF_CNT */
+       0x2e4,  /* ZCAL_WAIT_CNT */
+       0x2a8,  /* AUTO_CAL_INTERVAL */
+       0x2d0,  /* CFG_CLKTRIM_0 */
+       0x2d4,  /* CFG_CLKTRIM_1 */
+       0x2d8,  /* CFG_CLKTRIM_2 */
+};
+
+struct emc_ctlr *emc_get_controller(const void *blob)
+{
+       fdt_addr_t addr;
+       int node;
+
+       node = fdtdec_next_compatible(blob, 0, COMPAT_NVIDIA_TEGRA20_EMC);
+       if (node > 0) {
+               addr = fdtdec_get_addr(blob, node, "reg");
+               if (addr != FDT_ADDR_T_NONE)
+                       return (struct emc_ctlr *)addr;
+       }
+       return NULL;
+}
+
+/* Error codes we use */
+enum {
+       ERR_NO_EMC_NODE = -10,
+       ERR_NO_EMC_REG,
+       ERR_NO_FREQ,
+       ERR_FREQ_NOT_FOUND,
+       ERR_BAD_REGS,
+       ERR_NO_RAM_CODE,
+       ERR_RAM_CODE_NOT_FOUND,
+};
+
+/**
+ * Find EMC tables for the given ram code.
+ *
+ * The tegra EMC binding has two options, one using the ram code and one not.
+ * We detect which is in use by looking for the nvidia,use-ram-code property.
+ * If this is not present, then the EMC tables are directly below 'node',
+ * otherwise we select the correct emc-tables subnode based on the 'ram_code'
+ * value.
+ *
+ * @param blob         Device tree blob
+ * @param node         EMC node (nvidia,tegra20-emc compatible string)
+ * @param ram_code     RAM code to select (0-3, or -1 if unknown)
+ * @return 0 if ok, otherwise a -ve ERR_ code (see enum above)
+ */
+static int find_emc_tables(const void *blob, int node, int ram_code)
+{
+       int need_ram_code;
+       int depth;
+       int offset;
+
+       /* If we are using RAM codes, scan through the tables for our code */
+       need_ram_code = fdtdec_get_bool(blob, node, "nvidia,use-ram-code");
+       if (!need_ram_code)
+               return node;
+       if (ram_code == -1) {
+               debug("%s: RAM code required but not supplied\n", __func__);
+               return ERR_NO_RAM_CODE;
+       }
+
+       offset = node;
+       depth = 0;
+       do {
+               /*
+                * Sadly there is no compatible string so we cannot use
+                * fdtdec_next_compatible_subnode().
+                */
+               offset = fdt_next_node(blob, offset, &depth);
+               if (depth <= 0)
+                       break;
+
+               /* Make sure this is a direct subnode */
+               if (depth != 1)
+                       continue;
+               if (strcmp("emc-tables", fdt_get_name(blob, offset, NULL)))
+                       continue;
+
+               if (fdtdec_get_int(blob, offset, "nvidia,ram-code", -1)
+                               == ram_code)
+                       return offset;
+       } while (1);
+
+       debug("%s: Could not find tables for RAM code %d\n", __func__,
+             ram_code);
+       return ERR_RAM_CODE_NOT_FOUND;
+}
+
+/**
+ * Decode the EMC node of the device tree, returning a pointer to the emc
+ * controller and the table to be used for the given rate.
+ *
+ * @param blob Device tree blob
+ * @param rate Clock speed of memory controller in Hz (=2x memory bus rate)
+ * @param emcp Returns address of EMC controller registers
+ * @param tablep Returns pointer to table to program into EMC. There are
+ *             TEGRA_EMC_NUM_REGS entries, destined for offsets as per the
+ *             emc_reg_addr array.
+ * @return 0 if ok, otherwise a -ve error code which will allow someone to
+ * figure out roughly what went wrong by looking at this code.
+ */
+static int decode_emc(const void *blob, unsigned rate, struct emc_ctlr **emcp,
+                     const u32 **tablep)
+{
+       struct apb_misc_pp_ctlr *pp =
+               (struct apb_misc_pp_ctlr *)NV_PA_APB_MISC_BASE;
+       int ram_code;
+       int depth;
+       int node;
+
+       ram_code = (readl(&pp->strapping_opt_a) & RAM_CODE_MASK)
+                       >> RAM_CODE_SHIFT;
+       /*
+        * The EMC clock rate is twice the bus rate, and the bus rate is
+        * measured in kHz
+        */
+       rate = rate / 2 / 1000;
+
+       node = fdtdec_next_compatible(blob, 0, COMPAT_NVIDIA_TEGRA20_EMC);
+       if (node < 0) {
+               debug("%s: No EMC node found in FDT\n", __func__);
+               return ERR_NO_EMC_NODE;
+       }
+       *emcp = (struct emc_ctlr *)fdtdec_get_addr(blob, node, "reg");
+       if (*emcp == (struct emc_ctlr *)FDT_ADDR_T_NONE) {
+               debug("%s: No EMC node reg property\n", __func__);
+               return ERR_NO_EMC_REG;
+       }
+
+       /* Work out the parent node which contains our EMC tables */
+       node = find_emc_tables(blob, node, ram_code & 3);
+       if (node < 0)
+               return node;
+
+       depth = 0;
+       for (;;) {
+               int node_rate;
+
+               node = fdtdec_next_compatible_subnode(blob, node,
+                               COMPAT_NVIDIA_TEGRA20_EMC_TABLE, &depth);
+               if (node < 0)
+                       break;
+               node_rate = fdtdec_get_int(blob, node, "clock-frequency", -1);
+               if (node_rate == -1) {
+                       debug("%s: Missing clock-frequency\n", __func__);
+                       return ERR_NO_FREQ; /* we expect this property */
+               }
+
+               if (node_rate == rate)
+                       break;
+       }
+       if (node < 0) {
+               debug("%s: No node found for clock frequency %d\n", __func__,
+                     rate);
+               return ERR_FREQ_NOT_FOUND;
+       }
+
+       *tablep = fdtdec_locate_array(blob, node, "nvidia,emc-registers",
+                                     TEGRA_EMC_NUM_REGS);
+       if (!*tablep) {
+               debug("%s: node '%s' array missing / wrong size\n", __func__,
+                     fdt_get_name(blob, node, NULL));
+               return ERR_BAD_REGS;
+       }
+
+       /* All seems well */
+       return 0;
+}
+
+int tegra_set_emc(const void *blob, unsigned rate)
+{
+       struct emc_ctlr *emc;
+       const u32 *table;
+       int err, i;
+
+       err = decode_emc(blob, rate, &emc, &table);
+       if (err) {
+               debug("Warning: no valid EMC (%d), memory timings unset\n",
+                      err);
+               return err;
+       }
+
+       debug("%s: Table found, setting EMC values as follows:\n", __func__);
+       for (i = 0; i < TEGRA_EMC_NUM_REGS; i++) {
+               u32 value = fdt32_to_cpu(table[i]);
+               u32 addr = (uintptr_t)emc + emc_reg_addr[i];
+
+               debug("   %#x: %#x\n", addr, value);
+               writel(value, addr);
+       }
+
+       /* trigger emc with new settings */
+       clock_adjust_periph_pll_div(PERIPH_ID_EMC, CLOCK_ID_MEMORY,
+                               clock_get_rate(CLOCK_ID_MEMORY), NULL);
+       debug("EMC clock set to %lu\n",
+             clock_get_periph_rate(PERIPH_ID_EMC, CLOCK_ID_MEMORY));
+
+       return 0;
+}
index c1d2dfec5f02dea5c8631ca9222c3d7be13cb486..0ef775302188a57b178e9f0ed78a3310fcc4b38e 100644 (file)
@@ -169,6 +169,22 @@ int funcmux_select(enum periph_id id, int config)
                }
                break;
 
+       case PERIPH_ID_KBC:
+               if (config == FUNCMUX_DEFAULT) {
+                       enum pmux_pingrp grp[] = {PINGRP_KBCA, PINGRP_KBCB,
+                               PINGRP_KBCC, PINGRP_KBCD, PINGRP_KBCE,
+                               PINGRP_KBCF};
+                       int i;
+
+                       for (i = 0; i < ARRAY_SIZE(grp); i++) {
+                               pinmux_tristate_disable(grp[i]);
+                               pinmux_set_func(grp[i], PMUX_FUNC_KBC);
+                               pinmux_set_pullupdown(grp[i], PMUX_PULL_UP);
+                       }
+
+                       break;
+               }
+
        default:
                debug("%s: invalid periph_id %d", __func__, id);
                return -1;
index 6b866476ce7ba746a64b62ca8ddb079211f41831..d117f23a622f549c5b24652668d295276a0e196f 100644 (file)
 
 #include <config.h>
 #include <version.h>
+#include <linux/linkage.h>
 
        .align  5
-.global reset_cpu
-reset_cpu:
+ENTRY(reset_cpu)
        ldr     r1, rstctl                      @ get addr for global reset
                                                @ reg
        ldr     r3, [r1]
@@ -39,3 +39,4 @@ _loop_forever:
        b       _loop_forever
 rstctl:
        .word   PRM_RSTCTRL
+ENDPROC(reset_cpu)
diff --git a/arch/arm/cpu/armv7/tegra2/pmu.c b/arch/arm/cpu/armv7/tegra2/pmu.c
new file mode 100644 (file)
index 0000000..4673802
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010,2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <tps6586x.h>
+#include <asm/io.h>
+#include <asm/arch/ap20.h>
+#include <asm/arch/tegra2.h>
+#include <asm/arch/tegra_i2c.h>
+#include <asm/arch/sys_proto.h>
+
+#define VDD_CORE_NOMINAL_T25   0x17    /* 1.3v */
+#define VDD_CPU_NOMINAL_T25    0x10    /* 1.125v */
+
+#define VDD_CORE_NOMINAL_T20   0x16    /* 1.275v */
+#define VDD_CPU_NOMINAL_T20    0x0f    /* 1.1v */
+
+#define VDD_RELATION           0x02    /*  50mv */
+#define VDD_TRANSITION_STEP    0x06    /* 150mv */
+#define VDD_TRANSITION_RATE    0x06    /* 3.52mv/us */
+
+int pmu_set_nominal(void)
+{
+       int core, cpu, bus;
+
+       /* by default, the table has been filled with T25 settings */
+       switch (tegra_get_chip_type()) {
+       case TEGRA_SOC_T20:
+               core = VDD_CORE_NOMINAL_T20;
+               cpu = VDD_CPU_NOMINAL_T20;
+               break;
+       case TEGRA_SOC_T25:
+               core = VDD_CORE_NOMINAL_T25;
+               cpu = VDD_CPU_NOMINAL_T25;
+               break;
+       default:
+               debug("%s: Unknown chip type\n", __func__);
+               return -1;
+       }
+
+       bus = tegra_i2c_get_dvc_bus_num();
+       if (bus == -1) {
+               debug("%s: Cannot find DVC I2C bus\n", __func__);
+               return -1;
+       }
+       tps6586x_init(bus);
+       tps6586x_set_pwm_mode(TPS6586X_PWM_SM1);
+       return tps6586x_adjust_sm0_sm1(core, cpu, VDD_TRANSITION_STEP,
+                               VDD_TRANSITION_RATE, VDD_RELATION);
+}
diff --git a/arch/arm/cpu/armv7/tegra2/warmboot.c b/arch/arm/cpu/armv7/tegra2/warmboot.c
new file mode 100644 (file)
index 0000000..25d8968
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * (C) Copyright 2010 - 2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/ap20.h>
+#include <asm/arch/clk_rst.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/pmc.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/tegra2.h>
+#include <asm/arch/fuse.h>
+#include <asm/arch/emc.h>
+#include <asm/arch/gp_padctrl.h>
+#include <asm/arch/warmboot.h>
+#include <asm/arch/sdram_param.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifndef CONFIG_TEGRA_CLOCK_SCALING
+#error "You must enable CONFIG_TEGRA_CLOCK_SCALING to use CONFIG_TEGRA2_LP0"
+#endif
+
+/*
+ * This is the place in SRAM where the SDRAM parameters are stored. There
+ * are 4 blocks, one for each RAM code
+ */
+#define SDRAM_PARAMS_BASE      (AP20_BASE_PA_SRAM + 0x188)
+
+/* TODO: If we later add support for the Misc GP controller, refactor this */
+union xm2cfga_reg {
+       struct {
+               u32 reserved0:2;
+               u32 hsm_en:1;
+               u32 reserved1:2;
+               u32 preemp_en:1;
+               u32 vref_en:1;
+               u32 reserved2:5;
+               u32 cal_drvdn:5;
+               u32 reserved3:3;
+               u32 cal_drvup:5;
+               u32 reserved4:3;
+               u32 cal_drvdn_slwr:2;
+               u32 cal_drvup_slwf:2;
+       };
+       u32 word;
+};
+
+union xm2cfgd_reg {
+       struct {
+               u32 reserved0:2;
+               u32 hsm_en:1;
+               u32 schmt_en:1;
+               u32 lpmd:2;
+               u32 vref_en:1;
+               u32 reserved1:5;
+               u32 cal_drvdn:5;
+               u32 reserved2:3;
+               u32 cal_drvup:5;
+               u32 reserved3:3;
+               u32 cal_drvdn_slwr:2;
+               u32 cal_drvup_slwf:2;
+       };
+       u32 word;
+};
+
+/*
+ * TODO: This register is not documented in the TRM yet. We could move this
+ * into the EMC and give it a proper interface, but not while it is
+ * undocumented.
+ */
+union fbio_spare_reg {
+       struct {
+               u32 reserved:24;
+               u32 cfg_wb0:8;
+       };
+       u32 word;
+};
+
+/* We pack the resume information into these unions for later */
+union scratch2_reg {
+       struct {
+               u32 pllm_base_divm:5;
+               u32 pllm_base_divn:10;
+               u32 pllm_base_divp:3;
+               u32 pllm_misc_lfcon:4;
+               u32 pllm_misc_cpcon:4;
+               u32 gp_xm2cfga_padctrl_preemp:1;
+               u32 gp_xm2cfgd_padctrl_schmt:1;
+               u32 osc_ctrl_xobp:1;
+               u32 memory_type:3;
+       };
+       u32 word;
+};
+
+union scratch4_reg {
+       struct {
+               u32 emc_clock_divider:8;
+               u32 pllm_stable_time:8;
+               u32 pllx_stable_time:8;
+               u32 emc_fbio_spare_cfg_wb0:8;
+       };
+       u32 word;
+};
+
+union scratch24_reg {
+       struct {
+               u32 emc_auto_cal_wait:8;
+               u32 emc_pin_program_wait:8;
+               u32 warmboot_wait:8;
+               u32 reserved:8;
+       };
+       u32 word;
+};
+
+int warmboot_save_sdram_params(void)
+{
+       u32 ram_code;
+       struct sdram_params sdram;
+       struct pmux_tri_ctlr *pmt = (struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
+       struct pmc_ctlr *pmc = (struct pmc_ctlr *)TEGRA2_PMC_BASE;
+       struct apb_misc_gp_ctlr *gp =
+                       (struct apb_misc_gp_ctlr *)TEGRA2_APB_MISC_GP_BASE;
+       struct emc_ctlr *emc = emc_get_controller(gd->fdt_blob);
+       union scratch2_reg scratch2;
+       union scratch4_reg scratch4;
+       union scratch24_reg scratch24;
+       union xm2cfga_reg xm2cfga;
+       union xm2cfgd_reg xm2cfgd;
+       union fbio_spare_reg fbio_spare;
+
+       /* get ram code that is used as index to array sdram_params in BCT */
+       ram_code = (readl(&pmt->pmt_strap_opt_a) >>
+                       STRAP_OPT_A_RAM_CODE_SHIFT) & 3;
+       memcpy(&sdram,
+              (char *)((struct sdram_params *)SDRAM_PARAMS_BASE + ram_code),
+              sizeof(sdram));
+
+       xm2cfga.word = readl(&gp->xm2cfga);
+       xm2cfgd.word = readl(&gp->xm2cfgd);
+
+       scratch2.word = 0;
+       scratch2.osc_ctrl_xobp = clock_get_osc_bypass();
+
+       /* Get the memory PLL settings */
+       {
+               u32 divm, divn, divp, cpcon, lfcon;
+
+               if (clock_ll_read_pll(CLOCK_ID_MEMORY, &divm, &divn, &divp,
+                                       &cpcon, &lfcon))
+                       return -1;
+               scratch2.pllm_base_divm = divm;
+               scratch2.pllm_base_divn = divn;
+               scratch2.pllm_base_divp = divp;
+               scratch2.pllm_misc_cpcon = cpcon;
+               scratch2.pllm_misc_lfcon = lfcon;
+       }
+
+       scratch2.gp_xm2cfga_padctrl_preemp = xm2cfga.preemp_en;
+       scratch2.gp_xm2cfgd_padctrl_schmt = xm2cfgd.schmt_en;
+       scratch2.memory_type = sdram.memory_type;
+       writel(scratch2.word, &pmc->pmc_scratch2);
+
+       /* collect data from various sources for pmc_scratch4 */
+       fbio_spare.word = readl(&emc->fbio_spare);
+       scratch4.word = 0;
+       scratch4.emc_fbio_spare_cfg_wb0 = fbio_spare.cfg_wb0;
+       scratch4.emc_clock_divider = sdram.emc_clock_divider;
+       scratch4.pllm_stable_time = -1;
+       scratch4.pllx_stable_time = -1;
+       writel(scratch4.word, &pmc->pmc_scratch4);
+
+       /* collect various data from sdram for pmc_scratch24 */
+       scratch24.word = 0;
+       scratch24.emc_pin_program_wait = sdram.emc_pin_program_wait;
+       scratch24.emc_auto_cal_wait = sdram.emc_auto_cal_wait;
+       scratch24.warmboot_wait = sdram.warm_boot_wait;
+       writel(scratch24.word, &pmc->pmc_scratch24);
+
+       return 0;
+}
+
+static u32 get_major_version(void)
+{
+       u32 major_id;
+       struct apb_misc_gp_ctlr *gp =
+               (struct apb_misc_gp_ctlr *)TEGRA2_APB_MISC_GP_BASE;
+
+       major_id = (readl(&gp->hidrev) & HIDREV_MAJORPREV_MASK) >>
+                       HIDREV_MAJORPREV_SHIFT;
+       return major_id;
+}
+
+static int is_production_mode_fuse_set(struct fuse_regs *fuse)
+{
+       return readl(&fuse->production_mode);
+}
+
+static int is_odm_production_mode_fuse_set(struct fuse_regs *fuse)
+{
+       return readl(&fuse->security_mode);
+}
+
+static int is_failure_analysis_mode(struct fuse_regs *fuse)
+{
+       return readl(&fuse->fa);
+}
+
+static int ap20_is_odm_production_mode(void)
+{
+       struct fuse_regs *fuse = (struct fuse_regs *)TEGRA2_FUSE_BASE;
+
+       if (!is_failure_analysis_mode(fuse) &&
+           is_odm_production_mode_fuse_set(fuse))
+               return 1;
+       else
+               return 0;
+}
+
+static int ap20_is_production_mode(void)
+{
+       struct fuse_regs *fuse = (struct fuse_regs *)TEGRA2_FUSE_BASE;
+
+       if (get_major_version() == 0)
+               return 1;
+
+       if (!is_failure_analysis_mode(fuse) &&
+           is_production_mode_fuse_set(fuse) &&
+           !is_odm_production_mode_fuse_set(fuse))
+               return 1;
+       else
+               return 0;
+}
+
+static enum fuse_operating_mode fuse_get_operation_mode(void)
+{
+       u32 chip_id;
+       struct apb_misc_gp_ctlr *gp =
+               (struct apb_misc_gp_ctlr *)TEGRA2_APB_MISC_GP_BASE;
+
+       chip_id = (readl(&gp->hidrev) & HIDREV_CHIPID_MASK) >>
+                       HIDREV_CHIPID_SHIFT;
+       if (chip_id == CHIPID_TEGRA2) {
+               if (ap20_is_odm_production_mode()) {
+                       printf("!! odm_production_mode is not supported !!\n");
+                       return MODE_UNDEFINED;
+               } else
+                       if (ap20_is_production_mode())
+                               return MODE_PRODUCTION;
+                       else
+                               return MODE_UNDEFINED;
+       }
+       return MODE_UNDEFINED;
+}
+
+static void determine_crypto_options(int *is_encrypted, int *is_signed,
+                                    int *use_zero_key)
+{
+       switch (fuse_get_operation_mode()) {
+       case MODE_PRODUCTION:
+               *is_encrypted = 0;
+               *is_signed = 1;
+               *use_zero_key = 1;
+               break;
+       case MODE_UNDEFINED:
+       default:
+               *is_encrypted = 0;
+               *is_signed = 0;
+               *use_zero_key  = 0;
+               break;
+       }
+}
+
+static int sign_wb_code(u32 start, u32 length, int use_zero_key)
+{
+       int err;
+       u8 *source;             /* Pointer to source */
+       u8 *hash;
+
+       /* Calculate AES block parameters. */
+       source = (u8 *)(start + offsetof(struct wb_header, random_aes_block));
+       length -= offsetof(struct wb_header, random_aes_block);
+       hash = (u8 *)(start + offsetof(struct wb_header, hash));
+       err = sign_data_block(source, length, hash);
+
+       return err;
+}
+
+int warmboot_prepare_code(u32 seg_address, u32 seg_length)
+{
+       int err = 0;
+       u32 length;                     /* length of the signed/encrypt code */
+       struct wb_header *dst_header;   /* Pointer to dest WB header */
+       int is_encrypted;               /* Segment is encrypted */
+       int is_signed;                  /* Segment is signed */
+       int use_zero_key;               /* Use key of all zeros */
+
+       /* Determine crypto options. */
+       determine_crypto_options(&is_encrypted, &is_signed, &use_zero_key);
+
+       /* Get the actual code limits. */
+       length = roundup(((u32)wb_end - (u32)wb_start), 16);
+
+       /*
+        * The region specified by seg_address must be in SDRAM and must be
+        * nonzero in length.
+        */
+       if (seg_length == 0 || seg_address < NV_PA_SDRAM_BASE ||
+               seg_address + seg_length >= NV_PA_SDRAM_BASE + gd->ram_size) {
+               err = -EFAULT;
+               goto fail;
+       }
+
+       /* Things must be 16-byte aligned. */
+       if ((seg_length & 0xF) || (seg_address & 0xF)) {
+               err = -EINVAL;
+               goto fail;
+       }
+
+       /* Will the code fit? (destination includes wb_header + wb code) */
+       if (seg_length < (length + sizeof(struct wb_header))) {
+               err = -EINVAL;
+               goto fail;
+       }
+
+       dst_header = (struct wb_header *)seg_address;
+       memset((char *)dst_header, 0, sizeof(struct wb_header));
+
+       /* Populate the random_aes_block as requested. */
+       {
+               u32 *aes_block = (u32 *)&(dst_header->random_aes_block);
+               u32 *end = (u32 *)(((u32)aes_block) +
+                                  sizeof(dst_header->random_aes_block));
+
+               do {
+                       *aes_block++ = 0;
+               } while (aes_block < end);
+       }
+
+       /* Populate the header. */
+       dst_header->length_insecure = length + sizeof(struct wb_header);
+       dst_header->length_secure = length + sizeof(struct wb_header);
+       dst_header->destination = AP20_WB_RUN_ADDRESS;
+       dst_header->entry_point = AP20_WB_RUN_ADDRESS;
+       dst_header->code_length = length;
+
+       if (is_encrypted) {
+               printf("!!!! Encryption is not supported !!!!\n");
+               dst_header->length_insecure = 0;
+               err = -EACCES;
+               goto fail;
+       } else
+               /* copy the wb code directly following dst_header. */
+               memcpy((char *)(dst_header+1), (char *)wb_start, length);
+
+       if (is_signed)
+               err = sign_wb_code(seg_address, dst_header->length_insecure,
+                                  use_zero_key);
+
+fail:
+       if (err)
+               printf("Warning: warmboot code copy failed (error=%d)\n", err);
+
+       return err;
+}
diff --git a/arch/arm/cpu/armv7/tegra2/warmboot_avp.c b/arch/arm/cpu/armv7/tegra2/warmboot_avp.c
new file mode 100644 (file)
index 0000000..70bcd8e
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * (C) Copyright 2010 - 2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/ap20.h>
+#include <asm/arch/clk_rst.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/flow.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/pmc.h>
+#include <asm/arch/tegra2.h>
+#include <asm/arch/warmboot.h>
+#include "warmboot_avp.h"
+
+#define DEBUG_RESET_CORESIGHT
+
+void wb_start(void)
+{
+       struct pmux_tri_ctlr *pmt = (struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
+       struct pmc_ctlr *pmc = (struct pmc_ctlr *)TEGRA2_PMC_BASE;
+       struct flow_ctlr *flow = (struct flow_ctlr *)NV_PA_FLOW_BASE;
+       struct clk_rst_ctlr *clkrst =
+                       (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
+       union osc_ctrl_reg osc_ctrl;
+       union pllx_base_reg pllx_base;
+       union pllx_misc_reg pllx_misc;
+       union scratch3_reg scratch3;
+       u32 reg;
+
+       /* enable JTAG & TBE */
+       writel(CONFIG_CTL_TBE | CONFIG_CTL_JTAG, &pmt->pmt_cfg_ctl);
+
+       /* Are we running where we're supposed to be? */
+       asm volatile (
+               "adr    %0, wb_start;"  /* reg: wb_start address */
+               : "=r"(reg)             /* output */
+                                       /* no input, no clobber list */
+       );
+
+       if (reg != AP20_WB_RUN_ADDRESS)
+               goto do_reset;
+
+       /* Are we running with AVP? */
+       if (readl(NV_PA_PG_UP_BASE + PG_UP_TAG_0) != PG_UP_TAG_AVP)
+               goto do_reset;
+
+#ifdef DEBUG_RESET_CORESIGHT
+       /* Assert CoreSight reset */
+       reg = readl(&clkrst->crc_rst_dev[TEGRA_DEV_U]);
+       reg |= SWR_CSITE_RST;
+       writel(reg, &clkrst->crc_rst_dev[TEGRA_DEV_U]);
+#endif
+
+       /* TODO: Set the drive strength - maybe make this a board parameter? */
+       osc_ctrl.word = readl(&clkrst->crc_osc_ctrl);
+       osc_ctrl.xofs = 4;
+       osc_ctrl.xoe = 1;
+       writel(osc_ctrl.word, &clkrst->crc_osc_ctrl);
+
+       /* Power up the CPU complex if necessary */
+       if (!(readl(&pmc->pmc_pwrgate_status) & PWRGATE_STATUS_CPU)) {
+               reg = PWRGATE_TOGGLE_PARTID_CPU | PWRGATE_TOGGLE_START;
+               writel(reg, &pmc->pmc_pwrgate_toggle);
+               while (!(readl(&pmc->pmc_pwrgate_status) & PWRGATE_STATUS_CPU))
+                       ;
+       }
+
+       /* Remove the I/O clamps from the CPU power partition. */
+       reg = readl(&pmc->pmc_remove_clamping);
+       reg |= CPU_CLMP;
+       writel(reg, &pmc->pmc_remove_clamping);
+
+       reg = EVENT_ZERO_VAL_20 | EVENT_MSEC | EVENT_MODE_STOP;
+       writel(reg, &flow->halt_cop_events);
+
+       /* Assert CPU complex reset */
+       reg = readl(&clkrst->crc_rst_dev[TEGRA_DEV_L]);
+       reg |= CPU_RST;
+       writel(reg, &clkrst->crc_rst_dev[TEGRA_DEV_L]);
+
+       /* Hold both CPUs in reset */
+       reg = CPU_CMPLX_CPURESET0 | CPU_CMPLX_CPURESET1 | CPU_CMPLX_DERESET0 |
+             CPU_CMPLX_DERESET1 | CPU_CMPLX_DBGRESET0 | CPU_CMPLX_DBGRESET1;
+       writel(reg, &clkrst->crc_cpu_cmplx_set);
+
+       /* Halt CPU1 at the flow controller for uni-processor configurations */
+       writel(EVENT_MODE_STOP, &flow->halt_cpu1_events);
+
+       /*
+        * Set the CPU reset vector. SCRATCH41 contains the physical
+        * address of the CPU-side restoration code.
+        */
+       reg = readl(&pmc->pmc_scratch41);
+       writel(reg, EXCEP_VECTOR_CPU_RESET_VECTOR);
+
+       /* Select CPU complex clock source */
+       writel(CCLK_PLLP_BURST_POLICY, &clkrst->crc_cclk_brst_pol);
+
+       /* Start the CPU0 clock and stop the CPU1 clock */
+       reg = CPU_CMPLX_CPU_BRIDGE_CLKDIV_4 | CPU_CMPLX_CPU0_CLK_STP_RUN |
+             CPU_CMPLX_CPU1_CLK_STP_STOP;
+       writel(reg, &clkrst->crc_clk_cpu_cmplx);
+
+       /* Enable the CPU complex clock */
+       reg = readl(&clkrst->crc_clk_out_enb[TEGRA_DEV_L]);
+       reg |= CLK_ENB_CPU;
+       writel(reg, &clkrst->crc_clk_out_enb[TEGRA_DEV_L]);
+
+       /* Make sure the resets were held for at least 2 microseconds */
+       reg = readl(TIMER_USEC_CNTR);
+       while (readl(TIMER_USEC_CNTR) <= (reg + 2))
+               ;
+
+#ifdef DEBUG_RESET_CORESIGHT
+       /*
+        * De-assert CoreSight reset.
+        * NOTE: We're leaving the CoreSight clock on the oscillator for
+        *      now. It will be restored to its original clock source
+        *      when the CPU-side restoration code runs.
+        */
+       reg = readl(&clkrst->crc_rst_dev[TEGRA_DEV_U]);
+       reg &= ~SWR_CSITE_RST;
+       writel(reg, &clkrst->crc_rst_dev[TEGRA_DEV_U]);
+#endif
+
+       /* Unlock the CPU CoreSight interfaces */
+       reg = 0xC5ACCE55;
+       writel(reg, CSITE_CPU_DBG0_LAR);
+       writel(reg, CSITE_CPU_DBG1_LAR);
+
+       /*
+        * Sample the microsecond timestamp again. This is the time we must
+        * use when returning from LP0 for PLL stabilization delays.
+        */
+       reg = readl(TIMER_USEC_CNTR);
+       writel(reg, &pmc->pmc_scratch1);
+
+       pllx_base.word = 0;
+       pllx_misc.word = 0;
+       scratch3.word = readl(&pmc->pmc_scratch3);
+
+       /* Get the OSC. For 19.2 MHz, use 19 to make the calculations easier */
+       reg = (readl(TIMER_USEC_CFG) & USEC_CFG_DIVISOR_MASK) + 1;
+
+       /*
+        * According to the TRM, for 19.2MHz OSC, the USEC_DIVISOR is 0x5f, and
+        * USEC_DIVIDEND is 0x04. So, if USEC_DIVISOR > 26, OSC is 19.2 MHz.
+        *
+        * reg is used to calculate the pllx freq, which is used to determine if
+        * to set dccon or not.
+        */
+       if (reg > 26)
+               reg = 19;
+
+       /* PLLX_BASE.PLLX_DIVM */
+       if (scratch3.pllx_base_divm == reg)
+               reg = 0;
+       else
+               reg = 1;
+
+       /* PLLX_BASE.PLLX_DIVN */
+       pllx_base.divn = scratch3.pllx_base_divn;
+       reg = scratch3.pllx_base_divn << reg;
+
+       /* PLLX_BASE.PLLX_DIVP */
+       pllx_base.divp = scratch3.pllx_base_divp;
+       reg = reg >> scratch3.pllx_base_divp;
+
+       pllx_base.bypass = 1;
+
+       /* PLLX_MISC_DCCON must be set for pllx frequency > 600 MHz. */
+       if (reg > 600)
+               pllx_misc.dccon = 1;
+
+       /* PLLX_MISC_LFCON */
+       pllx_misc.lfcon = scratch3.pllx_misc_lfcon;
+
+       /* PLLX_MISC_CPCON */
+       pllx_misc.cpcon = scratch3.pllx_misc_cpcon;
+
+       writel(pllx_misc.word, &clkrst->crc_pll_simple[SIMPLE_PLLX].pll_misc);
+       writel(pllx_base.word, &clkrst->crc_pll_simple[SIMPLE_PLLX].pll_base);
+
+       pllx_base.enable = 1;
+       writel(pllx_base.word, &clkrst->crc_pll_simple[SIMPLE_PLLX].pll_base);
+       pllx_base.bypass = 0;
+       writel(pllx_base.word, &clkrst->crc_pll_simple[SIMPLE_PLLX].pll_base);
+
+       writel(0, flow->halt_cpu_events);
+
+       reg = CPU_CMPLX_CPURESET0 | CPU_CMPLX_DBGRESET0 | CPU_CMPLX_DERESET0;
+       writel(reg, &clkrst->crc_cpu_cmplx_clr);
+
+       reg = PLLM_OUT1_RSTN_RESET_DISABLE | PLLM_OUT1_CLKEN_ENABLE |
+             PLLM_OUT1_RATIO_VAL_8;
+       writel(reg, &clkrst->crc_pll[CLOCK_ID_MEMORY].pll_out);
+
+       reg = SCLK_SWAKE_FIQ_SRC_PLLM_OUT1 | SCLK_SWAKE_IRQ_SRC_PLLM_OUT1 |
+             SCLK_SWAKE_RUN_SRC_PLLM_OUT1 | SCLK_SWAKE_IDLE_SRC_PLLM_OUT1 |
+             SCLK_SYS_STATE_IDLE;
+       writel(reg, &clkrst->crc_sclk_brst_pol);
+
+       /* avp_resume: no return after the write */
+       reg = readl(&clkrst->crc_rst_dev[TEGRA_DEV_L]);
+       reg &= ~CPU_RST;
+       writel(reg, &clkrst->crc_rst_dev[TEGRA_DEV_L]);
+
+       /* avp_halt: */
+avp_halt:
+       reg = EVENT_MODE_STOP | EVENT_JTAG;
+       writel(reg, flow->halt_cop_events);
+       goto avp_halt;
+
+do_reset:
+       /*
+        * Execution comes here if something goes wrong. The chip is reset and
+        * a cold boot is performed.
+        */
+       writel(SWR_TRIG_SYS_RST, &clkrst->crc_rst_dev[TEGRA_DEV_L]);
+       goto do_reset;
+}
+
+/*
+ * wb_end() is a dummy function, and must be directly following wb_start(),
+ * and is used to calculate the size of wb_start().
+ */
+void wb_end(void)
+{
+}
diff --git a/arch/arm/cpu/armv7/tegra2/warmboot_avp.h b/arch/arm/cpu/armv7/tegra2/warmboot_avp.h
new file mode 100644 (file)
index 0000000..4b71c07
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2010, 2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _WARMBOOT_AVP_H_
+#define _WARMBOOT_AVP_H_
+
+#define TEGRA_DEV_L                    0
+#define TEGRA_DEV_H                    1
+#define TEGRA_DEV_U                    2
+
+#define SIMPLE_PLLX                    (CLOCK_ID_XCPU - CLOCK_ID_FIRST_SIMPLE)
+#define SIMPLE_PLLE                    (CLOCK_ID_EPCI - CLOCK_ID_FIRST_SIMPLE)
+
+#define TIMER_USEC_CNTR                        (NV_PA_TMRUS_BASE + 0)
+#define TIMER_USEC_CFG                 (NV_PA_TMRUS_BASE + 4)
+
+#define USEC_CFG_DIVISOR_MASK          0xffff
+
+#define CONFIG_CTL_TBE                 (1 << 7)
+#define CONFIG_CTL_JTAG                        (1 << 6)
+
+#define CPU_RST                                (1 << 0)
+#define CLK_ENB_CPU                    (1 << 0)
+#define SWR_TRIG_SYS_RST               (1 << 2)
+#define SWR_CSITE_RST                  (1 << 9)
+
+#define PWRGATE_STATUS_CPU             (1 << 0)
+#define PWRGATE_TOGGLE_PARTID_CPU      (0 << 0)
+#define PWRGATE_TOGGLE_START           (1 << 8)
+
+#define CPU_CMPLX_CPU_BRIDGE_CLKDIV_4  (3 << 0)
+#define CPU_CMPLX_CPU0_CLK_STP_STOP    (1 << 8)
+#define CPU_CMPLX_CPU0_CLK_STP_RUN     (0 << 8)
+#define CPU_CMPLX_CPU1_CLK_STP_STOP    (1 << 9)
+#define CPU_CMPLX_CPU1_CLK_STP_RUN     (0 << 9)
+
+#define CPU_CMPLX_CPURESET0            (1 << 0)
+#define CPU_CMPLX_CPURESET1            (1 << 1)
+#define CPU_CMPLX_DERESET0             (1 << 4)
+#define CPU_CMPLX_DERESET1             (1 << 5)
+#define CPU_CMPLX_DBGRESET0            (1 << 12)
+#define CPU_CMPLX_DBGRESET1            (1 << 13)
+
+#define PLLM_OUT1_RSTN_RESET_DISABLE   (1 << 0)
+#define PLLM_OUT1_CLKEN_ENABLE         (1 << 1)
+#define PLLM_OUT1_RATIO_VAL_8          (8 << 8)
+
+#define SCLK_SYS_STATE_IDLE            (1 << 28)
+#define SCLK_SWAKE_FIQ_SRC_PLLM_OUT1   (7 << 12)
+#define SCLK_SWAKE_IRQ_SRC_PLLM_OUT1   (7 << 8)
+#define SCLK_SWAKE_RUN_SRC_PLLM_OUT1   (7 << 4)
+#define SCLK_SWAKE_IDLE_SRC_PLLM_OUT1  (7 << 0)
+
+#define EVENT_ZERO_VAL_20              (20 << 0)
+#define EVENT_MSEC                     (1 << 24)
+#define EVENT_JTAG                     (1 << 28)
+#define EVENT_MODE_STOP                        (2 << 29)
+
+#define CCLK_PLLP_BURST_POLICY         0x20004444
+
+#endif
index cffdfd1381f9a9fda6c27b827bc2a1b12174248f..289cfb07794aec52b1a5e91414fe9f2d9f40032a 100644 (file)
  */
 
 #include <config.h>
+#include <linux/linkage.h>
 
-.globl lowlevel_init
-lowlevel_init:
+ENTRY(lowlevel_init)
        mov     pc, lr
+ENDPROC(lowlevel_init)
 
        .align  5
-.globl reset_cpu
-reset_cpu:
+ENTRY(reset_cpu)
        ldr r0, =CFG_PRCMU_BASE
        ldr r1, =0x1
        str r1, [r0, #0x228]
 _loop_forever:
        b       _loop_forever
+ENDPROC(reset_cpu)
index d5ca02c5f522c4dc62b3ebc41bff6ee1f1d43cb1..f95be58135041b2238cbe5357806d9c0ed95dd87 100644 (file)
                clocks = <&tegra_car 59>;       /* PERIPH_ID_USB3 */
        };
 
+       emc@7000f400 {
+               #address-cells = < 1 >;
+               #size-cells = < 0 >;
+               compatible = "nvidia,tegra20-emc";
+               reg = <0x7000f400 0x200>;
+       };
+
+       kbc@7000e200 {
+               compatible = "nvidia,tegra20-kbc";
+               reg = <0x7000e200 0x0078>;
+       };
 };
index 943526b94a497a33edf207b57ad5fcea87ed6265..26cc300e70fc170746b766b91d4e6ff81954f9bf 100644 (file)
@@ -159,6 +159,6 @@ typedef struct hsmmc {
 #define mmc_reg_out(addr, mask, val)\
        writel((readl(addr) & (~(mask))) | ((val) & (mask)), (addr))
 
-int omap_mmc_init(int dev_index);
+int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max);
 
 #endif /* MMC_HOST_DEF_H */
index ff0f6415d8b4082d9b0d5b8f9de3cd92fcdffe80..637fb4bd145384fd8cfdedb04577b54dfba242fa 100644 (file)
@@ -33,5 +33,8 @@ unsigned long get_arm_clk(void);
 unsigned long get_pwm_clk(void);
 unsigned long get_uart_clk(int dev_index);
 void set_mmc_clk(int dev_index, unsigned int div);
+unsigned long get_lcd_clk(void);
+void set_lcd_clk(void);
+void set_mipi_clk(void);
 
 #endif
index 89f2c2e3e904380b508b44e25d6fa7744a008b12..ac4ddc7354f644016a67e1428824774a84e33ad3 100644 (file)
@@ -29,6 +29,7 @@
 /* EXYNOS4 */
 #define EXYNOS4_GPIO_PART3_BASE                0x03860000
 #define EXYNOS4_PRO_ID                 0x10000000
+#define EXYNOS4_SYSREG_BASE            0x10010000
 #define EXYNOS4_POWER_BASE             0x10020000
 #define EXYNOS4_SWRESET                        0x10020400
 #define EXYNOS4_CLOCK_BASE             0x10030000
@@ -40,6 +41,7 @@
 #define EXYNOS4_GPIO_PART2_BASE                0x11000000
 #define EXYNOS4_GPIO_PART1_BASE                0x11400000
 #define EXYNOS4_FIMD_BASE              0x11C00000
+#define EXYNOS4_MIPI_DSIM_BASE         0x11C80000
 #define EXYNOS4_USBOTG_BASE            0x12480000
 #define EXYNOS4_MMC_BASE               0x12510000
 #define EXYNOS4_SROMC_BASE             0x12570000
@@ -65,6 +67,7 @@
 #define EXYNOS5_GPIO_PART3_BASE                0x10D10000
 #define EXYNOS5_DMC_CTRL_BASE          0x10DD0000
 #define EXYNOS5_GPIO_PART1_BASE                0x11400000
+#define EXYNOS5_MIPI_DSIM_BASE         0x11D00000
 #define EXYNOS5_MMC_BASE               0x12200000
 #define EXYNOS5_SROMC_BASE             0x12250000
 #define EXYNOS5_USBOTG_BASE            0x12480000
@@ -127,7 +130,9 @@ static inline unsigned int samsung_get_base_##device(void)  \
 
 SAMSUNG_BASE(adc, ADC_BASE)
 SAMSUNG_BASE(clock, CLOCK_BASE)
+SAMSUNG_BASE(sysreg, SYSREG_BASE)
 SAMSUNG_BASE(fimd, FIMD_BASE)
+SAMSUNG_BASE(mipi_dsim, MIPI_DSIM_BASE)
 SAMSUNG_BASE(gpio_part1, GPIO_PART1_BASE)
 SAMSUNG_BASE(gpio_part2, GPIO_PART2_BASE)
 SAMSUNG_BASE(gpio_part3, GPIO_PART3_BASE)
diff --git a/arch/arm/include/asm/arch-exynos/dsim.h b/arch/arm/include/asm/arch-exynos/dsim.h
new file mode 100644 (file)
index 0000000..e148aca
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#ifndef __ASM_ARM_ARCH_DSIM_H_
+#define __ASM_ARM_ARCH_DSIM_H_
+
+#ifndef __ASSEMBLY__
+
+struct exynos_mipi_dsim {
+       unsigned int    status;
+       unsigned int    swrst;
+       unsigned int    clkctrl;
+       unsigned int    timeout;
+       unsigned int    config;
+       unsigned int    escmode;
+       unsigned int    mdresol;
+       unsigned int    mvporch;
+       unsigned int    mhporch;
+       unsigned int    msync;
+       unsigned int    sdresol;
+       unsigned int    intsrc;
+       unsigned int    intmsk;
+       unsigned int    pkthdr;
+       unsigned int    payload;
+       unsigned int    rxfifo;
+       unsigned int    fifothld;
+       unsigned int    fifoctrl;
+       unsigned int    memacchr;
+       unsigned int    pllctrl;
+       unsigned int    plltmr;
+       unsigned int    phyacchr;
+       unsigned int    phyacchr1;
+};
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * Bit Definitions
+ */
+/* DSIM_STATUS */
+#define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
+#define DSIM_STOP_STATE_CLK    (1 << 8)
+#define DSIM_TX_READY_HS_CLK   (1 << 10)
+#define DSIM_PLL_STABLE                (1 << 31)
+
+/* DSIM_SWRST */
+#define DSIM_FUNCRST           (1 << 16)
+#define DSIM_SWRST             (1 << 0)
+
+/* EXYNOS_DSIM_TIMEOUT */
+#define DSIM_LPDR_TOUT_SHIFT   (0)
+#define DSIM_BTA_TOUT_SHIFT    (16)
+
+/* EXYNOS_DSIM_CLKCTRL */
+#define DSIM_LANE_ESC_CLKEN_SHIFT      (19)
+#define DSIM_BYTE_CLKEN_SHIFT          (24)
+#define DSIM_BYTE_CLK_SRC_SHIFT                (25)
+#define DSIM_PLL_BYPASS_SHIFT          (27)
+#define DSIM_ESC_CLKEN_SHIFT           (28)
+#define DSIM_TX_REQUEST_HSCLK_SHIFT    (31)
+#define DSIM_LANE_ESC_CLKEN(x)         (((x) & 0x1f) << \
+                                               DSIM_LANE_ESC_CLKEN_SHIFT)
+#define DSIM_BYTE_CLK_ENABLE           (1 << DSIM_BYTE_CLKEN_SHIFT)
+#define DSIM_BYTE_CLK_DISABLE          (0 << DSIM_BYTE_CLKEN_SHIFT)
+#define DSIM_PLL_BYPASS_EXTERNAL       (1 << DSIM_PLL_BYPASS_SHIFT)
+#define DSIM_ESC_CLKEN_ENABLE          (1 << DSIM_ESC_CLKEN_SHIFT)
+#define DSIM_ESC_CLKEN_DISABLE         (0 << DSIM_ESC_CLKEN_SHIFT)
+
+/* EXYNOS_DSIM_CONFIG */
+#define DSIM_NUM_OF_DATALANE_SHIFT     (5)
+#define DSIM_SUBPIX_SHIFT              (8)
+#define DSIM_MAINPIX_SHIFT             (12)
+#define DSIM_SUBVC_SHIFT               (16)
+#define DSIM_MAINVC_SHIFT              (18)
+#define DSIM_HSA_MODE_SHIFT            (20)
+#define DSIM_HBP_MODE_SHIFT            (21)
+#define DSIM_HFP_MODE_SHIFT            (22)
+#define DSIM_HSE_MODE_SHIFT            (23)
+#define DSIM_AUTO_MODE_SHIFT           (24)
+#define DSIM_VIDEO_MODE_SHIFT          (25)
+#define DSIM_BURST_MODE_SHIFT          (26)
+#define DSIM_EOT_PACKET_SHIFT          (28)
+#define DSIM_AUTO_FLUSH_SHIFT          (29)
+#define DSIM_LANE_ENx(x)               (((x) & 0x1f) << 0)
+
+#define DSIM_NUM_OF_DATA_LANE(x)       ((x) << DSIM_NUM_OF_DATALANE_SHIFT)
+
+/* EXYNOS_DSIM_ESCMODE */
+#define DSIM_TX_LPDT_SHIFT             (6)
+#define DSIM_CMD_LPDT_SHIFT            (7)
+#define DSIM_TX_LPDT_LP                        (1 << DSIM_TX_LPDT_SHIFT)
+#define DSIM_CMD_LPDT_LP               (1 << DSIM_CMD_LPDT_SHIFT)
+#define DSIM_STOP_STATE_CNT_SHIFT      (21)
+#define DSIM_FORCE_STOP_STATE_SHIFT    (20)
+
+/* EXYNOS_DSIM_MDRESOL */
+#define DSIM_MAIN_STAND_BY             (1 << 31)
+#define DSIM_MAIN_VRESOL(x)            (((x) & 0x7ff) << 16)
+#define DSIM_MAIN_HRESOL(x)            (((x) & 0X7ff) << 0)
+
+/* EXYNOS_DSIM_MVPORCH */
+#define DSIM_CMD_ALLOW_SHIFT           (28)
+#define DSIM_STABLE_VFP_SHIFT          (16)
+#define DSIM_MAIN_VBP_SHIFT            (0)
+#define DSIM_CMD_ALLOW_MASK            (0xf << DSIM_CMD_ALLOW_SHIFT)
+#define DSIM_STABLE_VFP_MASK           (0x7ff << DSIM_STABLE_VFP_SHIFT)
+#define DSIM_MAIN_VBP_MASK             (0x7ff << DSIM_MAIN_VBP_SHIFT)
+
+/* EXYNOS_DSIM_MHPORCH */
+#define DSIM_MAIN_HFP_SHIFT            (16)
+#define DSIM_MAIN_HBP_SHIFT            (0)
+#define DSIM_MAIN_HFP_MASK             ((0xffff) << DSIM_MAIN_HFP_SHIFT)
+#define DSIM_MAIN_HBP_MASK             ((0xffff) << DSIM_MAIN_HBP_SHIFT)
+
+/* EXYNOS_DSIM_MSYNC */
+#define DSIM_MAIN_VSA_SHIFT            (22)
+#define DSIM_MAIN_HSA_SHIFT            (0)
+#define DSIM_MAIN_VSA_MASK             ((0x3ff) << DSIM_MAIN_VSA_SHIFT)
+#define DSIM_MAIN_HSA_MASK             ((0xffff) << DSIM_MAIN_HSA_SHIFT)
+
+/* EXYNOS_DSIM_SDRESOL */
+#define DSIM_SUB_STANDY_SHIFT          (31)
+#define DSIM_SUB_VRESOL_SHIFT          (16)
+#define DSIM_SUB_HRESOL_SHIFT          (0)
+#define DSIM_SUB_STANDY_MASK           ((0x1) << DSIM_SUB_STANDY_SHIFT)
+#define DSIM_SUB_VRESOL_MASK           ((0x7ff) << DSIM_SUB_VRESOL_SHIFT)
+#define DSIM_SUB_HRESOL_MASK           ((0x7ff) << DSIM_SUB_HRESOL_SHIFT)
+
+/* EXYNOS_DSIM_INTSRC */
+#define INTSRC_FRAME_DONE              (1 << 24)
+#define INTSRC_PLL_STABLE              (1 << 31)
+#define INTSRC_SWRST_RELEASE           (1 << 30)
+
+/* EXYNOS_DSIM_INTMSK */
+#define INTMSK_FRAME_DONE              (1 << 24)
+
+/* EXYNOS_DSIM_FIFOCTRL */
+#define SFR_HEADER_EMPTY               (1 << 22)
+
+/* EXYNOS_DSIM_PKTHDR */
+#define DSIM_PKTHDR_DI(x)              (((x) & 0x3f) << 0)
+#define DSIM_PKTHDR_DAT0(x)            ((x) << 8)
+#define DSIM_PKTHDR_DAT1(x)            ((x) << 16)
+
+/* EXYNOS_DSIM_PHYACCHR */
+#define DSIM_AFC_CTL(x)                        (((x) & 0x7) << 5)
+#define DSIM_AFC_CTL_SHIFT             (5)
+#define DSIM_AFC_EN                    (1 << 14)
+
+/* EXYNOS_DSIM_PHYACCHR1 */
+#define DSIM_DPDN_SWAP_DATA_SHIFT      (0)
+
+/* EXYNOS_DSIM_PLLCTRL */
+#define DSIM_SCALER_SHIFT              (1)
+#define DSIM_MAIN_SHIFT                        (4)
+#define DSIM_PREDIV_SHIFT              (13)
+#define DSIM_PRECTRL_SHIFT             (20)
+#define DSIM_PLL_EN_SHIFT              (23)
+#define DSIM_FREQ_BAND_SHIFT           (24)
+#define DSIM_ZEROCTRL_SHIFT            (28)
+
+#endif
diff --git a/arch/arm/include/asm/arch-exynos/fb.h b/arch/arm/include/asm/arch-exynos/fb.h
new file mode 100644 (file)
index 0000000..b10b0da
--- /dev/null
@@ -0,0 +1,446 @@
+/*
+ * (C) Copyright 2012 Samsung Electronics
+ * Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ * aint with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+#ifndef __ASM_ARM_ARCH_FB_H_
+#define __ASM_ARM_ARCH_FB_H_
+
+#ifndef __ASSEMBLY__
+struct exynos4_fb {
+       unsigned int vidcon0;
+       unsigned int vidcon1;
+       unsigned int vidcon2;
+       unsigned int vidcon3;
+       unsigned int vidtcon0;
+       unsigned int vidtcon1;
+       unsigned int vidtcon2;
+       unsigned int vidtcon3;
+       unsigned int wincon0;
+       unsigned int wincon1;
+       unsigned int wincon2;
+       unsigned int wincon3;
+       unsigned int wincon4;
+
+       unsigned int winshmap;
+       unsigned int res1;
+
+       unsigned int winchmap2;
+       unsigned int vidosd0a;
+       unsigned int vidosd0b;
+       unsigned int vidosd0c;
+       unsigned int res2;
+
+       unsigned int vidosd1a;
+       unsigned int vidosd1b;
+       unsigned int vidosd1c;
+       unsigned int vidosd1d;
+
+       unsigned int vidosd2a;
+       unsigned int vidosd2b;
+       unsigned int vidosd2c;
+       unsigned int vidosd2d;
+
+       unsigned int vidosd3a;
+       unsigned int vidosd3b;
+       unsigned int vidosd3c;
+       unsigned int res3;
+
+       unsigned int vidosd4a;
+       unsigned int vidosd4b;
+       unsigned int vidosd4c;
+       unsigned int res4[5];
+
+       unsigned int vidw00add0b0;
+       unsigned int vidw00add0b1;
+       unsigned int vidw01add0b0;
+       unsigned int vidw01add0b1;
+
+       unsigned int vidw02add0b0;
+       unsigned int vidw02add0b1;
+       unsigned int vidw03add0b0;
+       unsigned int vidw03add0b1;
+       unsigned int vidw04add0b0;
+       unsigned int vidw04add0b1;
+       unsigned int res5[2];
+
+       unsigned int vidw00add1b0;
+       unsigned int vidw00add1b1;
+       unsigned int vidw01add1b0;
+       unsigned int vidw01add1b1;
+
+       unsigned int vidw02add1b0;
+       unsigned int vidw02add1b1;
+       unsigned int vidw03add1b0;
+       unsigned int vidw03add1b1;
+
+       unsigned int vidw04add1b0;
+       unsigned int vidw04add1b1;
+       unsigned int res7[2];
+
+       unsigned int vidw00add2;
+       unsigned int vidw01add2;
+       unsigned int vidw02add2;
+       unsigned int vidw03add2;
+       unsigned int vidw04add2;
+       unsigned int res8[7];
+
+       unsigned int vidintcon0;
+       unsigned int vidintcon1;
+       unsigned int res9[1];
+
+       unsigned int w1keycon0;
+       unsigned int w1keycon1;
+       unsigned int w2keycon0;
+       unsigned int w2keycon1;
+       unsigned int w3keycon0;
+       unsigned int w3keycon1;
+       unsigned int w4keycon0;
+       unsigned int w4keycon1;
+
+       unsigned int w1keyalpha;
+       unsigned int w2keyalpha;
+       unsigned int w3keyalpha;
+       unsigned int w4keyalpha;
+
+       unsigned int dithmode;
+       unsigned int res10[2];
+
+       unsigned int win0map;
+       unsigned int win1map;
+       unsigned int win2map;
+       unsigned int win3map;
+       unsigned int win4map;
+       unsigned int res11[1];
+
+       unsigned int wpalcon_h;
+       unsigned int wpalcon_l;
+
+       unsigned int trigcon;
+       unsigned int res12[2];
+
+       unsigned int i80ifcona0;
+       unsigned int i80ifcona1;
+       unsigned int i80ifconb0;
+       unsigned int i80ifconb1;
+
+       unsigned int colorgaincon;
+       unsigned int res13[2];
+
+       unsigned int ldi_cmdcon0;
+       unsigned int ldi_cmdcon1;
+       unsigned int res14[1];
+
+       /* To be updated */
+
+       unsigned char res15[156];
+       unsigned int dualrgb;
+};
+#endif
+
+/*
+ *  Register offsets
+*/
+#define EXYNOS_WINCON(x)                               (x * 0x04)
+#define EXYNOS_VIDOSD(x)                               (x * 0x10)
+#define EXYNOS_BUFFER_OFFSET(x)                                (x * 0x08)
+#define EXYNOS_BUFFER_SIZE(x)                          (x * 0x04)
+
+/*
+ * Bit Definitions
+*/
+
+/* VIDCON0 */
+#define EXYNOS_VIDCON0_DSI_DISABLE                     (0 << 30)
+#define EXYNOS_VIDCON0_DSI_ENABLE                      (1 << 30)
+#define EXYNOS_VIDCON0_SCAN_PROGRESSIVE                        (0 << 29)
+#define EXYNOS_VIDCON0_SCAN_INTERLACE                  (1 << 29)
+#define EXYNOS_VIDCON0_SCAN_MASK                       (1 << 29)
+#define EXYNOS_VIDCON0_VIDOUT_RGB                      (0 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_ITU                      (1 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_I80LDI0                  (2 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_I80LDI1                  (3 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_WB_RGB                   (4 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_WB_I80LDI0               (6 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_WB_I80LDI1               (7 << 26)
+#define EXYNOS_VIDCON0_VIDOUT_MASK                     (7 << 26)
+#define EXYNOS_VIDCON0_PNRMODE_RGB_P                   (0 << 17)
+#define EXYNOS_VIDCON0_PNRMODE_BGR_P                   (1 << 17)
+#define EXYNOS_VIDCON0_PNRMODE_RGB_S                   (2 << 17)
+#define EXYNOS_VIDCON0_PNRMODE_BGR_S                   (3 << 17)
+#define EXYNOS_VIDCON0_PNRMODE_MASK                    (3 << 17)
+#define EXYNOS_VIDCON0_PNRMODE_SHIFT                   (17)
+#define EXYNOS_VIDCON0_CLKVALUP_ALWAYS                 (0 << 16)
+#define EXYNOS_VIDCON0_CLKVALUP_START_FRAME            (1 << 16)
+#define EXYNOS_VIDCON0_CLKVALUP_MASK                   (1 << 16)
+#define EXYNOS_VIDCON0_CLKVAL_F(x)                     (((x) & 0xff) << 6)
+#define EXYNOS_VIDCON0_VCLKEN_NORMAL                   (0 << 5)
+#define EXYNOS_VIDCON0_VCLKEN_FREERUN                  (1 << 5)
+#define EXYNOS_VIDCON0_VCLKEN_MASK                     (1 << 5)
+#define EXYNOS_VIDCON0_CLKDIR_DIRECTED                 (0 << 4)
+#define EXYNOS_VIDCON0_CLKDIR_DIVIDED                  (1 << 4)
+#define EXYNOS_VIDCON0_CLKDIR_MASK                     (1 << 4)
+#define EXYNOS_VIDCON0_CLKSEL_HCLK                     (0 << 2)
+#define EXYNOS_VIDCON0_CLKSEL_SCLK                     (1 << 2)
+#define EXYNOS_VIDCON0_CLKSEL_MASK                     (1 << 2)
+#define EXYNOS_VIDCON0_ENVID_ENABLE                    (1 << 1)
+#define EXYNOS_VIDCON0_ENVID_DISABLE                   (0 << 1)
+#define EXYNOS_VIDCON0_ENVID_F_ENABLE                  (1 << 0)
+#define EXYNOS_VIDCON0_ENVID_F_DISABLE                 (0 << 0)
+
+/* VIDCON1 */
+#define EXYNOS_VIDCON1_IVCLK_FALLING_EDGE              (0 << 7)
+#define EXYNOS_VIDCON1_IVCLK_RISING_EDGE               (1 << 7)
+#define EXYNOS_VIDCON1_IHSYNC_NORMAL                   (0 << 6)
+#define EXYNOS_VIDCON1_IHSYNC_INVERT                   (1 << 6)
+#define EXYNOS_VIDCON1_IVSYNC_NORMAL                   (0 << 5)
+#define EXYNOS_VIDCON1_IVSYNC_INVERT                   (1 << 5)
+#define EXYNOS_VIDCON1_IVDEN_NORMAL                    (0 << 4)
+#define EXYNOS_VIDCON1_IVDEN_INVERT                    (1 << 4)
+
+/* VIDCON2 */
+#define EXYNOS_VIDCON2_EN601_DISABLE                   (0 << 23)
+#define EXYNOS_VIDCON2_EN601_ENABLE                    (1 << 23)
+#define EXYNOS_VIDCON2_EN601_MASK                      (1 << 23)
+#define EXYNOS_VIDCON2_WB_DISABLE                      (0 << 15)
+#define EXYNOS_VIDCON2_WB_ENABLE                       (1 << 15)
+#define EXYNOS_VIDCON2_WB_MASK                         (1 << 15)
+#define EXYNOS_VIDCON2_TVFORMATSEL_HW                  (0 << 14)
+#define EXYNOS_VIDCON2_TVFORMATSEL_SW                  (1 << 14)
+#define EXYNOS_VIDCON2_TVFORMATSEL_MASK                        (1 << 14)
+#define EXYNOS_VIDCON2_TVFORMATSEL_YUV422              (1 << 12)
+#define EXYNOS_VIDCON2_TVFORMATSEL_YUV444              (2 << 12)
+#define EXYNOS_VIDCON2_TVFORMATSEL_YUV_MASK            (3 << 12)
+#define EXYNOS_VIDCON2_ORGYUV_YCBCR                    (0 << 8)
+#define EXYNOS_VIDCON2_ORGYUV_CBCRY                    (1 << 8)
+#define EXYNOS_VIDCON2_ORGYUV_MASK                     (1 << 8)
+#define EXYNOS_VIDCON2_YUVORD_CBCR                     (0 << 7)
+#define EXYNOS_VIDCON2_YUVORD_CRCB                     (1 << 7)
+#define EXYNOS_VIDCON2_YUVORD_MASK                     (1 << 7)
+
+/* PRTCON */
+#define EXYNOS_PRTCON_UPDATABLE                                (0 << 11)
+#define EXYNOS_PRTCON_PROTECT                          (1 << 11)
+
+/* VIDTCON0 */
+#define EXYNOS_VIDTCON0_VBPDE(x)                       (((x) & 0xff) << 24)
+#define EXYNOS_VIDTCON0_VBPD(x)                                (((x) & 0xff) << 16)
+#define EXYNOS_VIDTCON0_VFPD(x)                                (((x) & 0xff) << 8)
+#define EXYNOS_VIDTCON0_VSPW(x)                                (((x) & 0xff) << 0)
+
+/* VIDTCON1 */
+#define EXYNOS_VIDTCON1_VFPDE(x)                       (((x) & 0xff) << 24)
+#define EXYNOS_VIDTCON1_HBPD(x)                                (((x) & 0xff) << 16)
+#define EXYNOS_VIDTCON1_HFPD(x)                                (((x) & 0xff) << 8)
+#define EXYNOS_VIDTCON1_HSPW(x)                                (((x) & 0xff) << 0)
+
+/* VIDTCON2 */
+#define EXYNOS_VIDTCON2_LINEVAL(x)                     (((x) & 0x7ff) << 11)
+#define EXYNOS_VIDTCON2_HOZVAL(x)                      (((x) & 0x7ff) << 0)
+
+/* Window 0~4 Control - WINCONx */
+#define EXYNOS_WINCON_DATAPATH_DMA                     (0 << 22)
+#define EXYNOS_WINCON_DATAPATH_LOCAL                   (1 << 22)
+#define EXYNOS_WINCON_DATAPATH_MASK                    (1 << 22)
+#define EXYNOS_WINCON_BUFSEL_0                         (0 << 20)
+#define EXYNOS_WINCON_BUFSEL_1                         (1 << 20)
+#define EXYNOS_WINCON_BUFSEL_MASK                      (1 << 20)
+#define EXYNOS_WINCON_BUFSEL_SHIFT                     (20)
+#define EXYNOS_WINCON_BUFAUTO_DISABLE                  (0 << 19)
+#define EXYNOS_WINCON_BUFAUTO_ENABLE                   (1 << 19)
+#define EXYNOS_WINCON_BUFAUTO_MASK                     (1 << 19)
+#define EXYNOS_WINCON_BITSWP_DISABLE                   (0 << 18)
+#define EXYNOS_WINCON_BITSWP_ENABLE                    (1 << 18)
+#define EXYNOS_WINCON_BITSWP_SHIFT                     (18)
+#define EXYNOS_WINCON_BYTESWP_DISABLE                  (0 << 17)
+#define EXYNOS_WINCON_BYTESWP_ENABLE                   (1 << 17)
+#define EXYNOS_WINCON_BYTESWP_SHIFT                    (17)
+#define EXYNOS_WINCON_HAWSWP_DISABLE                   (0 << 16)
+#define EXYNOS_WINCON_HAWSWP_ENABLE                    (1 << 16)
+#define EXYNOS_WINCON_HAWSWP_SHIFT                     (16)
+#define EXYNOS_WINCON_WSWP_DISABLE                     (0 << 15)
+#define EXYNOS_WINCON_WSWP_ENABLE                      (1 << 15)
+#define EXYNOS_WINCON_WSWP_SHIFT                       (15)
+#define EXYNOS_WINCON_INRGB_RGB                                (0 << 13)
+#define EXYNOS_WINCON_INRGB_YUV                                (1 << 13)
+#define EXYNOS_WINCON_INRGB_MASK                       (1 << 13)
+#define EXYNOS_WINCON_BURSTLEN_16WORD                  (0 << 9)
+#define EXYNOS_WINCON_BURSTLEN_8WORD                   (1 << 9)
+#define EXYNOS_WINCON_BURSTLEN_4WORD                   (2 << 9)
+#define EXYNOS_WINCON_BURSTLEN_MASK                    (3 << 9)
+#define EXYNOS_WINCON_ALPHA_MULTI_DISABLE              (0 << 7)
+#define EXYNOS_WINCON_ALPHA_MULTI_ENABLE               (1 << 7)
+#define EXYNOS_WINCON_BLD_PLANE                                (0 << 6)
+#define EXYNOS_WINCON_BLD_PIXEL                                (1 << 6)
+#define EXYNOS_WINCON_BLD_MASK                         (1 << 6)
+#define EXYNOS_WINCON_BPPMODE_1BPP                     (0 << 2)
+#define EXYNOS_WINCON_BPPMODE_2BPP                     (1 << 2)
+#define EXYNOS_WINCON_BPPMODE_4BPP                     (2 << 2)
+#define EXYNOS_WINCON_BPPMODE_8BPP_PAL                 (3 << 2)
+#define EXYNOS_WINCON_BPPMODE_8BPP                     (4 << 2)
+#define EXYNOS_WINCON_BPPMODE_16BPP_565                        (5 << 2)
+#define EXYNOS_WINCON_BPPMODE_16BPP_A555               (6 << 2)
+#define EXYNOS_WINCON_BPPMODE_18BPP_666                        (8 << 2)
+#define EXYNOS_WINCON_BPPMODE_18BPP_A665               (9 << 2)
+#define EXYNOS_WINCON_BPPMODE_24BPP_888                        (0xb << 2)
+#define EXYNOS_WINCON_BPPMODE_24BPP_A887               (0xc << 2)
+#define EXYNOS_WINCON_BPPMODE_32BPP                    (0xd << 2)
+#define EXYNOS_WINCON_BPPMODE_16BPP_A444               (0xe << 2)
+#define EXYNOS_WINCON_BPPMODE_15BPP_555                        (0xf << 2)
+#define EXYNOS_WINCON_BPPMODE_MASK                     (0xf << 2)
+#define EXYNOS_WINCON_BPPMODE_SHIFT                    (2)
+#define EXYNOS_WINCON_ALPHA0_SEL                       (0 << 1)
+#define EXYNOS_WINCON_ALPHA1_SEL                       (1 << 1)
+#define EXYNOS_WINCON_ALPHA_SEL_MASK                   (1 << 1)
+#define EXYNOS_WINCON_ENWIN_DISABLE                    (0 << 0)
+#define EXYNOS_WINCON_ENWIN_ENABLE                     (1 << 0)
+
+/* WINCON1 special */
+#define EXYNOS_WINCON1_VP_DISABLE                      (0 << 24)
+#define EXYNOS_WINCON1_VP_ENABLE                       (1 << 24)
+#define EXYNOS_WINCON1_LOCALSEL_FIMC1                  (0 << 23)
+#define EXYNOS_WINCON1_LOCALSEL_VP                     (1 << 23)
+#define EXYNOS_WINCON1_LOCALSEL_MASK                   (1 << 23)
+
+/* WINSHMAP */
+#define EXYNOS_WINSHMAP_PROTECT(x)                     (((x) & 0x1f) << 10)
+#define EXYNOS_WINSHMAP_CH_ENABLE(x)                   (1 << (x))
+#define EXYNOS_WINSHMAP_CH_DISABLE(x)                  (1 << (x))
+#define EXYNOS_WINSHMAP_LOCAL_ENABLE(x)                        (0x20 << (x))
+#define EXYNOS_WINSHMAP_LOCAL_DISABLE(x)               (0x20 << (x))
+
+/* VIDOSDxA, VIDOSDxB */
+#define EXYNOS_VIDOSD_LEFT_X(x)                                (((x) & 0x7ff) << 11)
+#define EXYNOS_VIDOSD_TOP_Y(x)                         (((x) & 0x7ff) << 0)
+#define EXYNOS_VIDOSD_RIGHT_X(x)                       (((x) & 0x7ff) << 11)
+#define EXYNOS_VIDOSD_BOTTOM_Y(x)                      (((x) & 0x7ff) << 0)
+
+/* VIDOSD0C, VIDOSDxD */
+#define EXYNOS_VIDOSD_SIZE(x)                          (((x) & 0xffffff) << 0)
+
+/* VIDOSDxC (1~4) */
+#define EXYNOS_VIDOSD_ALPHA0_R(x)                      (((x) & 0xf) << 20)
+#define EXYNOS_VIDOSD_ALPHA0_G(x)                      (((x) & 0xf) << 16)
+#define EXYNOS_VIDOSD_ALPHA0_B(x)                      (((x) & 0xf) << 12)
+#define EXYNOS_VIDOSD_ALPHA1_R(x)                      (((x) & 0xf) << 8)
+#define EXYNOS_VIDOSD_ALPHA1_G(x)                      (((x) & 0xf) << 4)
+#define EXYNOS_VIDOSD_ALPHA1_B(x)                      (((x) & 0xf) << 0)
+#define EXYNOS_VIDOSD_ALPHA0_SHIFT                     (12)
+#define EXYNOS_VIDOSD_ALPHA1_SHIFT                     (0)
+
+/* Start Address */
+#define EXYNOS_VIDADDR_START_VBANK(x)                  (((x) & 0xff) << 24)
+#define EXYNOS_VIDADDR_START_VBASEU(x)                 (((x) & 0xffffff) << 0)
+
+/* End Address */
+#define EXYNOS_VIDADDR_END_VBASEL(x)                   (((x) & 0xffffff) << 0)
+
+/* Buffer Size */
+#define EXYNOS_VIDADDR_OFFSIZE(x)                      (((x) & 0x1fff) << 13)
+#define EXYNOS_VIDADDR_PAGEWIDTH(x)                    (((x) & 0x1fff) << 0)
+
+/* WIN Color Map */
+#define EXYNOS_WINMAP_COLOR(x)                         ((x) & 0xffffff)
+
+/* VIDINTCON0 */
+#define EXYNOS_VIDINTCON0_SYSMAINCON_DISABLE           (0 << 19)
+#define EXYNOS_VIDINTCON0_SYSMAINCON_ENABLE            (1 << 19)
+#define EXYNOS_VIDINTCON0_SYSSUBCON_DISABLE            (0 << 18)
+#define EXYNOS_VIDINTCON0_SYSSUBCON_ENABLE             (1 << 18)
+#define EXYNOS_VIDINTCON0_SYSIFDONE_DISABLE            (0 << 17)
+#define EXYNOS_VIDINTCON0_SYSIFDONE_ENABLE             (1 << 17)
+#define EXYNOS_VIDINTCON0_FRAMESEL0_BACK               (0 << 15)
+#define EXYNOS_VIDINTCON0_FRAMESEL0_VSYNC              (1 << 15)
+#define EXYNOS_VIDINTCON0_FRAMESEL0_ACTIVE             (2 << 15)
+#define EXYNOS_VIDINTCON0_FRAMESEL0_FRONT              (3 << 15)
+#define EXYNOS_VIDINTCON0_FRAMESEL0_MASK               (3 << 15)
+#define EXYNOS_VIDINTCON0_FRAMESEL1_NONE               (0 << 13)
+#define EXYNOS_VIDINTCON0_FRAMESEL1_BACK               (1 << 13)
+#define EXYNOS_VIDINTCON0_FRAMESEL1_VSYNC              (2 << 13)
+#define EXYNOS_VIDINTCON0_FRAMESEL1_FRONT              (3 << 13)
+#define EXYNOS_VIDINTCON0_INTFRMEN_DISABLE             (0 << 12)
+#define EXYNOS_VIDINTCON0_INTFRMEN_ENABLE              (1 << 12)
+#define EXYNOS_VIDINTCON0_FIFOSEL_WIN4                 (1 << 11)
+#define EXYNOS_VIDINTCON0_FIFOSEL_WIN3                 (1 << 10)
+#define EXYNOS_VIDINTCON0_FIFOSEL_WIN2                 (1 << 9)
+#define EXYNOS_VIDINTCON0_FIFOSEL_WIN1                 (1 << 6)
+#define EXYNOS_VIDINTCON0_FIFOSEL_WIN0                 (1 << 5)
+#define EXYNOS_VIDINTCON0_FIFOSEL_ALL                  (0x73 << 5)
+#define EXYNOS_VIDINTCON0_FIFOSEL_MASK                 (0x73 << 5)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_25                 (0 << 2)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_50                 (1 << 2)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_75                 (2 << 2)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_EMPTY              (3 << 2)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_FULL               (4 << 2)
+#define EXYNOS_VIDINTCON0_FIFOLEVEL_MASK               (7 << 2)
+#define EXYNOS_VIDINTCON0_INTFIFO_DISABLE              (0 << 1)
+#define EXYNOS_VIDINTCON0_INTFIFO_ENABLE               (1 << 1)
+#define EXYNOS_VIDINTCON0_INT_DISABLE                  (0 << 0)
+#define EXYNOS_VIDINTCON0_INT_ENABLE                   (1 << 0)
+#define EXYNOS_VIDINTCON0_INT_MASK                     (1 << 0)
+
+/* VIDINTCON1 */
+#define EXYNOS_VIDINTCON1_INTVPPEND                    (1 << 5)
+#define EXYNOS_VIDINTCON1_INTI80PEND                   (1 << 2)
+#define EXYNOS_VIDINTCON1_INTFRMPEND                   (1 << 1)
+#define EXYNOS_VIDINTCON1_INTFIFOPEND                  (1 << 0)
+
+/* WINMAP */
+#define EXYNOS_WINMAP_ENABLE                           (1 << 24)
+
+/* WxKEYCON0 (1~4) */
+#define EXYNOS_KEYCON0_KEYBLEN_DISABLE                 (0 << 26)
+#define EXYNOS_KEYCON0_KEYBLEN_ENABLE                  (1 << 26)
+#define EXYNOS_KEYCON0_KEY_DISABLE                     (0 << 25)
+#define EXYNOS_KEYCON0_KEY_ENABLE                      (1 << 25)
+#define EXYNOS_KEYCON0_DIRCON_MATCH_FG                 (0 << 24)
+#define EXYNOS_KEYCON0_DIRCON_MATCH_BG                 (1 << 24)
+#define EXYNOS_KEYCON0_COMPKEY(x)                      (((x) & 0xffffff) << 0)
+
+/* WxKEYCON1 (1~4) */
+#define EXYNOS_KEYCON1_COLVAL(x)                       (((x) & 0xffffff) << 0)
+
+/* DUALRGB */
+#define EXYNOS_DUALRGB_BYPASS_SINGLE                   (0x00 << 0)
+#define EXYNOS_DUALRGB_BYPASS_DUAL                     (0x01 << 0)
+#define EXYNOS_DUALRGB_MIE_DUAL                                (0x10 << 0)
+#define EXYNOS_DUALRGB_MIE_SINGLE                      (0x11 << 0)
+#define EXYNOS_DUALRGB_LINESPLIT                       (0x0 << 2)
+#define EXYNOS_DUALRGB_FRAMESPLIT                      (0x1 << 2)
+#define EXYNOS_DUALRGB_SUB_CNT(x)                      ((x & 0xfff) << 4)
+#define EXYNOS_DUALRGB_VDEN_EN_DISABLE                 (0x0 << 16)
+#define EXYNOS_DUALRGB_VDEN_EN_ENABLE                  (0x1 << 16)
+#define EXYNOS_DUALRGB_MAIN_CNT(x)                     ((x & 0xfff) << 18)
+
+/* I80IFCONA0 and I80IFCONA1 */
+#define EXYNOS_LCD_CS_SETUP(x)                         (((x) & 0xf) << 16)
+#define EXYNOS_LCD_WR_SETUP(x)                         (((x) & 0xf) << 12)
+#define EXYNOS_LCD_WR_ACT(x)                           (((x) & 0xf) << 8)
+#define EXYNOS_LCD_WR_HOLD(x)                          (((x) & 0xf) << 4)
+#define EXYNOS_RSPOL_LOW                               (0 << 2)
+#define EXYNOS_RSPOL_HIGH                              (1 << 2)
+#define EXYNOS_I80IFEN_DISABLE                         (0 << 0)
+#define EXYNOS_I80IFEN_ENABLE                          (1 << 0)
+
+/* TRIGCON */
+#define EXYNOS_I80SOFT_TRIG_EN                         (1 << 0)
+#define EXYNOS_I80START_TRIG                           (1 << 1)
+#define EXYNOS_I80STATUS_TRIG_DONE                     (1 << 2)
+
+#endif /* _REGS_FB_H */
diff --git a/arch/arm/include/asm/arch-exynos/mipi_dsim.h b/arch/arm/include/asm/arch-exynos/mipi_dsim.h
new file mode 100644 (file)
index 0000000..ef6a3d1
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#ifndef _DSIM_H
+#define _DSIM_H
+
+#include <linux/list.h>
+#include <linux/fb.h>
+
+#define PANEL_NAME_SIZE                (32)
+
+enum mipi_dsim_interface_type {
+       DSIM_COMMAND,
+       DSIM_VIDEO
+};
+
+enum mipi_dsim_virtual_ch_no {
+       DSIM_VIRTUAL_CH_0,
+       DSIM_VIRTUAL_CH_1,
+       DSIM_VIRTUAL_CH_2,
+       DSIM_VIRTUAL_CH_3
+};
+
+enum mipi_dsim_burst_mode_type {
+       DSIM_NON_BURST_SYNC_EVENT,
+       DSIM_BURST_SYNC_EVENT,
+       DSIM_NON_BURST_SYNC_PULSE,
+       DSIM_BURST,
+       DSIM_NON_VIDEO_MODE
+};
+
+enum mipi_dsim_no_of_data_lane {
+       DSIM_DATA_LANE_1,
+       DSIM_DATA_LANE_2,
+       DSIM_DATA_LANE_3,
+       DSIM_DATA_LANE_4
+};
+
+enum mipi_dsim_byte_clk_src {
+       DSIM_PLL_OUT_DIV8,
+       DSIM_EXT_CLK_DIV8,
+       DSIM_EXT_CLK_BYPASS
+};
+
+enum mipi_dsim_pixel_format {
+       DSIM_CMD_3BPP,
+       DSIM_CMD_8BPP,
+       DSIM_CMD_12BPP,
+       DSIM_CMD_16BPP,
+       DSIM_VID_16BPP_565,
+       DSIM_VID_18BPP_666PACKED,
+       DSIM_18BPP_666LOOSELYPACKED,
+       DSIM_24BPP_888
+};
+
+/* MIPI DSI Processor-to-Peripheral transaction types */
+enum {
+       MIPI_DSI_V_SYNC_START                           = 0x01,
+       MIPI_DSI_V_SYNC_END                             = 0x11,
+       MIPI_DSI_H_SYNC_START                           = 0x21,
+       MIPI_DSI_H_SYNC_END                             = 0x31,
+
+       MIPI_DSI_COLOR_MODE_OFF                         = 0x02,
+       MIPI_DSI_COLOR_MODE_ON                          = 0x12,
+       MIPI_DSI_SHUTDOWN_PERIPHERAL                    = 0x22,
+       MIPI_DSI_TURN_ON_PERIPHERAL                     = 0x32,
+
+       MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM            = 0x03,
+       MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM            = 0x13,
+       MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM            = 0x23,
+
+       MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM           = 0x04,
+       MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM           = 0x14,
+       MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM           = 0x24,
+
+       MIPI_DSI_DCS_SHORT_WRITE                        = 0x05,
+       MIPI_DSI_DCS_SHORT_WRITE_PARAM                  = 0x15,
+
+       MIPI_DSI_DCS_READ                               = 0x06,
+
+       MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE         = 0x37,
+
+       MIPI_DSI_END_OF_TRANSMISSION                    = 0x08,
+
+       MIPI_DSI_NULL_PACKET                            = 0x09,
+       MIPI_DSI_BLANKING_PACKET                        = 0x19,
+       MIPI_DSI_GENERIC_LONG_WRITE                     = 0x29,
+       MIPI_DSI_DCS_LONG_WRITE                         = 0x39,
+
+       MIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20    = 0x0c,
+       MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24            = 0x1c,
+       MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16            = 0x2c,
+
+       MIPI_DSI_PACKED_PIXEL_STREAM_30                 = 0x0d,
+       MIPI_DSI_PACKED_PIXEL_STREAM_36                 = 0x1d,
+       MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12            = 0x3d,
+
+       MIPI_DSI_PACKED_PIXEL_STREAM_16                 = 0x0e,
+       MIPI_DSI_PACKED_PIXEL_STREAM_18                 = 0x1e,
+       MIPI_DSI_PIXEL_STREAM_3BYTE_18                  = 0x2e,
+       MIPI_DSI_PACKED_PIXEL_STREAM_24                 = 0x3e,
+};
+
+/*
+ * struct mipi_dsim_config - interface for configuring mipi-dsi controller.
+ *
+ * @auto_flush: enable or disable Auto flush of MD FIFO using VSYNC pulse.
+ * @eot_disable: enable or disable EoT packet in HS mode.
+ * @auto_vertical_cnt: specifies auto vertical count mode.
+ *     in Video mode, the vertical line transition uses line counter
+ *     configured by VSA, VBP, and Vertical resolution.
+ *     If this bit is set to '1', the line counter does not use VSA and VBP
+ *     registers.(in command mode, this variable is ignored)
+ * @hse: set horizontal sync event mode.
+ *     In VSYNC pulse and Vporch area, MIPI DSI master transfers only HSYNC
+ *     start packet to MIPI DSI slave at MIPI DSI spec1.1r02.
+ *     this bit transfers HSYNC end packet in VSYNC pulse and Vporch area
+ *     (in mommand mode, this variable is ignored)
+ * @hfp: specifies HFP disable mode.
+ *     if this variable is set, DSI master ignores HFP area in VIDEO mode.
+ *     (in command mode, this variable is ignored)
+ * @hbp: specifies HBP disable mode.
+ *     if this variable is set, DSI master ignores HBP area in VIDEO mode.
+ *     (in command mode, this variable is ignored)
+ * @hsa: specifies HSA disable mode.
+ *     if this variable is set, DSI master ignores HSA area in VIDEO mode.
+ *     (in command mode, this variable is ignored)
+ * @e_interface: specifies interface to be used.(CPU or RGB interface)
+ * @e_virtual_ch: specifies virtual channel number that main or
+ *     sub diaplsy uses.
+ * @e_pixel_format: specifies pixel stream format for main or sub display.
+ * @e_burst_mode: selects Burst mode in Video mode.
+ *     in Non-burst mode, RGB data area is filled with RGB data and NULL
+ *     packets, according to input bandwidth of RGB interface.
+ *     In Burst mode, RGB data area is filled with RGB data only.
+ * @e_no_data_lane: specifies data lane count to be used by Master.
+ * @e_byte_clk: select byte clock source. (it must be DSIM_PLL_OUT_DIV8)
+ *     DSIM_EXT_CLK_DIV8 and DSIM_EXT_CLK_BYPASSS are not supported.
+ * @pll_stable_time: specifies the PLL Timer for stability of the ganerated
+ *     clock(System clock cycle base)
+ *     if the timer value goes to 0x00000000, the clock stable bit of status
+ *     and interrupt register is set.
+ * @esc_clk: specifies escape clock frequency for getting the escape clock
+ *     prescaler value.
+ * @stop_holding_cnt: specifies the interval value between transmitting
+ *     read packet(or write "set_tear_on" command) and BTA request.
+ *     after transmitting read packet or write "set_tear_on" command,
+ *     BTA requests to D-PHY automatically. this counter value specifies
+ *     the interval between them.
+ * @bta_timeout: specifies the timer for BTA.
+ *     this register specifies time out from BTA request to change
+ *     the direction with respect to Tx escape clock.
+ * @rx_timeout: specifies the timer for LP Rx mode timeout.
+ *     this register specifies time out on how long RxValid deasserts,
+ *     after RxLpdt asserts with respect to Tx escape clock.
+ *     - RxValid specifies Rx data valid indicator.
+ *     - RxLpdt specifies an indicator that D-PHY is under RxLpdt mode.
+ *     - RxValid and RxLpdt specifies signal from D-PHY.
+ */
+struct mipi_dsim_config {
+       unsigned char                   auto_flush;
+       unsigned char                   eot_disable;
+
+       unsigned char                   auto_vertical_cnt;
+       unsigned char                   hse;
+       unsigned char                   hfp;
+       unsigned char                   hbp;
+       unsigned char                   hsa;
+
+       enum mipi_dsim_interface_type   e_interface;
+       enum mipi_dsim_virtual_ch_no    e_virtual_ch;
+       enum mipi_dsim_pixel_format     e_pixel_format;
+       enum mipi_dsim_burst_mode_type  e_burst_mode;
+       enum mipi_dsim_no_of_data_lane  e_no_data_lane;
+       enum mipi_dsim_byte_clk_src     e_byte_clk;
+
+       /*
+        * ===========================================
+        * |    P    |    M    |    S    |    MHz    |
+        * -------------------------------------------
+        * |    3    |   100   |    3    |    100    |
+        * |    3    |   100   |    2    |    200    |
+        * |    3    |    63   |    1    |    252    |
+        * |    4    |   100   |    1    |    300    |
+        * |    4    |   110   |    1    |    330    |
+        * |   12    |   350   |    1    |    350    |
+        * |    3    |   100   |    1    |    400    |
+        * |    4    |   150   |    1    |    450    |
+        * |    6    |   118   |    1    |    472    |
+        * |    3    |   120   |    1    |    480    |
+        * |   12    |   250   |    0    |    500    |
+        * |    4    |   100   |    0    |    600    |
+        * |    3    |    81   |    0    |    648    |
+        * |    3    |    88   |    0    |    704    |
+        * |    3    |    90   |    0    |    720    |
+        * |    3    |   100   |    0    |    800    |
+        * |   12    |   425   |    0    |    850    |
+        * |    4    |   150   |    0    |    900    |
+        * |   12    |   475   |    0    |    950    |
+        * |    6    |   250   |    0    |   1000    |
+        * -------------------------------------------
+        */
+
+       /*
+        * pms could be calculated as the following.
+        * M * 24 / P * 2 ^ S = MHz
+        */
+       unsigned char                   p;
+       unsigned short                  m;
+       unsigned char                   s;
+
+       unsigned int                    pll_stable_time;
+       unsigned long                   esc_clk;
+
+       unsigned short                  stop_holding_cnt;
+       unsigned char                   bta_timeout;
+       unsigned short                  rx_timeout;
+};
+
+/*
+ * struct mipi_dsim_device - global interface for mipi-dsi driver.
+ *
+ * @dsim_config: infomation for configuring mipi-dsi controller.
+ * @master_ops: callbacks to mipi-dsi operations.
+ * @dsim_lcd_dev: pointer to activated ddi device.
+ *     (it would be registered by mipi-dsi driver.)
+ * @dsim_lcd_drv: pointer to activated_ddi driver.
+ *     (it would be registered by mipi-dsi driver.)
+ * @state: specifies status of MIPI-DSI controller.
+ *     the status could be RESET, INIT, STOP, HSCLKEN and ULPS.
+ * @data_lane: specifiec enabled data lane number.
+ *     this variable would be set by driver according to e_no_data_lane
+ *     automatically.
+ * @e_clk_src: select byte clock source.
+ * @pd: pointer to MIPI-DSI driver platform data.
+ */
+struct mipi_dsim_device {
+       struct mipi_dsim_config         *dsim_config;
+       struct mipi_dsim_master_ops     *master_ops;
+       struct mipi_dsim_lcd_device     *dsim_lcd_dev;
+       struct mipi_dsim_lcd_driver     *dsim_lcd_drv;
+
+       unsigned int                    state;
+       unsigned int                    data_lane;
+       enum mipi_dsim_byte_clk_src     e_clk_src;
+
+       struct exynos_platform_mipi_dsim        *pd;
+};
+
+/*
+ * struct exynos_platform_mipi_dsim - interface to platform data
+ *     for mipi-dsi driver.
+ *
+ * @lcd_panel_name: specifies lcd panel name registered to mipi-dsi driver.
+ *     lcd panel driver searched would be actived.
+ * @dsim_config: pointer of structure for configuring mipi-dsi controller.
+ * @lcd_panel_info: pointer for lcd panel specific structure.
+ *     this structure specifies width, height, timing and polarity and so on.
+ * @lcd_power: callback pointer for enabling or disabling lcd power.
+ * @mipi_power: callback pointer for enabling or disabling mipi power.
+ * @phy_enable: pointer to a callback controlling D-PHY enable/reset
+ */
+struct exynos_platform_mipi_dsim {
+       char                            lcd_panel_name[PANEL_NAME_SIZE];
+
+       struct mipi_dsim_config         *dsim_config;
+       void                            *lcd_panel_info;
+
+       int (*lcd_power)(void);
+       int (*mipi_power)(void);
+       void (*phy_enable)(unsigned int dev_index, unsigned int enable);
+};
+
+/*
+ * struct mipi_dsim_master_ops - callbacks to mipi-dsi operations.
+ *
+ * @cmd_write: transfer command to lcd panel at LP mode.
+ * @cmd_read: read command from rx register.
+ * @get_dsim_frame_done: get the status that all screen data have been
+ *     transferred to mipi-dsi.
+ * @clear_dsim_frame_done: clear frame done status.
+ * @get_fb_frame_done: get frame done status of display controller.
+ * @trigger: trigger display controller.
+ *     - this one would be used only in case of CPU mode.
+ */
+struct mipi_dsim_master_ops {
+       int (*cmd_write)(struct mipi_dsim_device *dsim, unsigned int data_id,
+               unsigned int data0, unsigned int data1);
+       int (*cmd_read)(struct mipi_dsim_device *dsim, unsigned int data_id,
+               unsigned int data0, unsigned int data1);
+       int (*get_dsim_frame_done)(struct mipi_dsim_device *dsim);
+       int (*clear_dsim_frame_done)(struct mipi_dsim_device *dsim);
+
+       int (*get_fb_frame_done)(void);
+       void (*trigger)(struct fb_info *info);
+};
+
+/*
+ * device structure for mipi-dsi based lcd panel.
+ *
+ * @name: name of the device to use with this device, or an
+ *     alias for that name.
+ * @id: id of device to be registered.
+ * @bus_id: bus id for identifing connected bus
+ *     and this bus id should be same as id of mipi_dsim_device.
+ * @master: pointer to mipi-dsi master device object.
+ * @platform_data: lcd panel specific platform data.
+ */
+struct mipi_dsim_lcd_device {
+       char                    *name;
+       int                     id;
+       int                     bus_id;
+
+       struct mipi_dsim_device *master;
+       void                    *platform_data;
+};
+
+/*
+ * driver structure for mipi-dsi based lcd panel.
+ *
+ * this structure should be registered by lcd panel driver.
+ * mipi-dsi driver seeks lcd panel registered through name field
+ * and calls these callback functions in appropriate time.
+ *
+ * @name: name of the driver to use with this device, or an
+ *     alias for that name.
+ * @id: id of driver to be registered.
+ *     this id would be used for finding device object registered.
+ * @mipi_panel_init: callback pointer for initializing lcd panel based on mipi
+ *     dsi interface.
+ * @mipi_display_on: callback pointer for lcd panel display on.
+ */
+struct mipi_dsim_lcd_driver {
+       char                    *name;
+       int                     id;
+
+       int     (*mipi_panel_init)(struct mipi_dsim_device *dsim_dev);
+       void    (*mipi_display_on)(struct mipi_dsim_device *dsim_dev);
+};
+
+int exynos_mipi_dsi_init(void);
+
+/*
+ * register mipi_dsim_lcd_driver object defined by lcd panel driver
+ * to mipi-dsi driver.
+ */
+int exynos_mipi_dsi_register_lcd_driver(struct mipi_dsim_lcd_driver
+                                               *lcd_drv);
+
+/*
+ * register mipi_dsim_lcd_device to mipi-dsi master.
+ */
+int exynos_mipi_dsi_register_lcd_device(struct mipi_dsim_lcd_device
+                                               *lcd_dev);
+
+void exynos_set_dsim_platform_data(struct exynos_platform_mipi_dsim *pd);
+
+/* panel driver init based on mipi dsi interface */
+void s6e8ax0_init(void);
+
+#endif /* _DSIM_H */
index 30f82b8aaf6370051e135e719ee661d63961babd..0f701c90120c7dbbbfd2ba3106bf6677697a5769 100644 (file)
 #ifndef __ASM_ARCH_MMC_H_
 #define __ASM_ARCH_MMC_H_
 
-#ifndef __ASSEMBLY__
-struct s5p_mmc {
-       unsigned int    sysad;
-       unsigned short  blksize;
-       unsigned short  blkcnt;
-       unsigned int    argument;
-       unsigned short  trnmod;
-       unsigned short  cmdreg;
-       unsigned int    rspreg0;
-       unsigned int    rspreg1;
-       unsigned int    rspreg2;
-       unsigned int    rspreg3;
-       unsigned int    bdata;
-       unsigned int    prnsts;
-       unsigned char   hostctl;
-       unsigned char   pwrcon;
-       unsigned char   blkgap;
-       unsigned char   wakcon;
-       unsigned short  clkcon;
-       unsigned char   timeoutcon;
-       unsigned char   swrst;
-       unsigned int    norintsts;      /* errintsts */
-       unsigned int    norintstsen;    /* errintstsen */
-       unsigned int    norintsigen;    /* errintsigen */
-       unsigned short  acmd12errsts;
-       unsigned char   res1[2];
-       unsigned int    capareg;
-       unsigned char   res2[4];
-       unsigned int    maxcurr;
-       unsigned char   res3[0x34];
-       unsigned int    control2;
-       unsigned int    control3;
-       unsigned char   res4[4];
-       unsigned int    control4;
-       unsigned char   res5[0x6e];
-       unsigned short  hcver;
-       unsigned char   res6[0xFF00];
-};
+#define SDHCI_CONTROL2         0x80
+#define SDHCI_CONTROL3         0x84
+#define SDHCI_CONTROL4         0x8C
 
-struct mmc_host {
-       struct s5p_mmc *reg;
-       unsigned int version;   /* SDHCI spec. version */
-       unsigned int clock;     /* Current clock (MHz) */
-       int dev_index;
-};
+#define SDHCI_CTRL2_ENSTAASYNCCLR      (1 << 31)
+#define SDHCI_CTRL2_ENCMDCNFMSK                (1 << 30)
+#define SDHCI_CTRL2_CDINVRXD3          (1 << 29)
+#define SDHCI_CTRL2_SLCARDOUT          (1 << 28)
 
-int s5p_mmc_init(int dev_index, int bus_width);
+#define SDHCI_CTRL2_FLTCLKSEL_MASK     (0xf << 24)
+#define SDHCI_CTRL2_FLTCLKSEL_SHIFT    (24)
+#define SDHCI_CTRL2_FLTCLKSEL(_x)      ((_x) << 24)
 
-#endif /* __ASSEMBLY__ */
+#define SDHCI_CTRL2_LVLDAT_MASK                (0xff << 16)
+#define SDHCI_CTRL2_LVLDAT_SHIFT       (16)
+#define SDHCI_CTRL2_LVLDAT(_x)         ((_x) << 16)
+
+#define SDHCI_CTRL2_ENFBCLKTX          (1 << 15)
+#define SDHCI_CTRL2_ENFBCLKRX          (1 << 14)
+#define SDHCI_CTRL2_SDCDSEL            (1 << 13)
+#define SDHCI_CTRL2_SDSIGPC            (1 << 12)
+#define SDHCI_CTRL2_ENBUSYCHKTXSTART   (1 << 11)
+
+#define SDHCI_CTRL2_DFCNT_MASK(_x)     ((_x) << 9)
+#define SDHCI_CTRL2_DFCNT_SHIFT                (9)
+
+#define SDHCI_CTRL2_ENCLKOUTHOLD       (1 << 8)
+#define SDHCI_CTRL2_RWAITMODE          (1 << 7)
+#define SDHCI_CTRL2_DISBUFRD           (1 << 6)
+#define SDHCI_CTRL2_SELBASECLK_MASK(_x)        ((_x) << 4)
+#define SDHCI_CTRL2_SELBASECLK_SHIFT   (4)
+#define SDHCI_CTRL2_PWRSYNC            (1 << 3)
+#define SDHCI_CTRL2_ENCLKOUTMSKCON     (1 << 1)
+#define SDHCI_CTRL2_HWINITFIN          (1 << 0)
+
+#define SDHCI_CTRL3_FCSEL3             (1 << 31)
+#define SDHCI_CTRL3_FCSEL2             (1 << 23)
+#define SDHCI_CTRL3_FCSEL1             (1 << 15)
+#define SDHCI_CTRL3_FCSEL0             (1 << 7)
+
+#define SDHCI_CTRL4_DRIVE_MASK(_x)     ((_x) << 16)
+#define SDHCI_CTRL4_DRIVE_SHIFT                (16)
+
+int s5p_sdhci_init(u32 regbase, u32 max_clk, u32 min_clk, u32 quirks);
+
+static inline unsigned int s5p_mmc_init(int index, int bus_width)
+{
+       unsigned int base = samsung_get_base_mmc() + (0x10000 * index);
+       return s5p_sdhci_init(base, 52000000, 400000, index);
+}
 #endif
index fb442f7f1fdbfcae97803116be89dd7f558c67e4..6444fd04ec12a46bec9cb6a6917e1be664f70285 100644 (file)
@@ -227,4 +227,10 @@ struct exynos4_power {
 };
 #endif /* __ASSEMBLY__ */
 
+void set_mipi_phy_ctrl(unsigned int dev_index, unsigned int enable);
+
+#define EXYNOS_MIPI_PHY_ENABLE         (1 << 0)
+#define EXYNOS_MIPI_PHY_SRESETN                (1 << 1)
+#define EXYNOS_MIPI_PHY_MRESETN                (1 << 2)
+
 #endif
diff --git a/arch/arm/include/asm/arch-exynos/system.h b/arch/arm/include/asm/arch-exynos/system.h
new file mode 100644 (file)
index 0000000..c85f949
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * (C) Copyright 2012 Samsung Electronics
+ * Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ *
+ */
+
+#ifndef __ASM_ARM_ARCH_SYSTEM_H_
+#define __ASM_ARM_ARCH_SYSTEM_H_
+
+#ifndef __ASSEMBLY__
+struct exynos4_sysreg {
+       unsigned char   res1[0x210];
+       unsigned int    display_ctrl;
+       unsigned int    display_ctrl2;
+       unsigned int    camera_control;
+       unsigned int    audio_endian;
+       unsigned int    jtag_con;
+};
+
+struct exynos5_sysreg {
+       unsigned char   res1[0x214];
+       unsigned int    disp1blk_cfg;
+       unsigned int    disp2blk_cfg;
+       unsigned int    hdcp_e_fuse;
+       unsigned int    gsclblk_cfg0;
+       unsigned int    gsclblk_cfg1;
+       unsigned int    reserved;
+       unsigned int    ispblk_cfg;
+       unsigned int    usb20phy_cfg;
+       unsigned int    mipi_dphy;
+       unsigned int    dptx_dphy;
+       unsigned int    phyclk_sel;
+};
+#endif
+
+void set_system_display_ctrl(void);
+
+#endif /* _EXYNOS4_SYSTEM_H */
index 2c9a07be45bba67fe317e1fac139bee057f2b629..c5eb4b1cc2bcda1e8c9b9e18a953b0db27aff411 100644 (file)
@@ -22,7 +22,7 @@
 #define __TZPC_H_
 
 #ifndef __ASSEMBLY__
-struct exynos5_tzpc {
+struct exynos_tzpc {
        unsigned int r0size;
        char res1[0x7FC];
        unsigned int decprot0stat;
diff --git a/arch/arm/include/asm/arch-lpc32xx/clk.h b/arch/arm/include/asm/arch-lpc32xx/clk.h
new file mode 100644 (file)
index 0000000..c1dad0a
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_CLK_H
+#define _LPC32XX_CLK_H
+
+#include <asm/types.h>
+
+#define OSC_CLK_FREQUENCY      13000000
+#define RTC_CLK_FREQUENCY      32768
+
+/* Clocking and Power Control Registers */
+struct clk_pm_regs {
+       u32 reserved0[5];
+       u32 boot_map;           /* Boot Map Control Register            */
+       u32 p0_intr_er;         /* Port 0/1 Start and Interrupt Enable  */
+       u32 usbdiv_ctrl;        /* USB Clock Pre-Divide Register        */
+       /* Internal Start Signal Sources Registers      */
+       u32 start_er_int;       /* Start Enable Register                */
+       u32 start_rsr_int;      /* Start Raw Status Register            */
+       u32 start_sr_int;       /* Start Status Register                */
+       u32 start_apr_int;      /* Start Activation Polarity Register   */
+       /* Device Pin Start Signal Sources Registers    */
+       u32 start_er_pin;       /* Start Enable Register                */
+       u32 start_rsr_pin;      /* Start Raw Status Register            */
+       u32 start_sr_pin;       /* Start Status Register                */
+       u32 start_apr_pin;      /* Start Activation Polarity Register   */
+       /* Clock Control Registers                      */
+       u32 hclkdiv_ctrl;       /* HCLK Divider Control Register        */
+       u32 pwr_ctrl;           /* Power Control Register               */
+       u32 pll397_ctrl;        /* PLL397 Control Register              */
+       u32 osc_ctrl;           /* Main Oscillator Control Register     */
+       u32 sysclk_ctrl;        /* SYSCLK Control Register              */
+       u32 lcdclk_ctrl;        /* LCD Clock Control Register           */
+       u32 hclkpll_ctrl;       /* HCLK PLL Control Register            */
+       u32 reserved1;
+       u32 adclk_ctrl1;        /* ADC Clock Control1 Register          */
+       u32 usb_ctrl;           /* USB Control Register                 */
+       u32 sdramclk_ctrl;      /* SDRAM Clock Control Register         */
+       u32 ddr_lap_nom;        /* DDR Calibration Nominal Value        */
+       u32 ddr_lap_count;      /* DDR Calibration Measured Value       */
+       u32 ddr_cal_delay;      /* DDR Calibration Delay Value          */
+       u32 ssp_ctrl;           /* SSP Control Register                 */
+       u32 i2s_ctrl;           /* I2S Clock Control Register           */
+       u32 ms_ctrl;            /* Memory Card Control Register         */
+       u32 reserved2[3];
+       u32 macclk_ctrl;        /* Ethernet MAC Clock Control Register  */
+       u32 reserved3[4];
+       u32 test_clk;           /* Test Clock Selection Register        */
+       u32 sw_int;             /* Software Interrupt Register          */
+       u32 i2cclk_ctrl;        /* I2C Clock Control Register           */
+       u32 keyclk_ctrl;        /* Keyboard Scan Clock Control Register */
+       u32 adclk_ctrl;         /* ADC Clock Control Register           */
+       u32 pwmclk_ctrl;        /* PWM Clock Control Register           */
+       u32 timclk_ctrl;        /* Watchdog and Highspeed Timer Control */
+       u32 timclk_ctrl1;       /* Motor and Timer Clock Control        */
+       u32 spi_ctrl;           /* SPI Control Register                 */
+       u32 flashclk_ctrl;      /* NAND Flash Clock Control Register    */
+       u32 reserved4;
+       u32 u3clk;              /* UART 3 Clock Control Register        */
+       u32 u4clk;              /* UART 4 Clock Control Register        */
+       u32 u5clk;              /* UART 5 Clock Control Register        */
+       u32 u6clk;              /* UART 6 Clock Control Register        */
+       u32 irdaclk;            /* IrDA Clock Control Register          */
+       u32 uartclk_ctrl;       /* UART Clock Control Register          */
+       u32 dmaclk_ctrl;        /* DMA Clock Control Register           */
+       u32 autoclk_ctrl;       /* Autoclock Control Register           */
+};
+
+/* HCLK Divider Control Register bits */
+#define CLK_HCLK_DDRAM_HALF            (0x2 << 7)
+#define CLK_HCLK_DDRAM_NOMINAL         (0x1 << 7)
+#define CLK_HCLK_DDRAM_STOPPED         (0x0 << 7)
+#define CLK_HCLK_PERIPH_DIV_MASK       (0x1F << 2)
+#define CLK_HCLK_PERIPH_DIV(n)         ((((n) - 1) & 0x1F) << 2)
+#define CLK_HCLK_ARM_PLL_DIV_MASK      (0x3 << 0)
+#define CLK_HCLK_ARM_PLL_DIV_4         (0x2 << 0)
+#define CLK_HCLK_ARM_PLL_DIV_2         (0x1 << 0)
+#define CLK_HCLK_ARM_PLL_DIV_1         (0x0 << 0)
+
+/* Power Control Register bits */
+#define CLK_PWR_HCLK_RUN_PERIPH                (1 << 10)
+#define CLK_PWR_EMC_SREFREQ            (1 << 9)
+#define CLK_PWR_EMC_SREFREQ_UPDATE     (1 << 8)
+#define CLK_PWR_SDRAM_SREFREQ          (1 << 7)
+#define CLK_PWR_HIGHCORE_LEVEL         (1 << 5)
+#define CLK_PWR_SYSCLKEN_LEVEL         (1 << 4)
+#define CLK_PWR_SYSCLKEN_CTRL          (1 << 3)
+#define CLK_PWR_NORMAL_RUN             (1 << 2)
+#define CLK_PWR_HIGHCORE_CTRL          (1 << 1)
+#define CLK_PWR_STOP_MODE              (1 << 0)
+
+/* SYSCLK Control Register bits */
+#define CLK_SYSCLK_PLL397              (1 << 1)
+#define CLK_SYSCLK_MUX                 (1 << 0)
+
+/* HCLK PLL Control Register bits */
+#define CLK_HCLK_PLL_OPERATING         (1 << 16)
+#define CLK_HCLK_PLL_BYPASS            (1 << 15)
+#define CLK_HCLK_PLL_DIRECT            (1 << 14)
+#define CLK_HCLK_PLL_FEEDBACK          (1 << 13)
+#define CLK_HCLK_PLL_POSTDIV_MASK      (0x3 << 11)
+#define CLK_HCLK_PLL_POSTDIV_16                (0x3 << 11)
+#define CLK_HCLK_PLL_POSTDIV_8         (0x2 << 11)
+#define CLK_HCLK_PLL_POSTDIV_4         (0x1 << 11)
+#define CLK_HCLK_PLL_POSTDIV_2         (0x0 << 11)
+#define CLK_HCLK_PLL_PREDIV_MASK       (0x3 << 9)
+#define CLK_HCLK_PLL_PREDIV_4          (0x3 << 9)
+#define CLK_HCLK_PLL_PREDIV_3          (0x2 << 9)
+#define CLK_HCLK_PLL_PREDIV_2          (0x1 << 9)
+#define CLK_HCLK_PLL_PREDIV_1          (0x0 << 9)
+#define CLK_HCLK_PLL_FEEDBACK_DIV_MASK (0xFF << 1)
+#define CLK_HCLK_PLL_FEEDBACK_DIV(n)   ((((n) - 1) & 0xFF) << 1)
+#define CLK_HCLK_PLL_LOCKED            (1 << 0)
+
+/* Ethernet MAC Clock Control Register bits    */
+#define CLK_MAC_RMII                   (0x3 << 3)
+#define CLK_MAC_MII                    (0x1 << 3)
+#define CLK_MAC_MASTER                 (1 << 2)
+#define CLK_MAC_SLAVE                  (1 << 1)
+#define CLK_MAC_REG                    (1 << 0)
+
+/* Timer Clock Control1 Register bits */
+#define CLK_TIMCLK_MOTOR               (1 << 6)
+#define CLK_TIMCLK_TIMER3              (1 << 5)
+#define CLK_TIMCLK_TIMER2              (1 << 4)
+#define CLK_TIMCLK_TIMER1              (1 << 3)
+#define CLK_TIMCLK_TIMER0              (1 << 2)
+#define CLK_TIMCLK_TIMER5              (1 << 1)
+#define CLK_TIMCLK_TIMER4              (1 << 0)
+
+/* Timer Clock Control Register bits */
+#define CLK_TIMCLK_HSTIMER             (1 << 1)
+#define CLK_TIMCLK_WATCHDOG            (1 << 0)
+
+/* UART Clock Control Register bits */
+#define CLK_UART(n)                    (1 << ((n) - 3))
+
+/* UARTn Clock Select Registers bits */
+#define CLK_UART_HCLK                  (1 << 16)
+#define CLK_UART_X_DIV(n)              (((n) & 0xFF) << 8)
+#define CLK_UART_Y_DIV(n)              (((n) & 0xFF) << 0)
+
+/* DMA Clock Control Register bits */
+#define CLK_DMA_ENABLE                 (1 << 0)
+
+unsigned int get_sys_clk_rate(void);
+unsigned int get_hclk_pll_rate(void);
+unsigned int get_hclk_clk_div(void);
+unsigned int get_hclk_clk_rate(void);
+unsigned int get_periph_clk_div(void);
+unsigned int get_periph_clk_rate(void);
+
+#endif /* _LPC32XX_CLK_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/config.h b/arch/arm/include/asm/arch-lpc32xx/config.h
new file mode 100644 (file)
index 0000000..41fcd32
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Common definitions for LPC32XX board configurations
+ *
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_CONFIG_H
+#define _LPC32XX_CONFIG_H
+
+/* Basic CPU architecture */
+#define CONFIG_ARM926EJS
+#define CONFIG_ARCH_CPU_INIT
+
+#define CONFIG_NR_DRAM_BANKS_MAX       2
+
+/* 1KHz clock tick */
+#define CONFIG_SYS_HZ                  1000
+
+/* UART configuration */
+#if (CONFIG_SYS_LPC32XX_UART >= 3) && (CONFIG_SYS_LPC32XX_UART <= 6)
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_CONS_INDEX              (CONFIG_SYS_LPC32XX_UART - 2)
+#elif  (CONFIG_SYS_LPC32XX_UART == 1) || (CONFIG_SYS_LPC32XX_UART == 2) || \
+       (CONFIG_SYS_LPC32XX_UART == 7)
+#define CONFIG_LPC32XX_HSUART
+#else
+#error "define CONFIG_SYS_LPC32XX_UART in the range from 1 to 7"
+#endif
+
+#if defined(CONFIG_SYS_NS16550_SERIAL)
+#define CONFIG_SYS_NS16550
+
+#define CONFIG_SYS_NS16550_REG_SIZE    -4
+#define CONFIG_SYS_NS16550_CLK         get_serial_clock()
+
+#define CONFIG_SYS_NS16550_COM1                UART3_BASE
+#define CONFIG_SYS_NS16550_COM2                UART4_BASE
+#define CONFIG_SYS_NS16550_COM3                UART5_BASE
+#define CONFIG_SYS_NS16550_COM4                UART6_BASE
+#endif
+
+#if defined(CONFIG_LPC32XX_HSUART)
+#if    CONFIG_SYS_LPC32XX_UART == 1
+#define HS_UART_BASE                   HS_UART1_BASE
+#elif  CONFIG_SYS_LPC32XX_UART == 2
+#define HS_UART_BASE                   HS_UART2_BASE
+#else  /* CONFIG_SYS_LPC32XX_UART == 7 */
+#define HS_UART_BASE                   HS_UART7_BASE
+#endif
+#endif
+
+#define CONFIG_SYS_BAUDRATE_TABLE      \
+               { 9600, 19200, 38400, 57600, 115200, 230400, 460800 }
+
+/* NOR Flash */
+#if defined(CONFIG_SYS_FLASH_CFI)
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_PROTECTION
+#endif
+
+#endif /* _LPC32XX_CONFIG_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/cpu.h b/arch/arm/include/asm/arch-lpc32xx/cpu.h
new file mode 100644 (file)
index 0000000..c5343c3
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_CPU_H
+#define _LPC32XX_CPU_H
+
+/* LPC32XX Memory map */
+
+/* AHB physical base addresses */
+#define SLC_NAND_BASE  0x20020000      /* SLC NAND Flash registers base    */
+#define SSP0_BASE      0x20084000      /* SSP0 registers base              */
+#define SD_CARD_BASE   0x20098000      /* SD card interface registers base */
+#define MLC_NAND_BASE  0x200A8000      /* MLC NAND Flash registers base    */
+#define DMA_BASE       0x31000000      /* DMA controller registers base    */
+#define USB_BASE       0x31020000      /* USB registers base               */
+#define LCD_BASE       0x31040000      /* LCD registers base               */
+#define ETHERNET_BASE  0x31060000      /* Ethernet registers base          */
+#define EMC_BASE       0x31080000      /* EMC configuration registers base */
+
+/* FAB peripherals base addresses */
+#define CLK_PM_BASE    0x40004000      /* System control registers base    */
+#define HS_UART1_BASE  0x40014000      /* High speed UART 1 registers base */
+#define HS_UART2_BASE  0x40018000      /* High speed UART 2 registers base */
+#define HS_UART7_BASE  0x4001C000      /* High speed UART 7 registers base */
+#define RTC_BASE       0x40024000      /* RTC registers base               */
+#define GPIO_BASE      0x40028000      /* GPIO registers base              */
+#define WDT_BASE       0x4003C000      /* Watchdog timer registers base    */
+#define TIMER0_BASE    0x40044000      /* Timer0 registers base            */
+#define TIMER1_BASE    0x4004C000      /* Timer1 registers base            */
+#define UART_CTRL_BASE 0x40054000      /* UART control regsisters base     */
+
+/* APB peripherals base addresses */
+#define UART3_BASE     0x40080000      /* UART 3 registers base            */
+#define UART4_BASE     0x40088000      /* UART 4 registers base            */
+#define UART5_BASE     0x40090000      /* UART 5 registers base            */
+#define UART6_BASE     0x40098000      /* UART 6 registers base            */
+
+/* External SDRAM Memory Bank base addresses */
+#define EMC_DYCS0_BASE 0x80000000      /* SDRAM DYCS0 base address         */
+#define EMC_DYCS1_BASE 0xA0000000      /* SDRAM DYCS1 base address         */
+
+/* External Static Memory Bank base addresses */
+#define EMC_CS0_BASE   0xE0000000
+#define EMC_CS1_BASE   0xE1000000
+#define EMC_CS2_BASE   0xE2000000
+#define EMC_CS3_BASE   0xE3000000
+
+#endif /* _LPC32XX_CPU_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/emc.h b/arch/arm/include/asm/arch-lpc32xx/emc.h
new file mode 100644 (file)
index 0000000..feb03bd
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_EMC_H
+#define _LPC32XX_EMC_H
+
+#include <asm/types.h>
+
+/* EMC Registers */
+struct emc_regs {
+       u32 ctrl;               /* Controls operation of the EMC             */
+       u32 status;             /* Provides EMC status information           */
+       u32 config;             /* Configures operation of the EMC           */
+       u32 reserved0[5];
+       u32 control;            /* Controls dyn memory operation             */
+       u32 refresh;            /* Configures dyn memory refresh operation   */
+       u32 read_config;        /* Configures the dyn memory read strategy   */
+       u32 reserved1;
+       u32 t_rp;               /* Precharge command period                  */
+       u32 t_ras;              /* Active to precharge command period        */
+       u32 t_srex;             /* Self-refresh exit time                    */
+       u32 reserved2[2];
+       u32 t_wr;               /* Write recovery time                       */
+       u32 t_rc;               /* Active to active command period           */
+       u32 t_rfc;              /* Auto-refresh period                       */
+       u32 t_xsr;              /* Exit self-refresh to active command time  */
+       u32 t_rrd;              /* Active bank A to active bank B latency    */
+       u32 t_mrd;              /* Load mode register to active command time */
+       u32 t_cdlr;             /* Last data in to read command time         */
+       u32 reserved3[8];
+       u32 extended_wait;      /* time for static memory rd/wr transfers    */
+       u32 reserved4[31];
+       u32 config0;            /* Configuration information for the SDRAM   */
+       u32 rascas0;            /* RAS and CAS latencies for the SDRAM       */
+       u32 reserved5[6];
+       u32 config1;            /* Configuration information for the SDRAM   */
+       u32 rascas1;            /* RAS and CAS latencies for the SDRAM       */
+       u32 reserved6[54];
+       struct emc_stat_t {
+               u32 config;     /* Static memory configuration               */
+               u32 waitwen;    /* Delay from chip select to write enable    */
+               u32 waitoen;    /* Delay to output enable                    */
+               u32 waitrd;     /* Delay to a read access                    */
+               u32 waitpage;   /* Delay for async page mode read            */
+               u32 waitwr;     /* Delay to a write access                   */
+               u32 waitturn;   /* Number of bus turnaround cycles           */
+               u32 reserved;
+       } stat[4];
+       u32 reserved7[96];
+       struct emc_ahb_t {
+               u32 control;    /* Control register for AHB                  */
+               u32 status;     /* Status register for AHB                   */
+               u32 timeout;    /* Timeout register for AHB                  */
+               u32 reserved[5];
+       } ahb[5];
+};
+
+/* Static Memory Configuration Register bits */
+#define EMC_STAT_CONFIG_WP             (1 << 20)
+#define EMC_STAT_CONFIG_EW             (1 << 8)
+#define EMC_STAT_CONFIG_PB             (1 << 7)
+#define EMC_STAT_CONFIG_PC             (1 << 6)
+#define EMC_STAT_CONFIG_PM             (1 << 3)
+#define EMC_STAT_CONFIG_32BIT          (2 << 0)
+#define EMC_STAT_CONFIG_16BIT          (1 << 0)
+#define EMC_STAT_CONFIG_8BIT           (0 << 0)
+
+/* Static Memory Delay Registers */
+#define EMC_STAT_WAITWEN(n)            (((n) - 1) & 0x0F)
+#define EMC_STAT_WAITOEN(n)            (((n) - 1) & 0x0F)
+#define EMC_STAT_WAITRD(n)             (((n) - 1) & 0x1F)
+#define EMC_STAT_WAITPAGE(n)           (((n) - 1) & 0x1F)
+#define EMC_STAT_WAITWR(n)             (((n) - 2) & 0x1F)
+#define EMC_STAT_WAITTURN(n)           (((n) - 1) & 0x0F)
+
+#endif /* _LPC32XX_EMC_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/sys_proto.h b/arch/arm/include/asm/arch-lpc32xx/sys_proto.h
new file mode 100644 (file)
index 0000000..b2cbfcd
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_SYS_PROTO_H
+#define _LPC32XX_SYS_PROTO_H
+
+void lpc32xx_uart_init(unsigned int uart_id);
+
+#endif /* _LPC32XX_SYS_PROTO_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/timer.h b/arch/arm/include/asm/arch-lpc32xx/timer.h
new file mode 100644 (file)
index 0000000..7d63763
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_TIMER_H
+#define _LPC32XX_TIMER_H
+
+#include <asm/types.h>
+
+/* Timer/Counter Registers */
+struct timer_regs {
+       u32 ir;                 /* Interrupt Register           */
+       u32 tcr;                /* Timer Control Register       */
+       u32 tc;                 /* Timer Counter                */
+       u32 pr;                 /* Prescale Register            */
+       u32 pc;                 /* Prescale Counter             */
+       u32 mcr;                /* Match Control Register       */
+       u32 mr[4];              /* Match Registers              */
+       u32 ccr;                /* Capture Control Register     */
+       u32 cr[4];              /* Capture Registers            */
+       u32 emr;                /* External Match Register      */
+       u32 reserved[12];
+       u32 ctcr;               /* Count Control Register       */
+};
+
+/* Timer/Counter Interrupt Register bits */
+#define TIMER_IR_CR(n)                 (1 << ((n) + 4))
+#define TIMER_IR_MR(n)                 (1 << (n))
+
+/* Timer/Counter Timer Control Register bits */
+#define TIMER_TCR_COUNTER_RESET                (1 << 1)
+#define TIMER_TCR_COUNTER_ENABLE       (1 << 0)
+#define TIMER_TCR_COUNTER_DISABLE      (0 << 0)
+
+/* Timer/Counter Match Control Register bits */
+#define TIMER_MCR_STOP(n)              (1 << (3 * (n) + 2))
+#define TIMER_MCR_RESET(n)             (1 << (3 * (n) + 1))
+#define TIMER_MCR_INTERRUPT(n)         (1 << (3 * (n)))
+
+/* Timer/Counter Capture Control Register bits */
+#define TIMER_CCR_INTERRUPT(n)         (1 << (3 * (n) + 2))
+#define TIMER_CCR_FALLING_EDGE(n)      (1 << (3 * (n) + 1))
+#define TIMER_CCR_RISING_EDGE(n)       (1 << (3 * (n)))
+
+/* Timer/Counter External Match Register bits */
+#define TIMER_EMR_EMC_TOGGLE(n)                (0x3 << (2 * (n) + 4))
+#define TIMER_EMR_EMC_SET(n)           (0x2 << (2 * (n) + 4))
+#define TIMER_EMR_EMC_CLEAR(n)         (0x1 << (2 * (n) + 4))
+#define TIMER_EMR_EMC_NOTHING(n)       (0x0 << (2 * (n) + 4))
+#define TIMER_EMR_EM(n)                        (1 << (n))
+
+/* Timer/Counter Count Control Register bits */
+#define TIMER_CTCR_INPUT(n)            ((n) << 2)
+#define TIMER_CTCR_MODE_COUNTER_BOTH   (0x3 << 0)
+#define TIMER_CTCR_MODE_COUNTER_FALLING        (0x2 << 0)
+#define TIMER_CTCR_MODE_COUNTER_RISING (0x1 << 0)
+#define TIMER_CTCR_MODE_TIMER          (0x0 << 0)
+
+#endif /* _LPC32XX_TIMER_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/uart.h b/arch/arm/include/asm/arch-lpc32xx/uart.h
new file mode 100644 (file)
index 0000000..ec12893
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_UART_H
+#define _LPC32XX_UART_H
+
+#include <asm/types.h>
+
+/* 14-clock UART Registers */
+struct hsuart_regs {
+       union {
+               u32 rx;         /* Receiver FIFO                */
+               u32 tx;         /* Transmitter FIFO             */
+       };
+       u32 level;              /* FIFO Level Register          */
+       u32 iir;                /* Interrupt ID Register        */
+       u32 ctrl;               /* Control Register             */
+       u32 rate;               /* Rate Control Register        */
+};
+
+/* 14-clock UART Receiver FIFO Register bits */
+#define HSUART_RX_BREAK                        (1 << 10)
+#define HSUART_RX_ERROR                        (1 << 9)
+#define HSUART_RX_EMPTY                        (1 << 8)
+#define HSUART_RX_DATA                 (0xff << 0)
+
+/* 14-clock UART Level Register bits */
+#define HSUART_LEVEL_TX                        (0xff << 8)
+#define HSUART_LEVEL_RX                        (0xff << 0)
+
+/* 14-clock UART Interrupt Identification Register bits */
+#define HSUART_IIR_TX_INT_SET          (1 << 6)
+#define HSUART_IIR_RX_OE               (1 << 5)
+#define HSUART_IIR_BRK                 (1 << 4)
+#define HSUART_IIR_FE                  (1 << 3)
+#define HSUART_IIR_RX_TIMEOUT          (1 << 2)
+#define HSUART_IIR_RX_TRIG             (1 << 1)
+#define HSUART_IIR_TX                  (1 << 0)
+
+/* 14-clock UART Control Register bits */
+#define HSUART_CTRL_HRTS_INV           (1 << 21)
+#define HSUART_CTRL_HRTS_TRIG_48       (0x3 << 19)
+#define HSUART_CTRL_HRTS_TRIG_32       (0x2 << 19)
+#define HSUART_CTRL_HRTS_TRIG_16       (0x1 << 19)
+#define HSUART_CTRL_HRTS_TRIG_8                (0x0 << 19)
+#define HSUART_CTRL_HRTS_EN            (1 << 18)
+#define HSUART_CTRL_TMO_16             (0x3 << 16)
+#define HSUART_CTRL_TMO_8              (0x2 << 16)
+#define HSUART_CTRL_TMO_4              (0x1 << 16)
+#define HSUART_CTRL_TMO_DISABLED       (0x0 << 16)
+#define HSUART_CTRL_HCTS_INV           (1 << 15)
+#define HSUART_CTRL_HCTS_EN            (1 << 14)
+#define HSUART_CTRL_HSU_OFFSET(n)      ((n) << 9)
+#define HSUART_CTRL_HSU_BREAK          (1 << 8)
+#define HSUART_CTRL_HSU_ERR_INT_EN     (1 << 7)
+#define HSUART_CTRL_HSU_RX_INT_EN      (1 << 6)
+#define HSUART_CTRL_HSU_TX_INT_EN      (1 << 5)
+#define HSUART_CTRL_HSU_RX_TRIG_48     (0x5 << 2)
+#define HSUART_CTRL_HSU_RX_TRIG_32     (0x4 << 2)
+#define HSUART_CTRL_HSU_RX_TRIG_16     (0x3 << 2)
+#define HSUART_CTRL_HSU_RX_TRIG_8      (0x2 << 2)
+#define HSUART_CTRL_HSU_RX_TRIG_4      (0x1 << 2)
+#define HSUART_CTRL_HSU_RX_TRIG_1      (0x0 << 2)
+#define HSUART_CTRL_HSU_TX_TRIG_16     (0x3 << 0)
+#define HSUART_CTRL_HSU_TX_TRIG_8      (0x2 << 0)
+#define HSUART_CTRL_HSU_TX_TRIG_4      (0x1 << 0)
+#define HSUART_CTRL_HSU_TX_TRIG_0      (0x0 << 0)
+
+/* UART Control Registers */
+struct uart_ctrl_regs {
+       u32 ctrl;               /* Control Register             */
+       u32 clkmode;            /* Clock Mode Register          */
+       u32 loop;               /* Loopback Control Register    */
+};
+
+/* UART Control Register bits */
+#define UART_CTRL_UART3_MD_CTRL                (1 << 11)
+#define UART_CTRL_HDPX_INV             (1 << 10)
+#define UART_CTRL_HDPX_EN              (1 << 9)
+#define UART_CTRL_UART6_IRDA           (1 << 5)
+#define UART_CTRL_IR_TX6_INV           (1 << 4)
+#define UART_CTRL_IR_RX6_INV           (1 << 3)
+#define UART_CTRL_IR_RX_LENGTH         (1 << 2)
+#define UART_CTRL_IR_TX_LENGTH         (1 << 1)
+#define UART_CTRL_UART5_USB_MODE       (1 << 0)
+
+/* UART Clock Mode Register bits */
+#define UART_CLKMODE_STATX(n)          (1 << ((n) + 16))
+#define UART_CLKMODE_STAT              (1 << 14)
+#define UART_CLKMODE_MASK(n)           (0x3 << (2 * (n) - 2))
+#define UART_CLKMODE_AUTO(n)           (0x2 << (2 * (n) - 2))
+#define UART_CLKMODE_ON(n)             (0x1 << (2 * (n) - 2))
+#define UART_CLKMODE_OFF(n)            (0x0 << (2 * (n) - 2))
+
+/* UART Loopback Control Register bits */
+#define UART_LOOPBACK(n)               (1 << ((n) - 1))
+
+#endif /* _LPC32XX_UART_H */
diff --git a/arch/arm/include/asm/arch-lpc32xx/wdt.h b/arch/arm/include/asm/arch-lpc32xx/wdt.h
new file mode 100644 (file)
index 0000000..133f29f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+
+#ifndef _LPC32XX_WDT_H
+#define _LPC32XX_WDT_H
+
+#include <asm/types.h>
+
+/* Watchdog Timer Registers */
+struct wdt_regs {
+       u32 isr;                /* Interrupt Status Register            */
+       u32 ctrl;               /* Control Register                     */
+       u32 counter;            /* Counter Value Register               */
+       u32 mctrl;              /* Match Control Register               */
+       u32 match0;             /* Match 0 Register                     */
+       u32 emr;                /* External Match Control Register      */
+       u32 pulse;              /* Reset Pulse Length Register          */
+       u32 res;                /* Reset Source Register                */
+};
+
+/* Watchdog Timer Control Register bits */
+#define WDTIM_CTRL_PAUSE_EN            (1 << 2)
+#define WDTIM_CTRL_RESET_COUNT         (1 << 1)
+#define WDTIM_CTRL_COUNT_ENAB          (1 << 0)
+
+/* Watchdog Timer Match Control Register bits */
+#define WDTIM_MCTRL_RESFRC2            (1 << 6)
+#define WDTIM_MCTRL_RESFRC1            (1 << 5)
+#define WDTIM_MCTRL_M_RES2             (1 << 4)
+#define WDTIM_MCTRL_M_RES1             (1 << 3)
+#define WDTIM_MCTRL_STOP_COUNT0                (1 << 2)
+#define WDTIM_MCTRL_RESET_COUNT0       (1 << 1)
+#define WDTIM_MCTRL_MR0_INT            (1 << 0)
+
+#endif /* _LPC32XX_WDT_H */
index c59f5885700c577214c734b7fa3a7b38fd15ba89..0f47eaf053c2dd57de62eff3d21d310c9636ba8b 100644 (file)
 #ifndef __ASM_ARCH_CLOCK_H
 #define __ASM_ARCH_CLOCK_H
 
+enum mxc_clock {
+       MXC_CSI_CLK,
+       MXC_EPIT_CLK,
+       MXC_ESAI_CLK,
+       MXC_ESDHC1_CLK,
+       MXC_ESDHC2_CLK,
+       MXC_GPT_CLK,
+       MXC_I2C_CLK,
+       MXC_LCDC_CLK,
+       MXC_NFC_CLK,
+       MXC_OWIRE_CLK,
+       MXC_PWM_CLK,
+       MXC_SIM1_CLK,
+       MXC_SIM2_CLK,
+       MXC_SSI1_CLK,
+       MXC_SSI2_CLK,
+       MXC_UART_CLK,
+       MXC_ARM_CLK,
+       MXC_FEC_CLK,
+       MXC_CLK_NUM
+};
+
 ulong imx_get_perclk(int clk);
 ulong imx_get_ahbclk(void);
 
 #define imx_get_uartclk() imx_get_perclk(15)
 #define imx_get_fecclk() (imx_get_ahbclk()/2)
 
+unsigned int mxc_get_clock(enum mxc_clock clk);
 
 #endif /* __ASM_ARCH_CLOCK_H */
index 7f9449b2d0659a3614b9cadf4a5784e7de554c1f..cf925d70d52fa70c8484ee0c86581987bc19b731 100644 (file)
@@ -34,6 +34,9 @@
 #define _IMX_REGS_H
 
 #ifndef __ASSEMBLY__
+
+#include <asm/types.h>
+
 #ifdef CONFIG_FEC_MXC
 extern void mx25_fec_init_pins(void);
 #endif
index f9e6c535f23e66f851d7faadcb93163cfe96500d..37d0a9376810c1835bc6753450b4b409dfbed443 100644 (file)
@@ -30,6 +30,8 @@
 #include <asm/arch/regs-digctl.h>
 #include <asm/arch/regs-gpmi.h>
 #include <asm/arch/regs-i2c.h>
+#include <asm/arch/regs-lcdif.h>
+#include <asm/arch/regs-lradc.h>
 #include <asm/arch/regs-ocotp.h>
 #include <asm/arch/regs-pinctrl.h>
 #include <asm/arch/regs-power.h>
diff --git a/arch/arm/include/asm/arch-mx28/regs-lcdif.h b/arch/arm/include/asm/arch-mx28/regs-lcdif.h
new file mode 100644 (file)
index 0000000..cb47e41
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Freescale i.MX28 LCDIF Register Definitions
+ *
+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
+ * on behalf of DENX Software Engineering GmbH
+ *
+ * Based on code from LTIB:
+ * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License 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
+ *
+ */
+
+#ifndef __MX28_REGS_LCDIF_H__
+#define __MX28_REGS_LCDIF_H__
+
+#include <asm/arch/regs-common.h>
+
+#ifndef        __ASSEMBLY__
+struct mx28_lcdif_regs {
+       mx28_reg_32(hw_lcdif_ctrl)              /* 0x00 */
+       mx28_reg_32(hw_lcdif_ctrl1)             /* 0x10 */
+       mx28_reg_32(hw_lcdif_ctrl2)             /* 0x20 */
+       mx28_reg_32(hw_lcdif_transfer_count)    /* 0x30 */
+       mx28_reg_32(hw_lcdif_cur_buf)           /* 0x40 */
+       mx28_reg_32(hw_lcdif_next_buf)          /* 0x50 */
+       mx28_reg_32(hw_lcdif_timing)            /* 0x60 */
+       mx28_reg_32(hw_lcdif_vdctrl0)           /* 0x70 */
+       mx28_reg_32(hw_lcdif_vdctrl1)           /* 0x80 */
+       mx28_reg_32(hw_lcdif_vdctrl2)           /* 0x90 */
+       mx28_reg_32(hw_lcdif_vdctrl3)           /* 0xa0 */
+       mx28_reg_32(hw_lcdif_vdctrl4)           /* 0xb0 */
+       mx28_reg_32(hw_lcdif_dvictrl0)          /* 0xc0 */
+       mx28_reg_32(hw_lcdif_dvictrl1)          /* 0xd0 */
+       mx28_reg_32(hw_lcdif_dvictrl2)          /* 0xe0 */
+       mx28_reg_32(hw_lcdif_dvictrl3)          /* 0xf0 */
+       mx28_reg_32(hw_lcdif_dvictrl4)          /* 0x100 */
+       mx28_reg_32(hw_lcdif_csc_coeffctrl0)    /* 0x110 */
+       mx28_reg_32(hw_lcdif_csc_coeffctrl1)    /* 0x120 */
+       mx28_reg_32(hw_lcdif_csc_coeffctrl2)    /* 0x130 */
+       mx28_reg_32(hw_lcdif_csc_coeffctrl3)    /* 0x140 */
+       mx28_reg_32(hw_lcdif_csc_coeffctrl4)    /* 0x150 */
+       mx28_reg_32(hw_lcdif_csc_offset)        /* 0x160 */
+       mx28_reg_32(hw_lcdif_csc_limit)         /* 0x170 */
+       mx28_reg_32(hw_lcdif_data)              /* 0x180 */
+       mx28_reg_32(hw_lcdif_bm_error_stat)     /* 0x190 */
+       mx28_reg_32(hw_lcdif_crc_stat)          /* 0x1a0 */
+       mx28_reg_32(hw_lcdif_lcdif_stat)        /* 0x1b0 */
+       mx28_reg_32(hw_lcdif_version)           /* 0x1c0 */
+       mx28_reg_32(hw_lcdif_debug0)            /* 0x1d0 */
+       mx28_reg_32(hw_lcdif_debug1)            /* 0x1e0 */
+       mx28_reg_32(hw_lcdif_debug2)            /* 0x1f0 */
+};
+#endif
+
+#define        LCDIF_CTRL_SFTRST                                       (1 << 31)
+#define        LCDIF_CTRL_CLKGATE                                      (1 << 30)
+#define        LCDIF_CTRL_YCBCR422_INPUT                               (1 << 29)
+#define        LCDIF_CTRL_READ_WRITEB                                  (1 << 28)
+#define        LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE                          (1 << 27)
+#define        LCDIF_CTRL_DATA_SHIFT_DIR                               (1 << 26)
+#define        LCDIF_CTRL_SHIFT_NUM_BITS_MASK                          (0x1f << 21)
+#define        LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET                        21
+#define        LCDIF_CTRL_DVI_MODE                                     (1 << 20)
+#define        LCDIF_CTRL_BYPASS_COUNT                                 (1 << 19)
+#define        LCDIF_CTRL_VSYNC_MODE                                   (1 << 18)
+#define        LCDIF_CTRL_DOTCLK_MODE                                  (1 << 17)
+#define        LCDIF_CTRL_DATA_SELECT                                  (1 << 16)
+#define        LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK                      (0x3 << 14)
+#define        LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET                    14
+#define        LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK                        (0x3 << 12)
+#define        LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET                      12
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK                       (0x3 << 10)
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET                     10
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT                      (0 << 10)
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT                       (1 << 10)
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT                      (2 << 10)
+#define        LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT                      (3 << 10)
+#define        LCDIF_CTRL_WORD_LENGTH_MASK                             (0x3 << 8)
+#define        LCDIF_CTRL_WORD_LENGTH_OFFSET                           8
+#define        LCDIF_CTRL_WORD_LENGTH_16BIT                            (0 << 8)
+#define        LCDIF_CTRL_WORD_LENGTH_8BIT                             (1 << 8)
+#define        LCDIF_CTRL_WORD_LENGTH_18BIT                            (2 << 8)
+#define        LCDIF_CTRL_WORD_LENGTH_24BIT                            (3 << 8)
+#define        LCDIF_CTRL_RGB_TO_YCBCR422_CSC                          (1 << 7)
+#define        LCDIF_CTRL_LCDIF_MASTER                                 (1 << 5)
+#define        LCDIF_CTRL_DATA_FORMAT_16_BIT                           (1 << 3)
+#define        LCDIF_CTRL_DATA_FORMAT_18_BIT                           (1 << 2)
+#define        LCDIF_CTRL_DATA_FORMAT_24_BIT                           (1 << 1)
+#define        LCDIF_CTRL_RUN                                          (1 << 0)
+
+#define        LCDIF_CTRL1_COMBINE_MPU_WR_STRB                         (1 << 27)
+#define        LCDIF_CTRL1_BM_ERROR_IRQ_EN                             (1 << 26)
+#define        LCDIF_CTRL1_BM_ERROR_IRQ                                (1 << 25)
+#define        LCDIF_CTRL1_RECOVER_ON_UNDERFLOW                        (1 << 24)
+#define        LCDIF_CTRL1_INTERLACE_FIELDS                            (1 << 23)
+#define        LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD           (1 << 22)
+#define        LCDIF_CTRL1_FIFO_CLEAR                                  (1 << 21)
+#define        LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS                     (1 << 20)
+#define        LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK                    (0xf << 16)
+#define        LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET                  16
+#define        LCDIF_CTRL1_OVERFLOW_IRQ_EN                             (1 << 15)
+#define        LCDIF_CTRL1_UNDERFLOW_IRQ_EN                            (1 << 14)
+#define        LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN                       (1 << 13)
+#define        LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN                           (1 << 12)
+#define        LCDIF_CTRL1_OVERFLOW_IRQ                                (1 << 11)
+#define        LCDIF_CTRL1_UNDERFLOW_IRQ                               (1 << 10)
+#define        LCDIF_CTRL1_CUR_FRAME_DONE_IRQ                          (1 << 9)
+#define        LCDIF_CTRL1_VSYNC_EDGE_IRQ                              (1 << 8)
+#define        LCDIF_CTRL1_BUSY_ENABLE                                 (1 << 2)
+#define        LCDIF_CTRL1_MODE86                                      (1 << 1)
+#define        LCDIF_CTRL1_RESET                                       (1 << 0)
+
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_MASK                       (0x7 << 21)
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET                     21
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1                      (0x0 << 21)
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2                      (0x1 << 21)
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4                      (0x2 << 21)
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8                      (0x3 << 21)
+#define        LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16                     (0x4 << 21)
+#define        LCDIF_CTRL2_BURST_LEN_8                                 (1 << 20)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_MASK                       (0x7 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET                     16
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_RGB                        (0x0 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_RBG                        (0x1 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_GBR                        (0x2 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_GRB                        (0x3 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_BRG                        (0x4 << 16)
+#define        LCDIF_CTRL2_ODD_LINE_PATTERN_BGR                        (0x5 << 16)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK                      (0x7 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET                    12
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB                       (0x0 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG                       (0x1 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR                       (0x2 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB                       (0x3 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG                       (0x4 << 12)
+#define        LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR                       (0x5 << 12)
+#define        LCDIF_CTRL2_READ_PACK_DIR                               (1 << 10)
+#define        LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT              (1 << 9)
+#define        LCDIF_CTRL2_READ_MODE_6_BIT_INPUT                       (1 << 8)
+#define        LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK          (0x7 << 4)
+#define        LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET        4
+#define        LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK                     (0x7 << 1)
+#define        LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET                   1
+
+#define        LCDIF_TRANSFER_COUNT_V_COUNT_MASK                       (0xffff << 16)
+#define        LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET                     16
+#define        LCDIF_TRANSFER_COUNT_H_COUNT_MASK                       (0xffff << 0)
+#define        LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET                     0
+
+#define        LCDIF_CUR_BUF_ADDR_MASK                                 0xffffffff
+#define        LCDIF_CUR_BUF_ADDR_OFFSET                               0
+
+#define        LCDIF_NEXT_BUF_ADDR_MASK                                0xffffffff
+#define        LCDIF_NEXT_BUF_ADDR_OFFSET                              0
+
+#define        LCDIF_TIMING_CMD_HOLD_MASK                              (0xff << 24)
+#define        LCDIF_TIMING_CMD_HOLD_OFFSET                            24
+#define        LCDIF_TIMING_CMD_SETUP_MASK                             (0xff << 16)
+#define        LCDIF_TIMING_CMD_SETUP_OFFSET                           16
+#define        LCDIF_TIMING_DATA_HOLD_MASK                             (0xff << 8)
+#define        LCDIF_TIMING_DATA_HOLD_OFFSET                           8
+#define        LCDIF_TIMING_DATA_SETUP_MASK                            (0xff << 0)
+#define        LCDIF_TIMING_DATA_SETUP_OFFSET                          0
+
+#define        LCDIF_VDCTRL0_VSYNC_OEB                                 (1 << 29)
+#define        LCDIF_VDCTRL0_ENABLE_PRESENT                            (1 << 28)
+#define        LCDIF_VDCTRL0_VSYNC_POL                                 (1 << 27)
+#define        LCDIF_VDCTRL0_HSYNC_POL                                 (1 << 26)
+#define        LCDIF_VDCTRL0_DOTCLK_POL                                (1 << 25)
+#define        LCDIF_VDCTRL0_ENABLE_POL                                (1 << 24)
+#define        LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT                         (1 << 21)
+#define        LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT                    (1 << 20)
+#define        LCDIF_VDCTRL0_HALF_LINE                                 (1 << 19)
+#define        LCDIF_VDCTRL0_HALF_LINE_MODE                            (1 << 18)
+#define        LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK                    0x3ffff
+#define        LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET                  0
+
+#define        LCDIF_VDCTRL1_VSYNC_PERIOD_MASK                         0xffffffff
+#define        LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET                       0
+
+#define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK                    (0x3fff << 18)
+#define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET                  18
+#define        LCDIF_VDCTRL2_HSYNC_PERIOD_MASK                         0x3ffff
+#define        LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET                       0
+
+#define        LCDIF_VDCTRL3_MUX_SYNC_SIGNALS                          (1 << 29)
+#define        LCDIF_VDCTRL3_VSYNC_ONLY                                (1 << 28)
+#define        LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK                  (0xfff << 16)
+#define        LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET                16
+#define        LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK                    (0xffff << 0)
+#define        LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET                  0
+
+#define        LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK                       (0x7 << 29)
+#define        LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET                     29
+#define        LCDIF_VDCTRL4_SYNC_SIGNALS_ON                           (1 << 18)
+#define        LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK              0x3ffff
+#define        LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET            0
+
+#endif /* __MX28_REGS_LCDIF_H__ */
diff --git a/arch/arm/include/asm/arch-mx28/regs-lradc.h b/arch/arm/include/asm/arch-mx28/regs-lradc.h
new file mode 100644 (file)
index 0000000..16e2bbf
--- /dev/null
@@ -0,0 +1,400 @@
+/*
+ * Freescale i.MX28 LRADC Register Definitions
+ *
+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
+ * on behalf of DENX Software Engineering GmbH
+ *
+ * Based on code from LTIB:
+ * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License 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
+ *
+ */
+
+#ifndef __MX28_REGS_LRADC_H__
+#define __MX28_REGS_LRADC_H__
+
+#include <asm/arch/regs-common.h>
+
+#ifndef        __ASSEMBLY__
+struct mx28_lradc_regs {
+       mx28_reg_32(hw_lradc_ctrl0);
+       mx28_reg_32(hw_lradc_ctrl1);
+       mx28_reg_32(hw_lradc_ctrl2);
+       mx28_reg_32(hw_lradc_ctrl3);
+       mx28_reg_32(hw_lradc_status);
+       mx28_reg_32(hw_lradc_ch0);
+       mx28_reg_32(hw_lradc_ch1);
+       mx28_reg_32(hw_lradc_ch2);
+       mx28_reg_32(hw_lradc_ch3);
+       mx28_reg_32(hw_lradc_ch4);
+       mx28_reg_32(hw_lradc_ch5);
+       mx28_reg_32(hw_lradc_ch6);
+       mx28_reg_32(hw_lradc_ch7);
+       mx28_reg_32(hw_lradc_delay0);
+       mx28_reg_32(hw_lradc_delay1);
+       mx28_reg_32(hw_lradc_delay2);
+       mx28_reg_32(hw_lradc_delay3);
+       mx28_reg_32(hw_lradc_debug0);
+       mx28_reg_32(hw_lradc_debug1);
+       mx28_reg_32(hw_lradc_conversion);
+       mx28_reg_32(hw_lradc_ctrl4);
+       mx28_reg_32(hw_lradc_treshold0);
+       mx28_reg_32(hw_lradc_treshold1);
+       mx28_reg_32(hw_lradc_version);
+};
+#endif
+
+#define        LRADC_CTRL0_SFTRST                                      (1 << 31)
+#define        LRADC_CTRL0_CLKGATE                                     (1 << 30)
+#define        LRADC_CTRL0_ONCHIP_GROUNDREF                            (1 << 26)
+#define        LRADC_CTRL0_BUTTON1_DETECT_ENABLE                       (1 << 25)
+#define        LRADC_CTRL0_BUTTON0_DETECT_ENABLE                       (1 << 24)
+#define        LRADC_CTRL0_TOUCH_DETECT_ENABLE                         (1 << 23)
+#define        LRADC_CTRL0_TOUCH_SCREEN_TYPE                           (1 << 22)
+#define        LRADC_CTRL0_YNLRSW                                      (1 << 21)
+#define        LRADC_CTRL0_YPLLSW_MASK                                 (0x3 << 19)
+#define        LRADC_CTRL0_YPLLSW_OFFSET                               19
+#define        LRADC_CTRL0_XNURSW_MASK                                 (0x3 << 17)
+#define        LRADC_CTRL0_XNURSW_OFFSET                               17
+#define        LRADC_CTRL0_XPULSW                                      (1 << 16)
+#define        LRADC_CTRL0_SCHEDULE_MASK                               0xff
+#define        LRADC_CTRL0_SCHEDULE_OFFSET                             0
+
+#define        LRADC_CTRL1_BUTTON1_DETECT_IRQ_EN                       (1 << 28)
+#define        LRADC_CTRL1_BUTTON0_DETECT_IRQ_EN                       (1 << 27)
+#define        LRADC_CTRL1_THRESHOLD1_DETECT_IRQ_EN                    (1 << 26)
+#define        LRADC_CTRL1_THRESHOLD0_DETECT_IRQ_EN                    (1 << 25)
+#define        LRADC_CTRL1_TOUCH_DETECT_IRQ_EN                         (1 << 24)
+#define        LRADC_CTRL1_LRADC7_IRQ_EN                               (1 << 23)
+#define        LRADC_CTRL1_LRADC6_IRQ_EN                               (1 << 22)
+#define        LRADC_CTRL1_LRADC5_IRQ_EN                               (1 << 21)
+#define        LRADC_CTRL1_LRADC4_IRQ_EN                               (1 << 20)
+#define        LRADC_CTRL1_LRADC3_IRQ_EN                               (1 << 19)
+#define        LRADC_CTRL1_LRADC2_IRQ_EN                               (1 << 18)
+#define        LRADC_CTRL1_LRADC1_IRQ_EN                               (1 << 17)
+#define        LRADC_CTRL1_LRADC0_IRQ_EN                               (1 << 16)
+#define        LRADC_CTRL1_BUTTON1_DETECT_IRQ                          (1 << 12)
+#define        LRADC_CTRL1_BUTTON0_DETECT_IRQ                          (1 << 11)
+#define        LRADC_CTRL1_THRESHOLD1_DETECT_IRQ                       (1 << 10)
+#define        LRADC_CTRL1_THRESHOLD0_DETECT_IRQ                       (1 << 9)
+#define        LRADC_CTRL1_TOUCH_DETECT_IRQ                            (1 << 8)
+#define        LRADC_CTRL1_LRADC7_IRQ                                  (1 << 7)
+#define        LRADC_CTRL1_LRADC6_IRQ                                  (1 << 6)
+#define        LRADC_CTRL1_LRADC5_IRQ                                  (1 << 5)
+#define        LRADC_CTRL1_LRADC4_IRQ                                  (1 << 4)
+#define        LRADC_CTRL1_LRADC3_IRQ                                  (1 << 3)
+#define        LRADC_CTRL1_LRADC2_IRQ                                  (1 << 2)
+#define        LRADC_CTRL1_LRADC1_IRQ                                  (1 << 1)
+#define        LRADC_CTRL1_LRADC0_IRQ                                  (1 << 0)
+
+#define        LRADC_CTRL2_DIVIDE_BY_TWO_MASK                          (0xff << 24)
+#define        LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET                        24
+#define        LRADC_CTRL2_TEMPSENSE_PWD                               (1 << 15)
+#define        LRADC_CTRL2_VTHSENSE_MASK                               (0x3 << 13)
+#define        LRADC_CTRL2_VTHSENSE_OFFSET                             13
+#define        LRADC_CTRL2_DISABLE_MUXAMP_BYPASS                       (1 << 12)
+#define        LRADC_CTRL2_TEMP_SENSOR_IENABLE1                        (1 << 9)
+#define        LRADC_CTRL2_TEMP_SENSOR_IENABLE0                        (1 << 8)
+#define        LRADC_CTRL2_TEMP_ISRC1_MASK                             (0xf << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_OFFSET                           4
+#define        LRADC_CTRL2_TEMP_ISRC1_300                              (0xf << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_280                              (0xe << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_260                              (0xd << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_240                              (0xc << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_220                              (0xb << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_200                              (0xa << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_180                              (0x9 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_160                              (0x8 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_140                              (0x7 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_120                              (0x6 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_100                              (0x5 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_80                               (0x4 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_60                               (0x3 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_40                               (0x2 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_20                               (0x1 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC1_ZERO                             (0x0 << 4)
+#define        LRADC_CTRL2_TEMP_ISRC0_MASK                             (0xf << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_OFFSET                           0
+#define        LRADC_CTRL2_TEMP_ISRC0_300                              (0xf << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_280                              (0xe << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_260                              (0xd << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_240                              (0xc << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_220                              (0xb << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_200                              (0xa << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_180                              (0x9 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_160                              (0x8 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_140                              (0x7 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_120                              (0x6 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_100                              (0x5 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_80                               (0x4 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_60                               (0x3 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_40                               (0x2 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_20                               (0x1 << 0)
+#define        LRADC_CTRL2_TEMP_ISRC0_ZERO                             (0x0 << 0)
+
+#define        LRADC_CTRL3_DISCARD_MASK                                (0x3 << 24)
+#define        LRADC_CTRL3_DISCARD_OFFSET                              24
+#define        LRADC_CTRL3_DISCARD_1_SAMPLE                            (0x1 << 24)
+#define        LRADC_CTRL3_DISCARD_2_SAMPLES                           (0x2 << 24)
+#define        LRADC_CTRL3_DISCARD_3_SAMPLES                           (0x3 << 24)
+#define        LRADC_CTRL3_FORCE_ANALOG_PWUP                           (1 << 23)
+#define        LRADC_CTRL3_FORCE_ANALOG_PWDN                           (1 << 22)
+#define        LRADC_CTRL3_CYCLE_TIME_MASK                             (0x3 << 8)
+#define        LRADC_CTRL3_CYCLE_TIME_OFFSET                           8
+#define        LRADC_CTRL3_CYCLE_TIME_6MHZ                             (0x0 << 8)
+#define        LRADC_CTRL3_CYCLE_TIME_4MHZ                             (0x1 << 8)
+#define        LRADC_CTRL3_CYCLE_TIME_3MHZ                             (0x2 << 8)
+#define        LRADC_CTRL3_CYCLE_TIME_2MHZ                             (0x3 << 8)
+#define        LRADC_CTRL3_HIGH_TIME_MASK                              (0x3 << 4)
+#define        LRADC_CTRL3_HIGH_TIME_OFFSET                            4
+#define        LRADC_CTRL3_HIGH_TIME_42NS                              (0x0 << 4)
+#define        LRADC_CTRL3_HIGH_TIME_83NS                              (0x1 << 4)
+#define        LRADC_CTRL3_HIGH_TIME_125NS                             (0x2 << 4)
+#define        LRADC_CTRL3_HIGH_TIME_250NS                             (0x3 << 4)
+#define        LRADC_CTRL3_DELAY_CLOCK                                 (1 << 1)
+#define        LRADC_CTRL3_INVERT_CLOCK                                (1 << 0)
+
+#define        LRADC_STATUS_BUTTON1_PRESENT                            (1 << 28)
+#define        LRADC_STATUS_BUTTON0_PRESENT                            (1 << 27)
+#define        LRADC_STATUS_TEMP1_PRESENT                              (1 << 26)
+#define        LRADC_STATUS_TEMP0_PRESENT                              (1 << 25)
+#define        LRADC_STATUS_TOUCH_PANEL_PRESENT                        (1 << 24)
+#define        LRADC_STATUS_CHANNEL7_PRESENT                           (1 << 23)
+#define        LRADC_STATUS_CHANNEL6_PRESENT                           (1 << 22)
+#define        LRADC_STATUS_CHANNEL5_PRESENT                           (1 << 21)
+#define        LRADC_STATUS_CHANNEL4_PRESENT                           (1 << 20)
+#define        LRADC_STATUS_CHANNEL3_PRESENT                           (1 << 19)
+#define        LRADC_STATUS_CHANNEL2_PRESENT                           (1 << 18)
+#define        LRADC_STATUS_CHANNEL1_PRESENT                           (1 << 17)
+#define        LRADC_STATUS_CHANNEL0_PRESENT                           (1 << 16)
+#define        LRADC_STATUS_BUTTON1_DETECT_RAW                         (1 << 2)
+#define        LRADC_STATUS_BUTTON0_DETECT_RAW                         (1 << 1)
+#define        LRADC_STATUS_TOUCH_DETECT_RAW                           (1 << 0)
+
+#define        LRADC_CH_TOGGLE                                         (1 << 31)
+#define        LRADC_CH7_TESTMODE_TOGGLE                               (1 << 30)
+#define        LRADC_CH_ACCUMULATE                                     (1 << 29)
+#define        LRADC_CH_NUM_SAMPLES_MASK                               (0x1f << 24)
+#define        LRADC_CH_NUM_SAMPLES_OFFSET                             24
+#define        LRADC_CH_VALUE_MASK                                     0x3ffff
+#define        LRADC_CH_VALUE_OFFSET                                   0
+
+#define        LRADC_DELAY_TRIGGER_LRADCS_MASK                         (0xff << 24)
+#define        LRADC_DELAY_TRIGGER_LRADCS_OFFSET                       24
+#define        LRADC_DELAY_KICK                                        (1 << 20)
+#define        LRADC_DELAY_TRIGGER_DELAYS_MASK                         (0xf << 16)
+#define        LRADC_DELAY_TRIGGER_DELAYS_OFFSET                       16
+#define        LRADC_DELAY_LOOP_COUNT_MASK                             (0x1f << 11)
+#define        LRADC_DELAY_LOOP_COUNT_OFFSET                           11
+#define        LRADC_DELAY_DELAY_MASK                                  0x7ff
+#define        LRADC_DELAY_DELAY_OFFSET                                0
+
+#define        LRADC_DEBUG0_READONLY_MASK                              (0xffff << 16)
+#define        LRADC_DEBUG0_READONLY_OFFSET                            16
+#define        LRADC_DEBUG0_STATE_MASK                                 (0xfff << 0)
+#define        LRADC_DEBUG0_STATE_OFFSET                               0
+
+#define        LRADC_DEBUG1_REQUEST_MASK                               (0xff << 16)
+#define        LRADC_DEBUG1_REQUEST_OFFSET                             16
+#define        LRADC_DEBUG1_TESTMODE_COUNT_MASK                        (0x1f << 8)
+#define        LRADC_DEBUG1_TESTMODE_COUNT_OFFSET                      8
+#define        LRADC_DEBUG1_TESTMODE6                                  (1 << 2)
+#define        LRADC_DEBUG1_TESTMODE5                                  (1 << 1)
+#define        LRADC_DEBUG1_TESTMODE                                   (1 << 0)
+
+#define        LRADC_CONVERSION_AUTOMATIC                              (1 << 20)
+#define        LRADC_CONVERSION_SCALE_FACTOR_MASK                      (0x3 << 16)
+#define        LRADC_CONVERSION_SCALE_FACTOR_OFFSET                    16
+#define        LRADC_CONVERSION_SCALE_FACTOR_NIMH                      (0x0 << 16)
+#define        LRADC_CONVERSION_SCALE_FACTOR_DUAL_NIMH                 (0x1 << 16)
+#define        LRADC_CONVERSION_SCALE_FACTOR_LI_ION                    (0x2 << 16)
+#define        LRADC_CONVERSION_SCALE_FACTOR_ALT_LI_ION                (0x3 << 16)
+#define        LRADC_CONVERSION_SCALED_BATT_VOLTAGE_MASK               0x3ff
+#define        LRADC_CONVERSION_SCALED_BATT_VOLTAGE_OFFSET             0
+
+#define        LRADC_CTRL4_LRADC7SELECT_MASK                           (0xf << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_OFFSET                         28
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL0                       (0x0 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL1                       (0x1 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL2                       (0x2 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL3                       (0x3 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL4                       (0x4 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL5                       (0x5 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL6                       (0x6 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL7                       (0x7 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL8                       (0x8 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL9                       (0x9 << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL10                      (0xa << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL11                      (0xb << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL12                      (0xc << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL13                      (0xd << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL14                      (0xe << 28)
+#define        LRADC_CTRL4_LRADC7SELECT_CHANNEL15                      (0xf << 28)
+#define        LRADC_CTRL4_LRADC6SELECT_MASK                           (0xf << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_OFFSET                         24
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL0                       (0x0 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL1                       (0x1 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL2                       (0x2 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL3                       (0x3 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL4                       (0x4 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL5                       (0x5 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL6                       (0x6 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL7                       (0x7 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL8                       (0x8 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL9                       (0x9 << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL10                      (0xa << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL11                      (0xb << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL12                      (0xc << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL13                      (0xd << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL14                      (0xe << 24)
+#define        LRADC_CTRL4_LRADC6SELECT_CHANNEL15                      (0xf << 24)
+#define        LRADC_CTRL4_LRADC5SELECT_MASK                           (0xf << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_OFFSET                         20
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL0                       (0x0 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL1                       (0x1 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL2                       (0x2 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL3                       (0x3 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL4                       (0x4 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL5                       (0x5 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL6                       (0x6 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL7                       (0x7 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL8                       (0x8 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL9                       (0x9 << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL10                      (0xa << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL11                      (0xb << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL12                      (0xc << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL13                      (0xd << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL14                      (0xe << 20)
+#define        LRADC_CTRL4_LRADC5SELECT_CHANNEL15                      (0xf << 20)
+#define        LRADC_CTRL4_LRADC4SELECT_MASK                           (0xf << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_OFFSET                         16
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL0                       (0x0 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL1                       (0x1 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL2                       (0x2 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL3                       (0x3 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL4                       (0x4 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL5                       (0x5 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL6                       (0x6 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL7                       (0x7 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL8                       (0x8 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL9                       (0x9 << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL10                      (0xa << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL11                      (0xb << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL12                      (0xc << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL13                      (0xd << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL14                      (0xe << 16)
+#define        LRADC_CTRL4_LRADC4SELECT_CHANNEL15                      (0xf << 16)
+#define        LRADC_CTRL4_LRADC3SELECT_MASK                           (0xf << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_OFFSET                         12
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL0                       (0x0 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL1                       (0x1 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL2                       (0x2 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL3                       (0x3 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL4                       (0x4 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL5                       (0x5 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL6                       (0x6 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL7                       (0x7 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL8                       (0x8 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL9                       (0x9 << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL10                      (0xa << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL11                      (0xb << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL12                      (0xc << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL13                      (0xd << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL14                      (0xe << 12)
+#define        LRADC_CTRL4_LRADC3SELECT_CHANNEL15                      (0xf << 12)
+#define        LRADC_CTRL4_LRADC2SELECT_MASK                           (0xf << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_OFFSET                         8
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL0                       (0x0 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL1                       (0x1 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL2                       (0x2 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL3                       (0x3 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL4                       (0x4 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL5                       (0x5 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL6                       (0x6 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL7                       (0x7 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL8                       (0x8 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL9                       (0x9 << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL10                      (0xa << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL11                      (0xb << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL12                      (0xc << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL13                      (0xd << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL14                      (0xe << 8)
+#define        LRADC_CTRL4_LRADC2SELECT_CHANNEL15                      (0xf << 8)
+#define        LRADC_CTRL4_LRADC1SELECT_MASK                           (0xf << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_OFFSET                         4
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL0                       (0x0 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL1                       (0x1 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL2                       (0x2 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL3                       (0x3 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL4                       (0x4 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL5                       (0x5 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL6                       (0x6 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL7                       (0x7 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL8                       (0x8 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL9                       (0x9 << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL10                      (0xa << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL11                      (0xb << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL12                      (0xc << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL13                      (0xd << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL14                      (0xe << 4)
+#define        LRADC_CTRL4_LRADC1SELECT_CHANNEL15                      (0xf << 4)
+#define        LRADC_CTRL4_LRADC0SELECT_MASK                           0xf
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL0                       (0x0 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL1                       (0x1 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL2                       (0x2 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL3                       (0x3 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL4                       (0x4 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL5                       (0x5 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL6                       (0x6 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL7                       (0x7 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL8                       (0x8 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL9                       (0x9 << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL10                      (0xa << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL11                      (0xb << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL12                      (0xc << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL13                      (0xd << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL14                      (0xe << 0)
+#define        LRADC_CTRL4_LRADC0SELECT_CHANNEL15                      (0xf << 0)
+
+#define        LRADC_THRESHOLD_ENABLE                                  (1 << 24)
+#define        LRADC_THRESHOLD_BATTCHRG_DISABLE                        (1 << 23)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_MASK                        (0x7 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_OFFSET                      20
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL0                    (0x0 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL1                    (0x1 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL2                    (0x2 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL3                    (0x3 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL4                    (0x4 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL5                    (0x5 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL6                    (0x6 << 20)
+#define        LRADC_THRESHOLD_CHANNEL_SEL_CHANNEL7                    (0x7 << 20)
+#define        LRADC_THRESHOLD_SETTING_MASK                            (0x3 << 18)
+#define        LRADC_THRESHOLD_SETTING_OFFSET                          18
+#define        LRADC_THRESHOLD_SETTING_NO_COMPARE                      (0x0 << 18)
+#define        LRADC_THRESHOLD_SETTING_DETECT_LOW                      (0x1 << 18)
+#define        LRADC_THRESHOLD_SETTING_DETECT_HIGH                     (0x2 << 18)
+#define        LRADC_THRESHOLD_SETTING_RESERVED                        (0x3 << 18)
+#define        LRADC_THRESHOLD_VALUE_MASK                              0x3ffff
+#define        LRADC_THRESHOLD_VALUE_OFFSET                            0
+
+#define        LRADC_VERSION_MAJOR_MASK                                (0xff << 24)
+#define        LRADC_VERSION_MAJOR_OFFSET                              24
+#define        LRADC_VERSION_MINOR_MASK                                (0xff << 16)
+#define        LRADC_VERSION_MINOR_OFFSET                              16
+#define        LRADC_VERSION_STEP_MASK                                 0xffff
+#define        LRADC_VERSION_STEP_OFFSET                               0
+
+#endif /* __MX28_REGS_LRADC_H__ */
index 15d8de31ee91af6089f4731602538892a0bb4e88..e701c6409e0accedc8383f0f7ea9b976bc2c76c1 100644 (file)
@@ -39,6 +39,36 @@ void mx28_common_spl_init(const iomux_cfg_t *iomux_setup,
                        const unsigned int iomux_size);
 #endif
 
+struct mx28_pair {
+       uint8_t boot_pads;
+       uint8_t boot_mask;
+       const char *mode;
+};
+
+static const struct mx28_pair mx28_boot_modes[] = {
+       { 0x00, 0x0f, "USB #0" },
+       { 0x01, 0x1f, "I2C #0, master, 3V3" },
+       { 0x11, 0x1f, "I2C #0, master, 1V8" },
+       { 0x02, 0x1f, "SSP SPI #2, master, 3V3 NOR" },
+       { 0x12, 0x1f, "SSP SPI #2, master, 1V8 NOR" },
+       { 0x03, 0x1f, "SSP SPI #3, master, 3V3 NOR" },
+       { 0x13, 0x1f, "SSP SPI #3, master, 1V8 NOR" },
+       { 0x04, 0x1f, "NAND, 3V3" },
+       { 0x14, 0x1f, "NAND, 1V8" },
+       { 0x08, 0x1f, "SSP SPI #3, master, 3V3 EEPROM" },
+       { 0x18, 0x1f, "SSP SPI #3, master, 1V8 EEPROM" },
+       { 0x09, 0x1f, "SSP SD/MMC #0, 3V3" },
+       { 0x19, 0x1f, "SSP SD/MMC #0, 1V8" },
+       { 0x0a, 0x1f, "SSP SD/MMC #1, 3V3" },
+       { 0x1a, 0x1f, "SSP SD/MMC #1, 1V8" },
+       { 0x00, 0x00, "Reserved/Unknown/Wrong" },
+};
+
+struct mx28_spl_data {
+       uint8_t         boot_mode_idx;
+       uint32_t        mem_dram_size;
+};
+
 int mx28_dram_init(void);
 
 #endif /* __MX28_H__ */
index ea972a398545169e060924155bded2eebbf19cf5..35ee8155de90faf251e9e67aaa2967f6b7855d47 100644 (file)
@@ -32,6 +32,10 @@ enum mxc_clock {
        MXC_UART_CLK,
        MXC_CSPI_CLK,
        MXC_FEC_CLK,
+       MXC_SATA_CLK,
+       MXC_DDR_CLK,
+       MXC_NFC_CLK,
+       MXC_PERIPH_CLK,
 };
 
 unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref);
@@ -39,10 +43,11 @@ unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref);
 u32 imx_get_uartclk(void);
 u32 imx_get_fecclk(void);
 unsigned int mxc_get_clock(enum mxc_clock clk);
-
+int mxc_set_clock(u32 ref, u32 freq, u32 clk_type);
 void set_usb_phy2_clk(void);
 void enable_usb_phy2_clk(unsigned char enable);
 void set_usboh3_clk(void);
 void enable_usboh3_clk(unsigned char enable);
+void mxc_set_sata_internal_clock(void);
 
 #endif /* __ASM_ARCH_CLOCK_H */
index bdeafbc0df7b26ebe69838fcd79318e14bb301da..4e0fc1bc1d69277da7b6451f05f41174cae8bdf3 100644 (file)
@@ -76,6 +76,9 @@ struct mxc_ccm_reg {
        u32 CCGR4;
        u32 CCGR5;
        u32 CCGR6;      /* 0x0080 */
+#ifdef CONFIG_MX53
+       u32 CCGR7;      /* 0x0084 */
+#endif
        u32 cmeor;
 };
 
@@ -84,6 +87,9 @@ struct mxc_ccm_reg {
 #define MXC_CCM_CACRR_ARM_PODF_MASK            0x7
 
 /* Define the bits in register CBCDR */
+#define MXC_CCM_CBCDR_DDR_HIFREQ_SEL           (0x1 << 30)
+#define MXC_CCM_CBCDR_DDR_PODF_MASK            (0x7 << 27)
+#define MXC_CCM_CBCDR_DDR_PODF_OFFSET          27
 #define MXC_CCM_CBCDR_EMI_CLK_SEL              (0x1 << 26)
 #define MXC_CCM_CBCDR_PERIPH_CLK_SEL           (0x1 << 25)
 #define MXC_CCM_CBCDR_EMI_PODF_OFFSET          22
index 4fa66587a0b7dabdd9a76ba0dd7aaf02a47d5882..cef419077e6520720fc8d3c51e559df38ab7fb60 100644 (file)
@@ -43,6 +43,7 @@
 #define NFC_BASE_ADDR_AXI       0xF7FF0000
 #define IRAM_BASE_ADDR          0xF8000000
 #define CS1_BASE_ADDR           0xF4000000
+#define SATA_BASE_ADDR         0x10000000
 #else
 #error "CPU_TYPE not defined"
 #endif
@@ -93,6 +94,7 @@
 #define GPIO5_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000DC000)
 #define GPIO6_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000E0000)
 #define GPIO7_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000E4000)
+#define UART4_BASE_ADDR         (AIPS1_BASE_ADDR + 0x000F0000)
 #endif
 /*
  * AIPS 2
 #define VPU_BASE_ADDR          (AIPS2_BASE_ADDR + 0x000F4000)
 #define SAHARA_BASE_ADDR       (AIPS2_BASE_ADDR + 0x000F8000)
 
+#if defined(CONFIG_MX53)
+#define UART5_BASE_ADDR         (AIPS2_BASE_ADDR + 0x00090000)
+#endif
+
 /*
  * WEIM CSnGCR1
  */
@@ -485,6 +491,11 @@ struct iim_regs {
        } bank[4];
 };
 
+struct fuse_bank0_regs {
+       u32     fuse0_23[24];
+       u32     gp[8];
+};
+
 struct fuse_bank1_regs {
        u32     fuse0_8[9];
        u32     mac_addr[6];
index 760371b48f321147bb2588bf0a46d2f5011942c0..e3765a37e3db27e433852898f958693e97e5bde2 100644 (file)
@@ -66,8 +66,8 @@ typedef enum iomux_pad_config {
        PAD_CTL_HYS_ENABLE = 0x1 << 8,  /* Hysteresis enabled */
        PAD_CTL_DDR_INPUT_CMOS = 0x0 << 9,/* DDR input CMOS */
        PAD_CTL_DDR_INPUT_DDR = 0x1 << 9,/* DDR input DDR */
-       PAD_CTL_DRV_VOT_LOW = 0x0 << 13, /* Low voltage mode */
-       PAD_CTL_DRV_VOT_HIGH = 0x1 << 13,/* High voltage mode */
+       PAD_CTL_DRV_VOT_LOW = 0x1 << 13, /* Low voltage mode */
+       PAD_CTL_DRV_VOT_HIGH = 0x0 << 13,/* High voltage mode */
 } iomux_pad_config_t;
 
 /* various IOMUX input functions */
index 13d12ee1a445dbb76dc4d1494f338bd854e8b6e3..7b5246eea67fe61b4fc6db6aefe34f3f41b59b96 100644 (file)
@@ -35,5 +35,8 @@ void set_chipselect_size(int const);
  */
 
 int fecmxc_initialize(bd_t *bis);
+u32 get_ahb_clk(void);
+u32 get_periph_clk(void);
+char *get_reset_cause(void);
 
 #endif
diff --git a/arch/arm/include/asm/arch-mx6/ccm_regs.h b/arch/arm/include/asm/arch-mx6/ccm_regs.h
deleted file mode 100644 (file)
index 4af0b90..0000000
+++ /dev/null
@@ -1,892 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License 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
- *
- */
-
-#ifndef __ARCH_ARM_MACH_MX6_CCM_REGS_H__
-#define __ARCH_ARM_MACH_MX6_CCM_REGS_H__
-
-struct imx_ccm_reg {
-       u32 ccr;        /* 0x0000 */
-       u32 ccdr;
-       u32 csr;
-       u32 ccsr;
-       u32 cacrr;      /* 0x0010*/
-       u32 cbcdr;
-       u32 cbcmr;
-       u32 cscmr1;
-       u32 cscmr2;     /* 0x0020 */
-       u32 cscdr1;
-       u32 cs1cdr;
-       u32 cs2cdr;
-       u32 cdcdr;      /* 0x0030 */
-       u32 chscdr;
-       u32 cscdr2;
-       u32 cscdr3;
-       u32 cscdr4;     /* 0x0040 */
-       u32 resv0;
-       u32 cdhipr;
-       u32 cdcr;
-       u32 ctor;       /* 0x0050 */
-       u32 clpcr;
-       u32 cisr;
-       u32 cimr;
-       u32 ccosr;      /* 0x0060 */
-       u32 cgpr;
-       u32 CCGR0;
-       u32 CCGR1;
-       u32 CCGR2;      /* 0x0070 */
-       u32 CCGR3;
-       u32 CCGR4;
-       u32 CCGR5;
-       u32 CCGR6;      /* 0x0080 */
-       u32 CCGR7;
-       u32 cmeor;
-       u32 resv[0xfdd];
-       u32 analog_pll_sys;                     /* 0x4000 */
-       u32 analog_pll_sys_set;
-       u32 analog_pll_sys_clr;
-       u32 analog_pll_sys_tog;
-       u32 analog_usb1_pll_480_ctrl;           /* 0x4010 */
-       u32 analog_usb1_pll_480_ctrl_set;
-       u32 analog_usb1_pll_480_ctrl_clr;
-       u32 analog_usb1_pll_480_ctrl_tog;
-       u32 analog_reserved0[4];
-       u32 analog_pll_528;                     /* 0x4030 */
-       u32 analog_pll_528_set;
-       u32 analog_pll_528_clr;
-       u32 analog_pll_528_tog;
-       u32 analog_pll_528_ss;                  /* 0x4040 */
-       u32 analog_reserved1[3];
-       u32 analog_pll_528_num;                 /* 0x4050 */
-       u32 analog_reserved2[3];
-       u32 analog_pll_528_denom;               /* 0x4060 */
-       u32 analog_reserved3[3];
-       u32 analog_pll_audio;                   /* 0x4070 */
-       u32 analog_pll_audio_set;
-       u32 analog_pll_audio_clr;
-       u32 analog_pll_audio_tog;
-       u32 analog_pll_audio_num;               /* 0x4080*/
-       u32 analog_reserved4[3];
-       u32 analog_pll_audio_denom;             /* 0x4090 */
-       u32 analog_reserved5[3];
-       u32 analog_pll_video;                   /* 0x40a0 */
-       u32 analog_pll_video_set;
-       u32 analog_pll_video_clr;
-       u32 analog_pll_video_tog;
-       u32 analog_pll_video_num;               /* 0x40b0 */
-       u32 analog_reserved6[3];
-       u32 analog_pll_vedio_denon;             /* 0x40c0 */
-       u32 analog_reserved7[7];
-       u32 analog_pll_enet;                    /* 0x40e0 */
-       u32 analog_pll_enet_set;
-       u32 analog_pll_enet_clr;
-       u32 analog_pll_enet_tog;
-       u32 analog_pfd_480;                     /* 0x40f0 */
-       u32 analog_pfd_480_set;
-       u32 analog_pfd_480_clr;
-       u32 analog_pfd_480_tog;
-       u32 analog_pfd_528;                     /* 0x4100 */
-       u32 analog_pfd_528_set;
-       u32 analog_pfd_528_clr;
-       u32 analog_pfd_528_tog;
-};
-
-/* Define the bits in register CCR */
-#define MXC_CCM_CCR_RBC_EN                             (1 << 27)
-#define MXC_CCM_CCR_REG_BYPASS_CNT_MASK                        (0x3F << 21)
-#define MXC_CCM_CCR_REG_BYPASS_CNT_OFFSET              21
-#define MXC_CCM_CCR_WB_COUNT_MASK                      0x7
-#define MXC_CCM_CCR_WB_COUNT_OFFSET                    (1 << 16)
-#define MXC_CCM_CCR_COSC_EN                            (1 << 12)
-#define MXC_CCM_CCR_OSCNT_MASK                         0xFF
-#define MXC_CCM_CCR_OSCNT_OFFSET                       0
-
-/* Define the bits in register CCDR */
-#define MXC_CCM_CCDR_MMDC_CH1_HS_MASK                  (1 << 16)
-#define MXC_CCM_CCDR_MMDC_CH0_HS_MASK                  (1 << 17)
-
-/* Define the bits in register CSR */
-#define MXC_CCM_CSR_COSC_READY                         (1 << 5)
-#define MXC_CCM_CSR_REF_EN_B                           (1 << 0)
-
-/* Define the bits in register CCSR */
-#define MXC_CCM_CCSR_PDF_540M_AUTO_DIS                 (1 << 15)
-#define MXC_CCM_CCSR_PDF_720M_AUTO_DIS                 (1 << 14)
-#define MXC_CCM_CCSR_PDF_454M_AUTO_DIS                 (1 << 13)
-#define MXC_CCM_CCSR_PDF_508M_AUTO_DIS                 (1 << 12)
-#define MXC_CCM_CCSR_PDF_594M_AUTO_DIS                 (1 << 11)
-#define MXC_CCM_CCSR_PDF_352M_AUTO_DIS                 (1 << 10)
-#define MXC_CCM_CCSR_PDF_400M_AUTO_DIS                 (1 << 9)
-#define MXC_CCM_CCSR_STEP_SEL                          (1 << 8)
-#define MXC_CCM_CCSR_PLL1_SW_CLK_SEL                   (1 << 2)
-#define MXC_CCM_CCSR_PLL2_SW_CLK_SEL                   (1 << 1)
-#define MXC_CCM_CCSR_PLL3_SW_CLK_SEL                   (1 << 0)
-
-/* Define the bits in register CACRR */
-#define MXC_CCM_CACRR_ARM_PODF_OFFSET                  0
-#define MXC_CCM_CACRR_ARM_PODF_MASK                    0x7
-
-/* Define the bits in register CBCDR */
-#define MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK            (0x7 << 27)
-#define MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET          27
-#define MXC_CCM_CBCDR_PERIPH2_CLK2_SEL                 (1 << 26)
-#define MXC_CCM_CBCDR_PERIPH_CLK_SEL                   (1 << 25)
-#define MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK               (0x7 << 19)
-#define MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET             19
-#define MXC_CCM_CBCDR_AXI_PODF_MASK                    (0x7 << 16)
-#define MXC_CCM_CBCDR_AXI_PODF_OFFSET                  16
-#define MXC_CCM_CBCDR_AHB_PODF_MASK                    (0x7 << 10)
-#define MXC_CCM_CBCDR_AHB_PODF_OFFSET                  10
-#define MXC_CCM_CBCDR_IPG_PODF_MASK                    (0x3 << 8)
-#define MXC_CCM_CBCDR_IPG_PODF_OFFSET                  8
-#define MXC_CCM_CBCDR_AXI_ALT_SEL                      (1 << 7)
-#define MXC_CCM_CBCDR_AXI_SEL                          (1 << 6)
-#define MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK               (0x7 << 3)
-#define MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET             3
-#define MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_MASK           (0x7 << 0)
-#define MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_OFFSET         0
-
-/* Define the bits in register CBCMR */
-#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK           (0x7 << 29)
-#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET         29
-#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK             (0x7 << 26)
-#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET           26
-#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK             (0x7 << 23)
-#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET           23
-#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK         (0x3 << 21)
-#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET       21
-#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK2_SEL             (1 << 20)
-#define MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK          (0x3 << 18)
-#define MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET                18
-#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK               (0x3 << 16)
-#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET             16
-#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK             (0x3 << 14)
-#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET           14
-#define MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK             (0x3 << 12)
-#define MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET           12
-#define MXC_CCM_CBCMR_VDOAXI_CLK_SEL                   (1 << 11)
-#define MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL                 (1 << 10)
-#define MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK                (0x3 << 8)
-#define MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET      8
-#define MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK          (0x3 << 4)
-#define MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET                4
-#define MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL                        (1 << 1)
-#define MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL                        (1 << 0)
-
-/* Define the bits in register CSCMR1 */
-#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK              (0x3 << 29)
-#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET            29
-#define MXC_CCM_CSCMR1_ACLK_EMI_MASK                   (0x3 << 27)
-#define MXC_CCM_CSCMR1_ACLK_EMI_OFFSET                 27
-#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK         (0x7 << 23)
-#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET       23
-#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK              (0x7 << 20)
-#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET            20
-#define MXC_CCM_CSCMR1_USDHC4_CLK_SEL                  (1 << 19)
-#define MXC_CCM_CSCMR1_USDHC3_CLK_SEL                  (1 << 18)
-#define MXC_CCM_CSCMR1_USDHC2_CLK_SEL                  (1 << 17)
-#define MXC_CCM_CSCMR1_USDHC1_CLK_SEL                  (1 << 16)
-#define MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK               (0x3 << 14)
-#define MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET             14
-#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK               (0x3 << 12)
-#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET             12
-#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK               (0x3 << 10)
-#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET             10
-#define MXC_CCM_CSCMR1_PERCLK_PODF_MASK                        0x3F
-
-/* Define the bits in register CSCMR2 */
-#define MXC_CCM_CSCMR2_ESAI_PRE_SEL_MASK               (0x3 << 19)
-#define MXC_CCM_CSCMR2_ESAI_PRE_SEL_OFFSET             19
-#define MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV                 (1 << 11)
-#define MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV                 (1 << 10)
-#define MXC_CCM_CSCMR2_CAN_CLK_SEL_MASK                        (0x3F << 2)
-#define MXC_CCM_CSCMR2_CAN_CLK_SEL_OFFSET              2
-
-/* Define the bits in register CSCDR1 */
-#define MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK               (0x7 << 25)
-#define MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET             25
-#define MXC_CCM_CSCDR1_USDHC4_PODF_MASK                        (0x7 << 22)
-#define MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET              22
-#define MXC_CCM_CSCDR1_USDHC3_PODF_MASK                        (0x7 << 19)
-#define MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET              19
-#define MXC_CCM_CSCDR1_USDHC2_PODF_MASK                        (0x7 << 16)
-#define MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET              16
-#define MXC_CCM_CSCDR1_USDHC1_PODF_MASK                        (0x7 << 11)
-#define MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET              11
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_OFFSET          8
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK            (0x7 << 8)
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_OFFSET          6
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK            (0x3 << 6)
-#define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK              0x3F
-#define MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET            0
-
-/* Define the bits in register CS1CDR */
-#define MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK              (0x3F << 25)
-#define MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET            25
-#define MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK              (0x3F << 16)
-#define MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET            16
-#define MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK              (0x3 << 9)
-#define MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET            9
-#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK              (0x7 << 6)
-#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET            6
-#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK              0x3F
-#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET            0
-
-/* Define the bits in register CS2CDR */
-#define MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK              (0x3F << 21)
-#define MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET            21
-#define MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK              (0x7 << 18)
-#define MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET            18
-#define MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK               (0x3 << 16)
-#define MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET             16
-#define MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK            (0x7 << 12)
-#define MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET          12
-#define MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK            (0x7 << 9)
-#define MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET          9
-#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK              (0x7 << 6)
-#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET            6
-#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK              0x3F
-#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET            0
-
-/* Define the bits in register CDCDR */
-#define MXC_CCM_CDCDR_HSI_TX_PODF_MASK                 (0x7 << 29)
-#define MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET               29
-#define MXC_CCM_CDCDR_HSI_TX_CLK_SEL                   (1 << 28)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK             (0x7 << 25)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET           25
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK             (0x7 << 19)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET           19
-#define MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK              (0x3 << 20)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET            20
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK             (0x7 << 12)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET           12
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK             (0x7 << 9)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET           9
-#define MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK              (0x3 << 7)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET            7
-
-/* Define the bits in register CHSCCDR */
-#define MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK      (0x7 << 15)
-#define MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET    15
-#define MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK             (0x7 << 12)
-#define MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET           12
-#define MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK          (0x7 << 9)
-#define MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET                9
-#define MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK      (0x7 << 6)
-#define MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET    6
-#define MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK             (0x7 << 3)
-#define MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET           3
-#define MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK          (0x7)
-#define MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET                0
-
-/* Define the bits in register CSCDR2 */
-#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_MASK             (0x3F << 19)
-#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET           19
-#define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_MASK      (0x7 << 15)
-#define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_OFFSET    15
-#define MXC_CCM_CHSCCDR_IPU2_DI1_PODF_MASK             (0x7 << 12)
-#define MXC_CCM_CHSCCDR_IPU2_DI1_PODF_OFFSET           12
-#define MXC_CCM_CHSCCDR_IPU2_DI1_CLK_SEL_MASK          (0x7 << 9)
-#define MXC_CCM_CHSCCDR_IPU2_DI1_CLK_SEL_OFFSET                9
-#define MXC_CCM_CHSCCDR_IPU2_DI0_PRE_CLK_SEL_MASK      (0x7 << 6)
-#define MXC_CCM_CHSCCDR_IPU2_DI0_PRE_CLK_SEL_OFFSET    6
-#define MXC_CCM_CHSCCDR_IPU2_DI0_PODF_MASK             (0x7 << 3)
-#define MXC_CCM_CHSCCDR_IPU2_DI0_PODF_OFFSET           3
-#define MXC_CCM_CHSCCDR_IPU2_DI0_CLK_SEL_MASK          0x7
-#define MXC_CCM_CHSCCDR_IPU2_DI0_CLK_SEL_OFFSET                0
-
-/* Define the bits in register CSCDR3 */
-#define MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK              (0x7 << 16)
-#define MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET            16
-#define MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK           (0x3 << 14)
-#define MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET         14
-#define MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK              (0x7 << 11)
-#define MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET            11
-#define MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK           (0x3 << 9)
-#define MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET         9
-
-/* Define the bits in register CDHIPR */
-#define MXC_CCM_CDHIPR_ARM_PODF_BUSY                   (1 << 16)
-#define MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY             (1 << 5)
-#define MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY              (1 << 4)
-#define MXC_CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY            (1 << 3)
-#define MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY              (1 << 2)
-#define MXC_CCM_CDHIPR_AHB_PODF_BUSY                   (1 << 1)
-#define MXC_CCM_CDHIPR_AXI_PODF_BUSY                   1
-
-/* Define the bits in register CLPCR */
-#define MXC_CCM_CLPCR_MASK_L2CC_IDLE                   (1 << 27)
-#define MXC_CCM_CLPCR_MASK_SCU_IDLE                    (1 << 26)
-#define MXC_CCM_CLPCR_MASK_CORE3_WFI                   (1 << 25)
-#define MXC_CCM_CLPCR_MASK_CORE2_WFI                   (1 << 24)
-#define MXC_CCM_CLPCR_MASK_CORE1_WFI                   (1 << 23)
-#define MXC_CCM_CLPCR_MASK_CORE0_WFI                   (1 << 22)
-#define MXC_CCM_CLPCR_BYP_MMDC_CH1_LPM_HS              (1 << 21)
-#define MXC_CCM_CLPCR_BYP_MMDC_CH0_LPM_HS              (1 << 19)
-#define MXC_CCM_CLPCR_WB_CORE_AT_LPM                   (1 << 17)
-#define MXC_CCM_CLPCR_WB_PER_AT_LPM                    (1 << 17)
-#define MXC_CCM_CLPCR_COSC_PWRDOWN                     (1 << 11)
-#define MXC_CCM_CLPCR_STBY_COUNT_MASK                  (0x3 << 9)
-#define MXC_CCM_CLPCR_STBY_COUNT_OFFSET                        9
-#define MXC_CCM_CLPCR_VSTBY                            (1 << 8)
-#define MXC_CCM_CLPCR_DIS_REF_OSC                      (1 << 7)
-#define MXC_CCM_CLPCR_SBYOS                            (1 << 6)
-#define MXC_CCM_CLPCR_ARM_CLK_DIS_ON_LPM               (1 << 5)
-#define MXC_CCM_CLPCR_LPSR_CLK_SEL_MASK                        (0x3 << 3)
-#define MXC_CCM_CLPCR_LPSR_CLK_SEL_OFFSET              3
-#define MXC_CCM_CLPCR_BYPASS_PMIC_VFUNC_READY          (1 << 2)
-#define MXC_CCM_CLPCR_LPM_MASK                         0x3
-#define MXC_CCM_CLPCR_LPM_OFFSET                       0
-
-/* Define the bits in register CISR */
-#define MXC_CCM_CISR_ARM_PODF_LOADED                   (1 << 26)
-#define MXC_CCM_CISR_MMDC_CH0_PODF_LOADED              (1 << 23)
-#define MXC_CCM_CISR_PERIPH_CLK_SEL_LOADED             (1 << 22)
-#define MXC_CCM_CISR_MMDC_CH1_PODF_LOADED              (1 << 21)
-#define MXC_CCM_CISR_AHB_PODF_LOADED                   (1 << 20)
-#define MXC_CCM_CISR_PERIPH2_CLK_SEL_LOADED            (1 << 19)
-#define MXC_CCM_CISR_AXI_PODF_LOADED                   (1 << 17)
-#define MXC_CCM_CISR_COSC_READY                                (1 << 6)
-#define MXC_CCM_CISR_LRF_PLL                           1
-
-/* Define the bits in register CIMR */
-#define MXC_CCM_CIMR_MASK_ARM_PODF_LOADED              (1 << 26)
-#define MXC_CCM_CIMR_MASK_MMDC_CH0_PODF_LOADED         (1 << 23)
-#define MXC_CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED                (1 << 22)
-#define MXC_CCM_CIMR_MASK_MMDC_CH1_PODF_LOADED         (1 << 21)
-#define MXC_CCM_CIMR_MASK_AHB_PODF_LOADED              (1 << 20)
-#define MXC_CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED       (1 << 22)
-#define MXC_CCM_CIMR_MASK_AXI_PODF_LOADED              (1 << 17)
-#define MXC_CCM_CIMR_MASK_COSC_READY                   (1 << 6)
-#define MXC_CCM_CIMR_MASK_LRF_PLL                      1
-
-/* Define the bits in register CCOSR */
-#define MXC_CCM_CCOSR_CKO2_EN_OFFSET                   (1 << 24)
-#define MXC_CCM_CCOSR_CKO2_DIV_MASK                    (0x7 << 21)
-#define MXC_CCM_CCOSR_CKO2_DIV_OFFSET                  21
-#define MXC_CCM_CCOSR_CKO2_SEL_OFFSET                  16
-#define MXC_CCM_CCOSR_CKO2_SEL_MASK                    (0x1F << 16)
-#define MXC_CCM_CCOSR_CKOL_EN                          (0x1 << 7)
-#define MXC_CCM_CCOSR_CKOL_DIV_MASK                    (0x7 << 4)
-#define MXC_CCM_CCOSR_CKOL_DIV_OFFSET                  4
-#define MXC_CCM_CCOSR_CKOL_SEL_MASK                    0xF
-#define MXC_CCM_CCOSR_CKOL_SEL_OFFSET                  0
-
-/* Define the bits in registers CGPR */
-#define MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE            (1 << 4)
-#define MXC_CCM_CGPR_MMDC_EXT_CLK_DIS                  (1 << 2)
-#define MXC_CCM_CGPR_PMIC_DELAY_SCALER                 1
-
-/* Define the bits in registers CCGRx */
-#define MXC_CCM_CCGR_CG_MASK                           3
-
-#define MXC_CCM_CCGR0_CG15_OFFSET                      30
-#define MXC_CCM_CCGR0_CG15_MASK                        (0x3 << 30)
-#define MXC_CCM_CCGR0_CG14_OFFSET                      28
-#define MXC_CCM_CCGR0_CG14_MASK                        (0x3 << 28)
-#define MXC_CCM_CCGR0_CG13_OFFSET                      26
-#define MXC_CCM_CCGR0_CG13_MASK                        (0x3 << 26)
-#define MXC_CCM_CCGR0_CG12_OFFSET                      24
-#define MXC_CCM_CCGR0_CG12_MASK                        (0x3 << 24)
-#define MXC_CCM_CCGR0_CG11_OFFSET                      22
-#define MXC_CCM_CCGR0_CG11_MASK                        (0x3 << 22)
-#define MXC_CCM_CCGR0_CG10_OFFSET                      20
-#define MXC_CCM_CCGR0_CG10_MASK                        (0x3 << 20)
-#define MXC_CCM_CCGR0_CG9_OFFSET                       18
-#define MXC_CCM_CCGR0_CG9_MASK                 (0x3 << 18)
-#define MXC_CCM_CCGR0_CG8_OFFSET                       16
-#define MXC_CCM_CCGR0_CG8_MASK                 (0x3 << 16)
-#define MXC_CCM_CCGR0_CG7_OFFSET                       14
-#define MXC_CCM_CCGR0_CG6_OFFSET                       12
-#define MXC_CCM_CCGR0_CG5_OFFSET                       10
-#define MXC_CCM_CCGR0_CG5_MASK                 (0x3 << 10)
-#define MXC_CCM_CCGR0_CG4_OFFSET                       8
-#define MXC_CCM_CCGR0_CG4_MASK                 (0x3 << 8)
-#define MXC_CCM_CCGR0_CG3_OFFSET                       6
-#define MXC_CCM_CCGR0_CG3_MASK                 (0x3 << 6)
-#define MXC_CCM_CCGR0_CG2_OFFSET                       4
-#define MXC_CCM_CCGR0_CG2_MASK                 (0x3 << 4)
-#define MXC_CCM_CCGR0_CG1_OFFSET                       2
-#define MXC_CCM_CCGR0_CG1_MASK                 (0x3 << 2)
-#define MXC_CCM_CCGR0_CG0_OFFSET                       0
-#define MXC_CCM_CCGR0_CG0_MASK                         3
-
-#define MXC_CCM_CCGR1_CG15_OFFSET                      30
-#define MXC_CCM_CCGR1_CG14_OFFSET                      28
-#define MXC_CCM_CCGR1_CG13_OFFSET                      26
-#define MXC_CCM_CCGR1_CG12_OFFSET                      24
-#define MXC_CCM_CCGR1_CG11_OFFSET                      22
-#define MXC_CCM_CCGR1_CG10_OFFSET                      20
-#define MXC_CCM_CCGR1_CG9_OFFSET                       18
-#define MXC_CCM_CCGR1_CG8_OFFSET                       16
-#define MXC_CCM_CCGR1_CG7_OFFSET                       14
-#define MXC_CCM_CCGR1_CG6_OFFSET                       12
-#define MXC_CCM_CCGR1_CG5_OFFSET                       10
-#define MXC_CCM_CCGR1_CG4_OFFSET                       8
-#define MXC_CCM_CCGR1_CG3_OFFSET                       6
-#define MXC_CCM_CCGR1_CG2_OFFSET                       4
-#define MXC_CCM_CCGR1_CG1_OFFSET                       2
-#define MXC_CCM_CCGR1_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR2_CG15_OFFSET                      30
-#define MXC_CCM_CCGR2_CG14_OFFSET                      28
-#define MXC_CCM_CCGR2_CG13_OFFSET                      26
-#define MXC_CCM_CCGR2_CG12_OFFSET                      24
-#define MXC_CCM_CCGR2_CG11_OFFSET                      22
-#define MXC_CCM_CCGR2_CG10_OFFSET                      20
-#define MXC_CCM_CCGR2_CG9_OFFSET                       18
-#define MXC_CCM_CCGR2_CG8_OFFSET                       16
-#define MXC_CCM_CCGR2_CG7_OFFSET                       14
-#define MXC_CCM_CCGR2_CG6_OFFSET                       12
-#define MXC_CCM_CCGR2_CG5_OFFSET                       10
-#define MXC_CCM_CCGR2_CG4_OFFSET                       8
-#define MXC_CCM_CCGR2_CG3_OFFSET                       6
-#define MXC_CCM_CCGR2_CG2_OFFSET                       4
-#define MXC_CCM_CCGR2_CG1_OFFSET                       2
-#define MXC_CCM_CCGR2_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR3_CG15_OFFSET                      30
-#define MXC_CCM_CCGR3_CG14_OFFSET                      28
-#define MXC_CCM_CCGR3_CG13_OFFSET                      26
-#define MXC_CCM_CCGR3_CG12_OFFSET                      24
-#define MXC_CCM_CCGR3_CG11_OFFSET                      22
-#define MXC_CCM_CCGR3_CG10_OFFSET                      20
-#define MXC_CCM_CCGR3_CG9_OFFSET                       18
-#define MXC_CCM_CCGR3_CG8_OFFSET                       16
-#define MXC_CCM_CCGR3_CG7_OFFSET                       14
-#define MXC_CCM_CCGR3_CG6_OFFSET                       12
-#define MXC_CCM_CCGR3_CG5_OFFSET                       10
-#define MXC_CCM_CCGR3_CG4_OFFSET                       8
-#define MXC_CCM_CCGR3_CG3_OFFSET                       6
-#define MXC_CCM_CCGR3_CG2_OFFSET                       4
-#define MXC_CCM_CCGR3_CG1_OFFSET                       2
-#define MXC_CCM_CCGR3_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR4_CG15_OFFSET                      30
-#define MXC_CCM_CCGR4_CG14_OFFSET                      28
-#define MXC_CCM_CCGR4_CG13_OFFSET                      26
-#define MXC_CCM_CCGR4_CG12_OFFSET                      24
-#define MXC_CCM_CCGR4_CG11_OFFSET                      22
-#define MXC_CCM_CCGR4_CG10_OFFSET                      20
-#define MXC_CCM_CCGR4_CG9_OFFSET                       18
-#define MXC_CCM_CCGR4_CG8_OFFSET                       16
-#define MXC_CCM_CCGR4_CG7_OFFSET                       14
-#define MXC_CCM_CCGR4_CG6_OFFSET                       12
-#define MXC_CCM_CCGR4_CG5_OFFSET                       10
-#define MXC_CCM_CCGR4_CG4_OFFSET                       8
-#define MXC_CCM_CCGR4_CG3_OFFSET                       6
-#define MXC_CCM_CCGR4_CG2_OFFSET                       4
-#define MXC_CCM_CCGR4_CG1_OFFSET                       2
-#define MXC_CCM_CCGR4_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR5_CG15_OFFSET                      30
-#define MXC_CCM_CCGR5_CG14_OFFSET                      28
-#define MXC_CCM_CCGR5_CG14_MASK                        (0x3 << 28)
-#define MXC_CCM_CCGR5_CG13_OFFSET                      26
-#define MXC_CCM_CCGR5_CG13_MASK                        (0x3 << 26)
-#define MXC_CCM_CCGR5_CG12_OFFSET                      24
-#define MXC_CCM_CCGR5_CG12_MASK                        (0x3 << 24)
-#define MXC_CCM_CCGR5_CG11_OFFSET                      22
-#define MXC_CCM_CCGR5_CG11_MASK                        (0x3 << 22)
-#define MXC_CCM_CCGR5_CG10_OFFSET                      20
-#define MXC_CCM_CCGR5_CG10_MASK                        (0x3 << 20)
-#define MXC_CCM_CCGR5_CG9_OFFSET                       18
-#define MXC_CCM_CCGR5_CG9_MASK                 (0x3 << 18)
-#define MXC_CCM_CCGR5_CG8_OFFSET                       16
-#define MXC_CCM_CCGR5_CG8_MASK                 (0x3 << 16)
-#define MXC_CCM_CCGR5_CG7_OFFSET                       14
-#define MXC_CCM_CCGR5_CG7_MASK                 (0x3 << 14)
-#define MXC_CCM_CCGR5_CG6_OFFSET                       12
-#define MXC_CCM_CCGR5_CG6_MASK                 (0x3 << 12)
-#define MXC_CCM_CCGR5_CG5_OFFSET                       10
-#define MXC_CCM_CCGR5_CG4_OFFSET                       8
-#define MXC_CCM_CCGR5_CG3_OFFSET                       6
-#define MXC_CCM_CCGR5_CG2_OFFSET                       4
-#define MXC_CCM_CCGR5_CG2_MASK                 (0x3 << 4)
-#define MXC_CCM_CCGR5_CG1_OFFSET                       2
-#define MXC_CCM_CCGR5_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR6_CG15_OFFSET                      30
-#define MXC_CCM_CCGR6_CG14_OFFSET                      28
-#define MXC_CCM_CCGR6_CG14_MASK                        (0x3 << 28)
-#define MXC_CCM_CCGR6_CG13_OFFSET                      26
-#define MXC_CCM_CCGR6_CG13_MASK                        (0x3 << 26)
-#define MXC_CCM_CCGR6_CG12_OFFSET                      24
-#define MXC_CCM_CCGR6_CG12_MASK                        (0x3 << 24)
-#define MXC_CCM_CCGR6_CG11_OFFSET                      22
-#define MXC_CCM_CCGR6_CG11_MASK                        (0x3 << 22)
-#define MXC_CCM_CCGR6_CG10_OFFSET                      20
-#define MXC_CCM_CCGR6_CG10_MASK                        (0x3 << 20)
-#define MXC_CCM_CCGR6_CG9_OFFSET                       18
-#define MXC_CCM_CCGR6_CG9_MASK                 (0x3 << 18)
-#define MXC_CCM_CCGR6_CG8_OFFSET                       16
-#define MXC_CCM_CCGR6_CG8_MASK                 (0x3 << 16)
-#define MXC_CCM_CCGR6_CG7_OFFSET                       14
-#define MXC_CCM_CCGR6_CG7_MASK                 (0x3 << 14)
-#define MXC_CCM_CCGR6_CG6_OFFSET                       12
-#define MXC_CCM_CCGR6_CG6_MASK                 (0x3 << 12)
-#define MXC_CCM_CCGR6_CG5_OFFSET                       10
-#define MXC_CCM_CCGR6_CG4_OFFSET                       8
-#define MXC_CCM_CCGR6_CG3_OFFSET                       6
-#define MXC_CCM_CCGR6_CG2_OFFSET                       4
-#define MXC_CCM_CCGR6_CG2_MASK                 (0x3 << 4)
-#define MXC_CCM_CCGR6_CG1_OFFSET                       2
-#define MXC_CCM_CCGR6_CG0_OFFSET                       0
-
-#define MXC_CCM_CCGR7_CG15_OFFSET                      30
-#define MXC_CCM_CCGR7_CG14_OFFSET                      28
-#define MXC_CCM_CCGR7_CG14_MASK                        (0x3 << 28)
-#define MXC_CCM_CCGR7_CG13_OFFSET                      26
-#define MXC_CCM_CCGR7_CG13_MASK                        (0x3 << 26)
-#define MXC_CCM_CCGR7_CG12_OFFSET                      24
-#define MXC_CCM_CCGR7_CG12_MASK                        (0x3 << 24)
-#define MXC_CCM_CCGR7_CG11_OFFSET                      22
-#define MXC_CCM_CCGR7_CG11_MASK                        (0x3 << 22)
-#define MXC_CCM_CCGR7_CG10_OFFSET                      20
-#define MXC_CCM_CCGR7_CG10_MASK                        (0x3 << 20)
-#define MXC_CCM_CCGR7_CG9_OFFSET                       18
-#define MXC_CCM_CCGR7_CG9_MASK                 (0x3 << 18)
-#define MXC_CCM_CCGR7_CG8_OFFSET                       16
-#define MXC_CCM_CCGR7_CG8_MASK                 (0x3 << 16)
-#define MXC_CCM_CCGR7_CG7_OFFSET                       14
-#define MXC_CCM_CCGR7_CG7_MASK                 (0x3 << 14)
-#define MXC_CCM_CCGR7_CG6_OFFSET                       12
-#define MXC_CCM_CCGR7_CG6_MASK                 (0x3 << 12)
-#define MXC_CCM_CCGR7_CG5_OFFSET                       10
-#define MXC_CCM_CCGR7_CG4_OFFSET                       8
-#define MXC_CCM_CCGR7_CG3_OFFSET                       6
-#define MXC_CCM_CCGR7_CG2_OFFSET                       4
-#define MXC_CCM_CCGR7_CG2_MASK                 (0x3 << 4)
-#define MXC_CCM_CCGR7_CG1_OFFSET                       2
-#define MXC_CCM_CCGR7_CG0_OFFSET                       0
-#define BM_ANADIG_PLL_SYS_LOCK 0x80000000
-#define BP_ANADIG_PLL_SYS_RSVD0      20
-#define BM_ANADIG_PLL_SYS_RSVD0 0x7FF00000
-#define BF_ANADIG_PLL_SYS_RSVD0(v)  \
-       (((v) << 20) & BM_ANADIG_PLL_SYS_RSVD0)
-#define BM_ANADIG_PLL_SYS_PLL_SEL 0x00080000
-#define BM_ANADIG_PLL_SYS_LVDS_24MHZ_SEL 0x00040000
-#define BM_ANADIG_PLL_SYS_LVDS_SEL 0x00020000
-#define BM_ANADIG_PLL_SYS_BYPASS 0x00010000
-#define BP_ANADIG_PLL_SYS_BYPASS_CLK_SRC      14
-#define BM_ANADIG_PLL_SYS_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_PLL_SYS_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_PLL_SYS_BYPASS_CLK_SRC)
-#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_PLL_SYS_ENABLE 0x00002000
-#define BM_ANADIG_PLL_SYS_POWERDOWN 0x00001000
-#define BM_ANADIG_PLL_SYS_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_PLL_SYS_DOUBLE_CP 0x00000400
-#define BM_ANADIG_PLL_SYS_HALF_CP 0x00000200
-#define BM_ANADIG_PLL_SYS_DOUBLE_LF 0x00000100
-#define BM_ANADIG_PLL_SYS_HALF_LF 0x00000080
-#define BP_ANADIG_PLL_SYS_DIV_SELECT      0
-#define BM_ANADIG_PLL_SYS_DIV_SELECT 0x0000007F
-#define BF_ANADIG_PLL_SYS_DIV_SELECT(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_SYS_DIV_SELECT)
-
-#define BM_ANADIG_USB1_PLL_480_CTRL_LOCK 0x80000000
-#define BP_ANADIG_USB1_PLL_480_CTRL_RSVD1      17
-#define BM_ANADIG_USB1_PLL_480_CTRL_RSVD1 0x7FFE0000
-#define BF_ANADIG_USB1_PLL_480_CTRL_RSVD1(v)  \
-       (((v) << 17) & BM_ANADIG_USB1_PLL_480_CTRL_RSVD1)
-#define BM_ANADIG_USB1_PLL_480_CTRL_BYPASS 0x00010000
-#define BP_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC      14
-#define BM_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC)
-#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_USB1_PLL_480_CTRL_ENABLE 0x00002000
-#define BM_ANADIG_USB1_PLL_480_CTRL_POWER 0x00001000
-#define BM_ANADIG_USB1_PLL_480_CTRL_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_USB1_PLL_480_CTRL_DOUBLE_CP 0x00000400
-#define BM_ANADIG_USB1_PLL_480_CTRL_HALF_CP 0x00000200
-#define BM_ANADIG_USB1_PLL_480_CTRL_DOUBLE_LF 0x00000100
-#define BM_ANADIG_USB1_PLL_480_CTRL_HALF_LF 0x00000080
-#define BM_ANADIG_USB1_PLL_480_CTRL_EN_USB_CLKS 0x00000040
-#define BM_ANADIG_USB1_PLL_480_CTRL_RSVD0 0x00000020
-#define BP_ANADIG_USB1_PLL_480_CTRL_CONTROL0      2
-#define BM_ANADIG_USB1_PLL_480_CTRL_CONTROL0 0x0000001C
-#define BF_ANADIG_USB1_PLL_480_CTRL_CONTROL0(v)  \
-       (((v) << 2) & BM_ANADIG_USB1_PLL_480_CTRL_CONTROL0)
-#define BP_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT      0
-#define BM_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT 0x00000003
-#define BF_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT(v)  \
-       (((v) << 0) & BM_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT)
-
-#define BM_ANADIG_PLL_528_LOCK 0x80000000
-#define BP_ANADIG_PLL_528_RSVD1      19
-#define BM_ANADIG_PLL_528_RSVD1 0x7FF80000
-#define BF_ANADIG_PLL_528_RSVD1(v)  \
-       (((v) << 19) & BM_ANADIG_PLL_528_RSVD1)
-#define BM_ANADIG_PLL_528_PFD_OFFSET_EN 0x00040000
-#define BM_ANADIG_PLL_528_DITHER_ENABLE 0x00020000
-#define BM_ANADIG_PLL_528_BYPASS 0x00010000
-#define BP_ANADIG_PLL_528_BYPASS_CLK_SRC      14
-#define BM_ANADIG_PLL_528_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_PLL_528_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_PLL_528_BYPASS_CLK_SRC)
-#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_PLL_528_ENABLE 0x00002000
-#define BM_ANADIG_PLL_528_POWERDOWN 0x00001000
-#define BM_ANADIG_PLL_528_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_PLL_528_DOUBLE_CP 0x00000400
-#define BM_ANADIG_PLL_528_HALF_CP 0x00000200
-#define BM_ANADIG_PLL_528_DOUBLE_LF 0x00000100
-#define BM_ANADIG_PLL_528_HALF_LF 0x00000080
-#define BP_ANADIG_PLL_528_RSVD0      1
-#define BM_ANADIG_PLL_528_RSVD0 0x0000007E
-#define BF_ANADIG_PLL_528_RSVD0(v)  \
-       (((v) << 1) & BM_ANADIG_PLL_528_RSVD0)
-#define BM_ANADIG_PLL_528_DIV_SELECT 0x00000001
-
-#define BP_ANADIG_PLL_528_SS_STOP      16
-#define BM_ANADIG_PLL_528_SS_STOP 0xFFFF0000
-#define BF_ANADIG_PLL_528_SS_STOP(v) \
-       (((v) << 16) & BM_ANADIG_PLL_528_SS_STOP)
-#define BM_ANADIG_PLL_528_SS_ENABLE 0x00008000
-#define BP_ANADIG_PLL_528_SS_STEP      0
-#define BM_ANADIG_PLL_528_SS_STEP 0x00007FFF
-#define BF_ANADIG_PLL_528_SS_STEP(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_528_SS_STEP)
-
-#define BP_ANADIG_PLL_528_NUM_RSVD0      30
-#define BM_ANADIG_PLL_528_NUM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_528_NUM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_528_NUM_RSVD0)
-#define BP_ANADIG_PLL_528_NUM_A      0
-#define BM_ANADIG_PLL_528_NUM_A 0x3FFFFFFF
-#define BF_ANADIG_PLL_528_NUM_A(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_528_NUM_A)
-
-#define BP_ANADIG_PLL_528_DENOM_RSVD0      30
-#define BM_ANADIG_PLL_528_DENOM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_528_DENOM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_528_DENOM_RSVD0)
-#define BP_ANADIG_PLL_528_DENOM_B      0
-#define BM_ANADIG_PLL_528_DENOM_B 0x3FFFFFFF
-#define BF_ANADIG_PLL_528_DENOM_B(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_528_DENOM_B)
-
-#define BM_ANADIG_PLL_AUDIO_LOCK 0x80000000
-#define BP_ANADIG_PLL_AUDIO_RSVD0      22
-#define BM_ANADIG_PLL_AUDIO_RSVD0 0x7FC00000
-#define BF_ANADIG_PLL_AUDIO_RSVD0(v)  \
-       (((v) << 22) & BM_ANADIG_PLL_AUDIO_RSVD0)
-#define BM_ANADIG_PLL_AUDIO_SSC_EN 0x00200000
-#define BP_ANADIG_PLL_AUDIO_TEST_DIV_SELECT      19
-#define BM_ANADIG_PLL_AUDIO_TEST_DIV_SELECT 0x00180000
-#define BF_ANADIG_PLL_AUDIO_TEST_DIV_SELECT(v)  \
-       (((v) << 19) & BM_ANADIG_PLL_AUDIO_TEST_DIV_SELECT)
-#define BM_ANADIG_PLL_AUDIO_PFD_OFFSET_EN 0x00040000
-#define BM_ANADIG_PLL_AUDIO_DITHER_ENABLE 0x00020000
-#define BM_ANADIG_PLL_AUDIO_BYPASS 0x00010000
-#define BP_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC      14
-#define BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC)
-#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_PLL_AUDIO_ENABLE 0x00002000
-#define BM_ANADIG_PLL_AUDIO_POWERDOWN 0x00001000
-#define BM_ANADIG_PLL_AUDIO_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_PLL_AUDIO_DOUBLE_CP 0x00000400
-#define BM_ANADIG_PLL_AUDIO_HALF_CP 0x00000200
-#define BM_ANADIG_PLL_AUDIO_DOUBLE_LF 0x00000100
-#define BM_ANADIG_PLL_AUDIO_HALF_LF 0x00000080
-#define BP_ANADIG_PLL_AUDIO_DIV_SELECT      0
-#define BM_ANADIG_PLL_AUDIO_DIV_SELECT 0x0000007F
-#define BF_ANADIG_PLL_AUDIO_DIV_SELECT(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_AUDIO_DIV_SELECT)
-
-#define BP_ANADIG_PLL_AUDIO_NUM_RSVD0      30
-#define BM_ANADIG_PLL_AUDIO_NUM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_AUDIO_NUM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_AUDIO_NUM_RSVD0)
-#define BP_ANADIG_PLL_AUDIO_NUM_A      0
-#define BM_ANADIG_PLL_AUDIO_NUM_A 0x3FFFFFFF
-#define BF_ANADIG_PLL_AUDIO_NUM_A(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_AUDIO_NUM_A)
-
-#define BP_ANADIG_PLL_AUDIO_DENOM_RSVD0      30
-#define BM_ANADIG_PLL_AUDIO_DENOM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_AUDIO_DENOM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_AUDIO_DENOM_RSVD0)
-#define BP_ANADIG_PLL_AUDIO_DENOM_B      0
-#define BM_ANADIG_PLL_AUDIO_DENOM_B 0x3FFFFFFF
-#define BF_ANADIG_PLL_AUDIO_DENOM_B(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_AUDIO_DENOM_B)
-
-#define BM_ANADIG_PLL_VIDEO_LOCK 0x80000000
-#define BP_ANADIG_PLL_VIDEO_RSVD0      22
-#define BM_ANADIG_PLL_VIDEO_RSVD0 0x7FC00000
-#define BF_ANADIG_PLL_VIDEO_RSVD0(v)  \
-       (((v) << 22) & BM_ANADIG_PLL_VIDEO_RSVD0)
-#define BM_ANADIG_PLL_VIDEO_SSC_EN 0x00200000
-#define BP_ANADIG_PLL_VIDEO_TEST_DIV_SELECT      19
-#define BM_ANADIG_PLL_VIDEO_TEST_DIV_SELECT 0x00180000
-#define BF_ANADIG_PLL_VIDEO_TEST_DIV_SELECT(v)  \
-       (((v) << 19) & BM_ANADIG_PLL_VIDEO_TEST_DIV_SELECT)
-#define BM_ANADIG_PLL_VIDEO_PFD_OFFSET_EN 0x00040000
-#define BM_ANADIG_PLL_VIDEO_DITHER_ENABLE 0x00020000
-#define BM_ANADIG_PLL_VIDEO_BYPASS 0x00010000
-#define BP_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC      14
-#define BM_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC)
-#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_PLL_VIDEO_ENABLE 0x00002000
-#define BM_ANADIG_PLL_VIDEO_POWERDOWN 0x00001000
-#define BM_ANADIG_PLL_VIDEO_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_PLL_VIDEO_DOUBLE_CP 0x00000400
-#define BM_ANADIG_PLL_VIDEO_HALF_CP 0x00000200
-#define BM_ANADIG_PLL_VIDEO_DOUBLE_LF 0x00000100
-#define BM_ANADIG_PLL_VIDEO_HALF_LF 0x00000080
-#define BP_ANADIG_PLL_VIDEO_DIV_SELECT      0
-#define BM_ANADIG_PLL_VIDEO_DIV_SELECT 0x0000007F
-#define BF_ANADIG_PLL_VIDEO_DIV_SELECT(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_VIDEO_DIV_SELECT)
-
-#define BP_ANADIG_PLL_VIDEO_NUM_RSVD0      30
-#define BM_ANADIG_PLL_VIDEO_NUM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_VIDEO_NUM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_VIDEO_NUM_RSVD0)
-#define BP_ANADIG_PLL_VIDEO_NUM_A      0
-#define BM_ANADIG_PLL_VIDEO_NUM_A 0x3FFFFFFF
-#define BF_ANADIG_PLL_VIDEO_NUM_A(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_VIDEO_NUM_A)
-
-#define BP_ANADIG_PLL_VIDEO_DENOM_RSVD0      30
-#define BM_ANADIG_PLL_VIDEO_DENOM_RSVD0 0xC0000000
-#define BF_ANADIG_PLL_VIDEO_DENOM_RSVD0(v) \
-       (((v) << 30) & BM_ANADIG_PLL_VIDEO_DENOM_RSVD0)
-#define BP_ANADIG_PLL_VIDEO_DENOM_B      0
-#define BM_ANADIG_PLL_VIDEO_DENOM_B 0x3FFFFFFF
-#define BF_ANADIG_PLL_VIDEO_DENOM_B(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_VIDEO_DENOM_B)
-
-#define BM_ANADIG_PLL_ENET_LOCK 0x80000000
-#define BP_ANADIG_PLL_ENET_RSVD1      21
-#define BM_ANADIG_PLL_ENET_RSVD1 0x7FE00000
-#define BF_ANADIG_PLL_ENET_RSVD1(v)  \
-       (((v) << 21) & BM_ANADIG_PLL_ENET_RSVD1)
-#define BM_ANADIG_PLL_ENET_ENABLE_SATA 0x00100000
-#define BM_ANADIG_PLL_ENET_ENABLE_PCIE 0x00080000
-#define BM_ANADIG_PLL_ENET_PFD_OFFSET_EN 0x00040000
-#define BM_ANADIG_PLL_ENET_DITHER_ENABLE 0x00020000
-#define BM_ANADIG_PLL_ENET_BYPASS 0x00010000
-#define BP_ANADIG_PLL_ENET_BYPASS_CLK_SRC      14
-#define BM_ANADIG_PLL_ENET_BYPASS_CLK_SRC 0x0000C000
-#define BF_ANADIG_PLL_ENET_BYPASS_CLK_SRC(v)  \
-       (((v) << 14) & BM_ANADIG_PLL_ENET_BYPASS_CLK_SRC)
-#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__OSC_24M  0x0
-#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__ANACLK_1 0x1
-#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__ANACLK_2 0x2
-#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__XOR      0x3
-#define BM_ANADIG_PLL_ENET_ENABLE 0x00002000
-#define BM_ANADIG_PLL_ENET_POWERDOWN 0x00001000
-#define BM_ANADIG_PLL_ENET_HOLD_RING_OFF 0x00000800
-#define BM_ANADIG_PLL_ENET_DOUBLE_CP 0x00000400
-#define BM_ANADIG_PLL_ENET_HALF_CP 0x00000200
-#define BM_ANADIG_PLL_ENET_DOUBLE_LF 0x00000100
-#define BM_ANADIG_PLL_ENET_HALF_LF 0x00000080
-#define BP_ANADIG_PLL_ENET_RSVD0      2
-#define BM_ANADIG_PLL_ENET_RSVD0 0x0000007C
-#define BF_ANADIG_PLL_ENET_RSVD0(v)  \
-       (((v) << 2) & BM_ANADIG_PLL_ENET_RSVD0)
-#define BP_ANADIG_PLL_ENET_DIV_SELECT      0
-#define BM_ANADIG_PLL_ENET_DIV_SELECT 0x00000003
-#define BF_ANADIG_PLL_ENET_DIV_SELECT(v)  \
-       (((v) << 0) & BM_ANADIG_PLL_ENET_DIV_SELECT)
-
-#define BM_ANADIG_PFD_480_PFD3_CLKGATE 0x80000000
-#define BM_ANADIG_PFD_480_PFD3_STABLE 0x40000000
-#define BP_ANADIG_PFD_480_PFD3_FRAC      24
-#define BM_ANADIG_PFD_480_PFD3_FRAC 0x3F000000
-#define BF_ANADIG_PFD_480_PFD3_FRAC(v)  \
-       (((v) << 24) & BM_ANADIG_PFD_480_PFD3_FRAC)
-#define BM_ANADIG_PFD_480_PFD2_CLKGATE 0x00800000
-#define BM_ANADIG_PFD_480_PFD2_STABLE 0x00400000
-#define BP_ANADIG_PFD_480_PFD2_FRAC      16
-#define BM_ANADIG_PFD_480_PFD2_FRAC 0x003F0000
-#define BF_ANADIG_PFD_480_PFD2_FRAC(v)  \
-       (((v) << 16) & BM_ANADIG_PFD_480_PFD2_FRAC)
-#define BM_ANADIG_PFD_480_PFD1_CLKGATE 0x00008000
-#define BM_ANADIG_PFD_480_PFD1_STABLE 0x00004000
-#define BP_ANADIG_PFD_480_PFD1_FRAC      8
-#define BM_ANADIG_PFD_480_PFD1_FRAC 0x00003F00
-#define BF_ANADIG_PFD_480_PFD1_FRAC(v)  \
-       (((v) << 8) & BM_ANADIG_PFD_480_PFD1_FRAC)
-#define BM_ANADIG_PFD_480_PFD0_CLKGATE 0x00000080
-#define BM_ANADIG_PFD_480_PFD0_STABLE 0x00000040
-#define BP_ANADIG_PFD_480_PFD0_FRAC      0
-#define BM_ANADIG_PFD_480_PFD0_FRAC 0x0000003F
-#define BF_ANADIG_PFD_480_PFD0_FRAC(v)  \
-       (((v) << 0) & BM_ANADIG_PFD_480_PFD0_FRAC)
-
-#define BM_ANADIG_PFD_528_PFD3_CLKGATE 0x80000000
-#define BM_ANADIG_PFD_528_PFD3_STABLE 0x40000000
-#define BP_ANADIG_PFD_528_PFD3_FRAC      24
-#define BM_ANADIG_PFD_528_PFD3_FRAC 0x3F000000
-#define BF_ANADIG_PFD_528_PFD3_FRAC(v)  \
-       (((v) << 24) & BM_ANADIG_PFD_528_PFD3_FRAC)
-#define BM_ANADIG_PFD_528_PFD2_CLKGATE 0x00800000
-#define BM_ANADIG_PFD_528_PFD2_STABLE 0x00400000
-#define BP_ANADIG_PFD_528_PFD2_FRAC      16
-#define BM_ANADIG_PFD_528_PFD2_FRAC 0x003F0000
-#define BF_ANADIG_PFD_528_PFD2_FRAC(v)  \
-       (((v) << 16) & BM_ANADIG_PFD_528_PFD2_FRAC)
-#define BM_ANADIG_PFD_528_PFD1_CLKGATE 0x00008000
-#define BM_ANADIG_PFD_528_PFD1_STABLE 0x00004000
-#define BP_ANADIG_PFD_528_PFD1_FRAC      8
-#define BM_ANADIG_PFD_528_PFD1_FRAC 0x00003F00
-#define BF_ANADIG_PFD_528_PFD1_FRAC(v)  \
-       (((v) << 8) & BM_ANADIG_PFD_528_PFD1_FRAC)
-#define BM_ANADIG_PFD_528_PFD0_CLKGATE 0x00000080
-#define BM_ANADIG_PFD_528_PFD0_STABLE 0x00000040
-#define BP_ANADIG_PFD_528_PFD0_FRAC      0
-#define BM_ANADIG_PFD_528_PFD0_FRAC 0x0000003F
-#define BF_ANADIG_PFD_528_PFD0_FRAC(v)  \
-       (((v) << 0) & BM_ANADIG_PFD_528_PFD0_FRAC)
-
-#define PLL2_PFD0_FREQ         352000000
-#define PLL2_PFD1_FREQ         594000000
-#define PLL2_PFD2_FREQ         400000000
-#define PLL2_PFD2_DIV_FREQ     200000000
-#define PLL3_PFD0_FREQ         720000000
-#define PLL3_PFD1_FREQ         540000000
-#define PLL3_PFD2_FREQ         508200000
-#define PLL3_PFD3_FREQ         454700000
-#define PLL3_80M               80000000
-#define PLL3_60M               60000000
-
-#endif /*__ARCH_ARM_MACH_MX6_CCM_REGS_H__ */
index 613809bdd672495727e4b3474cc8cd904820cb1a..b91d8bf45027f798b8e4825d71857246f0ee38ff 100644 (file)
@@ -47,5 +47,6 @@ u32 imx_get_uartclk(void);
 u32 imx_get_fecclk(void);
 unsigned int mxc_get_clock(enum mxc_clock clk);
 void enable_usboh3_clk(unsigned char enable);
+int enable_sata_clock(void);
 
 #endif /* __ASM_ARCH_CLOCK_H */
diff --git a/arch/arm/include/asm/arch-mx6/crm_regs.h b/arch/arm/include/asm/arch-mx6/crm_regs.h
new file mode 100644 (file)
index 0000000..0e605c2
--- /dev/null
@@ -0,0 +1,892 @@
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License 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
+ *
+ */
+
+#ifndef __ARCH_ARM_MACH_MX6_CCM_REGS_H__
+#define __ARCH_ARM_MACH_MX6_CCM_REGS_H__
+
+struct mxc_ccm_reg {
+       u32 ccr;        /* 0x0000 */
+       u32 ccdr;
+       u32 csr;
+       u32 ccsr;
+       u32 cacrr;      /* 0x0010*/
+       u32 cbcdr;
+       u32 cbcmr;
+       u32 cscmr1;
+       u32 cscmr2;     /* 0x0020 */
+       u32 cscdr1;
+       u32 cs1cdr;
+       u32 cs2cdr;
+       u32 cdcdr;      /* 0x0030 */
+       u32 chscdr;
+       u32 cscdr2;
+       u32 cscdr3;
+       u32 cscdr4;     /* 0x0040 */
+       u32 resv0;
+       u32 cdhipr;
+       u32 cdcr;
+       u32 ctor;       /* 0x0050 */
+       u32 clpcr;
+       u32 cisr;
+       u32 cimr;
+       u32 ccosr;      /* 0x0060 */
+       u32 cgpr;
+       u32 CCGR0;
+       u32 CCGR1;
+       u32 CCGR2;      /* 0x0070 */
+       u32 CCGR3;
+       u32 CCGR4;
+       u32 CCGR5;
+       u32 CCGR6;      /* 0x0080 */
+       u32 CCGR7;
+       u32 cmeor;
+       u32 resv[0xfdd];
+       u32 analog_pll_sys;                     /* 0x4000 */
+       u32 analog_pll_sys_set;
+       u32 analog_pll_sys_clr;
+       u32 analog_pll_sys_tog;
+       u32 analog_usb1_pll_480_ctrl;           /* 0x4010 */
+       u32 analog_usb1_pll_480_ctrl_set;
+       u32 analog_usb1_pll_480_ctrl_clr;
+       u32 analog_usb1_pll_480_ctrl_tog;
+       u32 analog_reserved0[4];
+       u32 analog_pll_528;                     /* 0x4030 */
+       u32 analog_pll_528_set;
+       u32 analog_pll_528_clr;
+       u32 analog_pll_528_tog;
+       u32 analog_pll_528_ss;                  /* 0x4040 */
+       u32 analog_reserved1[3];
+       u32 analog_pll_528_num;                 /* 0x4050 */
+       u32 analog_reserved2[3];
+       u32 analog_pll_528_denom;               /* 0x4060 */
+       u32 analog_reserved3[3];
+       u32 analog_pll_audio;                   /* 0x4070 */
+       u32 analog_pll_audio_set;
+       u32 analog_pll_audio_clr;
+       u32 analog_pll_audio_tog;
+       u32 analog_pll_audio_num;               /* 0x4080*/
+       u32 analog_reserved4[3];
+       u32 analog_pll_audio_denom;             /* 0x4090 */
+       u32 analog_reserved5[3];
+       u32 analog_pll_video;                   /* 0x40a0 */
+       u32 analog_pll_video_set;
+       u32 analog_pll_video_clr;
+       u32 analog_pll_video_tog;
+       u32 analog_pll_video_num;               /* 0x40b0 */
+       u32 analog_reserved6[3];
+       u32 analog_pll_vedio_denon;             /* 0x40c0 */
+       u32 analog_reserved7[7];
+       u32 analog_pll_enet;                    /* 0x40e0 */
+       u32 analog_pll_enet_set;
+       u32 analog_pll_enet_clr;
+       u32 analog_pll_enet_tog;
+       u32 analog_pfd_480;                     /* 0x40f0 */
+       u32 analog_pfd_480_set;
+       u32 analog_pfd_480_clr;
+       u32 analog_pfd_480_tog;
+       u32 analog_pfd_528;                     /* 0x4100 */
+       u32 analog_pfd_528_set;
+       u32 analog_pfd_528_clr;
+       u32 analog_pfd_528_tog;
+};
+
+/* Define the bits in register CCR */
+#define MXC_CCM_CCR_RBC_EN                             (1 << 27)
+#define MXC_CCM_CCR_REG_BYPASS_CNT_MASK                        (0x3F << 21)
+#define MXC_CCM_CCR_REG_BYPASS_CNT_OFFSET              21
+#define MXC_CCM_CCR_WB_COUNT_MASK                      0x7
+#define MXC_CCM_CCR_WB_COUNT_OFFSET                    (1 << 16)
+#define MXC_CCM_CCR_COSC_EN                            (1 << 12)
+#define MXC_CCM_CCR_OSCNT_MASK                         0xFF
+#define MXC_CCM_CCR_OSCNT_OFFSET                       0
+
+/* Define the bits in register CCDR */
+#define MXC_CCM_CCDR_MMDC_CH1_HS_MASK                  (1 << 16)
+#define MXC_CCM_CCDR_MMDC_CH0_HS_MASK                  (1 << 17)
+
+/* Define the bits in register CSR */
+#define MXC_CCM_CSR_COSC_READY                         (1 << 5)
+#define MXC_CCM_CSR_REF_EN_B                           (1 << 0)
+
+/* Define the bits in register CCSR */
+#define MXC_CCM_CCSR_PDF_540M_AUTO_DIS                 (1 << 15)
+#define MXC_CCM_CCSR_PDF_720M_AUTO_DIS                 (1 << 14)
+#define MXC_CCM_CCSR_PDF_454M_AUTO_DIS                 (1 << 13)
+#define MXC_CCM_CCSR_PDF_508M_AUTO_DIS                 (1 << 12)
+#define MXC_CCM_CCSR_PDF_594M_AUTO_DIS                 (1 << 11)
+#define MXC_CCM_CCSR_PDF_352M_AUTO_DIS                 (1 << 10)
+#define MXC_CCM_CCSR_PDF_400M_AUTO_DIS                 (1 << 9)
+#define MXC_CCM_CCSR_STEP_SEL                          (1 << 8)
+#define MXC_CCM_CCSR_PLL1_SW_CLK_SEL                   (1 << 2)
+#define MXC_CCM_CCSR_PLL2_SW_CLK_SEL                   (1 << 1)
+#define MXC_CCM_CCSR_PLL3_SW_CLK_SEL                   (1 << 0)
+
+/* Define the bits in register CACRR */
+#define MXC_CCM_CACRR_ARM_PODF_OFFSET                  0
+#define MXC_CCM_CACRR_ARM_PODF_MASK                    0x7
+
+/* Define the bits in register CBCDR */
+#define MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK            (0x7 << 27)
+#define MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET          27
+#define MXC_CCM_CBCDR_PERIPH2_CLK2_SEL                 (1 << 26)
+#define MXC_CCM_CBCDR_PERIPH_CLK_SEL                   (1 << 25)
+#define MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK               (0x7 << 19)
+#define MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET             19
+#define MXC_CCM_CBCDR_AXI_PODF_MASK                    (0x7 << 16)
+#define MXC_CCM_CBCDR_AXI_PODF_OFFSET                  16
+#define MXC_CCM_CBCDR_AHB_PODF_MASK                    (0x7 << 10)
+#define MXC_CCM_CBCDR_AHB_PODF_OFFSET                  10
+#define MXC_CCM_CBCDR_IPG_PODF_MASK                    (0x3 << 8)
+#define MXC_CCM_CBCDR_IPG_PODF_OFFSET                  8
+#define MXC_CCM_CBCDR_AXI_ALT_SEL                      (1 << 7)
+#define MXC_CCM_CBCDR_AXI_SEL                          (1 << 6)
+#define MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK               (0x7 << 3)
+#define MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET             3
+#define MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_MASK           (0x7 << 0)
+#define MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_OFFSET         0
+
+/* Define the bits in register CBCMR */
+#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK           (0x7 << 29)
+#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET         29
+#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK             (0x7 << 26)
+#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET           26
+#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK             (0x7 << 23)
+#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET           23
+#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK         (0x3 << 21)
+#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET       21
+#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK2_SEL             (1 << 20)
+#define MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK          (0x3 << 18)
+#define MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET                18
+#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK               (0x3 << 16)
+#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET             16
+#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK             (0x3 << 14)
+#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET           14
+#define MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK             (0x3 << 12)
+#define MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET           12
+#define MXC_CCM_CBCMR_VDOAXI_CLK_SEL                   (1 << 11)
+#define MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL                 (1 << 10)
+#define MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK                (0x3 << 8)
+#define MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET      8
+#define MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK          (0x3 << 4)
+#define MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET                4
+#define MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL                        (1 << 1)
+#define MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL                        (1 << 0)
+
+/* Define the bits in register CSCMR1 */
+#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK              (0x3 << 29)
+#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET            29
+#define MXC_CCM_CSCMR1_ACLK_EMI_MASK                   (0x3 << 27)
+#define MXC_CCM_CSCMR1_ACLK_EMI_OFFSET                 27
+#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK         (0x7 << 23)
+#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET       23
+#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK              (0x7 << 20)
+#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET            20
+#define MXC_CCM_CSCMR1_USDHC4_CLK_SEL                  (1 << 19)
+#define MXC_CCM_CSCMR1_USDHC3_CLK_SEL                  (1 << 18)
+#define MXC_CCM_CSCMR1_USDHC2_CLK_SEL                  (1 << 17)
+#define MXC_CCM_CSCMR1_USDHC1_CLK_SEL                  (1 << 16)
+#define MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK               (0x3 << 14)
+#define MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET             14
+#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK               (0x3 << 12)
+#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET             12
+#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK               (0x3 << 10)
+#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET             10
+#define MXC_CCM_CSCMR1_PERCLK_PODF_MASK                        0x3F
+
+/* Define the bits in register CSCMR2 */
+#define MXC_CCM_CSCMR2_ESAI_PRE_SEL_MASK               (0x3 << 19)
+#define MXC_CCM_CSCMR2_ESAI_PRE_SEL_OFFSET             19
+#define MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV                 (1 << 11)
+#define MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV                 (1 << 10)
+#define MXC_CCM_CSCMR2_CAN_CLK_SEL_MASK                        (0x3F << 2)
+#define MXC_CCM_CSCMR2_CAN_CLK_SEL_OFFSET              2
+
+/* Define the bits in register CSCDR1 */
+#define MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK               (0x7 << 25)
+#define MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET             25
+#define MXC_CCM_CSCDR1_USDHC4_PODF_MASK                        (0x7 << 22)
+#define MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET              22
+#define MXC_CCM_CSCDR1_USDHC3_PODF_MASK                        (0x7 << 19)
+#define MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET              19
+#define MXC_CCM_CSCDR1_USDHC2_PODF_MASK                        (0x7 << 16)
+#define MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET              16
+#define MXC_CCM_CSCDR1_USDHC1_PODF_MASK                        (0x7 << 11)
+#define MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET              11
+#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_OFFSET          8
+#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK            (0x7 << 8)
+#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_OFFSET          6
+#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK            (0x3 << 6)
+#define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK              0x3F
+#define MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET            0
+
+/* Define the bits in register CS1CDR */
+#define MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK              (0x3F << 25)
+#define MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET            25
+#define MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK              (0x3F << 16)
+#define MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET            16
+#define MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK              (0x3 << 9)
+#define MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET            9
+#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK              (0x7 << 6)
+#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET            6
+#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK              0x3F
+#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET            0
+
+/* Define the bits in register CS2CDR */
+#define MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK              (0x3F << 21)
+#define MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET            21
+#define MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK              (0x7 << 18)
+#define MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET            18
+#define MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK               (0x3 << 16)
+#define MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET             16
+#define MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK            (0x7 << 12)
+#define MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET          12
+#define MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK            (0x7 << 9)
+#define MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET          9
+#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK              (0x7 << 6)
+#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET            6
+#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK              0x3F
+#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET            0
+
+/* Define the bits in register CDCDR */
+#define MXC_CCM_CDCDR_HSI_TX_PODF_MASK                 (0x7 << 29)
+#define MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET               29
+#define MXC_CCM_CDCDR_HSI_TX_CLK_SEL                   (1 << 28)
+#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK             (0x7 << 25)
+#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET           25
+#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK             (0x7 << 19)
+#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET           19
+#define MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK              (0x3 << 20)
+#define MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET            20
+#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK             (0x7 << 12)
+#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET           12
+#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK             (0x7 << 9)
+#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET           9
+#define MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK              (0x3 << 7)
+#define MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET            7
+
+/* Define the bits in register CHSCCDR */
+#define MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK      (0x7 << 15)
+#define MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET    15
+#define MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK             (0x7 << 12)
+#define MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET           12
+#define MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK          (0x7 << 9)
+#define MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET                9
+#define MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK      (0x7 << 6)
+#define MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET    6
+#define MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK             (0x7 << 3)
+#define MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET           3
+#define MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK          (0x7)
+#define MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET                0
+
+/* Define the bits in register CSCDR2 */
+#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_MASK             (0x3F << 19)
+#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET           19
+#define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_MASK      (0x7 << 15)
+#define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_OFFSET    15
+#define MXC_CCM_CHSCCDR_IPU2_DI1_PODF_MASK             (0x7 << 12)
+#define MXC_CCM_CHSCCDR_IPU2_DI1_PODF_OFFSET           12
+#define MXC_CCM_CHSCCDR_IPU2_DI1_CLK_SEL_MASK          (0x7 << 9)
+#define MXC_CCM_CHSCCDR_IPU2_DI1_CLK_SEL_OFFSET                9
+#define MXC_CCM_CHSCCDR_IPU2_DI0_PRE_CLK_SEL_MASK      (0x7 << 6)
+#define MXC_CCM_CHSCCDR_IPU2_DI0_PRE_CLK_SEL_OFFSET    6
+#define MXC_CCM_CHSCCDR_IPU2_DI0_PODF_MASK             (0x7 << 3)
+#define MXC_CCM_CHSCCDR_IPU2_DI0_PODF_OFFSET           3
+#define MXC_CCM_CHSCCDR_IPU2_DI0_CLK_SEL_MASK          0x7
+#define MXC_CCM_CHSCCDR_IPU2_DI0_CLK_SEL_OFFSET                0
+
+/* Define the bits in register CSCDR3 */
+#define MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK              (0x7 << 16)
+#define MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET            16
+#define MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK           (0x3 << 14)
+#define MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET         14
+#define MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK              (0x7 << 11)
+#define MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET            11
+#define MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK           (0x3 << 9)
+#define MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET         9
+
+/* Define the bits in register CDHIPR */
+#define MXC_CCM_CDHIPR_ARM_PODF_BUSY                   (1 << 16)
+#define MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY             (1 << 5)
+#define MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY              (1 << 4)
+#define MXC_CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY            (1 << 3)
+#define MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY              (1 << 2)
+#define MXC_CCM_CDHIPR_AHB_PODF_BUSY                   (1 << 1)
+#define MXC_CCM_CDHIPR_AXI_PODF_BUSY                   1
+
+/* Define the bits in register CLPCR */
+#define MXC_CCM_CLPCR_MASK_L2CC_IDLE                   (1 << 27)
+#define MXC_CCM_CLPCR_MASK_SCU_IDLE                    (1 << 26)
+#define MXC_CCM_CLPCR_MASK_CORE3_WFI                   (1 << 25)
+#define MXC_CCM_CLPCR_MASK_CORE2_WFI                   (1 << 24)
+#define MXC_CCM_CLPCR_MASK_CORE1_WFI                   (1 << 23)
+#define MXC_CCM_CLPCR_MASK_CORE0_WFI                   (1 << 22)
+#define MXC_CCM_CLPCR_BYP_MMDC_CH1_LPM_HS              (1 << 21)
+#define MXC_CCM_CLPCR_BYP_MMDC_CH0_LPM_HS              (1 << 19)
+#define MXC_CCM_CLPCR_WB_CORE_AT_LPM                   (1 << 17)
+#define MXC_CCM_CLPCR_WB_PER_AT_LPM                    (1 << 17)
+#define MXC_CCM_CLPCR_COSC_PWRDOWN                     (1 << 11)
+#define MXC_CCM_CLPCR_STBY_COUNT_MASK                  (0x3 << 9)
+#define MXC_CCM_CLPCR_STBY_COUNT_OFFSET                        9
+#define MXC_CCM_CLPCR_VSTBY                            (1 << 8)
+#define MXC_CCM_CLPCR_DIS_REF_OSC                      (1 << 7)
+#define MXC_CCM_CLPCR_SBYOS                            (1 << 6)
+#define MXC_CCM_CLPCR_ARM_CLK_DIS_ON_LPM               (1 << 5)
+#define MXC_CCM_CLPCR_LPSR_CLK_SEL_MASK                        (0x3 << 3)
+#define MXC_CCM_CLPCR_LPSR_CLK_SEL_OFFSET              3
+#define MXC_CCM_CLPCR_BYPASS_PMIC_VFUNC_READY          (1 << 2)
+#define MXC_CCM_CLPCR_LPM_MASK                         0x3
+#define MXC_CCM_CLPCR_LPM_OFFSET                       0
+
+/* Define the bits in register CISR */
+#define MXC_CCM_CISR_ARM_PODF_LOADED                   (1 << 26)
+#define MXC_CCM_CISR_MMDC_CH0_PODF_LOADED              (1 << 23)
+#define MXC_CCM_CISR_PERIPH_CLK_SEL_LOADED             (1 << 22)
+#define MXC_CCM_CISR_MMDC_CH1_PODF_LOADED              (1 << 21)
+#define MXC_CCM_CISR_AHB_PODF_LOADED                   (1 << 20)
+#define MXC_CCM_CISR_PERIPH2_CLK_SEL_LOADED            (1 << 19)
+#define MXC_CCM_CISR_AXI_PODF_LOADED                   (1 << 17)
+#define MXC_CCM_CISR_COSC_READY                                (1 << 6)
+#define MXC_CCM_CISR_LRF_PLL                           1
+
+/* Define the bits in register CIMR */
+#define MXC_CCM_CIMR_MASK_ARM_PODF_LOADED              (1 << 26)
+#define MXC_CCM_CIMR_MASK_MMDC_CH0_PODF_LOADED         (1 << 23)
+#define MXC_CCM_CIMR_MASK_PERIPH_CLK_SEL_LOADED                (1 << 22)
+#define MXC_CCM_CIMR_MASK_MMDC_CH1_PODF_LOADED         (1 << 21)
+#define MXC_CCM_CIMR_MASK_AHB_PODF_LOADED              (1 << 20)
+#define MXC_CCM_CIMR_MASK_PERIPH2_CLK_SEL_LOADED       (1 << 22)
+#define MXC_CCM_CIMR_MASK_AXI_PODF_LOADED              (1 << 17)
+#define MXC_CCM_CIMR_MASK_COSC_READY                   (1 << 6)
+#define MXC_CCM_CIMR_MASK_LRF_PLL                      1
+
+/* Define the bits in register CCOSR */
+#define MXC_CCM_CCOSR_CKO2_EN_OFFSET                   (1 << 24)
+#define MXC_CCM_CCOSR_CKO2_DIV_MASK                    (0x7 << 21)
+#define MXC_CCM_CCOSR_CKO2_DIV_OFFSET                  21
+#define MXC_CCM_CCOSR_CKO2_SEL_OFFSET                  16
+#define MXC_CCM_CCOSR_CKO2_SEL_MASK                    (0x1F << 16)
+#define MXC_CCM_CCOSR_CKOL_EN                          (0x1 << 7)
+#define MXC_CCM_CCOSR_CKOL_DIV_MASK                    (0x7 << 4)
+#define MXC_CCM_CCOSR_CKOL_DIV_OFFSET                  4
+#define MXC_CCM_CCOSR_CKOL_SEL_MASK                    0xF
+#define MXC_CCM_CCOSR_CKOL_SEL_OFFSET                  0
+
+/* Define the bits in registers CGPR */
+#define MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE            (1 << 4)
+#define MXC_CCM_CGPR_MMDC_EXT_CLK_DIS                  (1 << 2)
+#define MXC_CCM_CGPR_PMIC_DELAY_SCALER                 1
+
+/* Define the bits in registers CCGRx */
+#define MXC_CCM_CCGR_CG_MASK                           3
+
+#define MXC_CCM_CCGR0_CG15_OFFSET                      30
+#define MXC_CCM_CCGR0_CG15_MASK                        (0x3 << 30)
+#define MXC_CCM_CCGR0_CG14_OFFSET                      28
+#define MXC_CCM_CCGR0_CG14_MASK                        (0x3 << 28)
+#define MXC_CCM_CCGR0_CG13_OFFSET                      26
+#define MXC_CCM_CCGR0_CG13_MASK                        (0x3 << 26)
+#define MXC_CCM_CCGR0_CG12_OFFSET                      24
+#define MXC_CCM_CCGR0_CG12_MASK                        (0x3 << 24)
+#define MXC_CCM_CCGR0_CG11_OFFSET                      22
+#define MXC_CCM_CCGR0_CG11_MASK                        (0x3 << 22)
+#define MXC_CCM_CCGR0_CG10_OFFSET                      20
+#define MXC_CCM_CCGR0_CG10_MASK                        (0x3 << 20)
+#define MXC_CCM_CCGR0_CG9_OFFSET                       18
+#define MXC_CCM_CCGR0_CG9_MASK                 (0x3 << 18)
+#define MXC_CCM_CCGR0_CG8_OFFSET                       16
+#define MXC_CCM_CCGR0_CG8_MASK                 (0x3 << 16)
+#define MXC_CCM_CCGR0_CG7_OFFSET                       14
+#define MXC_CCM_CCGR0_CG6_OFFSET                       12
+#define MXC_CCM_CCGR0_CG5_OFFSET                       10
+#define MXC_CCM_CCGR0_CG5_MASK                 (0x3 << 10)
+#define MXC_CCM_CCGR0_CG4_OFFSET                       8
+#define MXC_CCM_CCGR0_CG4_MASK                 (0x3 << 8)
+#define MXC_CCM_CCGR0_CG3_OFFSET                       6
+#define MXC_CCM_CCGR0_CG3_MASK                 (0x3 << 6)
+#define MXC_CCM_CCGR0_CG2_OFFSET                       4
+#define MXC_CCM_CCGR0_CG2_MASK                 (0x3 << 4)
+#define MXC_CCM_CCGR0_CG1_OFFSET                       2
+#define MXC_CCM_CCGR0_CG1_MASK                 (0x3 << 2)
+#define MXC_CCM_CCGR0_CG0_OFFSET                       0
+#define MXC_CCM_CCGR0_CG0_MASK                         3
+
+#define MXC_CCM_CCGR1_CG15_OFFSET                      30
+#define MXC_CCM_CCGR1_CG14_OFFSET                      28
+#define MXC_CCM_CCGR1_CG13_OFFSET                      26
+#define MXC_CCM_CCGR1_CG12_OFFSET                      24
+#define MXC_CCM_CCGR1_CG11_OFFSET                      22
+#define MXC_CCM_CCGR1_CG10_OFFSET                      20
+#define MXC_CCM_CCGR1_CG9_OFFSET                       18
+#define MXC_CCM_CCGR1_CG8_OFFSET                       16
+#define MXC_CCM_CCGR1_CG7_OFFSET                       14
+#define MXC_CCM_CCGR1_CG6_OFFSET                       12
+#define MXC_CCM_CCGR1_CG5_OFFSET                       10
+#define MXC_CCM_CCGR1_CG4_OFFSET                       8
+#define MXC_CCM_CCGR1_CG3_OFFSET                       6
+#define MXC_CCM_CCGR1_CG2_OFFSET                       4
+#define MXC_CCM_CCGR1_CG1_OFFSET                       2
+#define MXC_CCM_CCGR1_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR2_CG15_OFFSET                      30
+#define MXC_CCM_CCGR2_CG14_OFFSET                      28
+#define MXC_CCM_CCGR2_CG13_OFFSET                      26
+#define MXC_CCM_CCGR2_CG12_OFFSET                      24
+#define MXC_CCM_CCGR2_CG11_OFFSET                      22
+#define MXC_CCM_CCGR2_CG10_OFFSET                      20
+#define MXC_CCM_CCGR2_CG9_OFFSET                       18
+#define MXC_CCM_CCGR2_CG8_OFFSET                       16
+#define MXC_CCM_CCGR2_CG7_OFFSET                       14
+#define MXC_CCM_CCGR2_CG6_OFFSET                       12
+#define MXC_CCM_CCGR2_CG5_OFFSET                       10
+#define MXC_CCM_CCGR2_CG4_OFFSET                       8
+#define MXC_CCM_CCGR2_CG3_OFFSET                       6
+#define MXC_CCM_CCGR2_CG2_OFFSET                       4
+#define MXC_CCM_CCGR2_CG1_OFFSET                       2
+#define MXC_CCM_CCGR2_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR3_CG15_OFFSET                      30
+#define MXC_CCM_CCGR3_CG14_OFFSET                      28
+#define MXC_CCM_CCGR3_CG13_OFFSET                      26
+#define MXC_CCM_CCGR3_CG12_OFFSET                      24
+#define MXC_CCM_CCGR3_CG11_OFFSET                      22
+#define MXC_CCM_CCGR3_CG10_OFFSET                      20
+#define MXC_CCM_CCGR3_CG9_OFFSET                       18
+#define MXC_CCM_CCGR3_CG8_OFFSET                       16
+#define MXC_CCM_CCGR3_CG7_OFFSET                       14
+#define MXC_CCM_CCGR3_CG6_OFFSET                       12
+#define MXC_CCM_CCGR3_CG5_OFFSET                       10
+#define MXC_CCM_CCGR3_CG4_OFFSET                       8
+#define MXC_CCM_CCGR3_CG3_OFFSET                       6
+#define MXC_CCM_CCGR3_CG2_OFFSET                       4
+#define MXC_CCM_CCGR3_CG1_OFFSET                       2
+#define MXC_CCM_CCGR3_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR4_CG15_OFFSET                      30
+#define MXC_CCM_CCGR4_CG14_OFFSET                      28
+#define MXC_CCM_CCGR4_CG13_OFFSET                      26
+#define MXC_CCM_CCGR4_CG12_OFFSET                      24
+#define MXC_CCM_CCGR4_CG11_OFFSET                      22
+#define MXC_CCM_CCGR4_CG10_OFFSET                      20
+#define MXC_CCM_CCGR4_CG9_OFFSET                       18
+#define MXC_CCM_CCGR4_CG8_OFFSET                       16
+#define MXC_CCM_CCGR4_CG7_OFFSET                       14
+#define MXC_CCM_CCGR4_CG6_OFFSET                       12
+#define MXC_CCM_CCGR4_CG5_OFFSET                       10
+#define MXC_CCM_CCGR4_CG4_OFFSET                       8
+#define MXC_CCM_CCGR4_CG3_OFFSET                       6
+#define MXC_CCM_CCGR4_CG2_OFFSET                       4
+#define MXC_CCM_CCGR4_CG1_OFFSET                       2
+#define MXC_CCM_CCGR4_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR5_CG15_OFFSET                      30
+#define MXC_CCM_CCGR5_CG14_OFFSET                      28
+#define MXC_CCM_CCGR5_CG14_MASK                        (0x3 << 28)
+#define MXC_CCM_CCGR5_CG13_OFFSET                      26
+#define MXC_CCM_CCGR5_CG13_MASK                        (0x3 << 26)
+#define MXC_CCM_CCGR5_CG12_OFFSET                      24
+#define MXC_CCM_CCGR5_CG12_MASK                        (0x3 << 24)
+#define MXC_CCM_CCGR5_CG11_OFFSET                      22
+#define MXC_CCM_CCGR5_CG11_MASK                        (0x3 << 22)
+#define MXC_CCM_CCGR5_CG10_OFFSET                      20
+#define MXC_CCM_CCGR5_CG10_MASK                        (0x3 << 20)
+#define MXC_CCM_CCGR5_CG9_OFFSET                       18
+#define MXC_CCM_CCGR5_CG9_MASK                 (0x3 << 18)
+#define MXC_CCM_CCGR5_CG8_OFFSET                       16
+#define MXC_CCM_CCGR5_CG8_MASK                 (0x3 << 16)
+#define MXC_CCM_CCGR5_CG7_OFFSET                       14
+#define MXC_CCM_CCGR5_CG7_MASK                 (0x3 << 14)
+#define MXC_CCM_CCGR5_CG6_OFFSET                       12
+#define MXC_CCM_CCGR5_CG6_MASK                 (0x3 << 12)
+#define MXC_CCM_CCGR5_CG5_OFFSET                       10
+#define MXC_CCM_CCGR5_CG4_OFFSET                       8
+#define MXC_CCM_CCGR5_CG3_OFFSET                       6
+#define MXC_CCM_CCGR5_CG2_OFFSET                       4
+#define MXC_CCM_CCGR5_CG2_MASK                 (0x3 << 4)
+#define MXC_CCM_CCGR5_CG1_OFFSET                       2
+#define MXC_CCM_CCGR5_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR6_CG15_OFFSET                      30
+#define MXC_CCM_CCGR6_CG14_OFFSET                      28
+#define MXC_CCM_CCGR6_CG14_MASK                        (0x3 << 28)
+#define MXC_CCM_CCGR6_CG13_OFFSET                      26
+#define MXC_CCM_CCGR6_CG13_MASK                        (0x3 << 26)
+#define MXC_CCM_CCGR6_CG12_OFFSET                      24
+#define MXC_CCM_CCGR6_CG12_MASK                        (0x3 << 24)
+#define MXC_CCM_CCGR6_CG11_OFFSET                      22
+#define MXC_CCM_CCGR6_CG11_MASK                        (0x3 << 22)
+#define MXC_CCM_CCGR6_CG10_OFFSET                      20
+#define MXC_CCM_CCGR6_CG10_MASK                        (0x3 << 20)
+#define MXC_CCM_CCGR6_CG9_OFFSET                       18
+#define MXC_CCM_CCGR6_CG9_MASK                 (0x3 << 18)
+#define MXC_CCM_CCGR6_CG8_OFFSET                       16
+#define MXC_CCM_CCGR6_CG8_MASK                 (0x3 << 16)
+#define MXC_CCM_CCGR6_CG7_OFFSET                       14
+#define MXC_CCM_CCGR6_CG7_MASK                 (0x3 << 14)
+#define MXC_CCM_CCGR6_CG6_OFFSET                       12
+#define MXC_CCM_CCGR6_CG6_MASK                 (0x3 << 12)
+#define MXC_CCM_CCGR6_CG5_OFFSET                       10
+#define MXC_CCM_CCGR6_CG4_OFFSET                       8
+#define MXC_CCM_CCGR6_CG3_OFFSET                       6
+#define MXC_CCM_CCGR6_CG2_OFFSET                       4
+#define MXC_CCM_CCGR6_CG2_MASK                 (0x3 << 4)
+#define MXC_CCM_CCGR6_CG1_OFFSET                       2
+#define MXC_CCM_CCGR6_CG0_OFFSET                       0
+
+#define MXC_CCM_CCGR7_CG15_OFFSET                      30
+#define MXC_CCM_CCGR7_CG14_OFFSET                      28
+#define MXC_CCM_CCGR7_CG14_MASK                        (0x3 << 28)
+#define MXC_CCM_CCGR7_CG13_OFFSET                      26
+#define MXC_CCM_CCGR7_CG13_MASK                        (0x3 << 26)
+#define MXC_CCM_CCGR7_CG12_OFFSET                      24
+#define MXC_CCM_CCGR7_CG12_MASK                        (0x3 << 24)
+#define MXC_CCM_CCGR7_CG11_OFFSET                      22
+#define MXC_CCM_CCGR7_CG11_MASK                        (0x3 << 22)
+#define MXC_CCM_CCGR7_CG10_OFFSET                      20
+#define MXC_CCM_CCGR7_CG10_MASK                        (0x3 << 20)
+#define MXC_CCM_CCGR7_CG9_OFFSET                       18
+#define MXC_CCM_CCGR7_CG9_MASK                 (0x3 << 18)
+#define MXC_CCM_CCGR7_CG8_OFFSET                       16
+#define MXC_CCM_CCGR7_CG8_MASK                 (0x3 << 16)
+#define MXC_CCM_CCGR7_CG7_OFFSET                       14
+#define MXC_CCM_CCGR7_CG7_MASK                 (0x3 << 14)
+#define MXC_CCM_CCGR7_CG6_OFFSET                       12
+#define MXC_CCM_CCGR7_CG6_MASK                 (0x3 << 12)
+#define MXC_CCM_CCGR7_CG5_OFFSET                       10
+#define MXC_CCM_CCGR7_CG4_OFFSET                       8
+#define MXC_CCM_CCGR7_CG3_OFFSET                       6
+#define MXC_CCM_CCGR7_CG2_OFFSET                       4
+#define MXC_CCM_CCGR7_CG2_MASK                 (0x3 << 4)
+#define MXC_CCM_CCGR7_CG1_OFFSET                       2
+#define MXC_CCM_CCGR7_CG0_OFFSET                       0
+#define BM_ANADIG_PLL_SYS_LOCK 0x80000000
+#define BP_ANADIG_PLL_SYS_RSVD0      20
+#define BM_ANADIG_PLL_SYS_RSVD0 0x7FF00000
+#define BF_ANADIG_PLL_SYS_RSVD0(v)  \
+       (((v) << 20) & BM_ANADIG_PLL_SYS_RSVD0)
+#define BM_ANADIG_PLL_SYS_PLL_SEL 0x00080000
+#define BM_ANADIG_PLL_SYS_LVDS_24MHZ_SEL 0x00040000
+#define BM_ANADIG_PLL_SYS_LVDS_SEL 0x00020000
+#define BM_ANADIG_PLL_SYS_BYPASS 0x00010000
+#define BP_ANADIG_PLL_SYS_BYPASS_CLK_SRC      14
+#define BM_ANADIG_PLL_SYS_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_PLL_SYS_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_PLL_SYS_BYPASS_CLK_SRC)
+#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_PLL_SYS_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_PLL_SYS_ENABLE 0x00002000
+#define BM_ANADIG_PLL_SYS_POWERDOWN 0x00001000
+#define BM_ANADIG_PLL_SYS_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_PLL_SYS_DOUBLE_CP 0x00000400
+#define BM_ANADIG_PLL_SYS_HALF_CP 0x00000200
+#define BM_ANADIG_PLL_SYS_DOUBLE_LF 0x00000100
+#define BM_ANADIG_PLL_SYS_HALF_LF 0x00000080
+#define BP_ANADIG_PLL_SYS_DIV_SELECT      0
+#define BM_ANADIG_PLL_SYS_DIV_SELECT 0x0000007F
+#define BF_ANADIG_PLL_SYS_DIV_SELECT(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_SYS_DIV_SELECT)
+
+#define BM_ANADIG_USB1_PLL_480_CTRL_LOCK 0x80000000
+#define BP_ANADIG_USB1_PLL_480_CTRL_RSVD1      17
+#define BM_ANADIG_USB1_PLL_480_CTRL_RSVD1 0x7FFE0000
+#define BF_ANADIG_USB1_PLL_480_CTRL_RSVD1(v)  \
+       (((v) << 17) & BM_ANADIG_USB1_PLL_480_CTRL_RSVD1)
+#define BM_ANADIG_USB1_PLL_480_CTRL_BYPASS 0x00010000
+#define BP_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC      14
+#define BM_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC)
+#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_USB1_PLL_480_CTRL_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_USB1_PLL_480_CTRL_ENABLE 0x00002000
+#define BM_ANADIG_USB1_PLL_480_CTRL_POWER 0x00001000
+#define BM_ANADIG_USB1_PLL_480_CTRL_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_USB1_PLL_480_CTRL_DOUBLE_CP 0x00000400
+#define BM_ANADIG_USB1_PLL_480_CTRL_HALF_CP 0x00000200
+#define BM_ANADIG_USB1_PLL_480_CTRL_DOUBLE_LF 0x00000100
+#define BM_ANADIG_USB1_PLL_480_CTRL_HALF_LF 0x00000080
+#define BM_ANADIG_USB1_PLL_480_CTRL_EN_USB_CLKS 0x00000040
+#define BM_ANADIG_USB1_PLL_480_CTRL_RSVD0 0x00000020
+#define BP_ANADIG_USB1_PLL_480_CTRL_CONTROL0      2
+#define BM_ANADIG_USB1_PLL_480_CTRL_CONTROL0 0x0000001C
+#define BF_ANADIG_USB1_PLL_480_CTRL_CONTROL0(v)  \
+       (((v) << 2) & BM_ANADIG_USB1_PLL_480_CTRL_CONTROL0)
+#define BP_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT      0
+#define BM_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT 0x00000003
+#define BF_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT(v)  \
+       (((v) << 0) & BM_ANADIG_USB1_PLL_480_CTRL_DIV_SELECT)
+
+#define BM_ANADIG_PLL_528_LOCK 0x80000000
+#define BP_ANADIG_PLL_528_RSVD1      19
+#define BM_ANADIG_PLL_528_RSVD1 0x7FF80000
+#define BF_ANADIG_PLL_528_RSVD1(v)  \
+       (((v) << 19) & BM_ANADIG_PLL_528_RSVD1)
+#define BM_ANADIG_PLL_528_PFD_OFFSET_EN 0x00040000
+#define BM_ANADIG_PLL_528_DITHER_ENABLE 0x00020000
+#define BM_ANADIG_PLL_528_BYPASS 0x00010000
+#define BP_ANADIG_PLL_528_BYPASS_CLK_SRC      14
+#define BM_ANADIG_PLL_528_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_PLL_528_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_PLL_528_BYPASS_CLK_SRC)
+#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_PLL_528_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_PLL_528_ENABLE 0x00002000
+#define BM_ANADIG_PLL_528_POWERDOWN 0x00001000
+#define BM_ANADIG_PLL_528_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_PLL_528_DOUBLE_CP 0x00000400
+#define BM_ANADIG_PLL_528_HALF_CP 0x00000200
+#define BM_ANADIG_PLL_528_DOUBLE_LF 0x00000100
+#define BM_ANADIG_PLL_528_HALF_LF 0x00000080
+#define BP_ANADIG_PLL_528_RSVD0      1
+#define BM_ANADIG_PLL_528_RSVD0 0x0000007E
+#define BF_ANADIG_PLL_528_RSVD0(v)  \
+       (((v) << 1) & BM_ANADIG_PLL_528_RSVD0)
+#define BM_ANADIG_PLL_528_DIV_SELECT 0x00000001
+
+#define BP_ANADIG_PLL_528_SS_STOP      16
+#define BM_ANADIG_PLL_528_SS_STOP 0xFFFF0000
+#define BF_ANADIG_PLL_528_SS_STOP(v) \
+       (((v) << 16) & BM_ANADIG_PLL_528_SS_STOP)
+#define BM_ANADIG_PLL_528_SS_ENABLE 0x00008000
+#define BP_ANADIG_PLL_528_SS_STEP      0
+#define BM_ANADIG_PLL_528_SS_STEP 0x00007FFF
+#define BF_ANADIG_PLL_528_SS_STEP(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_528_SS_STEP)
+
+#define BP_ANADIG_PLL_528_NUM_RSVD0      30
+#define BM_ANADIG_PLL_528_NUM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_528_NUM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_528_NUM_RSVD0)
+#define BP_ANADIG_PLL_528_NUM_A      0
+#define BM_ANADIG_PLL_528_NUM_A 0x3FFFFFFF
+#define BF_ANADIG_PLL_528_NUM_A(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_528_NUM_A)
+
+#define BP_ANADIG_PLL_528_DENOM_RSVD0      30
+#define BM_ANADIG_PLL_528_DENOM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_528_DENOM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_528_DENOM_RSVD0)
+#define BP_ANADIG_PLL_528_DENOM_B      0
+#define BM_ANADIG_PLL_528_DENOM_B 0x3FFFFFFF
+#define BF_ANADIG_PLL_528_DENOM_B(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_528_DENOM_B)
+
+#define BM_ANADIG_PLL_AUDIO_LOCK 0x80000000
+#define BP_ANADIG_PLL_AUDIO_RSVD0      22
+#define BM_ANADIG_PLL_AUDIO_RSVD0 0x7FC00000
+#define BF_ANADIG_PLL_AUDIO_RSVD0(v)  \
+       (((v) << 22) & BM_ANADIG_PLL_AUDIO_RSVD0)
+#define BM_ANADIG_PLL_AUDIO_SSC_EN 0x00200000
+#define BP_ANADIG_PLL_AUDIO_TEST_DIV_SELECT      19
+#define BM_ANADIG_PLL_AUDIO_TEST_DIV_SELECT 0x00180000
+#define BF_ANADIG_PLL_AUDIO_TEST_DIV_SELECT(v)  \
+       (((v) << 19) & BM_ANADIG_PLL_AUDIO_TEST_DIV_SELECT)
+#define BM_ANADIG_PLL_AUDIO_PFD_OFFSET_EN 0x00040000
+#define BM_ANADIG_PLL_AUDIO_DITHER_ENABLE 0x00020000
+#define BM_ANADIG_PLL_AUDIO_BYPASS 0x00010000
+#define BP_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC      14
+#define BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC)
+#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_PLL_AUDIO_ENABLE 0x00002000
+#define BM_ANADIG_PLL_AUDIO_POWERDOWN 0x00001000
+#define BM_ANADIG_PLL_AUDIO_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_PLL_AUDIO_DOUBLE_CP 0x00000400
+#define BM_ANADIG_PLL_AUDIO_HALF_CP 0x00000200
+#define BM_ANADIG_PLL_AUDIO_DOUBLE_LF 0x00000100
+#define BM_ANADIG_PLL_AUDIO_HALF_LF 0x00000080
+#define BP_ANADIG_PLL_AUDIO_DIV_SELECT      0
+#define BM_ANADIG_PLL_AUDIO_DIV_SELECT 0x0000007F
+#define BF_ANADIG_PLL_AUDIO_DIV_SELECT(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_AUDIO_DIV_SELECT)
+
+#define BP_ANADIG_PLL_AUDIO_NUM_RSVD0      30
+#define BM_ANADIG_PLL_AUDIO_NUM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_AUDIO_NUM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_AUDIO_NUM_RSVD0)
+#define BP_ANADIG_PLL_AUDIO_NUM_A      0
+#define BM_ANADIG_PLL_AUDIO_NUM_A 0x3FFFFFFF
+#define BF_ANADIG_PLL_AUDIO_NUM_A(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_AUDIO_NUM_A)
+
+#define BP_ANADIG_PLL_AUDIO_DENOM_RSVD0      30
+#define BM_ANADIG_PLL_AUDIO_DENOM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_AUDIO_DENOM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_AUDIO_DENOM_RSVD0)
+#define BP_ANADIG_PLL_AUDIO_DENOM_B      0
+#define BM_ANADIG_PLL_AUDIO_DENOM_B 0x3FFFFFFF
+#define BF_ANADIG_PLL_AUDIO_DENOM_B(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_AUDIO_DENOM_B)
+
+#define BM_ANADIG_PLL_VIDEO_LOCK 0x80000000
+#define BP_ANADIG_PLL_VIDEO_RSVD0      22
+#define BM_ANADIG_PLL_VIDEO_RSVD0 0x7FC00000
+#define BF_ANADIG_PLL_VIDEO_RSVD0(v)  \
+       (((v) << 22) & BM_ANADIG_PLL_VIDEO_RSVD0)
+#define BM_ANADIG_PLL_VIDEO_SSC_EN 0x00200000
+#define BP_ANADIG_PLL_VIDEO_TEST_DIV_SELECT      19
+#define BM_ANADIG_PLL_VIDEO_TEST_DIV_SELECT 0x00180000
+#define BF_ANADIG_PLL_VIDEO_TEST_DIV_SELECT(v)  \
+       (((v) << 19) & BM_ANADIG_PLL_VIDEO_TEST_DIV_SELECT)
+#define BM_ANADIG_PLL_VIDEO_PFD_OFFSET_EN 0x00040000
+#define BM_ANADIG_PLL_VIDEO_DITHER_ENABLE 0x00020000
+#define BM_ANADIG_PLL_VIDEO_BYPASS 0x00010000
+#define BP_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC      14
+#define BM_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC)
+#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_PLL_VIDEO_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_PLL_VIDEO_ENABLE 0x00002000
+#define BM_ANADIG_PLL_VIDEO_POWERDOWN 0x00001000
+#define BM_ANADIG_PLL_VIDEO_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_PLL_VIDEO_DOUBLE_CP 0x00000400
+#define BM_ANADIG_PLL_VIDEO_HALF_CP 0x00000200
+#define BM_ANADIG_PLL_VIDEO_DOUBLE_LF 0x00000100
+#define BM_ANADIG_PLL_VIDEO_HALF_LF 0x00000080
+#define BP_ANADIG_PLL_VIDEO_DIV_SELECT      0
+#define BM_ANADIG_PLL_VIDEO_DIV_SELECT 0x0000007F
+#define BF_ANADIG_PLL_VIDEO_DIV_SELECT(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_VIDEO_DIV_SELECT)
+
+#define BP_ANADIG_PLL_VIDEO_NUM_RSVD0      30
+#define BM_ANADIG_PLL_VIDEO_NUM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_VIDEO_NUM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_VIDEO_NUM_RSVD0)
+#define BP_ANADIG_PLL_VIDEO_NUM_A      0
+#define BM_ANADIG_PLL_VIDEO_NUM_A 0x3FFFFFFF
+#define BF_ANADIG_PLL_VIDEO_NUM_A(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_VIDEO_NUM_A)
+
+#define BP_ANADIG_PLL_VIDEO_DENOM_RSVD0      30
+#define BM_ANADIG_PLL_VIDEO_DENOM_RSVD0 0xC0000000
+#define BF_ANADIG_PLL_VIDEO_DENOM_RSVD0(v) \
+       (((v) << 30) & BM_ANADIG_PLL_VIDEO_DENOM_RSVD0)
+#define BP_ANADIG_PLL_VIDEO_DENOM_B      0
+#define BM_ANADIG_PLL_VIDEO_DENOM_B 0x3FFFFFFF
+#define BF_ANADIG_PLL_VIDEO_DENOM_B(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_VIDEO_DENOM_B)
+
+#define BM_ANADIG_PLL_ENET_LOCK 0x80000000
+#define BP_ANADIG_PLL_ENET_RSVD1      21
+#define BM_ANADIG_PLL_ENET_RSVD1 0x7FE00000
+#define BF_ANADIG_PLL_ENET_RSVD1(v)  \
+       (((v) << 21) & BM_ANADIG_PLL_ENET_RSVD1)
+#define BM_ANADIG_PLL_ENET_ENABLE_SATA 0x00100000
+#define BM_ANADIG_PLL_ENET_ENABLE_PCIE 0x00080000
+#define BM_ANADIG_PLL_ENET_PFD_OFFSET_EN 0x00040000
+#define BM_ANADIG_PLL_ENET_DITHER_ENABLE 0x00020000
+#define BM_ANADIG_PLL_ENET_BYPASS 0x00010000
+#define BP_ANADIG_PLL_ENET_BYPASS_CLK_SRC      14
+#define BM_ANADIG_PLL_ENET_BYPASS_CLK_SRC 0x0000C000
+#define BF_ANADIG_PLL_ENET_BYPASS_CLK_SRC(v)  \
+       (((v) << 14) & BM_ANADIG_PLL_ENET_BYPASS_CLK_SRC)
+#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__OSC_24M  0x0
+#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__ANACLK_1 0x1
+#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__ANACLK_2 0x2
+#define BV_ANADIG_PLL_ENET_BYPASS_CLK_SRC__XOR      0x3
+#define BM_ANADIG_PLL_ENET_ENABLE 0x00002000
+#define BM_ANADIG_PLL_ENET_POWERDOWN 0x00001000
+#define BM_ANADIG_PLL_ENET_HOLD_RING_OFF 0x00000800
+#define BM_ANADIG_PLL_ENET_DOUBLE_CP 0x00000400
+#define BM_ANADIG_PLL_ENET_HALF_CP 0x00000200
+#define BM_ANADIG_PLL_ENET_DOUBLE_LF 0x00000100
+#define BM_ANADIG_PLL_ENET_HALF_LF 0x00000080
+#define BP_ANADIG_PLL_ENET_RSVD0      2
+#define BM_ANADIG_PLL_ENET_RSVD0 0x0000007C
+#define BF_ANADIG_PLL_ENET_RSVD0(v)  \
+       (((v) << 2) & BM_ANADIG_PLL_ENET_RSVD0)
+#define BP_ANADIG_PLL_ENET_DIV_SELECT      0
+#define BM_ANADIG_PLL_ENET_DIV_SELECT 0x00000003
+#define BF_ANADIG_PLL_ENET_DIV_SELECT(v)  \
+       (((v) << 0) & BM_ANADIG_PLL_ENET_DIV_SELECT)
+
+#define BM_ANADIG_PFD_480_PFD3_CLKGATE 0x80000000
+#define BM_ANADIG_PFD_480_PFD3_STABLE 0x40000000
+#define BP_ANADIG_PFD_480_PFD3_FRAC      24
+#define BM_ANADIG_PFD_480_PFD3_FRAC 0x3F000000
+#define BF_ANADIG_PFD_480_PFD3_FRAC(v)  \
+       (((v) << 24) & BM_ANADIG_PFD_480_PFD3_FRAC)
+#define BM_ANADIG_PFD_480_PFD2_CLKGATE 0x00800000
+#define BM_ANADIG_PFD_480_PFD2_STABLE 0x00400000
+#define BP_ANADIG_PFD_480_PFD2_FRAC      16
+#define BM_ANADIG_PFD_480_PFD2_FRAC 0x003F0000
+#define BF_ANADIG_PFD_480_PFD2_FRAC(v)  \
+       (((v) << 16) & BM_ANADIG_PFD_480_PFD2_FRAC)
+#define BM_ANADIG_PFD_480_PFD1_CLKGATE 0x00008000
+#define BM_ANADIG_PFD_480_PFD1_STABLE 0x00004000
+#define BP_ANADIG_PFD_480_PFD1_FRAC      8
+#define BM_ANADIG_PFD_480_PFD1_FRAC 0x00003F00
+#define BF_ANADIG_PFD_480_PFD1_FRAC(v)  \
+       (((v) << 8) & BM_ANADIG_PFD_480_PFD1_FRAC)
+#define BM_ANADIG_PFD_480_PFD0_CLKGATE 0x00000080
+#define BM_ANADIG_PFD_480_PFD0_STABLE 0x00000040
+#define BP_ANADIG_PFD_480_PFD0_FRAC      0
+#define BM_ANADIG_PFD_480_PFD0_FRAC 0x0000003F
+#define BF_ANADIG_PFD_480_PFD0_FRAC(v)  \
+       (((v) << 0) & BM_ANADIG_PFD_480_PFD0_FRAC)
+
+#define BM_ANADIG_PFD_528_PFD3_CLKGATE 0x80000000
+#define BM_ANADIG_PFD_528_PFD3_STABLE 0x40000000
+#define BP_ANADIG_PFD_528_PFD3_FRAC      24
+#define BM_ANADIG_PFD_528_PFD3_FRAC 0x3F000000
+#define BF_ANADIG_PFD_528_PFD3_FRAC(v)  \
+       (((v) << 24) & BM_ANADIG_PFD_528_PFD3_FRAC)
+#define BM_ANADIG_PFD_528_PFD2_CLKGATE 0x00800000
+#define BM_ANADIG_PFD_528_PFD2_STABLE 0x00400000
+#define BP_ANADIG_PFD_528_PFD2_FRAC      16
+#define BM_ANADIG_PFD_528_PFD2_FRAC 0x003F0000
+#define BF_ANADIG_PFD_528_PFD2_FRAC(v)  \
+       (((v) << 16) & BM_ANADIG_PFD_528_PFD2_FRAC)
+#define BM_ANADIG_PFD_528_PFD1_CLKGATE 0x00008000
+#define BM_ANADIG_PFD_528_PFD1_STABLE 0x00004000
+#define BP_ANADIG_PFD_528_PFD1_FRAC      8
+#define BM_ANADIG_PFD_528_PFD1_FRAC 0x00003F00
+#define BF_ANADIG_PFD_528_PFD1_FRAC(v)  \
+       (((v) << 8) & BM_ANADIG_PFD_528_PFD1_FRAC)
+#define BM_ANADIG_PFD_528_PFD0_CLKGATE 0x00000080
+#define BM_ANADIG_PFD_528_PFD0_STABLE 0x00000040
+#define BP_ANADIG_PFD_528_PFD0_FRAC      0
+#define BM_ANADIG_PFD_528_PFD0_FRAC 0x0000003F
+#define BF_ANADIG_PFD_528_PFD0_FRAC(v)  \
+       (((v) << 0) & BM_ANADIG_PFD_528_PFD0_FRAC)
+
+#define PLL2_PFD0_FREQ         352000000
+#define PLL2_PFD1_FREQ         594000000
+#define PLL2_PFD2_FREQ         400000000
+#define PLL2_PFD2_DIV_FREQ     200000000
+#define PLL3_PFD0_FREQ         720000000
+#define PLL3_PFD1_FREQ         540000000
+#define PLL3_PFD2_FREQ         508200000
+#define PLL3_PFD3_FREQ         454700000
+#define PLL3_80M               80000000
+#define PLL3_60M               60000000
+
+#endif /*__ARCH_ARM_MACH_MX6_CCM_REGS_H__ */
index 6d25c8d983fa146f5c56ffa0cb0d92fc4bbb4448..e165810ddc3d5c57aba4c157068054443ff5e724 100644 (file)
@@ -436,5 +436,14 @@ struct anatop_regs {
        u32     digprog;                /* 0x260 */
 };
 
+struct iomuxc_base_regs {
+       u32     gpr[14];        /* 0x000 */
+       u32     obsrv[5];       /* 0x038 */
+       u32     swmux_ctl[197]; /* 0x04c */
+       u32     swpad_ctl[250]; /* 0x360 */
+       u32     swgrp[26];      /* 0x748 */
+       u32     daisy[104];     /* 0x7b0..94c */
+};
+
 #endif /* __ASSEMBLER__*/
 #endif /* __ASM_ARCH_MX6_IMX_REGS_H__ */
index 4558f4fba251c26172634d5180dc6e8d1f44c46b..788b413219c2a4885674caf82a628f2df63abd80 100644 (file)
@@ -100,4 +100,115 @@ typedef u64 iomux_v3_cfg_t;
 int imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad);
 int imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count);
 
+/*
+ * IOMUXC_GPR13 bit fields
+ */
+#define IOMUXC_GPR13_SDMA_STOP_REQ     (1<<30)
+#define IOMUXC_GPR13_CAN2_STOP_REQ     (1<<29)
+#define IOMUXC_GPR13_CAN1_STOP_REQ     (1<<28)
+#define IOMUXC_GPR13_ENET_STOP_REQ     (1<<27)
+#define IOMUXC_GPR13_SATA_PHY_8_MASK   (7<<24)
+#define IOMUXC_GPR13_SATA_PHY_7_MASK   (0x1f<<19)
+#define IOMUXC_GPR13_SATA_PHY_6_SHIFT  16
+#define IOMUXC_GPR13_SATA_PHY_6_MASK   (7<<IOMUXC_GPR13_SATA_PHY_6_SHIFT)
+#define IOMUXC_GPR13_SATA_SPEED_MASK   (1<<15)
+#define IOMUXC_GPR13_SATA_PHY_5_MASK   (1<<14)
+#define IOMUXC_GPR13_SATA_PHY_4_MASK   (7<<11)
+#define IOMUXC_GPR13_SATA_PHY_3_MASK   (0x1f<<7)
+#define IOMUXC_GPR13_SATA_PHY_2_MASK   (0x1f<<2)
+#define IOMUXC_GPR13_SATA_PHY_1_MASK   (3<<0)
+
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_0P5DB     (0b000<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_1P0DB     (0b001<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_1P5DB     (0b010<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_2P0DB     (0b011<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_2P5DB     (0b100<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P0DB     (0b101<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P5DB     (0b110<<24)
+#define IOMUXC_GPR13_SATA_PHY_8_RXEQ_4P0DB     (0b111<<24)
+
+#define IOMUXC_GPR13_SATA_PHY_7_SATA1I (0b10000<<19)
+#define IOMUXC_GPR13_SATA_PHY_7_SATA1M (0b10000<<19)
+#define IOMUXC_GPR13_SATA_PHY_7_SATA1X (0b11010<<19)
+#define IOMUXC_GPR13_SATA_PHY_7_SATA2I (0b10010<<19)
+#define IOMUXC_GPR13_SATA_PHY_7_SATA2M (0b10010<<19)
+#define IOMUXC_GPR13_SATA_PHY_7_SATA2X (0b11010<<19)
+
+#define IOMUXC_GPR13_SATA_SPEED_1P5G   (0<<15)
+#define IOMUXC_GPR13_SATA_SPEED_3G     (1<<15)
+
+#define IOMUXC_GPR13_SATA_SATA_PHY_5_SS_DISABLED       (0<<14)
+#define IOMUXC_GPR13_SATA_SATA_PHY_5_SS_ENABLED                (1<<14)
+
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_16_16       (0<<11)
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_14_16       (1<<11)
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_12_16       (2<<11)
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_10_16       (3<<11)
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_9_16                (4<<11)
+#define IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_8_16                (5<<11)
+
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P00_DB        (0b0000<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P37_DB        (0b0001<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P74_DB        (0b0010<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_1P11_DB        (0b0011<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_1P48_DB        (0b0100<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_1P85_DB        (0b0101<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_2P22_DB        (0b0110<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_2P59_DB        (0b0111<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_2P96_DB        (0b1000<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_3P33_DB        (0b1001<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_3P70_DB        (0b1010<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_4P07_DB        (0b1011<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_4P44_DB        (0b1100<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_4P81_DB        (0b1101<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_5P28_DB        (0b1110<<7)
+#define IOMUXC_GPR13_SATA_PHY_3_TXBOOST_5P75_DB        (0b1111<<7)
+
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P937V      (0b00000<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P947V      (0b00001<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P957V      (0b00010<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P966V      (0b00011<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P976V      (0b00100<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P986V      (0b00101<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_0P996V      (0b00110<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P005V      (0b00111<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P015V      (0b01000<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P025V      (0b01001<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P035V      (0b01010<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P045V      (0b01011<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P054V      (0b01100<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P064V      (0b01101<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P074V      (0b01110<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P084V      (0b01111<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P094V      (0b10000<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P104V      (0b10001<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P113V      (0b10010<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P123V      (0b10011<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P133V      (0b10100<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P143V      (0b10101<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P152V      (0b10110<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P162V      (0b10111<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P172V      (0b11000<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P182V      (0b11001<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P191V      (0b11010<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P201V      (0b11011<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P211V      (0b11100<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P221V      (0b11101<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P230V      (0b11110<<2)
+#define IOMUXC_GPR13_SATA_PHY_2_TX_1P240V      (0b11111<<2)
+
+#define IOMUXC_GPR13_SATA_PHY_1_FAST   0
+#define IOMUXC_GPR13_SATA_PHY_1_MEDIUM 1
+#define IOMUXC_GPR13_SATA_PHY_1_SLOW   2
+
+#define IOMUXC_GPR13_SATA_MASK (IOMUXC_GPR13_SATA_PHY_8_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_7_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_6_MASK \
+                               |IOMUXC_GPR13_SATA_SPEED_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_5_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_4_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_3_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_2_MASK \
+                               |IOMUXC_GPR13_SATA_PHY_1_MASK)
+
 #endif /* __MACH_IOMUX_V3_H__*/
index 668e77af6ab09829b5c136e98740de858bc6f49b..711b30dfe2801b9186f8d752ed26cfef123448c9 100644 (file)
 
 u32 get_cpu_rev(void);
 
+void set_vddsoc(u32 mv);
+
 /*
  * Initializes on-chip ethernet controllers.
  * to override, implement board_eth_init()
  */
 
 int fecmxc_initialize(bd_t *bis);
-
+u32 get_ahb_clk(void);
+u32 get_periph_clk(void);
 #endif
index 84308e04b352b48e519c57ff47a1cdb1f535eed1..457f99d2c5056bc1408a93670b840d5344a43933 100644 (file)
@@ -474,12 +474,11 @@ struct prm {
        u8 res3[0x1c];
        u32 clksrc_ctrl;        /* 0x1270 */
 };
-#else /* __ASSEMBLY__ */
-#define PRM_RSTCTRL            0x48307250
-#define PRM_RSTCTRL_RESET      0x04
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL_STRICT_NAMES */
 
+#define PRM_RSTCTRL            0x48307250
+#define PRM_RSTCTRL_RESET      0x04
 #define SYSCLKDIV_1            (0x1 << 6)
 #define SYSCLKDIV_2            (0x1 << 7)
 
index f8c42c0d20621c483d5eb028075f5629b2343456..3ce1f07b8a372ae84b8d7d70f7044f6d2bb22f38 100644 (file)
@@ -33,7 +33,9 @@ typedef struct t2 {
        unsigned int devconf0;          /* 0x274 */
        unsigned char res2[0x060];      /* 0x278 */
        unsigned int devconf1;          /* 0x2D8 */
-       unsigned char res3[0x244];      /* 0x2DC */
+       unsigned char res3[0x16C];      /* 0x2DC */
+       unsigned int ctl_prog_io1;      /* 0x448 */
+       unsigned char res4[0x0D4];      /* 0x44C */
        unsigned int pbias_lite;        /* 0x520 */
 } t2_t;
 
@@ -48,6 +50,8 @@ typedef struct t2 {
 #define PBIASSPEEDCTRL0                        (1 << 2)
 #define PBIASLITEPWRDNZ1               (1 << 9)
 
+#define CTLPROGIO1SPEEDCTRL            (1 << 20)
+
 /*
  * OMAP HSMMC register definitions
  */
@@ -191,6 +195,6 @@ struct hsmmc {
 #define mmc_reg_out(addr, mask, val)\
        writel((readl(addr) & (~(mask))) | ((val) & (mask)), (addr))
 
-int omap_mmc_init(int dev_index);
+int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max);
 
 #endif /* MMC_HOST_DEF_H */
index 6daef49e97fff9de1d06685bc8206be193a035d3..71f183de8d1f47e2db3654264ee42bf9c288eead 100644 (file)
 #define CONTROL_PADCONF_STRBEN_DLY1    0x0224
 #define CONTROL_PADCONF_SYS_BOOT8      0x0226
 
+/* AM/DM37xx specific */
+#define CONTROL_PADCONF_GPIO127                0x0A54
+#define CONTROL_PADCONF_GPIO126                0x0A56
+#define CONTROL_PADCONF_GPIO128                0x0A58
+#define CONTROL_PADCONF_GPIO129                0x0A5A
+
 #define MUX_VAL(OFFSET,VALUE)\
        writew((VALUE), OMAP34XX_CTRL_BASE + (OFFSET));
 
index cd304e86842e9e6f3f5ecc131f05d934d5a1e5df..617729c32b7675f1bdd4c7793618b0a6b1119a1b 100644 (file)
@@ -652,23 +652,9 @@ struct omap4_scrm_regs {
 #define OMAP_SYS_CLK_IND_38_4_MHZ      6
 #define OMAP_32K_CLK_FREQ              32768
 
-/* PRM_VC_CFG_I2C_CLK */
-#define PRM_VC_CFG_I2C_CLK_SCLH_SHIFT          0
-#define PRM_VC_CFG_I2C_CLK_SCLH_MASK           0xFF
-#define PRM_VC_CFG_I2C_CLK_SCLL_SHIFT          8
-#define PRM_VC_CFG_I2C_CLK_SCLL_MASK           (0xFF << 8)
-
 /* PRM_VC_VAL_BYPASS */
 #define PRM_VC_I2C_CHANNEL_FREQ_KHZ    400
 
-#define PRM_VC_VAL_BYPASS_VALID_BIT    0x1000000
-#define PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT      0
-#define PRM_VC_VAL_BYPASS_SLAVEADDR_MASK       0x7F
-#define PRM_VC_VAL_BYPASS_REGADDR_SHIFT                8
-#define PRM_VC_VAL_BYPASS_REGADDR_MASK         0xFF
-#define PRM_VC_VAL_BYPASS_DATA_SHIFT           16
-#define PRM_VC_VAL_BYPASS_DATA_MASK            0xFF
-
 /* SMPS */
 #define SMPS_I2C_SLAVE_ADDR    0x12
 #define SMPS_REG_ADDR_VCORE1   0x55
@@ -754,10 +740,10 @@ extern struct omap4_prcm_regs *const prcm;
 extern const u32 sys_clk_array[8];
 
 void scale_vcores(void);
-void do_scale_tps62361(u32 reg, u32 volt_mv);
+void do_scale_tps62361(int gpio, u32 reg, u32 volt_mv);
+u32 get_offset_code(u32 offset);
 u32 omap_ddr_clk(void);
 void do_scale_vcore(u32 vcore_reg, u32 volt_mv);
-void setup_sri2c(void);
 void setup_post_dividers(u32 *const base, const struct dpll_params *params);
 u32 get_sys_clk_index(void);
 void enable_basic_clocks(void);
index 08b9c993531bb38983121ba7414c479b3ec15b3f..feddb7de5141d8b7e21fc1a37095299a88df0e32 100644 (file)
@@ -168,4 +168,15 @@ struct watchdog {
 #define OMAP_GPIO_CLEARDATAOUT         0x0190
 #define OMAP_GPIO_SETDATAOUT           0x0194
 
+/*
+ * PRCM
+ */
+
+/* PRM */
+#define PRM_BASE               0x4A306000
+#define PRM_DEVICE_BASE                (PRM_BASE + 0x1B00)
+
+#define PRM_RSTCTRL            PRM_DEVICE_BASE
+#define PRM_RSTCTRL_RESET      0x01
+
 #endif /* _CPU_H */
index ce1bce1fddd64c74302f899499499e898c507bd4..2114046e7130bc0cefee070a1ab4ce7343f29377 100644 (file)
@@ -169,6 +169,6 @@ struct hsmmc {
 #define mmc_reg_out(addr, mask, val)\
        writel((readl(addr) & (~(mask))) | ((val) & (mask)), (addr))
 
-int omap_mmc_init(int dev_index);
+int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max);
 
 #endif /* MMC_HOST_DEF_H */
index 30bfad7c20ff07ef0c407da87e0f1b38b26f5951..4de7c70bf66b19957cdaaf9cb49777ecc05d4c2d 100644 (file)
@@ -34,7 +34,7 @@ struct pad_conf_entry {
 
        u16 val;
 
-} __attribute__ ((packed));
+};
 
 #ifdef CONFIG_OFF_PADCONF
 #define OFF_PD          (1 << 12)
index 416c6de31432ea407406a92798ea0d0502ad3819..47c5883025ce818b8865e92d9c577edb8a85d3fa 100644 (file)
 #define TCLR_AR                        (0x1 << 1)
 #define TCLR_PRE               (0x1 << 5)
 
-/*
- * PRCM
- */
-
-/* PRM */
-#define PRM_BASE               0x4A306000
-#define PRM_DEVICE_BASE                (PRM_BASE + 0x1B00)
-
-#define PRM_RSTCTRL            PRM_DEVICE_BASE
-#define PRM_RSTCTRL_RESET      0x01
-
 /* Control Module */
 #define LDOSRAM_ACTMODE_VSET_IN_MASK   (0x1F << 5)
 #define LDOSRAM_VOLT_CTRL_OVERRIDE     0x0401040f
@@ -139,18 +128,24 @@ struct s32ktimer {
        unsigned int s32k_cr;   /* 0x10 */
 };
 
-struct omap4_sys_ctrl_regs {
+#define DEVICE_TYPE_SHIFT (0x8)
+#define DEVICE_TYPE_MASK (0x7 << DEVICE_TYPE_SHIFT)
+#define DEVICE_GP 0x3
+
+struct omap_sys_ctrl_regs {
        unsigned int pad1[129];
        unsigned int control_id_code;                   /* 0x4A002204 */
        unsigned int pad11[22];
        unsigned int control_std_fuse_opp_bgap;         /* 0x4a002260 */
-       unsigned int pad2[47];
+       unsigned int pad2[24];                          /* 0x4a002264 */
+       unsigned int control_status;                    /* 0x4a0022c4 */
+       unsigned int pad3[22];                          /* 0x4a0022c8 */
        unsigned int control_ldosram_iva_voltage_ctrl;  /* 0x4A002320 */
        unsigned int control_ldosram_mpu_voltage_ctrl;  /* 0x4A002324 */
        unsigned int control_ldosram_core_voltage_ctrl; /* 0x4A002328 */
-       unsigned int pad3[260277];
+       unsigned int pad4[260277];
        unsigned int control_pbiaslite;                 /* 0x4A100600 */
-       unsigned int pad4[63];
+       unsigned int pad5[63];
        unsigned int control_efuse_1;                   /* 0x4A100700 */
        unsigned int control_efuse_2;                   /* 0x4A100704 */
 };
index b8dbc2c9a207f4ec3e5d3e0f0edbc390aba67970..c6e3ad26ff29124fd507a5a28d472855e0aad5b9 100644 (file)
@@ -55,6 +55,8 @@ u32 omap_sdram_size(void);
 u32 cortex_rev(void);
 void init_omap_revision(void);
 void do_io_settings(void);
+void omap_vc_init(u16 speed_khz);
+int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data);
 /*
  * This is used to verify if the configuration header
  * was executed by Romcode prior to control of transfer
@@ -112,10 +114,4 @@ static inline u32 omap_hw_init_context(void)
 #endif
 }
 
-static inline u32 omap_revision(void)
-{
-       extern u32 *const omap4_revision;
-       return *omap4_revision;
-}
-
 #endif
index d0e6dd68dac53d86a976026c72e245534fa379b5..f32cf3eeef7beb8e79ef791b3945dc3155291087 100644 (file)
@@ -473,9 +473,11 @@ struct omap5_prcm_regs {
        u32 cm_wkup_rtc_clkctrl;                /* 4ae07880 */
        u32 pad214;                             /* 4ae07884 */
        u32 cm_wkup_bandgap_clkctrl;            /* 4ae07888 */
-       u32 pad215[197];                        /* 4ae0788c */
+       u32 pad215[1];                          /* 4ae0788c */
+       u32 cm_wkupaon_scrm_clkctrl;            /* 4ae07890 */
+       u32 pad216[195];
        u32 prm_vc_val_bypass;                  /* 4ae07ba0 */
-       u32 pad216[4];
+       u32 pad217[4];
        u32 prm_vc_cfg_i2c_mode;                /* 4ae07bb4 */
        u32 prm_vc_cfg_i2c_clk;                 /* 4ae07bb8 */
 };
@@ -514,6 +516,10 @@ struct omap5_prcm_regs {
 /* CM_IDLEST_DPLL fields */
 #define ST_DPLL_CLK_MASK               1
 
+/* SGX */
+#define CLKSEL_GPU_HYD_GCLK_MASK               (1 << 25)
+#define CLKSEL_GPU_CORE_GCLK_MASK              (1 << 24)
+
 /* CM_CLKSEL_DPLL */
 #define CM_CLKSEL_DPLL_DPLL_SD_DIV_SHIFT       24
 #define CM_CLKSEL_DPLL_DPLL_SD_DIV_MASK                (0xFF << 24)
@@ -591,6 +597,7 @@ struct omap5_prcm_regs {
 
 /* CM_L3INIT_HSMMCn_CLKCTRL */
 #define HSMMC_CLKCTRL_CLKSEL_MASK              (1 << 24)
+#define HSMMC_CLKCTRL_CLKSEL_DIV_MASK          (1 << 25)
 
 /* CM_WKUP_GPTIMER1_CLKCTRL */
 #define GPTIMER1_CLKCTRL_CLKSEL_MASK           (1 << 24)
@@ -610,36 +617,33 @@ struct omap5_prcm_regs {
 #define MPU_CLKCTRL_CLKSEL_ABE_DIV_MODE_SHIFT  25
 #define MPU_CLKCTRL_CLKSEL_ABE_DIV_MODE_MASK   (1 << 25)
 
+/* CM_WKUPAON_SCRM_CLKCTRL */
+#define OPTFCLKEN_SCRM_PER_SHIFT               9
+#define OPTFCLKEN_SCRM_PER_MASK                        (1 << 9)
+#define OPTFCLKEN_SCRM_CORE_SHIFT              8
+#define OPTFCLKEN_SCRM_CORE_MASK               (1 << 8)
+
 /* Clock frequencies */
 #define OMAP_SYS_CLK_FREQ_38_4_MHZ     38400000
 #define OMAP_SYS_CLK_IND_38_4_MHZ      6
 #define OMAP_32K_CLK_FREQ              32768
 
-/* PRM_VC_CFG_I2C_CLK */
-#define PRM_VC_CFG_I2C_CLK_SCLH_SHIFT          0
-#define PRM_VC_CFG_I2C_CLK_SCLH_MASK           0xFF
-#define PRM_VC_CFG_I2C_CLK_SCLL_SHIFT          8
-#define PRM_VC_CFG_I2C_CLK_SCLL_MASK           (0xFF << 8)
-
 /* PRM_VC_VAL_BYPASS */
 #define PRM_VC_I2C_CHANNEL_FREQ_KHZ    400
 
-#define PRM_VC_VAL_BYPASS_VALID_BIT    0x1000000
-#define PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT      0
-#define PRM_VC_VAL_BYPASS_SLAVEADDR_MASK       0x7F
-#define PRM_VC_VAL_BYPASS_REGADDR_SHIFT                8
-#define PRM_VC_VAL_BYPASS_REGADDR_MASK         0xFF
-#define PRM_VC_VAL_BYPASS_DATA_SHIFT           16
-#define PRM_VC_VAL_BYPASS_DATA_MASK            0xFF
-
 /* SMPS */
 #define SMPS_I2C_SLAVE_ADDR    0x12
-#define SMPS_REG_ADDR_VCORE1   0x55
-#define SMPS_REG_ADDR_VCORE2   0x5B
-#define SMPS_REG_ADDR_VCORE3   0x61
+#define SMPS_REG_ADDR_12_MPU   0x23
+#define SMPS_REG_ADDR_45_IVA   0x2B
+#define SMPS_REG_ADDR_8_CORE   0x37
+
+/* PALMAS VOLTAGE SETTINGS in mv for OPP_NOMINAL */
+#define VDD_MPU                1000
+#define VDD_MM         1000
+#define VDD_CORE       1040
 
-#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV             607700
-#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV 709000
+/* Standard offset is 0.5v expressed in uv */
+#define PALMAS_SMPS_BASE_VOLT_UV 500000
 
 /* TPS */
 #define TPS62361_I2C_SLAVE_ADDR                0x60
@@ -677,7 +681,7 @@ struct dpll_regs {
        u32 cm_div_h12_dpll;
        u32 cm_div_h13_dpll;
        u32 cm_div_h14_dpll;
-       u32 reserved[2];
+       u32 reserved[3];
        u32 cm_div_h22_dpll;
        u32 cm_div_h23_dpll;
 };
@@ -700,10 +704,10 @@ extern struct omap5_prcm_regs *const prcm;
 extern const u32 sys_clk_array[8];
 
 void scale_vcores(void);
-void do_scale_tps62361(u32 reg, u32 volt_mv);
+void do_scale_tps62361(int gpio, u32 reg, u32 volt_mv);
+u32 get_offset_code(u32 offset);
 u32 omap_ddr_clk(void);
 void do_scale_vcore(u32 vcore_reg, u32 volt_mv);
-void setup_sri2c(void);
 void setup_post_dividers(u32 *const base, const struct dpll_params *params);
 u32 get_sys_clk_index(void);
 void enable_basic_clocks(void);
index 0697a732de44ae043177cdf73e6981b8c7af3e5c..8ef17c9a146aab0368f914b133621445c0accd66 100644 (file)
@@ -172,4 +172,15 @@ struct watchdog {
 #define OMAP_GPIO_CLEARDATAOUT         0x0190
 #define OMAP_GPIO_SETDATAOUT           0x0194
 
+/*
+ * PRCM
+ */
+
+/* PRM */
+#define PRM_BASE               0x4AE06000
+#define PRM_DEVICE_BASE                (PRM_BASE + 0x1B00)
+
+#define PRM_RSTCTRL            PRM_DEVICE_BASE
+#define PRM_RSTCTRL_RESET      0x01
+
 #endif /* _CPU_H */
index ce1bce1fddd64c74302f899499499e898c507bd4..2114046e7130bc0cefee070a1ab4ce7343f29377 100644 (file)
@@ -169,6 +169,6 @@ struct hsmmc {
 #define mmc_reg_out(addr, mask, val)\
        writel((readl(addr) & (~(mask))) | ((val) & (mask)), (addr))
 
-int omap_mmc_init(int dev_index);
+int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max);
 
 #endif /* MMC_HOST_DEF_H */
index b8c21853f0a392994be81a7f68bc04a35700e547..4a6ed8b4552fba115954c45b45bf0058dceb8a26 100644 (file)
@@ -34,7 +34,7 @@ struct pad_conf_entry {
 
        u16 val;
 
-} __attribute__ ((__packed__));
+};
 
 #ifdef CONFIG_OFF_PADCONF
 #define OFF_PD          (1 << 12)
@@ -87,258 +87,256 @@ struct pad_conf_entry {
 #define CORE_REVISION          0x0000
 #define CORE_HWINFO            0x0004
 #define CORE_SYSCONFIG         0x0010
-#define GPMC_AD0               0x0040
-#define GPMC_AD1               0x0042
-#define GPMC_AD2               0x0044
-#define GPMC_AD3               0x0046
-#define GPMC_AD4               0x0048
-#define GPMC_AD5               0x004A
-#define GPMC_AD6               0x004C
-#define GPMC_AD7               0x004E
-#define GPMC_AD8               0x0050
-#define GPMC_AD9               0x0052
-#define GPMC_AD10              0x0054
-#define GPMC_AD11              0x0056
-#define GPMC_AD12              0x0058
-#define GPMC_AD13              0x005A
-#define GPMC_AD14              0x005C
-#define GPMC_AD15              0x005E
-#define GPMC_A16               0x0060
-#define GPMC_A17               0x0062
-#define GPMC_A18               0x0064
-#define GPMC_A19               0x0066
-#define GPMC_A20               0x0068
-#define GPMC_A21               0x006A
-#define GPMC_A22               0x006C
-#define GPMC_A23               0x006E
-#define GPMC_A24               0x0070
-#define GPMC_A25               0x0072
-#define GPMC_NCS0              0x0074
-#define GPMC_NCS1              0x0076
-#define GPMC_NCS2              0x0078
-#define GPMC_NCS3              0x007A
-#define GPMC_NWP               0x007C
-#define GPMC_CLK               0x007E
-#define GPMC_NADV_ALE          0x0080
-#define GPMC_NOE               0x0082
-#define GPMC_NWE               0x0084
-#define GPMC_NBE0_CLE          0x0086
-#define GPMC_NBE1              0x0088
-#define GPMC_WAIT0             0x008A
-#define GPMC_WAIT1             0x008C
-#define C2C_DATA11             0x008E
-#define C2C_DATA12             0x0090
-#define C2C_DATA13             0x0092
-#define C2C_DATA14             0x0094
-#define C2C_DATA15             0x0096
-#define HDMI_HPD               0x0098
-#define HDMI_CEC               0x009A
-#define HDMI_DDC_SCL           0x009C
-#define HDMI_DDC_SDA           0x009E
-#define CSI21_DX0              0x00A0
-#define CSI21_DY0              0x00A2
-#define CSI21_DX1              0x00A4
-#define CSI21_DY1              0x00A6
-#define CSI21_DX2              0x00A8
-#define CSI21_DY2              0x00AA
-#define CSI21_DX3              0x00AC
-#define CSI21_DY3              0x00AE
-#define CSI21_DX4              0x00B0
-#define CSI21_DY4              0x00B2
-#define CSI22_DX0              0x00B4
-#define CSI22_DY0              0x00B6
-#define CSI22_DX1              0x00B8
-#define CSI22_DY1              0x00BA
-#define CAM_SHUTTER            0x00BC
-#define CAM_STROBE             0x00BE
-#define CAM_GLOBALRESET                0x00C0
-#define USBB1_ULPITLL_CLK      0x00C2
-#define USBB1_ULPITLL_STP      0x00C4
-#define USBB1_ULPITLL_DIR      0x00C6
-#define USBB1_ULPITLL_NXT      0x00C8
-#define USBB1_ULPITLL_DAT0     0x00CA
-#define USBB1_ULPITLL_DAT1     0x00CC
-#define USBB1_ULPITLL_DAT2     0x00CE
-#define USBB1_ULPITLL_DAT3     0x00D0
-#define USBB1_ULPITLL_DAT4     0x00D2
-#define USBB1_ULPITLL_DAT5     0x00D4
-#define USBB1_ULPITLL_DAT6     0x00D6
-#define USBB1_ULPITLL_DAT7     0x00D8
-#define USBB1_HSIC_DATA                0x00DA
-#define USBB1_HSIC_STROBE      0x00DC
-#define USBC1_ICUSB_DP         0x00DE
-#define USBC1_ICUSB_DM         0x00E0
-#define SDMMC1_CLK             0x00E2
-#define SDMMC1_CMD             0x00E4
-#define SDMMC1_DAT0            0x00E6
-#define SDMMC1_DAT1            0x00E8
-#define SDMMC1_DAT2            0x00EA
-#define SDMMC1_DAT3            0x00EC
-#define SDMMC1_DAT4            0x00EE
-#define SDMMC1_DAT5            0x00F0
-#define SDMMC1_DAT6            0x00F2
-#define SDMMC1_DAT7            0x00F4
-#define ABE_MCBSP2_CLKX                0x00F6
-#define ABE_MCBSP2_DR          0x00F8
-#define ABE_MCBSP2_DX          0x00FA
-#define ABE_MCBSP2_FSX         0x00FC
-#define ABE_MCBSP1_CLKX                0x00FE
-#define ABE_MCBSP1_DR          0x0100
-#define ABE_MCBSP1_DX          0x0102
-#define ABE_MCBSP1_FSX         0x0104
-#define ABE_PDM_UL_DATA                0x0106
-#define ABE_PDM_DL_DATA                0x0108
-#define ABE_PDM_FRAME          0x010A
-#define ABE_PDM_LB_CLK         0x010C
-#define ABE_CLKS               0x010E
-#define ABE_DMIC_CLK1          0x0110
-#define ABE_DMIC_DIN1          0x0112
-#define ABE_DMIC_DIN2          0x0114
-#define ABE_DMIC_DIN3          0x0116
-#define UART2_CTS              0x0118
-#define UART2_RTS              0x011A
-#define UART2_RX               0x011C
-#define UART2_TX               0x011E
-#define HDQ_SIO                        0x0120
-#define I2C1_SCL               0x0122
-#define I2C1_SDA               0x0124
-#define I2C2_SCL               0x0126
-#define I2C2_SDA               0x0128
-#define I2C3_SCL               0x012A
-#define I2C3_SDA               0x012C
-#define I2C4_SCL               0x012E
-#define I2C4_SDA               0x0130
-#define MCSPI1_CLK             0x0132
-#define MCSPI1_SOMI            0x0134
-#define MCSPI1_SIMO            0x0136
-#define MCSPI1_CS0             0x0138
-#define MCSPI1_CS1             0x013A
-#define MCSPI1_CS2             0x013C
-#define MCSPI1_CS3             0x013E
-#define UART3_CTS_RCTX         0x0140
-#define UART3_RTS_SD           0x0142
-#define UART3_RX_IRRX          0x0144
-#define UART3_TX_IRTX          0x0146
-#define SDMMC5_CLK             0x0148
-#define SDMMC5_CMD             0x014A
-#define SDMMC5_DAT0            0x014C
-#define SDMMC5_DAT1            0x014E
-#define SDMMC5_DAT2            0x0150
-#define SDMMC5_DAT3            0x0152
-#define MCSPI4_CLK             0x0154
-#define MCSPI4_SIMO            0x0156
-#define MCSPI4_SOMI            0x0158
-#define MCSPI4_CS0             0x015A
-#define UART4_RX               0x015C
-#define UART4_TX               0x015E
-#define USBB2_ULPITLL_CLK      0x0160
-#define USBB2_ULPITLL_STP      0x0162
-#define USBB2_ULPITLL_DIR      0x0164
-#define USBB2_ULPITLL_NXT      0x0166
-#define USBB2_ULPITLL_DAT0     0x0168
-#define USBB2_ULPITLL_DAT1     0x016A
-#define USBB2_ULPITLL_DAT2     0x016C
-#define USBB2_ULPITLL_DAT3     0x016E
-#define USBB2_ULPITLL_DAT4     0x0170
-#define USBB2_ULPITLL_DAT5     0x0172
-#define USBB2_ULPITLL_DAT6     0x0174
-#define USBB2_ULPITLL_DAT7     0x0176
-#define USBB2_HSIC_DATA                0x0178
-#define USBB2_HSIC_STROBE      0x017A
-#define UNIPRO_TX0             0x017C
-#define UNIPRO_TY0             0x017E
-#define UNIPRO_TX1             0x0180
-#define UNIPRO_TY1             0x0182
-#define UNIPRO_TX2             0x0184
-#define UNIPRO_TY2             0x0186
-#define UNIPRO_RX0             0x0188
-#define UNIPRO_RY0             0x018A
-#define UNIPRO_RX1             0x018C
-#define UNIPRO_RY1             0x018E
-#define UNIPRO_RX2             0x0190
-#define UNIPRO_RY2             0x0192
-#define USBA0_OTG_CE           0x0194
-#define USBA0_OTG_DP           0x0196
-#define USBA0_OTG_DM           0x0198
-#define FREF_CLK1_OUT          0x019A
-#define FREF_CLK2_OUT          0x019C
-#define SYS_NIRQ1              0x019E
-#define SYS_NIRQ2              0x01A0
-#define SYS_BOOT0              0x01A2
-#define SYS_BOOT1              0x01A4
-#define SYS_BOOT2              0x01A6
-#define SYS_BOOT3              0x01A8
-#define SYS_BOOT4              0x01AA
-#define SYS_BOOT5              0x01AC
-#define DPM_EMU0               0x01AE
-#define DPM_EMU1               0x01B0
-#define DPM_EMU2               0x01B2
-#define DPM_EMU3               0x01B4
-#define DPM_EMU4               0x01B6
-#define DPM_EMU5               0x01B8
-#define DPM_EMU6               0x01BA
-#define DPM_EMU7               0x01BC
-#define DPM_EMU8               0x01BE
-#define DPM_EMU9               0x01C0
-#define DPM_EMU10              0x01C2
-#define DPM_EMU11              0x01C4
-#define DPM_EMU12              0x01C6
-#define DPM_EMU13              0x01C8
-#define DPM_EMU14              0x01CA
-#define DPM_EMU15              0x01CC
-#define DPM_EMU16              0x01CE
-#define DPM_EMU17              0x01D0
-#define DPM_EMU18              0x01D2
-#define DPM_EMU19              0x01D4
-#define WAKEUPEVENT_0          0x01D8
-#define WAKEUPEVENT_1          0x01DC
-#define WAKEUPEVENT_2          0x01E0
-#define WAKEUPEVENT_3          0x01E4
-#define WAKEUPEVENT_4          0x01E8
-#define WAKEUPEVENT_5          0x01EC
-#define WAKEUPEVENT_6          0x01F0
+#define EMMC_CLK               0x0040
+#define EMMC_CMD               0x0042
+#define EMMC_DATA0             0x0044
+#define EMMC_DATA1             0x0046
+#define EMMC_DATA2             0x0048
+#define EMMC_DATA3             0x004a
+#define EMMC_DATA4             0x004c
+#define EMMC_DATA5             0x004e
+#define EMMC_DATA6             0x0050
+#define EMMC_DATA7             0x0052
+#define C2C_CLKOUT0            0x0054
+#define C2C_CLKOUT1            0x0056
+#define C2C_CLKIN0             0x0058
+#define C2C_CLKIN1             0x005a
+#define C2C_DATAIN0            0x005c
+#define C2C_DATAIN1            0x005e
+#define C2C_DATAIN2            0x0060
+#define C2C_DATAIN3            0x0062
+#define C2C_DATAIN4            0x0064
+#define C2C_DATAIN5            0x0066
+#define C2C_DATAIN6            0x0068
+#define C2C_DATAIN7            0x006a
+#define C2C_DATAOUT0           0x006c
+#define C2C_DATAOUT1           0x006e
+#define C2C_DATAOUT2           0x0070
+#define C2C_DATAOUT3           0x0072
+#define C2C_DATAOUT4           0x0074
+#define C2C_DATAOUT5           0x0076
+#define C2C_DATAOUT6           0x0078
+#define C2C_DATAOUT7           0x007a
+#define C2C_DATA8              0x007c
+#define C2C_DATA9              0x007e
+#define C2C_DATA10             0x0080
+#define C2C_DATA11             0x0082
+#define C2C_DATA12             0x0084
+#define C2C_DATA13             0x0086
+#define C2C_DATA14             0x0088
+#define C2C_DATA15             0x008a
+#define LLIA_WAKEREQOUT                0x008c
+#define LLIB_WAKEREQOUT                0x008e
+#define HSI1_ACREADY           0x0090
+#define HSI1_CAREADY           0x0092
+#define HSI1_ACWAKE            0x0094
+#define HSI1_CAWAKE            0x0096
+#define HSI1_ACFLAG            0x0098
+#define HSI1_ACDATA            0x009a
+#define HSI1_CAFLAG            0x009c
+#define HSI1_CADATA            0x009e
+#define UART1_TX               0x00a0
+#define UART1_CTS              0x00a2
+#define UART1_RX               0x00a4
+#define UART1_RTS              0x00a6
+#define HSI2_CAREADY           0x00a8
+#define HSI2_ACREADY           0x00aa
+#define HSI2_CAWAKE            0x00ac
+#define HSI2_ACWAKE            0x00ae
+#define HSI2_CAFLAG            0x00b0
+#define HSI2_CADATA            0x00b2
+#define HSI2_ACFLAG            0x00b4
+#define HSI2_ACDATA            0x00b6
+#define UART2_RTS              0x00b8
+#define UART2_CTS              0x00ba
+#define UART2_RX               0x00bc
+#define UART2_TX               0x00be
+#define USBB1_HSIC_STROBE      0x00c0
+#define USBB1_HSIC_DATA                0x00c2
+#define USBB2_HSIC_STROBE      0x00c4
+#define USBB2_HSIC_DATA                0x00c6
+#define TIMER10_PWM_EVT                0x00c8
+#define DSIPORTA_TE0           0x00ca
+#define DSIPORTA_LANE0X                0x00cc
+#define DSIPORTA_LANE0Y                0x00ce
+#define DSIPORTA_LANE1X                0x00d0
+#define DSIPORTA_LANE1Y                0x00d2
+#define DSIPORTA_LANE2X                0x00d4
+#define DSIPORTA_LANE2Y                0x00d6
+#define DSIPORTA_LANE3X                0x00d8
+#define DSIPORTA_LANE3Y                0x00da
+#define DSIPORTA_LANE4X                0x00dc
+#define DSIPORTA_LANE4Y                0x00de
+#define DSIPORTC_LANE0X                0x00e0
+#define DSIPORTC_LANE0Y                0x00e2
+#define DSIPORTC_LANE1X                0x00e4
+#define DSIPORTC_LANE1Y                0x00e6
+#define DSIPORTC_LANE2X                0x00e8
+#define DSIPORTC_LANE2Y                0x00ea
+#define DSIPORTC_LANE3X                0x00ec
+#define DSIPORTC_LANE3Y                0x00ee
+#define DSIPORTC_LANE4X                0x00f0
+#define DSIPORTC_LANE4Y                0x00f2
+#define DSIPORTC_TE0           0x00f4
+#define TIMER9_PWM_EVT         0x00f6
+#define I2C4_SCL               0x00f8
+#define I2C4_SDA               0x00fa
+#define MCSPI2_CLK             0x00fc
+#define MCSPI2_SIMO            0x00fe
+#define MCSPI2_SOMI            0x0100
+#define MCSPI2_CS0             0x0102
+#define RFBI_DATA15            0x0104
+#define RFBI_DATA14            0x0106
+#define RFBI_DATA13            0x0108
+#define RFBI_DATA12            0x010a
+#define RFBI_DATA11            0x010c
+#define RFBI_DATA10            0x010e
+#define RFBI_DATA9             0x0110
+#define RFBI_DATA8             0x0112
+#define RFBI_DATA7             0x0114
+#define RFBI_DATA6             0x0116
+#define RFBI_DATA5             0x0118
+#define RFBI_DATA4             0x011a
+#define RFBI_DATA3             0x011c
+#define RFBI_DATA2             0x011e
+#define RFBI_DATA1             0x0120
+#define RFBI_DATA0             0x0122
+#define RFBI_WE                        0x0124
+#define RFBI_CS0               0x0126
+#define RFBI_A0                        0x0128
+#define RFBI_RE                        0x012a
+#define RFBI_HSYNC0            0x012c
+#define RFBI_TE_VSYNC0         0x012e
+#define GPIO6_182              0x0130
+#define GPIO6_183              0x0132
+#define GPIO6_184              0x0134
+#define GPIO6_185              0x0136
+#define GPIO6_186              0x0138
+#define GPIO6_187              0x013a
+#define HDMI_CEC               0x013c
+#define HDMI_HPD               0x013e
+#define HDMI_DDC_SCL           0x0140
+#define HDMI_DDC_SDA           0x0142
+#define CSIPORTC_LANE0X                0x0144
+#define CSIPORTC_LANE0Y                0x0146
+#define CSIPORTC_LANE1X                0x0148
+#define CSIPORTC_LANE1Y                0x014a
+#define CSIPORTB_LANE0X                0x014c
+#define CSIPORTB_LANE0Y                0x014e
+#define CSIPORTB_LANE1X                0x0150
+#define CSIPORTB_LANE1Y                0x0152
+#define CSIPORTB_LANE2X                0x0154
+#define CSIPORTB_LANE2Y                0x0156
+#define CSIPORTA_LANE0X                0x0158
+#define CSIPORTA_LANE0Y                0x015a
+#define CSIPORTA_LANE1X                0x015c
+#define CSIPORTA_LANE1Y                0x015e
+#define CSIPORTA_LANE2X                0x0160
+#define CSIPORTA_LANE2Y                0x0162
+#define CSIPORTA_LANE3X                0x0164
+#define CSIPORTA_LANE3Y                0x0166
+#define CSIPORTA_LANE4X                0x0168
+#define CSIPORTA_LANE4Y                0x016a
+#define CAM_SHUTTER            0x016c
+#define CAM_STROBE             0x016e
+#define CAM_GLOBALRESET                0x0170
+#define TIMER11_PWM_EVT                0x0172
+#define TIMER5_PWM_EVT         0x0174
+#define TIMER6_PWM_EVT         0x0176
+#define TIMER8_PWM_EVT         0x0178
+#define I2C3_SCL               0x017a
+#define I2C3_SDA               0x017c
+#define GPIO8_233              0x017e
+#define GPIO8_234              0x0180
+#define ABE_CLKS               0x0182
+#define ABEDMIC_DIN1           0x0184
+#define ABEDMIC_DIN2           0x0186
+#define ABEDMIC_DIN3           0x0188
+#define ABEDMIC_CLK1           0x018a
+#define ABEDMIC_CLK2           0x018c
+#define ABEDMIC_CLK3           0x018e
+#define ABESLIMBUS1_CLOCK      0x0190
+#define ABESLIMBUS1_DATA       0x0192
+#define ABEMCBSP2_DR           0x0194
+#define ABEMCBSP2_DX           0x0196
+#define ABEMCBSP2_FSX          0x0198
+#define ABEMCBSP2_CLKX         0x019a
+#define ABEMCPDM_UL_DATA       0x019c
+#define ABEMCPDM_DL_DATA       0x019e
+#define ABEMCPDM_FRAME         0x01a0
+#define ABEMCPDM_LB_CLK                0x01a2
+#define WLSDIO_CLK             0x01a4
+#define WLSDIO_CMD             0x01a6
+#define WLSDIO_DATA0           0x01a8
+#define WLSDIO_DATA1           0x01aa
+#define WLSDIO_DATA2           0x01ac
+#define WLSDIO_DATA3           0x01ae
+#define UART5_RX               0x01b0
+#define UART5_TX               0x01b2
+#define UART5_CTS              0x01b4
+#define UART5_RTS              0x01b6
+#define I2C2_SCL               0x01b8
+#define I2C2_SDA               0x01ba
+#define MCSPI1_CLK             0x01bc
+#define MCSPI1_SOMI            0x01be
+#define MCSPI1_SIMO            0x01c0
+#define MCSPI1_CS0             0x01c2
+#define MCSPI1_CS1             0x01c4
+#define I2C5_SCL               0x01c6
+#define I2C5_SDA               0x01c8
+#define PERSLIMBUS2_CLOCK      0x01ca
+#define PERSLIMBUS2_DATA       0x01cc
+#define UART6_TX               0x01ce
+#define UART6_RX               0x01d0
+#define UART6_CTS              0x01d2
+#define UART6_RTS              0x01d4
+#define UART3_CTS_RCTX         0x01d6
+#define UART3_RTS_IRSD         0x01d8
+#define UART3_TX_IRTX          0x01da
+#define UART3_RX_IRRX          0x01dc
+#define USBB3_HSIC_STROBE      0x01de
+#define USBB3_HSIC_DATA                0x01e0
+#define SDCARD_CLK             0x01e2
+#define SDCARD_CMD             0x01e4
+#define SDCARD_DATA2           0x01e6
+#define SDCARD_DATA3           0x01e8
+#define SDCARD_DATA0           0x01ea
+#define SDCARD_DATA1           0x01ec
+#define USBD0_HS_DP            0x01ee
+#define USBD0_HS_DM            0x01f0
+#define I2C1_PMIC_SCL          0x01f2
+#define I2C1_PMIC_SDA          0x01f4
+#define USBD0_SS_RX            0x01f6
 
-#define WKUP_REVISION          0x0000
-#define WKUP_HWINFO            0x0004
-#define WKUP_SYSCONFIG         0x0010
-#define PAD0_SIM_IO            0x0040
-#define PAD1_SIM_CLK           0x0042
-#define PAD0_SIM_RESET         0x0044
-#define PAD1_SIM_CD            0x0046
-#define PAD0_SIM_PWRCTRL               0x0048
-#define PAD1_SR_SCL            0x004A
-#define PAD0_SR_SDA            0x004C
-#define PAD1_FREF_XTAL_IN              0x004E
-#define PAD0_FREF_SLICER_IN    0x0050
-#define PAD1_FREF_CLK_IOREQ    0x0052
-#define PAD0_FREF_CLK0_OUT             0x0054
-#define PAD1_FREF_CLK3_REQ             0x0056
-#define PAD0_FREF_CLK3_OUT             0x0058
-#define PAD1_FREF_CLK4_REQ             0x005A
-#define PAD0_FREF_CLK4_OUT             0x005C
-#define PAD1_SYS_32K           0x005E
-#define PAD0_SYS_NRESPWRON             0x0060
-#define PAD1_SYS_NRESWARM              0x0062
-#define PAD0_SYS_PWR_REQ               0x0064
-#define PAD1_SYS_PWRON_RESET   0x0066
-#define PAD0_SYS_BOOT6         0x0068
-#define PAD1_SYS_BOOT7         0x006A
-#define PAD0_JTAG_NTRST                0x006C
-#define PAD1_JTAG_TCK          0x006D
-#define PAD0_JTAG_RTCK         0x0070
-#define PAD1_JTAG_TMS_TMSC             0x0072
-#define PAD0_JTAG_TDI          0x0074
-#define PAD1_JTAG_TDO          0x0076
-#define PADCONF_WAKEUPEVENT_0  0x007C
-#define CONTROL_SMART1NOPMIO_PADCONF_0         0x05A0
-#define CONTROL_SMART1NOPMIO_PADCONF_1         0x05A4
-#define PADCONF_MODE           0x05A8
-#define CONTROL_XTAL_OSCILLATOR                        0x05AC
-#define CONTROL_CONTROL_I2C_2                  0x0604
-#define CONTROL_CONTROL_JTAG                   0x0608
-#define CONTROL_CONTROL_SYS                    0x060C
-#define CONTROL_SPARE_RW               0x0614
-#define CONTROL_SPARE_R                0x0618
-#define CONTROL_SPARE_R_C0             0x061C
+#define LLIA_WAKEREQIN         0x0040
+#define LLIB_WAKEREQIN         0x0042
+#define DRM_EMU0               0x0044
+#define DRM_EMU1               0x0046
+#define JTAG_NTRST             0x0048
+#define JTAG_TCK               0x004a
+#define JTAG_RTCK              0x004c
+#define JTAG_TMSC              0x004e
+#define JTAG_TDI               0x0050
+#define JTAG_TDO               0x0052
+#define SYS_32K                        0x0054
+#define FREF_CLK_IOREQ         0x0056
+#define FREF_CLK0_OUT          0x0058
+#define FREF_CLK1_OUT          0x005a
+#define FREF_CLK2_OUT          0x005c
+#define FREF_CLK2_REQ          0x005e
+#define FREF_CLK1_REQ          0x0060
+#define SYS_NRESPWRON          0x0062
+#define SYS_NRESWARM           0x0064
+#define SYS_PWR_REQ            0x0066
+#define SYS_NIRQ1              0x0068
+#define SYS_NIRQ2              0x006a
+#define SR_PMIC_SCL            0x006c
+#define SR_PMIC_SDA            0x006e
+#define SYS_BOOT0              0x0070
+#define SYS_BOOT1              0x0072
+#define SYS_BOOT2              0x0074
+#define SYS_BOOT3              0x0076
+#define SYS_BOOT4              0x0078
+#define SYS_BOOT5              0x007a
 
 #endif /* _MUX_OMAP5_H_ */
index d811d6ec237739712118c5a0468a8865613f332c..e3f55d20201316a19f850adb858379daf772cdf3 100644 (file)
 #define TCLR_AR                        (0x1 << 1)
 #define TCLR_PRE               (0x1 << 5)
 
-/*
- * PRCM
- */
-
-/* PRM */
-#define PRM_BASE               0x4AE06000
-#define PRM_DEVICE_BASE                (PRM_BASE + 0x1B00)
-
-#define PRM_RSTCTRL            PRM_DEVICE_BASE
-#define PRM_RSTCTRL_RESET      0x01
-
 /* Control Module */
 #define LDOSRAM_ACTMODE_VSET_IN_MASK   (0x1F << 5)
 #define LDOSRAM_VOLT_CTRL_OVERRIDE     0x0401040f
 /* CONTROL_EFUSE_2 */
 #define CONTROL_EFUSE_2_NMOS_PMOS_PTV_CODE_1           0x00ffc000
 
-#define MMC1_PWRDNZ                                    (1 << 26)
-#define MMC1_PBIASLITE_PWRDNZ                          (1 << 22)
-#define MMC1_PBIASLITE_VMODE                           (1 << 21)
+#define SDCARD_PWRDNZ                                  (1 << 26)
+#define SDCARD_BIAS_HIZ_MODE                           (1 << 25)
+#define SDCARD_BIAS_PWRDNZ                             (1 << 22)
+#define SDCARD_PBIASLITE_VMODE                         (1 << 21)
 
 #ifndef __ASSEMBLY__
 
@@ -136,32 +126,117 @@ struct s32ktimer {
        unsigned int s32k_cr;   /* 0x10 */
 };
 
-struct omap4_sys_ctrl_regs {
-       unsigned int pad1[129];
-       unsigned int control_id_code;                   /* 0x4A002204 */
-       unsigned int pad11[22];
-       unsigned int control_std_fuse_opp_bgap;         /* 0x4a002260 */
-       unsigned int pad2[47];
-       unsigned int control_ldosram_iva_voltage_ctrl;  /* 0x4A002320 */
-       unsigned int control_ldosram_mpu_voltage_ctrl;  /* 0x4A002324 */
-       unsigned int control_ldosram_core_voltage_ctrl; /* 0x4A002328 */
-       unsigned int pad3[260277];
-       unsigned int control_pbiaslite;                 /* 0x4A100600 */
-       unsigned int pad4[63];
-       unsigned int control_efuse_1;                   /* 0x4A100700 */
-       unsigned int control_efuse_2;                   /* 0x4A100704 */
+#define DEVICE_TYPE_SHIFT 0x6
+#define DEVICE_TYPE_MASK (0x7 << DEVICE_TYPE_SHIFT)
+#define DEVICE_GP 0x3
+
+struct omap_sys_ctrl_regs {
+       u32 pad0[77]; /* 0x4A002000 */
+       u32 control_status; /* 0x4A002134 */
+       u32 pad1[794]; /* 0x4A002138 */
+       u32 control_paconf_global; /* 0x4A002DA0 */
+       u32 control_paconf_mode;  /* 0x4A002DA4 */
+       u32 control_smart1io_padconf_0; /* 0x4A002DA8 */
+       u32 control_smart1io_padconf_1; /* 0x4A002DAC */
+       u32 control_smart1io_padconf_2; /* 0x4A002DB0 */
+       u32 control_smart2io_padconf_0; /* 0x4A002DB4 */
+       u32 control_smart2io_padconf_1; /* 0x4A002DB8 */
+       u32 control_smart2io_padconf_2; /* 0x4A002DBC */
+       u32 control_smart3io_padconf_0; /* 0x4A002DC0 */
+       u32 control_smart3io_padconf_1; /* 0x4A002DC4 */
+       u32 pad2[14];
+       u32 control_pbias; /* 0x4A002E00 */
+       u32 control_i2c_0; /* 0x4A002E04 */
+       u32 control_camera_rx; /* 0x4A002E08 */
+       u32 control_hdmi_tx_phy; /* 0x4A002E0C */
+       u32 control_uniportm; /* 0x4A002E10 */
+       u32 control_dsiphy; /* 0x4A002E14 */
+       u32 control_mcbsplp; /* 0x4A002E18 */
+       u32 control_usb2phycore; /* 0x4A002E1C */
+       u32 control_hdmi_1; /*0x4A002E20*/
+       u32 control_hsi; /*0x4A002E24*/
+       u32 pad3[2];
+       u32 control_ddr3ch1_0; /*0x4A002E30*/
+       u32 control_ddr3ch2_0; /*0x4A002E34*/
+       u32 control_ddrch1_0;   /*0x4A002E38*/
+       u32 control_ddrch1_1;   /*0x4A002E3C*/
+       u32 control_ddrch2_0;   /*0x4A002E40*/
+       u32 control_ddrch2_1;   /*0x4A002E44*/
+       u32 control_lpddr2ch1_0; /*0x4A002E48*/
+       u32 control_lpddr2ch1_1; /*0x4A002E4C*/
+       u32 control_ddrio_0;  /*0x4A002E50*/
+       u32 control_ddrio_1;  /*0x4A002E54*/
+       u32 control_ddrio_2;  /*0x4A002E58*/
+       u32 control_hyst_1; /*0x4A002E5C*/
+       u32 control_usbb_hsic_control; /*0x4A002E60*/
+       u32 control_c2c; /*0x4A002E64*/
+       u32 control_core_control_spare_rw; /*0x4A002E68*/
+       u32 control_core_control_spare_r; /*0x4A002E6C*/
+       u32 control_core_control_spare_r_c0; /*0x4A002E70*/
+       u32 control_srcomp_north_side; /*0x4A002E74*/
+       u32 control_srcomp_south_side; /*0x4A002E78*/
+       u32 control_srcomp_east_side; /*0x4A002E7C*/
+       u32 control_srcomp_west_side; /*0x4A002E80*/
+       u32 control_srcomp_code_latch; /*0x4A002E84*/
+       u32 pad4[3680198];
+       u32 control_smart1nopmio_padconf_0; /* 0x4AE0CDA0 */
+       u32 control_smart1nopmio_padconf_1; /* 0x4AE0CDA4 */
+       u32 control_padconf_mode; /* 0x4AE0CDA8 */
+       u32 control_xtal_oscillator; /* 0x4AE0CDAC */
+       u32 control_i2c_2; /* 0x4AE0CDB0 */
+       u32 control_ckobuffer; /* 0x4AE0CDB4 */
+       u32 control_wkup_control_spare_rw; /* 0x4AE0CDB8 */
+       u32 control_wkup_control_spare_r; /* 0x4AE0CDBC */
+       u32 control_wkup_control_spare_r_c0; /* 0x4AE0CDC0 */
+       u32 control_srcomp_east_side_wkup; /* 0x4AE0CDC4 */
+       u32 control_efuse_1; /* 0x4AE0CDC8 */
+       u32 control_efuse_2; /* 0x4AE0CDCC */
+       u32 control_efuse_3; /* 0x4AE0CDD0 */
+       u32 control_efuse_4; /* 0x4AE0CDD4 */
+       u32 control_efuse_5; /* 0x4AE0CDD8 */
+       u32 control_efuse_6; /* 0x4AE0CDDC */
+       u32 control_efuse_7; /* 0x4AE0CDE0 */
+       u32 control_efuse_8; /* 0x4AE0CDE4 */
+       u32 control_efuse_9; /* 0x4AE0CDE8 */
+       u32 control_efuse_10; /* 0x4AE0CDEC */
+       u32 control_efuse_11; /* 0x4AE0CDF0 */
+       u32 control_efuse_12; /* 0x4AE0CDF4 */
+       u32 control_efuse_13; /* 0x4AE0CDF8 */
 };
 
-struct control_lpddr2io_regs {
-       unsigned int control_lpddr2io1_0;
-       unsigned int control_lpddr2io1_1;
-       unsigned int control_lpddr2io1_2;
-       unsigned int control_lpddr2io1_3;
-       unsigned int control_lpddr2io2_0;
-       unsigned int control_lpddr2io2_1;
-       unsigned int control_lpddr2io2_2;
-       unsigned int control_lpddr2io2_3;
-};
+/* Output impedance control */
+#define ds_120_ohm     0x0
+#define ds_60_ohm      0x1
+#define ds_45_ohm      0x2
+#define ds_30_ohm      0x3
+#define ds_mask                0x3
+
+/* Slew rate control */
+#define sc_slow                0x0
+#define sc_medium      0x1
+#define sc_fast                0x2
+#define sc_na          0x3
+#define sc_mask                0x3
+
+/* Target capacitance control */
+#define lb_5_12_pf     0x0
+#define lb_12_25_pf    0x1
+#define lb_25_50_pf    0x2
+#define lb_50_80_pf    0x3
+#define lb_mask                0x3
+
+#define usb_i_mask     0x7
+
+#define DDR_IO_I_34OHM_SR_FASTEST_WD_DQ_NO_PULL_DQS_PULL_DOWN   0x80828082
+#define DDR_IO_I_34OHM_SR_FASTEST_WD_CK_CKE_NCS_CA_PULL_DOWN 0x82828200
+#define DDR_IO_0_DDR2_DQ_INT_EN_ALL_DDR3_CA_DIS_ALL 0x8421
+#define DDR_IO_1_DQ_OUT_EN_ALL_DQ_INT_EN_ALL 0x8421084
+#define DDR_IO_2_CA_OUT_EN_ALL_CA_INT_EN_ALL 0x8421000
+
+#define EFUSE_1 0x45145100
+#define EFUSE_2 0x45145100
+#define EFUSE_3 0x45145100
+#define EFUSE_4 0x45145100
 #endif /* __ASSEMBLY__ */
 
 /*
@@ -169,7 +244,7 @@ struct control_lpddr2io_regs {
  * Non-secure RAM starts at 0x40300000 for GP devices. But we keep SRAM_BASE
  * at 0x40304000(EMU base) so that our code works for both EMU and GP
  */
-#define NON_SECURE_SRAM_START  0x40304000
+#define NON_SECURE_SRAM_START  0x40300000
 #define NON_SECURE_SRAM_END    0x40320000      /* Not inclusive */
 /* base address for indirect vectors (internal boot mode) */
 #define SRAM_ROM_VECT_BASE     0x4031F000
index 40a7c57489bee57d1e0e2eaf137095d3ffa5870a..8396a2214181750aaa7526b110952b9b00c0010e 100644 (file)
@@ -55,6 +55,8 @@ u32 omap_sdram_size(void);
 u32 cortex_rev(void);
 void init_omap_revision(void);
 void do_io_settings(void);
+void omap_vc_init(u16 speed_khz);
+int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data);
 
 /*
  * This is used to verify if the configuration header
@@ -113,10 +115,4 @@ static inline u32 omap_hw_init_context(void)
 #endif
 }
 
-static inline u32 omap_revision(void)
-{
-       extern u32 *const omap5_revision;
-       return *omap5_revision;
-}
-
 #endif
index adef4ee21dbd9eb08e3da470a5b37b3b74d3adc2..0f701c90120c7dbbbfd2ba3106bf6677697a5769 100644 (file)
 #ifndef __ASM_ARCH_MMC_H_
 #define __ASM_ARCH_MMC_H_
 
-#ifndef __ASSEMBLY__
-struct s5p_mmc {
-       unsigned int    sysad;
-       unsigned short  blksize;
-       unsigned short  blkcnt;
-       unsigned int    argument;
-       unsigned short  trnmod;
-       unsigned short  cmdreg;
-       unsigned int    rspreg0;
-       unsigned int    rspreg1;
-       unsigned int    rspreg2;
-       unsigned int    rspreg3;
-       unsigned int    bdata;
-       unsigned int    prnsts;
-       unsigned char   hostctl;
-       unsigned char   pwrcon;
-       unsigned char   blkgap;
-       unsigned char   wakcon;
-       unsigned short  clkcon;
-       unsigned char   timeoutcon;
-       unsigned char   swrst;
-       unsigned int    norintsts;      /* errintsts */
-       unsigned int    norintstsen;    /* errintstsen */
-       unsigned int    norintsigen;    /* errintsigen */
-       unsigned short  acmd12errsts;
-       unsigned char   res1[2];
-       unsigned int    capareg;
-       unsigned char   res2[4];
-       unsigned int    maxcurr;
-       unsigned char   res3[0x34];
-       unsigned int    control2;
-       unsigned int    control3;
-       unsigned char   res4[4];
-       unsigned int    control4;
-       unsigned char   res5[0x6e];
-       unsigned short  hcver;
-       unsigned char   res6[0xFFF00];
-};
+#define SDHCI_CONTROL2         0x80
+#define SDHCI_CONTROL3         0x84
+#define SDHCI_CONTROL4         0x8C
 
-struct mmc_host {
-       struct s5p_mmc *reg;
-       unsigned int version;   /* SDHCI spec. version */
-       unsigned int clock;     /* Current clock (MHz) */
-       int dev_index;
-};
+#define SDHCI_CTRL2_ENSTAASYNCCLR      (1 << 31)
+#define SDHCI_CTRL2_ENCMDCNFMSK                (1 << 30)
+#define SDHCI_CTRL2_CDINVRXD3          (1 << 29)
+#define SDHCI_CTRL2_SLCARDOUT          (1 << 28)
 
-int s5p_mmc_init(int dev_index, int bus_width);
+#define SDHCI_CTRL2_FLTCLKSEL_MASK     (0xf << 24)
+#define SDHCI_CTRL2_FLTCLKSEL_SHIFT    (24)
+#define SDHCI_CTRL2_FLTCLKSEL(_x)      ((_x) << 24)
 
-#endif /* __ASSEMBLY__ */
+#define SDHCI_CTRL2_LVLDAT_MASK                (0xff << 16)
+#define SDHCI_CTRL2_LVLDAT_SHIFT       (16)
+#define SDHCI_CTRL2_LVLDAT(_x)         ((_x) << 16)
+
+#define SDHCI_CTRL2_ENFBCLKTX          (1 << 15)
+#define SDHCI_CTRL2_ENFBCLKRX          (1 << 14)
+#define SDHCI_CTRL2_SDCDSEL            (1 << 13)
+#define SDHCI_CTRL2_SDSIGPC            (1 << 12)
+#define SDHCI_CTRL2_ENBUSYCHKTXSTART   (1 << 11)
+
+#define SDHCI_CTRL2_DFCNT_MASK(_x)     ((_x) << 9)
+#define SDHCI_CTRL2_DFCNT_SHIFT                (9)
+
+#define SDHCI_CTRL2_ENCLKOUTHOLD       (1 << 8)
+#define SDHCI_CTRL2_RWAITMODE          (1 << 7)
+#define SDHCI_CTRL2_DISBUFRD           (1 << 6)
+#define SDHCI_CTRL2_SELBASECLK_MASK(_x)        ((_x) << 4)
+#define SDHCI_CTRL2_SELBASECLK_SHIFT   (4)
+#define SDHCI_CTRL2_PWRSYNC            (1 << 3)
+#define SDHCI_CTRL2_ENCLKOUTMSKCON     (1 << 1)
+#define SDHCI_CTRL2_HWINITFIN          (1 << 0)
+
+#define SDHCI_CTRL3_FCSEL3             (1 << 31)
+#define SDHCI_CTRL3_FCSEL2             (1 << 23)
+#define SDHCI_CTRL3_FCSEL1             (1 << 15)
+#define SDHCI_CTRL3_FCSEL0             (1 << 7)
+
+#define SDHCI_CTRL4_DRIVE_MASK(_x)     ((_x) << 16)
+#define SDHCI_CTRL4_DRIVE_SHIFT                (16)
+
+int s5p_sdhci_init(u32 regbase, u32 max_clk, u32 min_clk, u32 quirks);
+
+static inline unsigned int s5p_mmc_init(int index, int bus_width)
+{
+       unsigned int base = samsung_get_base_mmc() + (0x10000 * index);
+       return s5p_sdhci_init(base, 52000000, 400000, index);
+}
 #endif
diff --git a/arch/arm/include/asm/arch-tegra2/ap20.h b/arch/arm/include/asm/arch-tegra2/ap20.h
new file mode 100644 (file)
index 0000000..d222c44
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * (C) Copyright 2010-2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+#include <asm/types.h>
+
+/* Stabilization delays, in usec */
+#define PLL_STABILIZATION_DELAY (300)
+#define IO_STABILIZATION_DELAY (1000)
+
+#define NVBL_PLLP_KHZ  (216000)
+
+#define PLLX_ENABLED           (1 << 30)
+#define CCLK_BURST_POLICY      0x20008888
+#define SUPER_CCLK_DIVIDER     0x80000000
+
+/* Calculate clock fractional divider value from ref and target frequencies */
+#define CLK_DIVIDER(REF, FREQ)  ((((REF) * 2) / FREQ) - 2)
+
+/* Calculate clock frequency value from reference and clock divider value */
+#define CLK_FREQUENCY(REF, REG)  (((REF) * 2) / (REG + 2))
+
+/* AVP/CPU ID */
+#define PG_UP_TAG_0_PID_CPU    0x55555555      /* CPU aka "a9" aka "mpcore" */
+#define PG_UP_TAG_0             0x0
+
+#define CORESIGHT_UNLOCK       0xC5ACCE55;
+
+/* AP20-Specific Base Addresses */
+
+/* AP20 Base physical address of SDRAM. */
+#define AP20_BASE_PA_SDRAM      0x00000000
+/* AP20 Base physical address of internal SRAM. */
+#define AP20_BASE_PA_SRAM       0x40000000
+/* AP20 Size of internal SRAM (256KB). */
+#define AP20_BASE_PA_SRAM_SIZE  0x00040000
+/* AP20 Base physical address of flash. */
+#define AP20_BASE_PA_NOR_FLASH  0xD0000000
+/* AP20 Base physical address of boot information table. */
+#define AP20_BASE_PA_BOOT_INFO  AP20_BASE_PA_SRAM
+
+/*
+ * Super-temporary stacks for EXTREMELY early startup. The values chosen for
+ * these addresses must be valid on ALL SOCs because this value is used before
+ * we are able to differentiate between the SOC types.
+ *
+ * NOTE: The since CPU's stack will eventually be moved from IRAM to SDRAM, its
+ *       stack is placed below the AVP stack. Once the CPU stack has been moved,
+ *       the AVP is free to use the IRAM the CPU stack previously occupied if
+ *       it should need to do so.
+ *
+ * NOTE: In multi-processor CPU complex configurations, each processor will have
+ *       its own stack of size CPU_EARLY_BOOT_STACK_SIZE. CPU 0 will have a
+ *       limit of CPU_EARLY_BOOT_STACK_LIMIT. Each successive CPU will have a
+ *       stack limit that is CPU_EARLY_BOOT_STACK_SIZE less then the previous
+ *       CPU.
+ */
+
+/* Common AVP early boot stack limit */
+#define AVP_EARLY_BOOT_STACK_LIMIT     \
+       (AP20_BASE_PA_SRAM + (AP20_BASE_PA_SRAM_SIZE/2))
+/* Common AVP early boot stack size */
+#define AVP_EARLY_BOOT_STACK_SIZE      0x1000
+/* Common CPU early boot stack limit */
+#define CPU_EARLY_BOOT_STACK_LIMIT     \
+       (AVP_EARLY_BOOT_STACK_LIMIT - AVP_EARLY_BOOT_STACK_SIZE)
+/* Common CPU early boot stack size */
+#define CPU_EARLY_BOOT_STACK_SIZE      0x1000
+
+#define EXCEP_VECTOR_CPU_RESET_VECTOR  (NV_PA_EVP_BASE + 0x100)
+#define CSITE_CPU_DBG0_LAR             (NV_PA_CSITE_BASE + 0x10FB0)
+#define CSITE_CPU_DBG1_LAR             (NV_PA_CSITE_BASE + 0x12FB0)
+
+#define FLOW_CTLR_HALT_COP_EVENTS      (NV_PA_FLOW_BASE + 4)
+#define FLOW_MODE_STOP                 2
+#define HALT_COP_EVENT_JTAG            (1 << 28)
+#define HALT_COP_EVENT_IRQ_1           (1 << 11)
+#define HALT_COP_EVENT_FIQ_1           (1 << 9)
+
+/* Start up the tegra2 SOC */
+void tegra2_start(void);
+
+/* This is the main entry into U-Boot, used by the Cortex-A9 */
+extern void _start(void);
+
+/**
+ * Works out the SOC type used for clocks settings
+ *
+ * @return     SOC type - see TEGRA_SOC...
+ */
+int tegra_get_chip_type(void);
diff --git a/arch/arm/include/asm/arch-tegra2/apb_misc.h b/arch/arm/include/asm/arch-tegra2/apb_misc.h
new file mode 100644 (file)
index 0000000..eb69d18
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2012 The Chromium OS Authors.
+ *
+ * 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
+ */
+
+#ifndef _GP_PADCTRL_H_
+#define _GP_PADCTRL_H_
+
+/* APB_MISC_PP registers */
+struct apb_misc_pp_ctlr {
+       u32     reserved0[2];
+       u32     strapping_opt_a;/* 0x08: APB_MISC_PP_STRAPPING_OPT_A */
+};
+
+/* bit fields definitions for APB_MISC_PP_STRAPPING_OPT_A register */
+#define RAM_CODE_SHIFT         4
+#define RAM_CODE_MASK          (0xf << RAM_CODE_SHIFT)
+
+#endif
index 415e4200122543c5d2bfd621a1edc22e28d8857b..8c3be915145af938c18ab2cc71254bc98a8adb66 100644 (file)
@@ -117,6 +117,7 @@ struct clk_rst_ctlr {
 #define PLL_CPCON_MASK         (15U << PLL_CPCON_SHIFT)
 
 #define PLL_LFCON_SHIFT                4
+#define PLL_LFCON_MASK         (15U << PLL_LFCON_SHIFT)
 
 #define PLLU_VCO_FREQ_SHIFT    20
 #define PLLU_VCO_FREQ_MASK     (1U << PLLU_VCO_FREQ_SHIFT)
@@ -124,6 +125,8 @@ struct clk_rst_ctlr {
 /* CLK_RST_CONTROLLER_OSC_CTRL_0 */
 #define OSC_FREQ_SHIFT         30
 #define OSC_FREQ_MASK          (3U << OSC_FREQ_SHIFT)
+#define OSC_XOBP_SHIFT         1
+#define OSC_XOBP_MASK          (1U << OSC_XOBP_SHIFT)
 
 /*
  * CLK_RST_CONTROLLER_CLK_SOURCE_x_OUT_0 - the mask here is normally 8 bits
index 6b12c76e8d5383df41ea0a94c87e0d638b5b4340..1d3ae3864407c42d06f8f0018e2e1aeae2d4cb36 100644 (file)
@@ -210,6 +210,21 @@ enum clock_osc_freq clock_get_osc_freq(void);
 unsigned long clock_start_pll(enum clock_id id, u32 divm, u32 divn,
                u32 divp, u32 cpcon, u32 lfcon);
 
+/**
+ * Read low-level parameters of a PLL.
+ *
+ * @param id   clock id to read (note: USB is not supported)
+ * @param divm returns input divider
+ * @param divn returns feedback divider
+ * @param divp returns post divider 2^n
+ * @param cpcon        returns charge pump setup control
+ * @param lfcon        returns loop filter setup control
+ *
+ * @returns 0 if ok, -1 on error (invalid clock id)
+ */
+int clock_ll_read_pll(enum clock_id clkid, u32 *divm, u32 *divn,
+                     u32 *divp, u32 *cpcon, u32 *lfcon);
+
 /*
  * Enable a clock
  *
@@ -368,6 +383,13 @@ void clock_ll_start_uart(enum periph_id periph_id);
  */
 enum periph_id clock_decode_periph_id(const void *blob, int node);
 
+/**
+ * Checks if the oscillator bypass is enabled (XOBP bit)
+ *
+ * @return 1 if bypass is enabled, 0 if not
+ */
+int clock_get_osc_bypass(void);
+
 /*
  * Checks that clocks are valid and prints a warning if not
  *
diff --git a/arch/arm/include/asm/arch-tegra2/emc.h b/arch/arm/include/asm/arch-tegra2/emc.h
new file mode 100644 (file)
index 0000000..deb3d36
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010,2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _ARCH_EMC_H_
+#define _ARCH_EMC_H_
+
+#include <asm/types.h>
+
+#define TEGRA_EMC_NUM_REGS     46
+
+/* EMC Registers */
+struct emc_ctlr {
+       u32 cfg;                /* 0x00: EMC_CFG */
+       u32 reserved0[3];       /* 0x04 ~ 0x0C */
+       u32 adr_cfg;            /* 0x10: EMC_ADR_CFG */
+       u32 adr_cfg1;           /* 0x14: EMC_ADR_CFG_1 */
+       u32 reserved1[2];       /* 0x18 ~ 0x18 */
+       u32 refresh_ctrl;       /* 0x20: EMC_REFCTRL */
+       u32 pin;                /* 0x24: EMC_PIN */
+       u32 timing_ctrl;        /* 0x28: EMC_TIMING_CONTROL */
+       u32 rc;                 /* 0x2C: EMC_RC */
+       u32 rfc;                /* 0x30: EMC_RFC */
+       u32 ras;                /* 0x34: EMC_RAS */
+       u32 rp;                 /* 0x38: EMC_RP */
+       u32 r2w;                /* 0x3C: EMC_R2W */
+       u32 w2r;                /* 0x40: EMC_W2R */
+       u32 r2p;                /* 0x44: EMC_R2P */
+       u32 w2p;                /* 0x48: EMC_W2P */
+       u32 rd_rcd;             /* 0x4C: EMC_RD_RCD */
+       u32 wd_rcd;             /* 0x50: EMC_WD_RCD */
+       u32 rrd;                /* 0x54: EMC_RRD */
+       u32 rext;               /* 0x58: EMC_REXT */
+       u32 wdv;                /* 0x5C: EMC_WDV */
+       u32 quse;               /* 0x60: EMC_QUSE */
+       u32 qrst;               /* 0x64: EMC_QRST */
+       u32 qsafe;              /* 0x68: EMC_QSAFE */
+       u32 rdv;                /* 0x6C: EMC_RDV */
+       u32 refresh;            /* 0x70: EMC_REFRESH */
+       u32 burst_refresh_num;  /* 0x74: EMC_BURST_REFRESH_NUM */
+       u32 pdex2wr;            /* 0x78: EMC_PDEX2WR */
+       u32 pdex2rd;            /* 0x7c: EMC_PDEX2RD */
+       u32 pchg2pden;          /* 0x80: EMC_PCHG2PDEN */
+       u32 act2pden;           /* 0x84: EMC_ACT2PDEN */
+       u32 ar2pden;            /* 0x88: EMC_AR2PDEN */
+       u32 rw2pden;            /* 0x8C: EMC_RW2PDEN */
+       u32 txsr;               /* 0x90: EMC_TXSR */
+       u32 tcke;               /* 0x94: EMC_TCKE */
+       u32 tfaw;               /* 0x98: EMC_TFAW */
+       u32 trpab;              /* 0x9C: EMC_TRPAB */
+       u32 tclkstable;         /* 0xA0: EMC_TCLKSTABLE */
+       u32 tclkstop;           /* 0xA4: EMC_TCLKSTOP */
+       u32 trefbw;             /* 0xA8: EMC_TREFBW */
+       u32 quse_extra;         /* 0xAC: EMC_QUSE_EXTRA */
+       u32 odt_write;          /* 0xB0: EMC_ODT_WRITE */
+       u32 odt_read;           /* 0xB4: EMC_ODT_READ */
+       u32 reserved2[5];       /* 0xB8 ~ 0xC8 */
+       u32 mrs;                /* 0xCC: EMC_MRS */
+       u32 emrs;               /* 0xD0: EMC_EMRS */
+       u32 ref;                /* 0xD4: EMC_REF */
+       u32 pre;                /* 0xD8: EMC_PRE */
+       u32 nop;                /* 0xDC: EMC_NOP */
+       u32 self_ref;           /* 0xE0: EMC_SELF_REF */
+       u32 dpd;                /* 0xE4: EMC_DPD */
+       u32 mrw;                /* 0xE8: EMC_MRW */
+       u32 mrr;                /* 0xEC: EMC_MRR */
+       u32 reserved3;          /* 0xF0: */
+       u32 fbio_cfg1;          /* 0xF4: EMC_FBIO_CFG1 */
+       u32 fbio_dqsib_dly;     /* 0xF8: EMC_FBIO_DQSIB_DLY */
+       u32 fbio_dqsib_dly_msb; /* 0xFC: EMC_FBIO_DQSIB_DLY_MSG */
+       u32 fbio_spare;         /* 0x100: SBIO_SPARE */
+                               /* There are more registers ... */
+};
+
+/**
+ * Set up the EMC for the given rate. The timing parameters are retrieved
+ * from the device tree "nvidia,tegra20-emc" node and its
+ * "nvidia,tegra20-emc-table" sub-nodes.
+ *
+ * @param blob Device tree blob
+ * @param rate Clock speed of memory controller in Hz (=2x memory bus rate)
+ * @return 0 if ok, else -ve error code (look in emc.c to decode it)
+ */
+int tegra_set_emc(const void *blob, unsigned rate);
+
+/**
+ * Get a pointer to the EMC controller from the device tree.
+ *
+ * @param blob Device tree blob
+ * @return pointer to EMC controller
+ */
+struct emc_ctlr *emc_get_controller(const void *blob);
+
+#endif
diff --git a/arch/arm/include/asm/arch-tegra2/flow.h b/arch/arm/include/asm/arch-tegra2/flow.h
new file mode 100644 (file)
index 0000000..cce6cbf
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * (C) Copyright 2010, 2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _FLOW_H_
+#define _FLOW_H_
+
+struct flow_ctlr {
+       u32     halt_cpu_events;
+       u32     halt_cop_events;
+       u32     cpu_csr;
+       u32     cop_csr;
+       u32     halt_cpu1_events;
+       u32     cpu1_csr;
+};
+
+#endif
diff --git a/arch/arm/include/asm/arch-tegra2/fuse.h b/arch/arm/include/asm/arch-tegra2/fuse.h
new file mode 100644 (file)
index 0000000..b7e3808
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *  (C) Copyright 2010,2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _FUSE_H_
+#define _FUSE_H_
+
+/* FUSE registers */
+struct fuse_regs {
+       u32 reserved0[64];              /* 0x00 - 0xFC: */
+       u32 production_mode;            /* 0x100: FUSE_PRODUCTION_MODE */
+       u32 reserved1[3];               /* 0x104 - 0x10c: */
+       u32 sku_info;                   /* 0x110 */
+       u32 reserved2[13];              /* 0x114 - 0x144: */
+       u32 fa;                         /* 0x148: FUSE_FA */
+       u32 reserved3[21];              /* 0x14C - 0x19C: */
+       u32 security_mode;              /* 0x1A0: FUSE_SECURITY_MODE */
+};
+
+#endif /* ifndef _FUSE_H_ */
diff --git a/arch/arm/include/asm/arch-tegra2/gp_padctrl.h b/arch/arm/include/asm/arch-tegra2/gp_padctrl.h
new file mode 100644 (file)
index 0000000..1755ab2
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  (C) Copyright 2010,2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _GP_PADCTRL_H_
+#define _GP_PADCTRL_H_
+
+/* APB_MISC_GP and padctrl registers */
+struct apb_misc_gp_ctlr {
+       u32     modereg;        /* 0x00: APB_MISC_GP_MODEREG */
+       u32     hidrev;         /* 0x04: APB_MISC_GP_HIDREV */
+       u32     reserved0[22];  /* 0x08 - 0x5C: */
+       u32     emu_revid;      /* 0x60: APB_MISC_GP_EMU_REVID */
+       u32     xactor_scratch; /* 0x64: APB_MISC_GP_XACTOR_SCRATCH */
+       u32     aocfg1;         /* 0x68: APB_MISC_GP_AOCFG1PADCTRL */
+       u32     aocfg2;         /* 0x6c: APB_MISC_GP_AOCFG2PADCTRL */
+       u32     atcfg1;         /* 0x70: APB_MISC_GP_ATCFG1PADCTRL */
+       u32     atcfg2;         /* 0x74: APB_MISC_GP_ATCFG2PADCTRL */
+       u32     cdevcfg1;       /* 0x78: APB_MISC_GP_CDEV1CFGPADCTRL */
+       u32     cdevcfg2;       /* 0x7C: APB_MISC_GP_CDEV2CFGPADCTRL */
+       u32     csuscfg;        /* 0x80: APB_MISC_GP_CSUSCFGPADCTRL */
+       u32     dap1cfg;        /* 0x84: APB_MISC_GP_DAP1CFGPADCTRL */
+       u32     dap2cfg;        /* 0x88: APB_MISC_GP_DAP2CFGPADCTRL */
+       u32     dap3cfg;        /* 0x8C: APB_MISC_GP_DAP3CFGPADCTRL */
+       u32     dap4cfg;        /* 0x90: APB_MISC_GP_DAP4CFGPADCTRL */
+       u32     dbgcfg;         /* 0x94: APB_MISC_GP_DBGCFGPADCTRL */
+       u32     lcdcfg1;        /* 0x98: APB_MISC_GP_LCDCFG1PADCTRL */
+       u32     lcdcfg2;        /* 0x9C: APB_MISC_GP_LCDCFG2PADCTRL */
+       u32     sdmmc2_cfg;     /* 0xA0: APB_MISC_GP_SDMMC2CFGPADCTRL */
+       u32     sdmmc3_cfg;     /* 0xA4: APB_MISC_GP_SDMMC3CFGPADCTRL */
+       u32     spicfg;         /* 0xA8: APB_MISC_GP_SPICFGPADCTRL */
+       u32     uaacfg;         /* 0xAC: APB_MISC_GP_UAACFGPADCTRL */
+       u32     uabcfg;         /* 0xB0: APB_MISC_GP_UABCFGPADCTRL */
+       u32     uart2cfg;       /* 0xB4: APB_MISC_GP_UART2CFGPADCTRL */
+       u32     uart3cfg;       /* 0xB8: APB_MISC_GP_UART3CFGPADCTRL */
+       u32     vicfg1;         /* 0xBC: APB_MISC_GP_VICFG1PADCTRL */
+       u32     vicfg2;         /* 0xC0: APB_MISC_GP_VICFG2PADCTRL */
+       u32     xm2cfga;        /* 0xC4: APB_MISC_GP_XM2CFGAPADCTRL */
+       u32     xm2cfgc;        /* 0xC8: APB_MISC_GP_XM2CFGCPADCTRL */
+       u32     xm2cfgd;        /* 0xCC: APB_MISC_GP_XM2CFGDPADCTRL */
+       u32     xm2clkcfg;      /* 0xD0: APB_MISC_GP_XM2CLKCFGPADCTRL */
+       u32     memcomp;        /* 0xD4: APB_MISC_GP_MEMCOMPPADCTRL */
+};
+
+/* bit fields definitions for APB_MISC_GP_HIDREV register */
+#define HIDREV_CHIPID_SHIFT            8
+#define HIDREV_CHIPID_MASK             (0xff << HIDREV_CHIPID_SHIFT)
+#define HIDREV_MAJORPREV_SHIFT         4
+#define HIDREV_MAJORPREV_MASK          (0xf << HIDREV_MAJORPREV_SHIFT)
+
+/* CHIPID field returned from APB_MISC_GP_HIDREV register */
+#define CHIPID_TEGRA2                          0x20
+
+#endif
diff --git a/arch/arm/include/asm/arch-tegra2/pmu.h b/arch/arm/include/asm/arch-tegra2/pmu.h
new file mode 100644 (file)
index 0000000..390815f
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ *  (C) Copyright 2010,2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _ARCH_PMU_H_
+#define _ARCH_PMU_H_
+
+/* Set core and CPU voltages to nominal levels */
+int pmu_set_nominal(void);
+
+#endif /* _ARCH_PMU_H_ */
diff --git a/arch/arm/include/asm/arch-tegra2/sdram_param.h b/arch/arm/include/asm/arch-tegra2/sdram_param.h
new file mode 100644 (file)
index 0000000..6c427d0
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ *  (C) Copyright 2010, 2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _SDRAM_PARAM_H_
+#define _SDRAM_PARAM_H_
+
+/*
+ * Defines the number of 32-bit words provided in each set of SDRAM parameters
+ * for arbitration configuration data.
+ */
+#define BCT_SDRAM_ARB_CONFIG_WORDS 27
+
+enum memory_type {
+       MEMORY_TYPE_NONE = 0,
+       MEMORY_TYPE_DDR,
+       MEMORY_TYPE_LPDDR,
+       MEMORY_TYPE_DDR2,
+       MEMORY_TYPE_LPDDR2,
+       MEMORY_TYPE_NUM,
+       MEMORY_TYPE_FORCE32 = 0x7FFFFFFF
+};
+
+/* Defines the SDRAM parameter structure */
+struct sdram_params {
+       enum memory_type memory_type;
+       u32 pllm_charge_pump_setup_control;
+       u32 pllm_loop_filter_setup_control;
+       u32 pllm_input_divider;
+       u32 pllm_feedback_divider;
+       u32 pllm_post_divider;
+       u32 pllm_stable_time;
+       u32 emc_clock_divider;
+       u32 emc_auto_cal_interval;
+       u32 emc_auto_cal_config;
+       u32 emc_auto_cal_wait;
+       u32 emc_pin_program_wait;
+       u32 emc_rc;
+       u32 emc_rfc;
+       u32 emc_ras;
+       u32 emc_rp;
+       u32 emc_r2w;
+       u32 emc_w2r;
+       u32 emc_r2p;
+       u32 emc_w2p;
+       u32 emc_rd_rcd;
+       u32 emc_wr_rcd;
+       u32 emc_rrd;
+       u32 emc_rext;
+       u32 emc_wdv;
+       u32 emc_quse;
+       u32 emc_qrst;
+       u32 emc_qsafe;
+       u32 emc_rdv;
+       u32 emc_refresh;
+       u32 emc_burst_refresh_num;
+       u32 emc_pdex2wr;
+       u32 emc_pdex2rd;
+       u32 emc_pchg2pden;
+       u32 emc_act2pden;
+       u32 emc_ar2pden;
+       u32 emc_rw2pden;
+       u32 emc_txsr;
+       u32 emc_tcke;
+       u32 emc_tfaw;
+       u32 emc_trpab;
+       u32 emc_tclkstable;
+       u32 emc_tclkstop;
+       u32 emc_trefbw;
+       u32 emc_quseextra;
+       u32 emc_fbioc_fg1;
+       u32 emc_fbio_dqsib_dly;
+       u32 emc_fbio_dqsib_dly_msb;
+       u32 emc_fbio_quse_dly;
+       u32 emc_fbio_quse_dly_msb;
+       u32 emc_fbio_cfg5;
+       u32 emc_fbio_cfg6;
+       u32 emc_fbio_spare;
+       u32 emc_mrs;
+       u32 emc_emrs;
+       u32 emc_mrw1;
+       u32 emc_mrw2;
+       u32 emc_mrw3;
+       u32 emc_mrw_reset_command;
+       u32 emc_mrw_reset_init_wait;
+       u32 emc_adr_cfg;
+       u32 emc_adr_cfg1;
+       u32 emc_emem_cfg;
+       u32 emc_low_latency_config;
+       u32 emc_cfg;
+       u32 emc_cfg2;
+       u32 emc_dbg;
+       u32 ahb_arbitration_xbar_ctrl;
+       u32 emc_cfg_dig_dll;
+       u32 emc_dll_xform_dqs;
+       u32 emc_dll_xform_quse;
+       u32 warm_boot_wait;
+       u32 emc_ctt_term_ctrl;
+       u32 emc_odt_write;
+       u32 emc_odt_read;
+       u32 emc_zcal_ref_cnt;
+       u32 emc_zcal_wait_cnt;
+       u32 emc_zcal_mrw_cmd;
+       u32 emc_mrs_reset_dll;
+       u32 emc_mrw_zq_init_dev0;
+       u32 emc_mrw_zq_init_dev1;
+       u32 emc_mrw_zq_init_wait;
+       u32 emc_mrs_reset_dll_wait;
+       u32 emc_emrs_emr2;
+       u32 emc_emrs_emr3;
+       u32 emc_emrs_ddr2_dll_enable;
+       u32 emc_mrs_ddr2_dll_reset;
+       u32 emc_emrs_ddr2_ocd_calib;
+       u32 emc_edr2_wait;
+       u32 emc_cfg_clktrim0;
+       u32 emc_cfg_clktrim1;
+       u32 emc_cfg_clktrim2;
+       u32 pmc_ddr_pwr;
+       u32 apb_misc_gp_xm2cfga_padctrl;
+       u32 apb_misc_gp_xm2cfgc_padctrl;
+       u32 apb_misc_gp_xm2cfgc_padctrl2;
+       u32 apb_misc_gp_xm2cfgd_padctrl;
+       u32 apb_misc_gp_xm2cfgd_padctrl2;
+       u32 apb_misc_gp_xm2clkcfg_padctrl;
+       u32 apb_misc_gp_xm2comp_padctrl;
+       u32 apb_misc_gp_xm2vttgen_padctrl;
+       u32 arbitration_config[BCT_SDRAM_ARB_CONFIG_WORDS];
+};
+#endif
index ca1881e3a2fd140a15f8c35d4f5d387b1b4fd0ae..d4ada10ea8cfe2a84d9a941d634ee541c7742d44 100644 (file)
@@ -33,6 +33,7 @@
 #define NV_PA_GPIO_BASE                0x6000D000
 #define NV_PA_EVP_BASE         0x6000F000
 #define NV_PA_APB_MISC_BASE    0x70000000
+#define TEGRA2_APB_MISC_GP_BASE        (NV_PA_APB_MISC_BASE + 0x0800)
 #define NV_PA_APB_UARTA_BASE   (NV_PA_APB_MISC_BASE + 0x6000)
 #define NV_PA_APB_UARTB_BASE   (NV_PA_APB_MISC_BASE + 0x6040)
 #define NV_PA_APB_UARTC_BASE   (NV_PA_APB_MISC_BASE + 0x6200)
@@ -40,6 +41,7 @@
 #define NV_PA_APB_UARTE_BASE   (NV_PA_APB_MISC_BASE + 0x6400)
 #define TEGRA2_SPI_BASE                (NV_PA_APB_MISC_BASE + 0xC380)
 #define TEGRA2_PMC_BASE                (NV_PA_APB_MISC_BASE + 0xE400)
+#define TEGRA2_FUSE_BASE       (NV_PA_APB_MISC_BASE + 0xF800)
 #define NV_PA_CSITE_BASE       0x70040000
 #define TEGRA_USB1_BASE                0xC5000000
 #define TEGRA_USB3_BASE                0xC5008000
 struct timerus {
        unsigned int cntr_1us;
 };
+
+/* Address at which WB code runs, it must not overlap Bootrom's IRAM usage */
+#define AP20_WB_RUN_ADDRESS    0x40020000
+
+/* These are the available SKUs (product types) for Tegra */
+enum {
+       SKU_ID_T20              = 0x8,
+       SKU_ID_T25SE            = 0x14,
+       SKU_ID_AP25             = 0x17,
+       SKU_ID_T25              = 0x18,
+       SKU_ID_AP25E            = 0x1b,
+       SKU_ID_T25E             = 0x1c,
+};
+
+/* These are the SOC categories that affect clocking */
+enum {
+       TEGRA_SOC_T20,
+       TEGRA_SOC_T25,
+
+       TEGRA_SOC_COUNT,
+       TEGRA_SOC_UNKNOWN       = -1,
+};
+
 #else  /* __ASSEMBLY__ */
 #define PRM_RSTCTRL            TEGRA2_PMC_BASE
 #endif
index 0a7d99c58581966f5da0d639ddc85b4040c04505..cfb136c466d5d712d951268e3a42abaca415a6a2 100644 (file)
@@ -154,4 +154,11 @@ struct i2c_ctlr {
 #define I2C_INT_ARBITRATION_LOST_SHIFT 2
 #define I2C_INT_ARBITRATION_LOST_MASK  (1 << I2C_INT_ARBITRATION_LOST_SHIFT)
 
+/**
+ * Returns the bus number of the DVC controller
+ *
+ * @return number of bus, or -1 if there is no DVC active
+ */
+int tegra_i2c_get_dvc_bus_num(void);
+
 #endif
diff --git a/arch/arm/include/asm/arch-tegra2/warmboot.h b/arch/arm/include/asm/arch-tegra2/warmboot.h
new file mode 100644 (file)
index 0000000..99ac2e7
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * (C) Copyright 2010, 2011
+ * NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _WARM_BOOT_H_
+#define _WARM_BOOT_H_
+
+#define STRAP_OPT_A_RAM_CODE_SHIFT     4
+#define STRAP_OPT_A_RAM_CODE_MASK      (0xf << STRAP_OPT_A_RAM_CODE_SHIFT)
+
+/* Defines the supported operating modes */
+enum fuse_operating_mode {
+       MODE_PRODUCTION = 3,
+       MODE_UNDEFINED,
+};
+
+/* Defines the CMAC-AES-128 hash length in 32 bit words. (128 bits = 4 words) */
+enum {
+       HASH_LENGTH = 4
+};
+
+/* Defines the storage for a hash value (128 bits) */
+struct hash {
+       u32 hash[HASH_LENGTH];
+};
+
+/*
+ * Defines the code header information for the boot rom.
+ *
+ * The code immediately follows the code header.
+ *
+ * Note that the code header needs to be 16 bytes aligned to preserve
+ * the alignment of relevant data for hash and decryption computations without
+ * requiring extra copies to temporary memory areas.
+ */
+struct wb_header {
+       u32 length_insecure;    /* length of the code header */
+       u32 reserved[3];
+       struct hash hash;       /* hash of header+code, starts next field*/
+       struct hash random_aes_block;   /* a data block to aid security. */
+       u32 length_secure;      /* length of the code header */
+       u32 destination;        /* destination address to put the wb code */
+       u32 entry_point;        /* execution address of the wb code */
+       u32 code_length;        /* length of the code */
+};
+
+/*
+ * The warm boot code needs direct access to these registers since it runs in
+ * SRAM and cannot call other U-Boot code.
+ */
+union osc_ctrl_reg {
+       struct {
+               u32 xoe:1;
+               u32 xobp:1;
+               u32 reserved0:2;
+               u32 xofs:6;
+               u32 reserved1:2;
+               u32 xods:5;
+               u32 reserved2:3;
+               u32 oscfi_spare:8;
+               u32 pll_ref_div:2;
+               u32 osc_freq:2;
+       };
+       u32 word;
+};
+
+union pllx_base_reg {
+       struct {
+               u32 divm:5;
+               u32 reserved0:3;
+               u32 divn:10;
+               u32 reserved1:2;
+               u32 divp:3;
+               u32 reserved2:4;
+               u32 lock:1;
+               u32 reserved3:1;
+               u32 ref_dis:1;
+               u32 enable:1;
+               u32 bypass:1;
+       };
+       u32 word;
+};
+
+union pllx_misc_reg {
+       struct {
+               u32 vcocon:4;
+               u32 lfcon:4;
+               u32 cpcon:4;
+               u32 lock_sel:6;
+               u32 reserved0:1;
+               u32 lock_enable:1;
+               u32 reserved1:1;
+               u32 dccon:1;
+               u32 pts:2;
+               u32 reserved2:6;
+               u32 out1_div_byp:1;
+               u32 out1_inv_clk:1;
+       };
+       u32 word;
+};
+
+/*
+ * TODO: This register is not documented in the TRM yet. We could move this
+ * into the EMC and give it a proper interface, but not while it is
+ * undocumented.
+ */
+union scratch3_reg {
+       struct {
+               u32 pllx_base_divm:5;
+               u32 pllx_base_divn:10;
+               u32 pllx_base_divp:3;
+               u32 pllx_misc_lfcon:4;
+               u32 pllx_misc_cpcon:4;
+       };
+       u32 word;
+};
+
+
+/**
+ * Save warmboot memory settings for a later resume
+ *
+ * @return 0 if ok, -1 on error
+ */
+int warmboot_save_sdram_params(void);
+
+int warmboot_prepare_code(u32 seg_address, u32 seg_length);
+int sign_data_block(u8 *source, u32 length, u8 *signature);
+void wb_start(void);   /* Start of WB assembly code */
+void wb_end(void);     /* End of WB assembly code */
+
+#endif
index e5c7d2cabe2d99664bf814ddf127ab824c7f6e53..f1e3ad212ebaf4352790b193edcb902e63a81d62 100644 (file)
 #define EMIF_REG_CS_TIM_MASK                   (0xf << 0)
 
 /* PWR_MGMT_CTRL_SHDW */
-#define EMIF_REG_PD_TIM_SHDW_SHIFT                     8
-#define EMIF_REG_PD_TIM_SHDW_MASK                      (0xf << 8)
+#define EMIF_REG_PD_TIM_SHDW_SHIFT                     12
+#define EMIF_REG_PD_TIM_SHDW_MASK                      (0xf << 12)
 #define EMIF_REG_SR_TIM_SHDW_SHIFT                     4
 #define EMIF_REG_SR_TIM_SHDW_MASK                      (0xf << 4)
 #define EMIF_REG_CS_TIM_SHDW_SHIFT                     0
        (DMM_SDRC_INTL_NONE << EMIF_SDRC_INTL_SHIFT)|\
        (0xFF << EMIF_SYS_ADDR_SHIFT))
 
+#define EMIF_EXT_PHY_CTRL_TIMING_REG   0x5
+#define EMIF_EXT_PHY_CTRL_CONST_REG    0x13
 
 /* Reg mapping structure */
 struct emif_reg_struct {
@@ -580,10 +582,64 @@ struct emif_reg_struct {
        u32 emif_zq_config;
        u32 emif_temp_alert_config;
        u32 emif_l3_err_log;
-       u32 padding6[4];
+       u32 emif_rd_wr_lvl_rmp_win;
+       u32 emif_rd_wr_lvl_rmp_ctl;
+       u32 emif_rd_wr_lvl_ctl;
+       u32 padding6[1];
        u32 emif_ddr_phy_ctrl_1;
        u32 emif_ddr_phy_ctrl_1_shdw;
        u32 emif_ddr_phy_ctrl_2;
+       u32 padding7[12];
+       u32 emif_rd_wr_exec_thresh;
+       u32 padding8[55];
+       u32 emif_ddr_ext_phy_ctrl_1;
+       u32 emif_ddr_ext_phy_ctrl_1_shdw;
+       u32 emif_ddr_ext_phy_ctrl_2;
+       u32 emif_ddr_ext_phy_ctrl_2_shdw;
+       u32 emif_ddr_ext_phy_ctrl_3;
+       u32 emif_ddr_ext_phy_ctrl_3_shdw;
+       u32 emif_ddr_ext_phy_ctrl_4;
+       u32 emif_ddr_ext_phy_ctrl_4_shdw;
+       u32 emif_ddr_ext_phy_ctrl_5;
+       u32 emif_ddr_ext_phy_ctrl_5_shdw;
+       u32 emif_ddr_ext_phy_ctrl_6;
+       u32 emif_ddr_ext_phy_ctrl_6_shdw;
+       u32 emif_ddr_ext_phy_ctrl_7;
+       u32 emif_ddr_ext_phy_ctrl_7_shdw;
+       u32 emif_ddr_ext_phy_ctrl_8;
+       u32 emif_ddr_ext_phy_ctrl_8_shdw;
+       u32 emif_ddr_ext_phy_ctrl_9;
+       u32 emif_ddr_ext_phy_ctrl_9_shdw;
+       u32 emif_ddr_ext_phy_ctrl_10;
+       u32 emif_ddr_ext_phy_ctrl_10_shdw;
+       u32 emif_ddr_ext_phy_ctrl_11;
+       u32 emif_ddr_ext_phy_ctrl_11_shdw;
+       u32 emif_ddr_ext_phy_ctrl_12;
+       u32 emif_ddr_ext_phy_ctrl_12_shdw;
+       u32 emif_ddr_ext_phy_ctrl_13;
+       u32 emif_ddr_ext_phy_ctrl_13_shdw;
+       u32 emif_ddr_ext_phy_ctrl_14;
+       u32 emif_ddr_ext_phy_ctrl_14_shdw;
+       u32 emif_ddr_ext_phy_ctrl_15;
+       u32 emif_ddr_ext_phy_ctrl_15_shdw;
+       u32 emif_ddr_ext_phy_ctrl_16;
+       u32 emif_ddr_ext_phy_ctrl_16_shdw;
+       u32 emif_ddr_ext_phy_ctrl_17;
+       u32 emif_ddr_ext_phy_ctrl_17_shdw;
+       u32 emif_ddr_ext_phy_ctrl_18;
+       u32 emif_ddr_ext_phy_ctrl_18_shdw;
+       u32 emif_ddr_ext_phy_ctrl_19;
+       u32 emif_ddr_ext_phy_ctrl_19_shdw;
+       u32 emif_ddr_ext_phy_ctrl_20;
+       u32 emif_ddr_ext_phy_ctrl_20_shdw;
+       u32 emif_ddr_ext_phy_ctrl_21;
+       u32 emif_ddr_ext_phy_ctrl_21_shdw;
+       u32 emif_ddr_ext_phy_ctrl_22;
+       u32 emif_ddr_ext_phy_ctrl_22_shdw;
+       u32 emif_ddr_ext_phy_ctrl_23;
+       u32 emif_ddr_ext_phy_ctrl_23_shdw;
+       u32 emif_ddr_ext_phy_ctrl_24;
+       u32 emif_ddr_ext_phy_ctrl_24_shdw;
 };
 
 struct dmm_lisa_map_regs {
@@ -593,6 +649,8 @@ struct dmm_lisa_map_regs {
        u32 dmm_lisa_map_3;
 };
 
+extern const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG];
+
 #define CS0    0
 #define CS1    1
 /* The maximum frequency at which the LPDDR2 interface can operate in Hz*/
@@ -748,7 +806,11 @@ struct dmm_lisa_map_regs {
 #define DPD_ENABLE     1
 
 /* Maximum delay before Low Power Modes */
+#ifndef CONFIG_OMAP54XX
 #define REG_CS_TIM             0xF
+#else
+#define REG_CS_TIM             0x0
+#endif
 #define REG_SR_TIM             0xF
 #define REG_PD_TIM             0xF
 
@@ -776,7 +838,7 @@ struct dmm_lisa_map_regs {
 /* EMIF_L3_CONFIG register value */
 #define EMIF_L3_CONFIG_VAL_SYS_10_LL_0 0x0A0000FF
 #define EMIF_L3_CONFIG_VAL_SYS_10_MPU_3_LL_0   0x0A300000
-#define EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0   0x0A300000
+#define EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0   0x0A500000
 
 /*
  * Value of bits 12:31 of DDR_PHY_CTRL_1 register:
@@ -798,6 +860,7 @@ struct dmm_lisa_map_regs {
 *              : So nWR is don't care
 */
 #define MR1_BL_8_BT_SEQ_WRAP_EN_NWR_3  0x23
+#define MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8  0xc3
 
 /* MR2 */
 #define MR2_RL3_WL1                    1
@@ -1005,6 +1068,11 @@ struct emif_regs {
        u32 temp_alert_config;
        u32 emif_ddr_phy_ctlr_1_init;
        u32 emif_ddr_phy_ctlr_1;
+       u32 emif_ddr_ext_phy_ctrl_1;
+       u32 emif_ddr_ext_phy_ctrl_2;
+       u32 emif_ddr_ext_phy_ctrl_3;
+       u32 emif_ddr_ext_phy_ctrl_4;
+       u32 emif_ddr_ext_phy_ctrl_5;
 };
 
 /* assert macros */
diff --git a/arch/arm/include/asm/linkage.h b/arch/arm/include/asm/linkage.h
new file mode 100644 (file)
index 0000000..dbe4b4e
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __ASM_LINKAGE_H
+#define __ASM_LINKAGE_H
+
+#define __ALIGN .align 0
+#define __ALIGN_STR ".align 0"
+
+#endif
index 6f25948e20ea04a1e1b727efcd4a1ae9d691704a..459b6b16e24e1902055f103748d810b68c097e03 100644 (file)
@@ -45,7 +45,7 @@ void preloader_console_init(void);
 #define BOOT_DEVICE_ONE_NAND    4
 #define BOOT_DEVICE_MMC1        5
 #define BOOT_DEVICE_MMC2        6
-#define BOOT_DEVICE_MMC3       7
+#define BOOT_DEVICE_MMC2_2     7
 #elif defined(CONFIG_OMAP44XX) /* OMAP4 */
 #define BOOT_DEVICE_NONE       0
 #define BOOT_DEVICE_XIP                1
@@ -54,6 +54,7 @@ void preloader_console_init(void);
 #define BOOT_DEVICE_ONE_NAND   4
 #define BOOT_DEVICE_MMC1       5
 #define BOOT_DEVICE_MMC2       6
+#define BOOT_DEVICE_MMC2_2     0xFF
 #elif defined(CONFIG_OMAP34XX) /* OMAP3 */
 #define BOOT_DEVICE_NONE       0
 #define BOOT_DEVICE_XIP                1
@@ -62,11 +63,13 @@ void preloader_console_init(void);
 #define BOOT_DEVICE_MMC2       5 /*emmc*/
 #define BOOT_DEVICE_MMC1       6
 #define BOOT_DEVICE_XIPWAIT    7
+#define BOOT_DEVICE_MMC2_2      0xFF
 #elif defined(CONFIG_AM33XX)   /* AM33XX */
 #define BOOT_DEVICE_NAND       5
 #define BOOT_DEVICE_MMC1       8
 #define BOOT_DEVICE_MMC2       0
 #define BOOT_DEVICE_UART       65
+#define BOOT_DEVICE_MMC2_2      0xFF
 #endif
 
 /* Boot type */
@@ -108,6 +111,12 @@ void spl_ymodem_load_image(void);
 void spl_board_init(void);
 #endif
 
+static inline u32 omap_revision(void)
+{
+       extern u32 *const omap_si_rev;
+       return *omap_si_rev;
+}
+
 /*
  * silicon revisions.
  * Moving this to common, so that most of code can be moved to common,
index 20e165393020e91625168638fbea8c005bebf698..eac3800729feded2aaf21c86fa83bd34a3c9404d 100644 (file)
@@ -38,7 +38,6 @@
 
 typedef struct bd_info {
     int                        bi_baudrate;    /* serial console baudrate */
-    unsigned long      bi_ip_addr;     /* IP Address */
     ulong              bi_arch_number; /* unique id for this board */
     ulong              bi_boot_params; /* where this board expects params */
        unsigned long   bi_arm_freq; /* arm frequency */
index 5270c112626a85ff7e2ae31d72e34a855fdacabc..024646cae5a7e8f8d459c620fe595e19e7484a4d 100644 (file)
@@ -555,9 +555,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        arm_pci_init();
 #endif
 
-       /* IP Address */
-       gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        stdio_init();   /* get the devices list going. */
 
        jumptable_init();
@@ -595,14 +592,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-       {
-               char *s = getenv("bootfile");
-
-               if (s != NULL)
-                       copy_filename(BootFile, s, sizeof(BootFile));
-       }
-#endif
 
 #ifdef CONFIG_BOARD_LATE_INIT
        board_late_init();
index ff1ed23db91673d8e03be133eb81fdc0a7a81b6b..1d2959a2adabf03f17737474ba5b747240964e25 100644 (file)
@@ -24,7 +24,6 @@
 
 typedef struct bd_info {
        unsigned long           bi_baudrate;
-       unsigned long           bi_ip_addr;
        unsigned char           bi_phy_id[4];
        unsigned long           bi_board_number;
        void                    *bi_boot_params;
index d626c29c00694660ec196d34859b94999aac82bd..b390a6c8f8bbaf08f187e3bd0fe9892ee6b4d683 100644 (file)
@@ -316,8 +316,6 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
        /* initialize environment */
        env_relocate();
 
-       bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
-
        stdio_init();
        jumptable_init();
        console_init_r();
@@ -329,9 +327,6 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
        bb_miiphy_init();
 #endif
 #if defined(CONFIG_CMD_NET)
-       s = getenv("bootfile");
-       if (s)
-               copy_filename(BootFile, s, sizeof(BootFile));
        puts("Net:   ");
        eth_initialize(gd->bd);
 #endif
index 9712fc00eecaa7856a15e55168d34a14237d2c50..df81183e81127eaf33cf14104ee2615d6fe12695 100644 (file)
@@ -30,7 +30,6 @@
 
 typedef struct bd_info {
        int bi_baudrate;                /* serial console baudrate */
-       unsigned long bi_ip_addr;       /* IP Address */
        unsigned long bi_boot_params;   /* where this board expects params */
        unsigned long bi_memstart;      /* start of DRAM memory */
        phys_size_t bi_memsize;         /* size  of DRAM memory in bytes */
index 2d424a2da0b9029fe42576a354609beef6d14a3e..c380d271e7c834c07bcd1060f5e2e1a75fb63fcc 100644 (file)
@@ -86,7 +86,6 @@ static void display_global_data(void)
        printf(" |-jt(%p): %p\n", gd->jt, *(gd->jt));
        printf(" \\-bd: %p\n", gd->bd);
        printf("   |-bi_baudrate: %x\n", bd->bi_baudrate);
-       printf("   |-bi_ip_addr: %lx\n", bd->bi_ip_addr);
        printf("   |-bi_boot_params: %lx\n", bd->bi_boot_params);
        printf("   |-bi_memstart: %lx\n", bd->bi_memstart);
        printf("   |-bi_memsize: %lx\n", bd->bi_memsize);
@@ -320,15 +319,8 @@ static void board_net_init_r(bd_t *bd)
        bb_miiphy_init();
 #endif
 #ifdef CONFIG_CMD_NET
-       char *s;
-
-       if ((s = getenv("bootfile")) != NULL)
-               copy_filename(BootFile, s, sizeof(BootFile));
-
-       bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        printf("Net:   ");
-       eth_initialize(gd->bd);
+       eth_initialize(bd);
 #endif
 }
 
index 0a48bbdbe6dfd2741461091a511b59db27d07349..973c9ee09854f7dc8a5344e7a6f355ec3ab9d515 100644 (file)
@@ -47,7 +47,6 @@ typedef struct bd_info {
        unsigned long bi_mbar_base;     /* base of internal registers */
        unsigned long bi_bootflags;     /* boot / reboot flag (for LynxOS) */
        unsigned long bi_boot_params;   /* where this board expects params */
-       unsigned long bi_ip_addr;       /* IP Address */
        unsigned short bi_ethspeed;     /* Ethernet speed in Mbps */
        unsigned long bi_intfreq;       /* Internal Freq, in MHz */
        unsigned long bi_busfreq;       /* Bus Freq, in MHz */
index 1526967fe3e73d90f13d76314696d75c61b3db55..65a8595c2bd684eb0483e6740cf17807554122a6 100644 (file)
@@ -507,15 +507,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
        /* relocate environment function pointers etc. */
        env_relocate ();
 
-       /*
-        * Fill in missing fields of bd_info.
-        * We do this here, where we have "normal" access to the
-        * environment; we used to do this still running from ROM,
-        * where had to use getenv_f(), which can be pretty slow when
-        * the environment is in EEPROM.
-        */
-       bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
-
        WATCHDOG_RESET ();
 
 #if defined(CONFIG_PCI)
@@ -568,11 +559,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-       if ((s = getenv ("bootfile")) != NULL) {
-               copy_filename (BootFile, s, sizeof (BootFile));
-       }
-#endif
 
        WATCHDOG_RESET ();
 
index 21c72d5940835fe0f603c741198f31623817b948..a0b1dbf9e67802af81ee6e1469277ae6b01a8975 100644 (file)
@@ -40,7 +40,6 @@ typedef struct bd_info {
        unsigned long   bi_flashoffset; /* reserved area for startup monitor */
        unsigned long   bi_sramstart;   /* start of SRAM memory */
        unsigned long   bi_sramsize;    /* size  of SRAM memory */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned long   bi_baudrate;    /* Console Baudrate */
 } bd_t;
 
index 9828b7630f99ade9015da2030a978735d60c794c..f3679d536bc304d3efa8553c60007df508d56b0c 100644 (file)
@@ -176,19 +176,12 @@ void board_init (void)
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
 
 #if defined(CONFIG_CMD_NET)
-       /* IP Address */
-       bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        printf("Net:   ");
        eth_initialize(gd->bd);
 
        uchar enetaddr[6];
        eth_getenv_enetaddr("ethaddr", enetaddr);
        printf("MAC:   %pM\n", enetaddr);
-
-       s = getenv("bootfile");
-       if (s != NULL)
-               copy_filename(BootFile, s, sizeof(BootFile));
 #endif
 
        /* main_loop */
index edb87bb066710b458b663fa52788b9ee10a86a9b..590649aa3edf8c57b254c0a72f8986914791010f 100644 (file)
@@ -33,7 +33,6 @@
 
 typedef struct bd_info {
        int             bi_baudrate;    /* serial console baudrate */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned long   bi_arch_number; /* unique id for this board */
        unsigned long   bi_boot_params; /* where this board expects params */
        unsigned long   bi_memstart;    /* start of DRAM memory */
index 38e6e77a34b460b480f7e6993d74efc4a40361d5..59a80011da1be8d1a632a0d019c3b074b9e91bf8 100644 (file)
@@ -320,9 +320,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        /* relocate environment function pointers etc. */
        env_relocate();
 
-       /* IP Address */
-       bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
 #if defined(CONFIG_PCI)
        /*
         * Do pci configuration
@@ -342,14 +339,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-       {
-               char *s = getenv("bootfile");
-
-               if (s != NULL)
-                       copy_filename(BootFile, s, sizeof(BootFile));
-       }
-#endif
 
 #ifdef CONFIG_CMD_SPI
        puts("SPI:   ");
index 9a697501d1fe3f5ccf85dce0cc022e6b6a7c4dcb..eabbf38fb1a55fc5dd95b92ad78e652477306b95 100644 (file)
@@ -40,7 +40,6 @@
 
 typedef struct bd_info {
        int             bi_baudrate;    /* serial console baudrate */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned char   bi_enetaddr[6]; /* Ethernet adress */
        unsigned long   bi_arch_number; /* unique id for this board */
        unsigned long   bi_boot_params; /* where this board expects params */
index 074aabf1e41e85171a7327c8dfc5fa95f402060f..7121313a83af800f478584701ff7366b8f844185 100644 (file)
@@ -369,9 +369,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        nds32_pci_init();
 #endif
 
-       /* IP Address */
-       gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        stdio_init();   /* get the devices list going. */
 
        jumptable_init();
@@ -402,12 +399,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
 
-#if defined(CONFIG_CMD_NET)
-       s = getenv("bootfile");
-       if (s != NULL)
-               copy_filename(BootFile, s, sizeof(BootFile));
-#endif
-
 #ifdef BOARD_LATE_INIT
        board_late_init();
 #endif
index f7c70ff0c149126c4fef7d8533b476b9332203f4..315ef8bedb9642c5d4d2e667f9fd8478eeb346c7 100644 (file)
@@ -39,7 +39,6 @@ typedef struct bd_info {
        unsigned long   bi_flashoffset; /* reserved area for startup monitor */
        unsigned long   bi_sramstart;   /* start of SRAM memory */
        unsigned long   bi_sramsize;    /* size  of SRAM memory */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned long   bi_baudrate;    /* Console Baudrate */
 } bd_t;
 
index 65de26e5c9351229d4461588a07efd6b694519d7..ca8a3e52462ba338a2154c8adda0e4d73c036a52 100644 (file)
@@ -143,8 +143,6 @@ void board_init (void)
        WATCHDOG_RESET ();
        env_relocate();
 
-       bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
-
        WATCHDOG_RESET ();
        stdio_init();
        jumptable_init();
index 2913994932a8734448a33b5e8a92c2a3f6f37111..76b813273ffd10138eec965feec00802b087ccce 100644 (file)
@@ -33,7 +33,6 @@
 
 typedef struct bd_info {
        unsigned long   bi_baudrate;    /* serial console baudrate */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned long   bi_arch_number; /* unique id for this board */
        unsigned long   bi_boot_params; /* where this board expects params */
        unsigned long   bi_memstart;    /* start of DRAM memory */
index b1a1dac16f0f7484bb5c97fca86e453bf37b6ddb..8ba9399169de6d2773e2c01eca286ef407a178ca 100644 (file)
@@ -51,13 +51,14 @@ SECTIONS
   PROVIDE (erotext = .);
   .reloc   :
   {
-    KEEP(*(.got))
     _GOT2_TABLE_ = .;
     KEEP(*(.got2))
+    KEEP(*(.got))
+    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);
     _FIXUP_TABLE_ = .;
     KEEP(*(.fixup))
   }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;
   __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
 
   .data    :
index 852f9aa4a392038212175544ecb017fca3ed2087..668158f7029ceae7d43666bd2e448c37d02c6c09 100644 (file)
@@ -37,10 +37,12 @@ SECTIONS
        .reloc : {
                _GOT2_TABLE_ = .;
                KEEP(*(.got2))
+               KEEP(*(.got))
+               PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);
                _FIXUP_TABLE_ = .;
                KEEP(*(.fixup))
        }
-       __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+       __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;
        __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
 
        . = ALIGN(8);
index b2fa2b574b940c5b321fc83e2db6603df5bb936f..1552054117b12f09f45471ca6fe28cc338e1bad2 100644 (file)
@@ -63,7 +63,6 @@ typedef struct bd_info {
        unsigned long   bi_vcofreq;     /* VCO Freq, in MHz */
 #endif
        unsigned long   bi_bootflags;   /* boot / reboot flag (Unused) */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned char   bi_enetaddr[6]; /* OLD: see README.enetaddr */
        unsigned short  bi_ethspeed;    /* Ethernet speed in Mbps */
        unsigned long   bi_intfreq;     /* Internal Freq, in MHz */
index d5b75e5fbd4b3fe2440e85889cb8cff02df93d13..fea310eedd1c5ce4cc4f82246d09661f6fe042f0 100644 (file)
@@ -877,9 +877,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
 #endif
 #endif /* CONFIG_CMD_NET */
 
-       /* IP Address */
-       bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        WATCHDOG_RESET();
 
 #if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
@@ -935,14 +932,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-       {
-               char *s = getenv("bootfile");
-
-               if (s != NULL)
-                       copy_filename(BootFile, s, sizeof(BootFile));
-       }
-#endif
 
        WATCHDOG_RESET();
 
index 166ef14341f811989e99dbf29a87798647a10131..de8120a72369bf632de236e10d7ec63997db87f2 100644 (file)
@@ -45,7 +45,6 @@ typedef struct bd_info {
        unsigned long   bi_sramstart;   /* start of SRAM memory */
        unsigned long   bi_sramsize;    /* size  of SRAM memory */
        unsigned long   bi_bootflags;   /* boot / reboot flag (for LynxOS) */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned short  bi_ethspeed;    /* Ethernet speed in Mbps */
        unsigned long   bi_intfreq;     /* Internal Freq, in MHz */
        unsigned long   bi_busfreq;     /* Bus Freq, in MHz */
index 306d1ec3320829f6da78858660bab93a650787a6..c173bf96f025f9153029776b5097ab989212eba4 100644 (file)
@@ -235,9 +235,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        /* initialize environment */
        env_relocate();
 
-       /* IP Address */
-       gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-
        stdio_init();   /* get the devices list going. */
 
        jumptable_init();
index 45745129a0dbf87db255a7f8a58358b75ced4ae7..6c04daf3bc73b411887fd2b60f7a00754d76158c 100644 (file)
@@ -33,7 +33,6 @@ typedef struct bd_info {
        unsigned long   bi_flashoffset; /* reserved area for startup monitor */
        unsigned long   bi_sramstart;   /* start of SRAM memory */
        unsigned long   bi_sramsize;    /* size  of SRAM memory */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned long   bi_baudrate;    /* Console Baudrate */
        unsigned long   bi_boot_params; /* where this board expects params */
 } bd_t;
index eb021e806ce2a750c7458f74e18703fc22f11279..34d7881f446728d1634cbf3e380c3bdf7c9918cf 100644 (file)
@@ -100,14 +100,6 @@ static int sh_mem_env_init(void)
        return 0;
 }
 
-#if defined(CONFIG_CMD_NET)
-static int sh_net_init(void)
-{
-       gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
-       return 0;
-}
-#endif
-
 #if defined(CONFIG_CMD_MMC)
 static int sh_mmc_init(void)
 {
@@ -145,9 +137,6 @@ init_fnc_t *init_sequence[] =
 #ifdef CONFIG_BOARD_LATE_INIT
        board_late_init,
 #endif
-#if defined(CONFIG_CMD_NET)
-       sh_net_init,            /* SH specific eth init */
-#endif
 #if defined(CONFIG_CMD_MMC)
        sh_mmc_init,
 #endif
@@ -201,15 +190,8 @@ void sh_generic_init(void)
        bb_miiphy_init();
 #endif
 #if defined(CONFIG_CMD_NET)
-       {
-               char *s;
-               puts("Net:   ");
-               eth_initialize(gd->bd);
-
-               s = getenv("bootfile");
-               if (s != NULL)
-                       copy_filename(BootFile, s, sizeof(BootFile));
-       }
+       puts("Net:   ");
+       eth_initialize(gd->bd);
 #endif /* CONFIG_CMD_NET */
 
        while (1) {
index 1d94087aab7b4fc511450f819e3b7d51056c9b5b..8d011185a0614c902f60784e4bea489c3fe94b2b 100644 (file)
@@ -51,7 +51,6 @@ typedef struct bd_info {
        unsigned long bi_sramstart;     /* start of SRAM memory */
        unsigned long bi_sramsize;      /* size  of SRAM memory */
        unsigned long bi_bootflags;     /* boot / reboot flag (for LynxOS) */
-       unsigned long bi_ip_addr;       /* IP Address */
        unsigned short bi_ethspeed;     /* Ethernet speed in Mbps */
        unsigned long bi_intfreq;       /* Internal Freq, in MHz */
        unsigned long bi_busfreq;       /* Bus Freq, in MHz */
index c0d260840cc5fec965806e6ed8eba52e43aee721..7e48775dfe292049d8497566ea30aff2a7aa742c 100644 (file)
@@ -333,8 +333,6 @@ void board_init_f(ulong bootflag)
        mac_read_from_eeprom();
 #endif
 
-       /* IP Address */
-       bd->bi_ip_addr = getenv_IPaddr("ipaddr");
 #if defined(CONFIG_PCI)
        /*
         * Do pci configuration
@@ -359,11 +357,6 @@ void board_init_f(ulong bootflag)
 
        /* Initialize from environment */
        load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-       if ((s = getenv("bootfile")) != NULL) {
-               copy_filename(BootFile, s, sizeof(BootFile));
-       }
-#endif /* CONFIG_CMD_NET */
 
        WATCHDOG_RESET();
 
index 192f18e1d501e0807ec8c5276ac136b3fe15ebae..8afb4432906b6d9e3c9431178ddb5b64ced998b7 100644 (file)
@@ -36,9 +36,7 @@ int set_reloc_flag_r(void);
 int mem_malloc_init_r(void);
 int init_bd_struct_r(void);
 int flash_init_r(void);
-int init_ip_address_r(void);
 int status_led_set_r(void);
-int set_bootfile_r(void);
 int set_load_addr_r(void);
 
 #endif /* !_INIT_HELPERS_H_ */
index 26450ebc44d5994792dd206042abf015184e5ff5..da667c50a498c1bad8c29f7134175598be891429 100644 (file)
@@ -45,7 +45,6 @@ typedef struct bd_info {
        unsigned long   bi_sramstart;   /* start of SRAM memory */
        unsigned long   bi_sramsize;    /* size  of SRAM memory */
        unsigned long   bi_bootflags;   /* boot / reboot flag (for LynxOS) */
-       unsigned long   bi_ip_addr;     /* IP Address */
        unsigned short  bi_ethspeed;    /* Ethernet speed in Mbps */
        unsigned long   bi_intfreq;     /* Internal Freq, in MHz */
        unsigned long   bi_busfreq;     /* Bus Freq, in MHz */
index 5f0b62cea6eede15baa0f9ea6a9c0dbdd7dc0cc7..90cf7fc8883c2ee02a0b22361b69a1905f214b4b 100644 (file)
@@ -157,9 +157,6 @@ init_fnc_t *init_sequence_r[] = {
        flash_init_r,
 #endif
        env_relocate_r,
-#ifdef CONFIG_CMD_NET
-       init_ip_address_r,
-#endif
 #ifdef CONFIG_PCI
        pci_init_r,
 #endif
@@ -180,9 +177,6 @@ init_fnc_t *init_sequence_r[] = {
        status_led_set_r,
 #endif
        set_load_addr_r,
-#if defined(CONFIG_CMD_NET)
-       set_bootfile_r,
-#endif
 #if defined(CONFIG_CMD_IDE)
        ide_init_r,
 #endif
index 9f4dee034f9155b15ade89ebc74b46e34928b8c4..9ec34ff992baec321687243d25b9b11da4ee51c6 100644 (file)
@@ -179,14 +179,6 @@ int flash_init_r(void)
 }
 #endif
 
-int init_ip_address_r(void)
-{
-       /* IP Address */
-       bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
-
-       return 0;
-}
-
 #ifdef CONFIG_STATUS_LED
 int status_led_set_r(void)
 {
@@ -196,18 +188,6 @@ int status_led_set_r(void)
 }
 #endif
 
-int set_bootfile_r(void)
-{
-       char *s;
-
-       s = getenv("bootfile");
-
-       if (s != NULL)
-               copy_filename(BootFile, s, sizeof(BootFile));
-
-       return 0;
-}
-
 int set_load_addr_r(void)
 {
        /* Initialize from environment */
diff --git a/board/cloudengines/pogo_e02/Makefile b/board/cloudengines/pogo_e02/Makefile
new file mode 100644 (file)
index 0000000..7f86691
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := pogo_e02.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/cloudengines/pogo_e02/kwbimage.cfg b/board/cloudengines/pogo_e02/kwbimage.cfg
new file mode 100644 (file)
index 0000000..a02e88d
--- /dev/null
@@ -0,0 +1,169 @@
+#
+# Copyright (C) 2012
+# David Purdy <david.c.purdy@gmail.com>
+#
+# Based on Kirkwood support:
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla <at> marvell.com>
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# Refer docs/README.kwimage for more details about how-to configure
+# and create kirkwood boot image
+#
+
+# Boot Media configurations
+BOOT_FROM      nand
+NAND_ECC_MODE  default
+NAND_PAGE_SIZE 0x0800
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0 interface pad voltage to 1.8V
+DATA 0xffd100e0 0x1b1b1b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xffd01400 0x43000c30     # DDR Configuration register
+# bit13-0:  0xc30 (3120 DDR2 clks refresh rate)
+# bit23-14: zero
+# bit24: 1= enable exit self refresh mode on DDR access
+# bit25: 1 required
+# bit29-26: zero
+# bit31-30: 01
+
+DATA 0xffd01404 0x37543000     # DDR Controller Control Low
+# bit 4:    0=addr/cmd in smame cycle
+# bit 5:    0=clk is driven during self refresh, we don't care for APX
+# bit 6:    0=use recommended falling edge of clk for addr/cmd
+# bit14:    0=input buffer always powered up
+# bit18:    1=cpu lock transaction enabled
+# bit23-20: 5=recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 7= CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 3 required
+# bit31:    0=no additional STARTBURST delay
+
+DATA 0xffd01408 0x22125451     # DDR Timing (Low) (active cycles value +1)
+# bit3-0:   TRAS lsbs
+# bit7-4:   TRCD
+# bit11- 8: TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20:    TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xffd0140c 0x00000a33     #  DDR Timing (High)
+# bit6-0:   TRFC
+# bit8-7:   TR2R
+# bit10-9:  TR2W
+# bit12-11: TW2W
+# bit31-13: zero required
+
+DATA 0xffd01410 0x000000cc     #  DDR Address Control
+# bit1-0:   00, Cs0width=x8
+# bit3-2:   11, Cs0size=1Gb
+# bit5-4:   00, Cs1width=x8
+# bit7-6:   11, Cs1size=1Gb
+# bit9-8:   00, Cs2width=nonexistent
+# bit11-10: 00, Cs2size =nonexistent
+# bit13-12: 00, Cs3width=nonexistent
+# bit15-14: 00, Cs3size =nonexistent
+# bit16:    0,  Cs0AddrSel
+# bit17:    0,  Cs1AddrSel
+# bit18:    0,  Cs2AddrSel
+# bit19:    0,  Cs3AddrSel
+# bit31-20: 0 required
+
+DATA 0xffd01414 0x00000000     #  DDR Open Pages Control
+# bit0:    0,  OpenPage enabled
+# bit31-1: 0 required
+
+DATA 0xffd01418 0x00000000     #  DDR Operation
+# bit3-0:   0x0, DDR cmd
+# bit31-4:  0 required
+
+DATA 0xffd0141c 0x00000c52     #  DDR Mode
+# bit2-0:   2, BurstLen=2 required
+# bit3:     0, BurstType=0 required
+# bit6-4:   4, CL=5
+# bit7:     0, TestMode=0 normal
+# bit8:     0, DLL reset=0 normal
+# bit11-9:  6, auto-precharge write recovery ????????????
+# bit12:    0, PD must be zero
+# bit31-13: 0 required
+
+DATA 0xffd01420 0x00000040     #  DDR Extended Mode
+# bit0:    0,  DDR DLL enabled
+# bit1:    0,  DDR drive strenght normal
+# bit2:    0,  DDR ODT control lsd (disabled)
+# bit5-3:  000, required
+# bit6:    1,  DDR ODT control msb, (disabled)
+# bit9-7:  000, required
+# bit10:   0,  differential DQS enabled
+# bit11:   0, required
+# bit12:   0, DDR output buffer enabled
+# bit31-13: 0 required
+
+DATA 0xffd01424 0x0000f17f     #  DDR Controller Control High
+# bit2-0:  111, required
+# bit3  :  1  , MBUS Burst Chop disabled
+# bit6-4:  111, required
+# bit7  :  0
+# bit8  :  1  , add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9  :  0  , no half clock cycle addition to dataout
+# bit10 :  0  , 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11 :  0  , 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 1111 required
+# bit31-16: 0    required
+
+DATA 0xffd01428 0x00085520     # DDR2 ODT Read Timing (default values)
+DATA 0xffd0147c 0x00008552     # DDR2 ODT Write Timing (default values)
+
+DATA 0xffd01500 0x00000000     # CS[0]n Base address to 0x0
+DATA 0xffd01504 0x0ffffff1     # CS[0]n Size
+# bit0:    1,  Window enabled
+# bit1:    0,  Write Protect disabled
+# bit3-2:  00, CS0 hit selected
+# bit23-4: ones, required
+# bit31-24: 0x0F, Size (i.e. 256MB)
+
+DATA 0xffd01508 0x10000000     # CS[1]n Base address to 256Mb
+DATA 0xffd0150c 0x00000000     # CS[2]n Size, window disabled
+
+DATA 0xffd01514 0x00000000     # CS[2]n Size, window disabled
+DATA 0xffd0151c 0x00000000     # CS[3]n Size, window disabled
+
+DATA 0xffd01494 0x00030000     #  DDR ODT Control (Low)
+# bit3-0:  2, ODT0Rd, MODT[0] asserted during read from DRAM CS1
+# bit7-4:  1, ODT0Rd, MODT[0] asserted during read from DRAM CS0
+# bit19-16:2, ODT0Wr, MODT[0] asserted during write to DRAM CS1
+# bit23-20:1, ODT0Wr, MODT[0] asserted during write to DRAM CS0
+
+DATA 0xffd01498 0x00000000     #  DDR ODT Control (High)
+# bit1-0:  00, ODT0 controlled by ODT Control (low) register above
+# bit3-2:  01, ODT1 active NEVER!
+# bit31-4: zero, required
+
+DATA 0xffd0149c 0x0000e803     # CPU ODT Control
+DATA 0xffd01480 0x00000001     # DDR Initialization Control
+#bit0=1, enable DDR init upon this register write
+
+# End of Header extension
+DATA 0x0 0x0
diff --git a/board/cloudengines/pogo_e02/pogo_e02.c b/board/cloudengines/pogo_e02/pogo_e02.c
new file mode 100644 (file)
index 0000000..ff3421d
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012
+ * David Purdy <david.c.purdy@gmail.com>
+ *
+ * Based on Kirkwood support:
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <common.h>
+#include <miiphy.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/kirkwood.h>
+#include <asm/arch/mpp.h>
+#include "pogo_e02.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+       /*
+        * default gpio configuration
+        * There are maximum 64 gpios controlled through 2 sets of registers
+        * the  below configuration configures mainly initial LED status
+        */
+       kw_config_gpio(POGO_E02_OE_VAL_LOW,
+                       POGO_E02_OE_VAL_HIGH,
+                       POGO_E02_OE_LOW, POGO_E02_OE_HIGH);
+
+       /* Multi-Purpose Pins Functionality configuration */
+       u32 kwmpp_config[] = {
+               MPP0_NF_IO2,
+               MPP1_NF_IO3,
+               MPP2_NF_IO4,
+               MPP3_NF_IO5,
+               MPP4_NF_IO6,
+               MPP5_NF_IO7,
+               MPP6_SYSRST_OUTn,
+               MPP7_GPO,
+               MPP8_UART0_RTS,
+               MPP9_UART0_CTS,
+               MPP10_UART0_TXD,
+               MPP11_UART0_RXD,
+               MPP12_SD_CLK,
+               MPP13_SD_CMD,
+               MPP14_SD_D0,
+               MPP15_SD_D1,
+               MPP16_SD_D2,
+               MPP17_SD_D3,
+               MPP18_NF_IO0,
+               MPP19_NF_IO1,
+               MPP29_TSMP9,    /* USB Power Enable */
+               MPP48_GPIO,     /* LED green */
+               MPP49_GPIO,     /* LED orange */
+               0
+       };
+       kirkwood_mpp_conf(kwmpp_config);
+       return 0;
+}
+
+int board_init(void)
+{
+       /* Boot parameters address */
+       gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100;
+
+       return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+/* Configure and initialize PHY */
+void reset_phy(void)
+{
+       u16 reg;
+       u16 devadr;
+       char *name = "egiga0";
+
+       if (miiphy_set_current_dev(name))
+               return;
+
+       /* command to read PHY dev address */
+       if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
+               printf("Err..(%s) could not read PHY dev address\n", __func__);
+               return;
+       }
+
+       /*
+        * Enable RGMII delay on Tx and Rx for CPU port
+        * Ref: sec 4.7.2 of chip datasheet
+        */
+       miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
+       miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, &reg);
+       reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
+       miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
+       miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
+
+       /* reset the phy */
+       miiphy_reset(name, devadr);
+
+       debug("88E1116 Initialized on %s\n", name);
+}
+#endif /* CONFIG_RESET_PHY_R */
diff --git a/board/cloudengines/pogo_e02/pogo_e02.h b/board/cloudengines/pogo_e02/pogo_e02.h
new file mode 100644 (file)
index 0000000..40b4bab
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012
+ * David Purdy <david.c.purdy@gmail.com>
+ *
+ * Based on Kirkwood support:
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __POGO_E02_H
+#define __POGO_E02_H
+
+/* GPIO configuration */
+#define POGO_E02_OE_LOW                                (~(0))
+#define POGO_E02_OE_HIGH                       (~(0))
+#define POGO_E02_OE_VAL_LOW                    (1 << 29)
+#define POGO_E02_OE_VAL_HIGH                   0
+
+/* PHY related */
+#define MV88E1116_LED_FCTRL_REG                        10
+#define MV88E1116_CPRSP_CR3_REG                        21
+#define MV88E1116_MAC_CTRL_REG                 21
+#define MV88E1116_PGADR_REG                    22
+#define MV88E1116_RGMII_TXTM_CTRL              (1 << 4)
+#define MV88E1116_RGMII_RXTM_CTRL              (1 << 5)
+
+#endif /* __POGO_E02_H */
index 7af1f41af2f9932590ebe4c82ffa76fbe554c697..89e6b08e7faf9b8dd0ee4800c819c2d47fd4f4eb 100644 (file)
@@ -99,17 +99,6 @@ int board_init(void)
        return 0;
 }
 
-/*
- * Routine: misc_init_r
- * Description: display die ID
- */
-int misc_init_r(void)
-{
-       dieid_num_r();
-
-       return 0;
-}
-
 /*
  * Routine: set_muxconf_regs
  * Description: Setting up the configuration Mux registers specific to the
@@ -241,6 +230,12 @@ static void cm_t3x_set_common_muxconf(void)
        /* I2C1 */
        MUX_VAL(CP(I2C1_SCL),           (IEN  | PTU | EN  | M0)); /*I2C1_SCL*/
        MUX_VAL(CP(I2C1_SDA),           (IEN  | PTU | EN  | M0)); /*I2C1_SDA*/
+       /* I2C2 */
+       MUX_VAL(CP(I2C2_SCL),           (IEN  | PTU | EN  | M0)); /*I2C2_SCL*/
+       MUX_VAL(CP(I2C2_SDA),           (IEN  | PTU | EN  | M0)); /*I2C2_SDA*/
+       /* I2C3 */
+       MUX_VAL(CP(I2C3_SCL),           (IEN  | PTU | EN  | M0)); /*I2C3_SCL*/
+       MUX_VAL(CP(I2C3_SDA),           (IEN  | PTU | EN  | M0)); /*I2C3_SDA*/
 
        /* control and debug */
        MUX_VAL(CP(SYS_32K),            (IEN  | PTD | DIS | M0)); /*SYS_32K*/
@@ -318,7 +313,7 @@ void set_muxconf_regs(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
index 65482813d249c22993955b650df95501953e79cf..c6c10717b783655e7ba9a50ca99775a82ac0113e 100644 (file)
@@ -147,7 +147,7 @@ void set_muxconf_regs(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 435711a2ab4f563c1b3fab9efd1d827398c19393..aaff2e868ba2e99e90e55afad877a9111838b058 100644 (file)
@@ -80,7 +80,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_GENERIC_MMC) && !(defined(CONFIG_SPL_BUILD))
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
index 43632c2fd8076bb175147400975fc9280e98ba3e..7e000404ee6534d96fa01ed6bd2497ac7e8c0b2e 100644 (file)
@@ -272,7 +272,7 @@ int board_init(void)
        return 0;
 }
 
-#ifdef BOARD_LATE_INIT
+#ifdef CONFIG_BOARD_LATE_INIT
 
 int board_late_init(void)
 {
@@ -287,7 +287,7 @@ int board_late_init(void)
 
        return 0;
 }
-#endif /* BOARD_LATE_INIT */
+#endif /* CONFIG_BOARD_LATE_INIT */
 
 #ifdef CONFIG_DRIVER_TI_EMAC
 
index 53df4761f6033c41577f69ce348c152779b9f6cc..3d28ea84debac6ff3cf6e2cf45df83379f089dde 100644 (file)
@@ -90,6 +90,8 @@ int board_mmc_init(bd_t *bis)
 {
        /* Configure WP as input. */
        gpio_direction_input(MX28_PAD_AUART2_CTS__GPIO_3_10);
+       /* Turn on the power to the card. */
+       gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0);
 
        return mxsmmc_initialize(bis, 0, m28_mmc_wp);
 }
@@ -103,10 +105,18 @@ int board_mmc_init(bd_t *bis)
 
 int fecmxc_mii_postcall(int phy)
 {
+#if    defined(CONFIG_DENX_M28_V11) || defined(CONFIG_DENX_M28_V10)
+       /* KZ8031 PHY on old boards. */
+       const uint32_t freq = 0x0080;
+#else
+       /* KZ8021 PHY on new boards. */
+       const uint32_t freq = 0x0000;
+#endif
+
        miiphy_write("FEC1", phy, MII_BMCR, 0x9000);
        miiphy_write("FEC1", phy, MII_OPMODE_STRAP_OVERRIDE, 0x0202);
        if (phy == 3)
-               miiphy_write("FEC1", 3, MII_PHY_CTRL2, 0x8180);
+               miiphy_write("FEC1", 3, MII_PHY_CTRL2, 0x8100 | freq);
        return 0;
 }
 
@@ -123,6 +133,14 @@ int board_eth_init(bd_t *bis)
                CLKCTRL_ENET_TIME_SEL_MASK | CLKCTRL_ENET_CLK_OUT_EN,
                CLKCTRL_ENET_TIME_SEL_RMII_CLK);
 
+#if !defined(CONFIG_DENX_M28_V11) && !defined(CONFIG_DENX_M28_V10)
+       /* Reset the new PHY */
+       gpio_direction_output(MX28_PAD_AUART2_RTS__GPIO_3_11, 0);
+       udelay(10000);
+       gpio_set_value(MX28_PAD_AUART2_RTS__GPIO_3_11, 1);
+       udelay(10000);
+#endif
+
        ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
        if (ret) {
                printf("FEC MXS: Unable to init FEC0\n");
index a04fe180c138c951d74b42a6ebcded42f826d73c..7a125925dea1aba463c9d9d4c2a4f7222b283b3f 100644 (file)
@@ -109,8 +109,9 @@ const iomux_cfg_t iomux_setup[] = {
                (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL),
        MX28_PAD_SSP0_SCK__SSP0_SCK |
                (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL),
-       MX28_PAD_PWM3__GPIO_3_28 | MUX_CONFIG_SSP0,     /* Power .. FIXME */
-       MX28_PAD_AUART2_CTS__GPIO_3_10, /* WP ... FIXME */
+       MX28_PAD_PWM3__GPIO_3_28 | MUX_CONFIG_SSP0 |
+               (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL),  /* Power */
+       MX28_PAD_AUART2_CTS__GPIO_3_10, /* WP */
 
        /* GPMI NAND */
        MX28_PAD_GPMI_D00__GPMI_D0 | MUX_CONFIG_GPMI,
@@ -147,6 +148,9 @@ const iomux_cfg_t iomux_setup[] = {
        MX28_PAD_ENET0_RXD3__ENET1_RXD1 | MUX_CONFIG_ENET,
        MX28_PAD_ENET0_TXD2__ENET1_TXD0 | MUX_CONFIG_ENET,
        MX28_PAD_ENET0_TXD3__ENET1_TXD1 | MUX_CONFIG_ENET,
+#if !defined(CONFIG_DENX_M28_V11) && !defined(CONFIG_DENX_M28_V10)
+       MX28_PAD_AUART2_RTS__GPIO_3_11, /* PHY reset */
+#endif
 
        /* I2C */
        MX28_PAD_I2C0_SCL__I2C0_SCL,
index 41b5ba0490673c737f5e76181b20ff5f82f459f6..1441b10a97851ea08128db1d73626878c7808aa2 100644 (file)
@@ -730,12 +730,11 @@ int do_get_bpip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                /*
                 * Update whole ip-addr
                 */
-               bd->bi_ip_addr = ipaddr;
                sprintf(str, "%ld.%ld.%ld.%ld",
-                       (bd->bi_ip_addr & 0xff000000) >> 24,
-                       (bd->bi_ip_addr & 0x00ff0000) >> 16,
-                       (bd->bi_ip_addr & 0x0000ff00) >> 8,
-                       (bd->bi_ip_addr & 0x000000ff));
+                       (ipaddr & 0xff000000) >> 24,
+                       (ipaddr & 0x00ff0000) >> 16,
+                       (ipaddr & 0x0000ff00) >> 8,
+                       (ipaddr & 0x000000ff));
                setenv("ipaddr", str);
                printf("Updated ip_addr from bp_eeprom to %s!\n", str);
        }
diff --git a/board/esg/ima3-mx53/Makefile b/board/esg/ima3-mx53/Makefile
new file mode 100644 (file)
index 0000000..f3b13bc
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# Copyright (C) 2012, Stefano Babic <sbabic@denx.de>
+#
+# Based on ti/evm/Makefile
+#
+# 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
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := ima3-mx53.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/esg/ima3-mx53/ima3-mx53.c b/board/esg/ima3-mx53/ima3-mx53.c
new file mode 100644 (file)
index 0000000..9ecf31d
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * (C) Copyright 2012, Stefano Babic <sbabic@denx.de>
+ *
+ * (C) Copyright 2010 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ */
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/mx5x_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux.h>
+#include <asm/errno.h>
+#include <netdev.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <asm/gpio.h>
+
+/* NOR flash configuration */
+#define IMA3_MX53_CS0GCR1      (CSEN | DSZ(2))
+#define IMA3_MX53_CS0GCR2      0
+#define IMA3_MX53_CS0RCR1      (RCSN(2) | OEN(1) | RWSC(15))
+#define IMA3_MX53_CS0RCR2      0
+#define IMA3_MX53_CS0WCR1      (WBED1 | WCSN(2) | WEN(1) | WWSC(15))
+#define IMA3_MX53_CS0WCR2      0
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void weim_nor_settings(void)
+{
+       struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
+
+       writel(IMA3_MX53_CS0GCR1, &weim_regs->cs0gcr1);
+       writel(IMA3_MX53_CS0GCR2, &weim_regs->cs0gcr2);
+       writel(IMA3_MX53_CS0RCR1, &weim_regs->cs0rcr1);
+       writel(IMA3_MX53_CS0RCR2, &weim_regs->cs0rcr2);
+       writel(IMA3_MX53_CS0WCR1, &weim_regs->cs0wcr1);
+       writel(IMA3_MX53_CS0WCR2, &weim_regs->cs0wcr2);
+       writel(0x0, &weim_regs->wcr);
+
+       set_chipselect_size(CS0_128);
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *) CONFIG_SYS_SDRAM_BASE,
+                       PHYS_SDRAM_1_SIZE);
+       return 0;
+}
+
+static void setup_iomux_uart(void)
+{
+       /* UART4 RXD */
+       mxc_request_iomux(MX53_PIN_CSI0_D13, IOMUX_CONFIG_ALT2);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D13,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
+               PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE |
+               PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       mxc_iomux_set_input(MX53_UART4_IPP_UART_RXD_MUX_SELECT_INPUT, 0x3);
+
+       /* UART4 TXD */
+       mxc_request_iomux(MX53_PIN_CSI0_D12, IOMUX_CONFIG_ALT2);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D12,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
+               PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE |
+               PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE);
+}
+
+static void setup_iomux_fec(void)
+{
+       /*FEC_MDIO*/
+       mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_MDIO,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH |
+               PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | PAD_CTL_22K_PU |
+               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       mxc_iomux_set_input(MX53_FEC_FEC_MDI_SELECT_INPUT, 0x1);
+
+       /*FEC_MDC*/
+       mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_MDC, PAD_CTL_DRV_HIGH);
+
+       /* FEC RXD3 */
+       mxc_request_iomux(MX53_PIN_KEY_COL0, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_COL0, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC RXD2 */
+       mxc_request_iomux(MX53_PIN_KEY_COL2, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_COL2, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC RXD1 */
+       mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_RXD1, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC RXD0 */
+       mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_RXD0, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC TXD3 */
+       mxc_request_iomux(MX53_PIN_GPIO_19, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_GPIO_19, PAD_CTL_DRV_HIGH);
+
+       /* FEC TXD2 */
+       mxc_request_iomux(MX53_PIN_KEY_ROW2, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_ROW2, PAD_CTL_DRV_HIGH);
+
+       /* FEC TXD1 */
+       mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, PAD_CTL_DRV_HIGH);
+
+       /* FEC TXD0 */
+       mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, PAD_CTL_DRV_HIGH);
+
+       /* FEC TX_EN */
+       mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, PAD_CTL_DRV_HIGH);
+
+       /* FEC TX_CLK */
+       mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC RX_ER */
+       mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC RX_DV */
+       mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT0);
+       mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC CRS */
+       mxc_request_iomux(MX53_PIN_KEY_COL3, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_COL3, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+
+       /* FEC COL */
+       mxc_request_iomux(MX53_PIN_KEY_ROW1, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_ROW1, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+       mxc_iomux_set_input(MX53_FEC_FEC_COL_SELECT_INPUT, 0x0);
+
+       /* FEC RX_CLK */
+       mxc_request_iomux(MX53_PIN_KEY_COL1, IOMUX_CONFIG_ALT6);
+       mxc_iomux_set_pad(MX53_PIN_KEY_COL1, PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PKE_ENABLE);
+       mxc_iomux_set_input(MX53_FEC_FEC_RX_CLK_SELECT_INPUT, 0x0);
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg esdhc_cfg = { MMC_SDHC1_BASE_ADDR, 1 };
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       int ret;
+
+       ret = !gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_1));
+
+       return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       mxc_request_iomux(MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0);
+       mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT1);
+       mxc_iomux_set_pad(MX53_PIN_GPIO_1,
+               PAD_CTL_DRV_HIGH | PAD_CTL_HYS_ENABLE |
+               PAD_CTL_PUE_KEEPER | PAD_CTL_100K_PU |
+               PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE);
+       gpio_direction_input(IOMUX_TO_GPIO(MX53_PIN_GPIO_1));
+
+       mxc_iomux_set_pad(MX53_PIN_SD1_CMD,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU);
+       mxc_iomux_set_pad(MX53_PIN_SD1_CLK,
+               PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE |
+               PAD_CTL_47K_PU | PAD_CTL_DRV_HIGH);
+       mxc_iomux_set_pad(MX53_PIN_SD1_DATA0,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_pad(MX53_PIN_SD1_DATA1,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_pad(MX53_PIN_SD1_DATA2,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_pad(MX53_PIN_SD1_DATA3,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+
+       return fsl_esdhc_initialize(bis, &esdhc_cfg);
+}
+#endif
+
+static void setup_iomux_spi(void)
+{
+       /* SCLK */
+       mxc_request_iomux(MX53_PIN_CSI0_D8, IOMUX_CONFIG_ALT3);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D8,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_input(MX53_ECSPI2_IPP_CSPI_CLK_IN_SELECT_INPUT, 0x1);
+       /* MOSI */
+       mxc_request_iomux(MX53_PIN_CSI0_D9, IOMUX_CONFIG_ALT3);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D9,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_input(MX53_ECSPI2_IPP_IND_MOSI_SELECT_INPUT, 0x1);
+       /* MISO */
+       mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT3);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D10,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       mxc_iomux_set_input(MX53_ECSPI2_IPP_IND_MISO_SELECT_INPUT, 0x1);
+       /* SSEL 0 */
+       mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_GPIO);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D11,
+               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_PULL |
+               PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU);
+       gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_CSI0_D11), 1);
+}
+
+int board_early_init_f(void)
+{
+       /* configure I/O pads */
+       setup_iomux_uart();
+       setup_iomux_fec();
+
+       weim_nor_settings();
+
+       /* configure spi */
+       setup_iomux_spi();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+
+       mxc_set_sata_internal_clock();
+
+       return 0;
+}
+
+#if defined(CONFIG_RESET_PHY_R)
+#include <miiphy.h>
+
+void reset_phy(void)
+{
+       unsigned short reg;
+
+       /* reset the phy */
+       miiphy_reset("FEC", CONFIG_PHY_ADDR);
+
+       /* set hard link to 100Mbit, full-duplex */
+       miiphy_read("FEC", CONFIG_PHY_ADDR, MII_BMCR, &reg);
+       reg &= ~BMCR_ANENABLE;
+       reg |= (BMCR_SPEED100 | BMCR_FULLDPLX);
+       miiphy_write("FEC", CONFIG_PHY_ADDR, MII_BMCR, reg);
+
+       miiphy_read("FEC", CONFIG_PHY_ADDR, 0x16, &reg);
+       reg |= (1 << 5);
+       miiphy_write("FEC", CONFIG_PHY_ADDR, 0x16, reg);
+}
+#endif
+
+int checkboard(void)
+{
+       puts("Board: IMA3_MX53\n");
+
+       return 0;
+}
diff --git a/board/esg/ima3-mx53/imximage.cfg b/board/esg/ima3-mx53/imximage.cfg
new file mode 100644 (file)
index 0000000..fa6b42d
--- /dev/null
@@ -0,0 +1,108 @@
+#
+# (C) Copyright 2012
+# Stefano Babic DENX Software Engineering sbabic@denx.de.
+#
+# 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. 51 Franklin Street Fifth Floor Boston,
+# MA 02110-1301 USA
+#
+# Refer docs/README.imxmage for more details about how-to configure
+# and create imximage boot image
+#
+# The syntax is taken as close as possible with the kwbimage
+
+# image version
+
+IMAGE_VERSION 2
+
+# Boot Device : one of
+# spi, sd (the board has no nand neither onenand)
+
+BOOT_FROM      nor
+
+# Device Configuration Data (DCD)
+#
+# Each entry must have the format:
+# Addr-type           Address        Value
+#
+# where:
+#      Addr-type register length (1,2 or 4 bytes)
+#      Address   absolute address of the register
+#      value     value to be stored in the register
+
+# IOMUX for RAM only
+DATA 4 0x53fa8554 0x300020
+DATA 4 0x53fa8560 0x300020
+DATA 4 0x53fa8594 0x300020
+DATA 4 0x53fa8584 0x300020
+DATA 4 0x53fa8558 0x300040
+DATA 4 0x53fa8568 0x300040
+DATA 4 0x53fa8590 0x300040
+DATA 4 0x53fa857c 0x300040
+DATA 4 0x53fa8564 0x300040
+DATA 4 0x53fa8580 0x300040
+DATA 4 0x53fa8570 0x300220
+DATA 4 0x53fa8578 0x300220
+DATA 4 0x53fa872c 0x300000
+DATA 4 0x53fa8728 0x300000
+DATA 4 0x53fa871c 0x300000
+DATA 4 0x53fa8718 0x300000
+DATA 4 0x53fa8574 0x300020
+DATA 4 0x53fa8588 0x300020
+DATA 4 0x53fa855c 0x0
+DATA 4 0x53fa858c 0x0
+DATA 4 0x53fa856c 0x300040
+DATA 4 0x53fa86f0 0x300000
+DATA 4 0x53fa8720 0x300000
+DATA 4 0x53fa86fc 0x0
+DATA 4 0x53fa86f4 0x0
+DATA 4 0x53fa8714 0x0
+DATA 4 0x53fa8724 0x4000000
+#
+# DDR RAM
+DATA 4 0x63fd9088 0x40404040
+DATA 4 0x63fd9090 0x40404040
+DATA 4 0x63fd907C 0x01420143
+DATA 4 0x63fd9080 0x01450146
+DATA 4 0x63fd9018 0x00111740
+DATA 4 0x63fd9000 0x84190000
+# esdcfgX
+DATA 4 0x63fd900C 0x9f5152e3
+DATA 4 0x63fd9010 0xb68e8a63
+DATA 4 0x63fd9014 0x01ff00db
+# Read/Write command delay
+DATA 4 0x63fd902c 0x000026d2
+# Out of reset delays
+DATA 4 0x63fd9030 0x00ff0e21
+# ESDCTL ODT timing control
+DATA 4 0x63fd9008 0x12273030
+# ESDCTL power down control
+DATA 4 0x63fd9004 0x0002002d
+# Set registers in DDR memory chips
+DATA 4 0x63fd901c 0x00008032
+DATA 4 0x63fd901c 0x00008033
+DATA 4 0x63fd901c 0x00028031
+DATA 4 0x63fd901c 0x052080b0
+DATA 4 0x63fd901c 0x04008040
+# ESDCTL refresh control
+DATA 4 0x63fd9020 0x00005800
+# PHY ZQ HW control
+DATA 4 0x63fd9040 0x05380003
+# PHY ODT control
+DATA 4 0x63fd9058 0x00022222
+# start DDR3
+DATA 4 0x63fd901c 0x00000000
index 396761bdff02d2f57294002ea4de207bbafa5191..6587c454fe7f99d68f652bdf2d980b039878395d 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/arch/sys_proto.h>
 
 #define        MUX_CONFIG_SSP0 (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_GPMI (MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL)
 #define        MUX_CONFIG_ENET (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP)
 #define        MUX_CONFIG_EMI  (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL)
 #define        MUX_CONFIG_SSP2 (MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_PULLUP)
@@ -55,6 +56,26 @@ const iomux_cfg_t iomux_setup[] = {
        MX28_PAD_PWM3__GPIO_3_28 |
                (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
 
+#ifdef CONFIG_NAND_MXS
+       /* GPMI NAND */
+       MX28_PAD_GPMI_D00__GPMI_D0 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D01__GPMI_D1 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D02__GPMI_D2 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D03__GPMI_D3 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D04__GPMI_D4 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D05__GPMI_D5 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D06__GPMI_D6 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_D07__GPMI_D7 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_CE0N__GPMI_CE0N | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_RDY0__GPMI_READY0 | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_RDN__GPMI_RDN |
+               (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP),
+       MX28_PAD_GPMI_WRN__GPMI_WRN | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_ALE__GPMI_ALE | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_CLE__GPMI_CLE | MUX_CONFIG_GPMI,
+       MX28_PAD_GPMI_RESETN__GPMI_RESETN | MUX_CONFIG_GPMI,
+#endif
+
        /* FEC0 */
        MX28_PAD_ENET0_MDC__ENET0_MDC | MUX_CONFIG_ENET,
        MX28_PAD_ENET0_MDIO__ENET0_MDIO | MUX_CONFIG_ENET,
index d736141e287ff8c68589292bccdea0bd05805743..dec966ddd6aa3caeaa377645101d13b9e35a3e64 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/arch/mx5x_pins.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/crm_regs.h>
+#include <asm/arch/clock.h>
 #include <asm/arch/iomux.h>
 #include <asm/arch/clock.h>
 #include <asm/errno.h>
@@ -35,6 +36,9 @@
 #include <mmc.h>
 #include <fsl_esdhc.h>
 #include <asm/gpio.h>
+#include <pmic.h>
+#include <dialog_pmic.h>
+#include <fsl_pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -58,6 +62,18 @@ void dram_init_banksize(void)
        gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
 }
 
+u32 get_board_rev(void)
+{
+       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
+       struct fuse_bank *bank = &iim->bank[0];
+       struct fuse_bank0_regs *fuse =
+               (struct fuse_bank0_regs *)bank->fuse_regs;
+
+       int rev = readl(&fuse->gp[6]);
+
+       return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
+}
+
 static void setup_iomux_uart(void)
 {
        /* UART1 RXD */
@@ -81,10 +97,9 @@ static void setup_iomux_uart(void)
 #ifdef CONFIG_USB_EHCI_MX5
 int board_ehci_hcd_init(int port)
 {
-       /* request VBUS power enable pin, GPIO[8}, gpio7 */
+       /* request VBUS power enable pin, GPIO7_8 */
        mxc_request_iomux(MX53_PIN_ATA_DA_2, IOMUX_CONFIG_ALT1);
-       gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0);
-       gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1);
+       gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1);
        return 0;
 }
 #endif
@@ -290,6 +305,103 @@ int board_mmc_init(bd_t *bis)
 }
 #endif
 
+static void setup_iomux_i2c(void)
+{
+       /* I2C1 SDA */
+       mxc_request_iomux(MX53_PIN_CSI0_D8,
+               IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
+       mxc_iomux_set_input(MX53_I2C1_IPP_SDA_IN_SELECT_INPUT,
+               INPUT_CTL_PATH0);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D8,
+               PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
+               PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE |
+               PAD_CTL_PUE_PULL |
+               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       /* I2C1 SCL */
+       mxc_request_iomux(MX53_PIN_CSI0_D9,
+               IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
+       mxc_iomux_set_input(MX53_I2C1_IPP_SCL_IN_SELECT_INPUT,
+               INPUT_CTL_PATH0);
+       mxc_iomux_set_pad(MX53_PIN_CSI0_D9,
+               PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
+               PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE |
+               PAD_CTL_PUE_PULL |
+               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+}
+
+static int power_init(void)
+{
+       unsigned int val;
+       int ret = -1;
+       struct pmic *p;
+
+       if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
+               pmic_dialog_init();
+               p = get_pmic();
+
+               /* Set VDDA to 1.25V */
+               val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
+               ret = pmic_reg_write(p, DA9053_BUCKCORE_REG, val);
+
+               ret |= pmic_reg_read(p, DA9053_SUPPLY_REG, &val);
+               val |= DA9052_SUPPLY_VBCOREGO;
+               ret |= pmic_reg_write(p, DA9053_SUPPLY_REG, val);
+
+               /* Set Vcc peripheral to 1.30V */
+               ret |= pmic_reg_write(p, DA9053_BUCKPRO_REG, 0x62);
+               ret |= pmic_reg_write(p, DA9053_SUPPLY_REG, 0x62);
+       }
+
+       if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
+               pmic_init();
+               p = get_pmic();
+
+               /* Set VDDGP to 1.25V for 1GHz on SW1 */
+               pmic_reg_read(p, REG_SW_0, &val);
+               val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_250V_MC34708;
+               ret = pmic_reg_write(p, REG_SW_0, val);
+
+               /* Set VCC as 1.30V on SW2 */
+               pmic_reg_read(p, REG_SW_1, &val);
+               val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_300V_MC34708;
+               ret |= pmic_reg_write(p, REG_SW_1, val);
+
+               /* Set global reset timer to 4s */
+               pmic_reg_read(p, REG_POWER_CTL2, &val);
+               val = (val & ~TIMER_MASK_MC34708) | TIMER_4S_MC34708;
+               ret |= pmic_reg_write(p, REG_POWER_CTL2, val);
+
+               /* Set VUSBSEL and VUSBEN for USB PHY supply*/
+               pmic_reg_read(p, REG_MODE_0, &val);
+               val |= (VUSBSEL_MC34708 | VUSBEN_MC34708);
+               ret |= pmic_reg_write(p, REG_MODE_0, val);
+
+               /* Set SWBST to 5V in auto mode */
+               val = SWBST_AUTO;
+               ret |= pmic_reg_write(p, SWBST_CTRL, val);
+       }
+
+       return ret;
+}
+
+static void clock_1GHz(void)
+{
+       int ret;
+       u32 ref_clk = CONFIG_SYS_MX5_HCLK;
+       /*
+        * After increasing voltage to 1.25V, we can switch
+        * CPU clock to 1GHz and DDR to 400MHz safely
+        */
+       ret = mxc_set_clock(ref_clk, 1000, MXC_ARM_CLK);
+       if (ret)
+               printf("CPU:   Switch CPU clock to 1GHZ failed\n");
+
+       ret = mxc_set_clock(ref_clk, 400, MXC_PERIPH_CLK);
+       ret |= mxc_set_clock(ref_clk, 400, MXC_DDR_CLK);
+       if (ret)
+               printf("CPU:   Switch DDR clock to 400MHz failed\n");
+}
+
 int board_early_init_f(void)
 {
        setup_iomux_uart();
@@ -298,10 +410,38 @@ int board_early_init_f(void)
        return 0;
 }
 
+int print_cpuinfo(void)
+{
+       u32 cpurev;
+
+       cpurev = get_cpu_rev();
+       printf("CPU:   Freescale i.MX%x family rev%d.%d at %d MHz\n",
+               (cpurev & 0xFF000) >> 12,
+               (cpurev & 0x000F0) >> 4,
+               (cpurev & 0x0000F) >> 0,
+               mxc_get_clock(MXC_ARM_CLK) / 1000000);
+       printf("Reset cause: %s\n", get_reset_cause());
+       return 0;
+}
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+       setup_iomux_i2c();
+       if (!power_init())
+               clock_1GHz();
+       print_cpuinfo();
+
+       return 0;
+}
+#endif
+
 int board_init(void)
 {
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
+       mxc_set_sata_internal_clock();
+
        return 0;
 }
 
index fda3e41a030ee56e2fc844c72131d5a1dcf2a52a..29cbfed120b4f092701dcecd60dbea87bea15fd5 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/mx6x_pins.h>
 #include <asm/arch/iomux-v3.h>
+#include <asm/arch/clock.h>
 #include <asm/errno.h>
 #include <asm/gpio.h>
 #include <mmc.h>
@@ -50,6 +51,10 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
        PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
 
+#define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |           \
+       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
+       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+
 int dram_init(void)
 {
        gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
@@ -122,6 +127,22 @@ iomux_v3_cfg_t enet_pads2[] = {
        MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL     | MUX_PAD_CTRL(ENET_PAD_CTRL),
 };
 
+/* Button assignments for J14 */
+static iomux_v3_cfg_t button_pads[] = {
+       /* Menu */
+       MX6Q_PAD_NANDF_D1__GPIO_2_1     | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+       /* Back */
+       MX6Q_PAD_NANDF_D2__GPIO_2_2     | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+       /* Labelled Search (mapped to Power under Android) */
+       MX6Q_PAD_NANDF_D3__GPIO_2_3     | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+       /* Home */
+       MX6Q_PAD_NANDF_D4__GPIO_2_4     | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+       /* Volume Down */
+       MX6Q_PAD_GPIO_19__GPIO_4_5      | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+       /* Volume Up */
+       MX6Q_PAD_GPIO_18__GPIO_7_13     | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+};
+
 static void setup_iomux_enet(void)
 {
        gpio_direction_output(87, 0);  /* GPIO 3-23 */
@@ -135,7 +156,7 @@ static void setup_iomux_enet(void)
 
        /* Need delay 10ms according to KSZ9021 spec */
        udelay(1000 * 10);
-       gpio_direction_output(87, 1);  /* GPIO 3-23 */
+       gpio_set_value(87, 1);  /* GPIO 3-23 */
 
        imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
 }
@@ -267,11 +288,44 @@ int board_eth_init(bd_t *bis)
        return 0;
 }
 
+static void setup_buttons(void)
+{
+       imx_iomux_v3_setup_multiple_pads(button_pads,
+                                        ARRAY_SIZE(button_pads));
+}
+
+#ifdef CONFIG_CMD_SATA
+
+int setup_sata(void)
+{
+       struct iomuxc_base_regs *const iomuxc_regs
+               = (struct iomuxc_base_regs *) IOMUXC_BASE_ADDR;
+       int ret = enable_sata_clock();
+       if (ret)
+               return ret;
+
+       clrsetbits_le32(&iomuxc_regs->gpr[13],
+                       IOMUXC_GPR13_SATA_MASK,
+                       IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P0DB
+                       |IOMUXC_GPR13_SATA_PHY_7_SATA2M
+                       |IOMUXC_GPR13_SATA_SPEED_3G
+                       |(3<<IOMUXC_GPR13_SATA_PHY_6_SHIFT)
+                       |IOMUXC_GPR13_SATA_SATA_PHY_5_SS_DISABLED
+                       |IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_9_16
+                       |IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P00_DB
+                       |IOMUXC_GPR13_SATA_PHY_2_TX_1P104V
+                       |IOMUXC_GPR13_SATA_PHY_1_SLOW);
+
+       return 0;
+}
+#endif
+
 int board_early_init_f(void)
 {
-       setup_iomux_uart();
+       setup_iomux_uart();
+       setup_buttons();
 
-       return 0;
+       return 0;
 }
 
 int board_init(void)
@@ -283,6 +337,10 @@ int board_init(void)
        setup_spi();
 #endif
 
+#ifdef CONFIG_CMD_SATA
+       setup_sata();
+#endif
+
        return 0;
 }
 
@@ -292,3 +350,94 @@ int checkboard(void)
 
        return 0;
 }
+
+struct button_key {
+       char const      *name;
+       unsigned        gpnum;
+       char            ident;
+};
+
+static struct button_key const buttons[] = {
+       {"back",        GPIO_NUMBER(2, 2),      'B'},
+       {"home",        GPIO_NUMBER(2, 4),      'H'},
+       {"menu",        GPIO_NUMBER(2, 1),      'M'},
+       {"search",      GPIO_NUMBER(2, 3),      'S'},
+       {"volup",       GPIO_NUMBER(7, 13),     'V'},
+       {"voldown",     GPIO_NUMBER(4, 5),      'v'},
+};
+
+/*
+ * generate a null-terminated string containing the buttons pressed
+ * returns number of keys pressed
+ */
+static int read_keys(char *buf)
+{
+       int i, numpressed = 0;
+       for (i = 0; i < ARRAY_SIZE(buttons); i++) {
+               if (!gpio_get_value(buttons[i].gpnum))
+                       buf[numpressed++] = buttons[i].ident;
+       }
+       buf[numpressed] = '\0';
+       return numpressed;
+}
+
+static int do_kbd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       char envvalue[ARRAY_SIZE(buttons)+1];
+       int numpressed = read_keys(envvalue);
+       setenv("keybd", envvalue);
+       return numpressed == 0;
+}
+
+U_BOOT_CMD(
+       kbd, 1, 1, do_kbd,
+       "Tests for keypresses, sets 'keybd' environment variable",
+       "Returns 0 (true) to shell if key is pressed."
+);
+
+#ifdef CONFIG_PREBOOT
+static char const kbd_magic_prefix[] = "key_magic";
+static char const kbd_command_prefix[] = "key_cmd";
+
+static void preboot_keys(void)
+{
+       int numpressed;
+       char keypress[ARRAY_SIZE(buttons)+1];
+       numpressed = read_keys(keypress);
+       if (numpressed) {
+               char *kbd_magic_keys = getenv("magic_keys");
+               char *suffix;
+               /*
+                * loop over all magic keys
+                */
+               for (suffix = kbd_magic_keys; *suffix; ++suffix) {
+                       char *keys;
+                       char magic[sizeof(kbd_magic_prefix) + 1];
+                       sprintf(magic, "%s%c", kbd_magic_prefix, *suffix);
+                       keys = getenv(magic);
+                       if (keys) {
+                               if (!strcmp(keys, keypress))
+                                       break;
+                       }
+               }
+               if (*suffix) {
+                       char cmd_name[sizeof(kbd_command_prefix) + 1];
+                       char *cmd;
+                       sprintf(cmd_name, "%s%c", kbd_command_prefix, *suffix);
+                       cmd = getenv(cmd_name);
+                       if (cmd) {
+                               setenv("preboot", cmd);
+                               return;
+                       }
+               }
+       }
+}
+#endif
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_PREBOOT
+       preboot_keys();
+#endif
+       return 0;
+}
index e593b43d48d3701d68d113e709ae1ca3edcd81f2..8f75af19d4c4624ad967c0aa08b28239b0e5c1a9 100644 (file)
@@ -68,17 +68,6 @@ int board_init(void)
        return 0;
 }
 
-/*
- * Routine: misc_init_r
- * Description: late init.
- */
-int misc_init_r(void)
-{
-       dieid_num_r();
-
-       return 0;
-}
-
 /*
  * Routine: set_muxconf_regs
  * Description: Setting up the configuration Mux registers specific to the
@@ -93,7 +82,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_OMAP_HSMMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
index 6a3777eb8c7cb14385573ceb8098fda5cfdc0f1e..971e31b5f36bb4cedeeac3e846b9518c33de57f4 100644 (file)
@@ -52,8 +52,6 @@ static const u32 gpmc_lan_config[] = {
 int board_init(void)
 {
        gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
-       /* board id for Linux */
-       gd->bd->bi_arch_number = MACH_TYPE_IGEP0020;
        /* boot param addr */
        gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 
@@ -96,7 +94,7 @@ static void setup_net_chip(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 6a927350b4d29b2d23604201c5e4087b5cc19fd4..653c1b5abb1978f6a2b3aff1f6b6c8c61e34f525 100644 (file)
@@ -39,8 +39,6 @@ DECLARE_GLOBAL_DATA_PTR;
 int board_init(void)
 {
        gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
-       /* board id for Linux */
-       gd->bd->bi_arch_number = MACH_TYPE_IGEP0030;
        /* boot param addr */
        gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 
@@ -50,7 +48,7 @@ int board_init(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 0a105bf2818314f6584ddbf8408884f6eb13ae7d..d316f33cd11dfdf4b49b9c1c01fd3f25bd226d47 100644 (file)
@@ -79,7 +79,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index bc7ec68f141f994b4a52663b86585f38e7cfa7e1..12bcfcb877382e206a3411fedbb7ee720af9c11d 100644 (file)
@@ -140,21 +140,10 @@ int board_init(void)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
-/*
- * Routine: misc_init_r
- * Description: display die ID register
- */
-int misc_init_r(void)
-{
-       dieid_num_r();
-
-       return 0;
-}
-
 #ifdef CONFIG_SMC911X
 /* GPMC CS1 settings for Logic SOM LV/Torpedo LAN92xx Ethernet chip */
 static const u32 gpmc_lan92xx_config[] = {
index dec0b2611f8930057a923d31bd4e37db274b4cc3..90b6b0fde57617c44c18fcc6150b490f84d9f63f 100644 (file)
@@ -92,7 +92,7 @@ void set_muxconf_regs(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index be3083d9c339f52de0399d7eb0518bc89e7f1b18..8e1801980139b252b068909cd8b6ad8643128e0d 100644 (file)
@@ -183,7 +183,7 @@ void set_muxconf_regs (void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 74b5b19be224b323aebbcab7b59338b7c89a8e74..f68f3122158ed3a91c9e3d36d4287289dd04a194 100644 (file)
@@ -106,8 +106,8 @@ void set_muxconf_regs(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
-       omap_mmc_init(1);
+       omap_mmc_init(0, 0, 0);
+       omap_mmc_init(1, 0, 0);
        return 0;
 }
 #endif
index 3e748fdd20ba9fccf388f4b23c44bc5586cd8606..a93d4583e748088284928079ad84dcac2d70c34a 100644 (file)
@@ -27,6 +27,7 @@ LIB   = $(obj)lib$(VENDOR).o
 
 COBJS-y += board.o
 COBJS-$(CONFIG_SPI_UART_SWITCH) += uart-spi-switch.o
+COBJS-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index 85dd359ec952f9bf108a1c1ef20cdbaab89ee50c..2e22133591c27347835832b483bb2ad63aa825ba 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <common.h>
 #include <ns16550.h>
+#include <linux/compiler.h>
 #include <asm/io.h>
 #include <asm/arch/tegra2.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/board.h>
 #include <asm/arch/clk_rst.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/emc.h>
 #include <asm/arch/pinmux.h>
+#include <asm/arch/pmc.h>
+#include <asm/arch/pmu.h>
 #include <asm/arch/uart.h>
+#include <asm/arch/warmboot.h>
 #include <spi.h>
 #include <asm/arch/usb.h>
 #include <i2c.h>
 #include "board.h"
+#include "emc.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -58,12 +64,29 @@ void __pin_mux_usb(void)
 
 void pin_mux_usb(void) __attribute__((weak, alias("__pin_mux_usb")));
 
+/*
+ * Routine: power_det_init
+ * Description: turn off power detects
+ */
+static void power_det_init(void)
+{
+#if defined(CONFIG_TEGRA2)
+       struct pmc_ctlr *const pmc = (struct pmc_ctlr *)TEGRA2_PMC_BASE;
+
+       /* turn off power detects */
+       writel(0, &pmc->pmc_pwr_det_latch);
+       writel(0, &pmc->pmc_pwr_det);
+#endif
+}
+
 /*
  * Routine: board_init
  * Description: Early hardware init.
  */
 int board_init(void)
 {
+       __maybe_unused int err;
+
        /* Do clocks and UART first so that printf() works */
        clock_init();
        clock_verify();
@@ -76,18 +99,35 @@ int board_init(void)
 #endif
        /* boot param addr */
        gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100);
+
+       power_det_init();
+
 #ifdef CONFIG_TEGRA_I2C
 #ifndef CONFIG_SYS_I2C_INIT_BOARD
 #error "You must define CONFIG_SYS_I2C_INIT_BOARD to use i2c on Nvidia boards"
 #endif
        i2c_init_board();
-#endif
+# ifdef CONFIG_TEGRA_PMU
+       if (pmu_set_nominal())
+               debug("Failed to select nominal voltages\n");
+#  ifdef CONFIG_TEGRA_CLOCK_SCALING
+       err = board_emc_init();
+       if (err)
+               debug("Memory controller init failed: %d\n", err);
+#  endif
+# endif /* CONFIG_TEGRA_PMU */
+#endif /* CONFIG_TEGRA_I2C */
 
 #ifdef CONFIG_USB_EHCI_TEGRA
        pin_mux_usb();
        board_usb_init(gd->fdt_blob);
 #endif
 
+#ifdef CONFIG_TEGRA2_LP0
+       /* prepare the WB code to LP0 location */
+       warmboot_prepare_code(TEGRA_LP0_ADDR, TEGRA_LP0_SIZE);
+#endif
+
        return 0;
 }
 
diff --git a/board/nvidia/common/emc.c b/board/nvidia/common/emc.c
new file mode 100644 (file)
index 0000000..8e4290c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/ap20.h>
+#include <asm/arch/clk_rst.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/emc.h>
+#include <asm/arch/pmu.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/tegra2.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* These rates are hard-coded for now, until fdt provides them */
+#define EMC_SDRAM_RATE_T20     (333000 * 2 * 1000)
+#define EMC_SDRAM_RATE_T25     (380000 * 2 * 1000)
+
+int board_emc_init(void)
+{
+       unsigned rate;
+
+       switch (tegra_get_chip_type()) {
+       default:
+       case TEGRA_SOC_T20:
+               rate  = EMC_SDRAM_RATE_T20;
+               break;
+       case TEGRA_SOC_T25:
+               rate  = EMC_SDRAM_RATE_T25;
+               break;
+       }
+       return tegra_set_emc(gd->fdt_blob, rate);
+}
diff --git a/board/nvidia/common/emc.h b/board/nvidia/common/emc.h
new file mode 100644 (file)
index 0000000..ec1b115
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010,2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _NVIDIA_EMC_H_
+#define _NVIDIA_EMC_H_
+
+int board_emc_init(void);
+
+#endif
index 6ba3ec48f17788e584ef7807e3bbb4f026ff24eb..335253953b28600bee2bc03221a074357cdf505f 100644 (file)
        i2c@7000c500 {
                clock-frequency = <100000>;
        };
+
+       emc@7000f400 {
+               emc-table@190000 {
+                       reg = < 190000 >;
+                       compatible = "nvidia,tegra20-emc-table";
+                       clock-frequency = < 190000 >;
+                       nvidia,emc-registers = < 0x0000000c 0x00000026
+                               0x00000009 0x00000003 0x00000004 0x00000004
+                               0x00000002 0x0000000c 0x00000003 0x00000003
+                               0x00000002 0x00000001 0x00000004 0x00000005
+                               0x00000004 0x00000009 0x0000000d 0x0000059f
+                               0x00000000 0x00000003 0x00000003 0x00000003
+                               0x00000003 0x00000001 0x0000000b 0x000000c8
+                               0x00000003 0x00000007 0x00000004 0x0000000f
+                               0x00000002 0x00000000 0x00000000 0x00000002
+                               0x00000000 0x00000000 0x00000083 0xa06204ae
+                               0x007dc010 0x00000000 0x00000000 0x00000000
+                               0x00000000 0x00000000 0x00000000 0x00000000 >;
+               };
+               emc-table@380000 {
+                       reg = < 380000 >;
+                       compatible = "nvidia,tegra20-emc-table";
+                       clock-frequency = < 380000 >;
+                       nvidia,emc-registers = < 0x00000017 0x0000004b
+                               0x00000012 0x00000006 0x00000004 0x00000005
+                               0x00000003 0x0000000c 0x00000006 0x00000006
+                               0x00000003 0x00000001 0x00000004 0x00000005
+                               0x00000004 0x00000009 0x0000000d 0x00000b5f
+                               0x00000000 0x00000003 0x00000003 0x00000006
+                               0x00000006 0x00000001 0x00000011 0x000000c8
+                               0x00000003 0x0000000e 0x00000007 0x0000000f
+                               0x00000002 0x00000000 0x00000000 0x00000002
+                               0x00000000 0x00000000 0x00000083 0xe044048b
+                               0x007d8010 0x00000000 0x00000000 0x00000000
+                               0x00000000 0x00000000 0x00000000 0x00000000 >;
+               };
+       };
+
+       kbc@7000e200 {
+               linux,keymap = <0x00020011 0x0003001f 0x0004001e 0x0005002c
+                       0x000701d0 0x0107007d 0x02060064 0x02070038 0x03000006
+                       0x03010005 0x03020013 0x03030012 0x03040021 0x03050020
+                       0x0306002d 0x04000008 0x04010007 0x04020014 0x04030023
+                       0x04040022 0x0405002f 0x0406002e 0x04070039 0x0500000a
+                       0x05010009 0x05020016 0x05030015 0x05040024 0x05050031
+                       0x05060030 0x0507002b 0x0600000c 0x0601000b 0x06020018
+                       0x06030017 0x06040026 0x06050025 0x06060033 0x06070032
+                       0x0701000d 0x0702001b 0x0703001c 0x0707008b 0x08040036
+                       0x0805002a 0x09050061 0x0907001d 0x0b00001a 0x0b010019
+                       0x0b020028 0x0b030027 0x0b040035 0x0b050034 0x0c000044
+                       0x0c010043 0x0c02000e 0x0c030004 0x0c040003 0x0c050067
+                       0x0c0600d2 0x0c070077 0x0d00006e 0x0d01006f 0x0d030068
+                       0x0d04006d 0x0d05006a 0x0d06006c 0x0d070069 0x0e000057
+                       0x0e010058 0x0e020042 0x0e030010 0x0e04003e 0x0e05003d
+                       0x0e060002 0x0e070041 0x0f000001 0x0f010029 0x0f02003f
+                       0x0f03000f 0x0f04003b 0x0f05003c 0x0f06003a 0x0f070040
+                       0x14000047 0x15000049 0x15010048 0x1502004b 0x1504004f
+                       0x16010062 0x1602004d 0x1603004c 0x16040051 0x16050050
+                       0x16070052 0x1b010037 0x1b03004a 0x1b04004e 0x1b050053
+                       0x1c050073 0x1d030066 0x1d04006b 0x1d0500e0 0x1d060072
+                       0x1d0700e1 0x1e000045 0x1e010046 0x1e020071
+                       0x1f04008a>;
+               linux,fn-keymap = <0x05040002>;
+       };
 };
index 7b4064cdb1213c773ba00d50e3ea48652ad6964f..f973870830c0c05a08af1081a6a70dc4e1338e5b 100644 (file)
@@ -403,7 +403,7 @@ int board_eth_init(bd_t *bis)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 58a676d45535dcc2c1ae2a10e73e6c1400bdac52..3a62e9d6330b7b326cfd570a95e9f7f9d238116e 100644 (file)
@@ -32,6 +32,7 @@
 #include <common.h>
 #include <twl4030.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/mux.h>
 #include <asm/arch/gpio.h>
@@ -45,6 +46,10 @@ DECLARE_GLOBAL_DATA_PTR;
 #define TWL4030_BB_CFG_BBSEL_3200MV    (3 << 2)
 #define TWL4030_BB_CFG_BBISEL_500UA    2
 
+#define CONTROL_WKUP_CTRL              0x48002a5c
+#define GPIO_IO_PWRDNZ                 (1 << 6)
+#define PBIASLITEVMODE1                        (1 << 8)
+
 /*
  * Routine: board_init
  * Description: Early hardware init.
@@ -60,29 +65,52 @@ int board_init(void)
        return 0;
 }
 
+static void set_output_gpio(unsigned int gpio, int value)
+{
+       int ret;
+
+       ret = gpio_request(gpio, "");
+       if (ret != 0) {
+               printf("could not request GPIO %u\n", gpio);
+               return;
+       }
+       ret = gpio_direction_output(gpio, value);
+       if (ret != 0)
+               printf("could not set GPIO %u to %d\n", gpio, value);
+}
+
 /*
  * Routine: misc_init_r
  * Description: Configure board specific parts
  */
 int misc_init_r(void)
 {
-       struct gpio *gpio1_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
-       struct gpio *gpio4_base = (struct gpio *)OMAP34XX_GPIO4_BASE;
-       struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE;
-       struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE;
+       t2_t *t2_base = (t2_t *)T2_BASE;
+       u32 pbias_lite;
 
        twl4030_led_init(TWL4030_LED_LEDEN_LEDBON);
 
-       /* Configure GPIOs to output */
-       writel(~(GPIO14 | GPIO15 | GPIO16 | GPIO23), &gpio1_base->oe);
-       writel(~GPIO22, &gpio4_base->oe);       /* 118 */
-       writel(~(GPIO0 | GPIO1 | GPIO28 | GPIO29 | GPIO30 | GPIO31),
-               &gpio5_base->oe);       /* 128, 129, 156-159 */
-       writel(~GPIO4, &gpio6_base->oe);        /* 164 */
+       /* set up dual-voltage GPIOs to 1.8V */
+       pbias_lite = readl(&t2_base->pbias_lite);
+       pbias_lite &= ~PBIASLITEVMODE1;
+       pbias_lite |= PBIASLITEPWRDNZ1;
+       writel(pbias_lite, &t2_base->pbias_lite);
+       if (get_cpu_family() == CPU_OMAP36XX)
+               writel(readl(CONTROL_WKUP_CTRL) | GPIO_IO_PWRDNZ,
+                       CONTROL_WKUP_CTRL);
+
+       /* make sure audio and BT chips are in powerdown state */
+       set_output_gpio(14, 0);
+       set_output_gpio(15, 0);
+       set_output_gpio(118, 0);
+
+       /* enable USB supply */
+       set_output_gpio(164, 1);
 
-       /* Set GPIOs */
-       writel(GPIO28, &gpio5_base->setdataout);
-       writel(GPIO4, &gpio6_base->setdataout);
+       /* wifi needs a short pulse to enter powersave state */
+       set_output_gpio(23, 1);
+       udelay(5000);
+       gpio_direction_output(23, 0);
 
        /* Enable battery backup capacitor (3.2V, 0.5mA charge current) */
        twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
@@ -103,12 +131,15 @@ int misc_init_r(void)
 void set_muxconf_regs(void)
 {
        MUX_PANDORA();
+       if (get_cpu_family() == CPU_OMAP36XX) {
+               MUX_PANDORA_3730();
+       }
 }
 
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index f0ad16b0a407345cf9497fb8d1bd878c193198d4..fea8bf259a830f5f60677cf15883130c688bf2bd 100644 (file)
@@ -399,4 +399,10 @@ const omap3_sysinfo sysinfo = {
        MUX_VAL(CP(SDRC_CKE0),          (IDIS | PTU | EN  | M0)) /*sdrc_cke0*/\
        MUX_VAL(CP(SDRC_CKE1),          (IDIS | PTU | EN  | M0)) /*sdrc_cke1*/
 
+#define MUX_PANDORA_3730() \
+       MUX_VAL(CP(GPIO126),            (IEN  | PTD | DIS | M4)) /*GPIO_126 - MMC1_WP*/\
+       MUX_VAL(CP(GPIO127),            (IEN  | PTD | DIS | M4)) /*GPIO_127 - MMC2_WP*/\
+       MUX_VAL(CP(GPIO128),            (IDIS | PTD | DIS | M4)) /*GPIO_128 - LED_MMC1*/\
+       MUX_VAL(CP(GPIO129),            (IDIS | PTD | DIS | M4)) /*GPIO_129 - LED_MMC2*/
+
 #endif
diff --git a/board/raidsonic/ib62x0/Makefile b/board/raidsonic/ib62x0/Makefile
new file mode 100644 (file)
index 0000000..d450f8d
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := ib62x0.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/raidsonic/ib62x0/ib62x0.c b/board/raidsonic/ib62x0/ib62x0.c
new file mode 100644 (file)
index 0000000..65f2c2e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2011-2012
+ * Gerald Kerma <dreagle@doukki.net>
+ * Luka Perkov <uboot@lukaperkov.net>
+ * Simon Baatz <gmbnomis@gmail.com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <common.h>
+#include <miiphy.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/kirkwood.h>
+#include <asm/arch/mpp.h>
+#include "ib62x0.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+       /*
+        * default gpio configuration
+        * There are maximum 64 gpios controlled through 2 sets of registers
+        * the below configuration configures mainly initial LED status
+        */
+       kw_config_gpio(IB62x0_OE_VAL_LOW,
+                       IB62x0_OE_VAL_HIGH,
+                       IB62x0_OE_LOW, IB62x0_OE_HIGH);
+
+       /* Multi-Purpose Pins Functionality configuration */
+       u32 kwmpp_config[] = {
+               MPP0_NF_IO2,
+               MPP1_NF_IO3,
+               MPP2_NF_IO4,
+               MPP3_NF_IO5,
+               MPP4_NF_IO6,
+               MPP5_NF_IO7,
+               MPP6_SYSRST_OUTn,
+               MPP8_TW_SDA,
+               MPP9_TW_SCK,
+               MPP10_UART0_TXD,
+               MPP11_UART0_RXD,
+               MPP18_NF_IO0,
+               MPP19_NF_IO1,
+               MPP20_SATA1_ACTn,
+               MPP21_SATA0_ACTn,
+               MPP22_GPIO,     /* Power LED red */
+               MPP24_GPIO,     /* Power off device */
+               MPP25_GPIO,     /* Power LED green */
+               MPP27_GPIO,     /* USB transfer LED */
+               MPP28_GPIO,     /* Reset button */
+               MPP29_GPIO,     /* USB Copy button */
+               0
+       };
+       kirkwood_mpp_conf(kwmpp_config);
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100;
+
+       return 0;
+}
diff --git a/board/raidsonic/ib62x0/ib62x0.h b/board/raidsonic/ib62x0/ib62x0.h
new file mode 100644 (file)
index 0000000..0c30690
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011-2012
+ * Gerald Kerma <dreagle@doukki.net>
+ * Simon Baatz <gmbnomis@gmail.com>
+ * Luka Perkov <uboot@lukaperkov.net>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __IB62x0_H
+#define __IB62x0_H
+
+#define IB62x0_OE_LOW          (~(1 << 22 | 1 << 24 | 1 << 25 | 1 << 27))
+#define IB62x0_OE_HIGH         (~(0))
+#define IB62x0_OE_VAL_LOW      0
+#define IB62x0_OE_VAL_HIGH     0
+
+/* PHY related */
+#define MV88E1116_LED_FCTRL_REG                10
+#define MV88E1116_CPRSP_CR3_REG                21
+#define MV88E1116_MAC_CTRL_REG         21
+#define MV88E1116_PGADR_REG            22
+#define MV88E1116_RGMII_TXTM_CTRL      (1 << 4)
+#define MV88E1116_RGMII_RXTM_CTRL      (1 << 5)
+
+#endif /* __IB62x0_H */
diff --git a/board/raidsonic/ib62x0/kwbimage.cfg b/board/raidsonic/ib62x0/kwbimage.cfg
new file mode 100644 (file)
index 0000000..bd594eb
--- /dev/null
@@ -0,0 +1,169 @@
+#
+# Copyright (C) 2011-2012
+# Gerald Kerma <dreagle@doukki.net>
+# Simon Baatz <gmbnomis@gmail.com>
+# Luka Perkov <uboot@lukaperkov.net>
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# Refer docs/README.kwimage for more details about how-to configure
+# and create kirkwood boot image
+#
+
+# Boot Media configurations
+BOOT_FROM      nand    # change from nand to uart if building UART image
+NAND_ECC_MODE  default
+NAND_PAGE_SIZE 0x0800
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0 interface pad voltage to 1.8V
+DATA 0xffd100e0 0x1b1b1b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xffd01400 0x43000c30     # DDR Configuration register
+# bit13-0:  0xc30, (3120 DDR2 clks refresh rate)
+# bit23-14: 0x0,
+# bit24:    0x1,     enable exit self refresh mode on DDR access
+# bit25:    0x1,     required
+# bit29-26: 0x0,
+# bit31-30: 0x1,
+
+DATA 0xffd01404 0x37543000     # DDR Controller Control Low
+# bit4:     0x0, addr/cmd in smame cycle
+# bit5:     0x0, clk is driven during self refresh, we don't care for APX
+# bit6:     0x0, use recommended falling edge of clk for addr/cmd
+# bit14:    0x0, input buffer always powered up
+# bit18:    0x1, cpu lock transaction enabled
+# bit23-20: 0x5, recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 0x7, CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 0x3, required
+# bit31:    0x0, no additional STARTBURST delay
+
+DATA 0xffd01408 0x22125451     # DDR Timing (Low) (active cycles value +1)
+# bit3-0:   TRAS lsbs
+# bit7-4:   TRCD
+# bit11-8:  TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20:    TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xffd0140c 0x00000a33     # DDR Timing (High)
+# bit6-0:   TRFC
+# bit8-7:   TR2R
+# bit10-9:  TR2W
+# bit12-11: TW2W
+# bit31-13: 0x0, required
+
+DATA 0xffd01410 0x0000000c     # DDR Address Control
+# bit1-0:   00,  Cs0width (x8)
+# bit3-2:   11,  Cs0size (1Gb)
+# bit5-4:   00,  Cs1width (x8)
+# bit7-6:   11,  Cs1size (1Gb)
+# bit9-8:   00,  Cs2width (nonexistent
+# bit11-10: 00,  Cs2size  (nonexistent
+# bit13-12: 00,  Cs3width (nonexistent
+# bit15-14: 00,  Cs3size  (nonexistent
+# bit16:    0,   Cs0AddrSel
+# bit17:    0,   Cs1AddrSel
+# bit18:    0,   Cs2AddrSel
+# bit19:    0,   Cs3AddrSel
+# bit31-20: 0x0, required
+
+DATA 0xffd01414 0x00000000     # DDR Open Pages Control
+# bit0:    0,   OpenPage enabled
+# bit31-1: 0x0, required
+
+DATA 0xffd01418 0x00000000     # DDR Operation
+# bit3-0:   0x0, DDR cmd
+# bit31-4:  0x0, required
+
+DATA 0xffd0141c 0x00000c52     # DDR Mode
+# bit2-0:   0x2, BurstLen=2 required
+# bit3:     0x0, BurstType=0 required
+# bit6-4:   0x4, CL=5
+# bit7:     0x0, TestMode=0 normal
+# bit8:     0x0, DLL reset=0 normal
+# bit11-9:  0x6, auto-precharge write recovery ????????????
+# bit12:    0x0, PD must be zero
+# bit31-13: 0x0, required
+
+DATA 0xffd01420 0x00000040     # DDR Extended Mode
+# bit0:     0,   DDR DLL enabled
+# bit1:     0,   DDR drive strenght normal
+# bit2:     1,   DDR ODT control lsd (disabled)
+# bit5-3:   0x0, required
+# bit6:     0,   DDR ODT control msb, (disabled)
+# bit9-7:   0x0, required
+# bit10:    0,   differential DQS enabled
+# bit11:    0,   required
+# bit12:    0,   DDR output buffer enabled
+# bit31-13: 0x0, required
+
+DATA 0xffd01424 0x0000f17f     # DDR Controller Control High
+# bit2-0:   0x7, required
+# bit3:     0x1, MBUS Burst Chop disabled
+# bit6-4:   0x7, required
+# bit7:     0x0,
+# bit8:     0x1, add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9:     0x0, no half clock cycle addition to dataout
+# bit10:    0x0, 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11:    0x0, 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 0xf, required
+# bit31-16: 0,   required
+
+DATA 0xffd01428 0x00085520     # DDR2 ODT Read Timing (default values)
+DATA 0xffd0147c 0x00008552     # DDR2 ODT Write Timing (default values)
+
+DATA 0xffd01500 0x00000000     # CS[0]n Base address to 0x0
+DATA 0xffd01504 0x0ffffff1     # CS[0]n Size
+# bit0:     0x1,     Window enabled
+# bit1:     0x0,     Write Protect disabled
+# bit3-2:   0x0,     CS0 hit selected
+# bit23-4:  0xfffff, required
+# bit31-24: 0x0f,    Size (i.e. 256MB)
+
+DATA 0xffd01508 0x10000000     # CS[1]n Base address to 256Mb
+DATA 0xffd0150c 0x00000000     # CS[1]n Size, window disabled
+
+DATA 0xffd01514 0x00000000     # CS[2]n Size, window disabled
+DATA 0xffd0151c 0x00000000     # CS[3]n Size, window disabled
+
+DATA 0xffd01494 0x00030000     # DDR ODT Control (Low)
+# bit3-0:     ODT0Rd, MODT[0] asserted during read from DRAM CS1
+# bit7-4:     ODT0Rd, MODT[0] asserted during read from DRAM CS0
+# bit19-16:2, ODT0Wr, MODT[0] asserted during write to DRAM CS1
+# bit23-20:1, ODT0Wr, MODT[0] asserted during write to DRAM CS0
+
+DATA 0xffd01498 0x00000000     # DDR ODT Control (High)
+# bit1-0:  0x0, ODT0 controlled by ODT Control (low) register above
+# bit3-2:  0x1, ODT1 active NEVER!
+# bit31-4: 0x0, required
+
+DATA 0xffd0149c 0x0000e803     # CPU ODT Control
+DATA 0xffd01480 0x00000001     # DDR Initialization Control
+# bit0: 0x1, enable DDR init upon this register write
+
+DATA 0xFFD20134 0x66666666      # L2 RAM Timing 0 Register
+DATA 0xFFD20138 0x66666666      # L2 RAM Timing 1 Register
+
+# End of Header extension
+DATA 0x0 0x0
index c2ccef3381b5e2f3011f2145f5b2e8a9b850e942..c833541fd03e39a969c01dda9433effcba83b498 100644 (file)
 /* Setting TZPC[TrustZone Protection Controller] */
 void tzpc_init(void)
 {
-       struct exynos5_tzpc *tzpc;
+       struct exynos_tzpc *tzpc;
        unsigned int addr;
 
        for (addr = TZPC0_BASE; addr <= TZPC9_BASE; addr += TZPC_BASE_OFFSET) {
-               tzpc = (struct exynos5_tzpc *)addr;
+               tzpc = (struct exynos_tzpc *)addr;
 
                if (addr == TZPC0_BASE)
                        writel(R0SIZE, &tzpc->r0size);
index aa4291df4aba82a484172b507646d15abf24d099..3085de1a145064aa1338ca2d4cc0f4be908abb0f 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright (C) 2011 Samsung Electronics
  * Heungjun Kim <riverful.kim@samsung.com>
  * Kyungmin Park <kyungmin.park@samsung.com>
+ * Donghwa Lee <dh09.lee@samsung.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  */
 
 #include <common.h>
+#include <lcd.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/mipi_dsim.h>
 #include <asm/arch/watchdog.h>
 #include <asm/arch/power.h>
 #include <pmic.h>
 #include <usb/s3c_udc.h>
-#include <max8998_pmic.h>
+#include <max8997_pmic.h>
 
 #include "setup.h"
 
@@ -216,26 +220,19 @@ static int s5pc210_phy_control(int on)
                return -1;
 
        if (on) {
-               ret |= pmic_set_output(p,
-                                      MAX8998_REG_BUCK_ACTIVE_DISCHARGE3,
-                                      MAX8998_SAFEOUT1, LDO_ON);
-               ret |= pmic_set_output(p, MAX8998_REG_ONOFF1,
-                                     MAX8998_LDO3, LDO_ON);
-               ret |= pmic_set_output(p, MAX8998_REG_ONOFF2,
-                                     MAX8998_LDO8, LDO_ON);
-
+               ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
+                                     ENSAFEOUT1, LDO_ON);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, EN_LDO);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, EN_LDO);
        } else {
-               ret |= pmic_set_output(p, MAX8998_REG_ONOFF2,
-                                     MAX8998_LDO8, LDO_OFF);
-               ret |= pmic_set_output(p, MAX8998_REG_ONOFF1,
-                                     MAX8998_LDO3, LDO_OFF);
-               ret |= pmic_set_output(p,
-                                      MAX8998_REG_BUCK_ACTIVE_DISCHARGE3,
-                                      MAX8998_SAFEOUT1, LDO_OFF);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, DIS_LDO);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, DIS_LDO);
+               ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
+                                     ENSAFEOUT1, LDO_OFF);
        }
 
        if (ret) {
-               puts("MAX8998 LDO setting error!\n");
+               puts("MAX8997 LDO setting error!\n");
                return -1;
        }
 
@@ -364,3 +361,145 @@ int board_early_init_f(void)
 
        return 0;
 }
+
+static void lcd_reset(void)
+{
+       struct exynos4_gpio_part2 *gpio2 =
+               (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2();
+
+       s5p_gpio_direction_output(&gpio2->y4, 5, 1);
+       udelay(10000);
+       s5p_gpio_direction_output(&gpio2->y4, 5, 0);
+       udelay(10000);
+       s5p_gpio_direction_output(&gpio2->y4, 5, 1);
+}
+
+static int lcd_power(void)
+{
+       int ret = 0;
+       struct pmic *p = get_pmic();
+
+       if (pmic_probe(p))
+               return 0;
+
+       /* LDO15 voltage: 2.2v */
+       ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, 0x1c | EN_LDO);
+       /* LDO13 voltage: 3.0v */
+       ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, 0x2c | EN_LDO);
+
+       if (ret) {
+               puts("MAX8997 LDO setting error!\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+static struct mipi_dsim_config dsim_config = {
+       .e_interface            = DSIM_VIDEO,
+       .e_virtual_ch           = DSIM_VIRTUAL_CH_0,
+       .e_pixel_format         = DSIM_24BPP_888,
+       .e_burst_mode           = DSIM_BURST_SYNC_EVENT,
+       .e_no_data_lane         = DSIM_DATA_LANE_4,
+       .e_byte_clk             = DSIM_PLL_OUT_DIV8,
+       .hfp                    = 1,
+
+       .p                      = 3,
+       .m                      = 120,
+       .s                      = 1,
+
+       /* D-PHY PLL stable time spec :min = 200usec ~ max 400usec */
+       .pll_stable_time        = 500,
+
+       /* escape clk : 10MHz */
+       .esc_clk                = 20 * 1000000,
+
+       /* stop state holding counter after bta change count 0 ~ 0xfff */
+       .stop_holding_cnt       = 0x7ff,
+       /* bta timeout 0 ~ 0xff */
+       .bta_timeout            = 0xff,
+       /* lp rx timeout 0 ~ 0xffff */
+       .rx_timeout             = 0xffff,
+};
+
+static struct exynos_platform_mipi_dsim s6e8ax0_platform_data = {
+       .lcd_panel_info = NULL,
+       .dsim_config = &dsim_config,
+};
+
+static struct mipi_dsim_lcd_device mipi_lcd_device = {
+       .name   = "s6e8ax0",
+       .id     = -1,
+       .bus_id = 0,
+       .platform_data  = (void *)&s6e8ax0_platform_data,
+};
+
+static int mipi_power(void)
+{
+       int ret = 0;
+       struct pmic *p = get_pmic();
+
+       if (pmic_probe(p))
+               return 0;
+
+       /* LDO3 voltage: 1.1v */
+       ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, 0x6 | EN_LDO);
+       /* LDO4 voltage: 1.8v */
+       ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, 0x14 | EN_LDO);
+
+       if (ret) {
+               puts("MAX8997 LDO setting error!\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+void init_panel_info(vidinfo_t *vid)
+{
+       vid->vl_freq    = 60;
+       vid->vl_col     = 720;
+       vid->vl_row     = 1280;
+       vid->vl_width   = 720;
+       vid->vl_height  = 1280;
+       vid->vl_clkp    = CONFIG_SYS_HIGH;
+       vid->vl_hsp     = CONFIG_SYS_LOW;
+       vid->vl_vsp     = CONFIG_SYS_LOW;
+       vid->vl_dp      = CONFIG_SYS_LOW;
+
+       vid->vl_bpix    = 5;
+       vid->dual_lcd_enabled = 0;
+
+       /* s6e8ax0 Panel */
+       vid->vl_hspw    = 5;
+       vid->vl_hbpd    = 10;
+       vid->vl_hfpd    = 10;
+
+       vid->vl_vspw    = 2;
+       vid->vl_vbpd    = 1;
+       vid->vl_vfpd    = 13;
+       vid->vl_cmd_allow_len = 0xf;
+
+       vid->win_id = 3;
+       vid->cfg_gpio = NULL;
+       vid->backlight_on = NULL;
+       vid->lcd_power_on = NULL;       /* lcd_power_on in mipi dsi driver */
+       vid->reset_lcd = lcd_reset;
+
+       vid->init_delay = 0;
+       vid->power_on_delay = 0;
+       vid->reset_delay = 0;
+       vid->interface_mode = FIMD_RGB_INTERFACE;
+       vid->mipi_enabled = 1;
+
+       strcpy(s6e8ax0_platform_data.lcd_panel_name, mipi_lcd_device.name);
+       s6e8ax0_platform_data.lcd_power = lcd_power;
+       s6e8ax0_platform_data.mipi_power = mipi_power;
+       s6e8ax0_platform_data.phy_enable = set_mipi_phy_ctrl;
+       s6e8ax0_platform_data.lcd_panel_info = (void *)vid;
+       exynos_mipi_dsi_register_lcd_device(&mipi_lcd_device);
+       s6e8ax0_init();
+       exynos_set_dsim_platform_data(&s6e8ax0_platform_data);
+
+       setenv("lcdinfo", "lcd=s6e8ax0");
+}
index d0ff8341f648f3496cc14927338d0349ec134634..90fff5cf5e181af64cfd56b53937d64daac916bd 100644 (file)
@@ -58,13 +58,13 @@ int board_init(void)
        gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
-       check_hw_revision();
-       printf("HW Revision:\t0x%x\n", board_rev);
-
 #if defined(CONFIG_PMIC)
        pmic_init();
 #endif
 
+       check_hw_revision();
+       printf("HW Revision:\t0x%x\n", board_rev);
+
        return 0;
 }
 
@@ -109,10 +109,27 @@ static unsigned short get_adc_value(int channel)
        return ret;
 }
 
+static int adc_power_control(int on)
+{
+       int ret;
+       struct pmic *p = get_pmic();
+
+       if (pmic_probe(p))
+               return -1;
+
+       ret = pmic_set_output(p,
+                             MAX8998_REG_ONOFF1,
+                             MAX8998_LDO4, !!on);
+
+       return ret;
+}
+
 static unsigned int get_hw_revision(void)
 {
        int hwrev, mode0, mode1;
 
+       adc_power_control(1);
+
        mode0 = get_adc_value(1);               /* HWREV_MODE0 */
        mode1 = get_adc_value(2);               /* HWREV_MODE1 */
 
@@ -135,6 +152,8 @@ static unsigned int get_hw_revision(void)
 
        debug("mode0: %d, mode1: %d, hwrev 0x%x\n", mode0, mode1, hwrev);
 
+       adc_power_control(0);
+
        return hwrev;
 }
 
index b92758692d57a49d1611b999aeb0cf979be3ce22..c2b10ac1eaaca35e63146d39557a875f985831b9 100644 (file)
@@ -133,7 +133,7 @@ int board_eth_init(bd_t *bis)
        !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
 
index c5eb42c362030b75e0c4695f3b88fec182061687..9fbaedd79205de2b823019cbbe1655ed92e3530d 100644 (file)
@@ -196,13 +196,6 @@ int board_init(void)
        return 0;
 }
 
-int misc_init_r(void)
-{
-       dieid_num_r();
-
-       return 0;
-}
-
 /*
  * Routine: set_muxconf_regs
  * Description: Setting up the configuration Mux registers specific to the
@@ -228,6 +221,6 @@ int board_eth_init(bd_t *bis)
        !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       return omap_mmc_init(0);
+       return omap_mmc_init(0, 0, 0);
 }
 #endif
index 436645a83f7c4f37310f6f38d4bdfcd4f0545a03..888398deac25f2f15c87bd93299d39ba46dcead7 100644 (file)
@@ -78,7 +78,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index e26b38793474bf073c455d472eabf26c22a67c9f..9edd3c5c4f6b5eb4196572ec1ba164b5bb96d918 100644 (file)
@@ -477,7 +477,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 8497aee6de8dd45cc8bb3dfb1e3f55b84497bbf8..61fc7b55310f7748770c06ce457e623f6816988e 100644 (file)
@@ -278,7 +278,7 @@ int board_eth_init(bd_t *bis)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 6f0e763f0117ec0a6ed0c7ea7d5917cfdaf0eaab..fac683a7e63ce415b2868487efd2e2b5858cd22f 100644 (file)
@@ -81,13 +81,6 @@ int board_init (void)
        return 0;
 }
 
-
-int misc_init_r (void)
-{
-       /* currently empty */
-       return (0);
-}
-
 /******************************
  Routine:
  Description:
index ea0cb13b437ca09589803b13acc940dc1809b38a..c8dfdf814299f83ecb78a8f93ef9629e9c264ad7 100644 (file)
@@ -23,7 +23,7 @@
  * MA 02111-1307 USA
  */
 #include <common.h>
-#include <twl6030.h>
+#include <twl6035.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mmc_host_def.h>
 
@@ -63,8 +63,8 @@ int board_eth_init(bd_t *bis)
  */
 int misc_init_r(void)
 {
-#ifdef CONFIG_TWL6030_POWER
-       twl6030_init_battery_charging();
+#ifdef CONFIG_TWL6035_POWER
+       twl6035_init_settings();
 #endif
        return 0;
 }
@@ -94,8 +94,8 @@ void set_muxconf_regs_non_essential(void)
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
-       omap_mmc_init(1);
+       omap_mmc_init(0, 0, 0);
+       omap_mmc_init(1, 0, 0);
        return 0;
 }
 #endif
index 18f47292574cc85064b8afc3b14c156185c34a3d..296eb682e1c6a00b68694eb23cd7a0b2379c69da 100644 (file)
@@ -2,8 +2,7 @@
  * (C) Copyright 2010
  * Texas Instruments Incorporated, <www.ti.com>
  *
- *     Balaji Krishnamoorthy   <balajitk@ti.com>
- *     Aneesh V                <aneesh@ti.com>
+ *     Sricharan R             <r.sricharan@ti.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 
 const struct pad_conf_entry core_padconf_array_essential[] = {
 
-{GPMC_AD0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat0 */
-{GPMC_AD1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat1 */
-{GPMC_AD2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat2 */
-{GPMC_AD3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat3 */
-{GPMC_AD4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat4 */
-{GPMC_AD5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat5 */
-{GPMC_AD6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat6 */
-{GPMC_AD7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat7 */
-{GPMC_NOE, (PTU | IEN | OFF_EN | OFF_OUT_PTD | M1)},    /* sdmmc2_clk */
-{GPMC_NWE, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_cmd */
-{SDMMC1_CLK, (PTU | OFF_EN | OFF_OUT_PTD | M0)},        /* sdmmc1_clk */
-{SDMMC1_CMD, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_cmd */
-{SDMMC1_DAT0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat0 */
-{SDMMC1_DAT1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat1 */
-{SDMMC1_DAT2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat2 */
-{SDMMC1_DAT3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat3 */
-{SDMMC1_DAT4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat4 */
-{SDMMC1_DAT5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat5 */
-{SDMMC1_DAT6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat6 */
-{SDMMC1_DAT7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat7 */
-{UART3_CTS_RCTX, (PTU | IEN | M0)},                    /* uart3_tx */
-{UART3_RTS_SD, (M0)},                                  /* uart3_rts_sd */
-{UART3_RX_IRRX, (IEN | M0)},                           /* uart3_rx */
-{UART3_TX_IRTX, (M0)}                                  /* uart3_tx */
+       {EMMC_CLK, (PTU | IEN | M0)}, /*  EMMC_CLK   */
+       {EMMC_CMD, (PTU | IEN | M0)}, /*  EMMC_CMD   */
+       {EMMC_DATA0, (PTU | IEN | M0)}, /*  EMMC_DATA0 */
+       {EMMC_DATA1, (PTU | IEN | M0)}, /*  EMMC_DATA1 */
+       {EMMC_DATA2, (PTU | IEN | M0)}, /*  EMMC_DATA2 */
+       {EMMC_DATA3, (PTU | IEN | M0)}, /*  EMMC_DATA3 */
+       {EMMC_DATA4, (PTU | IEN | M0)}, /*  EMMC_DATA4 */
+       {EMMC_DATA5, (PTU | IEN | M0)}, /*  EMMC_DATA5 */
+       {EMMC_DATA6, (PTU | IEN | M0)}, /*  EMMC_DATA6 */
+       {EMMC_DATA7, (PTU | IEN | M0)}, /*  EMMC_DATA7 */
+       {SDCARD_CLK, (PTU | IEN | M0)}, /*  SDCARD_CLK  */
+       {SDCARD_CMD, (PTU | IEN | M0)}, /*  SDCARD_CMD  */
+       {SDCARD_DATA0, (PTU | IEN | M0)}, /*  SDCARD_DATA0*/
+       {SDCARD_DATA1, (PTU | IEN | M0)}, /*  SDCARD_DATA1*/
+       {SDCARD_DATA2, (PTU | IEN | M0)}, /*  SDCARD_DATA2*/
+       {SDCARD_DATA3, (PTU | IEN | M0)}, /*  SDCARD_DATA3*/
+       {UART3_RX_IRRX, (PTU | IEN | M0)}, /*  UART3_RX_IRRX    */
+       {UART3_TX_IRTX, (M0)},    /*  UART3_TX_IRTX    */
 
 };
 
 const struct pad_conf_entry wkup_padconf_array_essential[] = {
 
-{PAD1_SR_SCL, (PTU | IEN | M0)}, /* sr_scl */
-{PAD0_SR_SDA, (PTU | IEN | M0)}, /* sr_sda */
-{PAD1_SYS_32K, (IEN | M0)}      /* sys_32k */
+       {SR_PMIC_SCL, (PTU | IEN | M0)}, /* SR_PMIC_SCL */
+       {SR_PMIC_SDA, (PTU | IEN | M0)}, /* SR_PMIC_SDA */
+       {SYS_32K, (IEN | M0)}, /*  SYS_32K     */
 
 };
 
 const struct pad_conf_entry core_padconf_array_non_essential[] = {
-       {GPMC_AD8, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M3)},        /* gpio_32 */
-       {GPMC_AD9, (PTU | IEN | M3)},                                   /* gpio_33 */
-       {GPMC_AD10, (PTU | IEN | M3)},                                  /* gpio_34 */
-       {GPMC_AD11, (PTU | IEN | M3)},                                  /* gpio_35 */
-       {GPMC_AD12, (PTU | IEN | M3)},                                  /* gpio_36 */
-       {GPMC_AD13, (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M3)},        /* gpio_37 */
-       {GPMC_AD14, (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M3)},        /* gpio_38 */
-       {GPMC_AD15, (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M3)},        /* gpio_39 */
-       {GPMC_A16, (M3)},                                               /* gpio_40 */
-       {GPMC_A17, (PTD | M3)},                                         /* gpio_41 */
-       {GPMC_A18, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},        /* kpd_row6 */
-       {GPMC_A19, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},        /* kpd_row7 */
-       {GPMC_A20, (IEN | M3)},                                         /* gpio_44 */
-       {GPMC_A21, (M3)},                                               /* gpio_45 */
-       {GPMC_A22, (OFF_EN | OFF_PD | OFF_IN | M1)},                    /* kpd_col6 */
-       {GPMC_A23, (OFF_EN | OFF_PD | OFF_IN | M1)},                    /* kpd_col7 */
-       {GPMC_A24, (PTD | M3)},                                         /* gpio_48 */
-       {GPMC_A25, (PTD | M3)},                                         /* gpio_49 */
-       {GPMC_NCS0, (M3)},                                              /* gpio_50 */
-       {GPMC_NCS1, (IEN | M3)},                                        /* gpio_51 */
-       {GPMC_NCS2, (IEN | M3)},                                        /* gpio_52 */
-       {GPMC_NCS3, (IEN | M3)},                                        /* gpio_53 */
-       {GPMC_NWP, (M3)},                                               /* gpio_54 */
-       {GPMC_CLK, (PTD | M3)},                                         /* gpio_55 */
-       {GPMC_NADV_ALE, (M3)},                                          /* gpio_56 */
-       {GPMC_NBE0_CLE, (M3)},                                          /* gpio_59 */
-       {GPMC_NBE1, (PTD | M3)},                                        /* gpio_60 */
-       {GPMC_WAIT0, (PTU | IEN | M3)},                                 /* gpio_61 */
-       {GPMC_WAIT1, (IEN | M3)},                                       /* gpio_62 */
-       {C2C_DATA11, (PTD | M3)},                                       /* gpio_100 */
-       {C2C_DATA12, (M1)},                                             /* dsi1_te0 */
-       {C2C_DATA13, (PTD | M3)},                                       /* gpio_102 */
-       {C2C_DATA14, (M1)},                                             /* dsi2_te0 */
-       {C2C_DATA15, (PTD | M3)},                                       /* gpio_104 */
-       {HDMI_HPD, (M0)},                                               /* hdmi_hpd */
-       {HDMI_CEC, (M0)},                                               /* hdmi_cec */
-       {HDMI_DDC_SCL, (PTU | M0)},                                     /* hdmi_ddc_scl */
-       {HDMI_DDC_SDA, (PTU | IEN | M0)},                               /* hdmi_ddc_sda */
-       {CSI21_DX0, (IEN | M0)},                                        /* csi21_dx0 */
-       {CSI21_DY0, (IEN | M0)},                                        /* csi21_dy0 */
-       {CSI21_DX1, (IEN | M0)},                                        /* csi21_dx1 */
-       {CSI21_DY1, (IEN | M0)},                                        /* csi21_dy1 */
-       {CSI21_DX2, (IEN | M0)},                                        /* csi21_dx2 */
-       {CSI21_DY2, (IEN | M0)},                                        /* csi21_dy2 */
-       {CSI21_DX3, (PTD | M7)},                                        /* csi21_dx3 */
-       {CSI21_DY3, (PTD | M7)},                                        /* csi21_dy3 */
-       {CSI21_DX4, (PTD | OFF_EN | OFF_PD | OFF_IN | M7)},             /* csi21_dx4 */
-       {CSI21_DY4, (PTD | OFF_EN | OFF_PD | OFF_IN | M7)},             /* csi21_dy4 */
-       {CSI22_DX0, (IEN | M0)},                                        /* csi22_dx0 */
-       {CSI22_DY0, (IEN | M0)},                                        /* csi22_dy0 */
-       {CSI22_DX1, (IEN | M0)},                                        /* csi22_dx1 */
-       {CSI22_DY1, (IEN | M0)},                                        /* csi22_dy1 */
-       {CAM_SHUTTER, (OFF_EN | OFF_PD | OFF_OUT_PTD | M0)},            /* cam_shutter */
-       {CAM_STROBE, (OFF_EN | OFF_PD | OFF_OUT_PTD | M0)},             /* cam_strobe */
-       {CAM_GLOBALRESET, (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M3)},  /* gpio_83 */
-       {USBB1_ULPITLL_CLK, (IEN | OFF_EN | OFF_IN | M1)},              /* hsi1_cawake */
-       {USBB1_ULPITLL_STP, (IEN | OFF_EN | OFF_IN | M1)},              /* hsi1_cadata */
-       {USBB1_ULPITLL_DIR, (IEN | OFF_EN | OFF_IN | M1)},              /* hsi1_caflag */
-       {USBB1_ULPITLL_NXT, (OFF_EN | M1)},                             /* hsi1_acready */
-       {USBB1_ULPITLL_DAT0, (OFF_EN | M1)},                            /* hsi1_acwake */
-       {USBB1_ULPITLL_DAT1, (OFF_EN | M1)},                            /* hsi1_acdata */
-       {USBB1_ULPITLL_DAT2, (OFF_EN | M1)},                            /* hsi1_acflag */
-       {USBB1_ULPITLL_DAT3, (IEN | OFF_EN | OFF_IN | M1)},             /* hsi1_caready */
-       {USBB1_ULPITLL_DAT4, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},    /* usbb1_ulpiphy_dat4 */
-       {USBB1_ULPITLL_DAT5, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},    /* usbb1_ulpiphy_dat5 */
-       {USBB1_ULPITLL_DAT6, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},    /* usbb1_ulpiphy_dat6 */
-       {USBB1_ULPITLL_DAT7, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},    /* usbb1_ulpiphy_dat7 */
-       {USBB1_HSIC_DATA, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},       /* usbb1_hsic_data */
-       {USBB1_HSIC_STROBE, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},     /* usbb1_hsic_strobe */
-       {USBC1_ICUSB_DP, (IEN | M0)},                                   /* usbc1_icusb_dp */
-       {USBC1_ICUSB_DM, (IEN | M0)},                                   /* usbc1_icusb_dm */
-       {ABE_MCBSP2_CLKX, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},       /* abe_mcbsp2_clkx */
-       {ABE_MCBSP2_DR, (IEN | OFF_EN | OFF_OUT_PTD | M0)},             /* abe_mcbsp2_dr */
-       {ABE_MCBSP2_DX, (OFF_EN | OFF_OUT_PTD | M0)},                   /* abe_mcbsp2_dx */
-       {ABE_MCBSP2_FSX, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},        /* abe_mcbsp2_fsx */
-       {ABE_MCBSP1_CLKX, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},       /* abe_mcbsp1_clkx */
-       {ABE_MCBSP1_DR, (IEN | OFF_EN | OFF_OUT_PTD | M0)},             /* abe_mcbsp1_dr */
-       {ABE_MCBSP1_DX, (OFF_EN | OFF_OUT_PTD | M0)},                   /* abe_mcbsp1_dx */
-       {ABE_MCBSP1_FSX, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},        /* abe_mcbsp1_fsx */
-       {ABE_PDM_UL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* abe_pdm_ul_data */
-       {ABE_PDM_DL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* abe_pdm_dl_data */
-       {ABE_PDM_FRAME, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},   /* abe_pdm_frame */
-       {ABE_PDM_LB_CLK, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},  /* abe_pdm_lb_clk */
-       {ABE_CLKS, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},        /* abe_clks */
-       {ABE_DMIC_CLK1, (M0)},                                          /* abe_dmic_clk1 */
-       {ABE_DMIC_DIN1, (IEN | M0)},                                    /* abe_dmic_din1 */
-       {ABE_DMIC_DIN2, (IEN | M0)},                                    /* abe_dmic_din2 */
-       {ABE_DMIC_DIN3, (IEN | M0)},                                    /* abe_dmic_din3 */
-       {UART2_CTS, (PTU | IEN | M0)},                                  /* uart2_cts */
-       {UART2_RTS, (M0)},                                              /* uart2_rts */
-       {UART2_RX, (PTU | IEN | M0)},                                   /* uart2_rx */
-       {UART2_TX, (M0)},                                               /* uart2_tx */
-       {HDQ_SIO, (M3)},                                                /* gpio_127 */
-       {MCSPI1_CLK, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},            /* mcspi1_clk */
-       {MCSPI1_SOMI, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},           /* mcspi1_somi */
-       {MCSPI1_SIMO, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},           /* mcspi1_simo */
-       {MCSPI1_CS0, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},      /* mcspi1_cs0 */
-       {MCSPI1_CS1, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M3)},      /* mcspi1_cs1 */
-       {MCSPI1_CS2, (PTU | OFF_EN | OFF_OUT_PTU | M3)},                /* gpio_139 */
-       {MCSPI1_CS3, (PTU | IEN | M3)},                                 /* gpio_140 */
-       {SDMMC5_CLK, (PTU | IEN | OFF_EN | OFF_OUT_PTD | M0)},          /* sdmmc5_clk */
-       {SDMMC5_CMD, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},      /* sdmmc5_cmd */
-       {SDMMC5_DAT0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},     /* sdmmc5_dat0 */
-       {SDMMC5_DAT1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},     /* sdmmc5_dat1 */
-       {SDMMC5_DAT2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},     /* sdmmc5_dat2 */
-       {SDMMC5_DAT3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},     /* sdmmc5_dat3 */
-       {MCSPI4_CLK, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},            /* mcspi4_clk */
-       {MCSPI4_SIMO, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},           /* mcspi4_simo */
-       {MCSPI4_SOMI, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},           /* mcspi4_somi */
-       {MCSPI4_CS0, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},      /* mcspi4_cs0 */
-       {UART4_RX, (IEN | M0)},                                         /* uart4_rx */
-       {UART4_TX, (M0)},                                               /* uart4_tx */
-       {USBB2_ULPITLL_CLK, (PTD | IEN | M3)},                          /* gpio_157 */
-       {USBB2_ULPITLL_STP, (IEN | M5)},                                /* dispc2_data23 */
-       {USBB2_ULPITLL_DIR, (IEN | M5)},                                /* dispc2_data22 */
-       {USBB2_ULPITLL_NXT, (IEN | M5)},                                /* dispc2_data21 */
-       {USBB2_ULPITLL_DAT0, (IEN | M5)},                               /* dispc2_data20 */
-       {USBB2_ULPITLL_DAT1, (IEN | M5)},                               /* dispc2_data19 */
-       {USBB2_ULPITLL_DAT2, (IEN | M5)},                               /* dispc2_data18 */
-       {USBB2_ULPITLL_DAT3, (IEN | M5)},                               /* dispc2_data15 */
-       {USBB2_ULPITLL_DAT4, (IEN | M5)},                               /* dispc2_data14 */
-       {USBB2_ULPITLL_DAT5, (IEN | M5)},                               /* dispc2_data13 */
-       {USBB2_ULPITLL_DAT6, (IEN | M5)},                               /* dispc2_data12 */
-       {USBB2_ULPITLL_DAT7, (IEN | M5)},                               /* dispc2_data11 */
-       {USBB2_HSIC_DATA, (PTD | OFF_EN | OFF_OUT_PTU | M3)},           /* gpio_169 */
-       {USBB2_HSIC_STROBE, (PTD | OFF_EN | OFF_OUT_PTU | M3)},         /* gpio_170 */
-       {UNIPRO_TX0, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col0 */
-       {UNIPRO_TY0, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col1 */
-       {UNIPRO_TX1, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col2 */
-       {UNIPRO_TY1, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col3 */
-       {UNIPRO_TX2, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col4 */
-       {UNIPRO_TY2, (OFF_EN | OFF_PD | OFF_IN | M1)},                  /* kpd_col5 */
-       {UNIPRO_RX0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row0 */
-       {UNIPRO_RY0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row1 */
-       {UNIPRO_RX1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row2 */
-       {UNIPRO_RY1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row3 */
-       {UNIPRO_RX2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row4 */
-       {UNIPRO_RY2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},      /* kpd_row5 */
-       {USBA0_OTG_CE, (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M0)},     /* usba0_otg_ce */
-       {USBA0_OTG_DP, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},          /* usba0_otg_dp */
-       {USBA0_OTG_DM, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},          /* usba0_otg_dm */
-       {FREF_CLK1_OUT, (M0)},                                          /* fref_clk1_out */
-       {FREF_CLK2_OUT, (M0)},                                          /* fref_clk2_out */
-       {SYS_NIRQ1, (PTU | IEN | M0)},                                  /* sys_nirq1 */
-       {SYS_NIRQ2, (M7)},                                              /* sys_nirq2 */
-       {SYS_BOOT0, (PTU | IEN | M3)},                                  /* gpio_184 */
-       {SYS_BOOT1, (M3)},                                              /* gpio_185 */
-       {SYS_BOOT2, (PTD | IEN | M3)},                                  /* gpio_186 */
-       {SYS_BOOT3, (PTD | IEN | M3)},                                  /* gpio_187 */
-       {SYS_BOOT4, (M3)},                                              /* gpio_188 */
-       {SYS_BOOT5, (PTD | IEN | M3)},                                  /* gpio_189 */
-       {DPM_EMU0, (IEN | M0)},                                         /* dpm_emu0 */
-       {DPM_EMU1, (IEN | M0)},                                         /* dpm_emu1 */
-       {DPM_EMU2, (IEN | M0)},                                         /* dpm_emu2 */
-       {DPM_EMU3, (IEN | M5)},                                         /* dispc2_data10 */
-       {DPM_EMU4, (IEN | M5)},                                         /* dispc2_data9 */
-       {DPM_EMU5, (IEN | M5)},                                         /* dispc2_data16 */
-       {DPM_EMU6, (IEN | M5)},                                         /* dispc2_data17 */
-       {DPM_EMU7, (IEN | M5)},                                         /* dispc2_hsync */
-       {DPM_EMU8, (IEN | M5)},                                         /* dispc2_pclk */
-       {DPM_EMU9, (IEN | M5)},                                         /* dispc2_vsync */
-       {DPM_EMU10, (IEN | M5)},                                        /* dispc2_de */
-       {DPM_EMU11, (IEN | M5)},                                        /* dispc2_data8 */
-       {DPM_EMU12, (IEN | M5)},                                        /* dispc2_data7 */
-       {DPM_EMU13, (IEN | M5)},                                        /* dispc2_data6 */
-       {DPM_EMU14, (IEN | M5)},                                        /* dispc2_data5 */
-       {DPM_EMU15, (IEN | M5)},                                        /* dispc2_data4 */
-       {DPM_EMU16, (M3)},                                              /* gpio_27 */
-       {DPM_EMU17, (IEN | M5)},                                        /* dispc2_data2 */
-       {DPM_EMU18, (IEN | M5)},                                        /* dispc2_data1 */
-       {DPM_EMU19, (IEN | M5)},                                        /* dispc2_data0 */
-       {I2C1_SCL, (PTU | IEN | M0)},                           /* i2c1_scl */
-       {I2C1_SDA, (PTU | IEN | M0)},                           /* i2c1_sda */
-       {I2C2_SCL, (PTU | IEN | M0)},                           /* i2c2_scl */
-       {I2C2_SDA, (PTU | IEN | M0)},                           /* i2c2_sda */
-       {I2C3_SCL, (PTU | IEN | M0)},                           /* i2c3_scl */
-       {I2C3_SDA, (PTU | IEN | M0)},                           /* i2c3_sda */
-       {I2C4_SCL, (PTU | IEN | M0)},                           /* i2c4_scl */
-       {I2C4_SDA, (PTU | IEN | M0)}                            /* i2c4_sda */
+
+       {C2C_DATAIN0, (IEN | M0)},    /*  C2C_DATAIN0   */
+       {C2C_DATAIN1, (IEN | M0)},    /*  C2C_DATAIN1   */
+       {C2C_DATAIN2, (IEN | M0)},    /*  C2C_DATAIN2   */
+       {C2C_DATAIN3, (IEN | M0)},    /*  C2C_DATAIN3   */
+       {C2C_DATAIN4, (IEN | M0)},    /*  C2C_DATAIN4   */
+       {C2C_DATAIN5, (IEN | M0)},    /*  C2C_DATAIN5   */
+       {C2C_DATAIN6, (IEN | M0)},    /*  C2C_DATAIN6   */
+       {C2C_DATAIN7, (IEN | M0)},    /*  C2C_DATAIN7   */
+       {C2C_CLKIN1,  (IEN | M0)},    /*  C2C_CLKIN1    */
+       {C2C_CLKIN0,  (IEN | M0)},    /*  C2C_CLKIN0    */
+       {C2C_CLKOUT0, (M0)},    /*  C2C_CLKOUT0   */
+       {C2C_CLKOUT1, (M0)},    /*  C2C_CLKOUT1   */
+       {C2C_DATAOUT0, (M0)},    /*  C2C_DATAOUT0  */
+       {C2C_DATAOUT1, (M0)},    /*  C2C_DATAOUT1  */
+       {C2C_DATAOUT2, (M0)},    /*  C2C_DATAOUT2  */
+       {C2C_DATAOUT3, (M0)},    /*  C2C_DATAOUT3  */
+       {C2C_DATAOUT4, (M0)},    /*  C2C_DATAOUT4  */
+       {C2C_DATAOUT5, (M0)},    /*  C2C_DATAOUT5  */
+       {C2C_DATAOUT6, (M0)},    /*  C2C_DATAOUT6  */
+       {C2C_DATAOUT7, (M0)},    /*  C2C_DATAOUT7  */
+       {C2C_DATA8, (IEN | M0)},    /*  C2C_DATA8     */
+       {C2C_DATA9, (IEN | M0)},    /*  C2C_DATA9     */
+       {C2C_DATA10, (IEN | M0)},    /*  C2C_DATA10    */
+       {C2C_DATA11, (IEN | M0)},    /*  C2C_DATA11    */
+       {C2C_DATA12, (IEN | M0)},    /*  C2C_DATA12    */
+       {C2C_DATA13, (IEN | M0)},    /*  C2C_DATA13    */
+       {C2C_DATA14, (IEN | M0)},    /*  C2C_DATA14    */
+       {C2C_DATA15, (IEN | M0)},    /*  C2C_DATA15    */
+       {LLIB_WAKEREQOUT, (PTU | IEN | M6)},    /*  GPIO2_32      */
+       {LLIA_WAKEREQOUT, (M1)},    /*  C2C_WAKEREQOUT */
+       {HSI1_ACREADY, (PTD | M6)},    /*  GPIO3_64  */
+       {HSI1_CAREADY, (PTD | M6)},    /*  GPIO3_65  */
+       {HSI1_ACWAKE,  (PTD | IEN | M6)},    /*  GPIO3_66  */
+       {HSI1_CAWAKE,  (PTU | IEN | M6)},    /*  GPIO3_67  */
+       {HSI1_ACFLAG,  (PTD | IEN | M6)},    /*  GPIO3_68  */
+       {HSI1_ACDATA,  (PTD | M6)},    /*  GPIO3_69  */
+       {HSI1_CAFLAG,  (M6)},    /*  GPIO3_70  */
+       {HSI1_CADATA,  (M6)},    /*  GPIO3_71  */
+       {UART1_TX, (M0)},    /*  UART1_TX  */
+       {UART1_CTS, (PTU | IEN | M0)},    /*  UART1_CTS */
+       {UART1_RX, (PTU | IEN | M0)},    /*  UART1_RX  */
+       {UART1_RTS, (M0)},    /*  UART1_RTS */
+       {HSI2_CAREADY, (IEN | M0)},    /*  HSI2_CAREADY */
+       {HSI2_ACREADY, (OFF_EN | M0)},    /*  HSI2_ACREADY */
+       {HSI2_CAWAKE, (IEN | PTD | M0)},    /*  HSI2_CAWAKE  */
+       {HSI2_ACWAKE, (M0)},    /*  HSI2_ACWAKE  */
+       {HSI2_CAFLAG, (IEN | PTD | M0)},    /*  HSI2_CAFLAG  */
+       {HSI2_CADATA, (IEN | PTD | M0)},    /*  HSI2_CADATA  */
+       {HSI2_ACFLAG, (M0)},    /*  HSI2_ACFLAG  */
+       {HSI2_ACDATA, (M0)},    /*  HSI2_ACDATA  */
+       {UART2_RTS, (IEN | M1)},    /*  MCSPI3_SOMI  */
+       {UART2_CTS, (IEN | M1)},    /*  MCSPI3_CS0   */
+       {UART2_RX, (IEN | M1)},    /*  MCSPI3_SIMO  */
+       {UART2_TX, (IEN | M1)},    /*  MCSPI3_CLK   */
+       {USBB1_HSIC_STROBE, (PTU | IEN | M0)},    /*  USBB1_HSIC_STROBE */
+       {USBB1_HSIC_DATA, (PTU | IEN | M0)},    /*  USBB1_HSIC_DATA */
+       {USBB2_HSIC_STROBE, (PTU | IEN | M0)},    /*  USBB2_HSIC_STROBE */
+       {USBB2_HSIC_DATA, (PTU | IEN | M0)},    /*  USBB2_HSIC_DATA  */
+       {TIMER10_PWM_EVT, (IEN | M0)},    /*  TIMER10_PWM_EVT  */
+       {DSIPORTA_TE0, (IEN | M0)},    /*  DSIPORTA_TE0     */
+       {DSIPORTA_LANE0X, (IEN | M0)},    /*  DSIPORTA_LANE0X  */
+       {DSIPORTA_LANE0Y, (IEN | M0)},    /*  DSIPORTA_LANE0Y  */
+       {DSIPORTA_LANE1X, (IEN | M0)},    /*  DSIPORTA_LANE1X  */
+       {DSIPORTA_LANE1Y, (IEN | M0)},    /*  DSIPORTA_LANE1Y  */
+       {DSIPORTA_LANE2X, (IEN | M0)},    /*  DSIPORTA_LANE2X  */
+       {DSIPORTA_LANE2Y, (IEN | M0)},    /*  DSIPORTA_LANE2Y  */
+       {DSIPORTA_LANE3X, (IEN | M0)},    /*  DSIPORTA_LANE3X  */
+       {DSIPORTA_LANE3Y, (IEN | M0)},    /*  DSIPORTA_LANE3Y  */
+       {DSIPORTA_LANE4X, (IEN | M0)},    /*  DSIPORTA_LANE4X  */
+       {DSIPORTA_LANE4Y, (IEN | M0)},    /*  DSIPORTA_LANE4Y  */
+       {TIMER9_PWM_EVT, (IEN | M0)},    /*  TIMER9_PWM_EVT   */
+       {DSIPORTC_TE0, (IEN | M0)},    /*  DSIPORTC_TE0     */
+       {DSIPORTC_LANE0X, (IEN | M0)},    /*  DSIPORTC_LANE0X  */
+       {DSIPORTC_LANE0Y, (IEN | M0)},    /*  DSIPORTC_LANE0Y  */
+       {DSIPORTC_LANE1X, (IEN | M0)},    /*  DSIPORTC_LANE1X  */
+       {DSIPORTC_LANE1Y, (IEN | M0)},    /*  DSIPORTC_LANE1Y  */
+       {DSIPORTC_LANE2X, (IEN | M0)},    /*  DSIPORTC_LANE2X  */
+       {DSIPORTC_LANE2Y, (IEN | M0)},    /*  DSIPORTC_LANE2Y  */
+       {DSIPORTC_LANE3X, (IEN | M0)},    /*  DSIPORTC_LANE3X  */
+       {DSIPORTC_LANE3Y, (IEN | M0)},    /*  DSIPORTC_LANE3Y  */
+       {DSIPORTC_LANE4X, (IEN | M0)},    /*  DSIPORTC_LANE4X  */
+       {DSIPORTC_LANE4Y, (IEN | M0)},    /*  DSIPORTC_LANE4Y  */
+       {RFBI_HSYNC0, (M4)},    /*  KBD_COL5   */
+       {RFBI_TE_VSYNC0, (PTD | M6)},    /*  GPIO6_161  */
+       {RFBI_RE, (M4)},    /*  KBD_COL4   */
+       {RFBI_A0, (PTD | IEN | M6)},    /*  GPIO6_165  */
+       {RFBI_DATA8, (M4)},    /*  KBD_COL3   */
+       {RFBI_DATA9, (PTD | M6)},    /*  GPIO6_175  */
+       {RFBI_DATA10, (PTD | M6)},    /*  GPIO6_176  */
+       {RFBI_DATA11, (PTD | M6)},    /*  GPIO6_177  */
+       {RFBI_DATA12, (PTD | M6)},    /*  GPIO6_178  */
+       {RFBI_DATA13, (PTU | IEN | M6)},    /*  GPIO6_179  */
+       {RFBI_DATA14, (M4)},    /*  KBD_COL7   */
+       {RFBI_DATA15, (M4)},    /*  KBD_COL6   */
+       {GPIO6_182, (M6)},    /*  GPIO6_182  */
+       {GPIO6_183, (PTD | M6)},    /*  GPIO6_183  */
+       {GPIO6_184, (M4)},    /*  KBD_COL2   */
+       {GPIO6_185, (PTD | IEN | M6)},    /*  GPIO6_185  */
+       {GPIO6_186, (PTD | M6)},    /*  GPIO6_186  */
+       {GPIO6_187, (PTU | IEN | M4)},    /*  KBD_ROW2   */
+       {RFBI_DATA0, (PTD | M6)},    /*  GPIO6_166  */
+       {RFBI_DATA1, (PTD | M6)},    /*  GPIO6_167  */
+       {RFBI_DATA2, (PTD | M6)},    /*  GPIO6_168  */
+       {RFBI_DATA3, (PTD | IEN | M6)},    /*  GPIO6_169  */
+       {RFBI_DATA4, (IEN | M6)},    /*  GPIO6_170  */
+       {RFBI_DATA5, (IEN | M6)},    /*  GPIO6_171  */
+       {RFBI_DATA6, (PTD | M6)},    /*  GPIO6_172  */
+       {RFBI_DATA7, (PTD | M6)},    /*  GPIO6_173  */
+       {RFBI_CS0, (PTD | IEN | M6)},    /*  GPIO6_163  */
+       {RFBI_WE, (PTD | M6)},    /*  GPIO6_162  */
+       {MCSPI2_CS0, (M0)},    /*  MCSPI2_CS0 */
+       {MCSPI2_CLK, (IEN | M0)},    /*  MCSPI2_CLK */
+       {MCSPI2_SIMO, (IEN | M0)},    /*  MCSPI2_SIMO*/
+       {MCSPI2_SOMI, (PTU | IEN | M0)},    /*  MCSPI2_SOMI*/
+       {I2C4_SCL, (IEN | M0)},    /*  I2C4_SCL   */
+       {I2C4_SDA, (IEN | M0)},    /*  I2C4_SDA   */
+       {HDMI_CEC, (IEN | M0)},    /*  HDMI_CEC   */
+       {HDMI_HPD, (PTD | IEN | M0)},    /*  HDMI_HPD   */
+       {HDMI_DDC_SCL, (IEN | M0)},    /*  HDMI_DDC_SCL */
+       {HDMI_DDC_SDA, (IEN | M0)},    /*  HDMI_DDC_SDA */
+       {CSIPORTA_LANE0X, (IEN | M0)},    /*  CSIPORTA_LANE0X  */
+       {CSIPORTA_LANE0Y, (IEN | M0)},    /*  CSIPORTA_LANE0Y  */
+       {CSIPORTA_LANE1Y, (IEN | M0)},    /*  CSIPORTA_LANE1Y  */
+       {CSIPORTA_LANE1X, (IEN | M0)},    /*  CSIPORTA_LANE1X  */
+       {CSIPORTA_LANE2Y, (IEN | M0)},    /*  CSIPORTA_LANE2Y  */
+       {CSIPORTA_LANE2X, (IEN | M0)},    /*  CSIPORTA_LANE2X  */
+       {CSIPORTA_LANE3X, (IEN | M0)},    /*  CSIPORTA_LANE3X  */
+       {CSIPORTA_LANE3Y, (IEN | M0)},    /*  CSIPORTA_LANE3Y  */
+       {CSIPORTA_LANE4X, (IEN | M0)},    /*  CSIPORTA_LANE4X  */
+       {CSIPORTA_LANE4Y, (IEN | M0)},    /*  CSIPORTA_LANE4Y  */
+       {CSIPORTB_LANE0X, (IEN | M0)},    /*  CSIPORTB_LANE0X  */
+       {CSIPORTB_LANE0Y, (IEN | M0)},    /*  CSIPORTB_LANE0Y  */
+       {CSIPORTB_LANE1Y, (IEN | M0)},    /*  CSIPORTB_LANE1Y  */
+       {CSIPORTB_LANE1X, (IEN | M0)},    /*  CSIPORTB_LANE1X  */
+       {CSIPORTB_LANE2Y, (IEN | M0)},    /*  CSIPORTB_LANE2Y  */
+       {CSIPORTB_LANE2X, (IEN | M0)},    /*  CSIPORTB_LANE2X  */
+       {CSIPORTC_LANE0Y, (IEN | M0)},    /*  CSIPORTC_LANE0Y  */
+       {CSIPORTC_LANE0X, (IEN | M0)},    /*  CSIPORTC_LANE0X  */
+       {CSIPORTC_LANE1Y, (IEN | M0)},    /*  CSIPORTC_LANE1Y  */
+       {CSIPORTC_LANE1X, (IEN | M0)},    /*  CSIPORTC_LANE1X  */
+       {CAM_SHUTTER, (M0)},    /*  CAM_SHUTTER      */
+       {CAM_STROBE, (M0)},    /*  CAM_STROBE       */
+       {CAM_GLOBALRESET, (IEN | M0)},    /*  CAM_GLOBALRESET  */
+       {TIMER11_PWM_EVT, (PTD | M6)},    /*  GPIO8_227  */
+       {TIMER5_PWM_EVT, (PTD | M6)},    /*  GPIO8_228  */
+       {TIMER6_PWM_EVT, (PTD | M6)},    /*  GPIO8_229  */
+       {TIMER8_PWM_EVT,      (PTU | M6)},    /*  GPIO8_230  */
+       {I2C3_SCL, (IEN | M0)},    /*  I2C3_SCL   */
+       {I2C3_SDA, (IEN | M0)},    /*  I2C3_SDA   */
+       {GPIO8_233, (IEN | M2)},    /*  TIMER8_PWM_EVT   */
+       {ABE_CLKS, (IEN | M0)},    /*  ABE_CLKS  */
+       {ABEDMIC_DIN1, (IEN | M0)},    /*  ABEDMIC_DIN1 */
+       {ABEDMIC_DIN2, (IEN | M0)},    /*  ABEDMIC_DIN2 */
+       {ABEDMIC_DIN3, (IEN | M0)},    /*  ABEDMIC_DIN3 */
+       {ABEDMIC_CLK1, (M0)},    /*  ABEDMIC_CLK1 */
+       {ABEDMIC_CLK2, (IEN | M1)},    /*  ABEMCBSP1_FSX */
+       {ABEDMIC_CLK3, (M1)},    /*  ABEMCBSP1_DX  */
+       {ABESLIMBUS1_CLOCK, (IEN | M1)},    /*  ABEMCBSP1_CLKX   */
+       {ABESLIMBUS1_DATA, (IEN | M1)},    /*  ABEMCBSP1_DR */
+       {ABEMCBSP2_DR, (IEN | M0)},    /*  ABEMCBSP2_DR */
+       {ABEMCBSP2_DX, (M0)},    /*  ABEMCBSP2_DX */
+       {ABEMCBSP2_FSX, (IEN | M0)},    /*  ABEMCBSP2_FSX  */
+       {ABEMCBSP2_CLKX, (IEN | M0)},    /*  ABEMCBSP2_CLKX */
+       {ABEMCPDM_UL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},    /*  ABEMCPDM_UL_DATA */
+       {ABEMCPDM_DL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},    /*  ABEMCPDM_DL_DATA */
+       {ABEMCPDM_FRAME, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},    /*  ABEMCPDM_FRAME   */
+       {ABEMCPDM_LB_CLK, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},    /*  ABEMCPDM_LB_CLK  */
+       {WLSDIO_CLK, (PTU | IEN | M0)},    /*  WLSDIO_CLK  */
+       {WLSDIO_CMD, (PTU | IEN | M0)},    /*  WLSDIO_CMD  */
+       {WLSDIO_DATA0, (PTU | IEN | M0)},    /*  WLSDIO_DATA0*/
+       {WLSDIO_DATA1, (PTU | IEN | M0)},    /*  WLSDIO_DATA1*/
+       {WLSDIO_DATA2, (PTU | IEN | M0)},    /*  WLSDIO_DATA2*/
+       {WLSDIO_DATA3, (PTU | IEN | M0)},    /*  WLSDIO_DATA3*/
+       {UART5_RX, (PTU | IEN | M0)},    /*  UART5_RX    */
+       {UART5_TX, (M0)},    /*  UART5_TX    */
+       {UART5_CTS, (PTU | IEN | M0)},    /*  UART5_CTS   */
+       {UART5_RTS, (M0)},    /*  UART5_RTS   */
+       {I2C2_SCL, (IEN | M0)},    /*  I2C2_SCL    */
+       {I2C2_SDA, (IEN | M0)},    /*  I2C2_SDA    */
+       {MCSPI1_CLK, (M6)},    /*  GPIO5_140   */
+       {MCSPI1_SOMI, (IEN | M6)},    /*  GPIO5_141   */
+       {MCSPI1_SIMO, (PTD | M6)},    /*  GPIO5_142   */
+       {MCSPI1_CS0, (PTD | M6)},    /*  GPIO5_143   */
+       {MCSPI1_CS1, (PTD | IEN | M6)},    /*  GPIO5_144   */
+       {I2C5_SCL, (IEN | M0)},    /*  I2C5_SCL    */
+       {I2C5_SDA, (IEN | M0)},    /*  I2C5_SDA    */
+       {PERSLIMBUS2_CLOCK, (PTD | M6)},    /*  GPIO5_145   */
+       {PERSLIMBUS2_DATA, (PTD | IEN | M6)},    /*  GPIO5_146   */
+       {UART6_TX, (PTU | IEN | M6)},    /*  GPIO5_149   */
+       {UART6_RX, (PTU | IEN | M6)},    /*  GPIO5_150   */
+       {UART6_CTS, (PTU | IEN | M6)},    /*  GPIO5_151   */
+       {UART6_RTS, (PTU | M0)},    /*  UART6_RTS   */
+       {UART3_CTS_RCTX, (PTU | IEN | M6)},    /*  GPIO5_153   */
+       {UART3_RTS_IRSD, (PTU | IEN | M1)},    /*  HDQ_SIO     */
+       {USBB3_HSIC_STROBE, (PTU | IEN | M0)},    /*  USBB3_HSIC_STROBE*/
+       {USBB3_HSIC_DATA, (PTU | IEN | M0)},    /*  USBB3_HSIC_DATA  */
+       {USBD0_HS_DP, (IEN | M0)},    /*  USBD0_HS_DP */
+       {USBD0_HS_DM, (IEN | M0)},    /*  USBD0_HS_DM */
+       {USBD0_SS_RX, (IEN | M0)},    /*  USBD0_SS_RX */
+       {I2C1_PMIC_SCL, (PTU | IEN | M0)},    /*  I2C1_PMIC_SCL  */
+       {I2C1_PMIC_SDA, (PTU | IEN | M0)},    /*  I2C1_PMIC_SDA  */
+
 };
 
 const struct pad_conf_entry wkup_padconf_array_non_essential[] = {
-       {PAD0_SIM_IO, (IEN | M0)},              /* sim_io */
-       {PAD1_SIM_CLK, (M0)},                   /* sim_clk */
-       {PAD0_SIM_RESET, (M0)},                 /* sim_reset */
-       {PAD1_SIM_CD, (PTU | IEN | M0)},        /* sim_cd */
-       {PAD0_SIM_PWRCTRL, (M0)},               /* sim_pwrctrl */
-       {PAD1_FREF_XTAL_IN, (M0)},              /* # */
-       {PAD0_FREF_SLICER_IN, (M0)},            /* fref_slicer_in */
-       {PAD1_FREF_CLK_IOREQ, (M0)},            /* fref_clk_ioreq */
-       {PAD0_FREF_CLK0_OUT, (M2)},             /* sys_drm_msecure */
-       {PAD1_FREF_CLK3_REQ, (PTU | IEN | M0)}, /* # */
-       {PAD0_FREF_CLK3_OUT, (M0)},             /* fref_clk3_out */
-       {PAD1_FREF_CLK4_REQ, (PTU | IEN | M0)}, /* # */
-       {PAD0_FREF_CLK4_OUT, (M0)},             /* # */
-       {PAD0_SYS_NRESPWRON, (M0)},             /* sys_nrespwron */
-       {PAD1_SYS_NRESWARM, (M0)},              /* sys_nreswarm */
-       {PAD0_SYS_PWR_REQ, (PTU | M0)},         /* sys_pwr_req */
-       {PAD1_SYS_PWRON_RESET, (M3)},           /* gpio_wk29 */
-       {PAD0_SYS_BOOT6, (IEN | M3)},           /* gpio_wk9 */
-       {PAD1_SYS_BOOT7, (IEN | M3)},           /* gpio_wk10 */
-       {PAD1_FREF_CLK3_REQ, (M3)},             /* gpio_wk30 */
-       {PAD1_FREF_CLK4_REQ, (M3)},             /* gpio_wk7 */
-       {PAD0_FREF_CLK4_OUT, (M3)},             /* gpio_wk8 */
+
+/*
+ * This pad keeps C2C Module always enabled.
+ * Putting this in safe mode do not cause the issue.
+ * C2C driver could enable this mux setting if needed.
+ */
+       {LLIA_WAKEREQIN, (M7)},    /*  SAFE MODE  */
+       {LLIB_WAKEREQIN, (M7)},    /*  SAFE MODE  */
+       {DRM_EMU0, (PTU | IEN | M0)},    /*  DRM_EMU0    */
+       {DRM_EMU1, (PTU | IEN | M0)},    /*  DRM_EMU1    */
+       {JTAG_NTRST, (IEN | M0)},    /*  JTAG_NTRST  */
+       {JTAG_TCK, (IEN | M0)},    /*  JTAG_TCK    */
+       {JTAG_RTCK, (M0)},    /*  JTAG_RTCK   */
+       {JTAG_TMSC, (IEN | M0)},    /*  JTAG_TMSC   */
+       {JTAG_TDI, (IEN | M0)},    /*  JTAG_TDI    */
+       {JTAG_TDO, (M0)},    /*  JTAG_TDO    */
+       {FREF_CLK_IOREQ, (IEN | M0)},    /*  FREF_CLK_IOREQ */
+       {FREF_CLK0_OUT, (M0)},    /*  FREF_CLK0_OUT  */
+       {FREF_CLK1_OUT, (M0)},    /*  FREF_CLK1_OUT  */
+       {FREF_CLK2_OUT, (M0)},    /*  FREF_CLK2_OUT  */
+       {FREF_CLK2_REQ, (PTU | IEN | M6)},    /*  GPIO1_WK9      */
+       {FREF_CLK1_REQ, (PTD | IEN | M6)},    /*  GPIO1_WK8      */
+       {SYS_NRESPWRON, (IEN | M0)},    /*  SYS_NRESPWRON  */
+       {SYS_NRESWARM, (PTU | IEN | M0)},    /*  SYS_NRESWARM   */
+       {SYS_PWR_REQ, (M0)},    /*  SYS_PWR_REQ    */
+       {SYS_NIRQ1, (PTU | IEN | M0)},    /*  SYS_NIRQ1      */
+       {SYS_NIRQ2, (PTU | IEN | M0)},    /*  SYS_NIRQ2      */
+       {SYS_BOOT0, (IEN | M0)},    /*  SYS_BOOT0      */
+       {SYS_BOOT1, (IEN | M0)},    /*  SYS_BOOT1      */
+       {SYS_BOOT2, (IEN | M0)},    /*  SYS_BOOT2      */
+       {SYS_BOOT3, (IEN | M0)},    /*  SYS_BOOT3      */
+       {SYS_BOOT4, (IEN | M0)},    /*  SYS_BOOT4      */
+       {SYS_BOOT5, (IEN | M0)},    /*  SYS_BOOT5      */
+
 };
 
 #endif /* _EVM4430_MUX_DATA_H */
index 954ced5efe57caad12cb3bf803faf3457e330e83..36204b2c88e6d50e6d3bcc4b43702fd0ac566cce 100644 (file)
@@ -129,12 +129,6 @@ int board_init (void)
        return 0;
 }
 
-int misc_init_r (void)
-{
-       /* currently empty */
-       return (0);
-}
-
 /******************************
  Routine:
  Description:
index ca4b8b35ebdb51ab1d630a8c719046ef9693f0d2..ee82771b08d8c1c2f24e75b2cc90bc123c35bc14 100644 (file)
@@ -179,7 +179,7 @@ void set_muxconf_regs_non_essential(void)
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 5b66a14242cde701e1694664b9f2ac7b383ff293..dc8b3886c299dd425943ac7e4c2f8c7ec00a2f8b 100644 (file)
@@ -76,7 +76,7 @@ const struct pad_conf_entry wkup_padconf_array_essential[] = {
 
 const struct pad_conf_entry wkup_padconf_array_essential_4460[] = {
 
-{PAD1_FREF_CLK4_REQ, (PTU | M7)}, /* gpio_wk7 for TPS: safe mode + pull up */
+{PAD1_FREF_CLK4_REQ, (M3)}, /* gpio_wk7 for TPS: Mode 3 */
 
 };
 
@@ -168,10 +168,10 @@ const struct pad_conf_entry core_padconf_array_non_essential[] = {
        {ABE_DMIC_DIN1, (IEN | M0)},                                    /* abe_dmic_din1 */
        {ABE_DMIC_DIN2, (PTU | IEN | M3)},                              /* gpio_121 */
        {ABE_DMIC_DIN3, (IEN | M0)},                                    /* abe_dmic_din3 */
-       {UART2_CTS, (PTU | IEN | M0)},                                  /* uart2_cts */
-       {UART2_RTS, (M0)},                                              /* uart2_rts */
-       {UART2_RX, (PTU | IEN | M0)},                                   /* uart2_rx */
-       {UART2_TX, (M0)},                                               /* uart2_tx */
+       {UART2_CTS, (PTU | IEN | M7)},                                  /* uart2_cts */
+       {UART2_RTS, (M7)},                                              /* uart2_rts */
+       {UART2_RX, (PTU | IEN | M7)},                                   /* uart2_rx */
+       {UART2_TX, (M7)},                                               /* uart2_tx */
        {HDQ_SIO, (M3)},                                                /* gpio_127 */
        {MCSPI1_CLK, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},            /* mcspi1_clk */
        {MCSPI1_SOMI, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},           /* mcspi1_somi */
index d73f5018193ffa158ee9c88cb470eae823d73d0d..9a1c0121452e79c910f039399589815181d112b9 100644 (file)
@@ -209,7 +209,7 @@ void set_muxconf_regs(void)
 #ifdef CONFIG_GENERIC_MMC
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 9ae9e2c602c3dc10706b62cd2d60a6b99947fcc7..982c771a73286921004bb55015fa78c6a2634503 100644 (file)
@@ -108,8 +108,8 @@ void set_muxconf_regs_non_essential(void)
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
-       omap_mmc_init(1);
+       omap_mmc_init(0, 0, 0);
+       omap_mmc_init(1, 0, 0);
        return 0;
 }
 #endif
index 0a20968978923d10a0ea76eaa809365460eae1e6..6140b999efd555aa7b657a27b86210c80de8819a 100644 (file)
@@ -67,7 +67,7 @@ const struct pad_conf_entry wkup_padconf_array_essential[] = {
 
 const struct pad_conf_entry wkup_padconf_array_essential_4460[] = {
 
-{PAD1_FREF_CLK4_REQ, (PTU | M7)}, /* gpio_wk7 for TPS: safe mode + pull up */
+{PAD1_FREF_CLK4_REQ, (M3)}, /* gpio_wk7 for TPS: Mode 3 */
 
 };
 
diff --git a/board/timll/devkit3250/Makefile b/board/timll/devkit3250/Makefile
new file mode 100644 (file)
index 0000000..ea7827c
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# Copyright (C) 2011 by Vladimir Zapolskiy <vz@mleia.com>
+# Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := devkit3250.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/timll/devkit3250/devkit3250.c b/board/timll/devkit3250/devkit3250.c
new file mode 100644 (file)
index 0000000..6b0ec80
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Embest/Timll DevKit3250 board support
+ *
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/emc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct emc_regs *emc = (struct emc_regs *)EMC_BASE;
+
+int board_early_init_f(void)
+{
+       lpc32xx_uart_init(CONFIG_SYS_LPC32XX_UART);
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params  = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_SYS_FLASH_CFI
+       /* Use 16-bit memory interface for NOR Flash */
+       emc->stat[0].config     = EMC_STAT_CONFIG_PB | EMC_STAT_CONFIG_16BIT;
+
+       /* Change the NOR timings to optimum value to get maximum bandwidth */
+       emc->stat[0].waitwen    = EMC_STAT_WAITWEN(1);
+       emc->stat[0].waitoen    = EMC_STAT_WAITOEN(1);
+       emc->stat[0].waitrd     = EMC_STAT_WAITRD(12);
+       emc->stat[0].waitpage   = EMC_STAT_WAITPAGE(12);
+       emc->stat[0].waitwr     = EMC_STAT_WAITWR(5);
+       emc->stat[0].waitturn   = EMC_STAT_WAITTURN(2);
+#endif
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+                                   CONFIG_SYS_SDRAM_SIZE);
+
+       return 0;
+}
index d75e86b32e69d4cf590ac1b6254ef0da06d16077..35f5e15fc24b61e132cdb7b6947a2f0d61e576cd 100644 (file)
@@ -136,7 +136,7 @@ void set_muxconf_regs(void)
 #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
 int board_mmc_init(bd_t *bis)
 {
-       omap_mmc_init(0);
+       omap_mmc_init(0, 0, 0);
        return 0;
 }
 #endif
index 5f328b586d621ad67d142dc02bc6143ab85656a2..0dee43ff3dddf745e94dd6be89ba87660eef67d6 100644 (file)
@@ -136,6 +136,7 @@ hawkboard                    arm         arm926ejs   da8xxevm            davinci
 hawkboard_uart               arm         arm926ejs   da8xxevm            davinci        davinci     hawkboard:UART_U_BOOT
 enbw_cmc                     arm         arm926ejs   enbw_cmc            enbw           davinci
 calimain                     arm         arm926ejs   calimain            omicron        davinci
+pogo_e02                     arm         arm926ejs   -                   cloudengines   kirkwood
 dns325                       arm         arm926ejs   -                   d-link         kirkwood
 km_kirkwood                  arm         arm926ejs   km_arm              keymile        kirkwood       km_kirkwood:KM_DISABLE_PCI
 km_kirkwood_pci              arm         arm926ejs   km_arm              keymile        kirkwood       km_kirkwood:KM_RECONFIG_XLX
@@ -153,7 +154,9 @@ openrd_client                arm         arm926ejs   openrd              Marvell
 openrd_ultimate              arm         arm926ejs   openrd              Marvell        kirkwood        openrd:BOARD_IS_OPENRD_ULTIMATE
 rd6281a                      arm         arm926ejs   -                   Marvell        kirkwood
 sheevaplug                   arm         arm926ejs   -                   Marvell        kirkwood
+ib62x0                       arm         arm926ejs   ib62x0              raidsonic      kirkwood
 dockstar                     arm         arm926ejs   -                   Seagate        kirkwood
+devkit3250                   arm         arm926ejs   devkit3250          timll          lpc32xx
 jadecpu                      arm         arm926ejs   jadecpu             syteco         mb86r0x
 mx25pdk                      arm         arm926ejs   mx25pdk             freescale      mx25           mx25pdk:IMX_CONFIG=board/freescale/mx25pdk/imximage.cfg
 tx25                         arm         arm926ejs   tx25                karo           mx25
@@ -189,6 +192,7 @@ mx53ard                      arm         armv7       mx53ard             freesca
 mx53evk                      arm         armv7       mx53evk             freescale      mx5            mx53evk:IMX_CONFIG=board/freescale/mx53evk/imximage.cfg
 mx53loco                     arm         armv7       mx53loco            freescale      mx5            mx53loco:IMX_CONFIG=board/freescale/mx53loco/imximage.cfg
 mx53smd                      arm         armv7       mx53smd             freescale      mx5            mx53smd:IMX_CONFIG=board/freescale/mx53smd/imximage.cfg
+ima3-mx53                    arm         armv7       ima3-mx53           esg            mx5            ima3-mx53:IMX_CONFIG=board/esg/ima3-mx53/imximage.cfg
 vision2                      arm         armv7       vision2             ttcontrol      mx5            vision2:IMX_CONFIG=board/ttcontrol/vision2/imximage_hynix.cfg
 mx6qarm2                     arm         armv7       mx6qarm2            freescale      mx6            mx6qarm2:IMX_CONFIG=board/freescale/mx6qarm2/imximage.cfg
 mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6            mx6qsabrelite:IMX_CONFIG=board/freescale/mx6qsabrelite/imximage.cfg
@@ -196,8 +200,8 @@ cm_t35                       arm         armv7       cm_t35              -
 omap3_overo                  arm         armv7       overo               -              omap3
 omap3_pandora                arm         armv7       pandora             -              omap3
 dig297                       arm         armv7       dig297              comelit        omap3
-igep0020                     arm         armv7       igep0020            isee           omap3
-igep0030                     arm         armv7       igep0030            isee           omap3
+igep0020                     arm         armv7       igep0020            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0020
+igep0030                     arm         armv7       igep0030            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0030
 am3517_evm                   arm         armv7       am3517evm           logicpd        omap3
 mt_ventoux                   arm         armv7       mt_ventoux          teejet         omap3
 omap3_zoom1                  arm         armv7       zoom1               logicpd        omap3
index 3ab285bc73b20e4bf39094a9151fee1d8796ab4b..42f08fdd0d904d868efc5b873e08d743d93d3813 100644 (file)
@@ -147,7 +147,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #ifdef CONFIG_HERMES
        print_mhz("ethspeed",           bd->bi_ethspeed);
 #endif
-       printf("IP addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("IP addr     = %s\n", getenv("ipaddr"));
        printf("baudrate    = %6ld bps\n", bd->bi_baudrate);
        print_num("relocaddr", gd->relocaddr);
        return 0;
@@ -172,7 +172,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
 
        printf("baudrate    = %ld bps\n", bd->bi_baudrate);
@@ -196,7 +196,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate    = %ld bps\n", (ulong)bd->bi_baudrate);
        return 0;
@@ -229,7 +229,7 @@ int do_bdinfo(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate               = %6ld bps\n", bd->bi_baudrate);
        return 0;
@@ -275,7 +275,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        print_eth(3);
 #endif
 
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate    = %ld bps\n", bd->bi_baudrate);
 
@@ -303,7 +303,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        print_num("flashoffset",        (ulong)bd->bi_flashoffset);
 
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
        printf("baudrate    = %d bps\n", bd->bi_baudrate);
 
        return 0;
@@ -323,7 +323,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        print_num("flashoffset",        (ulong)bd->bi_flashoffset);
 
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
        printf("baudrate    = %d bps\n", bd->bi_baudrate);
 
        return 0;
@@ -343,7 +343,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        print_num("flashoffset",        (ulong)bd->bi_flashoffset);
 
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
        printf("baudrate    = %lu bps\n", bd->bi_baudrate);
 
        return 0;
@@ -367,7 +367,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate    = %d bps\n", bd->bi_baudrate);
 #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
@@ -403,7 +403,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate    = %ld bps\n", (ulong)bd->bi_baudrate);
        return 0;
@@ -436,7 +436,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
        print_mhz("ethspeed",       bd->bi_ethspeed);
 #endif
        printf("baudrate    = %d bps\n", bd->bi_baudrate);
@@ -461,7 +461,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        print_num("FB base  ", gd->fb_base);
        return 0;
@@ -485,7 +485,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
        printf("baudrate    = %d bps\n", bd->bi_baudrate);
 
@@ -506,7 +506,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #if defined(CONFIG_CMD_NET)
        print_eth(0);
-       printf("ip_addr     = %pI4\n", &bd->bi_ip_addr);
+       printf("ip_addr     = %s\n", getenv("ipaddr"));
 #endif
 
        printf("baudrate    = %ld bps\n", bd->bi_baudrate);
index 0fd3a6c414aa9c35f13a8ec1a9bd60d4614634df..f060a317e07d94f821f4a60e5dbe2da2124c6523 100644 (file)
@@ -11,7 +11,7 @@
  * Added 16-bit nand support
  * (C) 2004 Texas Instruments
  *
- * Copyright 2010 Freescale Semiconductor
+ * Copyright 2010, 2012 Freescale Semiconductor
  * The portions of this file whose copyright is held by Freescale and which
  * are not considered a derived work of GPL v2-only code may be distributed
  * and/or modified under the terms of the GNU General Public License as
@@ -390,6 +390,41 @@ static void nand_print_and_set_info(int idx)
        setenv("nand_erasesize", buf);
 }
 
+static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
+                       int read)
+{
+       int ret = 0;
+       size_t rwsize;
+
+       while (count--) {
+               /* Raw access */
+               mtd_oob_ops_t ops = {
+                       .datbuf = (u8 *)addr,
+                       .oobbuf = ((u8 *)addr) + nand->writesize,
+                       .len = nand->writesize,
+                       .ooblen = nand->oobsize,
+                       .mode = MTD_OOB_RAW
+               };
+
+               rwsize = nand->writesize + nand->oobsize;
+               if (read)
+                       ret = nand->read_oob(nand, off, &ops);
+               else
+                       ret = nand->write_oob(nand, off, &ops);
+
+               if (ret) {
+                       printf("%s: error at offset %llx, ret %d\n",
+                               __func__, (long long)off, ret);
+                       break;
+               }
+
+               addr += nand->writesize + nand->oobsize;
+               off += nand->writesize;
+       }
+
+       return ret;
+}
+
 int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 {
        int i, ret = 0;
@@ -568,7 +603,9 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 
        if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {
                size_t rwsize;
+               ulong pagecount = 1;
                int read;
+               int raw;
 
                if (argc < 4)
                        goto usage;
@@ -577,13 +614,36 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 
                read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
                printf("\nNAND %s: ", read ? "read" : "write");
-               if (arg_off_size(argc - 3, argv + 3, &dev, &off, &size) != 0)
-                       return 1;
 
                nand = &nand_info[dev];
-               rwsize = size;
 
                s = strchr(cmd, '.');
+
+               if (!strcmp(s, ".raw")) {
+                       raw = 1;
+
+                       if (arg_off(argv[3], &dev, &off, &size))
+                               return 1;
+
+                       if (argc > 4 && !str2long(argv[4], &pagecount)) {
+                               printf("'%s' is not a number\n", argv[4]);
+                               return 1;
+                       }
+
+                       if (pagecount * nand->writesize > size) {
+                               puts("Size exceeds partition or device limit\n");
+                               return -1;
+                       }
+
+                       rwsize = pagecount * (nand->writesize + nand->oobsize);
+               } else {
+                       if (arg_off_size(argc - 3, argv + 3, &dev,
+                                               &off, &size) != 0)
+                               return 1;
+
+                       rwsize = size;
+               }
+
                if (!s || !strcmp(s, ".jffs2") ||
                    !strcmp(s, ".e") || !strcmp(s, ".i")) {
                        if (read)
@@ -609,7 +669,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                                return 1;
                        }
                        ret = nand_write_skip_bad(nand, off, &rwsize,
-                                               (u_char *)addr, WITH_YAFFS_OOB);
+                                               (u_char *)addr,
+                                               WITH_INLINE_OOB);
 #endif
                } else if (!strcmp(s, ".oob")) {
                        /* out-of-band data */
@@ -623,22 +684,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                                ret = nand->read_oob(nand, off, &ops);
                        else
                                ret = nand->write_oob(nand, off, &ops);
-               } else if (!strcmp(s, ".raw")) {
-                       /* Raw access */
-                       mtd_oob_ops_t ops = {
-                               .datbuf = (u8 *)addr,
-                               .oobbuf = ((u8 *)addr) + nand->writesize,
-                               .len = nand->writesize,
-                               .ooblen = nand->oobsize,
-                               .mode = MTD_OOB_RAW
-                       };
-
-                       rwsize = nand->writesize + nand->oobsize;
-
-                       if (read)
-                               ret = nand->read_oob(nand, off, &ops);
-                       else
-                               ret = nand->write_oob(nand, off, &ops);
+               } else if (raw) {
+                       ret = raw_access(nand, addr, off, pagecount, read);
                } else {
                        printf("Unknown nand command suffix '%s'.\n", s);
                        return 1;
@@ -732,9 +779,9 @@ U_BOOT_CMD(
        "nand write - addr off|partition size\n"
        "    read/write 'size' bytes starting at offset 'off'\n"
        "    to/from memory address 'addr', skipping bad blocks.\n"
-       "nand read.raw - addr off|partition\n"
-       "nand write.raw - addr off|partition\n"
-       "    Use read.raw/write.raw to avoid ECC and access the page as-is.\n"
+       "nand read.raw - addr off|partition [count]\n"
+       "nand write.raw - addr off|partition [count]\n"
+       "    Use read.raw/write.raw to avoid ECC and access the flash as-is.\n"
 #ifdef CONFIG_CMD_NAND_TRIMFFS
        "nand write.trimffs - addr off|partition size\n"
        "    write 'size' bytes starting at offset 'off' from memory address\n"
index e1ccdd8f7e23a96c08242816e9e918f24ad9744c..5999cb80e36b396fbab136c0e312e42a86fad415 100644 (file)
@@ -343,21 +343,7 @@ int _do_env_set(int flag, int argc, char * const argv[])
         * Some variables should be updated when the corresponding
         * entry in the environment is changed
         */
-       if (strcmp(name, "ipaddr") == 0) {
-               char *s = argv[2];      /* always use only one arg */
-               char *e;
-               unsigned long addr;
-               bd->bi_ip_addr = 0;
-               for (addr = 0, i = 0; i < 4; ++i) {
-                       ulong val = s ? simple_strtoul(s, &e, 10) : 0;
-                       addr <<= 8;
-                       addr  |= val & 0xFF;
-                       if (s)
-                               s = *e ? e + 1 : e;
-               }
-               bd->bi_ip_addr = htonl(addr);
-               return 0;
-       } else if (strcmp(argv[1], "loadaddr") == 0) {
+       if (strcmp(argv[1], "loadaddr") == 0) {
                load_addr = simple_strtoul(argv[2], NULL, 16);
                return 0;
        }
index 7b1703fe4133df3866f023cdd45d7219026be791..3f98235a38a6a0fa725ab1694285085e768f5e80 100644 (file)
@@ -48,9 +48,12 @@ int __sata_initialize(void)
                sata_dev_desc[i].block_write = sata_write;
 
                rc = init_sata(i);
-               rc = scan_sata(i);
-               if ((sata_dev_desc[i].lba > 0) && (sata_dev_desc[i].blksz > 0))
-                       init_part(&sata_dev_desc[i]);
+               if (!rc) {
+                       rc = scan_sata(i);
+                       if (!rc && (sata_dev_desc[i].lba > 0) &&
+                               (sata_dev_desc[i].blksz > 0))
+                               init_part(&sata_dev_desc[i]);
+               }
        }
        sata_curr_device = 0;
        return rc;
index 3b9e39a9805b9da3831edef2177c44b00c72893e..a93335798bd0dd887f96da3f36f16ec2f42f812c 100644 (file)
@@ -973,7 +973,6 @@ int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
 
 #ifdef CONFIG_SHOW_ACTIVITY
                while (!tstc()) {
-                       extern void show_activity(int arg);
                        show_activity(0);
                        WATCHDOG_RESET();
                }
index fa33e628513ce78c097f33821f77794a569c74d4..c239f2315d4b1fe140e0c858d7176f51cc13cf0a 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -104,7 +104,7 @@ HOSTCFLAGS  += -pedantic
 
 #########################################################################
 #
-# Option checker (courtesy linux kernel) to ensure
+# Option checker, gcc version (courtesy linux kernel) to ensure
 # only supported compiler options are used
 #
 CC_OPTIONS_CACHE_FILE := $(OBJTREE)/include/generated/cc_options.mk
@@ -125,6 +125,10 @@ cc-option = $(strip $(if $(findstring $1,$(CC_OPTIONS)),$1,\
                $(if $(call cc-option-sys,$1),$1,$2)))
 endif
 
+# cc-version
+# Usage gcc-ver := $(call cc-version)
+cc-version = $(shell $(SHELL) $(SRCTREE)/tools/gcc-version.sh $(CC))
+
 #
 # Include the make variables (CC, etc...)
 #
index 04a87c99184be6e229cfbe3d5a8d035adfd6894d..1602b5eee96da355d46539c140280e58d63bcaa2 100644 (file)
@@ -94,14 +94,14 @@ Commands:
       of data for one 512-byte page or 2 256-byte pages. There is no check
       for bad blocks.
 
-   nand read.raw addr ofs|partition
-      Read page from `ofs' in NAND flash to `addr'. This reads the raw page,
-      so ECC is avoided and the OOB area is read as well.
-
-   nand write.raw addr ofs|partition
-      Write page from `addr' to `ofs' in NAND flash. This writes the raw page,
-      so ECC is avoided and the OOB area is written as well, making the whole
-      page written as-is.
+   nand read.raw addr ofs|partition [count]
+   nand write.raw addr ofs|partition [count]
+      Read or write one or more pages at "ofs" in NAND flash, from or to
+      "addr" in memory.  This is a raw access, so ECC is avoided and the
+      OOB area is transferred as well.  If count is absent, it is assumed
+      to be one page.  As with .yaffs2 accesses, the data is formatted as
+      a packed sequence of "data, oob, data, oob, ..." -- no alignment of
+      individual pages is maintained.
 
 Configuration Options:
 
index cc5d5c09ad708fe552de5f62239159c4aedbbc6f..a543e65d39bc58021daff745ebb705a360ab69a9 100644 (file)
@@ -34,14 +34,14 @@ DDR1: 0x80000000 - 0xBFFFFFFF
 
 Option 1 (SPL only):
 0x40200800 - 0x4020BBFF: Area for SPL text, data and rodata
-0x4020BC00 - 0x4020FFFC: Area for the SPL stack.
+0x4020E000 - 0x4020FFFC: Area for the SPL stack.
 0x80000000 - 0x8007FFFF: Area for the SPL BSS.
 0x80100000: CONFIG_SYS_TEXT_BASE of U-Boot
 0x80208000 - 0x80307FFF: malloc() pool available to SPL.
 
 Option 2 (SPL or X-Loader):
 0x40200800 - 0x4020BBFF: Area for SPL text, data and rodata
-0x4020BC00 - 0x4020FFFC: Area for the SPL stack.
+0x4020E000 - 0x4020FFFC: Area for the SPL stack.
 0x80008000: CONFIG_SYS_TEXT_BASE of U-Boot
 0x87000000 - 0x8707FFFF: Area for the SPL BSS.
 0x87080000 - 0x870FFFFF: malloc() pool available to SPL.
index 7553087b2630eeefdded4c8fa90a1a3bce33b9c6..5f6c795fb7ffc8f45334eac7dca5cca2a916ae10 100644 (file)
@@ -118,11 +118,6 @@ static u32 x86emu_parity_tab[8] =
 
 #define PARITY(x)   (((x86emu_parity_tab[(x) / 32] >> ((x) % 32)) & 1) == 0)
 #define XOR2(x)            (((x) ^ ((x)>>1)) & 0x1)
-/*----------------------------- Implementation ----------------------------*/
-int abs(int v)
-{
-       return (v>0)?v:-v;
-}
 
 /*----------------------------- Implementation ----------------------------*/
 
index 98560ef76f36c198d1614f5c5f8ab90114fb2015..b9c20475c26e86ee34e77eec96073c585292df62 100644 (file)
@@ -27,6 +27,7 @@ LIB   := $(obj)libblock.o
 
 COBJS-$(CONFIG_SCSI_AHCI) += ahci.o
 COBJS-$(CONFIG_ATA_PIIX) += ata_piix.o
+COBJS-$(CONFIG_DWC_AHSATA) += dwc_ahsata.o
 COBJS-$(CONFIG_FSL_SATA) += fsl_sata.o
 COBJS-$(CONFIG_IDE_FTIDE020) += ftide020.o
 COBJS-$(CONFIG_LIBATA) += libata.o
diff --git a/drivers/block/dwc_ahsata.c b/drivers/block/dwc_ahsata.c
new file mode 100644 (file)
index 0000000..2703d3d
--- /dev/null
@@ -0,0 +1,969 @@
+/*
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Terry Lv <r65388@freescale.com>
+ *
+ * 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.
+ *
+ */
+
+#include <libata.h>
+#include <ahci.h>
+#include <fis.h>
+
+#include <common.h>
+#include <malloc.h>
+#include <linux/ctype.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <linux/bitops.h>
+#include <asm/arch/clock.h>
+#include "dwc_ahsata.h"
+
+struct sata_port_regs {
+       u32 clb;
+       u32 clbu;
+       u32 fb;
+       u32 fbu;
+       u32 is;
+       u32 ie;
+       u32 cmd;
+       u32 res1[1];
+       u32 tfd;
+       u32 sig;
+       u32 ssts;
+       u32 sctl;
+       u32 serr;
+       u32 sact;
+       u32 ci;
+       u32 sntf;
+       u32 res2[1];
+       u32 dmacr;
+       u32 res3[1];
+       u32 phycr;
+       u32 physr;
+};
+
+struct sata_host_regs {
+       u32 cap;
+       u32 ghc;
+       u32 is;
+       u32 pi;
+       u32 vs;
+       u32 ccc_ctl;
+       u32 ccc_ports;
+       u32 res1[2];
+       u32 cap2;
+       u32 res2[30];
+       u32 bistafr;
+       u32 bistcr;
+       u32 bistfctr;
+       u32 bistsr;
+       u32 bistdecr;
+       u32 res3[2];
+       u32 oobr;
+       u32 res4[8];
+       u32 timer1ms;
+       u32 res5[1];
+       u32 gparam1r;
+       u32 gparam2r;
+       u32 pparamr;
+       u32 testr;
+       u32 versionr;
+       u32 idr;
+};
+
+#define MAX_DATA_BYTES_PER_SG  (4 * 1024 * 1024)
+#define MAX_BYTES_PER_TRANS (AHCI_MAX_SG * MAX_DATA_BYTES_PER_SG)
+
+#define writel_with_flush(a, b)        do { writel(a, b); readl(b); } while (0)
+
+static int is_ready;
+
+static inline u32 ahci_port_base(u32 base, u32 port)
+{
+       return base + 0x100 + (port * 0x80);
+}
+
+static int waiting_for_cmd_completed(u8 *offset,
+                                       int timeout_msec,
+                                       u32 sign)
+{
+       int i;
+       u32 status;
+
+       for (i = 0;
+               ((status = readl(offset)) & sign) && i < timeout_msec;
+               ++i)
+               mdelay(1);
+
+       return (i < timeout_msec) ? 0 : -1;
+}
+
+static int ahci_setup_oobr(struct ahci_probe_ent *probe_ent,
+                                               int clk)
+{
+       struct sata_host_regs *host_mmio =
+               (struct sata_host_regs *)probe_ent->mmio_base;
+
+       writel(SATA_HOST_OOBR_WE, &(host_mmio->oobr));
+       writel(0x02060b14, &(host_mmio->oobr));
+
+       return 0;
+}
+
+static int ahci_host_init(struct ahci_probe_ent *probe_ent)
+{
+       u32 tmp, cap_save, num_ports;
+       int i, j, timeout = 1000;
+       struct sata_port_regs *port_mmio = NULL;
+       struct sata_host_regs *host_mmio =
+               (struct sata_host_regs *)probe_ent->mmio_base;
+       int clk = mxc_get_clock(MXC_SATA_CLK);
+
+       cap_save = readl(&(host_mmio->cap));
+       cap_save |= SATA_HOST_CAP_SSS;
+
+       /* global controller reset */
+       tmp = readl(&(host_mmio->ghc));
+       if ((tmp & SATA_HOST_GHC_HR) == 0)
+               writel_with_flush(tmp | SATA_HOST_GHC_HR, &(host_mmio->ghc));
+
+       while ((readl(&(host_mmio->ghc)) & SATA_HOST_GHC_HR)
+               && --timeout)
+               ;
+
+       if (timeout <= 0) {
+               debug("controller reset failed (0x%x)\n", tmp);
+               return -1;
+       }
+
+       /* Set timer 1ms */
+       writel(clk / 1000, &(host_mmio->timer1ms));
+
+       ahci_setup_oobr(probe_ent, 0);
+
+       writel_with_flush(SATA_HOST_GHC_AE, &(host_mmio->ghc));
+       writel(cap_save, &(host_mmio->cap));
+       num_ports = (cap_save & SATA_HOST_CAP_NP_MASK) + 1;
+       writel_with_flush((1 << num_ports) - 1,
+                               &(host_mmio->pi));
+
+       /*
+        * Determine which Ports are implemented by the DWC_ahsata,
+        * by reading the PI register. This bit map value aids the
+        * software to determine how many Ports are available and
+        * which Port registers need to be initialized.
+        */
+       probe_ent->cap = readl(&(host_mmio->cap));
+       probe_ent->port_map = readl(&(host_mmio->pi));
+
+       /* Determine how many command slots the HBA supports */
+       probe_ent->n_ports =
+               (probe_ent->cap & SATA_HOST_CAP_NP_MASK) + 1;
+
+       debug("cap 0x%x  port_map 0x%x  n_ports %d\n",
+               probe_ent->cap, probe_ent->port_map, probe_ent->n_ports);
+
+       for (i = 0; i < probe_ent->n_ports; i++) {
+               probe_ent->port[i].port_mmio =
+                       ahci_port_base((u32)host_mmio, i);
+               port_mmio =
+                       (struct sata_port_regs *)probe_ent->port[i].port_mmio;
+
+               /* Ensure that the DWC_ahsata is in idle state */
+               tmp = readl(&(port_mmio->cmd));
+
+               /*
+                * When P#CMD.ST, P#CMD.CR, P#CMD.FRE and P#CMD.FR
+                * are all cleared, the Port is in an idle state.
+                */
+               if (tmp & (SATA_PORT_CMD_CR | SATA_PORT_CMD_FR |
+                       SATA_PORT_CMD_FRE | SATA_PORT_CMD_ST)) {
+
+                       /*
+                        * System software places a Port into the idle state by
+                        * clearing P#CMD.ST and waiting for P#CMD.CR to return
+                        * 0 when read.
+                        */
+                       tmp &= ~SATA_PORT_CMD_ST;
+                       writel_with_flush(tmp, &(port_mmio->cmd));
+
+                       /*
+                        * spec says 500 msecs for each bit, so
+                        * this is slightly incorrect.
+                        */
+                       mdelay(500);
+
+                       timeout = 1000;
+                       while ((readl(&(port_mmio->cmd)) & SATA_PORT_CMD_CR)
+                               && --timeout)
+                               ;
+
+                       if (timeout <= 0) {
+                               debug("port reset failed (0x%x)\n", tmp);
+                               return -1;
+                       }
+               }
+
+               /* Spin-up device */
+               tmp = readl(&(port_mmio->cmd));
+               writel((tmp | SATA_PORT_CMD_SUD), &(port_mmio->cmd));
+
+               /* Wait for spin-up to finish */
+               timeout = 1000;
+               while (!(readl(&(port_mmio->cmd)) | SATA_PORT_CMD_SUD)
+                       && --timeout)
+                       ;
+               if (timeout <= 0) {
+                       debug("Spin-Up can't finish!\n");
+                       return -1;
+               }
+
+               for (j = 0; j < 100; ++j) {
+                       mdelay(10);
+                       tmp = readl(&(port_mmio->ssts));
+                       if (((tmp & SATA_PORT_SSTS_DET_MASK) == 0x3) ||
+                               ((tmp & SATA_PORT_SSTS_DET_MASK) == 0x1))
+                               break;
+               }
+
+               /* Wait for COMINIT bit 26 (DIAG_X) in SERR */
+               timeout = 1000;
+               while (!(readl(&(port_mmio->serr)) | SATA_PORT_SERR_DIAG_X)
+                       && --timeout)
+                       ;
+               if (timeout <= 0) {
+                       debug("Can't find DIAG_X set!\n");
+                       return -1;
+               }
+
+               /*
+                * For each implemented Port, clear the P#SERR
+                * register, by writing ones to each implemented\
+                * bit location.
+                */
+               tmp = readl(&(port_mmio->serr));
+               debug("P#SERR 0x%x\n",
+                               tmp);
+               writel(tmp, &(port_mmio->serr));
+
+               /* Ack any pending irq events for this port */
+               tmp = readl(&(host_mmio->is));
+               debug("IS 0x%x\n", tmp);
+               if (tmp)
+                       writel(tmp, &(host_mmio->is));
+
+               writel(1 << i, &(host_mmio->is));
+
+               /* set irq mask (enables interrupts) */
+               writel(DEF_PORT_IRQ, &(port_mmio->ie));
+
+               /* register linkup ports */
+               tmp = readl(&(port_mmio->ssts));
+               debug("Port %d status: 0x%x\n", i, tmp);
+               if ((tmp & SATA_PORT_SSTS_DET_MASK) == 0x03)
+                       probe_ent->link_port_map |= (0x01 << i);
+       }
+
+       tmp = readl(&(host_mmio->ghc));
+       debug("GHC 0x%x\n", tmp);
+       writel(tmp | SATA_HOST_GHC_IE, &(host_mmio->ghc));
+       tmp = readl(&(host_mmio->ghc));
+       debug("GHC 0x%x\n", tmp);
+
+       return 0;
+}
+
+static void ahci_print_info(struct ahci_probe_ent *probe_ent)
+{
+       struct sata_host_regs *host_mmio =
+               (struct sata_host_regs *)probe_ent->mmio_base;
+       u32 vers, cap, impl, speed;
+       const char *speed_s;
+       const char *scc_s;
+
+       vers = readl(&(host_mmio->vs));
+       cap = probe_ent->cap;
+       impl = probe_ent->port_map;
+
+       speed = (cap & SATA_HOST_CAP_ISS_MASK)
+               >> SATA_HOST_CAP_ISS_OFFSET;
+       if (speed == 1)
+               speed_s = "1.5";
+       else if (speed == 2)
+               speed_s = "3";
+       else
+               speed_s = "?";
+
+       scc_s = "SATA";
+
+       printf("AHCI %02x%02x.%02x%02x "
+               "%u slots %u ports %s Gbps 0x%x impl %s mode\n",
+               (vers >> 24) & 0xff,
+               (vers >> 16) & 0xff,
+               (vers >> 8) & 0xff,
+               vers & 0xff,
+               ((cap >> 8) & 0x1f) + 1,
+               (cap & 0x1f) + 1,
+               speed_s,
+               impl,
+               scc_s);
+
+       printf("flags: "
+               "%s%s%s%s%s%s"
+               "%s%s%s%s%s%s%s\n",
+               cap & (1 << 31) ? "64bit " : "",
+               cap & (1 << 30) ? "ncq " : "",
+               cap & (1 << 28) ? "ilck " : "",
+               cap & (1 << 27) ? "stag " : "",
+               cap & (1 << 26) ? "pm " : "",
+               cap & (1 << 25) ? "led " : "",
+               cap & (1 << 24) ? "clo " : "",
+               cap & (1 << 19) ? "nz " : "",
+               cap & (1 << 18) ? "only " : "",
+               cap & (1 << 17) ? "pmp " : "",
+               cap & (1 << 15) ? "pio " : "",
+               cap & (1 << 14) ? "slum " : "",
+               cap & (1 << 13) ? "part " : "");
+}
+
+static int ahci_init_one(int pdev)
+{
+       int rc;
+       struct ahci_probe_ent *probe_ent = NULL;
+
+       probe_ent = malloc(sizeof(struct ahci_probe_ent));
+       memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
+       probe_ent->dev = pdev;
+
+       probe_ent->host_flags = ATA_FLAG_SATA
+                               | ATA_FLAG_NO_LEGACY
+                               | ATA_FLAG_MMIO
+                               | ATA_FLAG_PIO_DMA
+                               | ATA_FLAG_NO_ATAPI;
+
+       probe_ent->mmio_base = CONFIG_DWC_AHSATA_BASE_ADDR;
+
+       /* initialize adapter */
+       rc = ahci_host_init(probe_ent);
+       if (rc)
+               goto err_out;
+
+       ahci_print_info(probe_ent);
+
+       /* Save the private struct to block device struct */
+       sata_dev_desc[pdev].priv = (void *)probe_ent;
+
+       return 0;
+
+err_out:
+       return rc;
+}
+
+static int ahci_fill_sg(struct ahci_probe_ent *probe_ent,
+                       u8 port, unsigned char *buf, int buf_len)
+{
+       struct ahci_ioports *pp = &(probe_ent->port[port]);
+       struct ahci_sg *ahci_sg = pp->cmd_tbl_sg;
+       u32 sg_count, max_bytes;
+       int i;
+
+       max_bytes = MAX_DATA_BYTES_PER_SG;
+       sg_count = ((buf_len - 1) / max_bytes) + 1;
+       if (sg_count > AHCI_MAX_SG) {
+               printf("Error:Too much sg!\n");
+               return -1;
+       }
+
+       for (i = 0; i < sg_count; i++) {
+               ahci_sg->addr =
+                       cpu_to_le32((u32)buf + i * max_bytes);
+               ahci_sg->addr_hi = 0;
+               ahci_sg->flags_size = cpu_to_le32(0x3fffff &
+                                       (buf_len < max_bytes
+                                       ? (buf_len - 1)
+                                       : (max_bytes - 1)));
+               ahci_sg++;
+               buf_len -= max_bytes;
+       }
+
+       return sg_count;
+}
+
+static void ahci_fill_cmd_slot(struct ahci_ioports *pp, u32 cmd_slot, u32 opts)
+{
+       struct ahci_cmd_hdr *cmd_hdr = (struct ahci_cmd_hdr *)(pp->cmd_slot +
+                                       AHCI_CMD_SLOT_SZ * cmd_slot);
+
+       memset(cmd_hdr, 0, AHCI_CMD_SLOT_SZ);
+       cmd_hdr->opts = cpu_to_le32(opts);
+       cmd_hdr->status = 0;
+       cmd_hdr->tbl_addr = cpu_to_le32(pp->cmd_tbl & 0xffffffff);
+       cmd_hdr->tbl_addr_hi = 0;
+}
+
+#define AHCI_GET_CMD_SLOT(c) ((c) ? ffs(c) : 0)
+
+static int ahci_exec_ata_cmd(struct ahci_probe_ent *probe_ent,
+               u8 port, struct sata_fis_h2d *cfis,
+               u8 *buf, u32 buf_len, s32 is_write)
+{
+       struct ahci_ioports *pp = &(probe_ent->port[port]);
+       struct sata_port_regs *port_mmio =
+                       (struct sata_port_regs *)pp->port_mmio;
+       u32 opts;
+       int sg_count = 0, cmd_slot = 0;
+
+       cmd_slot = AHCI_GET_CMD_SLOT(readl(&(port_mmio->ci)));
+       if (32 == cmd_slot) {
+               printf("Can't find empty command slot!\n");
+               return 0;
+       }
+
+       /* Check xfer length */
+       if (buf_len > MAX_BYTES_PER_TRANS) {
+               printf("Max transfer length is %dB\n\r",
+                       MAX_BYTES_PER_TRANS);
+               return 0;
+       }
+
+       memcpy((u8 *)(pp->cmd_tbl), cfis, sizeof(struct sata_fis_h2d));
+       if (buf && buf_len)
+               sg_count = ahci_fill_sg(probe_ent, port, buf, buf_len);
+       opts = (sizeof(struct sata_fis_h2d) >> 2) | (sg_count << 16);
+       if (is_write)
+               opts |= 0x40;
+       ahci_fill_cmd_slot(pp, cmd_slot, opts);
+
+       writel_with_flush(1 << cmd_slot, &(port_mmio->ci));
+
+       if (waiting_for_cmd_completed((u8 *)&(port_mmio->ci),
+                               10000, 0x1 << cmd_slot)) {
+               printf("timeout exit!\n");
+               return -1;
+       }
+       debug("ahci_exec_ata_cmd: %d byte transferred.\n",
+             pp->cmd_slot->status);
+
+       return buf_len;
+}
+
+static void ahci_set_feature(u8 dev, u8 port)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 1 << 7;
+       cfis->command = ATA_CMD_SET_FEATURES;
+       cfis->features = SETFEATURES_XFER;
+       cfis->sector_count = ffs(probe_ent->udma_mask + 1) + 0x3e;
+
+       ahci_exec_ata_cmd(probe_ent, port, cfis, NULL, 0, READ_CMD);
+}
+
+static int ahci_port_start(struct ahci_probe_ent *probe_ent,
+                                       u8 port)
+{
+       struct ahci_ioports *pp = &(probe_ent->port[port]);
+       struct sata_port_regs *port_mmio =
+               (struct sata_port_regs *)pp->port_mmio;
+       u32 port_status;
+       u32 mem;
+       int timeout = 10000000;
+
+       debug("Enter start port: %d\n", port);
+       port_status = readl(&(port_mmio->ssts));
+       debug("Port %d status: %x\n", port, port_status);
+       if ((port_status & 0xf) != 0x03) {
+               printf("No Link on this port!\n");
+               return -1;
+       }
+
+       mem = (u32)malloc(AHCI_PORT_PRIV_DMA_SZ + 1024);
+       if (!mem) {
+               free(pp);
+               printf("No mem for table!\n");
+               return -ENOMEM;
+       }
+
+       mem = (mem + 0x400) & (~0x3ff); /* Aligned to 1024-bytes */
+       memset((u8 *)mem, 0, AHCI_PORT_PRIV_DMA_SZ);
+
+       /*
+        * First item in chunk of DMA memory: 32-slot command table,
+        * 32 bytes each in size
+        */
+       pp->cmd_slot = (struct ahci_cmd_hdr *)mem;
+       debug("cmd_slot = 0x%x\n", (unsigned int) pp->cmd_slot);
+       mem += (AHCI_CMD_SLOT_SZ * DWC_AHSATA_MAX_CMD_SLOTS);
+
+       /*
+        * Second item: Received-FIS area, 256-Byte aligned
+        */
+       pp->rx_fis = mem;
+       mem += AHCI_RX_FIS_SZ;
+
+       /*
+        * Third item: data area for storing a single command
+        * and its scatter-gather table
+        */
+       pp->cmd_tbl = mem;
+       debug("cmd_tbl_dma = 0x%x\n", pp->cmd_tbl);
+
+       mem += AHCI_CMD_TBL_HDR;
+
+       writel_with_flush(0x00004444, &(port_mmio->dmacr));
+       pp->cmd_tbl_sg = (struct ahci_sg *)mem;
+       writel_with_flush((u32)pp->cmd_slot, &(port_mmio->clb));
+       writel_with_flush(pp->rx_fis, &(port_mmio->fb));
+
+       /* Enable FRE */
+       writel_with_flush((SATA_PORT_CMD_FRE | readl(&(port_mmio->cmd))),
+                       &(port_mmio->cmd));
+
+       /* Wait device ready */
+       while ((readl(&(port_mmio->tfd)) & (SATA_PORT_TFD_STS_ERR |
+               SATA_PORT_TFD_STS_DRQ | SATA_PORT_TFD_STS_BSY))
+               && --timeout)
+               ;
+       if (timeout <= 0) {
+               debug("Device not ready for BSY, DRQ and"
+                       "ERR in TFD!\n");
+               return -1;
+       }
+
+       writel_with_flush(PORT_CMD_ICC_ACTIVE | PORT_CMD_FIS_RX |
+                         PORT_CMD_POWER_ON | PORT_CMD_SPIN_UP |
+                         PORT_CMD_START, &(port_mmio->cmd));
+
+       debug("Exit start port %d\n", port);
+
+       return 0;
+}
+
+int init_sata(int dev)
+{
+       int i;
+       u32 linkmap;
+       struct ahci_probe_ent *probe_ent = NULL;
+
+       if (dev < 0 || dev > (CONFIG_SYS_SATA_MAX_DEVICE - 1)) {
+               printf("The sata index %d is out of ranges\n\r", dev);
+               return -1;
+       }
+
+       ahci_init_one(dev);
+
+       probe_ent = (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       linkmap = probe_ent->link_port_map;
+
+       if (0 == linkmap) {
+               printf("No port device detected!\n");
+               return 1;
+       }
+
+       for (i = 0; i < probe_ent->n_ports; i++) {
+               if ((linkmap >> i) && ((linkmap >> i) & 0x01)) {
+                       if (ahci_port_start(probe_ent, (u8)i)) {
+                               printf("Can not start port %d\n", i);
+                               return 1;
+                       }
+                       probe_ent->hard_port_no = i;
+                       break;
+               }
+       }
+
+       return 0;
+}
+
+static void dwc_ahsata_print_info(int dev)
+{
+       block_dev_desc_t *pdev = &(sata_dev_desc[dev]);
+
+       printf("SATA Device Info:\n\r");
+#ifdef CONFIG_SYS_64BIT_LBA
+       printf("S/N: %s\n\rProduct model number: %s\n\r"
+               "Firmware version: %s\n\rCapacity: %lld sectors\n\r",
+               pdev->product, pdev->vendor, pdev->revision, pdev->lba);
+#else
+       printf("S/N: %s\n\rProduct model number: %s\n\r"
+               "Firmware version: %s\n\rCapacity: %ld sectors\n\r",
+               pdev->product, pdev->vendor, pdev->revision, pdev->lba);
+#endif
+}
+
+static void dwc_ahsata_identify(int dev, u16 *id)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+       cfis->command = ATA_CMD_ID_ATA;
+
+       ahci_exec_ata_cmd(probe_ent, port, cfis,
+                       (u8 *)id, ATA_ID_WORDS * 2, READ_CMD);
+       ata_swap_buf_le16(id, ATA_ID_WORDS);
+}
+
+static void dwc_ahsata_xfer_mode(int dev, u16 *id)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+
+       probe_ent->pio_mask = id[ATA_ID_PIO_MODES];
+       probe_ent->udma_mask = id[ATA_ID_UDMA_MODES];
+       debug("pio %04x, udma %04x\n\r",
+               probe_ent->pio_mask, probe_ent->udma_mask);
+}
+
+static u32 dwc_ahsata_rw_cmd(int dev, u32 start, u32 blkcnt,
+                               u8 *buffer, int is_write)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+       u32 block;
+
+       block = start;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+       cfis->command = (is_write) ? ATA_CMD_WRITE : ATA_CMD_READ;
+       cfis->device = ATA_LBA;
+
+       cfis->device |= (block >> 24) & 0xf;
+       cfis->lba_high = (block >> 16) & 0xff;
+       cfis->lba_mid = (block >> 8) & 0xff;
+       cfis->lba_low = block & 0xff;
+       cfis->sector_count = (u8)(blkcnt & 0xff);
+
+       if (ahci_exec_ata_cmd(probe_ent, port, cfis,
+                       buffer, ATA_SECT_SIZE * blkcnt, is_write) > 0)
+               return blkcnt;
+       else
+               return 0;
+}
+
+void dwc_ahsata_flush_cache(int dev)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+       cfis->command = ATA_CMD_FLUSH;
+
+       ahci_exec_ata_cmd(probe_ent, port, cfis, NULL, 0, 0);
+}
+
+static u32 dwc_ahsata_rw_cmd_ext(int dev, u32 start, lbaint_t blkcnt,
+                               u8 *buffer, int is_write)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+       u64 block;
+
+       block = (u64)start;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+
+       cfis->command = (is_write) ? ATA_CMD_WRITE_EXT
+                                : ATA_CMD_READ_EXT;
+
+       cfis->lba_high_exp = (block >> 40) & 0xff;
+       cfis->lba_mid_exp = (block >> 32) & 0xff;
+       cfis->lba_low_exp = (block >> 24) & 0xff;
+       cfis->lba_high = (block >> 16) & 0xff;
+       cfis->lba_mid = (block >> 8) & 0xff;
+       cfis->lba_low = block & 0xff;
+       cfis->device = ATA_LBA;
+       cfis->sector_count_exp = (blkcnt >> 8) & 0xff;
+       cfis->sector_count = blkcnt & 0xff;
+
+       if (ahci_exec_ata_cmd(probe_ent, port, cfis, buffer,
+                       ATA_SECT_SIZE * blkcnt, is_write) > 0)
+               return blkcnt;
+       else
+               return 0;
+}
+
+u32 dwc_ahsata_rw_ncq_cmd(int dev, u32 start, lbaint_t blkcnt,
+                               u8 *buffer, int is_write)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+       u64 block;
+
+       if (sata_dev_desc[dev].lba48 != 1) {
+               printf("execute FPDMA command on non-LBA48 hard disk\n\r");
+               return -1;
+       }
+
+       block = (u64)start;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+
+       cfis->command = (is_write) ? ATA_CMD_FPDMA_WRITE
+                                : ATA_CMD_FPDMA_READ;
+
+       cfis->lba_high_exp = (block >> 40) & 0xff;
+       cfis->lba_mid_exp = (block >> 32) & 0xff;
+       cfis->lba_low_exp = (block >> 24) & 0xff;
+       cfis->lba_high = (block >> 16) & 0xff;
+       cfis->lba_mid = (block >> 8) & 0xff;
+       cfis->lba_low = block & 0xff;
+
+       cfis->device = ATA_LBA;
+       cfis->features_exp = (blkcnt >> 8) & 0xff;
+       cfis->features = blkcnt & 0xff;
+
+       /* Use the latest queue */
+       ahci_exec_ata_cmd(probe_ent, port, cfis,
+                       buffer, ATA_SECT_SIZE * blkcnt, is_write);
+
+       return blkcnt;
+}
+
+void dwc_ahsata_flush_cache_ext(int dev)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
+       u8 port = probe_ent->hard_port_no;
+
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
+
+       cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
+       cfis->pm_port_c = 0x80; /* is command */
+       cfis->command = ATA_CMD_FLUSH_EXT;
+
+       ahci_exec_ata_cmd(probe_ent, port, cfis, NULL, 0, 0);
+}
+
+static void dwc_ahsata_init_wcache(int dev, u16 *id)
+{
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+
+       if (ata_id_has_wcache(id) && ata_id_wcache_enabled(id))
+               probe_ent->flags |= SATA_FLAG_WCACHE;
+       if (ata_id_has_flush(id))
+               probe_ent->flags |= SATA_FLAG_FLUSH;
+       if (ata_id_has_flush_ext(id))
+               probe_ent->flags |= SATA_FLAG_FLUSH_EXT;
+}
+
+u32 ata_low_level_rw_lba48(int dev, u32 blknr, lbaint_t blkcnt,
+                               void *buffer, int is_write)
+{
+       u32 start, blks;
+       u8 *addr;
+       int max_blks;
+
+       start = blknr;
+       blks = blkcnt;
+       addr = (u8 *)buffer;
+
+       max_blks = ATA_MAX_SECTORS_LBA48;
+
+       do {
+               if (blks > max_blks) {
+                       if (max_blks != dwc_ahsata_rw_cmd_ext(dev, start,
+                                               max_blks, addr, is_write))
+                               return 0;
+                       start += max_blks;
+                       blks -= max_blks;
+                       addr += ATA_SECT_SIZE * max_blks;
+               } else {
+                       if (blks != dwc_ahsata_rw_cmd_ext(dev, start,
+                                               blks, addr, is_write))
+                               return 0;
+                       start += blks;
+                       blks = 0;
+                       addr += ATA_SECT_SIZE * blks;
+               }
+       } while (blks != 0);
+
+       return blkcnt;
+}
+
+u32 ata_low_level_rw_lba28(int dev, u32 blknr, lbaint_t blkcnt,
+                               void *buffer, int is_write)
+{
+       u32 start, blks;
+       u8 *addr;
+       int max_blks;
+
+       start = blknr;
+       blks = blkcnt;
+       addr = (u8 *)buffer;
+
+       max_blks = ATA_MAX_SECTORS;
+       do {
+               if (blks > max_blks) {
+                       if (max_blks != dwc_ahsata_rw_cmd(dev, start,
+                                               max_blks, addr, is_write))
+                               return 0;
+                       start += max_blks;
+                       blks -= max_blks;
+                       addr += ATA_SECT_SIZE * max_blks;
+               } else {
+                       if (blks != dwc_ahsata_rw_cmd(dev, start,
+                                               blks, addr, is_write))
+                               return 0;
+                       start += blks;
+                       blks = 0;
+                       addr += ATA_SECT_SIZE * blks;
+               }
+       } while (blks != 0);
+
+       return blkcnt;
+}
+
+/*
+ * SATA interface between low level driver and command layer
+ */
+ulong sata_read(int dev, unsigned long blknr, lbaint_t blkcnt, void *buffer)
+{
+       u32 rc;
+
+       if (sata_dev_desc[dev].lba48)
+               rc = ata_low_level_rw_lba48(dev, blknr, blkcnt,
+                                               buffer, READ_CMD);
+       else
+               rc = ata_low_level_rw_lba28(dev, blknr, blkcnt,
+                                               buffer, READ_CMD);
+       return rc;
+}
+
+ulong sata_write(int dev, unsigned long blknr, lbaint_t blkcnt, void *buffer)
+{
+       u32 rc;
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       u32 flags = probe_ent->flags;
+
+       if (sata_dev_desc[dev].lba48) {
+               rc = ata_low_level_rw_lba48(dev, blknr, blkcnt,
+                                               buffer, WRITE_CMD);
+               if ((flags & SATA_FLAG_WCACHE) &&
+                       (flags & SATA_FLAG_FLUSH_EXT))
+                       dwc_ahsata_flush_cache_ext(dev);
+       } else {
+               rc = ata_low_level_rw_lba28(dev, blknr, blkcnt,
+                                               buffer, WRITE_CMD);
+               if ((flags & SATA_FLAG_WCACHE) &&
+                       (flags & SATA_FLAG_FLUSH))
+                       dwc_ahsata_flush_cache(dev);
+       }
+       return rc;
+}
+
+int scan_sata(int dev)
+{
+       u8 serial[ATA_ID_SERNO_LEN + 1] = { 0 };
+       u8 firmware[ATA_ID_FW_REV_LEN + 1] = { 0 };
+       u8 product[ATA_ID_PROD_LEN + 1] = { 0 };
+       u16 *id;
+       u64 n_sectors;
+       struct ahci_probe_ent *probe_ent =
+               (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+       u8 port = probe_ent->hard_port_no;
+       block_dev_desc_t *pdev = &(sata_dev_desc[dev]);
+
+       id = (u16 *)malloc(ATA_ID_WORDS * 2);
+       if (!id) {
+               printf("id malloc failed\n\r");
+               return -1;
+       }
+
+       /* Identify device to get information */
+       dwc_ahsata_identify(dev, id);
+
+       /* Serial number */
+       ata_id_c_string(id, serial, ATA_ID_SERNO, sizeof(serial));
+       memcpy(pdev->product, serial, sizeof(serial));
+
+       /* Firmware version */
+       ata_id_c_string(id, firmware, ATA_ID_FW_REV, sizeof(firmware));
+       memcpy(pdev->revision, firmware, sizeof(firmware));
+
+       /* Product model */
+       ata_id_c_string(id, product, ATA_ID_PROD, sizeof(product));
+       memcpy(pdev->vendor, product, sizeof(product));
+
+       /* Totoal sectors */
+       n_sectors = ata_id_n_sectors(id);
+       pdev->lba = (u32)n_sectors;
+
+       pdev->type = DEV_TYPE_HARDDISK;
+       pdev->blksz = ATA_SECT_SIZE;
+       pdev->lun = 0 ;
+
+       /* Check if support LBA48 */
+       if (ata_id_has_lba48(id)) {
+               pdev->lba48 = 1;
+               debug("Device support LBA48\n\r");
+       }
+
+       /* Get the NCQ queue depth from device */
+       probe_ent->flags &= (~SATA_FLAG_Q_DEP_MASK);
+       probe_ent->flags |= ata_id_queue_depth(id);
+
+       /* Get the xfer mode from device */
+       dwc_ahsata_xfer_mode(dev, id);
+
+       /* Get the write cache status from device */
+       dwc_ahsata_init_wcache(dev, id);
+
+       /* Set the xfer mode to highest speed */
+       ahci_set_feature(dev, port);
+
+       free((void *)id);
+
+       dwc_ahsata_print_info(dev);
+
+       is_ready = 1;
+
+       return 0;
+}
diff --git a/drivers/block/dwc_ahsata.h b/drivers/block/dwc_ahsata.h
new file mode 100644 (file)
index 0000000..84860ea
--- /dev/null
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2010 Freescale Semiconductor, Inc.
+ * Terry Lv <r65388@freescale.com>
+ *
+ * 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
+ */
+
+#ifndef __FSL_SATA_H__
+#define __FSL_SATA_H__
+
+#define DWC_AHSATA_MAX_CMD_SLOTS       32
+
+/* Max host controller numbers */
+#define SATA_HC_MAX_NUM                4
+/* Max command queue depth per host controller */
+#define DWC_AHSATA_HC_MAX_CMD  32
+/* Max port number per host controller */
+#define SATA_HC_MAX_PORT       16
+
+/* Generic Host Register */
+
+/* HBA Capabilities Register */
+#define SATA_HOST_CAP_S64A             0x80000000
+#define SATA_HOST_CAP_SNCQ             0x40000000
+#define SATA_HOST_CAP_SSNTF            0x20000000
+#define SATA_HOST_CAP_SMPS             0x10000000
+#define SATA_HOST_CAP_SSS              0x08000000
+#define SATA_HOST_CAP_SALP             0x04000000
+#define SATA_HOST_CAP_SAL              0x02000000
+#define SATA_HOST_CAP_SCLO             0x01000000
+#define SATA_HOST_CAP_ISS_MASK         0x00f00000
+#define SATA_HOST_CAP_ISS_OFFSET       20
+#define SATA_HOST_CAP_SNZO             0x00080000
+#define SATA_HOST_CAP_SAM              0x00040000
+#define SATA_HOST_CAP_SPM              0x00020000
+#define SATA_HOST_CAP_PMD              0x00008000
+#define SATA_HOST_CAP_SSC              0x00004000
+#define SATA_HOST_CAP_PSC              0x00002000
+#define SATA_HOST_CAP_NCS              0x00001f00
+#define SATA_HOST_CAP_CCCS             0x00000080
+#define SATA_HOST_CAP_EMS              0x00000040
+#define SATA_HOST_CAP_SXS              0x00000020
+#define SATA_HOST_CAP_NP_MASK          0x0000001f
+
+/* Global HBA Control Register */
+#define SATA_HOST_GHC_AE       0x80000000
+#define SATA_HOST_GHC_IE       0x00000002
+#define SATA_HOST_GHC_HR       0x00000001
+
+/* Interrupt Status Register */
+
+/* Ports Implemented Register */
+
+/* AHCI Version Register */
+#define SATA_HOST_VS_MJR_MASK  0xffff0000
+#define SATA_HOST_VS_MJR_OFFSET        16
+#define SATA_HOST_VS_MJR_MNR   0x0000ffff
+
+/* Command Completion Coalescing Control */
+#define SATA_HOST_CCC_CTL_TV_MASK      0xffff0000
+#define SATA_HOST_CCC_CTL_TV_OFFSET            16
+#define SATA_HOST_CCC_CTL_CC_MASK      0x0000ff00
+#define SATA_HOST_CCC_CTL_CC_OFFSET            8
+#define SATA_HOST_CCC_CTL_INT_MASK     0x000000f8
+#define SATA_HOST_CCC_CTL_INT_OFFSET   3
+#define SATA_HOST_CCC_CTL_EN   0x00000001
+
+/* Command Completion Coalescing Ports */
+
+/* HBA Capabilities Extended Register */
+#define SATA_HOST_CAP2_APST            0x00000004
+
+/* BIST Activate FIS Register */
+#define SATA_HOST_BISTAFR_NCP_MASK     0x0000ff00
+#define SATA_HOST_BISTAFR_NCP_OFFSET   8
+#define SATA_HOST_BISTAFR_PD_MASK      0x000000ff
+#define SATA_HOST_BISTAFR_PD_OFFSET            0
+
+/* BIST Control Register */
+#define SATA_HOST_BISTCR_FERLB 0x00100000
+#define SATA_HOST_BISTCR_TXO   0x00040000
+#define SATA_HOST_BISTCR_CNTCLR        0x00020000
+#define SATA_HOST_BISTCR_NEALB 0x00010000
+#define SATA_HOST_BISTCR_LLC_MASK      0x00000700
+#define SATA_HOST_BISTCR_LLC_OFFSET    8
+#define SATA_HOST_BISTCR_ERREN 0x00000040
+#define SATA_HOST_BISTCR_FLIP  0x00000020
+#define SATA_HOST_BISTCR_PV            0x00000010
+#define SATA_HOST_BISTCR_PATTERN_MASK  0x0000000f
+#define SATA_HOST_BISTCR_PATTERN_OFFSET        0
+
+/* BIST FIS Count Register */
+
+/* BIST Status Register */
+#define SATA_HOST_BISTSR_FRAMERR_MASK  0x0000ffff
+#define SATA_HOST_BISTSR_FRAMERR_OFFSET        0
+#define SATA_HOST_BISTSR_BRSTERR_MASK  0x00ff0000
+#define SATA_HOST_BISTSR_BRSTERR_OFFSET        16
+
+/* BIST DWORD Error Count Register */
+
+/* OOB Register*/
+#define SATA_HOST_OOBR_WE              0x80000000
+#define SATA_HOST_OOBR_cwMin_MASK      0x7f000000
+#define SATA_HOST_OOBR_cwMAX_MASK      0x00ff0000
+#define SATA_HOST_OOBR_ciMin_MASK      0x0000ff00
+#define SATA_HOST_OOBR_ciMax_MASK      0x000000ff
+
+/* Timer 1-ms Register */
+
+/* Global Parameter 1 Register */
+#define SATA_HOST_GPARAM1R_ALIGN_M     0x80000000
+#define SATA_HOST_GPARAM1R_RX_BUFFER   0x40000000
+#define SATA_HOST_GPARAM1R_PHY_DATA_MASK       0x30000000
+#define SATA_HOST_GPARAM1R_PHY_RST     0x08000000
+#define SATA_HOST_GPARAM1R_PHY_CTRL_MASK       0x07e00000
+#define SATA_HOST_GPARAM1R_PHY_STAT_MASK       0x001f8000
+#define SATA_HOST_GPARAM1R_LATCH_M     0x00004000
+#define SATA_HOST_GPARAM1R_BIST_M      0x00002000
+#define SATA_HOST_GPARAM1R_PHY_TYPE    0x00001000
+#define SATA_HOST_GPARAM1R_RETURN_ERR  0x00000400
+#define SATA_HOST_GPARAM1R_AHB_ENDIAN_MASK     0x00000300
+#define SATA_HOST_GPARAM1R_S_HADDR     0X00000080
+#define SATA_HOST_GPARAM1R_M_HADDR     0X00000040
+
+/* Global Parameter 2 Register */
+#define SATA_HOST_GPARAM2R_DEV_CP      0x00004000
+#define SATA_HOST_GPARAM2R_DEV_MP      0x00002000
+#define SATA_HOST_GPARAM2R_DEV_ENCODE_M        0x00001000
+#define SATA_HOST_GPARAM2R_RXOOB_CLK_M 0x00000800
+#define SATA_HOST_GPARAM2R_RXOOB_M     0x00000400
+#define SATA_HOST_GPARAM2R_TX_OOB_M    0x00000200
+#define SATA_HOST_GPARAM2R_RXOOB_CLK_MASK      0x000001ff
+
+/* Port Parameter Register */
+#define SATA_HOST_PPARAMR_TX_MEM_M     0x00000200
+#define SATA_HOST_PPARAMR_TX_MEM_S     0x00000100
+#define SATA_HOST_PPARAMR_RX_MEM_M     0x00000080
+#define SATA_HOST_PPARAMR_RX_MEM_S     0x00000040
+#define SATA_HOST_PPARAMR_TXFIFO_DEPTH_MASK    0x00000038
+#define SATA_HOST_PPARAMR_RXFIFO_DEPTH_MASK    0x00000007
+
+/* Test Register */
+#define SATA_HOST_TESTR_PSEL_MASK      0x00070000
+#define SATA_HOST_TESTR_TEST_IF                0x00000001
+
+/* Port Register Descriptions */
+/* Port# Command List Base Address Register */
+#define SATA_PORT_CLB_CLB_MASK         0xfffffc00
+
+/* Port# Command List Base Address Upper 32-Bits Register */
+
+/* Port# FIS Base Address Register */
+#define SATA_PORT_FB_FB_MASK           0xfffffff0
+
+/* Port# FIS Base Address Upper 32-Bits Register */
+
+/* Port# Interrupt Status Register */
+#define SATA_PORT_IS_CPDS              0x80000000
+#define SATA_PORT_IS_TFES              0x40000000
+#define SATA_PORT_IS_HBFS              0x20000000
+#define SATA_PORT_IS_HBDS              0x10000000
+#define SATA_PORT_IS_IFS               0x08000000
+#define SATA_PORT_IS_INFS              0x04000000
+#define SATA_PORT_IS_OFS               0x01000000
+#define SATA_PORT_IS_IPMS              0x00800000
+#define SATA_PORT_IS_PRCS              0x00400000
+#define SATA_PORT_IS_DMPS              0x00000080
+#define SATA_PORT_IS_PCS               0x00000040
+#define SATA_PORT_IS_DPS               0x00000020
+#define SATA_PORT_IS_UFS               0x00000010
+#define SATA_PORT_IS_SDBS              0x00000008
+#define SATA_PORT_IS_DSS               0x00000004
+#define SATA_PORT_IS_PSS               0x00000002
+#define SATA_PORT_IS_DHRS              0x00000001
+
+/* Port# Interrupt Enable Register */
+#define SATA_PORT_IE_CPDE              0x80000000
+#define SATA_PORT_IE_TFEE              0x40000000
+#define SATA_PORT_IE_HBFE              0x20000000
+#define SATA_PORT_IE_HBDE              0x10000000
+#define SATA_PORT_IE_IFE               0x08000000
+#define SATA_PORT_IE_INFE              0x04000000
+#define SATA_PORT_IE_OFE               0x01000000
+#define SATA_PORT_IE_IPME              0x00800000
+#define SATA_PORT_IE_PRCE              0x00400000
+#define SATA_PORT_IE_DMPE              0x00000080
+#define SATA_PORT_IE_PCE               0x00000040
+#define SATA_PORT_IE_DPE               0x00000020
+#define SATA_PORT_IE_UFE               0x00000010
+#define SATA_PORT_IE_SDBE              0x00000008
+#define SATA_PORT_IE_DSE               0x00000004
+#define SATA_PORT_IE_PSE               0x00000002
+#define SATA_PORT_IE_DHRE              0x00000001
+
+/* Port# Command Register */
+#define SATA_PORT_CMD_ICC_MASK         0xf0000000
+#define SATA_PORT_CMD_ASP              0x08000000
+#define SATA_PORT_CMD_ALPE             0x04000000
+#define SATA_PORT_CMD_DLAE             0x02000000
+#define SATA_PORT_CMD_ATAPI            0x01000000
+#define SATA_PORT_CMD_APSTE            0x00800000
+#define SATA_PORT_CMD_ESP              0x00200000
+#define SATA_PORT_CMD_CPD              0x00100000
+#define SATA_PORT_CMD_MPSP             0x00080000
+#define SATA_PORT_CMD_HPCP             0x00040000
+#define SATA_PORT_CMD_PMA              0x00020000
+#define SATA_PORT_CMD_CPS              0x00010000
+#define SATA_PORT_CMD_CR               0x00008000
+#define SATA_PORT_CMD_FR               0x00004000
+#define SATA_PORT_CMD_MPSS             0x00002000
+#define SATA_PORT_CMD_CCS_MASK         0x00001f00
+#define SATA_PORT_CMD_FRE              0x00000010
+#define SATA_PORT_CMD_CLO              0x00000008
+#define SATA_PORT_CMD_POD              0x00000004
+#define SATA_PORT_CMD_SUD              0x00000002
+#define SATA_PORT_CMD_ST               0x00000001
+
+/* Port# Task File Data Register */
+#define SATA_PORT_TFD_ERR_MASK         0x0000ff00
+#define SATA_PORT_TFD_STS_MASK         0x000000ff
+#define SATA_PORT_TFD_STS_ERR          0x00000001
+#define SATA_PORT_TFD_STS_DRQ          0x00000008
+#define SATA_PORT_TFD_STS_BSY          0x00000080
+
+/* Port# Signature Register */
+
+/* Port# Serial ATA Status {SStatus} Register */
+#define SATA_PORT_SSTS_IPM_MASK                0x00000f00
+#define SATA_PORT_SSTS_SPD_MASK                0x000000f0
+#define SATA_PORT_SSTS_DET_MASK                0x0000000f
+
+/* Port# Serial ATA Control {SControl} Register */
+#define SATA_PORT_SCTL_IPM_MASK                0x00000f00
+#define SATA_PORT_SCTL_SPD_MASK                0x000000f0
+#define SATA_PORT_SCTL_DET_MASK                0x0000000f
+
+/* Port# Serial ATA Error {SError} Register */
+#define SATA_PORT_SERR_DIAG_X          0x04000000
+#define SATA_PORT_SERR_DIAG_F          0x02000000
+#define SATA_PORT_SERR_DIAG_T          0x01000000
+#define SATA_PORT_SERR_DIAG_S          0x00800000
+#define SATA_PORT_SERR_DIAG_H          0x00400000
+#define SATA_PORT_SERR_DIAG_C          0x00200000
+#define SATA_PORT_SERR_DIAG_D          0x00100000
+#define SATA_PORT_SERR_DIAG_B          0x00080000
+#define SATA_PORT_SERR_DIAG_W          0x00040000
+#define SATA_PORT_SERR_DIAG_I          0x00020000
+#define SATA_PORT_SERR_DIAG_N          0x00010000
+#define SATA_PORT_SERR_ERR_E           0x00000800
+#define SATA_PORT_SERR_ERR_P           0x00000400
+#define SATA_PORT_SERR_ERR_C           0x00000200
+#define SATA_PORT_SERR_ERR_T           0x00000100
+#define SATA_PORT_SERR_ERR_M           0x00000002
+#define SATA_PORT_SERR_ERR_I           0x00000001
+
+/* Port# Serial ATA Active {SActive} Register */
+
+/* Port# Command Issue Register */
+
+/* Port# Serial ATA Notification Register */
+
+/* Port# DMA Control Register */
+#define SATA_PORT_DMACR_RXABL_MASK     0x0000f000
+#define SATA_PORT_DMACR_TXABL_MASK     0x00000f00
+#define SATA_PORT_DMACR_RXTS_MASK      0x000000f0
+#define SATA_PORT_DMACR_TXTS_MASK      0x0000000f
+
+/* Port# PHY Control Register */
+
+/* Port# PHY Status Register */
+
+#define SATA_HC_CMD_HDR_ENTRY_SIZE     sizeof(struct cmd_hdr_entry)
+
+/* DW0
+*/
+#define CMD_HDR_DI_CFL_MASK    0x0000001f
+#define CMD_HDR_DI_CFL_OFFSET  0
+#define CMD_HDR_DI_A                   0x00000020
+#define CMD_HDR_DI_W                   0x00000040
+#define CMD_HDR_DI_P                   0x00000080
+#define CMD_HDR_DI_R                   0x00000100
+#define CMD_HDR_DI_B                   0x00000200
+#define CMD_HDR_DI_C                   0x00000400
+#define CMD_HDR_DI_PMP_MASK    0x0000f000
+#define CMD_HDR_DI_PMP_OFFSET  12
+#define CMD_HDR_DI_PRDTL               0xffff0000
+#define CMD_HDR_DI_PRDTL_OFFSET        16
+
+/* prde_fis_len
+*/
+#define CMD_HDR_PRD_ENTRY_SHIFT        16
+#define CMD_HDR_PRD_ENTRY_MASK 0x003f0000
+#define CMD_HDR_FIS_LEN_SHIFT  2
+
+/* attribute
+*/
+#define CMD_HDR_ATTR_RES       0x00000800 /* Reserved bit, should be 1 */
+#define CMD_HDR_ATTR_VBIST     0x00000400 /* Vendor BIST */
+/* Snoop enable for all descriptor */
+#define CMD_HDR_ATTR_SNOOP     0x00000200
+#define CMD_HDR_ATTR_FPDMA     0x00000100 /* FPDMA queued command */
+#define CMD_HDR_ATTR_RESET     0x00000080 /* Reset - a SRST or device reset */
+/* BIST - require the host to enter BIST mode */
+#define CMD_HDR_ATTR_BIST      0x00000040
+#define CMD_HDR_ATTR_ATAPI     0x00000020 /* ATAPI command */
+#define CMD_HDR_ATTR_TAG       0x0000001f /* TAG mask */
+
+#define FLAGS_DMA      0x00000000
+#define FLAGS_FPDMA    0x00000001
+
+#define SATA_FLAG_Q_DEP_MASK   0x0000000f
+#define SATA_FLAG_WCACHE       0x00000100
+#define SATA_FLAG_FLUSH                0x00000200
+#define SATA_FLAG_FLUSH_EXT    0x00000400
+
+#define READ_CMD       0
+#define WRITE_CMD      1
+
+extern block_dev_desc_t sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
+
+#endif /* __FSL_SATA_H__ */
index f1b1c16b1b9356409f57b2295742cb91d8f24022..661553552e6875d40cad956a82bcef9ac7057b57 100644 (file)
@@ -41,7 +41,8 @@ static unsigned long gpio_ports[] = {
        [0] = GPIO1_BASE_ADDR,
        [1] = GPIO2_BASE_ADDR,
        [2] = GPIO3_BASE_ADDR,
-#if defined(CONFIG_MX51) || defined(CONFIG_MX53) || defined(CONFIG_MX6Q)
+#if defined(CONFIG_MX25) || defined(CONFIG_MX51) || defined(CONFIG_MX53) || \
+               defined(CONFIG_MX6Q)
        [3] = GPIO4_BASE_ADDR,
 #endif
 #if defined(CONFIG_MX53) || defined(CONFIG_MX6Q)
index 21f689726920b131397615e791a873caaf84334a..5b6ea0e7599a28107413f045ade27475287f7dfb 100644 (file)
@@ -567,3 +567,17 @@ int i2c_set_bus_num(unsigned int bus)
        return 0;
 }
 #endif
+
+int tegra_i2c_get_dvc_bus_num(void)
+{
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_I2C_BUS; i++) {
+               struct i2c_bus *bus = &i2c_controllers[i];
+
+               if (bus->inited && bus->is_dvc)
+                       return i;
+       }
+
+       return -1;
+}
index 1f4dad35b53dcd26892e5586d62781dc17fb0541..5c831b26116b72af3510490bc03b1441574bffa4 100644 (file)
@@ -26,10 +26,13 @@ include $(TOPDIR)/config.mk
 LIB    := $(obj)libinput.o
 
 COBJS-$(CONFIG_I8042_KBD) += i8042.o
+COBJS-$(CONFIG_TEGRA2_KEYBOARD) += tegra-kbc.o
 ifdef CONFIG_PS2KBD
 COBJS-y += keyboard.o pc_keyb.o
 COBJS-$(CONFIG_PS2MULT) += ps2mult.o ps2ser.o
 endif
+COBJS-y += input.o
+COBJS-$(CONFIG_OF_CONTROL) += key_matrix.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
diff --git a/drivers/input/input.c b/drivers/input/input.c
new file mode 100644 (file)
index 0000000..4eadd77
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * Translate key codes into ASCII
+ *
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2004 DENX Software Engineering, Wolfgang Denk, wd@denx.de
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <stdio_dev.h>
+#include <input.h>
+#include <linux/input.h>
+
+enum {
+       /* These correspond to the lights on the keyboard */
+       FLAG_NUM_LOCK           = 1 << 0,
+       FLAG_CAPS_LOCK          = 1 << 1,
+       FLAG_SCROLL_LOCK        = 1 << 2,
+
+       /* Special flag ORed with key code to indicate release */
+       KEY_RELEASE             = 1 << 15,
+       KEY_MASK                = 0xfff,
+};
+
+/*
+ * These takes map key codes to ASCII. 0xff means no key, or special key.
+ * Three tables are provided - one for plain keys, one for when the shift
+ * 'modifier' key is pressed and one for when the ctrl modifier key is
+ * pressed.
+ */
+static const uchar kbd_plain_xlate[] = {
+       0xff, 0x1b, '1',  '2',  '3',  '4',  '5',  '6',
+       '7',  '8',  '9',  '0',  '-',  '=', '\b', '\t',  /* 0x00 - 0x0f */
+       'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',
+       'o',  'p',  '[',  ']', '\r', 0xff,  'a',  's',  /* 0x10 - 0x1f */
+       'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',
+       '\'',  '`', 0xff, '\\', 'z',  'x',  'c',  'v',  /* 0x20 - 0x2f */
+       'b',  'n',  'm',  ',' ,  '.', '/', 0xff, 0xff, 0xff,
+       ' ', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,        /* 0x30 - 0x3f */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  '7',
+       '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',  /* 0x40 - 0x4f */
+       '2',  '3',  '0',  '.', 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50 - 0x5F */
+       '\r', 0xff, 0xff
+};
+
+static unsigned char kbd_shift_xlate[] = {
+       0xff, 0x1b, '!', '@', '#', '$', '%', '^',
+       '&', '*', '(', ')', '_', '+', '\b', '\t',       /* 0x00 - 0x0f */
+       'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
+       'O', 'P', '{', '}', '\r', 0xff, 'A', 'S',       /* 0x10 - 0x1f */
+       'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
+       '"', '~', 0xff, '|', 'Z', 'X', 'C', 'V',        /* 0x20 - 0x2f */
+       'B', 'N', 'M', '<', '>', '?', 0xff, 0xff, 0xff,
+       ' ', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,        /* 0x30 - 0x3f */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, '7',
+       '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */
+       '2', '3', '0', '.', 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,       /* 0x50 - 0x5F */
+       '\r', 0xff, 0xff
+};
+
+static unsigned char kbd_ctrl_xlate[] = {
+       0xff, 0x1b, '1', 0x00, '3', '4', '5', 0x1E,
+       '7', '8', '9', '0', 0x1F, '=', '\b', '\t',      /* 0x00 - 0x0f */
+       0x11, 0x17, 0x05, 0x12, 0x14, 0x18, 0x15, 0x09,
+       0x0f, 0x10, 0x1b, 0x1d, '\n', 0xff, 0x01, 0x13, /* 0x10 - 0x1f */
+       0x04, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, ';',
+       '\'', '~', 0x00, 0x1c, 0x1a, 0x18, 0x03, 0x16,  /* 0x20 - 0x2f */
+       0x02, 0x0e, 0x0d, '<', '>', '?', 0xff, 0xff,
+       0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30 - 0x3f */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, '7',
+       '8', '9', '-', '4', '5', '6', '+', '1',         /* 0x40 - 0x4f */
+       '2', '3', '0', '.', 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50 - 0x5F */
+       '\r', 0xff, 0xff
+};
+
+
+int input_queue_ascii(struct input_config *config, int ch)
+{
+       if (config->fifo_in + 1 == INPUT_BUFFER_LEN) {
+               if (!config->fifo_out)
+                       return -1; /* buffer full */
+               else
+                       config->fifo_in = 0;
+       } else {
+               if (config->fifo_in + 1 == config->fifo_out)
+                       return -1; /* buffer full */
+               config->fifo_in++;
+       }
+       config->fifo[config->fifo_in] = (uchar)ch;
+
+       return 0;
+}
+
+int input_tstc(struct input_config *config)
+{
+       if (config->fifo_in == config->fifo_out && config->read_keys) {
+               if (!(*config->read_keys)(config))
+                       return 0;
+       }
+       return config->fifo_in != config->fifo_out;
+}
+
+int input_getc(struct input_config *config)
+{
+       int err = 0;
+
+       while (config->fifo_in == config->fifo_out) {
+               if (config->read_keys)
+                       err = (*config->read_keys)(config);
+               if (err)
+                       return -1;
+       }
+
+       if (++config->fifo_out == INPUT_BUFFER_LEN)
+               config->fifo_out = 0;
+
+       return config->fifo[config->fifo_out];
+}
+
+/**
+ * Process a modifier/special key press or release and decide which key
+ * translation array should be used as a result.
+ *
+ * TODO: Should keep track of modifier press/release
+ *
+ * @param config       Input state
+ * @param key          Key code to process
+ * @param release      0 if a press, 1 if a release
+ * @return pointer to keycode->ascii translation table that should be used
+ */
+static struct input_key_xlate *process_modifier(struct input_config *config,
+                                               int key, int release)
+{
+       struct input_key_xlate *table;
+       int flip = -1;
+       int i;
+
+       /* Start with the main table, and see what modifiers change it */
+       assert(config->num_tables > 0);
+       table = &config->table[0];
+       for (i = 1; i < config->num_tables; i++) {
+               struct input_key_xlate *tab = &config->table[i];
+
+               if (key == tab->left_keycode || key == tab->right_keycode)
+                       table = tab;
+       }
+
+       /* Handle the lighted keys */
+       if (!release) {
+               switch (key) {
+               case KEY_SCROLLLOCK:
+                       flip = FLAG_SCROLL_LOCK;
+                       break;
+               case KEY_NUMLOCK:
+                       flip = FLAG_NUM_LOCK;
+                       break;
+               case KEY_CAPSLOCK:
+                       flip = FLAG_CAPS_LOCK;
+                       break;
+               }
+       }
+
+       if (flip != -1) {
+               int leds = 0;
+
+               config->leds ^= flip;
+               if (config->flags & FLAG_NUM_LOCK)
+                       leds |= INPUT_LED_NUM;
+               if (config->flags & FLAG_CAPS_LOCK)
+                       leds |= INPUT_LED_CAPS;
+               if (config->flags & FLAG_SCROLL_LOCK)
+                       leds |= INPUT_LED_SCROLL;
+               config->leds = leds;
+       }
+
+       return table;
+}
+
+/**
+ * Search an int array for a key value
+ *
+ * @param array        Array to search
+ * @param count        Number of elements in array
+ * @param key  Key value to find
+ * @return element where value was first found, -1 if none
+ */
+static int array_search(int *array, int count, int key)
+{
+       int i;
+
+       for (i = 0; i < count; i++) {
+               if (array[i] == key)
+                       return i;
+       }
+
+       return -1;
+}
+
+/**
+ * Sort an array so that those elements that exist in the ordering are
+ * first in the array, and in the same order as the ordering. The algorithm
+ * is O(count * ocount) and designed for small arrays.
+ *
+ * TODO: Move this to common / lib?
+ *
+ * @param dest         Array with elements to sort, also destination array
+ * @param count                Number of elements to sort
+ * @param order                Array containing ordering elements
+ * @param ocount       Number of ordering elements
+ * @return number of elements in dest that are in order (these will be at the
+ *     start of dest).
+ */
+static int sort_array_by_ordering(int *dest, int count, int *order,
+                                  int ocount)
+{
+       int temp[count];
+       int dest_count;
+       int same;       /* number of elements which are the same */
+       int i;
+
+       /* setup output items, copy items to be sorted into our temp area */
+       memcpy(temp, dest, count * sizeof(*dest));
+       dest_count = 0;
+
+       /* work through the ordering, move over the elements we agree on */
+       for (i = 0; i < ocount; i++) {
+               if (array_search(temp, count, order[i]) != -1)
+                       dest[dest_count++] = order[i];
+       }
+       same = dest_count;
+
+       /* now move over the elements that are not in the ordering */
+       for (i = 0; i < count; i++) {
+               if (array_search(order, ocount, temp[i]) == -1)
+                       dest[dest_count++] = temp[i];
+       }
+       assert(dest_count == count);
+       return same;
+}
+
+/**
+ * Check a list of key codes against the previous key scan
+ *
+ * Given a list of new key codes, we check how many of these are the same
+ * as last time.
+ *
+ * @param config       Input state
+ * @param keycode      List of key codes to examine
+ * @param num_keycodes Number of key codes
+ * @param same         Returns number of key codes which are the same
+ */
+static int input_check_keycodes(struct input_config *config,
+                          int keycode[], int num_keycodes, int *same)
+{
+       /* Select the 'plain' xlate table to start with */
+       if (!config->num_tables) {
+               debug("%s: No xlate tables: cannot decode keys\n", __func__);
+               return -1;
+       }
+
+       /* sort the keycodes into the same order as the previous ones */
+       *same = sort_array_by_ordering(keycode, num_keycodes,
+                       config->prev_keycodes, config->num_prev_keycodes);
+
+       memcpy(config->prev_keycodes, keycode, num_keycodes * sizeof(int));
+       config->num_prev_keycodes = num_keycodes;
+
+       return *same != num_keycodes;
+}
+
+/**
+ * Convert a list of key codes into ASCII
+ *
+ * You must call input_check_keycodes() before this. It turns the keycode
+ * list into a list of ASCII characters which are ready to send to the
+ * input layer.
+ *
+ * Characters which were seen last time do not generate fresh ASCII output.
+ *
+ * @param config       Input state
+ * @param keycode      List of key codes to examine
+ * @param num_keycodes Number of key codes
+ * @param same         Number of key codes which are the same
+ */
+static int input_keycodes_to_ascii(struct input_config *config,
+               int keycode[], int num_keycodes, char output_ch[], int same)
+{
+       struct input_key_xlate *table;
+       int ch_count;
+       int i;
+
+       table = &config->table[0];
+
+       /* deal with modifiers first */
+       for (i = 0; i < num_keycodes; i++) {
+               int key = keycode[i] & KEY_MASK;
+
+               if (key >= table->num_entries || table->xlate[key] == 0xff) {
+                       table = process_modifier(config, key,
+                                       keycode[i] & KEY_RELEASE);
+               }
+       }
+
+       /* now find normal keys */
+       for (i = ch_count = 0; i < num_keycodes; i++) {
+               int key = keycode[i];
+
+               if (key < table->num_entries && i >= same) {
+                       int ch = table->xlate[key];
+
+                       /* If a normal key with an ASCII value, add it! */
+                       if (ch != 0xff)
+                               output_ch[ch_count++] = (uchar)ch;
+               }
+       }
+
+       /* ok, so return keys */
+       return ch_count;
+}
+
+int input_send_keycodes(struct input_config *config,
+                       int keycode[], int num_keycodes)
+{
+       char ch[num_keycodes];
+       int count, i, same = 0;
+       int is_repeat = 0;
+       unsigned delay_ms;
+
+       config->modifiers = 0;
+       if (!input_check_keycodes(config, keycode, num_keycodes, &same)) {
+               /*
+                * Same as last time - is it time for another repeat?
+                * TODO(sjg@chromium.org) We drop repeats here and since
+                * the caller may not call in again for a while, our
+                * auto-repeat speed is not quite correct. We should
+                * insert another character if we later realise that we
+                * have missed a repeat slot.
+                */
+               is_repeat = (int)get_timer(config->next_repeat_ms) >= 0;
+               if (!is_repeat)
+                       return 0;
+       }
+
+       count = input_keycodes_to_ascii(config, keycode, num_keycodes,
+                                       ch, is_repeat ? 0 : same);
+       for (i = 0; i < count; i++)
+               input_queue_ascii(config, ch[i]);
+       delay_ms = is_repeat ?
+                       config->repeat_rate_ms :
+                       config->repeat_delay_ms;
+
+       config->next_repeat_ms = get_timer(0) + delay_ms;
+       return 0;
+}
+
+int input_add_table(struct input_config *config, int left_keycode,
+                   int right_keycode, const uchar *xlate, int num_entries)
+{
+       struct input_key_xlate *table;
+
+       if (config->num_tables == INPUT_MAX_MODIFIERS) {
+               debug("%s: Too many modifier tables\n", __func__);
+               return -1;
+       }
+
+       table = &config->table[config->num_tables++];
+       table->left_keycode = left_keycode;
+       table->right_keycode = right_keycode;
+       table->xlate = xlate;
+       table->num_entries = num_entries;
+
+       return 0;
+}
+
+int input_init(struct input_config *config, int leds, int repeat_delay_ms,
+              int repeat_rate_ms)
+{
+       memset(config, '\0', sizeof(*config));
+       config->leds = leds;
+       config->repeat_delay_ms = repeat_delay_ms;
+       config->repeat_rate_ms = repeat_rate_ms;
+       if (input_add_table(config, -1, -1,
+                       kbd_plain_xlate, ARRAY_SIZE(kbd_plain_xlate)) ||
+               input_add_table(config, KEY_LEFTSHIFT, KEY_RIGHTSHIFT,
+                       kbd_shift_xlate, ARRAY_SIZE(kbd_shift_xlate)) ||
+               input_add_table(config, KEY_LEFTCTRL, KEY_RIGHTCTRL,
+                       kbd_ctrl_xlate, ARRAY_SIZE(kbd_ctrl_xlate))) {
+               debug("%s: Could not add modifier tables\n", __func__);
+               return -1;
+       }
+
+       return 0;
+}
+
+int input_stdio_register(struct stdio_dev *dev)
+{
+       int error;
+
+       error = stdio_register(dev);
+
+       /* check if this is the standard input device */
+       if (!error && strcmp(getenv("stdin"), dev->name) == 0) {
+               /* reassign the console */
+               if (OVERWRITE_CONSOLE ||
+                               console_assign(stdin, dev->name))
+                       return -1;
+       }
+
+       return 0;
+}
diff --git a/drivers/input/key_matrix.c b/drivers/input/key_matrix.c
new file mode 100644 (file)
index 0000000..84b898f
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Manage Keyboard Matrices
+ *
+ * Copyright (c) 2012 The Chromium OS Authors.
+ * (C) Copyright 2004 DENX Software Engineering, Wolfgang Denk, wd@denx.de
+ *
+ * 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
+ */
+
+#include <fdtdec.h>
+#include <key_matrix.h>
+#include <malloc.h>
+#include <linux/input.h>
+
+/**
+ * Determine if the current keypress configuration can cause key ghosting
+ *
+ * We figure this out by seeing if we have two or more keys in the same
+ * column, as well as two or more keys in the same row.
+ *
+ * @param config       Keyboard matrix config
+ * @param keys         List of keys to check
+ * @param valid                Number of valid keypresses to check
+ * @return 0 if no ghosting is possible, 1 if it is
+ */
+static int has_ghosting(struct key_matrix *config, struct key_matrix_key *keys,
+                       int valid)
+{
+       int key_in_same_col = 0, key_in_same_row = 0;
+       int i, j;
+
+       for (i = 0; i < valid; i++) {
+               /*
+                * Find 2 keys such that one key is in the same row
+                * and the other is in the same column as the i-th key.
+                */
+               for (j = i + 1; j < valid; j++) {
+                       if (keys[j].col == keys[i].col)
+                               key_in_same_col = 1;
+                       if (keys[j].row == keys[i].row)
+                               key_in_same_row = 1;
+               }
+       }
+
+       if (key_in_same_col && key_in_same_row)
+               return 1;
+       else
+               return 0;
+}
+
+int key_matrix_decode(struct key_matrix *config, struct key_matrix_key keys[],
+                     int num_keys, int keycode[], int max_keycodes)
+{
+       const u8 *keymap;
+       int valid, upto;
+       int pos;
+
+       debug("%s: num_keys = %d\n", __func__, num_keys);
+       keymap = config->plain_keycode;
+       for (valid = upto = 0; upto < num_keys; upto++) {
+               struct key_matrix_key *key = &keys[upto];
+
+               debug("  valid=%d, row=%d, col=%d\n", key->valid, key->row,
+                     key->col);
+               if (!key->valid)
+                       continue;
+               pos = key->row * config->num_cols + key->col;
+               if (config->fn_keycode && pos == config->fn_pos)
+                       keymap = config->fn_keycode;
+
+               /* Convert the (row, col) values into a keycode */
+               if (valid < max_keycodes)
+                       keycode[valid++] = keymap[pos];
+               debug("    keycode=%d\n", keymap[pos]);
+       }
+
+       /* For a ghost key config, ignore the keypresses for this iteration. */
+       if (valid >= 3 && has_ghosting(config, keys, valid)) {
+               valid = 0;
+               debug("    ghosting detected!\n");
+       }
+       debug("  %d valid keycodes found\n", valid);
+
+       return valid;
+}
+
+/**
+ * Create a new keycode map from some provided data
+ *
+ * This decodes a keycode map in the format used by the fdt, which is one
+ * word per entry, with the row, col and keycode encoded in that word.
+ *
+ * We create a (row x col) size byte array with each entry containing the
+ * keycode for that (row, col). We also search for map_keycode and return
+ * its position if found (this is used for finding the Fn key).
+ *
+ * @param config        Key matrix dimensions structure
+ * @param data          Keycode data
+ * @param len           Number of entries in keycode table
+ * @param map_keycode   Key code to find in the map
+ * @param pos           Returns position of map_keycode, if found, else -1
+ * @return map  Pointer to allocated map
+ */
+static uchar *create_keymap(struct key_matrix *config, u32 *data, int len,
+                           int map_keycode, int *pos)
+{
+       uchar *map;
+
+       if (pos)
+               *pos = -1;
+       map = (uchar *)calloc(1, config->key_count);
+       if (!map) {
+               debug("%s: failed to malloc %d bytes\n", __func__,
+                       config->key_count);
+               return NULL;
+       }
+
+       for (; len >= sizeof(u32); data++, len -= 4) {
+               u32 tmp = fdt32_to_cpu(*data);
+               int key_code, row, col;
+               int entry;
+
+               row = (tmp >> 24) & 0xff;
+               col = (tmp >> 16) & 0xff;
+               key_code = tmp & 0xffff;
+               entry = row * config->num_cols + col;
+               map[entry] = key_code;
+               if (pos && map_keycode == key_code)
+                       *pos = entry;
+       }
+
+       return map;
+}
+
+int key_matrix_decode_fdt(struct key_matrix *config, const void *blob,
+                         int node)
+{
+       const struct fdt_property *prop;
+       int offset;
+
+       /* Check each property name for ones that we understand */
+       for (offset = fdt_first_property_offset(blob, node);
+                     offset > 0;
+                     offset = fdt_next_property_offset(blob, offset)) {
+               const char *name;
+               int len;
+
+               prop = fdt_get_property_by_offset(blob, offset, NULL);
+               name = fdt_string(blob, fdt32_to_cpu(prop->nameoff));
+               len = strlen(name);
+
+               /* Name needs to match "1,<type>keymap" */
+               debug("%s: property '%s'\n", __func__, name);
+               if (strncmp(name, "1,", 2) || len < 8 ||
+                   strcmp(name + len - 6, "keymap"))
+                       continue;
+
+               len -= 8;
+               if (len == 0) {
+                       config->plain_keycode = create_keymap(config,
+                               (u32 *)prop->data, fdt32_to_cpu(prop->len),
+                               KEY_FN, &config->fn_pos);
+               } else if (0 == strncmp(name + 2, "fn-", len)) {
+                       config->fn_keycode = create_keymap(config,
+                               (u32 *)prop->data, fdt32_to_cpu(prop->len),
+                               -1, NULL);
+               } else {
+                       debug("%s: unrecognised property '%s'\n", __func__,
+                             name);
+               }
+       }
+       debug("%s: Decoded key maps %p, %p from fdt\n", __func__,
+             config->plain_keycode, config->fn_keycode);
+
+       if (!config->plain_keycode) {
+               debug("%s: cannot find keycode-plain map\n", __func__);
+               return -1;
+       }
+
+       return 0;
+}
+
+int key_matrix_init(struct key_matrix *config, int rows, int cols)
+{
+       memset(config, '\0', sizeof(*config));
+       config->num_rows = rows;
+       config->num_cols = cols;
+       config->key_count = rows * cols;
+       assert(config->key_count > 0);
+
+       return 0;
+}
diff --git a/drivers/input/tegra-kbc.c b/drivers/input/tegra-kbc.c
new file mode 100644 (file)
index 0000000..f164791
--- /dev/null
@@ -0,0 +1,375 @@
+/*
+ *  (C) Copyright 2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <input.h>
+#include <key_matrix.h>
+#include <stdio_dev.h>
+#include <tegra-kbc.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/funcmux.h>
+#include <asm/arch/timer.h>
+#include <linux/input.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum {
+       KBC_MAX_GPIO            = 24,
+       KBC_MAX_KPENT           = 8,    /* size of keypress entry queue */
+};
+
+#define KBC_FIFO_TH_CNT_SHIFT          14
+#define KBC_DEBOUNCE_CNT_SHIFT         4
+#define KBC_CONTROL_FIFO_CNT_INT_EN    (1 << 3)
+#define KBC_CONTROL_KBC_EN             (1 << 0)
+#define KBC_INT_FIFO_CNT_INT_STATUS    (1 << 2)
+#define KBC_KPENT_VALID                        (1 << 7)
+#define KBC_ST_STATUS                  (1 << 3)
+
+enum {
+       KBC_DEBOUNCE_COUNT      = 2,
+       KBC_REPEAT_RATE_MS      = 30,
+       KBC_REPEAT_DELAY_MS     = 240,
+       KBC_CLOCK_KHZ           = 32,   /* Keyboard uses a 32KHz clock */
+};
+
+/* keyboard controller config and state */
+static struct keyb {
+       struct input_config input;      /* The input layer */
+       struct key_matrix matrix;       /* The key matrix layer */
+
+       struct kbc_tegra *kbc;          /* tegra keyboard controller */
+       unsigned char inited;           /* 1 if keyboard has been inited */
+       unsigned char first_scan;       /* 1 if this is our first key scan */
+
+       /*
+        * After init we must wait a short time before polling the keyboard.
+        * This gives the tegra keyboard controller time to react after reset
+        * and lets us grab keys pressed during reset.
+        */
+       unsigned int init_dly_ms;       /* Delay before we can read keyboard */
+       unsigned int start_time_ms;     /* Time that we inited (in ms) */
+       unsigned int last_poll_ms;      /* Time we should last polled */
+       unsigned int next_repeat_ms;    /* Next time we repeat a key */
+} config;
+
+/**
+ * reads the keyboard fifo for current keypresses
+ *
+ * @param config       Keyboard config
+ * @param fifo         Place to put fifo results
+ * @param max_keycodes Maximum number of key codes to put in the fifo
+ * @return number of items put into fifo
+ */
+static int tegra_kbc_find_keys(struct keyb *config, int *fifo,
+                              int max_keycodes)
+{
+       struct key_matrix_key keys[KBC_MAX_KPENT], *key;
+       u32 kp_ent = 0;
+       int i;
+
+       for (key = keys, i = 0; i < KBC_MAX_KPENT; i++, key++) {
+               /* Get next word */
+               if (!(i & 3))
+                       kp_ent = readl(&config->kbc->kp_ent[i / 4]);
+
+               key->valid = (kp_ent & KBC_KPENT_VALID) != 0;
+               key->row = (kp_ent >> 3) & 0xf;
+               key->col = kp_ent & 0x7;
+
+               /* Shift to get next entry */
+               kp_ent >>= 8;
+       }
+       return key_matrix_decode(&config->matrix, keys, KBC_MAX_KPENT, fifo,
+                                max_keycodes);
+}
+
+/**
+ * Process all the keypress sequences in fifo and send key codes
+ *
+ * The fifo contains zero or more keypress sets. Each set
+ * consists of from 1-8 keycodes, representing the keycodes which
+ * were simultaneously pressed during that scan.
+ *
+ * This function works through each set and generates ASCII characters
+ * for each. Not that one set may produce more than one ASCII characters -
+ * for example holding down 'd' and 'f' at the same time will generate
+ * two ASCII characters.
+ *
+ * Note: if fifo_cnt is 0, we will tell the input layer that no keys are
+ * pressed.
+ *
+ * @param config       Keyboard config
+ * @param fifo_cnt     Number of entries in the keyboard fifo
+ */
+static void process_fifo(struct keyb *config, int fifo_cnt)
+{
+       int fifo[KBC_MAX_KPENT];
+       int cnt = 0;
+
+       /* Always call input_send_keycodes() at least once */
+       do {
+               if (fifo_cnt)
+                       cnt = tegra_kbc_find_keys(config, fifo, KBC_MAX_KPENT);
+
+               input_send_keycodes(&config->input, fifo, cnt);
+       } while (--fifo_cnt > 0);
+}
+
+/**
+ * Check the keyboard controller and emit ASCII characters for any keys that
+ * are pressed.
+ *
+ * @param config       Keyboard config
+ */
+static void check_for_keys(struct keyb *config)
+{
+       int fifo_cnt;
+
+       if (!config->first_scan &&
+                       get_timer(config->last_poll_ms) < KBC_REPEAT_RATE_MS)
+               return;
+       config->last_poll_ms = get_timer(0);
+       config->first_scan = 0;
+
+       /*
+        * Once we get here we know the keyboard has been scanned. So if there
+        * scan waiting for us, we know that nothing is held down.
+        */
+       fifo_cnt = (readl(&config->kbc->interrupt) >> 4) & 0xf;
+       process_fifo(config, fifo_cnt);
+}
+
+/**
+ * In order to detect keys pressed on boot, wait for the hardware to
+ * complete scanning the keys. This includes time to transition from
+ * Wkup mode to Continous polling mode and the repoll time. We can
+ * deduct the time that's already elapsed.
+ *
+ * @param config       Keyboard config
+ */
+static void kbd_wait_for_fifo_init(struct keyb *config)
+{
+       if (!config->inited) {
+               unsigned long elapsed_time;
+               long delay_ms;
+
+               elapsed_time = get_timer(config->start_time_ms);
+               delay_ms = config->init_dly_ms - elapsed_time;
+               if (delay_ms > 0) {
+                       udelay(delay_ms * 1000);
+                       debug("%s: delay %ldms\n", __func__, delay_ms);
+               }
+
+               config->inited = 1;
+       }
+}
+
+/**
+ * Check the tegra keyboard, and send any keys that are pressed.
+ *
+ * This is called by input_tstc() and input_getc() when they need more
+ * characters
+ *
+ * @param input                Input configuration
+ * @return 1, to indicate that we have something to look at
+ */
+int tegra_kbc_check(struct input_config *input)
+{
+       kbd_wait_for_fifo_init(&config);
+       check_for_keys(&config);
+
+       return 1;
+}
+
+/**
+ * Test if keys are available to be read
+ *
+ * @return 0 if no keys available, 1 if keys are available
+ */
+static int kbd_tstc(void)
+{
+       /* Just get input to do this for us */
+       return input_tstc(&config.input);
+}
+
+/**
+ * Read a key
+ *
+ * TODO: U-Boot wants 0 for no key, but Ctrl-@ is a valid key...
+ *
+ * @return ASCII key code, or 0 if no key, or -1 if error
+ */
+static int kbd_getc(void)
+{
+       /* Just get input to do this for us */
+       return input_getc(&config.input);
+}
+
+/* configures keyboard GPIO registers to use the rows and columns */
+static void config_kbc_gpio(struct kbc_tegra *kbc)
+{
+       int i;
+
+       for (i = 0; i < KBC_MAX_GPIO; i++) {
+               u32 row_cfg, col_cfg;
+               u32 r_shift = 5 * (i % 6);
+               u32 c_shift = 4 * (i % 8);
+               u32 r_mask = 0x1f << r_shift;
+               u32 c_mask = 0xf << c_shift;
+               u32 r_offs = i / 6;
+               u32 c_offs = i / 8;
+
+               row_cfg = readl(&kbc->row_cfg[r_offs]);
+               col_cfg = readl(&kbc->col_cfg[c_offs]);
+
+               row_cfg &= ~r_mask;
+               col_cfg &= ~c_mask;
+
+               if (i < config.matrix.num_rows) {
+                       row_cfg |= ((i << 1) | 1) << r_shift;
+               } else {
+                       col_cfg |= (((i - config.matrix.num_rows) << 1) | 1)
+                                       << c_shift;
+               }
+
+               writel(row_cfg, &kbc->row_cfg[r_offs]);
+               writel(col_cfg, &kbc->col_cfg[c_offs]);
+       }
+}
+
+/**
+ * Start up the keyboard device
+ */
+static void tegra_kbc_open(void)
+{
+       struct kbc_tegra *kbc = config.kbc;
+       unsigned int scan_period;
+       u32 val;
+
+       /*
+        * We will scan at twice the keyboard repeat rate, so that there is
+        * always a scan ready when we check it in check_for_keys().
+        */
+       scan_period = KBC_REPEAT_RATE_MS / 2;
+       writel(scan_period * KBC_CLOCK_KHZ, &kbc->rpt_dly);
+       writel(scan_period * KBC_CLOCK_KHZ, &kbc->init_dly);
+       /*
+        * Before reading from the keyboard we must wait for the init_dly
+        * plus the rpt_delay, plus 2ms for the row scan time.
+        */
+       config.init_dly_ms = scan_period * 2 + 2;
+
+       val = KBC_DEBOUNCE_COUNT << KBC_DEBOUNCE_CNT_SHIFT;
+       val |= 1 << KBC_FIFO_TH_CNT_SHIFT;      /* fifo interrupt threshold */
+       val |= KBC_CONTROL_KBC_EN;              /* enable */
+       writel(val, &kbc->control);
+
+       config.start_time_ms = get_timer(0);
+       config.last_poll_ms = config.next_repeat_ms = get_timer(0);
+       config.first_scan = 1;
+}
+
+/**
+ * Set up the tegra keyboard. This is called by the stdio device handler
+ *
+ * We want to do this init when the keyboard is actually used rather than
+ * at start-up, since keyboard input may not currently be selected.
+ *
+ * Once the keyboard starts there will be a period during which we must
+ * wait for the keyboard to init. We do this only when a key is first
+ * read - see kbd_wait_for_fifo_init().
+ *
+ * @return 0 if ok, -ve on error
+ */
+static int init_tegra_keyboard(void)
+{
+#ifdef CONFIG_OF_CONTROL
+       int     node;
+
+       node = fdtdec_next_compatible(gd->fdt_blob, 0,
+                                         COMPAT_NVIDIA_TEGRA20_KBC);
+       if (node < 0) {
+               debug("%s: cannot locate keyboard node\n", __func__);
+               return node;
+       }
+       config.kbc = (struct kbc_tegra *)fdtdec_get_addr(gd->fdt_blob,
+                      node, "reg");
+       if ((fdt_addr_t)config.kbc == FDT_ADDR_T_NONE) {
+               debug("%s: No keyboard register found\n", __func__);
+               return -1;
+       }
+
+       /* Decode the keyboard matrix information (16 rows, 8 columns) */
+       if (key_matrix_init(&config.matrix, 16, 8)) {
+               debug("%s: Could not init key matrix\n", __func__);
+               return -1;
+       }
+       if (key_matrix_decode_fdt(&config.matrix, gd->fdt_blob, node)) {
+               debug("%s: Could not decode key matrix from fdt\n", __func__);
+               return -1;
+       }
+       if (config.matrix.fn_keycode) {
+               if (input_add_table(&config.input, KEY_FN, -1,
+                                   config.matrix.fn_keycode,
+                                   config.matrix.key_count))
+                       return -1;
+       }
+#else
+#error "Tegra keyboard driver requires FDT definitions"
+#endif
+
+       /* Set up pin mux and enable the clock */
+       funcmux_select(PERIPH_ID_KBC, FUNCMUX_DEFAULT);
+       clock_enable(PERIPH_ID_KBC);
+       config_kbc_gpio(config.kbc);
+
+       tegra_kbc_open();
+       debug("%s: Tegra keyboard ready\n", __func__);
+
+       return 0;
+}
+
+int drv_keyboard_init(void)
+{
+       struct stdio_dev dev;
+
+       if (input_init(&config.input, 0, KBC_REPEAT_DELAY_MS,
+                       KBC_REPEAT_RATE_MS)) {
+               debug("%s: Cannot set up input\n", __func__);
+               return -1;
+       }
+       config.input.read_keys = tegra_kbc_check;
+
+       memset(&dev, '\0', sizeof(dev));
+       strcpy(dev.name, "tegra-kbc");
+       dev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
+       dev.getc = kbd_getc;
+       dev.tstc = kbd_tstc;
+       dev.start = init_tegra_keyboard;
+
+       /* Register the device. init_tegra_keyboard() will be called soon */
+       return input_stdio_register(&dev);
+}
index a70970784c2f5992d805d9b29241fcba0e4051ae..271463cf142b25c1096cb46dbbb5a7b5fa338abb 100644 (file)
@@ -35,10 +35,12 @@ COBJS-$(CONFIG_PDSP188x) += pdsp188x.o
 COBJS-$(CONFIG_STATUS_LED) += status_led.o
 COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o
 COBJS-$(CONFIG_PMIC) += pmic_core.o
+COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
 COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
 COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
 COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
 COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
+COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
diff --git a/drivers/misc/pmic_dialog.c b/drivers/misc/pmic_dialog.c
new file mode 100644 (file)
index 0000000..e97af1d
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  Copyright (C) 2011 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * 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.
+ */
+
+#include <common.h>
+#include <pmic.h>
+#include <dialog_pmic.h>
+
+int pmic_dialog_init(void)
+{
+       struct pmic *p = get_pmic();
+       static const char name[] = "DIALOG_PMIC";
+
+       p->name = name;
+       p->number_of_regs = DIALOG_NUM_OF_REGS;
+
+       p->interface = PMIC_I2C;
+       p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR;
+       p->hw.i2c.tx_num = 1;
+       p->bus = I2C_PMIC;
+
+       return 0;
+}
diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c
new file mode 100644 (file)
index 0000000..62dbc05
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <pmic.h>
+#include <max8997_pmic.h>
+
+int pmic_init(void)
+{
+       struct pmic *p = get_pmic();
+       static const char name[] = "MAX8997_PMIC";
+
+       puts("Board PMIC init\n");
+
+       p->name = name;
+       p->interface = PMIC_I2C;
+       p->number_of_regs = PMIC_NUM_OF_REGS;
+       p->hw.i2c.addr = MAX8997_I2C_ADDR;
+       p->hw.i2c.tx_num = 1;
+       p->bus = I2C_PMIC;
+
+       return 0;
+}
index c245352acad185d9b121b0a4f7329a67f69fbe59..a8e681c2fed546f5634a2c056951104421882512 100644 (file)
@@ -39,8 +39,8 @@ COBJS-$(CONFIG_MXS_MMC) += mxsmmc.o
 COBJS-$(CONFIG_OMAP_HSMMC) += omap_hsmmc.o
 COBJS-$(CONFIG_PXA_MMC) += pxa_mmc.o
 COBJS-$(CONFIG_PXA_MMC_GENERIC) += pxa_mmc_gen.o
-COBJS-$(CONFIG_S5P_MMC) += s5p_mmc.o
 COBJS-$(CONFIG_SDHCI) += sdhci.o
+COBJS-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o
 COBJS-$(CONFIG_SH_MMCIF) += sh_mmcif.o
 COBJS-$(CONFIG_TEGRA2_MMC) += tegra2_mmc.o
 
index a2f35e3e99159dc0481737a0bb4d1f1e55fc0da6..07370b57291daaded12e4da93edad61965f424f7 100644 (file)
@@ -307,19 +307,56 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 #else
        esdhc_write32(&regs->xfertyp, xfertyp);
 #endif
+
+       /* Mask all irqs */
+       esdhc_write32(&regs->irqsigen, 0);
+
        /* Wait for the command to complete */
-       while (!(esdhc_read32(&regs->irqstat) & IRQSTAT_CC))
+       while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))
                ;
 
        irqstat = esdhc_read32(&regs->irqstat);
        esdhc_write32(&regs->irqstat, irqstat);
 
+       /* Reset CMD and DATA portions on error */
+       if (irqstat & (CMD_ERR | IRQSTAT_CTOE)) {
+               esdhc_write32(&regs->sysctl, esdhc_read32(&regs->sysctl) |
+                             SYSCTL_RSTC);
+               while (esdhc_read32(&regs->sysctl) & SYSCTL_RSTC)
+                       ;
+
+               if (data) {
+                       esdhc_write32(&regs->sysctl,
+                                     esdhc_read32(&regs->sysctl) |
+                                     SYSCTL_RSTD);
+                       while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTD))
+                               ;
+               }
+       }
+
        if (irqstat & CMD_ERR)
                return COMM_ERR;
 
        if (irqstat & IRQSTAT_CTOE)
                return TIMEOUT;
 
+       /* Workaround for ESDHC errata ENGcm03648 */
+       if (!data && (cmd->resp_type & MMC_RSP_BUSY)) {
+               int timeout = 2500;
+
+               /* Poll on DATA0 line for cmd with busy signal for 250 ms */
+               while (timeout > 0 && !(esdhc_read32(&regs->prsstat) &
+                                       PRSSTAT_DAT0)) {
+                       udelay(100);
+                       timeout--;
+               }
+
+               if (timeout <= 0) {
+                       printf("Timeout waiting for DAT0 to go high!\n");
+                       return TIMEOUT;
+               }
+       }
+
        /* Copy the response to the response buffer */
        if (cmd->resp_type & MMC_RSP_136) {
                u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0;
index 596732e80e615f6a8ab1ccd559f11b80419647a6..aebe578ff6f2e0228baa3e5d010f6808ea269760 100644 (file)
@@ -1199,7 +1199,9 @@ int mmc_startup(struct mmc *mmc)
                else
                        mmc_set_clock(mmc, 25000000);
        } else {
-               for (width = EXT_CSD_BUS_WIDTH_8; width >= 0; width--) {
+               width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS) >>
+                        MMC_MODE_WIDTH_BITS_SHIFT);
+               for (; width >= 0; width--) {
                        /* Set the card to use 4 bit*/
                        err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
                                        EXT_CSD_BUS_WIDTH, width);
index 35c6bdabb06d4b71e8cf46263aa22c2cbf0301ec..4187a941207e584b855104c7c4fcfc3ef1b7e93b 100644 (file)
@@ -133,7 +133,8 @@ mxsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
                /* READ or WRITE */
                if (data->flags & MMC_DATA_READ) {
                        ctrl0 |= SSP_CTRL0_READ;
-               } else if (priv->mmc_is_wp(mmc->block_dev.dev)) {
+               } else if (priv->mmc_is_wp &&
+                       priv->mmc_is_wp(mmc->block_dev.dev)) {
                        printf("MMC%d: Can not write a locked card!\n",
                                mmc->block_dev.dev);
                        return UNUSABLE_ERR;
@@ -406,7 +407,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int))
         */
        mmc->f_min = 400000;
        mmc->f_max = mxc_get_clock(MXC_SSP0_CLK + id) * 1000 / 2;
-       mmc->b_max = 0x40;
+       mmc->b_max = 0x20;
 
        mmc_register(mmc);
        return 0;
index 2400db2f35671df76a6b9e8bb927e1438f397b58..afd9b30b513f92b60e74c8419f239e2712ba6958 100644 (file)
 #include <i2c.h>
 #include <twl4030.h>
 #include <twl6030.h>
+#include <twl6035.h>
 #include <asm/io.h>
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/sys_proto.h>
 
+/* common definitions for all OMAPs */
+#define SYSCTL_SRC     (1 << 25)
+#define SYSCTL_SRD     (1 << 26)
+
 /* If we fail after 1 second wait, something is really bad */
 #define MAX_RETRY_MS   1000
 
@@ -45,8 +50,8 @@ static struct mmc hsmmc_dev[2];
 static void omap4_vmmc_pbias_config(struct mmc *mmc)
 {
        u32 value = 0;
-       struct omap4_sys_ctrl_regs *const ctrl =
-               (struct omap4_sys_ctrl_regs *)SYSCTRL_GENERAL_CORE_BASE;
+       struct omap_sys_ctrl_regs *const ctrl =
+               (struct omap_sys_ctrl_regs *) SYSCTRL_GENERAL_CORE_BASE;
 
 
        value = readl(&ctrl->control_pbiaslite);
@@ -60,17 +65,51 @@ static void omap4_vmmc_pbias_config(struct mmc *mmc)
 }
 #endif
 
-unsigned char mmc_board_init(struct mmc *mmc)
+#if defined(CONFIG_OMAP54XX) && defined(CONFIG_TWL6035_POWER)
+static void omap5_pbias_config(struct mmc *mmc)
 {
-#if defined(CONFIG_TWL4030_POWER)
-       twl4030_power_mmc_init();
+       u32 value = 0;
+       struct omap_sys_ctrl_regs *const ctrl =
+               (struct omap_sys_ctrl_regs *) SYSCTRL_GENERAL_CORE_BASE;
+
+       value = readl(&ctrl->control_pbias);
+       value &= ~(SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ);
+       value |= SDCARD_BIAS_HIZ_MODE;
+       writel(value, &ctrl->control_pbias);
+
+       twl6035_mmc1_poweron_ldo();
+
+       value = readl(&ctrl->control_pbias);
+       value &= ~SDCARD_BIAS_HIZ_MODE;
+       value |= SDCARD_PBIASLITE_VMODE | SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ;
+       writel(value, &ctrl->control_pbias);
+
+       value = readl(&ctrl->control_pbias);
+       if (value & (1 << 23)) {
+               value &= ~(SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ);
+               value |= SDCARD_BIAS_HIZ_MODE;
+               writel(value, &ctrl->control_pbias);
+       }
+}
 #endif
 
+unsigned char mmc_board_init(struct mmc *mmc)
+{
 #if defined(CONFIG_OMAP34XX)
        t2_t *t2_base = (t2_t *)T2_BASE;
        struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
+       u32 pbias_lite;
 
-       writel(readl(&t2_base->pbias_lite) | PBIASLITEPWRDNZ1 |
+       pbias_lite = readl(&t2_base->pbias_lite);
+       pbias_lite &= ~(PBIASLITEPWRDNZ1 | PBIASLITEPWRDNZ0);
+       writel(pbias_lite, &t2_base->pbias_lite);
+#endif
+#if defined(CONFIG_TWL4030_POWER)
+       twl4030_power_mmc_init();
+       mdelay(100);    /* ramp-up delay from Linux code */
+#endif
+#if defined(CONFIG_OMAP34XX)
+       writel(pbias_lite | PBIASLITEPWRDNZ1 |
                PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
                &t2_base->pbias_lite);
 
@@ -80,6 +119,11 @@ unsigned char mmc_board_init(struct mmc *mmc)
        writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
                &t2_base->devconf1);
 
+       /* Change from default of 52MHz to 26MHz if necessary */
+       if (!(mmc->host_caps & MMC_MODE_HS_52MHz))
+               writel(readl(&t2_base->ctl_prog_io1) & ~CTLPROGIO1SPEEDCTRL,
+                       &t2_base->ctl_prog_io1);
+
        writel(readl(&prcm_base->fclken1_core) |
                EN_MMC1 | EN_MMC2 | EN_MMC3,
                &prcm_base->fclken1_core);
@@ -94,6 +138,10 @@ unsigned char mmc_board_init(struct mmc *mmc)
        if (mmc->block_dev.dev == 0)
                omap4_vmmc_pbias_config(mmc);
 #endif
+#if defined(CONFIG_OMAP54XX) && defined(CONFIG_TWL6035_POWER)
+       if (mmc->block_dev.dev == 0)
+               omap5_pbias_config(mmc);
+#endif
 
        return 0;
 }
@@ -189,6 +237,27 @@ static int mmc_init_setup(struct mmc *mmc)
        return 0;
 }
 
+/*
+ * MMC controller internal finite state machine reset
+ *
+ * Used to reset command or data internal state machines, using respectively
+ * SRC or SRD bit of SYSCTL register
+ */
+static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
+{
+       ulong start;
+
+       mmc_reg_out(&mmc_base->sysctl, bit, bit);
+
+       start = get_timer(0);
+       while ((readl(&mmc_base->sysctl) & bit) != 0) {
+               if (get_timer(0) - start > MAX_RETRY_MS) {
+                       printf("%s: timedout waiting for sysctl %x to clear\n",
+                               __func__, bit);
+                       return;
+               }
+       }
+}
 
 static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                        struct mmc_data *data)
@@ -209,7 +278,8 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
        start = get_timer(0);
        while (readl(&mmc_base->stat)) {
                if (get_timer(0) - start > MAX_RETRY_MS) {
-                       printf("%s: timedout waiting for stat!\n", __func__);
+                       printf("%s: timedout waiting for STAT (%x) to clear\n",
+                               __func__, readl(&mmc_base->stat));
                        return TIMEOUT;
                }
        }
@@ -277,9 +347,10 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                }
        } while (!mmc_stat);
 
-       if ((mmc_stat & IE_CTO) != 0)
+       if ((mmc_stat & IE_CTO) != 0) {
+               mmc_reset_controller_fsm(mmc_base, SYSCTL_SRC);
                return TIMEOUT;
-       else if ((mmc_stat & ERRI_MASK) != 0)
+       else if ((mmc_stat & ERRI_MASK) != 0)
                return -1;
 
        if (mmc_stat & CC_MASK) {
@@ -330,6 +401,9 @@ static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size)
                        }
                } while (mmc_stat == 0);
 
+               if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
+                       mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
+
                if ((mmc_stat & ERRI_MASK) != 0)
                        return 1;
 
@@ -382,6 +456,9 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
                        }
                } while (mmc_stat == 0);
 
+               if ((mmc_stat & (IE_DTO | IE_DCRC | IE_DEB)) != 0)
+                       mmc_reset_controller_fsm(mmc_base, SYSCTL_SRD);
+
                if ((mmc_stat & ERRI_MASK) != 0)
                        return 1;
 
@@ -463,7 +540,7 @@ static void mmc_set_ios(struct mmc *mmc)
        writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
 }
 
-int omap_mmc_init(int dev_index)
+int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max)
 {
        struct mmc *mmc;
 
@@ -494,11 +571,22 @@ int omap_mmc_init(int dev_index)
                return 1;
        }
        mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
-       mmc->host_caps = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS |
-                               MMC_MODE_HC;
+       mmc->host_caps = (MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS |
+                               MMC_MODE_HC) & ~host_caps_mask;
 
        mmc->f_min = 400000;
-       mmc->f_max = 52000000;
+
+       if (f_max != 0)
+               mmc->f_max = f_max;
+       else {
+               if (mmc->host_caps & MMC_MODE_HS) {
+                       if (mmc->host_caps & MMC_MODE_HS_52MHz)
+                               mmc->f_max = 52000000;
+                       else
+                               mmc->f_max = 26000000;
+               } else
+                       mmc->f_max = 20000000;
+       }
 
        mmc->b_max = 0;
 
diff --git a/drivers/mmc/s5p_mmc.c b/drivers/mmc/s5p_mmc.c
deleted file mode 100644 (file)
index 4ae3aaf..0000000
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * (C) Copyright 2009 SAMSUNG Electronics
- * Minkyu Kang <mk7.kang@samsung.com>
- * Jaehoon Chung <jh80.chung@samsung.com>
- *
- * 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
- */
-
-#include <common.h>
-#include <mmc.h>
-#include <asm/io.h>
-#include <asm/arch/mmc.h>
-#include <asm/arch/clk.h>
-
-/* support 4 mmc hosts */
-struct mmc mmc_dev[4];
-struct mmc_host mmc_host[4];
-
-static inline struct s5p_mmc *s5p_get_base_mmc(int dev_index)
-{
-       unsigned long offset = dev_index * sizeof(struct s5p_mmc);
-       return (struct s5p_mmc *)(samsung_get_base_mmc() + offset);
-}
-
-static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data)
-{
-       unsigned char ctrl;
-
-       debug("data->dest: %08x\n", (u32)data->dest);
-       writel((u32)data->dest, &host->reg->sysad);
-       /*
-        * DMASEL[4:3]
-        * 00 = Selects SDMA
-        * 01 = Reserved
-        * 10 = Selects 32-bit Address ADMA2
-        * 11 = Selects 64-bit Address ADMA2
-        */
-       ctrl = readb(&host->reg->hostctl);
-       ctrl &= ~(3 << 3);
-       writeb(ctrl, &host->reg->hostctl);
-
-       /* We do not handle DMA boundaries, so set it to max (512 KiB) */
-       writew((7 << 12) | (data->blocksize & 0xFFF), &host->reg->blksize);
-       writew(data->blocks, &host->reg->blkcnt);
-}
-
-static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data)
-{
-       unsigned short mode;
-
-       /*
-        * TRNMOD
-        * MUL1SIN0[5]  : Multi/Single Block Select
-        * RD1WT0[4]    : Data Transfer Direction Select
-        *      1 = read
-        *      0 = write
-        * ENACMD12[2]  : Auto CMD12 Enable
-        * ENBLKCNT[1]  : Block Count Enable
-        * ENDMA[0]     : DMA Enable
-        */
-       mode = (1 << 1) | (1 << 0);
-       if (data->blocks > 1)
-               mode |= (1 << 5);
-       if (data->flags & MMC_DATA_READ)
-               mode |= (1 << 4);
-
-       writew(mode, &host->reg->trnmod);
-}
-
-static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
-                       struct mmc_data *data)
-{
-       struct mmc_host *host = (struct mmc_host *)mmc->priv;
-       int flags, i;
-       unsigned int timeout;
-       unsigned int mask;
-       unsigned int retry = 0x100000;
-
-       /* Wait max 10 ms */
-       timeout = 10;
-
-       /*
-        * PRNSTS
-        * CMDINHDAT[1] : Command Inhibit (DAT)
-        * CMDINHCMD[0] : Command Inhibit (CMD)
-        */
-       mask = (1 << 0);
-       if ((data != NULL) || (cmd->resp_type & MMC_RSP_BUSY))
-               mask |= (1 << 1);
-
-       /*
-        * We shouldn't wait for data inihibit for stop commands, even
-        * though they might use busy signaling
-        */
-       if (data)
-               mask &= ~(1 << 1);
-
-       while (readl(&host->reg->prnsts) & mask) {
-               if (timeout == 0) {
-                       printf("%s: timeout error\n", __func__);
-                       return -1;
-               }
-               timeout--;
-               udelay(1000);
-       }
-
-       if (data)
-               mmc_prepare_data(host, data);
-
-       debug("cmd->arg: %08x\n", cmd->cmdarg);
-       writel(cmd->cmdarg, &host->reg->argument);
-
-       if (data)
-               mmc_set_transfer_mode(host, data);
-
-       if ((cmd->resp_type & MMC_RSP_136) && (cmd->resp_type & MMC_RSP_BUSY))
-               return -1;
-
-       /*
-        * CMDREG
-        * CMDIDX[13:8] : Command index
-        * DATAPRNT[5]  : Data Present Select
-        * ENCMDIDX[4]  : Command Index Check Enable
-        * ENCMDCRC[3]  : Command CRC Check Enable
-        * RSPTYP[1:0]
-        *      00 = No Response
-        *      01 = Length 136
-        *      10 = Length 48
-        *      11 = Length 48 Check busy after response
-        */
-       if (!(cmd->resp_type & MMC_RSP_PRESENT))
-               flags = 0;
-       else if (cmd->resp_type & MMC_RSP_136)
-               flags = (1 << 0);
-       else if (cmd->resp_type & MMC_RSP_BUSY)
-               flags = (3 << 0);
-       else
-               flags = (2 << 0);
-
-       if (cmd->resp_type & MMC_RSP_CRC)
-               flags |= (1 << 3);
-       if (cmd->resp_type & MMC_RSP_OPCODE)
-               flags |= (1 << 4);
-       if (data)
-               flags |= (1 << 5);
-
-       debug("cmd: %d\n", cmd->cmdidx);
-
-       writew((cmd->cmdidx << 8) | flags, &host->reg->cmdreg);
-
-       for (i = 0; i < retry; i++) {
-               mask = readl(&host->reg->norintsts);
-               /* Command Complete */
-               if (mask & (1 << 0)) {
-                       if (!data)
-                               writel(mask, &host->reg->norintsts);
-                       break;
-               }
-       }
-
-       if (i == retry) {
-               printf("%s: waiting for status update\n", __func__);
-               return TIMEOUT;
-       }
-
-       if (mask & (1 << 16)) {
-               /* Timeout Error */
-               debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx);
-               return TIMEOUT;
-       } else if (mask & (1 << 15)) {
-               /* Error Interrupt */
-               debug("error: %08x cmd %d\n", mask, cmd->cmdidx);
-               return -1;
-       }
-
-       if (cmd->resp_type & MMC_RSP_PRESENT) {
-               if (cmd->resp_type & MMC_RSP_136) {
-                       /* CRC is stripped so we need to do some shifting. */
-                       for (i = 0; i < 4; i++) {
-                               unsigned int offset =
-                                       (unsigned int)(&host->reg->rspreg3 - i);
-                               cmd->response[i] = readl(offset) << 8;
-
-                               if (i != 3) {
-                                       cmd->response[i] |=
-                                               readb(offset - 1);
-                               }
-                               debug("cmd->resp[%d]: %08x\n",
-                                               i, cmd->response[i]);
-                       }
-               } else if (cmd->resp_type & MMC_RSP_BUSY) {
-                       for (i = 0; i < retry; i++) {
-                               /* PRNTDATA[23:20] : DAT[3:0] Line Signal */
-                               if (readl(&host->reg->prnsts)
-                                       & (1 << 20))    /* DAT[0] */
-                                       break;
-                       }
-
-                       if (i == retry) {
-                               printf("%s: card is still busy\n", __func__);
-                               return TIMEOUT;
-                       }
-
-                       cmd->response[0] = readl(&host->reg->rspreg0);
-                       debug("cmd->resp[0]: %08x\n", cmd->response[0]);
-               } else {
-                       cmd->response[0] = readl(&host->reg->rspreg0);
-                       debug("cmd->resp[0]: %08x\n", cmd->response[0]);
-               }
-       }
-
-       if (data) {
-               while (1) {
-                       mask = readl(&host->reg->norintsts);
-
-                       if (mask & (1 << 15)) {
-                               /* Error Interrupt */
-                               writel(mask, &host->reg->norintsts);
-                               printf("%s: error during transfer: 0x%08x\n",
-                                               __func__, mask);
-                               return -1;
-                       } else if (mask & (1 << 3)) {
-                               /*
-                                * DMA Interrupt, restart the transfer where
-                                * it was interrupted.
-                                */
-                               unsigned int address = readl(&host->reg->sysad);
-
-                               debug("DMA end\n");
-                               writel((1 << 3), &host->reg->norintsts);
-                               writel(address, &host->reg->sysad);
-                       } else if (mask & (1 << 1)) {
-                               /* Transfer Complete */
-                               debug("r/w is done\n");
-                               break;
-                       }
-               }
-               writel(mask, &host->reg->norintsts);
-       }
-
-       udelay(1000);
-       return 0;
-}
-
-static void mmc_change_clock(struct mmc_host *host, uint clock)
-{
-       int div;
-       unsigned short clk;
-       unsigned long timeout;
-       unsigned long ctrl2;
-
-       /*
-        * SELBASECLK[5:4]
-        * 00/01 = HCLK
-        * 10 = EPLL
-        * 11 = XTI or XEXTCLK
-        */
-       ctrl2 = readl(&host->reg->control2);
-       ctrl2 &= ~(3 << 4);
-       ctrl2 |= (2 << 4);
-       writel(ctrl2, &host->reg->control2);
-
-       writew(0, &host->reg->clkcon);
-
-       /* XXX: we assume that clock is between 40MHz and 50MHz */
-       if (clock == 0)
-               goto out;
-       else if (clock <= 400000)
-               div = 0x100;
-       else if (clock <= 20000000)
-               div = 4;
-       else if (clock <= 26000000)
-               div = 2;
-       else
-               div = 1;
-       debug("div: %d\n", div);
-
-       div >>= 1;
-       /*
-        * CLKCON
-        * SELFREQ[15:8]        : base clock divied by value
-        * ENSDCLK[2]           : SD Clock Enable
-        * STBLINTCLK[1]        : Internal Clock Stable
-        * ENINTCLK[0]          : Internal Clock Enable
-        */
-       clk = (div << 8) | (1 << 0);
-       writew(clk, &host->reg->clkcon);
-
-       set_mmc_clk(host->dev_index, div);
-
-       /* Wait max 10 ms */
-       timeout = 10;
-       while (!(readw(&host->reg->clkcon) & (1 << 1))) {
-               if (timeout == 0) {
-                       printf("%s: timeout error\n", __func__);
-                       return;
-               }
-               timeout--;
-               udelay(1000);
-       }
-
-       clk |= (1 << 2);
-       writew(clk, &host->reg->clkcon);
-
-out:
-       host->clock = clock;
-}
-
-static void mmc_set_ios(struct mmc *mmc)
-{
-       struct mmc_host *host = mmc->priv;
-       unsigned char ctrl;
-       unsigned long val;
-
-       debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock);
-
-       /*
-        * SELCLKPADDS[17:16]
-        * 00 = 2mA
-        * 01 = 4mA
-        * 10 = 7mA
-        * 11 = 9mA
-        */
-       writel(0x3 << 16, &host->reg->control4);
-
-       val = readl(&host->reg->control2);
-       val &= (0x3 << 4);
-
-       val |=  (1 << 31) |     /* write status clear async mode enable */
-               (1 << 30) |     /* command conflict mask enable */
-               (1 << 14) |     /* Feedback Clock Enable for Rx Clock */
-               (1 << 8);       /* SDCLK hold enable */
-
-       writel(val, &host->reg->control2);
-
-       /*
-        * FCSEL1[15] FCSEL0[7]
-        * FCSel[1:0] : Rx Feedback Clock Delay Control
-        *      Inverter delay means10ns delay if SDCLK 50MHz setting
-        *      01 = Delay1 (basic delay)
-        *      11 = Delay2 (basic delay + 2ns)
-        *      00 = Delay3 (inverter delay)
-        *      10 = Delay4 (inverter delay + 2ns)
-        */
-       writel(0x8080, &host->reg->control3);
-
-       mmc_change_clock(host, mmc->clock);
-
-       ctrl = readb(&host->reg->hostctl);
-
-       /*
-        * WIDE8[5]
-        * 0 = Depend on WIDE4
-        * 1 = 8-bit mode
-        * WIDE4[1]
-        * 1 = 4-bit mode
-        * 0 = 1-bit mode
-        */
-       if (mmc->bus_width == 8)
-               ctrl |= (1 << 5);
-       else if (mmc->bus_width == 4)
-               ctrl |= (1 << 1);
-       else
-               ctrl &= ~(1 << 1);
-
-       /*
-        * OUTEDGEINV[2]
-        * 1 = Riging edge output
-        * 0 = Falling edge output
-        */
-       ctrl &= ~(1 << 2);
-
-       writeb(ctrl, &host->reg->hostctl);
-}
-
-static void mmc_reset(struct mmc_host *host)
-{
-       unsigned int timeout;
-
-       /*
-        * RSTALL[0] : Software reset for all
-        * 1 = reset
-        * 0 = work
-        */
-       writeb((1 << 0), &host->reg->swrst);
-
-       host->clock = 0;
-
-       /* Wait max 100 ms */
-       timeout = 100;
-
-       /* hw clears the bit when it's done */
-       while (readb(&host->reg->swrst) & (1 << 0)) {
-               if (timeout == 0) {
-                       printf("%s: timeout error\n", __func__);
-                       return;
-               }
-               timeout--;
-               udelay(1000);
-       }
-}
-
-static int mmc_core_init(struct mmc *mmc)
-{
-       struct mmc_host *host = (struct mmc_host *)mmc->priv;
-       unsigned int mask;
-
-       mmc_reset(host);
-
-       host->version = readw(&host->reg->hcver);
-
-       /* mask all */
-       writel(0xffffffff, &host->reg->norintstsen);
-       writel(0xffffffff, &host->reg->norintsigen);
-
-       writeb(0xe, &host->reg->timeoutcon);    /* TMCLK * 2^27 */
-
-       /*
-        * NORMAL Interrupt Status Enable Register init
-        * [5] ENSTABUFRDRDY : Buffer Read Ready Status Enable
-        * [4] ENSTABUFWTRDY : Buffer write Ready Status Enable
-        * [3] ENSTADMAINT : DMA Interrupt Status Enable
-        * [1] ENSTASTANSCMPLT : Transfre Complete Status Enable
-        * [0] ENSTACMDCMPLT : Command Complete Status Enable
-        */
-       mask = readl(&host->reg->norintstsen);
-       mask &= ~(0xffff);
-       mask |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 1) | (1 << 0);
-       writel(mask, &host->reg->norintstsen);
-
-       /*
-        * NORMAL Interrupt Signal Enable Register init
-        * [1] ENSTACMDCMPLT : Transfer Complete Signal Enable
-        */
-       mask = readl(&host->reg->norintsigen);
-       mask &= ~(0xffff);
-       mask |= (1 << 1);
-       writel(mask, &host->reg->norintsigen);
-
-       return 0;
-}
-
-static int s5p_mmc_initialize(int dev_index, int bus_width)
-{
-       struct mmc *mmc;
-
-       mmc = &mmc_dev[dev_index];
-
-       sprintf(mmc->name, "SAMSUNG SD/MMC");
-       mmc->priv = &mmc_host[dev_index];
-       mmc->send_cmd = mmc_send_cmd;
-       mmc->set_ios = mmc_set_ios;
-       mmc->init = mmc_core_init;
-       mmc->getcd = NULL;
-
-       mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
-       if (bus_width == 8)
-               mmc->host_caps = MMC_MODE_8BIT;
-       else
-               mmc->host_caps = MMC_MODE_4BIT;
-       mmc->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_HC;
-
-       mmc->f_min = 400000;
-       mmc->f_max = 52000000;
-
-       mmc_host[dev_index].dev_index = dev_index;
-       mmc_host[dev_index].clock = 0;
-       mmc_host[dev_index].reg = s5p_get_base_mmc(dev_index);
-       mmc->b_max = 0;
-       mmc_register(mmc);
-
-       return 0;
-}
-
-int s5p_mmc_init(int dev_index, int bus_width)
-{
-       return s5p_mmc_initialize(dev_index, bus_width);
-}
diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
new file mode 100644 (file)
index 0000000..1d4481b
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * (C) Copyright 2012 SAMSUNG Electronics
+ * Jaehoon Chung <jh80.chung@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <sdhci.h>
+#include <asm/arch/mmc.h>
+
+static char *S5P_NAME = "SAMSUNG SDHCI";
+static void s5p_sdhci_set_control_reg(struct sdhci_host *host)
+{
+       unsigned long val, ctrl;
+       /*
+        * SELCLKPADDS[17:16]
+        * 00 = 2mA
+        * 01 = 4mA
+        * 10 = 7mA
+        * 11 = 9mA
+        */
+       sdhci_writel(host, SDHCI_CTRL4_DRIVE_MASK(0x3), SDHCI_CONTROL4);
+
+       val = sdhci_readl(host, SDHCI_CONTROL2);
+       val &= SDHCI_CTRL2_SELBASECLK_SHIFT;
+
+       val |=  SDHCI_CTRL2_ENSTAASYNCCLR |
+               SDHCI_CTRL2_ENCMDCNFMSK |
+               SDHCI_CTRL2_ENFBCLKRX |
+               SDHCI_CTRL2_ENCLKOUTHOLD;
+
+       sdhci_writel(host, val, SDHCI_CONTROL2);
+
+       /*
+        * FCSEL3[31] FCSEL2[23] FCSEL1[15] FCSEL0[7]
+        * FCSel[1:0] : Rx Feedback Clock Delay Control
+        *      Inverter delay means10ns delay if SDCLK 50MHz setting
+        *      01 = Delay1 (basic delay)
+        *      11 = Delay2 (basic delay + 2ns)
+        *      00 = Delay3 (inverter delay)
+        *      10 = Delay4 (inverter delay + 2ns)
+        */
+       val = SDHCI_CTRL3_FCSEL3 | SDHCI_CTRL3_FCSEL1;
+       sdhci_writel(host, val, SDHCI_CONTROL3);
+
+       /*
+        * SELBASECLK[5:4]
+        * 00/01 = HCLK
+        * 10 = EPLL
+        * 11 = XTI or XEXTCLK
+        */
+       ctrl = sdhci_readl(host, SDHCI_CONTROL2);
+       ctrl &= ~SDHCI_CTRL2_SELBASECLK_MASK(0x3);
+       ctrl |= SDHCI_CTRL2_SELBASECLK_MASK(0x2);
+       sdhci_writel(host, ctrl, SDHCI_CONTROL2);
+}
+
+int s5p_sdhci_init(u32 regbase, u32 max_clk, u32 min_clk, u32 quirks)
+{
+       struct sdhci_host *host = NULL;
+       host = (struct sdhci_host *)malloc(sizeof(struct sdhci_host));
+       if (!host) {
+               printf("sdhci__host malloc fail!\n");
+               return 1;
+       }
+
+       host->name = S5P_NAME;
+       host->ioaddr = (void *)regbase;
+       host->quirks = quirks;
+
+       host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_BROKEN_VOLTAGE;
+       host->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
+       if (quirks & SDHCI_QUIRK_REG32_RW)
+               host->version = sdhci_readl(host, SDHCI_HOST_VERSION - 2) >> 16;
+       else
+               host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
+
+       host->set_control_reg = &s5p_sdhci_set_control_reg;
+
+       host->host_caps = MMC_MODE_HC;
+
+       add_sdhci(host, max_clk, min_clk);
+       return 0;
+}
index fc904b5308eaa855a5a758b56e0f840d9892a608..1709643da83b66585b0e9d5c7ae1851da2defaa1 100644 (file)
@@ -128,6 +128,7 @@ int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd,
        int trans_bytes = 0, is_aligned = 1;
        u32 mask, flags, mode;
        unsigned int timeout, start_addr = 0;
+       unsigned int retry = 10000;
 
        /* Wait max 10 ms */
        timeout = 10;
@@ -210,8 +211,19 @@ int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd,
                stat = sdhci_readl(host, SDHCI_INT_STATUS);
                if (stat & SDHCI_INT_ERROR)
                        break;
+               if (--retry == 0)
+                       break;
        } while ((stat & mask) != mask);
 
+       if (retry == 0) {
+               if (host->quirks & SDHCI_QUIRK_BROKEN_R1B)
+                       return 0;
+               else {
+                       printf("Timeout for status update!\n");
+                       return TIMEOUT;
+               }
+       }
+
        if ((stat & (SDHCI_INT_ERROR | mask)) == mask) {
                sdhci_cmd_done(host, cmd);
                sdhci_writel(host, mask, SDHCI_INT_STATUS);
@@ -325,6 +337,9 @@ void sdhci_set_ios(struct mmc *mmc)
        u32 ctrl;
        struct sdhci_host *host = (struct sdhci_host *)mmc->priv;
 
+       if (host->set_control_reg)
+               host->set_control_reg(host);
+
        if (mmc->clock != host->clock)
                sdhci_set_clock(mmc, mmc->clock);
 
@@ -348,6 +363,9 @@ void sdhci_set_ios(struct mmc *mmc)
        else
                ctrl &= ~SDHCI_CTRL_HISPD;
 
+       if (host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)
+               ctrl &= ~SDHCI_CTRL_HISPD;
+
        sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
 }
 
@@ -431,9 +449,15 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
                mmc->voltages |= MMC_VDD_29_30 | MMC_VDD_30_31;
        if (caps & SDHCI_CAN_VDD_180)
                mmc->voltages |= MMC_VDD_165_195;
+
+       if (host->quirks & SDHCI_QUIRK_BROKEN_VOLTAGE)
+               mmc->voltages |= host->voltages;
+
        mmc->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_4BIT;
        if (caps & SDHCI_CAN_DO_8BIT)
                mmc->host_caps |= MMC_MODE_8BIT;
+       if (host->host_caps)
+               mmc->host_caps |= host->host_caps;
 
        sdhci_reset(host, SDHCI_RESET_ALL);
        mmc_register(mmc);
index 5cac78b2968567a500a2db3155083f9661b189e9..b3b7c705e189a9fdfb61ba45c517d1de1fc03bed 100644 (file)
@@ -384,19 +384,30 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 
        /* READID must read all possible bytes while CEB is active */
        case NAND_CMD_READID:
+       case NAND_CMD_PARAM: {
+               int timing = IFC_FIR_OP_RB;
+               if (command == NAND_CMD_PARAM)
+                       timing = IFC_FIR_OP_RBCD;
+
                out_be32(&ifc->ifc_nand.nand_fir0,
                                (IFC_FIR_OP_CMD0 << IFC_NAND_FIR0_OP0_SHIFT) |
                                (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
-                               (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
+                               (timing << IFC_NAND_FIR0_OP2_SHIFT));
                out_be32(&ifc->ifc_nand.nand_fcr0,
-                               NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
-               /* 4 bytes for manuf, device and exts */
-               out_be32(&ifc->ifc_nand.nand_fbcr, 4);
-               ctrl->read_bytes = 4;
+                               command << IFC_NAND_FCR0_CMD0_SHIFT);
+               out_be32(&ifc->ifc_nand.row3, column);
+
+               /*
+                * although currently it's 8 bytes for READID, we always read
+                * the maximum 256 bytes(for PARAM)
+                */
+               out_be32(&ifc->ifc_nand.nand_fbcr, 256);
+               ctrl->read_bytes = 256;
 
                set_addr(mtd, 0, 0, 0);
                fsl_ifc_run_command(mtd);
                return;
+       }
 
        /* ERASE1 stores the block and page address */
        case NAND_CMD_ERASE1:
@@ -764,6 +775,7 @@ int board_nand_init(struct nand_chip *nand)
        if (priv->bank >= MAX_BANKS) {
                printf("%s: address did not match any "
                       "chip selects\n", __func__);
+               kfree(priv);
                return -ENODEV;
        }
 
index 35e89a0f4d69428878edcbe384263f02a7360b78..936186f75e6ef7793bf2632c8371d599ce4b4c48 100644 (file)
@@ -1302,12 +1302,45 @@ static void mxc_setup_config1(void)
 #define mxc_setup_config1()
 #endif
 
+#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
+
+static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
+static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
+
+static struct nand_bbt_descr bbt_main_descr = {
+       .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
+                  NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+       .offs = 0,
+       .len = 4,
+       .veroffs = 4,
+       .maxblocks = 4,
+       .pattern = bbt_pattern,
+};
+
+static struct nand_bbt_descr bbt_mirror_descr = {
+       .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
+                  NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+       .offs = 0,
+       .len = 4,
+       .veroffs = 4,
+       .maxblocks = 4,
+       .pattern = mirror_pattern,
+};
+
+#endif
+
 int board_nand_init(struct nand_chip *this)
 {
        struct mtd_info *mtd;
        uint16_t tmp;
        int err = 0;
 
+#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
+       this->options |= NAND_USE_FLASH_BBT;
+       this->bbt_td = &bbt_main_descr;
+       this->bbt_md = &bbt_mirror_descr;
+#endif
+
        /* structures must be linked */
        mtd = &host->mtd;
        mtd->priv = this;
index bef79bed0fe1563489a85ed9ecaa69ed25805304..bfd668fa0ac5425f21361971ca5f0efc26bff4f7 100644 (file)
@@ -2530,13 +2530,14 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
                chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')
                return 0;
 
-       printk(KERN_INFO "ONFI flash detected\n");
+       MTDDEBUG(MTD_DEBUG_LEVEL0, "ONFI flash detected\n");
        chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);
        for (i = 0; i < 3; i++) {
                chip->read_buf(mtd, (uint8_t *)p, sizeof(*p));
                if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) ==
                                le16_to_cpu(p->crc)) {
-                       printk(KERN_INFO "ONFI param page %d valid\n", i);
+                       MTDDEBUG(MTD_DEBUG_LEVEL0,
+                                "ONFI param page %d valid\n", i);
                        break;
                }
        }
index dc6c6480e58bbed1ab272b38645347e0a9346b89..74a7061b055efe51defdb2a0f2271364d34029bc 100644 (file)
@@ -259,10 +259,10 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
                                        mtd->ecc_stats.bbtblocks++;
                                        continue;
                                }
-                               /* Leave it for now, if its matured we can move this
-                                * message to MTD_DEBUG_LEVEL0 */
-                               printk(KERN_DEBUG "nand_read_bbt: Bad block at 0x%012llx\n",
-                                      (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
+                               MTDDEBUG(MTD_DEBUG_LEVEL0, "nand_read_bbt: " \
+                                       "Bad block at 0x%012llx\n",
+                                       (loff_t)((offs << 2) + (act >> 1))
+                                       << this->bbt_erase_shift);
                                /* Factory marked bad or worn out ? */
                                if (tmp == 0)
                                        this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06);
@@ -651,8 +651,9 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
                if (td->pages[i] == -1)
                        printk(KERN_WARNING "Bad block table not found for chip %d\n", i);
                else
-                       printk(KERN_DEBUG "Bad block table found at page %d, version 0x%02X\n", td->pages[i],
-                              td->version[i]);
+                       MTDDEBUG(MTD_DEBUG_LEVEL0, "Bad block table found " \
+                               "at page %d, version 0x%02X\n", td->pages[i],
+                               td->version[i]);
        }
        return 0;
 }
index 60c778e637018ef350a4c021359ba55b2016032c..7ed8b1891ce69663ff084005649c865579a85b71 100644 (file)
@@ -564,7 +564,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                                ops.oobbuf = ops.datbuf + pagesize;
 
                                rval = nand->write_oob(nand, offset, &ops);
-                               if (!rval)
+                               if (rval != 0)
                                        break;
 
                                offset += pagesize;
index d8db9f0c6e808fd2d14a6f000f2f4dd0c80fbd47..156fa8f916a3666d7e8bad371b2bcdf720081c27 100644 (file)
@@ -187,9 +187,10 @@ int fec_phy_write(struct mii_dev *bus, int phyAddr, int dev_addr, int regAddr,
 #ifndef CONFIG_PHYLIB
 static int miiphy_restart_aneg(struct eth_device *dev)
 {
+       int ret = 0;
+#if !defined(CONFIG_FEC_MXC_NO_ANEG)
        struct fec_priv *fec = (struct fec_priv *)dev->priv;
        struct ethernet_regs *eth = fec->bus->priv;
-       int ret = 0;
 
        /*
         * Wake up from sleep if necessary
@@ -213,6 +214,7 @@ static int miiphy_restart_aneg(struct eth_device *dev)
        if (fec->mii_postcall)
                ret = fec->mii_postcall(fec->phy_id);
 
+#endif
        return ret;
 }
 
@@ -398,6 +400,42 @@ static void fec_eth_phy_config(struct eth_device *dev)
 #endif
 }
 
+/*
+ * Do initial configuration of the FEC registers
+ */
+static void fec_reg_setup(struct fec_priv *fec)
+{
+       uint32_t rcntrl;
+
+       /*
+        * Set interrupt mask register
+        */
+       writel(0x00000000, &fec->eth->imask);
+
+       /*
+        * Clear FEC-Lite interrupt event register(IEVENT)
+        */
+       writel(0xffffffff, &fec->eth->ievent);
+
+
+       /*
+        * Set FEC-Lite receive control register(R_CNTRL):
+        */
+
+       /* Start with frame length = 1518, common for all modes. */
+       rcntrl = PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT;
+       if (fec->xcv_type == SEVENWIRE)
+               rcntrl |= FEC_RCNTRL_FCE;
+       else if (fec->xcv_type == RGMII)
+               rcntrl |= FEC_RCNTRL_RGMII;
+       else if (fec->xcv_type == RMII)
+               rcntrl |= FEC_RCNTRL_RMII;
+       else    /* MII mode */
+               rcntrl |= FEC_RCNTRL_FCE | FEC_RCNTRL_MII_MODE;
+
+       writel(rcntrl, &fec->eth->r_cntrl);
+}
+
 /**
  * Start the FEC engine
  * @param[in] dev Our device to handle
@@ -512,7 +550,6 @@ static int fec_init(struct eth_device *dev, bd_t* bd)
 {
        struct fec_priv *fec = (struct fec_priv *)dev->priv;
        uint32_t mib_ptr = (uint32_t)&fec->eth->rmon_t_drop;
-       uint32_t rcntrl;
        uint32_t size;
        int i, ret;
 
@@ -560,33 +597,7 @@ static int fec_init(struct eth_device *dev, bd_t* bd)
                                   (unsigned)fec->rbd_base + size);
        }
 
-       /*
-        * Set interrupt mask register
-        */
-       writel(0x00000000, &fec->eth->imask);
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       writel(0xffffffff, &fec->eth->ievent);
-
-
-       /*
-        * Set FEC-Lite receive control register(R_CNTRL):
-        */
-
-       /* Start with frame length = 1518, common for all modes. */
-       rcntrl = PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT;
-       if (fec->xcv_type == SEVENWIRE)
-               rcntrl |= FEC_RCNTRL_FCE;
-       else if (fec->xcv_type == RGMII)
-               rcntrl |= FEC_RCNTRL_RGMII;
-       else if (fec->xcv_type == RMII)
-               rcntrl |= FEC_RCNTRL_RMII;
-       else    /* MII mode */
-               rcntrl |= FEC_RCNTRL_FCE | FEC_RCNTRL_MII_MODE;
-
-       writel(rcntrl, &fec->eth->r_cntrl);
+       fec_reg_setup(fec);
 
        if (fec->xcv_type == MII10 || fec->xcv_type == MII100)
                fec_mii_setspeed(fec);
@@ -933,24 +944,7 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
                udelay(10);
        }
 
-       /*
-        * Set interrupt mask register
-        */
-       writel(0x00000000, &fec->eth->imask);
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       writel(0xffffffff, &fec->eth->ievent);
-
-       /*
-        * Set FEC-Lite receive control register(R_CNTRL):
-        */
-       /*
-        * Frame length=1518; MII mode;
-        */
-       writel((PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT) | FEC_RCNTRL_FCE |
-               FEC_RCNTRL_MII_MODE, &fec->eth->r_cntrl);
+       fec_reg_setup(fec);
        fec_mii_setspeed(fec);
 
        if (dev_id == -1) {
index 56ba64fbb030121e0e6f1ec2d2613fe93e6cc235..7acd5b0050510d5269c0ace7b00dbab781e3aad9 100644 (file)
 DECLARE_GLOBAL_DATA_PTR;
 
 static char input_buffer[512];
-static int input_size = 0;             /* char count in input buffer */
-static int input_offset = 0;           /* offset to valid chars in input buffer */
-static int input_recursion = 0;
-static int output_recursion = 0;
+static int input_size; /* char count in input buffer */
+static int input_offset; /* offset to valid chars in input buffer */
+static int input_recursion;
+static int output_recursion;
 static int net_timeout;
-static uchar nc_ether[6];              /* server enet address */
-static IPaddr_t nc_ip;                 /* server ip */
-static short nc_port;                  /* source/target port */
-static const char *output_packet;      /* used by first send udp */
-static int output_packet_len = 0;
+static uchar nc_ether[6]; /* server enet address */
+static IPaddr_t nc_ip; /* server ip */
+static short nc_port; /* source/target port */
+static const char *output_packet; /* used by first send udp */
+static int output_packet_len;
 
 static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
                                 IPaddr_t sip, unsigned src,
                                 unsigned len)
 {
-       NetState = NETLOOP_SUCCESS;     /* got arp reply - quit net loop */
+       NetState = NETLOOP_SUCCESS; /* got arp reply - quit net loop */
 }
 
 static void nc_handler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                        unsigned len)
 {
        if (input_size)
-               NetState = NETLOOP_SUCCESS;     /* got input - quit net loop */
+               NetState = NETLOOP_SUCCESS; /* got input - quit net loop */
 }
 
-static void nc_timeout (void)
+static void nc_timeout(void)
 {
        NetState = NETLOOP_SUCCESS;
 }
 
-void NcStart (void)
+void NcStart(void)
 {
-       if (!output_packet_len || memcmp (nc_ether, NetEtherNullAddr, 6)) {
+       if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
                /* going to check for input packet */
-               NetSetHandler (nc_handler);
-               NetSetTimeout (net_timeout, nc_timeout);
+               NetSetHandler(nc_handler);
+               NetSetTimeout(net_timeout, nc_timeout);
        } else {
                /* send arp request */
                uchar *pkt;
-               NetSetHandler (nc_wait_arp_handler);
-               pkt = (uchar *) NetTxPacket + NetEthHdrSize () + IP_HDR_SIZE;
-               memcpy (pkt, output_packet, output_packet_len);
-               NetSendUDPPacket (nc_ether, nc_ip, nc_port, nc_port, output_packet_len);
+               NetSetHandler(nc_wait_arp_handler);
+               pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE;
+               memcpy(pkt, output_packet, output_packet_len);
+               NetSendUDPPacket(nc_ether, nc_ip, nc_port, nc_port,
+                       output_packet_len);
        }
 }
 
-int nc_input_packet (uchar * pkt, unsigned dest, unsigned src, unsigned len)
+int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 {
        int end, chunk;
 
        if (dest != nc_port || !len)
-               return 0;               /* not for us */
+               return 0; /* not for us */
 
-       if (input_size == sizeof input_buffer)
-               return 1;               /* no space */
-       if (len > sizeof input_buffer - input_size)
-               len = sizeof input_buffer - input_size;
+       if (input_size == sizeof(input_buffer))
+               return 1; /* no space */
+       if (len > sizeof(input_buffer) - input_size)
+               len = sizeof(input_buffer) - input_size;
 
        end = input_offset + input_size;
-       if (end > sizeof input_buffer)
-               end -= sizeof input_buffer;
+       if (end > sizeof(input_buffer))
+               end -= sizeof(input_buffer);
 
        chunk = len;
-       if (end + len > sizeof input_buffer) {
-               chunk = sizeof input_buffer - end;
+       if (end + len > sizeof(input_buffer)) {
+               chunk = sizeof(input_buffer) - end;
                memcpy(input_buffer, pkt + chunk, len - chunk);
        }
-       memcpy (input_buffer + end, pkt, chunk);
+       memcpy(input_buffer + end, pkt, chunk);
 
        input_size += len;
 
        return 1;
 }
 
-static void nc_send_packet (const char *buf, int len)
+static void nc_send_packet(const char *buf, int len)
 {
        struct eth_device *eth;
        int inited = 0;
@@ -111,33 +112,33 @@ static void nc_send_packet (const char *buf, int len)
        uchar *ether;
        IPaddr_t ip;
 
-       if ((eth = eth_get_dev ()) == NULL) {
+       eth = eth_get_dev();
+       if (eth == NULL)
                return;
-       }
 
-       if (!memcmp (nc_ether, NetEtherNullAddr, 6)) {
+       if (!memcmp(nc_ether, NetEtherNullAddr, 6)) {
                if (eth->state == ETH_STATE_ACTIVE)
                        return; /* inside net loop */
                output_packet = buf;
                output_packet_len = len;
-               NetLoop (NETCONS);      /* wait for arp reply and send packet */
+               NetLoop(NETCONS); /* wait for arp reply and send packet */
                output_packet_len = 0;
                return;
        }
 
        if (eth->state != ETH_STATE_ACTIVE) {
-               if (eth_init (gd->bd) < 0)
+               if (eth_init(gd->bd) < 0)
                        return;
                inited = 1;
        }
-       pkt = (uchar *) NetTxPacket + NetEthHdrSize () + IP_HDR_SIZE;
-       memcpy (pkt, buf, len);
+       pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE;
+       memcpy(pkt, buf, len);
        ether = nc_ether;
        ip = nc_ip;
-       NetSendUDPPacket (ether, ip, nc_port, nc_port, len);
+       NetSendUDPPacket(ether, ip, nc_port, nc_port, len);
 
        if (inited)
-               eth_halt ();
+               eth_halt();
 }
 
 static int nc_start(void)
@@ -146,26 +147,27 @@ static int nc_start(void)
 
        nc_port = 6666;         /* default port */
 
-       if (getenv ("ncip")) {
+       if (getenv("ncip")) {
                char *p;
 
-               nc_ip = getenv_IPaddr ("ncip");
+               nc_ip = getenv_IPaddr("ncip");
                if (!nc_ip)
                        return -1;      /* ncip is 0.0.0.0 */
-               if ((p = strchr (getenv ("ncip"), ':')) != NULL)
-                       nc_port = simple_strtoul (p + 1, NULL, 10);
+               p = strchr(getenv("ncip"), ':');
+               if (p != NULL)
+                       nc_port = simple_strtoul(p + 1, NULL, 10);
        } else
                nc_ip = ~0;             /* ncip is not set */
 
-       our_ip = getenv_IPaddr ("ipaddr");
-       netmask = getenv_IPaddr ("netmask");
+       our_ip = getenv_IPaddr("ipaddr");
+       netmask = getenv_IPaddr("netmask");
 
        if (nc_ip == ~0 ||                              /* 255.255.255.255 */
            ((netmask & our_ip) == (netmask & nc_ip) && /* on the same net */
-           (netmask | nc_ip) == ~0))                   /* broadcast to our net */
-               memset (nc_ether, 0xff, sizeof nc_ether);
+           (netmask | nc_ip) == ~0))           /* broadcast to our net */
+               memset(nc_ether, 0xff, sizeof(nc_ether));
        else
-               memset (nc_ether, 0, sizeof nc_ether);  /* force arp request */
+               memset(nc_ether, 0, sizeof(nc_ether));  /* force arp request */
 
        return 0;
 }
@@ -176,7 +178,7 @@ static void nc_putc(char c)
                return;
        output_recursion = 1;
 
-       nc_send_packet (&c, 1);
+       nc_send_packet(&c, 1);
 
        output_recursion = 0;
 }
@@ -208,14 +210,14 @@ static int nc_getc(void)
 
        net_timeout = 0;        /* no timeout */
        while (!input_size)
-               NetLoop (NETCONS);
+               NetLoop(NETCONS);
 
        input_recursion = 0;
 
        c = input_buffer[input_offset++];
 
-       if (input_offset >= sizeof input_buffer)
-               input_offset -= sizeof input_buffer;
+       if (input_offset >= sizeof(input_buffer))
+               input_offset -= sizeof(input_buffer);
        input_size--;
 
        return c;
@@ -231,28 +233,28 @@ static int nc_tstc(void)
        if (input_size)
                return 1;
 
-       eth = eth_get_dev ();
+       eth = eth_get_dev();
        if (eth && eth->state == ETH_STATE_ACTIVE)
                return 0;       /* inside net loop */
 
        input_recursion = 1;
 
        net_timeout = 1;
-       NetLoop (NETCONS);      /* kind of poll */
+       NetLoop(NETCONS);       /* kind of poll */
 
        input_recursion = 0;
 
        return input_size != 0;
 }
 
-int drv_nc_init (void)
+int drv_nc_init(void)
 {
        struct stdio_dev dev;
        int rc;
 
-       memset (&dev, 0, sizeof (dev));
+       memset(&dev, 0, sizeof(dev));
 
-       strcpy (dev.name, "nc");
+       strcpy(dev.name, "nc");
        dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
        dev.start = nc_start;
        dev.putc = nc_putc;
@@ -260,7 +262,7 @@ int drv_nc_init (void)
        dev.getc = nc_getc;
        dev.tstc = nc_tstc;
 
-       rc = stdio_register (&dev);
+       rc = stdio_register(&dev);
 
        return (rc == 0) ? 1 : rc;
 }
index ead00f8dae6a3b0ac9fdbf2efc938faf1d0ac2b0..6bf388cb7d59036fd2922eb51dd89d09328af05d 100644 (file)
@@ -26,8 +26,10 @@ include $(TOPDIR)/config.mk
 LIB    := $(obj)libpower.o
 
 COBJS-$(CONFIG_FTPMU010_POWER) += ftpmu010.o
+COBJS-$(CONFIG_TPS6586X_POWER) += tps6586x.o
 COBJS-$(CONFIG_TWL4030_POWER)  += twl4030.o
 COBJS-$(CONFIG_TWL6030_POWER)  += twl6030.o
+COBJS-$(CONFIG_TWL6035_POWER)  += twl6035.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
diff --git a/drivers/power/tps6586x.c b/drivers/power/tps6586x.c
new file mode 100644 (file)
index 0000000..f3f2ec6
--- /dev/null
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010,2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <tps6586x.h>
+#include <asm/io.h>
+#include <i2c.h>
+
+static int bus_num;            /* I2C bus we are on */
+#define I2C_ADDRESS            0x34    /* chip requires this address */
+static char inited;            /* 1 if we have been inited */
+
+enum {
+       /* Registers that we access */
+       SUPPLY_CONTROL1         = 0x20,
+       SUPPLY_CONTROL2,
+       SM1_VOLTAGE_V1          = 0x23,
+       SM1_VOLTAGE_V2,
+       SM0_VOLTAGE_V1          = 0x26,
+       SM0_VOLTAGE_V2,
+       PFM_MODE                = 0x47,
+
+       /* Bits in the supply control registers */
+       CTRL_SM1_RAMP           = 0x01,
+       CTRL_SM1_SUPPLY2        = 0x02,
+       CTRL_SM0_RAMP           = 0x04,
+       CTRL_SM0_SUPPLY2        = 0x08,
+};
+
+#define MAX_I2C_RETRY  3
+int tps6586x_read(int reg)
+{
+       int     i;
+       uchar   data;
+       int     retval = -1;
+       int     old_bus_num;
+
+       old_bus_num = i2c_get_bus_num();
+       i2c_set_bus_num(bus_num);
+
+       for (i = 0; i < MAX_I2C_RETRY; ++i) {
+               if (!i2c_read(I2C_ADDRESS, reg, 1, &data, 1)) {
+                       retval = (int)data;
+                       goto exit;
+               }
+
+               /* i2c access failed, retry */
+               udelay(100);
+       }
+
+exit:
+       i2c_set_bus_num(old_bus_num);
+       debug("pmu_read %x=%x\n", reg, retval);
+       if (retval < 0)
+               debug("%s: failed to read register %#x: %d\n", __func__, reg,
+                     retval);
+       return retval;
+}
+
+int tps6586x_write(int reg, uchar *data, uint len)
+{
+       int     i;
+       int     retval = -1;
+       int     old_bus_num;
+
+       old_bus_num = i2c_get_bus_num();
+       i2c_set_bus_num(bus_num);
+
+       for (i = 0; i < MAX_I2C_RETRY; ++i) {
+               if (!i2c_write(I2C_ADDRESS, reg, 1, data, len)) {
+                       retval = 0;
+                       goto exit;
+               }
+
+               /* i2c access failed, retry */
+               udelay(100);
+       }
+
+exit:
+       i2c_set_bus_num(old_bus_num);
+       debug("pmu_write %x=%x: ", reg, retval);
+       for (i = 0; i < len; i++)
+               debug("%x ", data[i]);
+       if (retval)
+               debug("%s: failed to write register %#x\n", __func__, reg);
+       return retval;
+}
+
+/*
+ * Get current voltage of SM0 and SM1
+ *
+ * @param sm0  Place to put SM0 voltage
+ * @param sm1  Place to put SM1 voltage
+ * @return 0 if ok, -1 on error
+ */
+static int read_voltages(int *sm0, int *sm1)
+{
+       int ctrl1, ctrl2;
+       int is_v2;
+
+       /*
+        * Each vdd has two supply sources, ie, v1 and v2.
+        * The supply control reg1 and reg2 determine the current selection.
+        */
+       ctrl1 = tps6586x_read(SUPPLY_CONTROL1);
+       ctrl2 = tps6586x_read(SUPPLY_CONTROL2);
+       if (ctrl1 == -1 || ctrl2 == -1)
+               return -1;
+
+       /* Figure out whether V1 or V2 is selected */
+       is_v2 = (ctrl1 | ctrl2) & CTRL_SM0_SUPPLY2;
+       *sm0 = tps6586x_read(is_v2 ? SM0_VOLTAGE_V2 : SM0_VOLTAGE_V1);
+       *sm1 = tps6586x_read(is_v2 ? SM1_VOLTAGE_V2 : SM1_VOLTAGE_V1);
+       if (*sm0 == -1 || *sm1 == -1)
+               return -1;
+
+       return 0;
+}
+
+static int set_voltage(int reg, int data, int rate)
+{
+       uchar control_bit;
+       uchar buff[3];
+
+       control_bit = (reg == SM0_VOLTAGE_V1 ? CTRL_SM0_RAMP : CTRL_SM1_RAMP);
+
+       /*
+        * Only one supply is needed in u-boot. set both v1 and v2 to
+        * same value.
+        *
+        * When both v1 and v2 are set to same value, we just need to set
+        * control1 reg to trigger the supply selection.
+        */
+       buff[0] = buff[1] = (uchar)data;
+       buff[2] = rate;
+
+       /* write v1, v2 and rate, then trigger */
+       if (tps6586x_write(reg, buff, 3) ||
+           tps6586x_write(SUPPLY_CONTROL1, &control_bit, 1))
+               return -1;
+
+       return 0;
+}
+
+static int calculate_next_voltage(int voltage, int target, int step)
+{
+       int diff = voltage < target ? step : -step;
+
+       if (abs(target - voltage) > step)
+               voltage += diff;
+       else
+               voltage = target;
+
+       return voltage;
+}
+
+int tps6586x_set_pwm_mode(int mask)
+{
+       uchar val;
+       int ret;
+
+       assert(inited);
+       ret = tps6586x_read(PFM_MODE);
+       if (ret != -1) {
+               val = (uchar)ret;
+               val |= mask;
+
+               ret = tps6586x_write(PFM_MODE, &val, 1);
+       }
+
+       if (ret == -1)
+               debug("%s: Failed to read/write PWM mode reg\n", __func__);
+
+       return ret;
+}
+
+int tps6586x_adjust_sm0_sm1(int sm0_target, int sm1_target, int step, int rate,
+                           int min_sm0_over_sm1)
+{
+       int sm0, sm1;
+       int bad;
+
+       assert(inited);
+
+       /* get current voltage settings */
+       if (read_voltages(&sm0, &sm1)) {
+               debug("%s: Cannot read voltage settings\n", __func__);
+               return -1;
+       }
+
+       /*
+        * if vdd_core < vdd_cpu + rel
+        *    skip
+        *
+        * This condition may happen when system reboots due to kernel crash.
+        */
+       if (min_sm0_over_sm1 != -1 && sm0 < sm1 + min_sm0_over_sm1) {
+               debug("%s: SM0 is %d, SM1 is %d, but min_sm0_over_sm1 is %d\n",
+                     __func__, sm0, sm1, min_sm0_over_sm1);
+               return -1;
+       }
+
+       /*
+        * Since vdd_core and vdd_cpu may both stand at either greater or less
+        * than their nominal voltage, the adjustment may go either directions.
+        *
+        * Make sure vdd_core is always higher than vdd_cpu with certain margin.
+        * So, find out which vdd to adjust first in each step.
+        *
+        * case 1: both sm0 and sm1 need to move up
+        *              adjust sm0 before sm1
+        *
+        * case 2: both sm0 and sm1 need to move down
+        *              adjust sm1 before sm0
+        *
+        * case 3: sm0 moves down and sm1 moves up
+        *              adjusting either one first is fine.
+        *
+        * Adjust vdd_core and vdd_cpu one step at a time until they reach
+        * their nominal values.
+        */
+       bad = 0;
+       while (!bad && (sm0 != sm0_target || sm1 != sm1_target)) {
+               int adjust_sm0_late = 0; /* flag to adjust vdd_core later */
+
+               debug("%d-%d   %d-%d   ", sm0, sm0_target, sm1, sm1_target);
+
+               if (sm0 != sm0_target) {
+                       /*
+                        * if case 1 and case 3, set new sm0 first.
+                        * otherwise, hold down until new sm1 is set.
+                        */
+                       sm0 = calculate_next_voltage(sm0, sm0_target, step);
+                       if (sm1 < sm1_target)
+                               bad |= set_voltage(SM0_VOLTAGE_V1, sm0, rate);
+                       else
+                               adjust_sm0_late = 1;
+               }
+
+               if (sm1 != sm1_target) {
+                       sm1 = calculate_next_voltage(sm1, sm1_target, step);
+                       bad |= set_voltage(SM1_VOLTAGE_V1, sm1, rate);
+               }
+
+               if (adjust_sm0_late)
+                       bad |= set_voltage(SM0_VOLTAGE_V1, sm0, rate);
+               debug("%d\n", adjust_sm0_late);
+       }
+       debug("%d-%d   %d-%d   done\n", sm0, sm0_target, sm1, sm1_target);
+
+       return bad ? -1 : 0;
+}
+
+int tps6586x_init(int bus)
+{
+       bus_num = bus;
+       inited = 1;
+
+       return 0;
+}
diff --git a/drivers/power/twl6035.c b/drivers/power/twl6035.c
new file mode 100644 (file)
index 0000000..624c09e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * (C) Copyright 2012
+ * Texas Instruments, <www.ti.com>
+ *
+ * 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
+ */
+#include <config.h>
+#include <twl6035.h>
+
+/* Functions to read and write from TWL6030 */
+int twl6035_i2c_write_u8(u8 chip_no, u8 val, u8 reg)
+{
+       return i2c_write(chip_no, reg, 1, &val, 1);
+}
+
+int twl6035_i2c_read_u8(u8 chip_no, u8 *val, u8 reg)
+{
+       return i2c_read(chip_no, reg, 1, val, 1);
+}
+
+/* To align with i2c mw/mr address, reg, val command syntax */
+static inline int palmas_write_u8(u8 chip_no, u8 reg, u8 val)
+{
+       return i2c_write(chip_no, reg, 1, &val, 1);
+}
+
+static inline int palmas_read_u8(u8 chip_no, u8 reg, u8 *val)
+{
+       return i2c_read(chip_no, reg, 1, val, 1);
+}
+
+void twl6035_init_settings(void)
+{
+       return;
+}
+
+void twl6035_mmc1_poweron_ldo(void)
+{
+       u8 val = 0;
+
+       /* set LDO9 TWL6035 to 3V */
+       val = 0x2b; /* (3 -.9)*28 +1 */
+       palmas_write_u8(0x48, LDO9_VOLTAGE, val);
+
+       /* TURN ON LDO9 */
+       val = LDO_ON | LDO_MODE_SLEEP | LDO_MODE_ACTIVE;
+       palmas_write_u8(0x48, LDO9_CTRL, val);
+       return;
+}
index 616b85703b29b3dd82ce50be9b65d10f20664f88..65d0f234e7e02fa1adb9260710c3f90ee1b2b985 100644 (file)
@@ -29,6 +29,7 @@ COBJS-$(CONFIG_ALTERA_UART) += altera_uart.o
 COBJS-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
 COBJS-$(CONFIG_ARM_DCC) += arm_dcc.o
 COBJS-$(CONFIG_ATMEL_USART) += atmel_usart.o
+COBJS-$(CONFIG_LPC32XX_HSUART) += lpc32xx_hsuart.o
 COBJS-$(CONFIG_MCFUART) += mcfuart.o
 COBJS-$(CONFIG_NS9750_UART) += ns9750_serial.o
 COBJS-$(CONFIG_OPENCORES_YANU) += opencores_yanu.o
diff --git a/drivers/serial/lpc32xx_hsuart.c b/drivers/serial/lpc32xx_hsuart.c
new file mode 100644 (file)
index 0000000..8ce3382
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/uart.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct hsuart_regs *hsuart = (struct hsuart_regs *)HS_UART_BASE;
+
+static void lpc32xx_hsuart_set_baudrate(void)
+{
+       u32 div;
+
+       /* UART rate = PERIPH_CLK / ((HSU_RATE + 1) x 14) */
+       div = (get_serial_clock() / 14 + gd->baudrate / 2) / gd->baudrate - 1;
+       if (div > 255)
+               div = 255;
+
+       writel(div, &hsuart->rate);
+}
+
+static int lpc32xx_hsuart_getc(void)
+{
+       while (!(readl(&hsuart->level) & HSUART_LEVEL_RX))
+               /* NOP */;
+
+       return readl(&hsuart->rx) & HSUART_RX_DATA;
+}
+
+static void lpc32xx_hsuart_putc(const char c)
+{
+       writel(c, &hsuart->tx);
+
+       /* Wait for character to be sent */
+       while (readl(&hsuart->level) & HSUART_LEVEL_TX)
+               /* NOP */;
+}
+
+static int lpc32xx_hsuart_tstc(void)
+{
+       if (readl(&hsuart->level) & HSUART_LEVEL_RX)
+               return 1;
+
+       return 0;
+}
+
+static void lpc32xx_hsuart_init(void)
+{
+       lpc32xx_hsuart_set_baudrate();
+
+       /* Disable hardware RTS and CTS flow control, set up RX and TX FIFO */
+       writel(HSUART_CTRL_TMO_16 | HSUART_CTRL_HSU_OFFSET(20) |
+              HSUART_CTRL_HSU_RX_TRIG_32 | HSUART_CTRL_HSU_TX_TRIG_0,
+              &hsuart->ctrl);
+}
+
+void serial_setbrg(void)
+{
+       return lpc32xx_hsuart_set_baudrate();
+}
+
+void serial_putc(const char c)
+{
+       lpc32xx_hsuart_putc(c);
+
+       /* If \n, also do \r */
+       if (c == '\n')
+               lpc32xx_hsuart_putc('\r');
+}
+
+int serial_getc(void)
+{
+       return lpc32xx_hsuart_getc();
+}
+
+void serial_puts(const char *s)
+{
+       while (*s)
+               serial_putc(*s++);
+}
+
+int serial_tstc(void)
+{
+       return lpc32xx_hsuart_tstc();
+}
+
+int serial_init(void)
+{
+       lpc32xx_hsuart_init();
+
+       return 0;
+}
index 4e6f14ee0722d102b2db33cdcb67ff1c02a1c272..7859536a6725569da9ad439b8f4d49e3a5672194 100644 (file)
@@ -34,6 +34,8 @@
 
 #define        MXS_SPI_MAX_TIMEOUT     1000000
 #define        MXS_SPI_PORT_OFFSET     0x2000
+#define MXS_SSP_CHIPSELECT_MASK                0x00300000
+#define MXS_SSP_CHIPSELECT_SHIFT       20
 
 struct mxs_spi_slave {
        struct spi_slave        slave;
@@ -51,14 +53,25 @@ void spi_init(void)
 {
 }
 
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+       /* MXS SPI: 4 ports and 3 chip selects maximum */
+       if (bus > 3 || cs > 2)
+               return 0;
+       else
+               return 1;
+}
+
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
                                  unsigned int max_hz, unsigned int mode)
 {
        struct mxs_spi_slave *mxs_slave;
        uint32_t addr;
+       struct mx28_ssp_regs *ssp_regs;
+       int reg;
 
-       if (bus > 3) {
-               printf("MXS SPI: Max bus number is 3\n");
+       if (!spi_cs_is_valid(bus, cs)) {
+               printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs);
                return NULL;
        }
 
@@ -73,7 +86,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
        mxs_slave->max_khz = max_hz / 1000;
        mxs_slave->mode = mode;
        mxs_slave->regs = (struct mx28_ssp_regs *)addr;
+       ssp_regs = mxs_slave->regs;
+
+       reg = readl(&ssp_regs->hw_ssp_ctrl0);
+       reg &= ~(MXS_SSP_CHIPSELECT_MASK);
+       reg |= cs << MXS_SSP_CHIPSELECT_SHIFT;
 
+       writel(reg, &ssp_regs->hw_ssp_ctrl0);
        return &mxs_slave->slave;
 }
 
index 5dec673c8ef69532f528229680c2848fb067f9bb..42c77fe333dce56609c3b663191c97475b70fbf3 100644 (file)
@@ -73,7 +73,8 @@ static void usbh1_internal_phy_clock_gate(int on)
 
 static void usbh1_power_config(void)
 {
-       struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
+       struct anatop_regs __iomem *anatop =
+               (struct anatop_regs __iomem *)ANATOP_BASE_ADDR;
        /*
         * Some phy and power's special controls for host1
         * 1. The external charger detector needs to be disabled
@@ -87,7 +88,7 @@ static void usbh1_power_config(void)
                     &anatop->usb2_chrg_detect);
 
        __raw_writel(ANADIG_USB2_PLL_480_CTRL_BYPASS,
-                    &anatop->usb2_pll_480_ctrl);
+                    &anatop->usb2_pll_480_ctrl_clr);
 
        __raw_writel(ANADIG_USB2_PLL_480_CTRL_ENABLE |
                     ANADIG_USB2_PLL_480_CTRL_POWER |
index 61dbccd53cd7a01f8f15a8fcf329428f14137921..45cbd18a00253ee65b4aacf79d520dc883a02b24 100644 (file)
@@ -125,11 +125,7 @@ int ehci_hcd_init(void)
        hcor = (struct ehci_hcor *)((uint32_t) hccr +
                        HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
        setbits_le32(&ehci->usbmode, CM_HOST);
-#ifdef CONFIG_MX31
-       setbits_le32(&ehci->control, USB_EN);
-
        __raw_writel(CONFIG_MXC_USB_PORTSC, &ehci->portsc);
-#endif
        mxc_set_usbcontrol(CONFIG_MXC_USB_PORT, CONFIG_MXC_USB_FLAGS);
 
        udelay(10000);
index 6252f6a25f716a689681378ee93c5bfb9ad2f8db..4fad20dd6e1f64c7661217e051ad347e100fbb40 100644 (file)
@@ -28,7 +28,11 @@ LIB  := $(obj)libvideo.o
 COBJS-$(CONFIG_ATI_RADEON_FB) += ati_radeon_fb.o videomodes.o
 COBJS-$(CONFIG_ATMEL_LCD) += atmel_lcdfb.o
 COBJS-$(CONFIG_CFB_CONSOLE) += cfb_console.o
+COBJS-$(CONFIG_EXYNOS_FB) += exynos_fb.o exynos_fimd.o
+COBJS-$(CONFIG_EXYNOS_MIPI_DSIM) += exynos_mipi_dsi.o exynos_mipi_dsi_common.o \
+                               exynos_mipi_dsi_lowlevel.o
 COBJS-$(CONFIG_FSL_DIU_FB) += fsl_diu_fb.o videomodes.o
+COBJS-$(CONFIG_S6E8AX0) += s6e8ax0.o
 COBJS-$(CONFIG_S6E63D6) += s6e63d6.o
 COBJS-$(CONFIG_SED156X) += sed156x.o
 COBJS-$(CONFIG_VIDEO_AMBA) += amba.o
diff --git a/drivers/video/exynos_fb.c b/drivers/video/exynos_fb.c
new file mode 100644 (file)
index 0000000..a1cf449
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <config.h>
+#include <common.h>
+#include <lcd.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/mipi_dsim.h>
+#include <asm/arch/system.h>
+
+#include "exynos_fb.h"
+
+int lcd_line_length;
+int lcd_color_fg;
+int lcd_color_bg;
+
+void *lcd_base;
+void *lcd_console_address;
+
+short console_col;
+short console_row;
+
+static unsigned int panel_width, panel_height;
+
+/* LCD Panel data */
+vidinfo_t panel_info;
+
+static void exynos_lcd_init_mem(void *lcdbase, vidinfo_t *vid)
+{
+       unsigned long palette_size;
+       unsigned int fb_size;
+
+       fb_size = vid->vl_row * vid->vl_col * (NBITS(vid->vl_bpix) >> 3);
+
+       lcd_base = lcdbase;
+
+       palette_size = NBITS(vid->vl_bpix) == 8 ? 256 : 16;
+
+       exynos_fimd_lcd_init_mem((unsigned long)lcd_base,
+                       (unsigned long)fb_size, palette_size);
+}
+
+static void exynos_lcd_init(vidinfo_t *vid)
+{
+       exynos_fimd_lcd_init(vid);
+}
+
+static void lcd_panel_on(vidinfo_t *vid)
+{
+       udelay(vid->init_delay);
+
+       if (vid->backlight_reset)
+               vid->backlight_reset();
+
+       if (vid->cfg_gpio)
+               vid->cfg_gpio();
+
+       if (vid->lcd_power_on)
+               vid->lcd_power_on();
+
+       udelay(vid->power_on_delay);
+
+       if (vid->reset_lcd) {
+               vid->reset_lcd();
+               udelay(vid->reset_delay);
+       }
+
+       if (vid->backlight_on)
+               vid->backlight_on(1);
+
+       if (vid->cfg_ldo)
+               vid->cfg_ldo();
+
+       if (vid->enable_ldo)
+               vid->enable_ldo(1);
+
+       if (vid->mipi_enabled)
+               exynos_mipi_dsi_init();
+}
+
+void lcd_ctrl_init(void *lcdbase)
+{
+       set_system_display_ctrl();
+       set_lcd_clk();
+
+       /* initialize parameters which is specific to panel. */
+       init_panel_info(&panel_info);
+
+       panel_width = panel_info.vl_width;
+       panel_height = panel_info.vl_height;
+
+       exynos_lcd_init_mem(lcdbase, &panel_info);
+
+       exynos_lcd_init(&panel_info);
+}
+
+void lcd_enable(void)
+{
+       lcd_panel_on(&panel_info);
+}
+
+/* dummy function */
+void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue)
+{
+       return;
+}
diff --git a/drivers/video/exynos_fb.h b/drivers/video/exynos_fb.h
new file mode 100644 (file)
index 0000000..66f5da6
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#ifndef _EXYNOS_FB_H_
+#define _EXYNOS_FB_H_
+
+#include <asm/arch/fb.h>
+
+#define MAX_CLOCK      (86 * 1000000)
+
+enum exynos_fb_rgb_mode_t {
+       MODE_RGB_P = 0,
+       MODE_BGR_P = 1,
+       MODE_RGB_S = 2,
+       MODE_BGR_S = 3,
+};
+
+enum exynos_cpu_auto_cmd_rate {
+       DISABLE_AUTO_FRM,
+       PER_TWO_FRM,
+       PER_FOUR_FRM,
+       PER_SIX_FRM,
+       PER_EIGHT_FRM,
+       PER_TEN_FRM,
+       PER_TWELVE_FRM,
+       PER_FOURTEEN_FRM,
+       PER_SIXTEEN_FRM,
+       PER_EIGHTEEN_FRM,
+       PER_TWENTY_FRM,
+       PER_TWENTY_TWO_FRM,
+       PER_TWENTY_FOUR_FRM,
+       PER_TWENTY_SIX_FRM,
+       PER_TWENTY_EIGHT_FRM,
+       PER_THIRTY_FRM,
+};
+
+void exynos_fimd_lcd_init_mem(unsigned long screen_base, unsigned long fb_size,
+       unsigned long palette_size);
+void exynos_fimd_lcd_init(vidinfo_t *vid);
+unsigned long exynos_fimd_calc_fbsize(void);
+
+#endif
diff --git a/drivers/video/exynos_fimd.c b/drivers/video/exynos_fimd.c
new file mode 100644 (file)
index 0000000..6416b90
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <config.h>
+#include <common.h>
+#include <asm/io.h>
+#include <lcd.h>
+#include <div64.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cpu.h>
+#include "exynos_fb.h"
+
+static unsigned long *lcd_base_addr;
+static vidinfo_t *pvid;
+
+void exynos_fimd_lcd_init_mem(u_long screen_base, u_long fb_size,
+               u_long palette_size)
+{
+       lcd_base_addr = (unsigned long *)screen_base;
+}
+
+static void exynos_fimd_set_dualrgb(unsigned int enabled)
+{
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+       unsigned int cfg = 0;
+
+       if (enabled) {
+               cfg = EXYNOS_DUALRGB_BYPASS_DUAL | EXYNOS_DUALRGB_LINESPLIT |
+                       EXYNOS_DUALRGB_VDEN_EN_ENABLE;
+
+               /* in case of Line Split mode, MAIN_CNT doesn't neet to set. */
+               cfg |= EXYNOS_DUALRGB_SUB_CNT(pvid->vl_col / 2) |
+                       EXYNOS_DUALRGB_MAIN_CNT(0);
+       }
+
+       writel(cfg, &fimd_ctrl->dualrgb);
+}
+
+static void exynos_fimd_set_par(unsigned int win_id)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       /* set window control */
+       cfg = readl((unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+
+       cfg &= ~(EXYNOS_WINCON_BITSWP_ENABLE | EXYNOS_WINCON_BYTESWP_ENABLE |
+               EXYNOS_WINCON_HAWSWP_ENABLE | EXYNOS_WINCON_WSWP_ENABLE |
+               EXYNOS_WINCON_BURSTLEN_MASK | EXYNOS_WINCON_BPPMODE_MASK |
+               EXYNOS_WINCON_INRGB_MASK | EXYNOS_WINCON_DATAPATH_MASK);
+
+       /* DATAPATH is DMA */
+       cfg |= EXYNOS_WINCON_DATAPATH_DMA;
+
+       /* bpp is 32 */
+       cfg |= EXYNOS_WINCON_WSWP_ENABLE;
+
+       /* dma burst is 16 */
+       cfg |= EXYNOS_WINCON_BURSTLEN_16WORD;
+
+       /* pixel format is unpacked RGB888 */
+       cfg |= EXYNOS_WINCON_BPPMODE_24BPP_888;
+
+       writel(cfg, (unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+
+       /* set window position to x=0, y=0*/
+       cfg = EXYNOS_VIDOSD_LEFT_X(0) | EXYNOS_VIDOSD_TOP_Y(0);
+       writel(cfg, (unsigned int)&fimd_ctrl->vidosd0a +
+                       EXYNOS_VIDOSD(win_id));
+
+       cfg = EXYNOS_VIDOSD_RIGHT_X(pvid->vl_col - 1) |
+               EXYNOS_VIDOSD_BOTTOM_Y(pvid->vl_row - 1);
+       writel(cfg, (unsigned int)&fimd_ctrl->vidosd0b +
+                       EXYNOS_VIDOSD(win_id));
+
+       /* set window size for window0*/
+       cfg = EXYNOS_VIDOSD_SIZE(pvid->vl_col * pvid->vl_row);
+       writel(cfg, (unsigned int)&fimd_ctrl->vidosd0c +
+                       EXYNOS_VIDOSD(win_id));
+}
+
+static void exynos_fimd_set_buffer_address(unsigned int win_id)
+{
+       unsigned long start_addr, end_addr;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       start_addr = (unsigned long)lcd_base_addr;
+       end_addr = start_addr + ((pvid->vl_col * (NBITS(pvid->vl_bpix) / 8)) *
+                               pvid->vl_row);
+
+       writel(start_addr, (unsigned int)&fimd_ctrl->vidw00add0b0 +
+                       EXYNOS_BUFFER_OFFSET(win_id));
+       writel(end_addr, (unsigned int)&fimd_ctrl->vidw00add1b0 +
+                       EXYNOS_BUFFER_OFFSET(win_id));
+}
+
+static void exynos_fimd_set_clock(vidinfo_t *pvid)
+{
+       unsigned int cfg = 0, div = 0, remainder, remainder_div;
+       unsigned long pixel_clock;
+       unsigned long long src_clock;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       if (pvid->dual_lcd_enabled) {
+               pixel_clock = pvid->vl_freq *
+                               (pvid->vl_hspw + pvid->vl_hfpd +
+                                pvid->vl_hbpd + pvid->vl_col / 2) *
+                               (pvid->vl_vspw + pvid->vl_vfpd +
+                                pvid->vl_vbpd + pvid->vl_row);
+       } else if (pvid->interface_mode == FIMD_CPU_INTERFACE) {
+               pixel_clock = pvid->vl_freq *
+                               pvid->vl_width * pvid->vl_height *
+                               (pvid->cs_setup + pvid->wr_setup +
+                                pvid->wr_act + pvid->wr_hold + 1);
+       } else {
+               pixel_clock = pvid->vl_freq *
+                               (pvid->vl_hspw + pvid->vl_hfpd +
+                                pvid->vl_hbpd + pvid->vl_col) *
+                               (pvid->vl_vspw + pvid->vl_vfpd +
+                                pvid->vl_vbpd + pvid->vl_row);
+       }
+
+       cfg = readl(&fimd_ctrl->vidcon0);
+       cfg &= ~(EXYNOS_VIDCON0_CLKSEL_MASK | EXYNOS_VIDCON0_CLKVALUP_MASK |
+               EXYNOS_VIDCON0_CLKVAL_F(0xFF) | EXYNOS_VIDCON0_VCLKEN_MASK |
+               EXYNOS_VIDCON0_CLKDIR_MASK);
+       cfg |= (EXYNOS_VIDCON0_CLKSEL_SCLK | EXYNOS_VIDCON0_CLKVALUP_ALWAYS |
+               EXYNOS_VIDCON0_VCLKEN_NORMAL | EXYNOS_VIDCON0_CLKDIR_DIVIDED);
+
+       if (pixel_clock > MAX_CLOCK)
+               pixel_clock = MAX_CLOCK;
+
+       src_clock = (unsigned long long) get_lcd_clk();
+
+       /* get quotient and remainder. */
+       remainder = do_div(src_clock, pixel_clock);
+       div = src_clock;
+
+       remainder *= 10;
+       remainder_div = remainder / pixel_clock;
+
+       /* round about one places of decimals. */
+       if (remainder_div >= 5)
+               div++;
+
+       /* in case of dual lcd mode. */
+       if (pvid->dual_lcd_enabled)
+               div--;
+
+       cfg |= EXYNOS_VIDCON0_CLKVAL_F(div - 1);
+       writel(cfg, &fimd_ctrl->vidcon0);
+}
+
+void exynos_set_trigger(void)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       cfg = readl(&fimd_ctrl->trigcon);
+
+       cfg |= (EXYNOS_I80SOFT_TRIG_EN | EXYNOS_I80START_TRIG);
+
+       writel(cfg, &fimd_ctrl->trigcon);
+}
+
+int exynos_is_i80_frame_done(void)
+{
+       unsigned int cfg = 0;
+       int status;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       cfg = readl(&fimd_ctrl->trigcon);
+
+       /* frame done func is valid only when TRIMODE[0] is set to 1. */
+       status = (cfg & EXYNOS_I80STATUS_TRIG_DONE) ==
+                       EXYNOS_I80STATUS_TRIG_DONE;
+
+       return status;
+}
+
+static void exynos_fimd_lcd_on(void)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       /* display on */
+       cfg = readl(&fimd_ctrl->vidcon0);
+       cfg |= (EXYNOS_VIDCON0_ENVID_ENABLE | EXYNOS_VIDCON0_ENVID_F_ENABLE);
+       writel(cfg, &fimd_ctrl->vidcon0);
+}
+
+static void exynos_fimd_window_on(unsigned int win_id)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       /* enable window */
+       cfg = readl((unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+       cfg |= EXYNOS_WINCON_ENWIN_ENABLE;
+       writel(cfg, (unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+
+       cfg = readl(&fimd_ctrl->winshmap);
+       cfg |= EXYNOS_WINSHMAP_CH_ENABLE(win_id);
+       writel(cfg, &fimd_ctrl->winshmap);
+}
+
+void exynos_fimd_lcd_off(void)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       cfg = readl(&fimd_ctrl->vidcon0);
+       cfg &= (EXYNOS_VIDCON0_ENVID_DISABLE | EXYNOS_VIDCON0_ENVID_F_DISABLE);
+       writel(cfg, &fimd_ctrl->vidcon0);
+}
+
+void exynos_fimd_window_off(unsigned int win_id)
+{
+       unsigned int cfg = 0;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       cfg = readl((unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+       cfg &= EXYNOS_WINCON_ENWIN_DISABLE;
+       writel(cfg, (unsigned int)&fimd_ctrl->wincon0 +
+                       EXYNOS_WINCON(win_id));
+
+       cfg = readl(&fimd_ctrl->winshmap);
+       cfg &= ~EXYNOS_WINSHMAP_CH_DISABLE(win_id);
+       writel(cfg, &fimd_ctrl->winshmap);
+}
+
+void exynos_fimd_lcd_init(vidinfo_t *vid)
+{
+       unsigned int cfg = 0, rgb_mode;
+       struct exynos4_fb *fimd_ctrl =
+               (struct exynos4_fb *)samsung_get_base_fimd();
+
+       /* store panel info to global variable */
+       pvid = vid;
+
+       rgb_mode = MODE_RGB_P;
+
+       if (vid->interface_mode == FIMD_RGB_INTERFACE) {
+               cfg |= EXYNOS_VIDCON0_VIDOUT_RGB;
+               writel(cfg, &fimd_ctrl->vidcon0);
+
+               cfg = readl(&fimd_ctrl->vidcon2);
+               cfg &= ~(EXYNOS_VIDCON2_WB_MASK |
+                       EXYNOS_VIDCON2_TVFORMATSEL_MASK |
+                       EXYNOS_VIDCON2_TVFORMATSEL_YUV_MASK);
+               cfg |= EXYNOS_VIDCON2_WB_DISABLE;
+               writel(cfg, &fimd_ctrl->vidcon2);
+
+               /* set polarity */
+               cfg = 0;
+               if (!pvid->vl_clkp)
+                       cfg |= EXYNOS_VIDCON1_IVCLK_RISING_EDGE;
+               if (!pvid->vl_hsp)
+                       cfg |= EXYNOS_VIDCON1_IHSYNC_INVERT;
+               if (!pvid->vl_vsp)
+                       cfg |= EXYNOS_VIDCON1_IVSYNC_INVERT;
+               if (!pvid->vl_dp)
+                       cfg |= EXYNOS_VIDCON1_IVDEN_INVERT;
+
+               writel(cfg, &fimd_ctrl->vidcon1);
+
+               /* set timing */
+               cfg = EXYNOS_VIDTCON0_VFPD(pvid->vl_vfpd - 1);
+               cfg |= EXYNOS_VIDTCON0_VBPD(pvid->vl_vbpd - 1);
+               cfg |= EXYNOS_VIDTCON0_VSPW(pvid->vl_vspw - 1);
+               writel(cfg, &fimd_ctrl->vidtcon0);
+
+               cfg = EXYNOS_VIDTCON1_HFPD(pvid->vl_hfpd - 1);
+               cfg |= EXYNOS_VIDTCON1_HBPD(pvid->vl_hbpd - 1);
+               cfg |= EXYNOS_VIDTCON1_HSPW(pvid->vl_hspw - 1);
+
+               writel(cfg, &fimd_ctrl->vidtcon1);
+
+               /* set lcd size */
+               cfg = EXYNOS_VIDTCON2_HOZVAL(pvid->vl_col - 1);
+               cfg |= EXYNOS_VIDTCON2_LINEVAL(pvid->vl_row - 1);
+
+               writel(cfg, &fimd_ctrl->vidtcon2);
+       }
+
+       /* set display mode */
+       cfg = readl(&fimd_ctrl->vidcon0);
+       cfg &= ~EXYNOS_VIDCON0_PNRMODE_MASK;
+       cfg |= (rgb_mode << EXYNOS_VIDCON0_PNRMODE_SHIFT);
+       writel(cfg, &fimd_ctrl->vidcon0);
+
+       /* set par */
+       exynos_fimd_set_par(pvid->win_id);
+
+       /* set memory address */
+       exynos_fimd_set_buffer_address(pvid->win_id);
+
+       /* set buffer size */
+       cfg = EXYNOS_VIDADDR_PAGEWIDTH(pvid->vl_col * NBITS(pvid->vl_bpix) / 8);
+       writel(cfg, (unsigned int)&fimd_ctrl->vidw00add2 +
+                                       EXYNOS_BUFFER_SIZE(pvid->win_id));
+
+       /* set clock */
+       exynos_fimd_set_clock(pvid);
+
+       /* set rgb mode to dual lcd. */
+       exynos_fimd_set_dualrgb(pvid->dual_lcd_enabled);
+
+       /* display on */
+       exynos_fimd_lcd_on();
+
+       /* window on */
+       exynos_fimd_window_on(pvid->win_id);
+}
+
+unsigned long exynos_fimd_calc_fbsize(void)
+{
+       return pvid->vl_col * pvid->vl_row * (NBITS(pvid->vl_bpix) / 8);
+}
diff --git a/drivers/video/exynos_mipi_dsi.c b/drivers/video/exynos_mipi_dsi.c
new file mode 100644 (file)
index 0000000..aee248c
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <linux/err.h>
+#include <asm/arch/dsim.h>
+#include <asm/arch/mipi_dsim.h>
+#include <asm/arch/power.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clk.h>
+
+#include "exynos_mipi_dsi_lowlevel.h"
+#include "exynos_mipi_dsi_common.h"
+
+#define master_to_driver(a)    (a->dsim_lcd_drv)
+#define master_to_device(a)    (a->dsim_lcd_dev)
+
+static struct exynos_platform_mipi_dsim *dsim_pd;
+
+struct mipi_dsim_ddi {
+       int                             bus_id;
+       struct list_head                list;
+       struct mipi_dsim_lcd_device     *dsim_lcd_dev;
+       struct mipi_dsim_lcd_driver     *dsim_lcd_drv;
+};
+
+static LIST_HEAD(dsim_ddi_list);
+static LIST_HEAD(dsim_lcd_dev_list);
+
+int exynos_mipi_dsi_register_lcd_device(struct mipi_dsim_lcd_device *lcd_dev)
+{
+       struct mipi_dsim_ddi *dsim_ddi;
+
+       if (!lcd_dev) {
+               debug("mipi_dsim_lcd_device is NULL.\n");
+               return -EFAULT;
+       }
+
+       if (!lcd_dev->name) {
+               debug("dsim_lcd_device name is NULL.\n");
+               return -EFAULT;
+       }
+
+       dsim_ddi = kzalloc(sizeof(struct mipi_dsim_ddi), GFP_KERNEL);
+       if (!dsim_ddi) {
+               debug("failed to allocate dsim_ddi object.\n");
+               return -EFAULT;
+       }
+
+       dsim_ddi->dsim_lcd_dev = lcd_dev;
+
+       list_add_tail(&dsim_ddi->list, &dsim_ddi_list);
+
+       return 0;
+}
+
+struct mipi_dsim_ddi
+       *exynos_mipi_dsi_find_lcd_device(struct mipi_dsim_lcd_driver *lcd_drv)
+{
+       struct mipi_dsim_ddi *dsim_ddi;
+       struct mipi_dsim_lcd_device *lcd_dev;
+
+       list_for_each_entry(dsim_ddi, &dsim_ddi_list, list) {
+               lcd_dev = dsim_ddi->dsim_lcd_dev;
+               if (!lcd_dev)
+                       continue;
+
+               if (lcd_drv->id >= 0) {
+                       if ((strcmp(lcd_drv->name, lcd_dev->name)) == 0 &&
+                                       lcd_drv->id == lcd_dev->id) {
+                               /**
+                                * bus_id would be used to identify
+                                * connected bus.
+                                */
+                               dsim_ddi->bus_id = lcd_dev->bus_id;
+
+                               return dsim_ddi;
+                       }
+               } else {
+                       if ((strcmp(lcd_drv->name, lcd_dev->name)) == 0) {
+                               /**
+                                * bus_id would be used to identify
+                                * connected bus.
+                                */
+                               dsim_ddi->bus_id = lcd_dev->bus_id;
+
+                               return dsim_ddi;
+                       }
+               }
+
+               kfree(dsim_ddi);
+               list_del(&dsim_ddi_list);
+       }
+
+       return NULL;
+}
+
+int exynos_mipi_dsi_register_lcd_driver(struct mipi_dsim_lcd_driver *lcd_drv)
+{
+       struct mipi_dsim_ddi *dsim_ddi;
+
+       if (!lcd_drv) {
+               debug("mipi_dsim_lcd_driver is NULL.\n");
+               return -EFAULT;
+       }
+
+       if (!lcd_drv->name) {
+               debug("dsim_lcd_driver name is NULL.\n");
+               return -EFAULT;
+       }
+
+       dsim_ddi = exynos_mipi_dsi_find_lcd_device(lcd_drv);
+       if (!dsim_ddi) {
+               debug("mipi_dsim_ddi object not found.\n");
+               return -EFAULT;
+       }
+
+       dsim_ddi->dsim_lcd_drv = lcd_drv;
+
+       debug("registered panel driver(%s) to mipi-dsi driver.\n",
+               lcd_drv->name);
+
+       return 0;
+
+}
+
+struct mipi_dsim_ddi
+       *exynos_mipi_dsi_bind_lcd_ddi(struct mipi_dsim_device *dsim,
+                       const char *name)
+{
+       struct mipi_dsim_ddi *dsim_ddi;
+       struct mipi_dsim_lcd_driver *lcd_drv;
+       struct mipi_dsim_lcd_device *lcd_dev;
+
+       list_for_each_entry(dsim_ddi, &dsim_ddi_list, list) {
+               lcd_drv = dsim_ddi->dsim_lcd_drv;
+               lcd_dev = dsim_ddi->dsim_lcd_dev;
+               if (!lcd_drv || !lcd_dev)
+                       continue;
+
+               debug("lcd_drv->id = %d, lcd_dev->id = %d\n",
+                                       lcd_drv->id, lcd_dev->id);
+
+               if ((strcmp(lcd_drv->name, name) == 0)) {
+                       lcd_dev->master = dsim;
+
+                       dsim->dsim_lcd_dev = lcd_dev;
+                       dsim->dsim_lcd_drv = lcd_drv;
+
+                       return dsim_ddi;
+               }
+       }
+
+       return NULL;
+}
+
+/* define MIPI-DSI Master operations. */
+static struct mipi_dsim_master_ops master_ops = {
+       .cmd_write                      = exynos_mipi_dsi_wr_data,
+       .get_dsim_frame_done            = exynos_mipi_dsi_get_frame_done_status,
+       .clear_dsim_frame_done          = exynos_mipi_dsi_clear_frame_done,
+};
+
+int exynos_mipi_dsi_init(void)
+{
+       struct mipi_dsim_device *dsim;
+       struct mipi_dsim_config *dsim_config;
+       struct mipi_dsim_ddi *dsim_ddi;
+
+       dsim = kzalloc(sizeof(struct mipi_dsim_device), GFP_KERNEL);
+       if (!dsim) {
+               debug("failed to allocate dsim object.\n");
+               return -EFAULT;
+       }
+
+       /* get mipi_dsim_config. */
+       dsim_config = dsim_pd->dsim_config;
+       if (dsim_config == NULL) {
+               debug("failed to get dsim config data.\n");
+               return -EFAULT;
+       }
+
+       dsim->pd = dsim_pd;
+       dsim->dsim_config = dsim_config;
+       dsim->master_ops = &master_ops;
+
+       /* bind lcd ddi matched with panel name. */
+       dsim_ddi = exynos_mipi_dsi_bind_lcd_ddi(dsim, dsim_pd->lcd_panel_name);
+       if (!dsim_ddi) {
+               debug("mipi_dsim_ddi object not found.\n");
+               return -ENOSYS;
+       }
+       if (dsim_pd->lcd_power)
+               dsim_pd->lcd_power();
+
+       if (dsim_pd->mipi_power)
+               dsim_pd->mipi_power();
+
+       /* phy_enable(unsigned int dev_index, unsigned int enable) */
+       if (dsim_pd->phy_enable)
+               dsim_pd->phy_enable(0, 1);
+
+       set_mipi_clk();
+
+       exynos_mipi_dsi_init_dsim(dsim);
+       exynos_mipi_dsi_init_link(dsim);
+       exynos_mipi_dsi_set_hs_enable(dsim);
+
+       /* set display timing. */
+       exynos_mipi_dsi_set_display_mode(dsim, dsim->dsim_config);
+
+       /* initialize mipi-dsi client(lcd panel). */
+       if (dsim_ddi->dsim_lcd_drv && dsim_ddi->dsim_lcd_drv->mipi_panel_init) {
+               dsim_ddi->dsim_lcd_drv->mipi_panel_init(dsim);
+               dsim_ddi->dsim_lcd_drv->mipi_display_on(dsim);
+       }
+
+       debug("mipi-dsi driver(%s mode) has been probed.\n",
+               (dsim_config->e_interface == DSIM_COMMAND) ?
+                       "CPU" : "RGB");
+
+       return 0;
+}
+
+void exynos_set_dsim_platform_data(struct exynos_platform_mipi_dsim *pd)
+{
+       if (pd == NULL) {
+               debug("pd is NULL\n");
+               return;
+       }
+
+       dsim_pd = pd;
+}
diff --git a/drivers/video/exynos_mipi_dsi_common.c b/drivers/video/exynos_mipi_dsi_common.c
new file mode 100644 (file)
index 0000000..6eeb464
--- /dev/null
@@ -0,0 +1,637 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <lcd.h>
+#include <linux/err.h>
+#include <asm/arch/dsim.h>
+#include <asm/arch/mipi_dsim.h>
+
+#include "exynos_mipi_dsi_lowlevel.h"
+
+#define MHZ                    (1000 * 1000)
+#define FIN_HZ                 (24 * MHZ)
+
+#define DFIN_PLL_MIN_HZ                (6 * MHZ)
+#define DFIN_PLL_MAX_HZ                (12 * MHZ)
+
+#define DFVCO_MIN_HZ           (500 * MHZ)
+#define DFVCO_MAX_HZ           (1000 * MHZ)
+
+#define TRY_GET_FIFO_TIMEOUT   (5000 * 2)
+
+/* MIPI-DSIM status types. */
+enum {
+       DSIM_STATE_INIT,        /* should be initialized. */
+       DSIM_STATE_STOP,        /* CPU and LCDC are LP mode. */
+       DSIM_STATE_HSCLKEN,     /* HS clock was enabled. */
+       DSIM_STATE_ULPS
+};
+
+/* define DSI lane types. */
+enum {
+       DSIM_LANE_CLOCK = (1 << 0),
+       DSIM_LANE_DATA0 = (1 << 1),
+       DSIM_LANE_DATA1 = (1 << 2),
+       DSIM_LANE_DATA2 = (1 << 3),
+       DSIM_LANE_DATA3 = (1 << 4)
+};
+
+static unsigned int dpll_table[15] = {
+       100, 120, 170, 220, 270,
+       320, 390, 450, 510, 560,
+       640, 690, 770, 870, 950
+};
+
+static void exynos_mipi_dsi_long_data_wr(struct mipi_dsim_device *dsim,
+               unsigned int data0, unsigned int data1)
+{
+       unsigned int data_cnt = 0, payload = 0;
+
+       /* in case that data count is more then 4 */
+       for (data_cnt = 0; data_cnt < data1; data_cnt += 4) {
+               /*
+                * after sending 4bytes per one time,
+                * send remainder data less then 4.
+                */
+               if ((data1 - data_cnt) < 4) {
+                       if ((data1 - data_cnt) == 3) {
+                               payload = *(u8 *)(data0 + data_cnt) |
+                                       (*(u8 *)(data0 + (data_cnt + 1))) << 8 |
+                                       (*(u8 *)(data0 + (data_cnt + 2))) << 16;
+                       debug("count = 3 payload = %x, %x %x %x\n",
+                               payload, *(u8 *)(data0 + data_cnt),
+                               *(u8 *)(data0 + (data_cnt + 1)),
+                               *(u8 *)(data0 + (data_cnt + 2)));
+                       } else if ((data1 - data_cnt) == 2) {
+                               payload = *(u8 *)(data0 + data_cnt) |
+                                       (*(u8 *)(data0 + (data_cnt + 1))) << 8;
+                       debug("count = 2 payload = %x, %x %x\n", payload,
+                               *(u8 *)(data0 + data_cnt),
+                               *(u8 *)(data0 + (data_cnt + 1)));
+                       } else if ((data1 - data_cnt) == 1) {
+                               payload = *(u8 *)(data0 + data_cnt);
+                       }
+               } else {
+                       /* send 4bytes per one time. */
+                       payload = *(u8 *)(data0 + data_cnt) |
+                               (*(u8 *)(data0 + (data_cnt + 1))) << 8 |
+                               (*(u8 *)(data0 + (data_cnt + 2))) << 16 |
+                               (*(u8 *)(data0 + (data_cnt + 3))) << 24;
+
+                       debug("count = 4 payload = %x, %x %x %x %x\n",
+                               payload, *(u8 *)(data0 + data_cnt),
+                               *(u8 *)(data0 + (data_cnt + 1)),
+                               *(u8 *)(data0 + (data_cnt + 2)),
+                               *(u8 *)(data0 + (data_cnt + 3)));
+
+               }
+               exynos_mipi_dsi_wr_tx_data(dsim, payload);
+       }
+}
+
+int exynos_mipi_dsi_wr_data(struct mipi_dsim_device *dsim, unsigned int data_id,
+       unsigned int data0, unsigned int data1)
+{
+       unsigned int timeout = TRY_GET_FIFO_TIMEOUT;
+       unsigned long delay_val, delay;
+       unsigned int check_rx_ack = 0;
+
+       if (dsim->state == DSIM_STATE_ULPS) {
+               debug("state is ULPS.\n");
+
+               return -EINVAL;
+       }
+
+       delay_val = MHZ / dsim->dsim_config->esc_clk;
+       delay = 10 * delay_val;
+
+       mdelay(delay);
+
+       /* only if transfer mode is LPDT, wait SFR becomes empty. */
+       if (dsim->state == DSIM_STATE_STOP) {
+               while (!(exynos_mipi_dsi_get_fifo_state(dsim) &
+                               SFR_HEADER_EMPTY)) {
+                       if ((timeout--) > 0)
+                               mdelay(1);
+                       else {
+                               debug("SRF header fifo is not empty.\n");
+                               return -EINVAL;
+                       }
+               }
+       }
+
+       switch (data_id) {
+       /* short packet types of packet types for command. */
+       case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
+       case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
+       case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
+       case MIPI_DSI_DCS_SHORT_WRITE:
+       case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
+       case MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE:
+               debug("data0 = %x data1 = %x\n",
+                               data0, data1);
+               exynos_mipi_dsi_wr_tx_header(dsim, data_id, data0, data1);
+               if (check_rx_ack) {
+                       /* process response func should be implemented */
+                       return 0;
+               } else {
+                       return -EINVAL;
+               }
+
+       /* general command */
+       case MIPI_DSI_COLOR_MODE_OFF:
+       case MIPI_DSI_COLOR_MODE_ON:
+       case MIPI_DSI_SHUTDOWN_PERIPHERAL:
+       case MIPI_DSI_TURN_ON_PERIPHERAL:
+               exynos_mipi_dsi_wr_tx_header(dsim, data_id, data0, data1);
+               if (check_rx_ack) {
+                       /* process response func should be implemented. */
+                       return 0;
+               } else {
+                       return -EINVAL;
+               }
+
+       /* packet types for video data */
+       case MIPI_DSI_V_SYNC_START:
+       case MIPI_DSI_V_SYNC_END:
+       case MIPI_DSI_H_SYNC_START:
+       case MIPI_DSI_H_SYNC_END:
+       case MIPI_DSI_END_OF_TRANSMISSION:
+               return 0;
+
+       /* short and response packet types for command */
+       case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
+       case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
+       case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
+       case MIPI_DSI_DCS_READ:
+               exynos_mipi_dsi_clear_all_interrupt(dsim);
+               exynos_mipi_dsi_wr_tx_header(dsim, data_id, data0, data1);
+               /* process response func should be implemented. */
+               return 0;
+
+       /* long packet type and null packet */
+       case MIPI_DSI_NULL_PACKET:
+       case MIPI_DSI_BLANKING_PACKET:
+               return 0;
+       case MIPI_DSI_GENERIC_LONG_WRITE:
+       case MIPI_DSI_DCS_LONG_WRITE:
+       {
+               unsigned int data_cnt = 0, payload = 0;
+
+               /* if data count is less then 4, then send 3bytes data.  */
+               if (data1 < 4) {
+                       payload = *(u8 *)(data0) |
+                               *(u8 *)(data0 + 1) << 8 |
+                               *(u8 *)(data0 + 2) << 16;
+
+                       exynos_mipi_dsi_wr_tx_data(dsim, payload);
+
+                       debug("count = %d payload = %x,%x %x %x\n",
+                               data1, payload,
+                               *(u8 *)(data0 + data_cnt),
+                               *(u8 *)(data0 + (data_cnt + 1)),
+                               *(u8 *)(data0 + (data_cnt + 2)));
+               } else {
+                       /* in case that data count is more then 4 */
+                       exynos_mipi_dsi_long_data_wr(dsim, data0, data1);
+               }
+
+               /* put data into header fifo */
+               exynos_mipi_dsi_wr_tx_header(dsim, data_id, data1 & 0xff,
+                       (data1 & 0xff00) >> 8);
+
+       }
+       if (check_rx_ack)
+               /* process response func should be implemented. */
+               return 0;
+       else
+               return -EINVAL;
+
+       /* packet typo for video data */
+       case MIPI_DSI_PACKED_PIXEL_STREAM_16:
+       case MIPI_DSI_PACKED_PIXEL_STREAM_18:
+       case MIPI_DSI_PIXEL_STREAM_3BYTE_18:
+       case MIPI_DSI_PACKED_PIXEL_STREAM_24:
+               if (check_rx_ack) {
+                       /* process response func should be implemented. */
+                       return 0;
+               } else {
+                       return -EINVAL;
+               }
+       default:
+               debug("data id %x is not supported current DSI spec.\n",
+                       data_id);
+
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int exynos_mipi_dsi_pll_on(struct mipi_dsim_device *dsim, unsigned int enable)
+{
+       int sw_timeout;
+
+       if (enable) {
+               sw_timeout = 1000;
+
+               exynos_mipi_dsi_clear_interrupt(dsim);
+               exynos_mipi_dsi_enable_pll(dsim, 1);
+               while (1) {
+                       sw_timeout--;
+                       if (exynos_mipi_dsi_is_pll_stable(dsim))
+                               return 0;
+                       if (sw_timeout == 0)
+                               return -EINVAL;
+               }
+       } else
+               exynos_mipi_dsi_enable_pll(dsim, 0);
+
+       return 0;
+}
+
+unsigned long exynos_mipi_dsi_change_pll(struct mipi_dsim_device *dsim,
+       unsigned int pre_divider, unsigned int main_divider,
+       unsigned int scaler)
+{
+       unsigned long dfin_pll, dfvco, dpll_out;
+       unsigned int i, freq_band = 0xf;
+
+       dfin_pll = (FIN_HZ / pre_divider);
+
+       /******************************************************
+        *      Serial Clock(=ByteClk X 8)      FreqBand[3:0] *
+        ******************************************************
+        *      ~ 99.99 MHz                     0000
+        *      100 ~ 119.99 MHz                0001
+        *      120 ~ 159.99 MHz                0010
+        *      160 ~ 199.99 MHz                0011
+        *      200 ~ 239.99 MHz                0100
+        *      140 ~ 319.99 MHz                0101
+        *      320 ~ 389.99 MHz                0110
+        *      390 ~ 449.99 MHz                0111
+        *      450 ~ 509.99 MHz                1000
+        *      510 ~ 559.99 MHz                1001
+        *      560 ~ 639.99 MHz                1010
+        *      640 ~ 689.99 MHz                1011
+        *      690 ~ 769.99 MHz                1100
+        *      770 ~ 869.99 MHz                1101
+        *      870 ~ 949.99 MHz                1110
+        *      950 ~ 1000 MHz                  1111
+        ******************************************************/
+       if (dfin_pll < DFIN_PLL_MIN_HZ || dfin_pll > DFIN_PLL_MAX_HZ) {
+               debug("fin_pll range should be 6MHz ~ 12MHz\n");
+               exynos_mipi_dsi_enable_afc(dsim, 0, 0);
+       } else {
+               if (dfin_pll < 7 * MHZ)
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x1);
+               else if (dfin_pll < 8 * MHZ)
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x0);
+               else if (dfin_pll < 9 * MHZ)
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x3);
+               else if (dfin_pll < 10 * MHZ)
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x2);
+               else if (dfin_pll < 11 * MHZ)
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x5);
+               else
+                       exynos_mipi_dsi_enable_afc(dsim, 1, 0x4);
+       }
+
+       dfvco = dfin_pll * main_divider;
+       debug("dfvco = %lu, dfin_pll = %lu, main_divider = %d\n",
+                               dfvco, dfin_pll, main_divider);
+       if (dfvco < DFVCO_MIN_HZ || dfvco > DFVCO_MAX_HZ)
+               debug("fvco range should be 500MHz ~ 1000MHz\n");
+
+       dpll_out = dfvco / (1 << scaler);
+       debug("dpll_out = %lu, dfvco = %lu, scaler = %d\n",
+               dpll_out, dfvco, scaler);
+
+       for (i = 0; i < ARRAY_SIZE(dpll_table); i++) {
+               if (dpll_out < dpll_table[i] * MHZ) {
+                       freq_band = i;
+                       break;
+               }
+       }
+
+       debug("freq_band = %d\n", freq_band);
+
+       exynos_mipi_dsi_pll_freq(dsim, pre_divider, main_divider, scaler);
+
+       exynos_mipi_dsi_hs_zero_ctrl(dsim, 0);
+       exynos_mipi_dsi_prep_ctrl(dsim, 0);
+
+       /* Freq Band */
+       exynos_mipi_dsi_pll_freq_band(dsim, freq_band);
+
+       /* Stable time */
+       exynos_mipi_dsi_pll_stable_time(dsim,
+                               dsim->dsim_config->pll_stable_time);
+
+       /* Enable PLL */
+       debug("FOUT of mipi dphy pll is %luMHz\n",
+               (dpll_out / MHZ));
+
+       return dpll_out;
+}
+
+int exynos_mipi_dsi_set_clock(struct mipi_dsim_device *dsim,
+       unsigned int byte_clk_sel, unsigned int enable)
+{
+       unsigned int esc_div;
+       unsigned long esc_clk_error_rate;
+       unsigned long hs_clk = 0, byte_clk = 0, escape_clk = 0;
+
+       if (enable) {
+               dsim->e_clk_src = byte_clk_sel;
+
+               /* Escape mode clock and byte clock source */
+               exynos_mipi_dsi_set_byte_clock_src(dsim, byte_clk_sel);
+
+               /* DPHY, DSIM Link : D-PHY clock out */
+               if (byte_clk_sel == DSIM_PLL_OUT_DIV8) {
+                       hs_clk = exynos_mipi_dsi_change_pll(dsim,
+                               dsim->dsim_config->p, dsim->dsim_config->m,
+                               dsim->dsim_config->s);
+                       if (hs_clk == 0) {
+                               debug("failed to get hs clock.\n");
+                               return -EINVAL;
+                       }
+
+                       byte_clk = hs_clk / 8;
+                       exynos_mipi_dsi_enable_pll_bypass(dsim, 0);
+                       exynos_mipi_dsi_pll_on(dsim, 1);
+               /* DPHY : D-PHY clock out, DSIM link : external clock out */
+               } else if (byte_clk_sel == DSIM_EXT_CLK_DIV8)
+                       debug("not support EXT CLK source for MIPI DSIM\n");
+               else if (byte_clk_sel == DSIM_EXT_CLK_BYPASS)
+                       debug("not support EXT CLK source for MIPI DSIM\n");
+
+               /* escape clock divider */
+               esc_div = byte_clk / (dsim->dsim_config->esc_clk);
+               debug("esc_div = %d, byte_clk = %lu, esc_clk = %lu\n",
+                       esc_div, byte_clk, dsim->dsim_config->esc_clk);
+               if ((byte_clk / esc_div) >= (20 * MHZ) ||
+                       (byte_clk / esc_div) > dsim->dsim_config->esc_clk)
+                       esc_div += 1;
+
+               escape_clk = byte_clk / esc_div;
+               debug("escape_clk = %lu, byte_clk = %lu, esc_div = %d\n",
+                       escape_clk, byte_clk, esc_div);
+
+               /* enable escape clock. */
+               exynos_mipi_dsi_enable_byte_clock(dsim, 1);
+
+               /* enable byte clk and escape clock */
+               exynos_mipi_dsi_set_esc_clk_prs(dsim, 1, esc_div);
+               /* escape clock on lane */
+               exynos_mipi_dsi_enable_esc_clk_on_lane(dsim,
+                       (DSIM_LANE_CLOCK | dsim->data_lane), 1);
+
+               debug("byte clock is %luMHz\n",
+                       (byte_clk / MHZ));
+               debug("escape clock that user's need is %lu\n",
+                       (dsim->dsim_config->esc_clk / MHZ));
+               debug("escape clock divider is %x\n", esc_div);
+               debug("escape clock is %luMHz\n",
+                       ((byte_clk / esc_div) / MHZ));
+
+               if ((byte_clk / esc_div) > escape_clk) {
+                       esc_clk_error_rate = escape_clk /
+                               (byte_clk / esc_div);
+                       debug("error rate is %lu over.\n",
+                               (esc_clk_error_rate / 100));
+               } else if ((byte_clk / esc_div) < (escape_clk)) {
+                       esc_clk_error_rate = (byte_clk / esc_div) /
+                               escape_clk;
+                       debug("error rate is %lu under.\n",
+                               (esc_clk_error_rate / 100));
+               }
+       } else {
+               exynos_mipi_dsi_enable_esc_clk_on_lane(dsim,
+                       (DSIM_LANE_CLOCK | dsim->data_lane), 0);
+               exynos_mipi_dsi_set_esc_clk_prs(dsim, 0, 0);
+
+               /* disable escape clock. */
+               exynos_mipi_dsi_enable_byte_clock(dsim, 0);
+
+               if (byte_clk_sel == DSIM_PLL_OUT_DIV8)
+                       exynos_mipi_dsi_pll_on(dsim, 0);
+       }
+
+       return 0;
+}
+
+int exynos_mipi_dsi_init_dsim(struct mipi_dsim_device *dsim)
+{
+       dsim->state = DSIM_STATE_INIT;
+
+       switch (dsim->dsim_config->e_no_data_lane) {
+       case DSIM_DATA_LANE_1:
+               dsim->data_lane = DSIM_LANE_DATA0;
+               break;
+       case DSIM_DATA_LANE_2:
+               dsim->data_lane = DSIM_LANE_DATA0 | DSIM_LANE_DATA1;
+               break;
+       case DSIM_DATA_LANE_3:
+               dsim->data_lane = DSIM_LANE_DATA0 | DSIM_LANE_DATA1 |
+                       DSIM_LANE_DATA2;
+               break;
+       case DSIM_DATA_LANE_4:
+               dsim->data_lane = DSIM_LANE_DATA0 | DSIM_LANE_DATA1 |
+                       DSIM_LANE_DATA2 | DSIM_LANE_DATA3;
+               break;
+       default:
+               debug("data lane is invalid.\n");
+               return -EINVAL;
+       };
+
+       exynos_mipi_dsi_sw_reset(dsim);
+       exynos_mipi_dsi_dp_dn_swap(dsim, 0);
+
+       return 0;
+}
+
+int exynos_mipi_dsi_enable_frame_done_int(struct mipi_dsim_device *dsim,
+       unsigned int enable)
+{
+       /* enable only frame done interrupt */
+       exynos_mipi_dsi_set_interrupt_mask(dsim, INTMSK_FRAME_DONE, enable);
+
+       return 0;
+}
+
+static void convert_to_fb_videomode(struct fb_videomode *mode1,
+                               vidinfo_t *mode2)
+{
+       mode1->xres = mode2->vl_width;
+       mode1->yres = mode2->vl_height;
+       mode1->upper_margin = mode2->vl_vfpd;
+       mode1->lower_margin = mode2->vl_vbpd;
+       mode1->left_margin = mode2->vl_hfpd;
+       mode1->right_margin = mode2->vl_hbpd;
+       mode1->vsync_len = mode2->vl_vspw;
+       mode1->hsync_len = mode2->vl_hspw;
+}
+
+int exynos_mipi_dsi_set_display_mode(struct mipi_dsim_device *dsim,
+       struct mipi_dsim_config *dsim_config)
+{
+       struct exynos_platform_mipi_dsim *dsim_pd;
+       struct fb_videomode lcd_video;
+       vidinfo_t *vid;
+
+       dsim_pd = (struct exynos_platform_mipi_dsim *)dsim->pd;
+       vid = (vidinfo_t *)dsim_pd->lcd_panel_info;
+
+       convert_to_fb_videomode(&lcd_video, vid);
+
+       /* in case of VIDEO MODE (RGB INTERFACE), it sets polarities. */
+       if (dsim->dsim_config->e_interface == (u32) DSIM_VIDEO) {
+               if (dsim->dsim_config->auto_vertical_cnt == 0) {
+                       exynos_mipi_dsi_set_main_disp_vporch(dsim,
+                               vid->vl_cmd_allow_len,
+                               lcd_video.upper_margin,
+                               lcd_video.lower_margin);
+                       exynos_mipi_dsi_set_main_disp_hporch(dsim,
+                               lcd_video.left_margin,
+                               lcd_video.right_margin);
+                       exynos_mipi_dsi_set_main_disp_sync_area(dsim,
+                               lcd_video.vsync_len,
+                               lcd_video.hsync_len);
+               }
+       }
+
+       exynos_mipi_dsi_set_main_disp_resol(dsim, lcd_video.xres,
+                       lcd_video.yres);
+
+       exynos_mipi_dsi_display_config(dsim, dsim->dsim_config);
+
+       debug("lcd panel ==> width = %d, height = %d\n",
+                       lcd_video.xres, lcd_video.yres);
+
+       return 0;
+}
+
+int exynos_mipi_dsi_init_link(struct mipi_dsim_device *dsim)
+{
+       unsigned int time_out = 100;
+
+       switch (dsim->state) {
+       case DSIM_STATE_INIT:
+               exynos_mipi_dsi_init_fifo_pointer(dsim, 0x1f);
+
+               /* dsi configuration */
+               exynos_mipi_dsi_init_config(dsim);
+               exynos_mipi_dsi_enable_lane(dsim, DSIM_LANE_CLOCK, 1);
+               exynos_mipi_dsi_enable_lane(dsim, dsim->data_lane, 1);
+
+               /* set clock configuration */
+               exynos_mipi_dsi_set_clock(dsim,
+                                       dsim->dsim_config->e_byte_clk, 1);
+
+               /* check clock and data lane state are stop state */
+               while (!(exynos_mipi_dsi_is_lane_state(dsim))) {
+                       time_out--;
+                       if (time_out == 0) {
+                               debug("DSI Master is not stop state.\n");
+                               debug("Check initialization process\n");
+
+                               return -EINVAL;
+                       }
+               }
+
+               dsim->state = DSIM_STATE_STOP;
+
+               /* BTA sequence counters */
+               exynos_mipi_dsi_set_stop_state_counter(dsim,
+                       dsim->dsim_config->stop_holding_cnt);
+               exynos_mipi_dsi_set_bta_timeout(dsim,
+                       dsim->dsim_config->bta_timeout);
+               exynos_mipi_dsi_set_lpdr_timeout(dsim,
+                       dsim->dsim_config->rx_timeout);
+
+               return 0;
+       default:
+               debug("DSI Master is already init.\n");
+               return 0;
+       }
+
+       return 0;
+}
+
+int exynos_mipi_dsi_set_hs_enable(struct mipi_dsim_device *dsim)
+{
+       if (dsim->state == DSIM_STATE_STOP) {
+               if (dsim->e_clk_src != DSIM_EXT_CLK_BYPASS) {
+                       dsim->state = DSIM_STATE_HSCLKEN;
+
+                        /* set LCDC and CPU transfer mode to HS. */
+                       exynos_mipi_dsi_set_lcdc_transfer_mode(dsim, 0);
+                       exynos_mipi_dsi_set_cpu_transfer_mode(dsim, 0);
+
+                       exynos_mipi_dsi_enable_hs_clock(dsim, 1);
+
+                       return 0;
+               } else
+                       debug("clock source is external bypass.\n");
+       } else
+               debug("DSIM is not stop state.\n");
+
+       return 0;
+}
+
+int exynos_mipi_dsi_set_data_transfer_mode(struct mipi_dsim_device *dsim,
+               unsigned int mode)
+{
+       if (mode) {
+               if (dsim->state != DSIM_STATE_HSCLKEN) {
+                       debug("HS Clock lane is not enabled.\n");
+                       return -EINVAL;
+               }
+
+               exynos_mipi_dsi_set_lcdc_transfer_mode(dsim, 0);
+       } else {
+               if (dsim->state == DSIM_STATE_INIT || dsim->state ==
+                       DSIM_STATE_ULPS) {
+                       debug("DSI Master is not STOP or HSDT state.\n");
+                       return -EINVAL;
+               }
+
+               exynos_mipi_dsi_set_cpu_transfer_mode(dsim, 0);
+       }
+
+       return 0;
+}
+
+int exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device *dsim)
+{
+       return _exynos_mipi_dsi_get_frame_done_status(dsim);
+}
+
+int exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
+{
+       _exynos_mipi_dsi_clear_frame_done(dsim);
+
+       return 0;
+}
diff --git a/drivers/video/exynos_mipi_dsi_common.h b/drivers/video/exynos_mipi_dsi_common.h
new file mode 100644 (file)
index 0000000..4d80679
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <linux/fb.h>
+
+#ifndef _EXYNOS_MIPI_DSI_COMMON_H
+#define _EXYNOS_MIPI_DSI_COMMON_H
+
+int exynos_mipi_dsi_wr_data(struct mipi_dsim_device *dsim, unsigned int data_id,
+       unsigned int data0, unsigned int data1);
+int exynos_mipi_dsi_pll_on(struct mipi_dsim_device *dsim, unsigned int enable);
+unsigned long exynos_mipi_dsi_change_pll(struct mipi_dsim_device *dsim,
+       unsigned int pre_divider, unsigned int main_divider,
+       unsigned int scaler);
+int exynos_mipi_dsi_set_clock(struct mipi_dsim_device *dsim,
+       unsigned int byte_clk_sel, unsigned int enable);
+int exynos_mipi_dsi_init_dsim(struct mipi_dsim_device *dsim);
+int exynos_mipi_dsi_set_display_mode(struct mipi_dsim_device *dsim,
+                       struct mipi_dsim_config *dsim_info);
+int exynos_mipi_dsi_init_link(struct mipi_dsim_device *dsim);
+int exynos_mipi_dsi_set_hs_enable(struct mipi_dsim_device *dsim);
+int exynos_mipi_dsi_set_data_transfer_mode(struct mipi_dsim_device *dsim,
+               unsigned int mode);
+int exynos_mipi_dsi_enable_frame_done_int(struct mipi_dsim_device *dsim,
+       unsigned int enable);
+int exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device *dsim);
+int exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim);
+
+#endif /* _EXYNOS_MIPI_DSI_COMMON_H */
diff --git a/drivers/video/exynos_mipi_dsi_lowlevel.c b/drivers/video/exynos_mipi_dsi_lowlevel.c
new file mode 100644 (file)
index 0000000..d61b773
--- /dev/null
@@ -0,0 +1,652 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/arch/dsim.h>
+#include <asm/arch/mipi_dsim.h>
+#include <asm/arch/power.h>
+#include <asm/arch/cpu.h>
+
+#include "exynos_mipi_dsi_lowlevel.h"
+#include "exynos_mipi_dsi_common.h"
+
+void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim)
+{
+       unsigned int reg;
+
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = readl(&mipi_dsim->swrst);
+
+       reg |= DSIM_FUNCRST;
+
+       writel(reg, &mipi_dsim->swrst);
+}
+
+void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim)
+{
+       unsigned int reg = 0;
+
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = readl(&mipi_dsim->swrst);
+
+       reg |= DSIM_SWRST;
+       reg |= DSIM_FUNCRST;
+
+       writel(reg, &mipi_dsim->swrst);
+}
+
+void exynos_mipi_dsi_sw_release(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->intsrc);
+
+       reg |= INTSRC_SWRST_RELEASE;
+
+       writel(reg, &mipi_dsim->intsrc);
+}
+
+void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
+               unsigned int mode, unsigned int mask)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->intmsk);
+
+       if (mask)
+               reg |= mode;
+       else
+               reg &= ~mode;
+
+       writel(reg, &mipi_dsim->intmsk);
+}
+
+void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
+               unsigned int cfg)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = readl(&mipi_dsim->fifoctrl);
+
+       writel(reg & ~(cfg), &mipi_dsim->fifoctrl);
+       udelay(10 * 1000);
+       reg |= cfg;
+
+       writel(reg, &mipi_dsim->fifoctrl);
+}
+
+/*
+ * this function set PLL P, M and S value in D-PHY
+ */
+void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
+               unsigned int value)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       writel(DSIM_AFC_CTL(value), &mipi_dsim->phyacchr);
+}
+
+void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
+       unsigned int width_resol, unsigned int height_resol)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       /* standby should be set after configuration so set to not ready*/
+       reg = (readl(&mipi_dsim->mdresol)) & ~(DSIM_MAIN_STAND_BY);
+       writel(reg, &mipi_dsim->mdresol);
+
+       /* reset resolution */
+       reg &= ~(DSIM_MAIN_VRESOL(0x7ff) | DSIM_MAIN_HRESOL(0x7ff));
+       reg |= DSIM_MAIN_VRESOL(height_resol) | DSIM_MAIN_HRESOL(width_resol);
+
+       reg |= DSIM_MAIN_STAND_BY;
+       writel(reg, &mipi_dsim->mdresol);
+}
+
+void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
+       unsigned int cmd_allow, unsigned int vfront, unsigned int vback)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = (readl(&mipi_dsim->mvporch)) &
+               ~((DSIM_CMD_ALLOW_MASK) | (DSIM_STABLE_VFP_MASK) |
+               (DSIM_MAIN_VBP_MASK));
+
+       reg |= ((cmd_allow & 0xf) << DSIM_CMD_ALLOW_SHIFT) |
+               ((vfront & 0x7ff) << DSIM_STABLE_VFP_SHIFT) |
+               ((vback & 0x7ff) << DSIM_MAIN_VBP_SHIFT);
+
+       writel(reg, &mipi_dsim->mvporch);
+}
+
+void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
+       unsigned int front, unsigned int back)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = (readl(&mipi_dsim->mhporch)) &
+               ~((DSIM_MAIN_HFP_MASK) | (DSIM_MAIN_HBP_MASK));
+
+       reg |= (front << DSIM_MAIN_HFP_SHIFT) | (back << DSIM_MAIN_HBP_SHIFT);
+
+       writel(reg, &mipi_dsim->mhporch);
+}
+
+void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
+       unsigned int vert, unsigned int hori)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = (readl(&mipi_dsim->msync)) &
+               ~((DSIM_MAIN_VSA_MASK) | (DSIM_MAIN_HSA_MASK));
+
+       reg |= ((vert & 0x3ff) << DSIM_MAIN_VSA_SHIFT) |
+               (hori << DSIM_MAIN_HSA_SHIFT);
+
+       writel(reg, &mipi_dsim->msync);
+}
+
+void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
+       unsigned int vert, unsigned int hori)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = (readl(&mipi_dsim->sdresol)) &
+               ~(DSIM_SUB_STANDY_MASK);
+
+       writel(reg, &mipi_dsim->sdresol);
+
+       reg &= ~(DSIM_SUB_VRESOL_MASK) | ~(DSIM_SUB_HRESOL_MASK);
+       reg |= ((vert & 0x7ff) << DSIM_SUB_VRESOL_SHIFT) |
+               ((hori & 0x7ff) << DSIM_SUB_HRESOL_SHIFT);
+       writel(reg, &mipi_dsim->sdresol);
+
+       /* DSIM STANDBY */
+       reg |= (1 << DSIM_SUB_STANDY_SHIFT);
+       writel(reg, &mipi_dsim->sdresol);
+}
+
+void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim)
+{
+       struct mipi_dsim_config *dsim_config = dsim->dsim_config;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int cfg = (readl(&mipi_dsim->config)) &
+               ~((1 << DSIM_EOT_PACKET_SHIFT) |
+               (0x1f << DSIM_HSA_MODE_SHIFT) |
+               (0x3 << DSIM_NUM_OF_DATALANE_SHIFT));
+
+       cfg |=  (dsim_config->auto_flush << DSIM_AUTO_FLUSH_SHIFT) |
+               (dsim_config->eot_disable << DSIM_EOT_PACKET_SHIFT) |
+               (dsim_config->auto_vertical_cnt << DSIM_AUTO_MODE_SHIFT) |
+               (dsim_config->hse << DSIM_HSE_MODE_SHIFT) |
+               (dsim_config->hfp << DSIM_HFP_MODE_SHIFT) |
+               (dsim_config->hbp << DSIM_HBP_MODE_SHIFT) |
+               (dsim_config->hsa << DSIM_HSA_MODE_SHIFT) |
+               (dsim_config->e_no_data_lane << DSIM_NUM_OF_DATALANE_SHIFT);
+
+       writel(cfg, &mipi_dsim->config);
+}
+
+void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
+                               struct mipi_dsim_config *dsim_config)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       u32 reg = (readl(&mipi_dsim->config)) &
+               ~((0x3 << DSIM_BURST_MODE_SHIFT) | (1 << DSIM_VIDEO_MODE_SHIFT)
+               | (0x3 << DSIM_MAINVC_SHIFT) | (0x7 << DSIM_MAINPIX_SHIFT)
+               | (0x3 << DSIM_SUBVC_SHIFT) | (0x7 << DSIM_SUBPIX_SHIFT));
+
+       if (dsim_config->e_interface == DSIM_VIDEO)
+               reg |= (1 << DSIM_VIDEO_MODE_SHIFT);
+       else if (dsim_config->e_interface == DSIM_COMMAND)
+               reg &= ~(1 << DSIM_VIDEO_MODE_SHIFT);
+       else {
+               printf("unknown lcd type.\n");
+               return;
+       }
+
+       /* main lcd */
+       reg |= ((u8) (dsim_config->e_burst_mode) & 0x3) << DSIM_BURST_MODE_SHIFT
+       | ((u8) (dsim_config->e_virtual_ch) & 0x3) << DSIM_MAINVC_SHIFT
+       | ((u8) (dsim_config->e_pixel_format) & 0x7) << DSIM_MAINPIX_SHIFT;
+
+       writel(reg, &mipi_dsim->config);
+}
+
+void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim,
+                       unsigned int lane, unsigned int enable)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = readl(&mipi_dsim->config);
+
+       if (enable)
+               reg |= DSIM_LANE_ENx(lane);
+       else
+               reg &= ~DSIM_LANE_ENx(lane);
+
+       writel(reg, &mipi_dsim->config);
+}
+
+void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
+       unsigned int count)
+{
+       unsigned int cfg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       /* get the data lane number. */
+       cfg = DSIM_NUM_OF_DATA_LANE(count);
+
+       writel(cfg, &mipi_dsim->config);
+}
+
+void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim,
+                       unsigned int enable, unsigned int afc_code)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->phyacchr);
+
+       reg = 0;
+
+       if (enable) {
+               reg |= DSIM_AFC_EN;
+               reg &= ~(0x7 << DSIM_AFC_CTL_SHIFT);
+               reg |= DSIM_AFC_CTL(afc_code);
+       } else
+               reg &= ~DSIM_AFC_EN;
+
+       writel(reg, &mipi_dsim->phyacchr);
+}
+
+void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
+       unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
+               ~(DSIM_PLL_BYPASS_EXTERNAL);
+
+       reg |= enable << DSIM_PLL_BYPASS_SHIFT;
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
+               unsigned int freq_band)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
+               ~(0x1f << DSIM_FREQ_BAND_SHIFT);
+
+       reg |= ((freq_band & 0x1f) << DSIM_FREQ_BAND_SHIFT);
+
+       writel(reg, &mipi_dsim->pllctrl);
+}
+
+void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
+               unsigned int pre_divider, unsigned int main_divider,
+               unsigned int scaler)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
+               ~(0x7ffff << 1);
+
+       reg |= ((pre_divider & 0x3f) << DSIM_PREDIV_SHIFT) |
+               ((main_divider & 0x1ff) << DSIM_MAIN_SHIFT) |
+               ((scaler & 0x7) << DSIM_SCALER_SHIFT);
+
+       writel(reg, &mipi_dsim->pllctrl);
+}
+
+void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
+       unsigned int lock_time)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       writel(lock_time, &mipi_dsim->plltmr);
+}
+
+void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim,
+                               unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
+               ~(0x1 << DSIM_PLL_EN_SHIFT);
+
+       reg |= ((enable & 0x1) << DSIM_PLL_EN_SHIFT);
+
+       writel(reg, &mipi_dsim->pllctrl);
+}
+
+void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
+               unsigned int src)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
+               ~(0x3 << DSIM_BYTE_CLK_SRC_SHIFT);
+
+       reg |= ((unsigned int) src) << DSIM_BYTE_CLK_SRC_SHIFT;
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
+               unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
+               ~(1 << DSIM_BYTE_CLKEN_SHIFT);
+
+       reg |= enable << DSIM_BYTE_CLKEN_SHIFT;
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
+               unsigned int enable, unsigned int prs_val)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
+               ~((1 << DSIM_ESC_CLKEN_SHIFT) | (0xffff));
+
+       reg |= enable << DSIM_ESC_CLKEN_SHIFT;
+       if (enable)
+               reg |= prs_val;
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
+               unsigned int lane_sel, unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->clkctrl);
+
+       if (enable)
+               reg |= DSIM_LANE_ESC_CLKEN(lane_sel);
+       else
+               reg &= ~DSIM_LANE_ESC_CLKEN(lane_sel);
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
+       unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->escmode)) &
+               ~(0x1 << DSIM_FORCE_STOP_STATE_SHIFT);
+
+       reg |= ((enable & 0x1) << DSIM_FORCE_STOP_STATE_SHIFT);
+
+       writel(reg, &mipi_dsim->escmode);
+}
+
+unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->status);
+
+       /**
+        * check clock and data lane states.
+        * if MIPI-DSI controller was enabled at bootloader then
+        * TX_READY_HS_CLK is enabled otherwise STOP_STATE_CLK.
+        * so it should be checked for two case.
+        */
+       if ((reg & DSIM_STOP_STATE_DAT(0xf)) &&
+                       ((reg & DSIM_STOP_STATE_CLK) ||
+                        (reg & DSIM_TX_READY_HS_CLK)))
+               return 1;
+       else
+               return 0;
+}
+
+void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
+               unsigned int cnt_val)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->escmode)) &
+               ~(0x7ff << DSIM_STOP_STATE_CNT_SHIFT);
+
+       reg |= ((cnt_val & 0x7ff) << DSIM_STOP_STATE_CNT_SHIFT);
+
+       writel(reg, &mipi_dsim->escmode);
+}
+
+void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
+               unsigned int timeout)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->timeout)) &
+               ~(0xff << DSIM_BTA_TOUT_SHIFT);
+
+       reg |= (timeout << DSIM_BTA_TOUT_SHIFT);
+
+       writel(reg, &mipi_dsim->timeout);
+}
+
+void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
+               unsigned int timeout)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->timeout)) &
+               ~(0xffff << DSIM_LPDR_TOUT_SHIFT);
+
+       reg |= (timeout << DSIM_LPDR_TOUT_SHIFT);
+
+       writel(reg, &mipi_dsim->timeout);
+}
+
+void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
+               unsigned int lp)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->escmode);
+
+       reg &= ~DSIM_CMD_LPDT_LP;
+
+       if (lp)
+               reg |= DSIM_CMD_LPDT_LP;
+
+       writel(reg, &mipi_dsim->escmode);
+}
+
+void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
+               unsigned int lp)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->escmode);
+
+       reg &= ~DSIM_TX_LPDT_LP;
+
+       if (lp)
+               reg |= DSIM_TX_LPDT_LP;
+
+       writel(reg, &mipi_dsim->escmode);
+}
+
+void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
+               unsigned int enable)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
+               ~(1 << DSIM_TX_REQUEST_HSCLK_SHIFT);
+
+       reg |= enable << DSIM_TX_REQUEST_HSCLK_SHIFT;
+
+       writel(reg, &mipi_dsim->clkctrl);
+}
+
+void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
+               unsigned int swap_en)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->phyacchr1);
+
+       reg &= ~(0x3 << DSIM_DPDN_SWAP_DATA_SHIFT);
+       reg |= (swap_en & 0x3) << DSIM_DPDN_SWAP_DATA_SHIFT;
+
+       writel(reg, &mipi_dsim->phyacchr1);
+}
+
+void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
+               unsigned int hs_zero)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
+               ~(0xf << DSIM_ZEROCTRL_SHIFT);
+
+       reg |= ((hs_zero & 0xf) << DSIM_ZEROCTRL_SHIFT);
+
+       writel(reg, &mipi_dsim->pllctrl);
+}
+
+void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim, unsigned int prep)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
+               ~(0x7 << DSIM_PRECTRL_SHIFT);
+
+       reg |= ((prep & 0x7) << DSIM_PRECTRL_SHIFT);
+
+       writel(reg, &mipi_dsim->pllctrl);
+}
+
+void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->intsrc);
+
+       reg |= INTSRC_PLL_STABLE;
+
+       writel(reg, &mipi_dsim->intsrc);
+}
+
+void exynos_mipi_dsi_clear_all_interrupt(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       writel(0xffffffff, &mipi_dsim->intsrc);
+}
+
+unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim)
+{
+       unsigned int reg;
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       reg = readl(&mipi_dsim->status);
+
+       return reg & DSIM_PLL_STABLE ? 1 : 0;
+}
+
+unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       return readl(&mipi_dsim->fifoctrl) & ~(0x1f);
+}
+
+void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
+       unsigned int di, unsigned int data0, unsigned int data1)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = (DSIM_PKTHDR_DAT1(data1) | DSIM_PKTHDR_DAT0(data0) |
+                       DSIM_PKTHDR_DI(di));
+
+       writel(reg, &mipi_dsim->pkthdr);
+}
+
+unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device
+                                               *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->intsrc);
+
+       return (reg & INTSRC_FRAME_DONE) ? 1 : 0;
+}
+
+void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+       unsigned int reg = readl(&mipi_dsim->intsrc);
+
+       writel(reg | INTSRC_FRAME_DONE, &mipi_dsim->intsrc);
+}
+
+void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
+               unsigned int tx_data)
+{
+       struct exynos_mipi_dsim *mipi_dsim =
+               (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
+
+       writel(tx_data, &mipi_dsim->payload);
+}
diff --git a/drivers/video/exynos_mipi_dsi_lowlevel.h b/drivers/video/exynos_mipi_dsi_lowlevel.h
new file mode 100644 (file)
index 0000000..4b8c441
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: InKi Dae <inki.dae@samsung.com>
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#ifndef _EXYNOS_MIPI_DSI_LOWLEVEL_H
+#define _EXYNOS_MIPI_DSI_LOWLEVEL_H
+
+void exynos_mipi_dsi_register(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_sw_release(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
+       unsigned int mode, unsigned int mask);
+void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
+                                       unsigned int count);
+void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
+                                       unsigned int cfg);
+void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
+                               unsigned int value);
+void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
+                               unsigned int value);
+void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
+               unsigned int width_resol, unsigned int height_resol);
+void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
+       unsigned int cmd_allow, unsigned int vfront, unsigned int vback);
+void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
+                       unsigned int front, unsigned int back);
+void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
+                               unsigned int vert, unsigned int hori);
+void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
+                               unsigned int vert, unsigned int hori);
+void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
+                               struct mipi_dsim_config *dsim_config);
+void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
+                               unsigned int count);
+void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim,
+                       unsigned int lane, unsigned int enable);
+void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim,
+                       unsigned int enable, unsigned int afc_code);
+void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
+                               unsigned int enable);
+void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
+                               unsigned int freq_band);
+void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
+                       unsigned int pre_divider, unsigned int main_divider,
+                       unsigned int scaler);
+void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
+                       unsigned int lock_time);
+void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim,
+                                       unsigned int enable);
+void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
+                                       unsigned int src);
+void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
+                                       unsigned int enable);
+void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
+                               unsigned int enable, unsigned int prs_val);
+void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
+                               unsigned int lane_sel, unsigned int enable);
+void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
+                               unsigned int enable);
+unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
+                               unsigned int cnt_val);
+void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
+                               unsigned int timeout);
+void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
+                               unsigned int timeout);
+void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
+                                       unsigned int lp);
+void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
+                                       unsigned int lp);
+void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
+                               unsigned int enable);
+void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
+                               unsigned int swap_en);
+void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
+                               unsigned int hs_zero);
+void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim,
+                               unsigned int prep);
+void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_clear_all_interrupt(struct mipi_dsim_device *dsim);
+unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim);
+unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim);
+unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device
+                                               *dsim);
+void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim);
+void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
+               unsigned int di, unsigned int data0, unsigned int data1);
+void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
+               unsigned int tx_data);
+
+#endif /* _EXYNOS_MIPI_DSI_LOWLEVEL_H */
diff --git a/drivers/video/s6e8ax0.c b/drivers/video/s6e8ax0.c
new file mode 100644 (file)
index 0000000..1ec7fd6
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * Author: Donghwa Lee <dh09.lee@samsung.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <asm/arch/mipi_dsim.h>
+
+#include "exynos_mipi_dsi_lowlevel.h"
+#include "exynos_mipi_dsi_common.h"
+
+static void s6e8ax0_panel_cond(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf8, 0x3d, 0x35, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x4c,
+               0x6e, 0x10, 0x27, 0x7d, 0x3f, 0x10, 0x00, 0x00, 0x20,
+               0x04, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08,
+               0x23, 0x23, 0xc0, 0xc8, 0x08, 0x48, 0xc1, 0x00, 0xc3,
+               0xff, 0xff, 0xc8
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_display_cond(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf2, 0x80, 0x03, 0x0d
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_gamma_cond(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       /* 7500K 2.2 Set (M3, 300cd) */
+       const unsigned char data_to_send[] = {
+               0xfa, 0x01, 0x0f, 0x00, 0x0f, 0xda, 0xc0, 0xe4, 0xc8,
+               0xc8, 0xc6, 0xd3, 0xd6, 0xd0, 0xab, 0xb2, 0xa6, 0xbf,
+               0xc2, 0xb9, 0x00, 0x93, 0x00, 0x86, 0x00, 0xd1
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_gamma_update(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xf7, 0x3);
+}
+
+static void s6e8ax0_etc_source_control(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf6, 0x00, 0x02, 0x00
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_etc_pentile_control(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xb6, 0x0c, 0x02, 0x03, 0x32, 0xff, 0x44, 0x44, 0xc0,
+               0x00
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_etc_mipi_control1(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xe1, 0x10, 0x1c, 0x17, 0x08, 0x1d
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_etc_mipi_control2(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xe2, 0xed, 0x07, 0xc3, 0x13, 0x0d, 0x03
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_etc_power_control(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf4, 0xcf, 0x0a, 0x12, 0x10, 0x19, 0x33, 0x02
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+               (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_etc_mipi_control3(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xe3, 0x40);
+}
+
+static void s6e8ax0_etc_mipi_control4(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xe4, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+               (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_elvss_set(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xb1, 0x04, 0x00
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+                       (unsigned int)data_to_send,
+                       ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_display_on(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+
+       ops->cmd_write(dsim_dev,
+               MIPI_DSI_DCS_SHORT_WRITE, 0x29, 0x00);
+}
+
+static void s6e8ax0_sleep_out(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+
+       ops->cmd_write(dsim_dev,
+               MIPI_DSI_DCS_SHORT_WRITE, 0x11, 0x00);
+}
+
+static void s6e8ax0_apply_level1_key(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf0, 0x5a, 0x5a
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+               (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_apply_mtp_key(struct mipi_dsim_device *dsim_dev)
+{
+       struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
+       const unsigned char data_to_send[] = {
+               0xf1, 0x5a, 0x5a
+       };
+
+       ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
+               (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
+}
+
+static void s6e8ax0_panel_init(struct mipi_dsim_device *dsim_dev)
+{
+       /*
+        * in case of setting gamma and panel condition at first,
+        * it shuold be setting like below.
+        * set_gamma() -> set_panel_condition()
+        */
+
+       s6e8ax0_apply_level1_key(dsim_dev);
+       s6e8ax0_apply_mtp_key(dsim_dev);
+
+       s6e8ax0_sleep_out(dsim_dev);
+       mdelay(5);
+       s6e8ax0_panel_cond(dsim_dev);
+       s6e8ax0_display_cond(dsim_dev);
+       s6e8ax0_gamma_cond(dsim_dev);
+       s6e8ax0_gamma_update(dsim_dev);
+
+       s6e8ax0_etc_source_control(dsim_dev);
+       s6e8ax0_elvss_set(dsim_dev);
+       s6e8ax0_etc_pentile_control(dsim_dev);
+       s6e8ax0_etc_mipi_control1(dsim_dev);
+       s6e8ax0_etc_mipi_control2(dsim_dev);
+       s6e8ax0_etc_power_control(dsim_dev);
+       s6e8ax0_etc_mipi_control3(dsim_dev);
+       s6e8ax0_etc_mipi_control4(dsim_dev);
+}
+
+static int s6e8ax0_panel_set(struct mipi_dsim_device *dsim_dev)
+{
+       s6e8ax0_panel_init(dsim_dev);
+
+       return 0;
+}
+
+static void s6e8ax0_display_enable(struct mipi_dsim_device *dsim_dev)
+{
+       s6e8ax0_display_on(dsim_dev);
+}
+
+static struct mipi_dsim_lcd_driver s6e8ax0_dsim_ddi_driver = {
+       .name = "s6e8ax0",
+       .id = -1,
+
+       .mipi_panel_init = s6e8ax0_panel_set,
+       .mipi_display_on = s6e8ax0_display_enable,
+};
+
+void s6e8ax0_init(void)
+{
+       exynos_mipi_dsi_register_lcd_driver(&s6e8ax0_dsim_ddi_driver);
+}
diff --git a/include/aes.h b/include/aes.h
new file mode 100644 (file)
index 0000000..41b0db2
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef _AES_REF_H_
+#define _AES_REF_H_
+
+/*
+ * AES encryption library, with small code size, supporting only 128-bit AES
+ *
+ * AES is a stream cipher which works a block at a time, with each block
+ * in this case being AES_KEY_LENGTH bytes.
+ */
+
+enum {
+       AES_STATECOLS   = 4,    /* columns in the state & expanded key */
+       AES_KEYCOLS     = 4,    /* columns in a key */
+       AES_ROUNDS      = 10,   /* rounds in encryption */
+
+       AES_KEY_LENGTH  = 128 / 8,
+       AES_EXPAND_KEY_LENGTH   = 4 * AES_STATECOLS * (AES_ROUNDS + 1),
+};
+
+/**
+ * Expand a key into a key schedule, which is then used for the other
+ * operations.
+ *
+ * \param key          Key, of length AES_KEY_LENGTH bytes
+ * \param expkey       Buffer to place expanded key, AES_EXPAND_KEY_LENGTH
+ */
+void aes_expand_key(u8 *key, u8 *expkey);
+
+/**
+ * Encrypt a single block of data
+ *
+ * in          Input data
+ * expkey      Expanded key to use for encryption (from aes_expand_key())
+ * out         Output data
+ */
+void aes_encrypt(u8 *in, u8 *expkey, u8 *out);
+
+/**
+ * Decrypt a single block of data
+ *
+ * in          Input data
+ * expkey      Expanded key to use for decryption (from aes_expand_key())
+ * out         Output data
+ */
+void aes_decrypt(u8 *in, u8 *expkey, u8 *out);
+
+#endif /* _AES_REF_H_ */
index 465ea7fcbbb020d6384342076e42153fa8cc6616..c4fb9e79a55f41bb4406a98bcca0510268f7ea4f 100644 (file)
 #define AHCI_PCI_BAR           0x24
 #define AHCI_MAX_SG            56 /* hardware max is 64K */
 #define AHCI_CMD_SLOT_SZ       32
+#define AHCI_MAX_CMD_SLOT      32
 #define AHCI_RX_FIS_SZ         256
 #define AHCI_CMD_TBL_HDR       0x80
 #define AHCI_CMD_TBL_CDB       0x40
 #define AHCI_CMD_TBL_SZ                AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16)
-#define AHCI_PORT_PRIV_DMA_SZ  AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ      \
-                               + AHCI_RX_FIS_SZ
+#define AHCI_PORT_PRIV_DMA_SZ  (AHCI_CMD_SLOT_SZ * AHCI_MAX_CMD_SLOT + \
+                               AHCI_CMD_TBL_SZ + AHCI_RX_FIS_SZ)
 #define AHCI_CMD_ATAPI         (1 << 5)
 #define AHCI_CMD_WRITE         (1 << 6)
 #define AHCI_CMD_PREFETCH      (1 << 7)
index 4b5841ef47015925cd78cebe5c2e0c07ac8445af..eb9de1870fb8b2eafd49c2b2ebd524a6bff9e433 100644 (file)
@@ -222,6 +222,31 @@ typedef void (interrupt_handler_t)(void *);
 #define MIN(x, y)  min(x, y)
 #define MAX(x, y)  max(x, y)
 
+/*
+ * Return the absolute value of a number.
+ *
+ * This handles unsigned and signed longs, ints, shorts and chars.  For all
+ * input types abs() returns a signed long.
+ *
+ * For 64-bit types, use abs64()
+ */
+#define abs(x) ({                                              \
+               long ret;                                       \
+               if (sizeof(x) == sizeof(long)) {                \
+                       long __x = (x);                         \
+                       ret = (__x < 0) ? -__x : __x;           \
+               } else {                                        \
+                       int __x = (x);                          \
+                       ret = (__x < 0) ? -__x : __x;           \
+               }                                               \
+               ret;                                            \
+       })
+
+#define abs64(x) ({                            \
+               s64 __x = (x);                  \
+               (__x < 0) ? -__x : __x;         \
+       })
+
 #if defined(CONFIG_ENV_IS_EMBEDDED)
 #define TOTAL_MALLOC_LEN       CONFIG_SYS_MALLOC_LEN
 #elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
@@ -794,6 +819,10 @@ int        pcmcia_init (void);
 
 #include <bootstage.h>
 
+#ifdef CONFIG_SHOW_ACTIVITY
+void show_activity(int arg);
+#endif
+
 /* Multicore arch functions */
 #ifdef CONFIG_MP
 int cpu_status(int nr);
index e057b1f9459002dfd7155eabefda5c743f3f5078..e632d1bd37ea0c40102aa531fe54885ebe59ea59 100644 (file)
@@ -310,9 +310,6 @@ extern unsigned long get_clock_freq(void);
 #define CONFIG_OF_BOARD_SETUP
 #define CONFIG_OF_STDOUT_VIA_ALIAS
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-#define CONFIG_SYS_64BIT_STRTOUL
-
 /* new uImage format support */
 #define CONFIG_FIT
 #define CONFIG_FIT_VERBOSE     /* enable fit_format_{error,warning}() */
index 365322c6a59788bffaa4cfc3e3a8cdeae74057f8..28122ecc11527fa648489332ec882ac6b790a0c6 100644 (file)
@@ -416,8 +416,6 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #endif
 
 /* Misc Extra Settings */
-#define CONFIG_SYS_64BIT_VSPRINTF      1
-#define CONFIG_SYS_64BIT_STRTOUL       1
 #define CONFIG_CMD_DHCP                        1
 
 #define CONFIG_CMD_DATE                        1
index b0dd2f0af61ff1f2ceb9ad8386909791e1b9b67a..1233985aa6da5577239b6c35937d3d52be044fb7 100644 (file)
 
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of */
                                                        /* NAND devices */
-#define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */
 
 #define CONFIG_JFFS2_NAND
 /* nand device jffs2 lives on */
 #define CONFIG_SPL
 #define CONFIG_SPL_NAND_SIMPLE
 #define CONFIG_SPL_TEXT_BASE           0x40200800
-#define CONFIG_SPL_MAX_SIZE            (45 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
index b5f75d1e8da7a39704ebef21409479792f28633c..ff8d1b013924258640a3e924333eba235fe99e89 100644 (file)
 
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of */
                                                        /* NAND devices */
-#define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */
-
 #define CONFIG_JFFS2_NAND
 /* nand device jffs2 lives on */
 #define CONFIG_JFFS2_DEV               "nand0"
 #define CONFIG_SPL
 #define CONFIG_SPL_NAND_SIMPLE
 #define CONFIG_SPL_TEXT_BASE           0x40200800
-#define CONFIG_SPL_MAX_SIZE            (45 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
index 83992461f906c4a2e29ffd70382d9fe92f36fecb..f424e5a5bd77331f282c8d4165304929f8ef92a8 100644 (file)
 #define CONFIG_SYS_NAND_MASK_CLE               (1 << 22)
 #define CONFIG_SYS_NAND_ENABLE_PIN             AT91_PIN_PD15
 #define CONFIG_SYS_NAND_READY_PIN              AT91_PIN_PA22
-
-#define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */
 #endif
 
 /* Ethernet */
index 99856ebfdf2dcc84063dab26b84ac8bd8c5e292c..71faf1cc9ff2bbbe67eb44a40e63ebb41d536916 100644 (file)
@@ -37,7 +37,7 @@
 
 #define CONFIG_HOSTNAME                        cam_enc_4xx
 
-#define        BOARD_LATE_INIT
+#define        CONFIG_BOARD_LATE_INIT
 #define CONFIG_CAM_ENC_LED_MASK                0x0fc00000
 
 /* Memory Info */
index fe91c10409b2cff78f51d9b6223e4c1114f80594..b28bd8e3139f05511cecf7af3ee42d6e69c81cb1 100644 (file)
 #define CONFIG_DRIVER_OMAP34XX_I2C
 #define CONFIG_SYS_I2C_EEPROM_ADDR     0x50
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
+#define CONFIG_I2C_MULTI_BUS
 
 /*
  * TWL4030
index 4532e4f4fdd18fe6b2322654a65cb3a87ddb295a..781878ef399af8ad3917329b2a848a491bd075eb 100644 (file)
 #define CONFIG_SYS_NAND_CS             3
 #define CONFIG_SYS_NAND_BASE           DAVINCI_ASYNC_EMIF_DATA_CE3_BASE
 #define CONFIG_SYS_NAND_PAGE_2K
-#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for nand_util.c */
 #define CONFIG_SYS_CLE_MASK            0x10
 #define CONFIG_SYS_ALE_MASK            0x8
 #define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
diff --git a/include/configs/devkit3250.h b/include/configs/devkit3250.h
new file mode 100644 (file)
index 0000000..9f15ffb
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Embest/Timll DevKit3250 board configuration file
+ *
+ * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#ifndef __CONFIG_DEVKIT3250_H__
+#define __CONFIG_DEVKIT3250_H__
+
+/* SoC and board defines */
+#include <asm/sizes.h>
+#include <asm/arch/cpu.h>
+
+/*
+ * Define DevKit3250 machine type by hand until it lands in mach-types
+ */
+#define MACH_TYPE_DEVKIT3250           3697
+#define CONFIG_MACH_TYPE               MACH_TYPE_DEVKIT3250
+
+#define CONFIG_SYS_ICACHE_OFF
+#define CONFIG_SYS_DCACHE_OFF
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_BOARD_EARLY_INIT_F
+
+/*
+ * Memory configurations
+ */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_STACKSIZE               SZ_32K
+#define CONFIG_SYS_MALLOC_LEN          SZ_1M
+#define CONFIG_SYS_GBL_DATA_SIZE       128
+#define CONFIG_SYS_SDRAM_BASE          EMC_DYCS0_BASE
+#define CONFIG_SYS_SDRAM_SIZE          SZ_64M
+#define CONFIG_SYS_TEXT_BASE           0x83FA0000
+#define CONFIG_SYS_MEMTEST_START       (CONFIG_SYS_SDRAM_BASE + SZ_32K)
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_TEXT_BASE - SZ_1M)
+
+#define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + SZ_32K)
+
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_SDRAM_BASE + SZ_4K \
+                                        - GENERATED_GBL_DATA_SIZE)
+
+/*
+ * Serial Driver
+ */
+#define CONFIG_SYS_LPC32XX_UART                2   /* UART2 */
+#define CONFIG_BAUDRATE                        115200
+
+/*
+ * NOR Flash
+ */
+#define CONFIG_CMD_FLASH
+#define CONFIG_SYS_MAX_FLASH_BANKS     1
+#define CONFIG_SYS_MAX_FLASH_SECT      71
+#define CONFIG_SYS_FLASH_BASE          EMC_CS0_BASE
+#define CONFIG_SYS_FLASH_SIZE          SZ_4M
+#define CONFIG_SYS_FLASH_CFI
+
+/*
+ * U-Boot General Configurations
+ */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_PROMPT              "=> "
+#define CONFIG_SYS_CBSIZE              1024
+#define CONFIG_SYS_PBSIZE              \
+       (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS             16
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_VERSION_VARIABLE
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_ENV_IS_NOWHERE
+#define CONFIG_ENV_SIZE                        SZ_128K
+
+/*
+ * U-Boot Commands
+ */
+#include <config_cmd_default.h>
+#define CONFIG_CMD_CACHE
+
+/*
+ * Boot Linux
+ */
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_ZERO_BOOTDELAY_CHECK
+#define CONFIG_BOOTDELAY               3
+
+#define CONFIG_BOOTFILE                        "uImage"
+#define CONFIG_BOOTARGS                        "console=ttyS2,115200n8"
+#define CONFIG_LOADADDR                        0x80008000
+
+/*
+ * Include SoC specific configuration
+ */
+#include <asm/arch/config.h>
+
+#endif  /* __CONFIG_DEVKIT3250_H__*/
index eb7c376780dc476680664f166092d1a04ba20f9f..248a5b2fa36c3d5a1d2cbda9d21bc6af1e80ef15 100644 (file)
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 0x300 /* address 0x60000 */
 
 #define CONFIG_SPL_TEXT_BASE           0x40200000 /*CONFIG_SYS_SRAM_START*/
-#define CONFIG_SPL_MAX_SIZE            0xB400  /* 45 K */
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR       0x80000500 /* leave space for bootargs*/
index 0f2f9a2743f03a81b01cf16f412e9d1de6cfa80b..76f9eeaed80e89a20fa205fee580134628a82444 100644 (file)
  */
 #define CONFIG_DISPLAY_CPUINFO
 
+#define CONFIG_OF_LIBFDT
+
 #endif /* _CONFIG_DREAMPLUG_H */
index e059b308266d3abaaa037deae23fd789562b0297..88b085d4a7af009ec2ed3cd578a5bb4be5dfd128 100644 (file)
@@ -31,7 +31,7 @@
 #define        CONFIG_SYS_USE_NAND
 #define CONFIG_DRIVER_TI_EMAC_USE_RMII
 #define CONFIG_BOARD_EARLY_INIT_F
-#define BOARD_LATE_INIT
+#define CONFIG_BOARD_LATE_INIT
 #define CONFIG_VIDEO
 #define CONFIG_PREBOOT
 
 #define CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
 #define        CONFIG_SYS_NAND_USE_FLASH_BBT
 #define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
-#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for nand_util.c */
 #endif
 
 /* SPI Flash */
index eb05e2a0b06cc390c6d60ecee7e83996cb7e9dc6..21c471adf6c762364f3844c93748dcdfe7b18e7d 100644 (file)
 #define CONFIG_SYS_NAND_BASE           0x40000000
 #define CONFIG_SYS_NAND_DBW_8          1
 
-#define CONFIG_SYS_64BIT_VSPRINTF      1
-
 /* Status LED's */
 
 #define CONFIG_STATUS_LED              1
index f046a587bec2570391b3e9d7f5b5a85e9d528a5b..dd7c73f3c7bb38c27cb768f5ca6799735a593312 100644 (file)
@@ -48,8 +48,6 @@
 /* Set TEXT at the beginning of the NOR flash */
 #define CONFIG_SYS_TEXT_BASE   0xA0000000
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-
 /* This is required to setup the ESDC controller */
 #define CONFIG_BOARD_EARLY_INIT_F
 
index 085937138798c2f9c132b3c2f0d0b0e5b1aa70f6..6d2d4fb91d7eb3d79e9aeb60569d9cf78bad11d9 100644 (file)
 #define CFG_DAVINCI_STD_NAND_LAYOUT
 #define CONFIG_SYS_NAND_CS             3
 #define CONFIG_SYS_NAND_PAGE_2K
-#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for nand_util.c */
 /* Max number of NAND devices */
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
 #define CONFIG_SYS_NAND_BASE_LIST      { 0x62000000, }
diff --git a/include/configs/ib62x0.h b/include/configs/ib62x0.h
new file mode 100644 (file)
index 0000000..85856f2
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2011-2012
+ * Gerald Kerma <dreagle@doukki.net>
+ * Luka Perkov <uboot@lukaperkov.net>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _CONFIG_IB62x0_H
+#define _CONFIG_IB62x0_H
+
+/*
+ * Version number information
+ */
+#define CONFIG_IDENT_STRING    " RaidSonic ICY BOX IB-NAS62x0"
+
+/*
+ * High level configuration options
+ */
+#define CONFIG_FEROCEON_88FR131                /* CPU Core subversion */
+#define CONFIG_KIRKWOOD                        /* SOC Family Name */
+#define CONFIG_KW88F6281               /* SOC Name */
+#define CONFIG_SKIP_LOWLEVEL_INIT      /* disable board lowlevel_init */
+
+/*
+ * Machine type
+ */
+#define CONFIG_MACH_TYPE       MACH_TYPE_NAS6210
+
+/*
+ * Compression configuration
+ */
+#define CONFIG_BZIP2
+#define CONFIG_LZMA
+#define CONFIG_LZO
+
+/*
+ * Commands configuration
+ */
+#define CONFIG_SYS_NO_FLASH            /* declare no flash (NOR/SPI) */
+#define CONFIG_SYS_MVFS
+#include <config_cmd_default.h>
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_IDE
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_USB
+
+/*
+ * mv-common.h should be defined after CMD configs since it used them
+ * to enable certain macros
+ */
+#include "mv-common.h"
+
+#undef CONFIG_SYS_PROMPT
+#define CONFIG_SYS_PROMPT      "ib62x0 => "
+
+/*
+ * Environment variables configuration
+ */
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_SECT_SIZE   0x20000
+#else
+#define CONFIG_ENV_IS_NOWHERE
+#endif
+#define CONFIG_ENV_SIZE                0x20000
+#define CONFIG_ENV_OFFSET      0x80000
+
+/*
+ * Default environment variables
+ */
+#define CONFIG_BOOTCOMMAND \
+       "setenv bootargs ${console} ${mtdparts} ${bootargs_root}; "     \
+       "ubi part root; "                                               \
+       "ubifsmount root; "                                             \
+       "ubifsload 0x800000 ${kernel}; "                                \
+       "ubifsload 0x1100000 ${initrd}; "                               \
+       "bootm 0x800000 0x1100000"
+
+#define CONFIG_MTDPARTS                                \
+       "mtdparts=orion_nand:"                  \
+       "0x80000@0x0(uboot),"                   \
+       "0x20000@0x80000(uboot_env),"           \
+       "-@0xa0000(root)\0"
+
+#define CONFIG_EXTRA_ENV_SETTINGS                                      \
+       "console=console=ttyS0,115200\0"                                \
+       "mtdids=nand0=orion_nand\0"                                     \
+       "mtdparts="CONFIG_MTDPARTS                                      \
+       "kernel=/boot/uImage\0"                                         \
+       "initrd=/boot/uInitrd\0"                                        \
+       "bootargs_root=ubi.mtd=2 root=ubi0:root rootfstype=ubifs\0"
+
+/*
+ * Ethernet driver configuration
+ */
+#ifdef CONFIG_CMD_NET
+#define CONFIG_MVGBE_PORTS     {1, 0}  /* enable port 0 only */
+#define CONFIG_PHY_BASE_ADR    0
+#undef CONFIG_RESET_PHY_R
+#endif /* CONFIG_CMD_NET */
+
+/*
+ * SATA driver configuration
+ */
+#ifdef CONFIG_CMD_IDE
+#define __io
+#define CONFIG_IDE_PREINIT
+#define CONFIG_DOS_PARTITION
+#define CONFIG_MVSATA_IDE_USE_PORT0
+#define CONFIG_MVSATA_IDE_USE_PORT1
+#define CONFIG_SYS_ATA_IDE0_OFFSET     MV_SATA_PORT0_OFFSET
+#define CONFIG_SYS_ATA_IDE1_OFFSET     MV_SATA_PORT1_OFFSET
+#endif /* CONFIG_CMD_IDE */
+
+/*
+ * RTC driver configuration
+ */
+#ifdef CONFIG_CMD_DATE
+#define CONFIG_RTC_MV
+#endif /* CONFIG_CMD_DATE */
+
+/*
+ * File system
+ */
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_JFFS2
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+#define CONFIG_RBTREE
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_CMD_MTDPARTS
+
+#endif /* _CONFIG_IB62x0_H */
diff --git a/include/configs/igep0020.h b/include/configs/igep0020.h
deleted file mode 100644 (file)
index c2fcdff..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * (C) Copyright 2010
- * ISEE 2007 SL, <www.iseebcn.com>
- *
- * 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
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-#include <asm/sizes.h>
-
-/*
- * High Level Configuration Options
- */
-#define CONFIG_OMAP            1       /* in a TI OMAP core */
-#define CONFIG_OMAP34XX                1       /* which is a 34XX */
-#define CONFIG_OMAP3_IGEP0020  1       /* working with IGEP0020 */
-
-#define CONFIG_SDRC    /* The chip has SDRC controller */
-
-#include <asm/arch/cpu.h>
-#include <asm/arch/omap3.h>
-
-/*
- * Display CPU and Board information
- */
-#define CONFIG_DISPLAY_CPUINFO         1
-#define CONFIG_DISPLAY_BOARDINFO       1
-
-/* Clock Defines */
-#define V_OSCK                 26000000        /* Clock output from T2 */
-#define V_SCLK                 (V_OSCK >> 1)
-
-#define CONFIG_MISC_INIT_R
-
-#define CONFIG_CMDLINE_TAG             1       /* enable passing of ATAGs */
-#define CONFIG_SETUP_MEMORY_TAGS       1
-#define CONFIG_INITRD_TAG              1
-#define CONFIG_REVISION_TAG            1
-
-#define CONFIG_OF_LIBFDT               1
-
-/*
- * NS16550 Configuration
- */
-
-#define V_NS16550_CLK                  48000000        /* 48MHz (APLL96/2) */
-
-#define CONFIG_SYS_NS16550
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    (-4)
-#define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
-
-/* select serial console configuration */
-#define CONFIG_CONS_INDEX              3
-#define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3
-#define CONFIG_SERIAL3                 3
-
-/* allow to overwrite serial and ethaddr */
-#define CONFIG_ENV_OVERWRITE
-#define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600, 115200}
-#define CONFIG_GENERIC_MMC             1
-#define CONFIG_MMC                     1
-#define CONFIG_OMAP_HSMMC              1
-#define CONFIG_DOS_PARTITION           1
-
-/* USB */
-#define CONFIG_MUSB_UDC                        1
-#define CONFIG_USB_OMAP3               1
-#define CONFIG_TWL4030_USB             1
-
-/* USB device configuration */
-#define CONFIG_USB_DEVICE              1
-#define CONFIG_USB_TTY                 1
-#define CONFIG_SYS_CONSOLE_IS_IN_ENV   1
-
-/* Change these to suit your needs */
-#define CONFIG_USBD_VENDORID           0x0451
-#define CONFIG_USBD_PRODUCTID          0x5678
-#define CONFIG_USBD_MANUFACTURER       "Texas Instruments"
-#define CONFIG_USBD_PRODUCT_NAME       "IGEP"
-
-/* commands to include */
-#include <config_cmd_default.h>
-
-#define CONFIG_CMD_CACHE
-#define CONFIG_CMD_EXT2                /* EXT2 Support                 */
-#define CONFIG_CMD_FAT         /* FAT support                  */
-#define CONFIG_CMD_I2C         /* I2C serial bus support       */
-#define CONFIG_CMD_MMC         /* MMC support                  */
-#define CONFIG_CMD_ONENAND     /* ONENAND support              */
-#define CONFIG_CMD_NET         /* bootp, tftpboot, rarpboot    */
-#define CONFIG_CMD_DHCP
-#define CONFIG_CMD_PING
-#define CONFIG_CMD_NFS         /* NFS support                  */
-#define CONFIG_CMD_MTDPARTS    /* Enable MTD parts commands    */
-#define CONFIG_MTD_DEVICE
-
-#undef CONFIG_CMD_FLASH                /* flinfo, erase, protect       */
-#undef CONFIG_CMD_IMLS         /* List all found images        */
-
-#define CONFIG_SYS_NO_FLASH
-#define CONFIG_HARD_I2C                        1
-#define CONFIG_SYS_I2C_SPEED           100000
-#define CONFIG_SYS_I2C_SLAVE           1
-#define CONFIG_SYS_I2C_BUS             0
-#define CONFIG_SYS_I2C_BUS_SELECT      1
-#define CONFIG_DRIVER_OMAP34XX_I2C     1
-
-/*
- * TWL4030
- */
-#define CONFIG_TWL4030_POWER           1
-
-#define CONFIG_BOOTDELAY               3
-
-#define CONFIG_EXTRA_ENV_SETTINGS \
-       "usbtty=cdc_acm\0" \
-       "loadaddr=0x82000000\0" \
-       "usbtty=cdc_acm\0" \
-       "console=ttyS2,115200n8\0" \
-       "mpurate=500\0" \
-       "vram=12M\0" \
-       "dvimode=1024x768MR-16@60\0" \
-       "defaultdisplay=dvi\0" \
-       "mmcdev=0\0" \
-       "mmcroot=/dev/mmcblk0p2 rw\0" \
-       "mmcrootfstype=ext3 rootwait\0" \
-       "nandroot=/dev/mtdblock4 rw\0" \
-       "nandrootfstype=jffs2\0" \
-       "mmcargs=setenv bootargs console=${console} " \
-               "mpurate=${mpurate} " \
-               "vram=${vram} " \
-               "omapfb.mode=dvi:${dvimode} " \
-               "omapfb.debug=y " \
-               "omapdss.def_disp=${defaultdisplay} " \
-               "root=${mmcroot} " \
-               "rootfstype=${mmcrootfstype}\0" \
-       "nandargs=setenv bootargs console=${console} " \
-               "mpurate=${mpurate} " \
-               "vram=${vram} " \
-               "omapfb.mode=dvi:${dvimode} " \
-               "omapfb.debug=y " \
-               "omapdss.def_disp=${defaultdisplay} " \
-               "root=${nandroot} " \
-               "rootfstype=${nandrootfstype}\0" \
-       "loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr\0" \
-       "bootscript=echo Running bootscript from mmc ...; " \
-               "source ${loadaddr}\0" \
-       "loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
-       "mmcboot=echo Booting from mmc ...; " \
-               "run mmcargs; " \
-               "bootm ${loadaddr}\0" \
-       "nandboot=echo Booting from onenand ...; " \
-               "run nandargs; " \
-               "onenand read ${loadaddr} 280000 400000; " \
-               "bootm ${loadaddr}\0" \
-
-#define CONFIG_BOOTCOMMAND \
-       "if mmc rescan ${mmcdev}; then " \
-               "if run loadbootscript; then " \
-                       "run bootscript; " \
-               "else " \
-                       "if run loaduimage; then " \
-                               "run mmcboot; " \
-                       "else run nandboot; " \
-                       "fi; " \
-               "fi; " \
-       "else run nandboot; fi"
-
-#define CONFIG_AUTO_COMPLETE           1
-
-/*
- * Miscellaneous configurable options
- */
-#define CONFIG_SYS_LONGHELP            /* undef to save memory */
-#define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
-#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
-#define CONFIG_SYS_PROMPT              "U-Boot # "
-#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
-/* Print Buffer Size */
-#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
-                                       sizeof(CONFIG_SYS_PROMPT) + 16)
-#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
-/* Boot Argument Buffer Size */
-#define CONFIG_SYS_BARGSIZE            (CONFIG_SYS_CBSIZE)
-
-#define CONFIG_SYS_MEMTEST_START       (OMAP34XX_SDRC_CS0)     /* memtest */
-                                                               /* works on */
-#define CONFIG_SYS_MEMTEST_END         (OMAP34XX_SDRC_CS0 + \
-                                       0x01F00000) /* 31MB */
-
-#define CONFIG_SYS_LOAD_ADDR           (OMAP34XX_SDRC_CS0)     /* default */
-                                                       /* load address */
-
-#define CONFIG_SYS_MONITOR_LEN         (256 << 10)
-
-/*
- * OMAP3 has 12 GP timers, they can be driven by the system clock
- * (12/13/16.8/19.2/38.4MHz) or by 32KHz clock. We use 13MHz (V_SCLK).
- * This rate is divided by a local divisor.
- */
-#define CONFIG_SYS_TIMERBASE           (OMAP34XX_GPT2)
-#define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
-#define CONFIG_SYS_HZ                  1000
-
-/*
- * Stack sizes
- *
- * The stack sizes are set up in start.S using the settings below
- */
-#define CONFIG_STACKSIZE       (128 << 10)     /* regular stack 128 KiB */
-
-/*
- * Physical Memory Map
- *
- */
-#define CONFIG_NR_DRAM_BANKS   2       /* CS1 may or may not be populated */
-#define PHYS_SDRAM_1           OMAP34XX_SDRC_CS0
-#define PHYS_SDRAM_1_SIZE      (32 << 20)      /* at least 32 meg */
-#define PHYS_SDRAM_2           OMAP34XX_SDRC_CS1
-
-/*
- * FLASH and environment organization
- */
-
-#define PISMO1_ONEN_SIZE               GPMC_SIZE_128M /* Configure the PISMO */
-
-#define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
-
-#define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-
-#define CONFIG_ENV_IS_IN_ONENAND       1
-#define CONFIG_ENV_SIZE                        (512 << 10) /* Total Size Environment */
-#define CONFIG_ENV_ADDR                        ONENAND_ENV_OFFSET
-
-/*
- * Size of malloc() pool
- */
-#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (128 << 10))
-
-/*
- * SMSC911x Ethernet
- */
-#if defined(CONFIG_CMD_NET)
-#define CONFIG_SMC911X
-#define CONFIG_SMC911X_32_BIT
-#define CONFIG_SMC911X_BASE    0x2C000000
-#endif /* (CONFIG_CMD_NET) */
-
-#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
-#define CONFIG_SYS_INIT_RAM_ADDR       0x4020f800
-#define CONFIG_SYS_INIT_RAM_SIZE       0x800
-#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR + \
-                                        CONFIG_SYS_INIT_RAM_SIZE - \
-                                        GENERATED_GBL_DATA_SIZE)
-
-#endif /* __CONFIG_H */
diff --git a/include/configs/igep0030.h b/include/configs/igep0030.h
deleted file mode 100644 (file)
index bf39ba5..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * (C) Copyright 2010
- * ISEE 2007 SL, <www.iseebcn.com>
- *
- * 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
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-#include <asm/sizes.h>
-
-/*
- * High Level Configuration Options
- */
-#define CONFIG_OMAP            1       /* in a TI OMAP core */
-#define CONFIG_OMAP34XX                1       /* which is a 34XX */
-#define CONFIG_OMAP3_IGEP0030  1       /* working with IGEP0030 */
-
-#define CONFIG_SDRC    /* The chip has SDRC controller */
-
-#include <asm/arch/cpu.h>
-#include <asm/arch/omap3.h>
-
-/*
- * Display CPU and Board information
- */
-#define CONFIG_DISPLAY_CPUINFO         1
-#define CONFIG_DISPLAY_BOARDINFO       1
-
-/* Clock Defines */
-#define V_OSCK                 26000000        /* Clock output from T2 */
-#define V_SCLK                 (V_OSCK >> 1)
-
-#define CONFIG_MISC_INIT_R
-
-#define CONFIG_CMDLINE_TAG             1       /* enable passing of ATAGs */
-#define CONFIG_SETUP_MEMORY_TAGS       1
-#define CONFIG_INITRD_TAG              1
-#define CONFIG_REVISION_TAG            1
-
-#define CONFIG_OF_LIBFDT               1
-
-/*
- * NS16550 Configuration
- */
-
-#define V_NS16550_CLK                  48000000        /* 48MHz (APLL96/2) */
-
-#define CONFIG_SYS_NS16550
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    (-4)
-#define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
-
-/* select serial console configuration */
-#define CONFIG_CONS_INDEX              3
-#define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3
-#define CONFIG_SERIAL3                 3
-
-/* allow to overwrite serial and ethaddr */
-#define CONFIG_ENV_OVERWRITE
-#define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600, 115200}
-#define CONFIG_GENERIC_MMC             1
-#define CONFIG_MMC                     1
-#define CONFIG_OMAP_HSMMC              1
-#define CONFIG_DOS_PARTITION           1
-
-/* USB */
-#define CONFIG_MUSB_UDC                        1
-#define CONFIG_USB_OMAP3               1
-#define CONFIG_TWL4030_USB             1
-
-/* USB device configuration */
-#define CONFIG_USB_DEVICE              1
-#define CONFIG_USB_TTY                 1
-#define CONFIG_SYS_CONSOLE_IS_IN_ENV   1
-
-/* Change these to suit your needs */
-#define CONFIG_USBD_VENDORID           0x0451
-#define CONFIG_USBD_PRODUCTID          0x5678
-#define CONFIG_USBD_MANUFACTURER       "Texas Instruments"
-#define CONFIG_USBD_PRODUCT_NAME       "IGEP"
-
-/* commands to include */
-#include <config_cmd_default.h>
-
-#define CONFIG_CMD_CACHE
-#define CONFIG_CMD_EXT2                /* EXT2 Support                 */
-#define CONFIG_CMD_FAT         /* FAT support                  */
-#define CONFIG_CMD_I2C         /* I2C serial bus support       */
-#define CONFIG_CMD_MMC         /* MMC support                  */
-#define CONFIG_CMD_ONENAND     /* ONENAND support              */
-#define CONFIG_CMD_MTDPARTS    /* Enable MTD parts commands    */
-#define CONFIG_MTD_DEVICE
-
-#undef CONFIG_CMD_NET          /* bootp, tftpboot, rarpboot    */
-#undef CONFIG_CMD_NFS          /* nfs                          */
-#undef CONFIG_CMD_FLASH                /* flinfo, erase, protect       */
-#undef CONFIG_CMD_IMLS         /* List all found images        */
-
-#define CONFIG_SYS_NO_FLASH
-#define CONFIG_HARD_I2C                        1
-#define CONFIG_SYS_I2C_SPEED           100000
-#define CONFIG_SYS_I2C_SLAVE           1
-#define CONFIG_SYS_I2C_BUS             0
-#define CONFIG_SYS_I2C_BUS_SELECT      1
-#define CONFIG_DRIVER_OMAP34XX_I2C     1
-
-/*
- * TWL4030
- */
-#define CONFIG_TWL4030_POWER           1
-
-#define CONFIG_BOOTDELAY               3
-
-#define CONFIG_EXTRA_ENV_SETTINGS \
-       "usbtty=cdc_acm\0" \
-       "loadaddr=0x82000000\0" \
-       "usbtty=cdc_acm\0" \
-       "console=ttyS2,115200n8\0" \
-       "mpurate=500\0" \
-       "vram=12M\0" \
-       "dvimode=1024x768MR-16@60\0" \
-       "defaultdisplay=dvi\0" \
-       "mmcdev=0\0" \
-       "mmcroot=/dev/mmcblk0p2 rw\0" \
-       "mmcrootfstype=ext3 rootwait\0" \
-       "nandroot=/dev/mtdblock4 rw\0" \
-       "nandrootfstype=jffs2\0" \
-       "mmcargs=setenv bootargs console=${console} " \
-               "mpurate=${mpurate} " \
-               "vram=${vram} " \
-               "omapfb.mode=dvi:${dvimode} " \
-               "omapfb.debug=y " \
-               "omapdss.def_disp=${defaultdisplay} " \
-               "root=${mmcroot} " \
-               "rootfstype=${mmcrootfstype}\0" \
-       "nandargs=setenv bootargs console=${console} " \
-               "mpurate=${mpurate} " \
-               "vram=${vram} " \
-               "omapfb.mode=dvi:${dvimode} " \
-               "omapfb.debug=y " \
-               "omapdss.def_disp=${defaultdisplay} " \
-               "root=${nandroot} " \
-               "rootfstype=${nandrootfstype}\0" \
-       "loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr\0" \
-       "bootscript=echo Running bootscript from mmc ...; " \
-               "source ${loadaddr}\0" \
-       "loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
-       "mmcboot=echo Booting from mmc ...; " \
-               "run mmcargs; " \
-               "bootm ${loadaddr}\0" \
-       "nandboot=echo Booting from onenand ...; " \
-               "run nandargs; " \
-               "onenand read ${loadaddr} 280000 400000; " \
-               "bootm ${loadaddr}\0" \
-
-#define CONFIG_BOOTCOMMAND \
-       "if mmc rescan ${mmcdev}; then " \
-               "if run loadbootscript; then " \
-                       "run bootscript; " \
-               "else " \
-                       "if run loaduimage; then " \
-                               "run mmcboot; " \
-                       "else run nandboot; " \
-                       "fi; " \
-               "fi; " \
-       "else run nandboot; fi"
-
-#define CONFIG_AUTO_COMPLETE           1
-
-/*
- * Miscellaneous configurable options
- */
-#define CONFIG_SYS_LONGHELP            /* undef to save memory */
-#define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
-#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
-#define CONFIG_SYS_PROMPT              "U-Boot # "
-#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
-/* Print Buffer Size */
-#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
-                                       sizeof(CONFIG_SYS_PROMPT) + 16)
-#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
-/* Boot Argument Buffer Size */
-#define CONFIG_SYS_BARGSIZE            (CONFIG_SYS_CBSIZE)
-
-#define CONFIG_SYS_MEMTEST_START       (OMAP34XX_SDRC_CS0)     /* memtest */
-                                                               /* works on */
-#define CONFIG_SYS_MEMTEST_END         (OMAP34XX_SDRC_CS0 + \
-                                       0x01F00000) /* 31MB */
-
-#define CONFIG_SYS_LOAD_ADDR           (OMAP34XX_SDRC_CS0)     /* default */
-                                                       /* load address */
-
-#define CONFIG_SYS_MONITOR_LEN         (256 << 10)
-
-/*
- * OMAP3 has 12 GP timers, they can be driven by the system clock
- * (12/13/16.8/19.2/38.4MHz) or by 32KHz clock. We use 13MHz (V_SCLK).
- * This rate is divided by a local divisor.
- */
-#define CONFIG_SYS_TIMERBASE           (OMAP34XX_GPT2)
-#define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
-#define CONFIG_SYS_HZ                  1000
-
-/*
- * Stack sizes
- *
- * The stack sizes are set up in start.S using the settings below
- */
-#define CONFIG_STACKSIZE       (128 << 10)     /* regular stack 128 KiB */
-
-/*
- * Physical Memory Map
- *
- */
-#define CONFIG_NR_DRAM_BANKS   2       /* CS1 may or may not be populated */
-#define PHYS_SDRAM_1           OMAP34XX_SDRC_CS0
-#define PHYS_SDRAM_1_SIZE      (32 << 20)      /* at least 32 meg */
-#define PHYS_SDRAM_2           OMAP34XX_SDRC_CS1
-
-/*
- * FLASH and environment organization
- */
-
-#define PISMO1_ONEN_SIZE               GPMC_SIZE_128M /* Configure the PISMO */
-
-#define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
-
-#define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-
-#define CONFIG_ENV_IS_IN_ONENAND       1
-#define CONFIG_ENV_SIZE                        (512 << 10) /* Total Size Environment */
-#define CONFIG_ENV_ADDR                        ONENAND_ENV_OFFSET
-
-/*
- * Size of malloc() pool
- */
-#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (128 << 10))
-
-#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
-#define CONFIG_SYS_INIT_RAM_ADDR       0x4020f800
-#define CONFIG_SYS_INIT_RAM_SIZE       0x800
-#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR + \
-                                        CONFIG_SYS_INIT_RAM_SIZE - \
-                                        GENERATED_GBL_DATA_SIZE)
-
-#endif /* __CONFIG_H */
diff --git a/include/configs/igep00x0.h b/include/configs/igep00x0.h
new file mode 100644 (file)
index 0000000..a99f332
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Common configuration settings for IGEP technology based boards
+ *
+ * (C) Copyright 2012
+ * ISEE 2007 SL, <www.iseebcn.com>
+ *
+ * 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
+ */
+
+#ifndef __IGEP00X0_H
+#define __IGEP00X0_H
+
+#include <asm/sizes.h>
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_OMAP            1       /* in a TI OMAP core */
+#define CONFIG_OMAP34XX                1       /* which is a 34XX */
+
+#define CONFIG_SDRC    /* The chip has SDRC controller */
+
+#include <asm/arch/cpu.h>
+#include <asm/arch/omap3.h>
+
+/*
+ * Display CPU and Board information
+ */
+#define CONFIG_DISPLAY_CPUINFO         1
+#define CONFIG_DISPLAY_BOARDINFO       1
+
+/* Clock Defines */
+#define V_OSCK                 26000000        /* Clock output from T2 */
+#define V_SCLK                 (V_OSCK >> 1)
+
+#define CONFIG_MISC_INIT_R
+
+#define CONFIG_CMDLINE_TAG             1       /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_INITRD_TAG              1
+#define CONFIG_REVISION_TAG            1
+
+#define CONFIG_OF_LIBFDT               1
+
+/*
+ * NS16550 Configuration
+ */
+
+#define V_NS16550_CLK                  48000000        /* 48MHz (APLL96/2) */
+
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE    (-4)
+#define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
+
+/* select serial console configuration */
+#define CONFIG_CONS_INDEX              3
+#define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3
+#define CONFIG_SERIAL3                 3
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600, \
+                                       115200}
+#define CONFIG_GENERIC_MMC             1
+#define CONFIG_MMC                     1
+#define CONFIG_OMAP_HSMMC              1
+#define CONFIG_DOS_PARTITION           1
+
+/* USB */
+#define CONFIG_MUSB_UDC                        1
+#define CONFIG_USB_OMAP3               1
+#define CONFIG_TWL4030_USB             1
+
+/* USB device configuration */
+#define CONFIG_USB_DEVICE              1
+#define CONFIG_USB_TTY                 1
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV   1
+
+/* Change these to suit your needs */
+#define CONFIG_USBD_VENDORID           0x0451
+#define CONFIG_USBD_PRODUCTID          0x5678
+#define CONFIG_USBD_MANUFACTURER       "Texas Instruments"
+#define CONFIG_USBD_PRODUCT_NAME       "IGEP"
+
+/* commands to include */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_EXT2                /* EXT2 Support                 */
+#define CONFIG_CMD_FAT         /* FAT support                  */
+#define CONFIG_CMD_I2C         /* I2C serial bus support       */
+#define CONFIG_CMD_MMC         /* MMC support                  */
+#define CONFIG_CMD_ONENAND     /* ONENAND support              */
+#define CONFIG_CMD_NET         /* bootp, tftpboot, rarpboot    */
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NFS         /* NFS support                  */
+#define CONFIG_CMD_MTDPARTS    /* Enable MTD parts commands    */
+#define CONFIG_MTD_DEVICE
+
+#undef CONFIG_CMD_FLASH                /* flinfo, erase, protect       */
+#undef CONFIG_CMD_IMLS         /* List all found images        */
+
+#define CONFIG_SYS_NO_FLASH
+#define CONFIG_HARD_I2C                        1
+#define CONFIG_SYS_I2C_SPEED           100000
+#define CONFIG_SYS_I2C_SLAVE           1
+#define CONFIG_SYS_I2C_BUS             0
+#define CONFIG_SYS_I2C_BUS_SELECT      1
+#define CONFIG_DRIVER_OMAP34XX_I2C     1
+
+/*
+ * TWL4030
+ */
+#define CONFIG_TWL4030_POWER           1
+
+#define CONFIG_BOOTDELAY               3
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "usbtty=cdc_acm\0" \
+       "loadaddr=0x82000000\0" \
+       "usbtty=cdc_acm\0" \
+       "console=ttyS2,115200n8\0" \
+       "mpurate=auto\0" \
+       "vram=12M\0" \
+       "dvimode=1024x768MR-16@60\0" \
+       "defaultdisplay=dvi\0" \
+       "mmcdev=0\0" \
+       "mmcroot=/dev/mmcblk0p2 rw\0" \
+       "mmcrootfstype=ext3 rootwait\0" \
+       "nandroot=/dev/mtdblock4 rw\0" \
+       "nandrootfstype=jffs2\0" \
+       "mmcargs=setenv bootargs console=${console} " \
+               "mpurate=${mpurate} " \
+               "vram=${vram} " \
+               "omapfb.mode=dvi:${dvimode} " \
+               "omapfb.debug=y " \
+               "omapdss.def_disp=${defaultdisplay} " \
+               "root=${mmcroot} " \
+               "rootfstype=${mmcrootfstype}\0" \
+       "nandargs=setenv bootargs console=${console} " \
+               "mpurate=${mpurate} " \
+               "vram=${vram} " \
+               "omapfb.mode=dvi:${dvimode} " \
+               "omapfb.debug=y " \
+               "omapdss.def_disp=${defaultdisplay} " \
+               "root=${nandroot} " \
+               "rootfstype=${nandrootfstype}\0" \
+       "loadbootenv=fatload mmc ${mmcdev} ${loadaddr} uEnv.txt\0" \
+       "importbootenv=echo Importing environment from mmc ...; " \
+               "env import -t $loadaddr $filesize\0" \
+       "loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "bootm ${loadaddr}\0" \
+       "nandboot=echo Booting from onenand ...; " \
+               "run nandargs; " \
+               "onenand read ${loadaddr} 280000 400000; " \
+               "bootm ${loadaddr}\0" \
+
+#define CONFIG_BOOTCOMMAND \
+       "if mmc rescan ${mmcdev}; then " \
+               "echo SD/MMC found on device ${mmcdev};" \
+               "if run loadbootenv; then " \
+                       "run importbootenv;" \
+               "fi;" \
+               "if test -n $uenvcmd; then " \
+                       "echo Running uenvcmd ...;" \
+                       "run uenvcmd;" \
+               "fi;" \
+               "if run loaduimage; then " \
+                       "run mmcboot;" \
+               "fi;" \
+       "fi;" \
+       "run nandboot;" \
+
+#define CONFIG_AUTO_COMPLETE           1
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP            /* undef to save memory */
+#define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_SYS_PROMPT              "U-Boot # "
+#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
+/* Boot Argument Buffer Size */
+#define CONFIG_SYS_BARGSIZE            (CONFIG_SYS_CBSIZE)
+
+#define CONFIG_SYS_MEMTEST_START       (OMAP34XX_SDRC_CS0)     /* memtest */
+                                                               /* works on */
+#define CONFIG_SYS_MEMTEST_END         (OMAP34XX_SDRC_CS0 + \
+                                       0x01F00000) /* 31MB */
+
+#define CONFIG_SYS_LOAD_ADDR           (OMAP34XX_SDRC_CS0)     /* default */
+                                                       /* load address */
+
+#define CONFIG_SYS_MONITOR_LEN         (256 << 10)
+
+/*
+ * OMAP3 has 12 GP timers, they can be driven by the system clock
+ * (12/13/16.8/19.2/38.4MHz) or by 32KHz clock. We use 13MHz (V_SCLK).
+ * This rate is divided by a local divisor.
+ */
+#define CONFIG_SYS_TIMERBASE           (OMAP34XX_GPT2)
+#define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
+#define CONFIG_SYS_HZ                  1000
+
+/*
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128 << 10)     /* regular stack 128 KiB */
+
+/*
+ * Physical Memory Map
+ *
+ */
+#define CONFIG_NR_DRAM_BANKS   2       /* CS1 may or may not be populated */
+#define PHYS_SDRAM_1           OMAP34XX_SDRC_CS0
+#define PHYS_SDRAM_1_SIZE      (32 << 20)      /* at least 32 meg */
+#define PHYS_SDRAM_2           OMAP34XX_SDRC_CS1
+
+/*
+ * FLASH and environment organization
+ */
+
+#define PISMO1_ONEN_SIZE               GPMC_SIZE_128M /* Configure the PISMO */
+
+#define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
+
+#define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
+
+#define CONFIG_ENV_IS_IN_ONENAND       1
+#define CONFIG_ENV_SIZE                        (512 << 10) /* Total Size Environment */
+#define CONFIG_ENV_ADDR                        ONENAND_ENV_OFFSET
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (128 << 10))
+
+/*
+ * SMSC911x Ethernet
+ */
+#if defined(CONFIG_CMD_NET)
+#define CONFIG_SMC911X
+#define CONFIG_SMC911X_32_BIT
+#define CONFIG_SMC911X_BASE    0x2C000000
+#endif /* (CONFIG_CMD_NET) */
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
+#define CONFIG_SYS_INIT_RAM_ADDR       0x4020f800
+#define CONFIG_SYS_INIT_RAM_SIZE       0x800
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR + \
+                                        CONFIG_SYS_INIT_RAM_SIZE - \
+                                        GENERATED_GBL_DATA_SIZE)
+
+#endif /* __IGEP00X0_H */
diff --git a/include/configs/ima3-mx53.h b/include/configs/ima3-mx53.h
new file mode 100644 (file)
index 0000000..ea48d64
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * (C) Copyright 2012, Stefano Babic <sbabic@denx.de>
+ *
+ * Copyright (C) 2010 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the MX53-EVK Freescale board.
+ *
+ * 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.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* SOC type must be included before imx-regs.h */
+#define CONFIG_MX53
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/mx5x_pins.h>
+
+#define CONFIG_SYS_MX5_HCLK            24000000
+#define CONFIG_SYS_MX5_CLK32           32768
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+
+#define CONFIG_OF_LIBFDT
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+/* Enable GPIOs */
+#define CONFIG_MXC_GPIO
+
+/* UART */
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE   UART4_BASE_ADDR
+
+/* MMC */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_ESDHC_NUM       1
+
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_DOS_PARTITION
+
+/* Ethernet on FEC */
+#define CONFIG_NET_MULTI
+#define CONFIG_MII
+#define CONFIG_DISCOVER_PHY
+
+#define CONFIG_FEC_MXC
+#define IMX_FEC_BASE                   FEC_BASE_ADDR
+#define CONFIG_FEC_MXC_PHYADDR         0x01
+#define CONFIG_PHY_ADDR                        CONFIG_FEC_MXC_PHYADDR
+#define CONFIG_RESET_PHY_R
+#define CONFIG_FEC_MXC_NO_ANEG
+#define CONFIG_PRIME   "FEC0"
+
+/* SPI */
+#define CONFIG_HARD_SPI
+#define CONFIG_MXC_SPI
+#define CONFIG_DEFAULT_SPI_BUS         1
+#define CONFIG_DEFAULT_SPI_MODE                SPI_MODE_0
+
+/* SPI FLASH - not used for environment */
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_STMICRO
+#define CONFIG_SPI_FLASH_CS            (IOMUX_TO_GPIO(MX53_PIN_CSI0_D11) \
+                                                << 8) | 0
+#define CONFIG_SF_DEFAULT_MODE         SPI_MODE_0
+#define CONFIG_SF_DEFAULT_SPEED                25000000
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      {9600, 19200, 38400, 57600, 115200}
+
+/* Command definition */
+#include <config_cmd_default.h>
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_CMD_SPI
+#define CONFIG_CMD_SF
+#define CONFIG_CMD_GPIO
+
+#define CONFIG_BOOTDELAY       3
+
+#define CONFIG_LOADADDR                0x70800000      /* loadaddr env var */
+#define CONFIG_SYS_TEXT_BASE    0xf0001400 /* uboot in nor flash */
+
+#define CONFIG_ARP_TIMEOUT     200UL
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP            /* undef to save memory */
+#define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_SYS_PROMPT              "IMA3 MX53 U-Boot > "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
+
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS     16      /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START       0x70000000
+#define CONFIG_SYS_MEMTEST_END         0x10000
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+
+#define CONFIG_SYS_HZ          1000
+#define CONFIG_CMDLINE_EDITING
+
+/* Stack sizes */
+#define CONFIG_STACKSIZE       (128 * 1024)    /* regular stack */
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS   1
+#define PHYS_SDRAM_1           CSD0_BASE_ADDR
+#define PHYS_SDRAM_1_SIZE      (1024 * 1024 * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE          (PHYS_SDRAM_1)
+#define CONFIG_SYS_INIT_RAM_ADDR       (IRAM_BASE_ADDR)
+#define CONFIG_SYS_INIT_RAM_SIZE       (IRAM_SIZE)
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+#define CONFIG_MTD_DEVICE              /* needed for mtdparts commands */
+#define MTDIDS_DEFAULT         "nor0=f0000000.flash"
+
+/* FLASH and environment organization */
+
+#define CONFIG_SYS_FLASH_BASE          0xF0000000
+#define CONFIG_SYS_FLASH_CFI           /* Flash is CFI conformant */
+#define CONFIG_FLASH_CFI_DRIVER                /* Use the common driver */
+#define CONFIG_FLASH_CFI_MTD           /* with MTD support */
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
+#define CONFIG_SYS_MAX_FLASH_BANKS     1
+#define CONFIG_SYS_MAX_FLASH_SECT      1024
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)
+
+#define CONFIG_ENV_SIZE        (8 * 1024)
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_ADDR                (CONFIG_SYS_MONITOR_BASE + \
+                               CONFIG_SYS_MONITOR_LEN)
+#define CONFIG_ENV_SECT_SIZE   0x20000
+#define CONFIG_ENV_OFFSET_REDUND       (CONFIG_ENV_OFFSET + \
+                                       CONFIG_ENV_SECT_SIZE)
+#define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE
+
+/*
+ * Default environment and default scripts
+ * to update uboot and load kernel
+ */
+
+#define HOSTNAME ima3-mx53
+#define xstr(s)        str(s)
+#define str(s) #s
+
+#define CONFIG_HOSTNAME ima3-mx53
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "netdev=eth0\0"                                                 \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ramargs=setenv bootargs root=/dev/ram0 rw\0"                   \
+       "addip_sta=setenv bootargs ${bootargs} "                        \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addip_dyn=setenv bootargs ${bootargs} ip=dhcp\0"               \
+       "addip=if test -n ${ipdyn};then run addip_dyn;"                 \
+               "else run addip_sta;fi\0"       \
+       "addmtd=setenv bootargs ${bootargs} ${mtdparts}\0"              \
+       "addtty=setenv bootargs ${bootargs}"                            \
+               " console=${console},${baudrate}\0"                     \
+       "addmisc=setenv bootargs ${bootargs} ${misc}\0"                 \
+       "console=ttymxc3\0"                                             \
+       "loadaddr=70800000\0"                                           \
+       "kernel_addr_r=70800000\0"                                      \
+       "ramdisk_addr_r=71000000\0"                                     \
+       "hostname=" xstr(CONFIG_HOSTNAME) "\0"                          \
+       "bootfile=" xstr(CONFIG_HOSTNAME) "/uImage\0"                   \
+       "ramdisk_file=" xstr(CONFIG_HOSTNAME) "/uRamdisk\0"             \
+       "mmcargs=setenv bootargs root=${mmcroot} "                      \
+               "rootfstype=${mmcrootfstype}\0"                         \
+       "mmcroot=/dev/mmcblk0p3 rw\0"                                   \
+       "mmcboot=echo Booting from mmc ...; "                           \
+               "run mmcargs addip addtty addmtd addmisc mmcload;"      \
+               "bootm\0"                                               \
+       "mmcload=fatload mmc ${mmcdev}:${mmcpart} "                     \
+               "${loadaddr} ${uimage}\0"                               \
+       "mmcrootfstype=ext3 rootwait\0"                                 \
+       "flash_self=run ramargs addip addtty addmtd addmisc;"           \
+               "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
+       "flash_nfs=run nfsargs addip addtty addmtd addmisc;"            \
+               "bootm ${kernel_addr}\0"                                \
+       "net_nfs=tftp ${kernel_addr_r} ${bootfile}; "                   \
+               "run nfsargs addip addtty addmtd addmisc;"              \
+               "bootm ${kernel_addr_r}\0"                              \
+       "net_self_load=tftp ${ramdisk_addr_r} ${ramdisk_file};"         \
+               "tftp ${kernel_addr_r} ${bootfile}\0"                   \
+       "net_self=if run net_self_load;then "                           \
+               "run ramargs addip addtty addmtd addmisc;"              \
+               "bootm ${kernel_addr_r} ${ramdisk_addr_r};"             \
+               "else echo Images not loades;fi\0"                      \
+       "satargs=setenv bootargs root=/dev/sda1\0"                      \
+       "satafile=boot/uImage\0"                                        \
+       "ssdboot=echo Booting from ssd ...; "                           \
+               "run satargs addip addtty addmtd addmisc;"              \
+               "sata init;ext2load sata 0:1 ${kernel_addr_r} "         \
+               "${satafile};bootm\0"                                   \
+       "u-boot=" xstr(CONFIG_HOSTNAME) "/u-boot.imx\0"                 \
+       "uimage=uImage\0"                                               \
+       "load=tftp ${loadaddr} ${u-boot}\0"                             \
+       "uboot_addr=0xf0001000\0"                                       \
+       "update=protect off 0xf0000000 +60000;"                         \
+               "erase ${uboot_addr} +60000;"                           \
+               "cp.b ${loadaddr} ${uboot_addr} ${filesize}\0"          \
+       "upd=if run load;then echo Updating u-boot;if run update;"      \
+               "then echo U-Boot updated;"                             \
+                       "else echo Error updating u-boot !;"            \
+                       "echo Board without bootloader !!;"             \
+               "fi;"                                                   \
+               "else echo U-Boot not downloaded..exiting;fi\0"         \
+       "bootcmd=run net_nfs\0"
+
+
+#define CONFIG_CMD_SATA
+#ifdef CONFIG_CMD_SATA
+       #define CONFIG_DWC_AHSATA
+       #define CONFIG_SYS_SATA_MAX_DEVICE      1
+       #define CONFIG_DWC_AHSATA_PORT_ID       0
+       #define CONFIG_DWC_AHSATA_BASE_ADDR     SATA_BASE_ADDR
+       #define CONFIG_LBA48
+       #define CONFIG_LIBATA
+#endif
+
+#endif                         /* __CONFIG_H */
index 2af4e7af3144f211aa2a0e1e971ec9eacdb08285..c1f1aa6a8a37e4e587fa321f65bef6014a1f2f1d 100644 (file)
 #define CONFIG_SYS_NAND_BASE           0xd8000000
 #define CONFIG_JFFS2_NAND
 #define CONFIG_MXC_NAND_HWECC
-#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for nand_util.c */
 
 /*
  * SD/MMC
index 012381a500a4ea029133ef5c878979ee2d9985b6..c62f4d01fd3c477caf263b91bcbf6b4ebdba6055 100644 (file)
@@ -43,6 +43,8 @@
 #define        CONFIG_ARCH_CPU_INIT
 #define        CONFIG_ARCH_MISC_INIT
 
+#define CONFIG_OF_LIBFDT
+
 /*
  * SPL
  */
@@ -52,6 +54,7 @@
 #define        CONFIG_SPL_LDSCRIPT     "arch/arm/cpu/arm926ejs/mx28/u-boot-spl.lds"
 #define        CONFIG_SPL_LIBCOMMON_SUPPORT
 #define        CONFIG_SPL_LIBGENERIC_SUPPORT
+#define        CONFIG_SPL_GPIO_SUPPORT
 
 /*
  * U-Boot Commands
@@ -84,7 +87,7 @@
  */
 #define        CONFIG_NR_DRAM_BANKS            1               /* 1 bank of DRAM */
 #define        PHYS_SDRAM_1                    0x40000000      /* Base address */
-#define        PHYS_SDRAM_1_SIZE               0x40000000      /* Max 1 GB RAM */
+#define        PHYS_SDRAM_1_SIZE               0x20000000      /* Max 512 MB RAM */
 #define        CONFIG_STACKSIZE                0x00010000      /* 128 KB stack */
 #define        CONFIG_SYS_MALLOC_LEN           0x00400000      /* 4 MB for malloc */
 #define        CONFIG_SYS_GBL_DATA_SIZE        128             /* Initial data */
 #define        CONFIG_BOOTCOMMAND      "run bootcmd_net"
 #define        CONFIG_LOADADDR         0x42000000
 #define        CONFIG_SYS_LOAD_ADDR    CONFIG_LOADADDR
+#define        CONFIG_OF_LIBFDT
 
 /*
  * Extra Environments
 #define        CONFIG_EXTRA_ENV_SETTINGS                                       \
        "update_nand_full_filename=u-boot.nand\0"                       \
        "update_nand_firmware_filename=u-boot.sb\0"                     \
+       "update_sd_firmware_filename=u-boot.sd\0"                       \
        "update_nand_firmware_maxsz=0x100000\0"                         \
        "update_nand_stride=0x40\0"     /* MX28 datasheet ch. 12.12 */  \
        "update_nand_count=0x4\0"       /* MX28 datasheet ch. 12.12 */  \
                "nand erase ${fcb_sz} ${fw_sz} ; "                      \
                "nand write ${loadaddr} ${fcb_sz} ${filesize} ; "       \
                "nand write ${loadaddr} ${fw_off} ${filesize} ; "       \
+               "fi\0"                                                  \
+       "update_sd_firmware="           /* Update the SD firmware partition */ \
+               "if mmc rescan ; then "                                 \
+               "if tftp ${update_sd_firmware_filename} ; then "        \
+               "setexpr fw_sz ${filesize} / 0x200 ; "  /* SD block size */ \
+               "setexpr fw_sz ${fw_sz} + 1 ; "                         \
+               "mmc write ${loadaddr} 0x800 ${fw_sz} ; "               \
+               "fi ; "                                                 \
                "fi\0"
 
 #endif /* __M28_H__ */
index 1315c3ceb81097433970b539bc86dbd04d610840..f6a83a8505eece56d076143e9b78a0ef62f314b0 100644 (file)
 
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of */
                                                        /* NAND devices */
-#define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */
-
 #define CONFIG_JFFS2_NAND
 /* nand device jffs2 lives on */
 #define CONFIG_JFFS2_DEV               "nand0"
 #define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/omap-common/u-boot-spl.lds"
 
 #define CONFIG_SPL_TEXT_BASE           0x40200000 /*CONFIG_SYS_SRAM_START*/
-#define CONFIG_SPL_MAX_SIZE            (45 << 10)
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 /* move malloc and bss high to prevent clashing with the main image */
index d6197bc610ab3ff1b8ff3dd94eabe84e7050b5ad..db1e87d69c1687af36eb6cd469ebab6f292bb23f 100644 (file)
 # define CONFIG_SYS_NAND_MASK_CLE              (1 << 22)
 # define CONFIG_SYS_NAND_ENABLE_PIN            AT91_PIO_PORTD, 15
 # define CONFIG_SYS_NAND_READY_PIN             AT91_PIO_PORTA, 22
-# define CONFIG_SYS_64BIT_VSPRINTF             /* needed for nand_util.c */
 #endif
 
 /* Ethernet */
index 1a6379176b3b4c3590326abe6f0aa43b16bb420b..27b489902bd75ad6746b84326ca2f4045ae35f49 100644 (file)
  */
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for nand_util.c */
 #endif
 
 /*
index d1ba02b6eedcd8875572c2f56e93a6cb9f5cd080..7210b6e80f24dd3a493fcd9f9662d62ffe5f9263 100644 (file)
@@ -65,7 +65,6 @@
 #define CONFIG_ENV_IS_NOWHERE
 
 #define CONFIG_SYS_NO_FLASH
-#define CONFIG_SYS_64BIT_VSPRINTF
 
 /* U-Boot general configuration */
 #define CONFIG_SYS_PROMPT      "MX25PDK U-Boot > "
index 02f3366ed263ff66fe3b9b2089ec95ef461a92c0..0c18e5022a142e98e2e1e5510cf5bdf5e3aaa699 100644 (file)
@@ -46,6 +46,7 @@
 #define CONFIG_SPL_LDSCRIPT    "arch/arm/cpu/arm926ejs/mx28/u-boot-spl.lds"
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_GPIO_SUPPORT
 
 /*
  * U-Boot Commands
@@ -67,6 +68,7 @@
 #define CONFIG_CMD_SF
 #define CONFIG_CMD_SPI
 #define CONFIG_CMD_USB
+#define CONFIG_CMD_BOOTZ
 
 /*
  * Memory configurations
 #define CONFIG_MXS_MMC
 #endif
 
+/*
+ * NAND Driver
+ */
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_NAND_MXS
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           0x60000000
+#define CONFIG_SYS_NAND_5_ADDR_CYCLE
+#endif
+
 /*
  * Ethernet on SOC (FEC)
  */
 #define CONFIG_BOOTCOMMAND     "run bootcmd_net"
 #define CONFIG_LOADADDR        0x42000000
 #define CONFIG_SYS_LOAD_ADDR   CONFIG_LOADADDR
+#define CONFIG_OF_LIBFDT
 
 /*
  * Extra Environments
index 49d440b9ae3c736223244c179c9577d5c7942449..6ce97bc69fe14f9fda0ec7a042f28160c86feb59 100644 (file)
@@ -99,6 +99,7 @@
 #define CONFIG_CMD_SPI
 #define CONFIG_CMD_DATE
 #define CONFIG_CMD_NAND
+#define CONFIG_CMD_BOOTZ
 
 /*
  * Disabled due to compilation errors in cmd_bootm.c (IMLS seems to require
index de4b954a52fa3d225aa8766e1004cf0a294a1e1b..bd57baa808ff1c4f76735ec7c6555097b3b11aa2 100644 (file)
@@ -39,8 +39,6 @@
 #define CONFIG_SYS_TEXT_BASE   0xA0000000
 #define CONFIG_SYS_CACHELINE_SIZE      32
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-
 #define CONFIG_BOARD_EARLY_INIT_F
 #define CONFIG_BOARD_LATE_INIT
 
index 34a4edd41e921f038bc82716f9ad7b21af0c1f59..eab0e27fb5f64ab25d5cf96b8c9895ececc02211 100644 (file)
@@ -27,7 +27,6 @@
 
 #define CONFIG_SYS_MX5_HCLK    24000000
 #define CONFIG_SYS_MX5_CLK32           32768
-#define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
 
 #define CONFIG_MACH_TYPE       MACH_TYPE_MX53_LOCO
@@ -42,7 +41,9 @@
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
 
 #define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_LATE_INIT
 #define CONFIG_MXC_GPIO
+#define CONFIG_REVISION_TAG
 
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE   UART1_BASE
@@ -56,6 +57,7 @@
 #define CONFIG_CMD_MMC
 #define CONFIG_GENERIC_MMC
 #define CONFIG_CMD_FAT
+#define CONFIG_CMD_EXT2
 #define CONFIG_DOS_PARTITION
 
 /* Eth Configs */
 #define CONFIG_MXC_USB_PORTSC  (PORT_PTS_UTMI | PORT_PTS_PTW)
 #define CONFIG_MXC_USB_FLAGS   0
 
+/* I2C Configs */
+#define CONFIG_HARD_I2C
+#define CONFIG_I2C_MXC
+#define CONFIG_SYS_I2C_MX53_PORT1
+#define CONFIG_SYS_I2C_SPEED           100000
+#define CONFIG_SYS_I2C_SLAVE           0xfe
+
+/* PMIC Controller */
+#define CONFIG_PMIC
+#define CONFIG_PMIC_I2C
+#define CONFIG_DIALOG_PMIC
+#define CONFIG_PMIC_FSL
+#define CONFIG_SYS_DIALOG_PMIC_I2C_ADDR        0x48
+#define CONFIG_SYS_FSL_PMIC_I2C_ADDR   0x8
+
 /* allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_CONS_INDEX              1
 
 #define CONFIG_OF_LIBFDT
 
+#define CONFIG_CMD_SATA
+#ifdef CONFIG_CMD_SATA
+       #define CONFIG_DWC_AHSATA
+       #define CONFIG_SYS_SATA_MAX_DEVICE      1
+       #define CONFIG_DWC_AHSATA_PORT_ID       0
+       #define CONFIG_DWC_AHSATA_BASE_ADDR     SATA_BASE_ADDR
+       #define CONFIG_LBA48
+       #define CONFIG_LIBATA
+#endif
+
 #endif                         /* __CONFIG_H */
index e83aec6c21e798a10bca89419ca833af8ae0d249..90652c6629998439a2b9a1e24b1a61cf8ed65d69 100644 (file)
 #define CONFIG_SYS_MMC_ENV_DEV         1
 
 #define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
 
 #define CONFIG_SYS_DCACHE_OFF
 
index 3f7e51d877cd3032b4c4e1f51f9d3bb053697659..feabc05a475b022e194bf84972f4f9b46c1da350 100644 (file)
@@ -42,6 +42,7 @@
 
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MISC_INIT_R
 #define CONFIG_MXC_GPIO
 
 #define CONFIG_MXC_UART
 #define CONFIG_CMD_FAT
 #define CONFIG_DOS_PARTITION
 
+#define CONFIG_CMD_SATA
+/*
+ * SATA Configs
+ */
+#ifdef CONFIG_CMD_SATA
+#define CONFIG_DWC_AHSATA
+#define CONFIG_SYS_SATA_MAX_DEVICE     1
+#define CONFIG_DWC_AHSATA_PORT_ID      0
+#define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
+#define CONFIG_LBA48
+#define CONFIG_LIBATA
+#endif
+
 #define CONFIG_CMD_PING
 #define CONFIG_CMD_DHCP
 #define CONFIG_CMD_MII
 
 #define CONFIG_BOOTDELAY              3
 
+#define CONFIG_PREBOOT                 ""
+
 #define CONFIG_LOADADDR                               0x10800000
 #define CONFIG_SYS_TEXT_BASE          0x17800000
 
 #endif
 
 #define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
 
 #define CONFIG_SYS_DCACHE_OFF
 
index ddeb4146f756cc096432efe75a7c7501d7177eec..b891ee49255d6649dbf5b6b5d5670cfd883e1f78 100644 (file)
 #define CONFIG_SPL
 #define CONFIG_SPL_NAND_SIMPLE
 #define CONFIG_SPL_TEXT_BASE           0x40200800
-#define CONFIG_SPL_MAX_SIZE            (45 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
 #define CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION   1
 #define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME       "u-boot.img"
 
+#define CONFIG_SPL_BOARD_INIT
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBDISK_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
index 4910ddaa83b14c9e966aa78d8323440137f779b0..7b21a5c8c4b9ebd76496b87bbbb85f12f3274905 100644 (file)
 /* Defines for SPL */
 #define CONFIG_SPL
 #define CONFIG_SPL_TEXT_BASE           0x40200800
-#define CONFIG_SPL_MAX_SIZE            (45 * 1024)     /* 45 KB */
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
 #define CONFIG_SPL_BSS_MAX_SIZE                0x80000         /* 512 KB */
 
+#define CONFIG_SPL_BOARD_INIT
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBDISK_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
index 64adc7455c52b3fd18cea5ff09a6cdf5b0a9c257..a0a7a1c42aeeb2f964f1cfce00be64d4d0c7197f 100644 (file)
 #define CONFIG_SPL
 #define CONFIG_SPL_NAND_SIMPLE
 #define CONFIG_SPL_TEXT_BASE           0x40200800
-#define CONFIG_SPL_MAX_SIZE            (45 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 /* move malloc and bss high to prevent clashing with the main image */
 #define CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION   1
 #define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME       "u-boot.img"
 
+#define CONFIG_SPL_BOARD_INIT
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBDISK_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
index 4df5f5dac55f41e263d81de20537e7e23987b67e..d02f338437409e088c6ec39427dec5840d74ca20 100644 (file)
        "usbtty=cdc_acm\0" \
        "loadaddr=0x82000000\0" \
        "bootargs=ubi.mtd=4 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs " \
-       "rw rootflags=bulk_read console=ttyS0,115200n8 " \
-       "vram=6272K omapfb.vram=0:3000K\0" \
+               "rw rootflags=bulk_read vram=6272K omapfb.vram=0:3000K\0" \
        "mtdparts=" MTDPARTS_DEFAULT "\0" \
 
 #define CONFIG_BOOTCOMMAND \
index a989721afc4eab7ce6f743961e801d5f1303b913..072e17bab8f141270efc2f9c33ff6a948e801d84 100644 (file)
@@ -35,7 +35,6 @@
 #define CONFIG_OMAP            1       /* in a TI OMAP core */
 #define CONFIG_OMAP44XX                1       /* which is a 44XX */
 #define CONFIG_OMAP4430                1       /* which is in a 4430 */
-#define CONFIG_ARCH_CPU_INIT
 
 /* Get CPU defs */
 #include <asm/arch/cpu.h>
 #define CONFIG_GENERIC_MMC             1
 #define CONFIG_MMC                     1
 #define CONFIG_OMAP_HSMMC              1
-#define CONFIG_SYS_MMC_SET_DEV         1
 #define CONFIG_DOS_PARTITION           1
 
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "loadaddr=0x82000000\0" \
        "console=ttyO2,115200n8\0" \
+       "fdt_high=0xffffffff\0" \
        "usbtty=cdc_acm\0" \
        "vram=16M\0" \
        "mmcdev=0\0" \
 
 #define CONFIG_SYS_ENABLE_PADS_ALL
 
+#define CONFIG_SYS_THUMB_BUILD
+
 #endif /* __CONFIG_OMAP4_COMMON_H */
index a8dfef321d36ca5668bdb27d7daf4f1773bf6a39..d3a2438e2824ddc106881d6a1f720a0e444bdeed 100644 (file)
@@ -44,8 +44,6 @@
 
 #undef CONFIG_USE_IRQ  /* we don't need IRQ/FIQ stuff */
 
-#define CONFIG_MISC_INIT_R
-
 #define CONFIG_CMDLINE_TAG     1       /* enable passing of ATAGs  */
 #define CONFIG_SETUP_MEMORY_TAGS       1
 #define CONFIG_INITRD_TAG      1       /* Required for ramdisk support */
index d3d526310ea54fd45593351dd411a9b8d937b09e..38b5028060ade6a8d311996f49e6af9444300009 100644 (file)
@@ -38,7 +38,6 @@
 #define CONFIG_OMAP54XX        /* which is a 54XX */
 #define CONFIG_OMAP5430        /* which is in a 5430 */
 #define CONFIG_5430EVM /* working with EVM */
-#define CONFIG_ARCH_CPU_INIT
 
 /* Get CPU defs */
 #include <asm/arch/cpu.h>
 #define CONFIG_DISPLAY_BOARDINFO
 
 /* Clock Defines */
-#define V_OSCK 38400000 /* Clock output from T2 */
+#define V_OSCK                 19200000        /* Clock output from T2 */
 #define V_SCLK V_OSCK
+#define CONFIG_SYS_CLOCKS_ENABLE_ALL   1       /* Enable all clocks */
+#define CONFIG_SYS_ENABLE_PADS_ALL     1       /* Enable all PADS for now */
 
 #undef CONFIG_USE_IRQ  /* no support for IRQs */
 #define CONFIG_MISC_INIT_R
 #define CONFIG_DRIVER_OMAP34XX_I2C
 #define CONFIG_I2C_MULTI_BUS
 
-/* TWL6030 */
-#define CONFIG_TWL6030_POWER
-#define CONFIG_CMD_BAT
+/* TWL6035 */
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_TWL6035_POWER
+#endif
 
 /* MMC */
 #define CONFIG_GENERIC_MMC
 #define CONFIG_ENV_IS_IN_MMC
 #define CONFIG_SYS_MMC_ENV_DEV         1       /* SLOT2: eMMC(1) */
 #define CONFIG_ENV_OFFSET              0xE0000
+#define CONFIG_CMD_SAVEENV
 
-/* USB */
-#define CONFIG_MUSB_UDC
-#define CONFIG_USB_OMAP3
-
-/* USB device configuration */
-#define CONFIG_USB_DEVICE
-#define CONFIG_USB_TTY
 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
 
 /* Flash */
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "loadaddr=0x82000000\0" \
-       "console=ttyS2,115200n8\0" \
+       "console=ttyO2,115200n8\0" \
        "usbtty=cdc_acm\0" \
        "vram=16M\0" \
        "mmcdev=0\0" \
 
 /* Defines for SPL */
 #define CONFIG_SPL
-#define CONFIG_SPL_TEXT_BASE           0x40304350
-#define CONFIG_SPL_MAX_SIZE            0x1E000 /* 120K */
+#define CONFIG_SPL_TEXT_BASE           0x40300350
+#define CONFIG_SPL_MAX_SIZE            0x19000 /* 100K */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300 /* address 0x60000 */
index 26e7e1f1e0efd4a6a455066d210c359d0c68bc56..f7900e0d83fcd0b5616bd3862c399e8462806ada 100644 (file)
@@ -49,8 +49,6 @@
 
 #undef CONFIG_USE_IRQ                       /* we don't need IRQ/FIQ stuff */
 
-#define CONFIG_MISC_INIT_R
-
 #define CONFIG_CMDLINE_TAG        1         /* enable passing of ATAGs  */
 #define CONFIG_SETUP_MEMORY_TAGS   1
 
index 8ede82575c74136ccbb54f1b254135d04c24eb82..367f991848b3119e6d14cf0cfb6c7408f4ddbcfe 100644 (file)
 #define EXYNOS4_DEFAULT_UART_OFFSET    0x020000
 
 /* SD/MMC configuration */
-#define CONFIG_GENERIC_MMC             1
-#define CONFIG_MMC                     1
-#define CONFIG_S5P_MMC                 1
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_SDHCI
+#define CONFIG_S5P_SDHCI
 
 /* PWM */
 #define CONFIG_PWM                     1
index b322c775a1052775a35bfa7f1d06ba177a83c56d..85993789b9713dd77ec116caed5596de9e6e6bf7 100644 (file)
 # define CONFIG_SYS_NAND_MASK_CLE              (1 << 22)
 # define CONFIG_SYS_NAND_ENABLE_PIN            AT91_PIO_PORTD, 15
 # define CONFIG_SYS_NAND_READY_PIN             AT91_PIO_PORTA, 22
-# define CONFIG_SYS_64BIT_VSPRINTF             /* needed for nand_util.c */
 #endif
 
 /* Ethernet */
index 9f2951d687983d3331ab0ad5035be05e6cf4c4a1..04fd8d07f58a6529e6858f85b3df91cd81327683 100644 (file)
 #define CONFIG_OF_BOARD_SETUP
 #define CONFIG_OF_STDOUT_VIA_ALIAS
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-#define CONFIG_SYS_64BIT_STRTOUL
-
 /* new uImage format support */
 #define CONFIG_FIT
 #define CONFIG_FIT_VERBOSE     /* enable fit_format_{error,warning}() */
diff --git a/include/configs/pogo_e02.h b/include/configs/pogo_e02.h
new file mode 100644 (file)
index 0000000..df46be5
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2012
+ * David Purdy <david.c.purdy@gmail.com>
+ *
+ * Based on Kirkwood support:
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _CONFIG_POGO_E02_H
+#define _CONFIG_POGO_E02_H
+
+/*
+ * Machine type definition and ID
+ */
+#define MACH_TYPE_POGO_E02             3542
+#define CONFIG_MACH_TYPE               MACH_TYPE_POGO_E02
+#define CONFIG_IDENT_STRING            "\nPogo E02"
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+#define CONFIG_FEROCEON_88FR131                /* CPU Core subversion */
+#define CONFIG_KIRKWOOD                        /* SOC Family Name */
+#define CONFIG_KW88F6281               /* SOC Name */
+#define CONFIG_SKIP_LOWLEVEL_INIT      /* disable board lowlevel_init */
+
+/*
+ * Commands configuration
+ */
+#define CONFIG_SYS_NO_FLASH            /* Declare no flash (NOR/SPI) */
+#define CONFIG_SYS_MVFS
+#include <config_cmd_default.h>
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_USB
+
+/*
+ * mv-common.h should be defined after CMD configs since it used them
+ * to enable certain macros
+ */
+#include "mv-common.h"
+
+/* Remove or override few declarations from mv-common.h */
+#undef CONFIG_SYS_PROMPT       /* previously defined in mv-common.h */
+#define CONFIG_SYS_PROMPT      "PogoE02> "
+
+/*
+ *  Environment variables configurations
+ */
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_SECT_SIZE           0x20000 /* 128K */
+#else
+#define CONFIG_ENV_IS_NOWHERE
+#endif
+
+#define CONFIG_ENV_SIZE                        0x20000 /* 128k */
+#define CONFIG_ENV_OFFSET              0x60000 /* env starts here */
+
+/*
+ * Default environment variables
+ */
+#define CONFIG_BOOTCOMMAND \
+       "setenv bootargs $(bootargs_console); " \
+       "run bootcmd_usb; " \
+       "bootm 0x00800000 0x01100000"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "mtdparts=mtdparts=orion_nand:1M(u-boot),4M(uImage)," \
+       "32M(rootfs),-(data)\0"\
+       "mtdids=nand0=orion_nand\0"\
+       "bootargs_console=console=ttyS0,115200\0" \
+       "bootcmd_usb=usb start; ext2load usb 0:1 0x00800000 /uImage; " \
+       "ext2load usb 0:1 0x01100000 /uInitrd\0"
+
+/*
+ * Ethernet Driver configuration
+ */
+#ifdef CONFIG_CMD_NET
+#define CONFIG_MVGBE_PORTS     {1, 0}  /* enable port 0 only */
+#define CONFIG_PHY_BASE_ADR    0
+#endif /* CONFIG_CMD_NET */
+
+/*
+ * File system
+ */
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_JFFS2
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+#define CONFIG_RBTREE
+#define CONFIG_MTD_DEVICE               /* needed for mtdparts commands */
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_LZO
+
+#endif /* _CONFIG_POGO_E02_H */
index 56b5547fd27d8794a19338ecc22f1edbdeb67075..e133a17259c360491593c4f7f09cb088c70798ed 100644 (file)
 #define CONFIG_BAUDRATE                        115200
 
 /* MMC */
-#define CONFIG_GENERIC_MMC             1
-#define CONFIG_MMC                     1
-#define CONFIG_S5P_MMC                 1
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_SDHCI
+#define CONFIG_S5P_SDHCI
 
 /* PWM */
 #define CONFIG_PWM                     1
index 13012756ab5b3c4c94350f10d64cc3436014d9f5..00db374182f4cc059254be53e5e6ef7af94ac9f0 100644 (file)
 #define CONFIG_BAUDRATE                115200
 
 /* MMC */
-#define CONFIG_GENERIC_MMC     1
-#define CONFIG_MMC             1
-#define CONFIG_S5P_MMC         1
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_SDHCI
+#define CONFIG_S5P_SDHCI
 
 /* PWM */
 #define CONFIG_PWM                     1
index ae075e786ef91848e7a3bf768e34e625e54dc835..46d42281b78d2ee3c53acd503addbfa453e26afa 100644 (file)
 #define __CONFIG_H
 
 #include <asm/sizes.h>
+
+/* LP0 suspend / resume */
+#define CONFIG_TEGRA2_LP0
+#define CONFIG_AES
+#define CONFIG_TEGRA_PMU
+#define CONFIG_TPS6586X_POWER
+#define CONFIG_TEGRA_CLOCK_SCALING
+
 #include "tegra2-common.h"
 
 /* Enable fdt support for Seaboard. Flash the image in u-boot-dtb.bin */
 #define CONFIG_USB_STORAGE
 #define CONFIG_CMD_USB
 
+/* Enable keyboard */
+#define CONFIG_TEGRA2_KEYBOARD
+#define CONFIG_KEYBOARD
+
+#undef TEGRA2_DEVICE_SETTINGS
+#define TEGRA2_DEVICE_SETTINGS "stdin=serial,tegra-kbc\0" \
+                                       "stdout=serial\0" \
+                                       "stderr=serial\0"
 #endif /* __CONFIG_H */
index 9659f9ebd9a44a3cc5e480c1afc850979449be86..0f63040d259d9cba0acb85f1e229a939c4b5bfab 100644 (file)
@@ -78,7 +78,8 @@
 /* SD/MMC configuration */
 #define CONFIG_GENERIC_MMC
 #define CONFIG_MMC
-#define CONFIG_S5P_MMC
+#define CONFIG_SDHCI
+#define CONFIG_S5P_SDHCI
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index 93c25da1cfb6054cb76802eab55c5b138231f08d..702134bda32ba8ba19a27513dd9286d6408ef3cf 100644 (file)
 #define EXYNOS4_DEFAULT_UART_OFFSET    0x010000
 
 /* SD/MMC configuration */
-#define CONFIG_GENERIC_MMC             1
-#define CONFIG_MMC                     1
-#define CONFIG_S5P_MMC                 1
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_SDHCI
+#define CONFIG_S5P_SDHCI
 
 /* PWM */
 #define CONFIG_PWM                     1
index a79181565e2694dde472821a72acd777a3d4fe11..ab1b33209e369fa790caed83ab8fbcee70d78741 100644 (file)
 #define CONFIG_SYS_BARGSIZE                    CONFIG_SYS_CBSIZE
 #define CONFIG_SYS_LOAD_ADDR                   0x00800000
 #define CONFIG_SYS_CONSOLE_INFO_QUIET          1
-#define CONFIG_SYS_64BIT_VSPRINTF              1
 
 #define CONFIG_EXTRA_ENV_SETTINGS              CONFIG_EXTRA_ENV_USBTTY
 
index 4c4321d2ff3606d700445648eed2dbe9d67a33ff..3fc2c443490283ffb0ec46f7c7399fa5ce19be79 100644 (file)
 
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of */
                                                        /* NAND devices */
-#define CONFIG_SYS_64BIT_VSPRINTF              /* needed for nand_util.c */
 
 #define CONFIG_AUTO_COMPLETE
 
 #define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/omap-common/u-boot-spl.lds"
 
 #define CONFIG_SPL_TEXT_BASE           0x40200000 /*CONFIG_SYS_SRAM_START*/
-#define CONFIG_SPL_MAX_SIZE            (45 << 10)      /* 45 K */
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SYS_SPL_MALLOC_START    0x8f000000
index 837f859c7cccce4326e0440c5a030b0a9224ce28..068ce8855ff6efe49eb2ad3982dba8c94bbe2f0d 100644 (file)
 #define __TEGRA2_COMMON_H
 #include <asm/sizes.h>
 
+/*
+ * QUOTE(m) will evaluate to a string version of the value of the macro m
+ * passed in.  The extra level of indirection here is to first evaluate the
+ * macro m before applying the quoting operator.
+ */
+#define QUOTE_(m)       #m
+#define QUOTE(m)        QUOTE_(m)
+
 /*
  * High Level Configuration Options
  */
 #define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs */
 #define CONFIG_OF_LIBFDT               /* enable passing of devicetree */
 
+#ifdef CONFIG_TEGRA2_LP0
+#define TEGRA_LP0_ADDR                 0x1C406000
+#define TEGRA_LP0_SIZE                 0x2000
+#define TEGRA_LP0_VEC \
+       "lp0_vec=" QUOTE(TEGRA_LP0_SIZE) "@" QUOTE(TEGRA_LP0_ADDR) " "
+#else
+#define TEGRA_LP0_VEC
+#endif
+
 /* Environment */
 #define CONFIG_ENV_SIZE                        0x2000  /* Total Size Environment */
 
 
 #define CONFIG_SYS_NO_FLASH
 
-/* Environment information */
+/* Environment information, boards can override if required */
+#define CONFIG_CONSOLE_MUX
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define TEGRA2_DEVICE_SETTINGS "stdin=serial\0" \
+                                       "stdout=serial\0" \
+                                       "stderr=serial\0"
+
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "console=ttyS0,115200n8\0" \
        "mem=" TEGRA2_SYSMEM "\0" \
        "smpflag=smp\0" \
+       TEGRA2_DEVICE_SETTINGS
 
 #define CONFIG_LOADADDR                0x408000        /* def. location for kernel */
 #define CONFIG_BOOTDELAY       2               /* -1 to disable auto boot */
index 10f11d95792edb04389b2a3f90d55cd4eaac09d2..ef6510e67ddaf162ade3165fa3a642ed8e78012f 100644 (file)
@@ -53,7 +53,6 @@
 
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_CMDLINE_TAG
-#define CONFIG_INITRD_TAG
 #define CONFIG_REVISION_TAG
 #define CONFIG_CMDLINE_EDITING
 #define CONFIG_SKIP_LOWLEVEL_INIT
@@ -74,7 +73,8 @@
 /* MMC */
 #define CONFIG_GENERIC_MMC
 #define CONFIG_MMC
-#define CONFIG_S5P_MMC
+#define CONFIG_S5P_SDHCI
+#define CONFIG_SDHCI
 
 /* PWM */
 #define CONFIG_PWM
 /* TRATS has 2 banks of DRAM */
 #define CONFIG_NR_DRAM_BANKS   2
 #define PHYS_SDRAM_1           CONFIG_SYS_SDRAM_BASE   /* LDDDR2 DMC 0 */
-#define PHYS_SDRAM_1_SIZE      (256 << 20)             /* 256 MB in CS 0 */
+#define PHYS_SDRAM_1_SIZE      (512 << 20)             /* 512 MB in CS 0 */
 #define PHYS_SDRAM_2           0x50000000              /* LPDDR2 DMC 1 */
-#define PHYS_SDRAM_2_SIZE      (256 << 20)             /* 256 MB in CS 0 */
+#define PHYS_SDRAM_2_SIZE      (512 << 20)             /* 512 MB in CS 0 */
 
 #define CONFIG_SYS_MEM_TOP_HIDE                (1 << 20)       /* ram console */
 
 
 #define CONFIG_PMIC
 #define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_MAX8998
+#define CONFIG_PMIC_MAX8997
 
 #define CONFIG_USB_GADGET
 #define CONFIG_USB_GADGET_S3C_UDC_OTG
 #define CONFIG_USB_GADGET_DUALSPEED
 
+/* LCD */
+#define CONFIG_EXYNOS_FB
+#define CONFIG_LCD
+#define CONFIG_FB_ADDR         0x52504000
+#define CONFIG_S6E8AX0
+#define CONFIG_EXYNOS_MIPI_DSIM
+#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (1280 * 720 * 4)
+
 #endif /* __CONFIG_H */
index 801a24fd889da79a40f89e7358159af617eae1d3..9955fca4768064b2e58bbe5a02d1cdccdd834ec9 100644 (file)
 #define CONFIG_SPL
 #define CONFIG_SPL_NAND_SIMPLE
 
+#define CONFIG_SPL_BOARD_INIT
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #define CONFIG_SPL_LIBDISK_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 0x300 /* address 0x60000 */
 
 #define CONFIG_SPL_TEXT_BASE           0x40200000 /*CONFIG_SYS_SRAM_START*/
-#define CONFIG_SPL_MAX_SIZE            0xB400  /* 45 K */
+#define CONFIG_SPL_MAX_SIZE            (54 * 1024)     /* 8 KB for stack */
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000 /*CONFIG_SYS_SDRAM_BASE*/
index 87bd8a6756ca98e2948a6bb2b91182a6b148e559..3dfafa50775efb861189293c464c343b2384f80a 100644 (file)
 #define CONFIG_MXC_NAND_HWECC
 #define CONFIG_SYS_NAND_LARGEPAGE
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-
 /* U-Boot general configuration */
 #define CONFIG_SYS_PROMPT      "=> "   /* Monitor Command Prompt */
 #define CONFIG_SYS_CBSIZE      1024    /* Console I/O Buffer Size  */
index 599d5bb42aacc9f3a9b24106b958f27a763c6acc..d7ce6c64de6d35c5fef18c04e57f334515b7dea8 100644 (file)
@@ -93,8 +93,6 @@
 #define CONFIG_CMD_NET
 #define CONFIG_CMD_CACHE
 
-#define CONFIG_SYS_64BIT_VSPRINTF
-
 /*
  * Additional command
  */
diff --git a/include/dialog_pmic.h b/include/dialog_pmic.h
new file mode 100644 (file)
index 0000000..8d43585
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * da9053 register declarations.
+ *
+ * Copyright(c) 2009 Dialog Semiconductor Ltd.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef __DIALOG_PMIC_H__
+#define __DIALOG_PMIC_H__
+
+enum {
+       DA9053_PAGECON0_REG = 0,
+       DA9053_STATUSA_REG,
+       DA9053_STATUSB_REG,
+       DA9053_STATUSC_REG,
+       DA9053_STATUSD_REG,
+       DA9053_EVENTA_REG,
+       DA9053_EVENTB_REG,
+       DA9053_EVENTC_REG,
+       DA9053_EVENTD_REG,
+       DA9053_FAULTLOG_REG,
+       DA9053_IRQMASKA_REG,
+       DA9053_IRQMASKB_REG,
+       DA9053_IRQMASKC_REG,
+       DA9053_IRQMASKD_REG,
+       DA9053_CONTROLA_REG,
+       DA9053_CONTROLB_REG,
+       DA9053_CONTROLC_REG,
+       DA9053_CONTROLD_REG,
+       DA9053_PDDIS_REG,
+       DA9053_INTERFACE_REG,
+       DA9053_RESET_REG,
+       DA9053_GPIO0001_REG,
+       DA9053_GPIO0203_REG,
+       DA9053_GPIO0405_REG,
+       DA9053_GPIO0607_REG,
+       DA9053_GPIO0809_REG,
+       DA9053_GPIO1011_REG,
+       DA9053_GPIO1213_REG,
+       DA9053_GPIO1415_REG,
+       DA9053_ID01_REG,
+       DA9053_ID23_REG,
+       DA9053_ID45_REG,
+       DA9053_ID67_REG,
+       DA9053_ID89_REG,
+       DA9053_ID1011_REG,
+       DA9053_ID1213_REG,
+       DA9053_ID1415_REG,
+       DA9053_ID1617_REG,
+       DA9053_ID1819_REG,
+       DA9053_ID2021_REG,
+       DA9053_SEQSTATUS_REG,
+       DA9053_SEQA_REG,
+       DA9053_SEQB_REG,
+       DA9053_SEQTIMER_REG,
+       DA9053_BUCKA_REG,
+       DA9053_BUCKB_REG,
+       DA9053_BUCKCORE_REG,
+       DA9053_BUCKPRO_REG,
+       DA9053_BUCKMEM_REG,
+       DA9053_BUCKPERI_REG,
+       DA9053_LDO1_REG,
+       DA9053_LDO2_REG,
+       DA9053_LDO3_REG,
+       DA9053_LDO4_REG,
+       DA9053_LDO5_REG,
+       DA9053_LDO6_REG,
+       DA9053_LDO7_REG,
+       DA9053_LDO8_REG,
+       DA9053_LDO9_REG,
+       DA9053_LDO10_REG,
+       DA9053_SUPPLY_REG,
+       DA9053_PULLDOWN_REG,
+       DA9053_CHGBUCK_REG,
+       DA9053_WAITCONT_REG,
+       DA9053_ISET_REG,
+       DA9053_BATCHG_REG,
+       DA9053_CHGCONT_REG,
+       DA9053_INPUTCONT_REG,
+       DA9053_CHGTIME_REG,
+       DA9053_BBATCONT_REG,
+       DA9053_BOOST_REG,
+       DA9053_LEDCONT_REG,
+       DA9053_LEDMIN123_REG,
+       DA9053_LED1CONF_REG,
+       DA9053_LED2CONF_REG,
+       DA9053_LED3CONF_REG,
+       DA9053_LED1CONT_REG,
+       DA9053_LED2CONT_REG,
+       DA9053_LED3CONT_REG,
+       DA9053_LED4CONT_REG,
+       DA9053_LED5CONT_REG,
+       DA9053_ADCMAN_REG,
+       DA9053_ADCCONT_REG,
+       DA9053_ADCRESL_REG,
+       DA9053_ADCRESH_REG,
+       DA9053_VDDRES_REG,
+       DA9053_VDDMON_REG,
+       DA9053_ICHGAV_REG,
+       DA9053_ICHGTHD_REG,
+       DA9053_ICHGEND_REG,
+       DA9053_TBATRES_REG,
+       DA9053_TBATHIGHP_REG,
+       DA9053_TBATHIGHIN_REG,
+       DA9053_TBATLOW_REG,
+       DA9053_TOFFSET_REG,
+       DA9053_ADCIN4RES_REG,
+       DA9053_AUTO4HIGH_REG,
+       DA9053_AUTO4LOW_REG,
+       DA9053_ADCIN5RES_REG,
+       DA9053_AUTO5HIGH_REG,
+       DA9053_AUTO5LOW_REG,
+       DA9053_ADCIN6RES_REG,
+       DA9053_AUTO6HIGH_REG,
+       DA9053_AUTO6LOW_REG,
+       DA9053_TJUNCRES_REG,
+       DA9053_TSICONTA_REG,
+       DA9053_TSICONTB_REG,
+       DA9053_TSIXMSB_REG,
+       DA9053_TSIYMSB_REG,
+       DA9053_TSILSB_REG,
+       DA9053_TSIZMSB_REG,
+       DA9053_COUNTS_REG,
+       DA9053_COUNTMI_REG,
+       DA9053_COUNTH_REG,
+       DA9053_COUNTD_REG,
+       DA9053_COUNTMO_REG,
+       DA9053_COUNTY_REG,
+       DA9053_ALARMMI_REG,
+       DA9053_ALARMH_REG,
+       DA9053_ALARMD_REG,
+       DA9053_ALARMMO_REG,
+       DA9053_ALARMY_REG,
+       DA9053_SECONDA_REG,
+       DA9053_SECONDB_REG,
+       DA9053_SECONDC_REG,
+       DA9053_SECONDD_REG,
+       DA9053_PAGECON128_REG,
+       DA9053_CHIPID_REG,
+       DA9053_CONFIGID_REG,
+       DA9053_OTPCONT_REG,
+       DA9053_OSCTRIM_REG,
+       DA9053_GPID0_REG,
+       DA9053_GPID1_REG,
+       DA9053_GPID2_REG,
+       DA9053_GPID3_REG,
+       DA9053_GPID4_REG,
+       DA9053_GPID5_REG,
+       DA9053_GPID6_REG,
+       DA9053_GPID7_REG,
+       DA9053_GPID8_REG,
+       DA9053_GPID9_REG,
+       DIALOG_NUM_OF_REGS,
+};
+
+#define DA_BUCKCORE_VBCORE_1_250V              0x1E
+
+/* BUCKCORE REGISTER */
+#define DA9052_BUCKCORE_BCORECONF               (1 << 7)
+#define DA9052_BUCKCORE_BCOREEN                 (1 << 6)
+#define DA9052_BUCKCORE_VBCORE                  63
+
+/* SUPPLY REGISTER */
+#define DA9052_SUPPLY_VLOCK                     (1 << 7)
+#define DA9052_SUPPLY_VMEMSWEN                  (1 << 6)
+#define DA9052_SUPPLY_VPERISWEN                 (1 << 5)
+#define DA9052_SUPPLY_VLDO3GO                   (1 << 4)
+#define DA9052_SUPPLY_VLDO2GO                   (1 << 3)
+#define DA9052_SUPPLY_VBMEMGO                   (1 << 2)
+#define DA9052_SUPPLY_VBPROGO                   (1 << 1)
+#define DA9052_SUPPLY_VBCOREGO                  (1 << 0)
+
+#endif /* __DIALOG_PMIC_H__ */
index 171c628485340cb1a0e2683eeeae87b8e3fceb80..fab577ed32f5e7321e6a49e2808a6f21368c471f 100644 (file)
@@ -60,6 +60,9 @@ enum fdt_compat_id {
        COMPAT_NVIDIA_TEGRA20_USB,      /* Tegra2 USB port */
        COMPAT_NVIDIA_TEGRA20_I2C,      /* Tegra2 i2c */
        COMPAT_NVIDIA_TEGRA20_DVC,      /* Tegra2 dvc (really just i2c) */
+       COMPAT_NVIDIA_TEGRA20_EMC,      /* Tegra2 memory controller */
+       COMPAT_NVIDIA_TEGRA20_EMC_TABLE, /* Tegra2 memory timing table */
+       COMPAT_NVIDIA_TEGRA20_KBC,      /* Tegra2 Keyboard */
 
        COMPAT_COUNT,
 };
@@ -116,6 +119,23 @@ int fdtdec_next_alias(const void *blob, const char *name,
 int fdtdec_next_compatible(const void *blob, int node,
                enum fdt_compat_id id);
 
+/**
+ * Find the next compatible subnode for a peripheral.
+ *
+ * Do the first call with node set to the parent and depth = 0. This
+ * function will return the offset of the next compatible node. Next time
+ * you call this function, pass the node value returned last time, with
+ * depth unchanged, and the next node will be provided.
+ *
+ * @param blob         FDT blob to use
+ * @param node         Start node for search
+ * @param id           Compatible ID to look for (enum fdt_compat_id)
+ * @param depthp       Current depth (set to 0 before first call)
+ * @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
+ */
+int fdtdec_next_compatible_subnode(const void *blob, int node,
+               enum fdt_compat_id id, int *depthp);
+
 /**
  * Look up an address property in a node and return it as an address.
  * The property must hold either one address with no trailing data or
@@ -271,6 +291,25 @@ int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name);
 int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
                u32 *array, int count);
 
+/**
+ * Look up a property in a node and return a pointer to its contents as a
+ * unsigned int array of given length. The property must have at least enough
+ * data for the array ('count' cells). It may have more, but this will be
+ * ignored. The data is not copied.
+ *
+ * Note that you must access elements of the array with fdt32_to_cpu(),
+ * since the elements will be big endian even on a little endian machine.
+ *
+ * @param blob         FDT blob
+ * @param node         node to examine
+ * @param prop_name    name of property to find
+ * @param count                number of array elements
+ * @return pointer to array if found, or NULL if the property is not
+ *             found or there is not enough data
+ */
+const u32 *fdtdec_locate_array(const void *blob, int node,
+                              const char *prop_name, int count);
+
 /**
  * Look up a boolean property in a node and return it.
  *
@@ -311,3 +350,35 @@ int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,
  * @return 0 if all ok or gpio was FDT_GPIO_NONE; -1 on error
  */
 int fdtdec_setup_gpio(struct fdt_gpio_state *gpio);
+
+/*
+ * Look up a property in a node and return its contents in a byte
+ * array of given length. The property must have at least enough data for
+ * the array (count bytes). It may have more, but this will be ignored.
+ *
+ * @param blob         FDT blob
+ * @param node         node to examine
+ * @param prop_name    name of property to find
+ * @param array                array to fill with data
+ * @param count                number of array elements
+ * @return 0 if ok, or -FDT_ERR_MISSING if the property is not found,
+ *             or -FDT_ERR_BADLAYOUT if not enough data
+ */
+int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
+               u8 *array, int count);
+
+/**
+ * Look up a property in a node and return a pointer to its contents as a
+ * byte array of given length. The property must have at least enough data
+ * for the array (count bytes). It may have more, but this will be ignored.
+ * The data is not copied.
+ *
+ * @param blob         FDT blob
+ * @param node         node to examine
+ * @param prop_name    name of property to find
+ * @param count                number of array elements
+ * @return pointer to byte array if found, or NULL if the property is not
+ *             found or there is not enough data
+ */
+const u8 *fdtdec_locate_byte_array(const void *blob, int node,
+                            const char *prop_name, int count);
index 8418bf7f47aa177af9bcd029276646c5525e15b9..0e265584bd3680621efc94553592209d7802de3e 100644 (file)
 #define SYSCTL_INITA           0x08000000
 #define SYSCTL_TIMEOUT_MASK    0x000f0000
 #define SYSCTL_CLOCK_MASK      0x0000fff0
-#define SYSCTL_RSTA            0x01000000
 #define SYSCTL_CKEN            0x00000008
 #define SYSCTL_PEREN           0x00000004
 #define SYSCTL_HCKEN           0x00000002
 #define SYSCTL_IPGEN           0x00000001
 #define SYSCTL_RSTA            0x01000000
+#define SYSCTL_RSTC            0x02000000
+#define SYSCTL_RSTD            0x04000000
 
 #define IRQSTAT                        0x0002e030
 #define IRQSTAT_DMAE           (0x10000000)
@@ -85,6 +86,7 @@
 #define IRQSTATEN_CC           (0x00000001)
 
 #define PRSSTAT                        0x0002e024
+#define PRSSTAT_DAT0           (0x01000000)
 #define PRSSTAT_CLSL           (0x00800000)
 #define PRSSTAT_WPSPL          (0x00080000)
 #define PRSSTAT_CDPL           (0x00040000)
index 742f2e19f9e9533573c07e1563978da8ba7bdfd7..64c1e2ef65e15bab8f9f5aaf0a6cdb4b1fee6c5a 100644 (file)
@@ -122,4 +122,15 @@ enum {
 /* Interrupt status 1 */
 #define RTCRSTI                (1 << 7)
 
+/* MC34708 Definitions */
+#define SWx_VOLT_MASK_MC34708  0x3F
+#define SWx_1_250V_MC34708     0x30
+#define SWx_1_300V_MC34708     0x34
+#define TIMER_MASK_MC34708     0x300
+#define TIMER_4S_MC34708       0x100
+#define VUSBSEL_MC34708                (1 << 2)
+#define VUSBEN_MC34708         (1 << 3)
+#define SWBST_CTRL             31
+#define SWBST_AUTO             0x8
+
 #endif
diff --git a/include/input.h b/include/input.h
new file mode 100644 (file)
index 0000000..31b1ef9
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Keyboard input helper functions (too small to be called a layer)
+ *
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * 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
+ */
+
+#ifndef _INPUT_H
+#define _INPUT_H
+
+enum {
+       INPUT_MAX_MODIFIERS     = 4,
+       INPUT_BUFFER_LEN        = 16,
+};
+
+enum {
+       /* Keyboard LEDs */
+       INPUT_LED_SCROLL        = 1 << 0,
+       INPUT_LED_CAPS          = 1 << 1,
+       INPUT_LED_NUM           = 1 << 2,
+};
+
+/*
+ * This table translates key codes to ASCII. Most of the entries are ASCII
+ * codes, but entries after KEY_FIRST_MOD indicate that this key is a
+ * modifier key, like shift, ctrl. KEY_FIRST_MOD + MOD_SHIFT is the shift
+ * key, for example.
+ */
+struct input_key_xlate {
+       /* keycode of the modifiers which select this table, -1 if none */
+       int left_keycode;
+       int right_keycode;
+       const uchar *xlate;     /* keycode to ASCII table */
+       int num_entries;        /* number of entries in this table */
+};
+
+struct input_config {
+       uchar fifo[INPUT_BUFFER_LEN];
+       int fifo_in, fifo_out;
+
+       /* Which modifiers are active (1 bit for each MOD_... value) */
+       uchar modifiers;
+       uchar flags;            /* active state keys (FLAGS_...) */
+       uchar leds;             /* active LEDS (INPUT_LED_...) */
+       uchar num_tables;       /* number of modifier tables */
+       int prev_keycodes[INPUT_BUFFER_LEN];    /* keys held last time */
+       int num_prev_keycodes;  /* number of prev keys */
+       struct input_key_xlate table[INPUT_MAX_MODIFIERS];
+
+       /**
+        * Function the input helper calls to scan the keyboard
+        *
+        * @param config        Input state
+        * @return 0 if no keys read, otherwise number of keys read, or 1 if
+        *              unknown
+        */
+       int (*read_keys)(struct input_config *config);
+       unsigned int next_repeat_ms;    /* Next time we repeat a key */
+       unsigned int repeat_delay_ms;   /* Time before autorepeat starts */
+       unsigned int repeat_rate_ms;    /* Autorepeat rate in ms */
+};
+
+struct stdio_dev;
+
+/**
+ * Convert a list of key codes into ASCII and send them
+ *
+ * @param config       Input state
+ * @param keycode      List of key codes to examine
+ * @param num_keycodes Number of key codes
+ */
+int input_send_keycodes(struct input_config *config, int keycode[], int count);
+
+/**
+ * Add a new key translation table to the input
+ *
+ * @param config       Input state
+ * @param left_keycode Key to hold to get into this table
+ * @param right_keycode        Another key to hold to get into this table
+ * @param xlate                Conversion table from key codes to ASCII
+ * @param num_entries  Number of entries in xlate table
+ */
+int input_add_table(struct input_config *config, int left_keycode,
+                   int right_keycode, const uchar *xlate, int num_entries);
+
+/**
+ * Test if keys are available to be read
+ *
+ * @param config       Input state
+ * @return 0 if no keys available, 1 if keys are available
+ */
+int input_tstc(struct input_config *config);
+
+/**
+ * Read a key
+ *
+ * TODO: U-Boot wants 0 for no key, but Ctrl-@ is a valid key...
+ *
+ * @param config       Input state
+ * @return key, or 0 if no key, or -1 if error
+ */
+int input_getc(struct input_config *config);
+
+/**
+ * Register a new device with stdio and switch to it if wanted
+ *
+ * @param dev  Pointer to device
+ * @return 0 if ok, -1 on error
+ */
+int input_stdio_register(struct stdio_dev *dev);
+
+/**
+ * Set up the input handler with basic key maps.
+ *
+ * @param config       Input state
+ * @param leds         Initial LED value (INPUT_LED_ mask), 0 suggested
+ * @param repeat_delay_ms      Delay before key auto-repeat starts (in ms)
+ * @param repeat_rate_ms       Delay between successive key repeats (in ms)
+ * @return 0 if ok, -1 on error
+ */
+int input_init(struct input_config *config, int leds, int repeat_delay_ms,
+              int repeat_rate_ms);
+
+#ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
+extern int overwrite_console(void);
+#define OVERWRITE_CONSOLE overwrite_console()
+#else
+#define OVERWRITE_CONSOLE 0
+#endif /* CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE */
+
+#endif
diff --git a/include/key_matrix.h b/include/key_matrix.h
new file mode 100644 (file)
index 0000000..f413314
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Keyboard matrix helper functions
+ *
+ * Copyright (c) 2012 The Chromium OS Authors.
+ * 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
+ */
+
+#ifndef _KEY_MATRIX_H
+#define _KEY_MATRIX_H
+
+#include <common.h>
+
+/* Information about a matrix keyboard */
+struct key_matrix {
+       /* Dimensions of the keyboard matrix, in rows and columns */
+       int num_rows;
+       int num_cols;
+       int key_count;  /* number of keys in the matrix (= rows * cols) */
+
+       /*
+        * Information about keycode mappings. The plain_keycode array must
+        * exist but fn may be NULL in which case it is not decoded.
+        */
+       const u8 *plain_keycode;        /* key code for each row / column */
+       const u8 *fn_keycode;           /* ...when Fn held down */
+       int fn_pos;                     /* position of Fn key in key (or -1) */
+};
+
+/* Information about a particular key (row, column pair) in the matrix */
+struct key_matrix_key {
+       uint8_t row;    /* row number (0 = first) */
+       uint8_t col;    /* column number (0 = first) */
+       uint8_t valid;  /* 1 if valid, 0 to ignore this */
+};
+
+/**
+ * Decode a set of pressed keys into key codes
+ *
+ * Given a list of keys that are pressed, this converts this list into
+ * a list of key codes. Each of the keys has a valid flag, which can be
+ * used to mark a particular key as invalid (so that it is ignored).
+ *
+ * The plain keymap is used, unless the Fn key is detected along the way,
+ * at which point we switch to the Fn key map.
+ *
+ * If key ghosting is detected, we simply ignore the keys and return 0.
+ *
+ * @param config        Keyboard matrix config
+ * @param keys         List of keys to process (each is row, col)
+ * @param num_keys     Number of keys to process
+ * @param keycode      Returns a list of key codes, decoded from input
+ * @param max_keycodes Size of key codes array (suggest 8)
+ *
+ */
+int key_matrix_decode(struct key_matrix *config, struct key_matrix_key *keys,
+                     int num_keys, int keycode[], int max_keycodes);
+
+/**
+ * Read the keyboard configuration out of the fdt.
+ *
+ * Decode properties of named "linux,<type>keymap" where <type> is either
+ * empty, or "fn-". Then set up the plain key map (and the FN keymap if
+ * present).
+ *
+ * @param config        Keyboard matrix config
+ * @param blob          FDT blob
+ * @param node          Node containing compatible data
+ * @return 0 if ok, -1 on error
+ */
+int key_matrix_decode_fdt(struct key_matrix *config, const void *blob,
+                         int node);
+
+/**
+ * Set up a new key matrix.
+ *
+ * @param config       Keyboard matrix config
+ * @param rows         Number of rows in key matrix
+ * @param cols         Number of columns in key matrix
+ * @return 0 if ok, -1 on error
+ */
+int key_matrix_init(struct key_matrix *config, int rows, int cols);
+
+#endif
index d95feeb791d713355e997f95fe2c908a1fcfa8a4..3d9ef167107e6f6e1bbfdcd874d6854025b0dae8 100644 (file)
@@ -183,6 +183,70 @@ typedef struct vidinfo {
        u_long  mmio;           /* Memory mapped registers */
 } vidinfo_t;
 
+#elif defined(CONFIG_EXYNOS_FB)
+
+enum {
+       FIMD_RGB_INTERFACE = 1,
+       FIMD_CPU_INTERFACE = 2,
+};
+
+typedef struct vidinfo {
+       ushort vl_col;          /* Number of columns (i.e. 640) */
+       ushort vl_row;          /* Number of rows (i.e. 480) */
+       ushort vl_width;        /* Width of display area in millimeters */
+       ushort vl_height;       /* Height of display area in millimeters */
+
+       /* LCD configuration register */
+       u_char vl_freq;         /* Frequency */
+       u_char vl_clkp;         /* Clock polarity */
+       u_char vl_oep;          /* Output Enable polarity */
+       u_char vl_hsp;          /* Horizontal Sync polarity */
+       u_char vl_vsp;          /* Vertical Sync polarity */
+       u_char vl_dp;           /* Data polarity */
+       u_char vl_bpix;         /* Bits per pixel */
+
+       /* Horizontal control register. Timing from data sheet */
+       u_char vl_hspw;         /* Horz sync pulse width */
+       u_char vl_hfpd;         /* Wait before of line */
+       u_char vl_hbpd;         /* Wait end of line */
+
+       /* Vertical control register. */
+       u_char  vl_vspw;        /* Vertical sync pulse width */
+       u_char  vl_vfpd;        /* Wait before of frame */
+       u_char  vl_vbpd;        /* Wait end of frame */
+       u_char  vl_cmd_allow_len; /* Wait end of frame */
+
+       void (*cfg_gpio)(void);
+       void (*backlight_on)(unsigned int onoff);
+       void (*reset_lcd)(void);
+       void (*lcd_power_on)(void);
+       void (*cfg_ldo)(void);
+       void (*enable_ldo)(unsigned int onoff);
+       void (*mipi_power)(void);
+       void (*backlight_reset)(void);
+
+       unsigned int win_id;
+       unsigned int init_delay;
+       unsigned int power_on_delay;
+       unsigned int reset_delay;
+       unsigned int interface_mode;
+       unsigned int mipi_enabled;
+       unsigned int cs_setup;
+       unsigned int wr_setup;
+       unsigned int wr_act;
+       unsigned int wr_hold;
+
+       /* parent clock name(MPLL, EPLL or VPLL) */
+       unsigned int pclk_name;
+       /* ratio value for source clock from parent clock. */
+       unsigned int sclk_div;
+
+       unsigned int dual_lcd_enabled;
+
+} vidinfo_t;
+
+void init_panel_info(vidinfo_t *vid);
+
 #else
 
 typedef struct vidinfo {
diff --git a/include/linux/input.h b/include/linux/input.h
new file mode 100644 (file)
index 0000000..44aec76
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1999-2002 Vojtech Pavlik
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#ifndef _LINUX_INPUT_H
+#define _LINUX_INPUT_H
+
+/*
+ * Keys and buttons
+ *
+ * Most of the keys/buttons are modeled after USB HUT 1.12
+ * (see http://www.usb.org/developers/hidpage).
+ * Abbreviations in the comments:
+ * AC - Application Control
+ * AL - Application Launch Button
+ * SC - System Control
+ */
+
+#define KEY_RESERVED           0
+#define KEY_ESC                        1
+#define KEY_1                  2
+#define KEY_2                  3
+#define KEY_3                  4
+#define KEY_4                  5
+#define KEY_5                  6
+#define KEY_6                  7
+#define KEY_7                  8
+#define KEY_8                  9
+#define KEY_9                  10
+#define KEY_0                  11
+#define KEY_MINUS              12
+#define KEY_EQUAL              13
+#define KEY_BACKSPACE          14
+#define KEY_TAB                        15
+#define KEY_Q                  16
+#define KEY_W                  17
+#define KEY_E                  18
+#define KEY_R                  19
+#define KEY_T                  20
+#define KEY_Y                  21
+#define KEY_U                  22
+#define KEY_I                  23
+#define KEY_O                  24
+#define KEY_P                  25
+#define KEY_LEFTBRACE          26
+#define KEY_RIGHTBRACE         27
+#define KEY_ENTER              28
+#define KEY_LEFTCTRL           29
+#define KEY_A                  30
+#define KEY_S                  31
+#define KEY_D                  32
+#define KEY_F                  33
+#define KEY_G                  34
+#define KEY_H                  35
+#define KEY_J                  36
+#define KEY_K                  37
+#define KEY_L                  38
+#define KEY_SEMICOLON          39
+#define KEY_APOSTROPHE         40
+#define KEY_GRAVE              41
+#define KEY_LEFTSHIFT          42
+#define KEY_BACKSLASH          43
+#define KEY_Z                  44
+#define KEY_X                  45
+#define KEY_C                  46
+#define KEY_V                  47
+#define KEY_B                  48
+#define KEY_N                  49
+#define KEY_M                  50
+#define KEY_COMMA              51
+#define KEY_DOT                        52
+#define KEY_SLASH              53
+#define KEY_RIGHTSHIFT         54
+#define KEY_KPASTERISK         55
+#define KEY_LEFTALT            56
+#define KEY_SPACE              57
+#define KEY_CAPSLOCK           58
+#define KEY_F1                 59
+#define KEY_F2                 60
+#define KEY_F3                 61
+#define KEY_F4                 62
+#define KEY_F5                 63
+#define KEY_F6                 64
+#define KEY_F7                 65
+#define KEY_F8                 66
+#define KEY_F9                 67
+#define KEY_F10                        68
+#define KEY_NUMLOCK            69
+#define KEY_SCROLLLOCK         70
+#define KEY_KP7                        71
+#define KEY_KP8                        72
+#define KEY_KP9                        73
+#define KEY_KPMINUS            74
+#define KEY_KP4                        75
+#define KEY_KP5                        76
+#define KEY_KP6                        77
+#define KEY_KPPLUS             78
+#define KEY_KP1                        79
+#define KEY_KP2                        80
+#define KEY_KP3                        81
+#define KEY_KP0                        82
+#define KEY_KPDOT              83
+
+#define KEY_ZENKAKUHANKAKU     85
+#define KEY_102ND              86
+#define KEY_F11                        87
+#define KEY_F12                        88
+#define KEY_RO                 89
+#define KEY_KATAKANA           90
+#define KEY_HIRAGANA           91
+#define KEY_HENKAN             92
+#define KEY_KATAKANAHIRAGANA   93
+#define KEY_MUHENKAN           94
+#define KEY_KPJPCOMMA          95
+#define KEY_KPENTER            96
+#define KEY_RIGHTCTRL          97
+#define KEY_KPSLASH            98
+#define KEY_SYSRQ              99
+#define KEY_RIGHTALT           100
+#define KEY_LINEFEED           101
+#define KEY_HOME               102
+#define KEY_UP                 103
+#define KEY_PAGEUP             104
+#define KEY_LEFT               105
+#define KEY_RIGHT              106
+#define KEY_END                        107
+#define KEY_DOWN               108
+#define KEY_PAGEDOWN           109
+#define KEY_INSERT             110
+#define KEY_DELETE             111
+#define KEY_MACRO              112
+#define KEY_MUTE               113
+#define KEY_VOLUMEDOWN         114
+#define KEY_VOLUMEUP           115
+#define KEY_POWER              116     /* SC System Power Down */
+#define KEY_KPEQUAL            117
+#define KEY_KPPLUSMINUS                118
+#define KEY_PAUSE              119
+#define KEY_SCALE              120     /* AL Compiz Scale (Expose) */
+
+#define KEY_KPCOMMA            121
+#define KEY_HANGEUL            122
+#define KEY_HANGUEL            KEY_HANGEUL
+#define KEY_HANJA              123
+#define KEY_YEN                        124
+#define KEY_LEFTMETA           125
+#define KEY_RIGHTMETA          126
+#define KEY_COMPOSE            127
+#define KEY_FN                 0x1d0
+
+#endif
index ed4cf6cbcd507a8f53b7ed9bc68b8e2f0e84de60..7b749bbda708a8b6f1edcbbcd0becf21e566d2d7 100644 (file)
 #define SYMBOL_NAME_LABEL(X)   X:
 #endif
 
+#ifndef __ALIGN
 #define __ALIGN .align         4
+#endif
+
+#ifndef __ALIGN_STR
 #define __ALIGN_STR            ".align 4"
+#endif
 
 #ifdef __ASSEMBLY__
 
@@ -67,7 +72,7 @@
 
 #ifndef ENDPROC
 #define ENDPROC(name) \
-       .type name, @function; \
+       .type name STT_FUNC; \
        END(name)
 #endif
 
diff --git a/include/max8997_pmic.h b/include/max8997_pmic.h
new file mode 100644 (file)
index 0000000..17ae24e
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ *  Copyright (C) 2011 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * 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
+ */
+
+#ifndef __MAX8997_PMIC_H_
+#define __MAX8997_PMIC_H_
+
+/* MAX 8997 registers */
+enum {
+       MAX8997_REG_PMIC_ID0    = 0x00,
+       MAX8997_REG_PMIC_ID1    = 0x01,
+       MAX8997_REG_INTSRC      = 0x02,
+       MAX8997_REG_INT1        = 0x03,
+       MAX8997_REG_INT2        = 0x04,
+       MAX8997_REG_INT3        = 0x05,
+       MAX8997_REG_INT4        = 0x06,
+
+       MAX8997_REG_INT1MSK     = 0x08,
+       MAX8997_REG_INT2MSK     = 0x09,
+       MAX8997_REG_INT3MSK     = 0x0a,
+       MAX8997_REG_INT4MSK     = 0x0b,
+
+       MAX8997_REG_STATUS1     = 0x0d,
+       MAX8997_REG_STATUS2     = 0x0e,
+       MAX8997_REG_STATUS3     = 0x0f,
+       MAX8997_REG_STATUS4     = 0x10,
+
+       MAX8997_REG_MAINCON1    = 0x13,
+       MAX8997_REG_MAINCON2    = 0x14,
+       MAX8997_REG_BUCKRAMP    = 0x15,
+
+       MAX8997_REG_BUCK1CTRL   = 0x18,
+       MAX8997_REG_BUCK1DVS1   = 0x19,
+       MAX8997_REG_BUCK1DVS2   = 0x1a,
+       MAX8997_REG_BUCK1DVS3   = 0x1b,
+       MAX8997_REG_BUCK1DVS4   = 0x1c,
+       MAX8997_REG_BUCK1DVS5   = 0x1d,
+       MAX8997_REG_BUCK1DVS6   = 0x1e,
+       MAX8997_REG_BUCK1DVS7   = 0x1f,
+       MAX8997_REG_BUCK1DVS8   = 0x20,
+       MAX8997_REG_BUCK2CTRL   = 0x21,
+       MAX8997_REG_BUCK2DVS1   = 0x22,
+       MAX8997_REG_BUCK2DVS2   = 0x23,
+       MAX8997_REG_BUCK2DVS3   = 0x24,
+       MAX8997_REG_BUCK2DVS4   = 0x25,
+       MAX8997_REG_BUCK2DVS5   = 0x26,
+       MAX8997_REG_BUCK2DVS6   = 0x27,
+       MAX8997_REG_BUCK2DVS7   = 0x28,
+       MAX8997_REG_BUCK2DVS8   = 0x29,
+       MAX8997_REG_BUCK3CTRL   = 0x2a,
+       MAX8997_REG_BUCK3DVS    = 0x2b,
+       MAX8997_REG_BUCK4CTRL   = 0x2c,
+       MAX8997_REG_BUCK4DVS    = 0x2d,
+       MAX8997_REG_BUCK5CTRL   = 0x2e,
+       MAX8997_REG_BUCK5DVS1   = 0x2f,
+       MAX8997_REG_BUCK5DVS2   = 0x30,
+       MAX8997_REG_BUCK5DVS3   = 0x31,
+       MAX8997_REG_BUCK5DVS4   = 0x32,
+       MAX8997_REG_BUCK5DVS5   = 0x33,
+       MAX8997_REG_BUCK5DVS6   = 0x34,
+       MAX8997_REG_BUCK5DVS7   = 0x35,
+       MAX8997_REG_BUCK5DVS8   = 0x36,
+       MAX8997_REG_BUCK6CTRL   = 0x37,
+       MAX8997_REG_BUCK6BPSKIPCTRL     = 0x38,
+       MAX8997_REG_BUCK7CTRL   = 0x39,
+       MAX8997_REG_BUCK7DVS    = 0x3a,
+       MAX8997_REG_LDO1CTRL    = 0x3b,
+       MAX8997_REG_LDO2CTRL    = 0x3c,
+       MAX8997_REG_LDO3CTRL    = 0x3d,
+       MAX8997_REG_LDO4CTRL    = 0x3e,
+       MAX8997_REG_LDO5CTRL    = 0x3f,
+       MAX8997_REG_LDO6CTRL    = 0x40,
+       MAX8997_REG_LDO7CTRL    = 0x41,
+       MAX8997_REG_LDO8CTRL    = 0x42,
+       MAX8997_REG_LDO9CTRL    = 0x43,
+       MAX8997_REG_LDO10CTRL   = 0x44,
+       MAX8997_REG_LDO11CTRL   = 0x45,
+       MAX8997_REG_LDO12CTRL   = 0x46,
+       MAX8997_REG_LDO13CTRL   = 0x47,
+       MAX8997_REG_LDO14CTRL   = 0x48,
+       MAX8997_REG_LDO15CTRL   = 0x49,
+       MAX8997_REG_LDO16CTRL   = 0x4a,
+       MAX8997_REG_LDO17CTRL   = 0x4b,
+       MAX8997_REG_LDO18CTRL   = 0x4c,
+       MAX8997_REG_LDO21CTRL   = 0x4d,
+
+       MAX8997_REG_MBCCTRL1    = 0x50,
+       MAX8997_REG_MBCCTRL2    = 0x51,
+       MAX8997_REG_MBCCTRL3    = 0x52,
+       MAX8997_REG_MBCCTRL4    = 0x53,
+       MAX8997_REG_MBCCTRL5    = 0x54,
+       MAX8997_REG_MBCCTRL6    = 0x55,
+       MAX8997_REG_OTPCGHCVS   = 0x56,
+
+       MAX8997_REG_SAFEOUTCTRL = 0x5a,
+
+       MAX8997_REG_LBCNFG1     = 0x5e,
+       MAX8997_REG_LBCNFG2     = 0x5f,
+       MAX8997_REG_BBCCTRL     = 0x60,
+
+       MAX8997_REG_FLASH1_CUR  = 0x63, /* 0x63 ~ 0x6e for FLASH */
+       MAX8997_REG_FLASH2_CUR  = 0x64,
+       MAX8997_REG_MOVIE_CUR   = 0x65,
+       MAX8997_REG_GSMB_CUR    = 0x66,
+       MAX8997_REG_BOOST_CNTL  = 0x67,
+       MAX8997_REG_LEN_CNTL    = 0x68,
+       MAX8997_REG_FLASH_CNTL  = 0x69,
+       MAX8997_REG_WDT_CNTL    = 0x6a,
+       MAX8997_REG_MAXFLASH1   = 0x6b,
+       MAX8997_REG_MAXFLASH2   = 0x6c,
+       MAX8997_REG_FLASHSTATUS = 0x6d,
+       MAX8997_REG_FLASHSTATUSMASK     = 0x6e,
+
+       MAX8997_REG_GPIOCNTL1   = 0x70,
+       MAX8997_REG_GPIOCNTL2   = 0x71,
+       MAX8997_REG_GPIOCNTL3   = 0x72,
+       MAX8997_REG_GPIOCNTL4   = 0x73,
+       MAX8997_REG_GPIOCNTL5   = 0x74,
+       MAX8997_REG_GPIOCNTL6   = 0x75,
+       MAX8997_REG_GPIOCNTL7   = 0x76,
+       MAX8997_REG_GPIOCNTL8   = 0x77,
+       MAX8997_REG_GPIOCNTL9   = 0x78,
+       MAX8997_REG_GPIOCNTL10  = 0x79,
+       MAX8997_REG_GPIOCNTL11  = 0x7a,
+       MAX8997_REG_GPIOCNTL12  = 0x7b,
+
+       MAX8997_REG_LDO1CONFIG  = 0x80,
+       MAX8997_REG_LDO2CONFIG  = 0x81,
+       MAX8997_REG_LDO3CONFIG  = 0x82,
+       MAX8997_REG_LDO4CONFIG  = 0x83,
+       MAX8997_REG_LDO5CONFIG  = 0x84,
+       MAX8997_REG_LDO6CONFIG  = 0x85,
+       MAX8997_REG_LDO7CONFIG  = 0x86,
+       MAX8997_REG_LDO8CONFIG  = 0x87,
+       MAX8997_REG_LDO9CONFIG  = 0x88,
+       MAX8997_REG_LDO10CONFIG = 0x89,
+       MAX8997_REG_LDO11CONFIG = 0x8a,
+       MAX8997_REG_LDO12CONFIG = 0x8b,
+       MAX8997_REG_LDO13CONFIG = 0x8c,
+       MAX8997_REG_LDO14CONFIG = 0x8d,
+       MAX8997_REG_LDO15CONFIG = 0x8e,
+       MAX8997_REG_LDO16CONFIG = 0x8f,
+       MAX8997_REG_LDO17CONFIG = 0x90,
+       MAX8997_REG_LDO18CONFIG = 0x91,
+       MAX8997_REG_LDO21CONFIG = 0x92,
+
+       MAX8997_REG_DVSOKTIMER1 = 0x97,
+       MAX8997_REG_DVSOKTIMER2 = 0x98,
+       MAX8997_REG_DVSOKTIMER4 = 0x99,
+       MAX8997_REG_DVSOKTIMER5 = 0x9a,
+
+       PMIC_NUM_OF_REGS = 0x9b,
+};
+
+#define ENSAFEOUT1 (1 << 6)
+#define ENSAFEOUT2 (1 << 7)
+
+#define MAX8997_I2C_ADDR        (0xCC >> 1)
+#define MAX8997_RTC_ADDR       (0x0C >> 1)
+#define MAX8997_MUIC_ADDR      (0x4A >> 1)
+#define MAX8997_FG_ADDR        (0x6C >> 1)
+
+enum {
+       LDO_OFF = 0,
+       LDO_ON = 1,
+
+       DIS_LDO = (0x00 << 6),
+       EN_LDO = (0x3 << 6),
+};
+
+#endif /* __MAX8997_PMIC_H_ */
index 10c892a51df82d2d59fed3fc28b3abf992e5cf65..ca21f882c29344aae475cc967fc55255619ad3fe 100644 (file)
@@ -75,6 +75,7 @@ enum {
 };
 
 #define MAX8998_LDO3           (1 << 2)
+#define MAX8998_LDO4           (1 << 1)
 #define MAX8998_LDO8           (1 << 5)
 #define MAX8998_SAFEOUT1       (1 << 4)
 
index f52df70ad4879782fa15efb6943490dd74eab56b..230598654659fc4e4023698fa145efff03509ac3 100644 (file)
@@ -47,6 +47,9 @@
 #define MMC_MODE_SPI           0x400
 #define MMC_MODE_HC            0x800
 
+#define MMC_MODE_MASK_WIDTH_BITS (MMC_MODE_4BIT | MMC_MODE_8BIT)
+#define MMC_MODE_WIDTH_BITS_SHIFT 8
+
 #define SD_DATA_4BIT   0x00040000
 
 #define IS_SD(x) (x->version & SD_VERSION_SD)
@@ -205,56 +208,6 @@ struct mmc_cid {
        char pnm[7];
 };
 
-/*
- * WARNING!
- *
- * This structure is used by atmel_mci.c only.
- * It works for the AVR32 architecture but NOT
- * for ARM/AT91 architectures.
- * Its use is highly depreciated.
- * After the atmel_mci.c driver for AVR32 has
- * been replaced this structure will be removed.
- */
-struct mmc_csd
-{
-       u8      csd_structure:2,
-               spec_vers:4,
-               rsvd1:2;
-       u8      taac;
-       u8      nsac;
-       u8      tran_speed;
-       u16     ccc:12,
-               read_bl_len:4;
-       u64     read_bl_partial:1,
-               write_blk_misalign:1,
-               read_blk_misalign:1,
-               dsr_imp:1,
-               rsvd2:2,
-               c_size:12,
-               vdd_r_curr_min:3,
-               vdd_r_curr_max:3,
-               vdd_w_curr_min:3,
-               vdd_w_curr_max:3,
-               c_size_mult:3,
-               sector_size:5,
-               erase_grp_size:5,
-               wp_grp_size:5,
-               wp_grp_enable:1,
-               default_ecc:2,
-               r2w_factor:3,
-               write_bl_len:4,
-               write_bl_partial:1,
-               rsvd3:5;
-       u8      file_format_grp:1,
-               copy:1,
-               perm_write_protect:1,
-               tmp_write_protect:1,
-               file_format:2,
-               ecc:2;
-       u8      crc:7;
-       u8      one:1;
-};
-
 struct mmc_cmd {
        ushort cmdidx;
        uint resp_type;
index ee11f82ccc87acf426b95f78337bb2de52d77abd..92afc190346ed45f8e1060956f6bb1b6f46ff1a9 100644 (file)
@@ -80,14 +80,14 @@ struct eth_device {
        int iobase;
        int state;
 
-       int  (*init) (struct eth_device*, bd_t*);
-       int  (*send) (struct eth_device*, volatile void* packet, int length);
-       int  (*recv) (struct eth_device*);
-       void (*halt) (struct eth_device*);
+       int  (*init) (struct eth_device *, bd_t *);
+       int  (*send) (struct eth_device *, void *packet, int length);
+       int  (*recv) (struct eth_device *);
+       void (*halt) (struct eth_device *);
 #ifdef CONFIG_MCAST_TFTP
-       int (*mcast) (struct eth_device*, u32 ip, u8 set);
+       int (*mcast) (struct eth_device *, u32 ip, u8 set);
 #endif
-       int  (*write_hwaddr) (struct eth_device*);
+       int  (*write_hwaddr) (struct eth_device *);
        struct eth_device *next;
        int index;
        void *priv;
@@ -101,7 +101,7 @@ extern void eth_set_current(void);          /* set nterface to ethcur var */
 extern struct eth_device *eth_get_dev(void);   /* get the current device MAC */
 extern struct eth_device *eth_get_dev_by_name(const char *devname);
 extern struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */
-extern int eth_get_dev_index (void);           /* get the device index */
+extern int eth_get_dev_index(void);            /* get the device index */
 extern void eth_parse_enetaddr(const char *addr, uchar *enetaddr);
 extern int eth_getenv_enetaddr(char *name, uchar *enetaddr);
 extern int eth_setenv_enetaddr(char *name, const uchar *enetaddr);
@@ -120,10 +120,11 @@ extern int eth_getenv_enetaddr_by_index(const char *base_name, int index,
 
 extern int usb_eth_initialize(bd_t *bi);
 extern int eth_init(bd_t *bis);                        /* Initialize the device */
-extern int eth_send(volatile void *packet, int length);           /* Send a packet */
+extern int eth_send(void *packet, int length);    /* Send a packet */
 
 #ifdef CONFIG_API
-extern int eth_receive(volatile void *packet, int length); /* Receive a packet*/
+extern int eth_receive(void *packet, int length); /* Receive a packet*/
+extern void (*push_packet)(void *packet, int length);
 #endif
 extern int eth_rx(void);                       /* Check for received packets */
 extern void eth_halt(void);                    /* stop SCC */
@@ -142,8 +143,8 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
                     int eth_number);
 
 #ifdef CONFIG_MCAST_TFTP
-int eth_mcast_join( IPaddr_t mcast_addr, u8 join);
-u32 ether_crc (size_t len, unsigned char const *p);
+int eth_mcast_join(IPaddr_t mcast_addr, u8 join);
+u32 ether_crc(size_t len, unsigned char const *p);
 #endif
 
 
@@ -218,8 +219,8 @@ typedef struct {
 #define IP_FLAGS_DFRAG 0x4000 /* don't fragments */
 #define IP_FLAGS_MFRAG 0x2000 /* more fragments */
 
-#define IP_HDR_SIZE_NO_UDP     (sizeof (IP_t) - 8)
-#define IP_HDR_SIZE            (sizeof (IP_t))
+#define IP_HDR_SIZE_NO_UDP     (sizeof(IP_t) - 8)
+#define IP_HDR_SIZE            (sizeof(IP_t))
 
 
 /*
@@ -326,46 +327,46 @@ typedef struct icmphdr {
 
 /* net.c */
 /** BOOTP EXTENTIONS **/
-extern IPaddr_t                NetOurGatewayIP;        /* Our gateway IP addresse      */
-extern IPaddr_t                NetOurSubnetMask;       /* Our subnet mask (0 = unknown)*/
-extern IPaddr_t                NetOurDNSIP;     /* Our Domain Name Server (0 = unknown)*/
+extern IPaddr_t NetOurGatewayIP;       /* Our gateway IP address */
+extern IPaddr_t NetOurSubnetMask;      /* Our subnet mask (0 = unknown) */
+extern IPaddr_t NetOurDNSIP;   /* Our Domain Name Server (0 = unknown) */
 #if defined(CONFIG_BOOTP_DNS2)
-extern IPaddr_t                NetOurDNS2IP;    /* Our 2nd Domain Name Server (0 = unknown)*/
+extern IPaddr_t NetOurDNS2IP;  /* Our 2nd Domain Name Server (0 = unknown) */
 #endif
-extern char            NetOurNISDomain[32];    /* Our NIS domain               */
-extern char            NetOurHostName[32];     /* Our hostname                 */
-extern char            NetOurRootPath[64];     /* Our root path                */
-extern ushort          NetBootFileSize;        /* Our boot file size in blocks */
+extern char    NetOurNISDomain[32];    /* Our NIS domain */
+extern char    NetOurHostName[32];     /* Our hostname */
+extern char    NetOurRootPath[64];     /* Our root path */
+extern ushort  NetBootFileSize;        /* Our boot file size in blocks */
 /** END OF BOOTP EXTENTIONS **/
-extern ulong           NetBootFileXferSize;    /* size of bootfile in bytes    */
-extern uchar           NetOurEther[6];         /* Our ethernet address         */
-extern uchar           NetServerEther[6];      /* Boot server enet address     */
-extern IPaddr_t                NetOurIP;               /* Our    IP addr (0 = unknown) */
-extern IPaddr_t                NetServerIP;            /* Server IP addr (0 = unknown) */
-extern volatile uchar * NetTxPacket;           /* THE transmit packet          */
-extern volatile uchar * NetRxPackets[PKTBUFSRX];/* Receive packets             */
-extern volatile uchar * NetRxPacket;           /* Current receive packet       */
-extern int             NetRxPacketLen;         /* Current rx packet length     */
-extern unsigned                NetIPID;                /* IP ID (counting)             */
-extern uchar           NetBcastAddr[6];        /* Ethernet boardcast address   */
+extern ulong           NetBootFileXferSize;    /* size of bootfile in bytes */
+extern uchar           NetOurEther[6];         /* Our ethernet address */
+extern uchar           NetServerEther[6];      /* Boot server enet address */
+extern IPaddr_t                NetOurIP;       /* Our    IP addr (0 = unknown) */
+extern IPaddr_t                NetServerIP;    /* Server IP addr (0 = unknown) */
+extern uchar           *NetTxPacket;           /* THE transmit packet */
+extern uchar           *NetRxPackets[PKTBUFSRX]; /* Receive packets */
+extern uchar           *NetRxPacket;           /* Current receive packet */
+extern int             NetRxPacketLen;         /* Current rx packet length */
+extern unsigned                NetIPID;                /* IP ID (counting) */
+extern uchar           NetBcastAddr[6];        /* Ethernet boardcast address */
 extern uchar           NetEtherNullAddr[6];
 
-#define VLAN_NONE      4095                    /* untagged                     */
-#define VLAN_IDMASK    0x0fff                  /* mask of valid vlan id        */
-extern ushort          NetOurVLAN;             /* Our VLAN                     */
-extern ushort          NetOurNativeVLAN;       /* Our Native VLAN              */
+#define VLAN_NONE      4095                    /* untagged */
+#define VLAN_IDMASK    0x0fff                  /* mask of valid vlan id */
+extern ushort          NetOurVLAN;             /* Our VLAN */
+extern ushort          NetOurNativeVLAN;       /* Our Native VLAN */
 
-extern uchar           NetCDPAddr[6];          /* Ethernet CDP address         */
-extern ushort          CDPNativeVLAN;          /* CDP returned native VLAN     */
-extern ushort          CDPApplianceVLAN;       /* CDP returned appliance VLAN  */
+extern uchar   NetCDPAddr[6];          /* Ethernet CDP address */
+extern ushort  CDPNativeVLAN;          /* CDP returned native VLAN */
+extern ushort  CDPApplianceVLAN;       /* CDP returned appliance VLAN */
 
-extern int             NetState;               /* Network loop state           */
+extern int             NetState;               /* Network loop state */
 #define NETLOOP_CONTINUE       1
 #define NETLOOP_RESTART                2
 #define NETLOOP_SUCCESS                3
 #define NETLOOP_FAIL           4
 
-extern int             NetRestartWrap;         /* Tried all network devices    */
+extern int             NetRestartWrap;         /* Tried all network devices */
 
 enum proto_t {
        BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
@@ -373,7 +374,7 @@ enum proto_t {
 };
 
 /* from net/net.c */
-extern char    BootFile[128];                  /* Boot File name               */
+extern char    BootFile[128];                  /* Boot File name */
 
 #if defined(CONFIG_CMD_DNS)
 extern char *NetDNSResolve;            /* The host to resolve  */
@@ -381,7 +382,7 @@ extern char *NetDNSenvvar;          /* the env var to put the ip into */
 #endif
 
 #if defined(CONFIG_CMD_PING)
-extern IPaddr_t        NetPingIP;                      /* the ip address to ping               */
+extern IPaddr_t        NetPingIP;                      /* the ip address to ping */
 #endif
 
 #if defined(CONFIG_CMD_CDP)
@@ -391,8 +392,12 @@ extern ushort CDPApplianceVLAN;
 #endif
 
 #if defined(CONFIG_CMD_SNTP)
-extern IPaddr_t        NetNtpServerIP;                 /* the ip address to NTP        */
-extern int NetTimeOffset;                      /* offset time from UTC         */
+extern IPaddr_t        NetNtpServerIP;                 /* the ip address to NTP */
+extern int NetTimeOffset;                      /* offset time from UTC */
+#endif
+
+#if defined(CONFIG_MCAST_TFTP)
+extern IPaddr_t Mcast_addr;
 #endif
 
 /* Initialize the network adapter */
@@ -408,28 +413,34 @@ extern void       NetStartAgain(void);
 extern int     NetEthHdrSize(void);
 
 /* Set ethernet header; returns the size of the header */
-extern int     NetSetEther(volatile uchar *, uchar *, uint);
+extern int NetSetEther(uchar *, uchar *, uint);
 
 /* Set IP header */
-extern void    NetSetIP(volatile uchar *, IPaddr_t, int, int, int);
+extern void NetSetIP(uchar *, IPaddr_t, int, int, int);
 
 /* Checksum */
-extern int     NetCksumOk(uchar *, int);       /* Return true if cksum OK      */
-extern uint    NetCksum(uchar *, int);         /* Calculate the checksum       */
+extern int     NetCksumOk(uchar *, int);       /* Return true if cksum OK */
+extern uint    NetCksum(uchar *, int);         /* Calculate the checksum */
 
 /* Set callbacks */
-extern void    NetSetHandler(rxhand_f *);      /* Set RX packet handler        */
+extern void    NetSetHandler(rxhand_f *);      /* Set RX packet handler */
 extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
-extern void    NetSetTimeout(ulong, thand_f *);/* Set timeout handler          */
+extern void    NetSetTimeout(ulong, thand_f *);/* Set timeout handler */
 
 /* Transmit "NetTxPacket" */
-extern void    NetSendPacket(volatile uchar *, int);
+extern void NetSendPacket(uchar *, int);
 
 /* Transmit UDP packet, performing ARP request if needed */
-extern int     NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len);
+extern int     NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport,
+                       int sport, int len);
 
 /* Processes a received packet */
-extern void    NetReceive(volatile uchar *, int);
+extern void NetReceive(uchar *, int);
+
+#ifdef CONFIG_NETCONSOLE
+void NcStart(void);
+int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len);
+#endif
 
 /*
  * Check if autoload is enabled. If so, use either NFS or TFTP to download
@@ -445,10 +456,11 @@ void net_auto_load(void);
  * footprint in our tests.
  */
 /* return IP *in network byteorder* */
-static inline IPaddr_t NetReadIP(volatile void *from)
+static inline IPaddr_t NetReadIP(void *from)
 {
        IPaddr_t ip;
-       memcpy((void*)&ip, (void*)from, sizeof(ip));
+
+       memcpy((void *)&ip, (void *)from, sizeof(ip));
        return ip;
 }
 
@@ -456,26 +468,27 @@ static inline IPaddr_t NetReadIP(volatile void *from)
 static inline ulong NetReadLong(ulong *from)
 {
        ulong l;
-       memcpy((void*)&l, (void*)from, sizeof(l));
+
+       memcpy((void *)&l, (void *)from, sizeof(l));
        return l;
 }
 
 /* write IP *in network byteorder* */
 static inline void NetWriteIP(void *to, IPaddr_t ip)
 {
-       memcpy(to, (void*)&ip, sizeof(ip));
+       memcpy(to, (void *)&ip, sizeof(ip));
 }
 
 /* copy IP */
-static inline void NetCopyIP(volatile void *to, void *from)
+static inline void NetCopyIP(void *to, void *from)
 {
-       memcpy((void*)to, from, sizeof(IPaddr_t));
+       memcpy((void *)to, from, sizeof(IPaddr_t));
 }
 
 /* copy ulong */
 static inline void NetCopyLong(ulong *to, ulong *from)
 {
-       memcpy((void*)to, (void*)from, sizeof(ulong));
+       memcpy((void *)to, (void *)from, sizeof(ulong));
 }
 
 /**
@@ -498,7 +511,7 @@ static inline int is_zero_ether_addr(const u8 *addr)
  */
 static inline int is_multicast_ether_addr(const u8 *addr)
 {
-       return (0x01 & addr[0]);
+       return 0x01 & addr[0];
 }
 
 /*
@@ -509,7 +522,8 @@ static inline int is_multicast_ether_addr(const u8 *addr)
  */
 static inline int is_broadcast_ether_addr(const u8 *addr)
 {
-       return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
+       return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
+               0xff;
 }
 
 /*
@@ -529,13 +543,13 @@ static inline int is_valid_ether_addr(const u8 *addr)
 }
 
 /* Convert an IP address to a string */
-extern void    ip_to_string (IPaddr_t x, char *s);
+extern void ip_to_string(IPaddr_t x, char *s);
 
 /* Convert a string to ip address */
 extern IPaddr_t string_to_ip(const char *s);
 
 /* Convert a VLAN id to a string */
-extern void    VLAN_to_string (ushort x, char *s);
+extern void VLAN_to_string(ushort x, char *s);
 
 /* Convert a string to a vlan id */
 extern ushort string_to_VLAN(const char *s);
@@ -544,7 +558,7 @@ extern ushort string_to_VLAN(const char *s);
 extern ushort getenv_VLAN(char *);
 
 /* copy a filename (allow for "..." notation, limit length) */
-extern void    copy_filename (char *dst, const char *src, int size);
+extern void copy_filename(char *dst, const char *src, int size);
 
 /* get a random source port */
 extern unsigned int random_port(void);
index 52a1526d951c407cc337bfd1f5426d3cd8212953..6a05b40aefe34f05a7bd1265772b7b0e2b7e4b3c 100644 (file)
@@ -55,6 +55,7 @@ struct pmic {
 };
 
 int pmic_init(void);
+int pmic_dialog_init(void);
 int check_reg(u32 reg);
 struct pmic *get_pmic(void);
 int pmic_probe(struct pmic *p);
index 800f9d9c0733b9af0deaf45c3bd03c7ffbc8dac4..9d371832436f4fcd65677d79c9510a2b00a49ee5 100644 (file)
  */
 #define SDHCI_QUIRK_32BIT_DMA_ADDR     (1 << 0)
 #define SDHCI_QUIRK_REG32_RW           (1 << 1)
+#define SDHCI_QUIRK_BROKEN_R1B         (1 << 2)
+#define SDHCI_QUIRK_NO_HISPD_BIT       (1 << 3)
+#define SDHCI_QUIRK_BROKEN_VOLTAGE     (1 << 4)
 
 /* to make gcc happy */
 struct sdhci_host;
@@ -240,10 +243,14 @@ struct sdhci_host {
        char *name;
        void *ioaddr;
        unsigned int quirks;
+       unsigned int host_caps;
        unsigned int version;
        unsigned int clock;
        struct mmc *mmc;
        const struct sdhci_ops *ops;
+
+       void (*set_control_reg)(struct sdhci_host *host);
+       uint    voltages;
 };
 
 #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
diff --git a/include/tegra-kbc.h b/include/tegra-kbc.h
new file mode 100644 (file)
index 0000000..f331c79
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef __include_tegra_kbc_h__
+#define __include_tegra_kbc_h__
+
+#include <common.h>
+
+#define KEY_IS_MODIFIER(key) ((key) >= KEY_FIRST_MODIFIER)
+
+struct kbc_tegra {
+       u32 control;
+       u32 interrupt;
+       u32 row_cfg[4];
+       u32 col_cfg[3];
+       u32 timeout_dly;
+       u32 init_dly;
+       u32 rpt_dly;
+       u32 kp_ent[2];
+       u32 row_mask[16];
+};
+
+#ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
+extern int overwrite_console(void);
+#define OVERWRITE_CONSOLE overwrite_console()
+#else
+#define OVERWRITE_CONSOLE 0
+#endif /* CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE */
+
+#endif /* __include_tegra_kbc_h__ */
diff --git a/include/tps6586x.h b/include/tps6586x.h
new file mode 100644 (file)
index 0000000..ab88082
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ *  (C) Copyright 2010,2011
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ * 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
+ */
+
+#ifndef __H_
+#define _TPS6586X_H_
+
+enum {
+       /* SM0-2 PWM/PFM Mode Selection */
+       TPS6586X_PWM_SM0        = 1 << 0,
+       TPS6586X_PWM_SM1        = 1 << 1,
+       TPS6586X_PWM_SM2        = 1 << 2,
+};
+
+/**
+ * Enable PWM mode for selected SM0-2
+ *
+ * @param mask Mask of synchronous converter to enable (TPS6586X_PWM_...)
+ * @return 0 if ok, -1 on error
+ */
+int tps6586x_set_pwm_mode(int mask);
+
+/**
+ * Adjust SM0 and SM1 voltages to the given targets in incremental steps.
+ *
+ * @param sm0_target   Target voltage for SM0 in 25mW units, 0=725mV, 31=1.5V
+ * @param sm1_target   Target voltage for SM1 in 25mW units, 0=725mV, 31=1.5V
+ * @param step         Amount to change voltage in each step, in 25mW units
+ * @param rate         Slew ratein mV/us: 0=instantly, 1=0.11, 2=0.22,
+ *                     3=0.44, 4=0.88, 5=1.76, 6=3.52, 7=7.04
+ * @param min_sm0_over_sm1     Minimum amount by which sm0 must exceed sm1.
+ *                     If this condition is not met, no adjustment will be
+ *                     done and an error will be reported. Use -1 to skip
+ *                     this check.
+ * @return 0 if ok, -1 on error
+ */
+int tps6586x_adjust_sm0_sm1(int sm0_target, int sm1_target, int step, int rate,
+                           int min_sm0_over_sm1);
+
+/**
+ * Set up the TPS6586X I2C bus number. This will be used for all operations
+ * on the device. This function must be called before using other functions.
+ *
+ * @param bus  I2C bus number containing the TPS6586X chip
+ * @return 0 (always succeeds)
+ */
+int tps6586x_init(int bus);
+
+#endif /* _TPS6586X_H_ */
diff --git a/include/twl6035.h b/include/twl6035.h
new file mode 100644 (file)
index 0000000..e21ddba
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * (C) Copyright 2012
+ * Texas Instruments, <www.ti.com>
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <i2c.h>
+
+/* I2C chip addresses */
+#define TWL6035_CHIP_ADDR      0x48
+
+/* 0x1XY translates to page 1, register address 0xXY */
+#define LDO9_CTRL              0x60
+#define LDO9_VOLTAGE           0x61
+
+/* Bit field definitions for LDOx_CTRL */
+#define LDO_ON                 (1 << 4)
+#define LDO_MODE_SLEEP         (1 << 2)
+#define LDO_MODE_ACTIVE                (1 << 0)
+
+int twl6035_i2c_write_u8(u8 chip_no, u8 val, u8 reg);
+int twl6035_i2c_read_u8(u8 chip_no, u8 *val, u8 reg);
+void twl6035_init_settings(void);
+void twl6035_mmc1_poweron_ldo(void);
index a0fec60a136a07388f4cf4d9b8c216b211c02881..1e8478f0312e1a4f9d81513a2ad9ec06272a70cf 100644 (file)
@@ -28,6 +28,7 @@ LIB   = $(obj)libgeneric.o
 ifndef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_ADDR_MAP) += addr_map.o
 COBJS-$(CONFIG_BCH) += bch.o
+COBJS-$(CONFIG_AES) += aes.o
 COBJS-$(CONFIG_BZIP2) += bzlib.o
 COBJS-$(CONFIG_BZIP2) += bzlib_crctable.o
 COBJS-$(CONFIG_BZIP2) += bzlib_decompress.o
diff --git a/lib/aes.c b/lib/aes.c
new file mode 100644 (file)
index 0000000..7da9edb
--- /dev/null
+++ b/lib/aes.c
@@ -0,0 +1,598 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2011 NVIDIA Corporation www.nvidia.com
+ *
+ * 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
+ */
+
+/*
+ * advanced encryption standard
+ * author: karl malbrain, malbrain@yahoo.com
+ *
+ * This work, including the source code, documentation
+ * and related data, is placed into the public domain.
+ *
+ * The orginal author is Karl Malbrain.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+ * OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+ * MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ * ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+ * RESULTING FROM THE USE, MODIFICATION, OR
+ * REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#include <common.h>
+#include "aes.h"
+
+/* forward s-box */
+static const u8 sbox[256] = {
+       0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
+       0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+       0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+       0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+       0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
+       0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+       0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
+       0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+       0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+       0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+       0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
+       0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+       0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
+       0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+       0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+       0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+       0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
+       0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+       0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
+       0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+       0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+       0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+       0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
+       0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+       0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
+       0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+       0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+       0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+       0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
+       0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+       0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
+       0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+};
+
+/* inverse s-box */
+static const u8 inv_sbox[256] = {
+       0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
+       0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
+       0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+       0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
+       0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
+       0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+       0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
+       0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
+       0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+       0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
+       0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
+       0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+       0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
+       0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
+       0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+       0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
+       0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
+       0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+       0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
+       0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
+       0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+       0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
+       0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
+       0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+       0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
+       0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
+       0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+       0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
+       0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
+       0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+       0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
+       0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+};
+
+/* combined Xtimes2[Sbox[]] */
+static const u8 x2_sbox[256] = {
+       0xc6, 0xf8, 0xee, 0xf6, 0xff, 0xd6, 0xde, 0x91,
+       0x60, 0x02, 0xce, 0x56, 0xe7, 0xb5, 0x4d, 0xec,
+       0x8f, 0x1f, 0x89, 0xfa, 0xef, 0xb2, 0x8e, 0xfb,
+       0x41, 0xb3, 0x5f, 0x45, 0x23, 0x53, 0xe4, 0x9b,
+       0x75, 0xe1, 0x3d, 0x4c, 0x6c, 0x7e, 0xf5, 0x83,
+       0x68, 0x51, 0xd1, 0xf9, 0xe2, 0xab, 0x62, 0x2a,
+       0x08, 0x95, 0x46, 0x9d, 0x30, 0x37, 0x0a, 0x2f,
+       0x0e, 0x24, 0x1b, 0xdf, 0xcd, 0x4e, 0x7f, 0xea,
+       0x12, 0x1d, 0x58, 0x34, 0x36, 0xdc, 0xb4, 0x5b,
+       0xa4, 0x76, 0xb7, 0x7d, 0x52, 0xdd, 0x5e, 0x13,
+       0xa6, 0xb9, 0x00, 0xc1, 0x40, 0xe3, 0x79, 0xb6,
+       0xd4, 0x8d, 0x67, 0x72, 0x94, 0x98, 0xb0, 0x85,
+       0xbb, 0xc5, 0x4f, 0xed, 0x86, 0x9a, 0x66, 0x11,
+       0x8a, 0xe9, 0x04, 0xfe, 0xa0, 0x78, 0x25, 0x4b,
+       0xa2, 0x5d, 0x80, 0x05, 0x3f, 0x21, 0x70, 0xf1,
+       0x63, 0x77, 0xaf, 0x42, 0x20, 0xe5, 0xfd, 0xbf,
+       0x81, 0x18, 0x26, 0xc3, 0xbe, 0x35, 0x88, 0x2e,
+       0x93, 0x55, 0xfc, 0x7a, 0xc8, 0xba, 0x32, 0xe6,
+       0xc0, 0x19, 0x9e, 0xa3, 0x44, 0x54, 0x3b, 0x0b,
+       0x8c, 0xc7, 0x6b, 0x28, 0xa7, 0xbc, 0x16, 0xad,
+       0xdb, 0x64, 0x74, 0x14, 0x92, 0x0c, 0x48, 0xb8,
+       0x9f, 0xbd, 0x43, 0xc4, 0x39, 0x31, 0xd3, 0xf2,
+       0xd5, 0x8b, 0x6e, 0xda, 0x01, 0xb1, 0x9c, 0x49,
+       0xd8, 0xac, 0xf3, 0xcf, 0xca, 0xf4, 0x47, 0x10,
+       0x6f, 0xf0, 0x4a, 0x5c, 0x38, 0x57, 0x73, 0x97,
+       0xcb, 0xa1, 0xe8, 0x3e, 0x96, 0x61, 0x0d, 0x0f,
+       0xe0, 0x7c, 0x71, 0xcc, 0x90, 0x06, 0xf7, 0x1c,
+       0xc2, 0x6a, 0xae, 0x69, 0x17, 0x99, 0x3a, 0x27,
+       0xd9, 0xeb, 0x2b, 0x22, 0xd2, 0xa9, 0x07, 0x33,
+       0x2d, 0x3c, 0x15, 0xc9, 0x87, 0xaa, 0x50, 0xa5,
+       0x03, 0x59, 0x09, 0x1a, 0x65, 0xd7, 0x84, 0xd0,
+       0x82, 0x29, 0x5a, 0x1e, 0x7b, 0xa8, 0x6d, 0x2c
+};
+
+/* combined Xtimes3[Sbox[]] */
+static const u8 x3_sbox[256] = {
+       0xa5, 0x84, 0x99, 0x8d, 0x0d, 0xbd, 0xb1, 0x54,
+       0x50, 0x03, 0xa9, 0x7d, 0x19, 0x62, 0xe6, 0x9a,
+       0x45, 0x9d, 0x40, 0x87, 0x15, 0xeb, 0xc9, 0x0b,
+       0xec, 0x67, 0xfd, 0xea, 0xbf, 0xf7, 0x96, 0x5b,
+       0xc2, 0x1c, 0xae, 0x6a, 0x5a, 0x41, 0x02, 0x4f,
+       0x5c, 0xf4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3f,
+       0x0c, 0x52, 0x65, 0x5e, 0x28, 0xa1, 0x0f, 0xb5,
+       0x09, 0x36, 0x9b, 0x3d, 0x26, 0x69, 0xcd, 0x9f,
+       0x1b, 0x9e, 0x74, 0x2e, 0x2d, 0xb2, 0xee, 0xfb,
+       0xf6, 0x4d, 0x61, 0xce, 0x7b, 0x3e, 0x71, 0x97,
+       0xf5, 0x68, 0x00, 0x2c, 0x60, 0x1f, 0xc8, 0xed,
+       0xbe, 0x46, 0xd9, 0x4b, 0xde, 0xd4, 0xe8, 0x4a,
+       0x6b, 0x2a, 0xe5, 0x16, 0xc5, 0xd7, 0x55, 0x94,
+       0xcf, 0x10, 0x06, 0x81, 0xf0, 0x44, 0xba, 0xe3,
+       0xf3, 0xfe, 0xc0, 0x8a, 0xad, 0xbc, 0x48, 0x04,
+       0xdf, 0xc1, 0x75, 0x63, 0x30, 0x1a, 0x0e, 0x6d,
+       0x4c, 0x14, 0x35, 0x2f, 0xe1, 0xa2, 0xcc, 0x39,
+       0x57, 0xf2, 0x82, 0x47, 0xac, 0xe7, 0x2b, 0x95,
+       0xa0, 0x98, 0xd1, 0x7f, 0x66, 0x7e, 0xab, 0x83,
+       0xca, 0x29, 0xd3, 0x3c, 0x79, 0xe2, 0x1d, 0x76,
+       0x3b, 0x56, 0x4e, 0x1e, 0xdb, 0x0a, 0x6c, 0xe4,
+       0x5d, 0x6e, 0xef, 0xa6, 0xa8, 0xa4, 0x37, 0x8b,
+       0x32, 0x43, 0x59, 0xb7, 0x8c, 0x64, 0xd2, 0xe0,
+       0xb4, 0xfa, 0x07, 0x25, 0xaf, 0x8e, 0xe9, 0x18,
+       0xd5, 0x88, 0x6f, 0x72, 0x24, 0xf1, 0xc7, 0x51,
+       0x23, 0x7c, 0x9c, 0x21, 0xdd, 0xdc, 0x86, 0x85,
+       0x90, 0x42, 0xc4, 0xaa, 0xd8, 0x05, 0x01, 0x12,
+       0xa3, 0x5f, 0xf9, 0xd0, 0x91, 0x58, 0x27, 0xb9,
+       0x38, 0x13, 0xb3, 0x33, 0xbb, 0x70, 0x89, 0xa7,
+       0xb6, 0x22, 0x92, 0x20, 0x49, 0xff, 0x78, 0x7a,
+       0x8f, 0xf8, 0x80, 0x17, 0xda, 0x31, 0xc6, 0xb8,
+       0xc3, 0xb0, 0x77, 0x11, 0xcb, 0xfc, 0xd6, 0x3a
+};
+
+/*
+ * modular multiplication tables based on:
+ *
+ * Xtime2[x] = (x & 0x80 ? 0x1b : 0) ^ (x + x)
+ * Xtime3[x] = x^Xtime2[x];
+ */
+static const u8 x_time_9[256] = {
+       0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f,
+       0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
+       0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf,
+       0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7,
+       0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04,
+       0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c,
+       0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94,
+       0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc,
+       0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49,
+       0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01,
+       0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9,
+       0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91,
+       0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72,
+       0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a,
+       0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2,
+       0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa,
+       0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3,
+       0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b,
+       0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43,
+       0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b,
+       0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8,
+       0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0,
+       0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78,
+       0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30,
+       0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5,
+       0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed,
+       0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35,
+       0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d,
+       0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e,
+       0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6,
+       0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e,
+       0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46
+};
+
+static const u8 x_time_b[256] = {
+       0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31,
+       0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69,
+       0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81,
+       0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9,
+       0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a,
+       0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12,
+       0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa,
+       0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2,
+       0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7,
+       0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f,
+       0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77,
+       0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f,
+       0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc,
+       0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4,
+       0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c,
+       0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54,
+       0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6,
+       0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e,
+       0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76,
+       0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e,
+       0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd,
+       0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5,
+       0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d,
+       0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55,
+       0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30,
+       0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68,
+       0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80,
+       0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8,
+       0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b,
+       0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13,
+       0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb,
+       0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3
+};
+
+static const u8 x_time_d[256] = {
+       0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23,
+       0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b,
+       0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3,
+       0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b,
+       0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98,
+       0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0,
+       0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48,
+       0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20,
+       0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e,
+       0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26,
+       0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e,
+       0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6,
+       0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5,
+       0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d,
+       0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25,
+       0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d,
+       0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9,
+       0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91,
+       0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29,
+       0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41,
+       0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42,
+       0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a,
+       0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92,
+       0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa,
+       0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94,
+       0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc,
+       0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44,
+       0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c,
+       0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f,
+       0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47,
+       0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff,
+       0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97
+};
+
+static const u8 x_time_e[256] = {
+       0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a,
+       0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a,
+       0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca,
+       0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba,
+       0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1,
+       0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81,
+       0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11,
+       0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61,
+       0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87,
+       0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7,
+       0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67,
+       0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17,
+       0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c,
+       0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c,
+       0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc,
+       0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc,
+       0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b,
+       0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b,
+       0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b,
+       0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb,
+       0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0,
+       0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0,
+       0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50,
+       0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20,
+       0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6,
+       0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6,
+       0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26,
+       0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56,
+       0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d,
+       0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d,
+       0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd,
+       0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d
+};
+
+/*
+ * Exchanges columns in each of 4 rows
+ * row0 - unchanged, row1- shifted left 1,
+ * row2 - shifted left 2 and row3 - shifted left 3
+ */
+static void shift_rows(u8 *state)
+{
+       u8 tmp;
+
+       /* just substitute row 0 */
+       state[0] = sbox[state[0]];
+       state[4] = sbox[state[4]];
+       state[8] = sbox[state[8]];
+       state[12] = sbox[state[12]];
+
+       /* rotate row 1 */
+       tmp = sbox[state[1]];
+       state[1] = sbox[state[5]];
+       state[5] = sbox[state[9]];
+       state[9] = sbox[state[13]];
+       state[13] = tmp;
+
+       /* rotate row 2 */
+       tmp = sbox[state[2]];
+       state[2] = sbox[state[10]];
+       state[10] = tmp;
+       tmp = sbox[state[6]];
+       state[6] = sbox[state[14]];
+       state[14] = tmp;
+
+       /* rotate row 3 */
+       tmp = sbox[state[15]];
+       state[15] = sbox[state[11]];
+       state[11] = sbox[state[7]];
+       state[7] = sbox[state[3]];
+       state[3] = tmp;
+}
+
+/*
+ * restores columns in each of 4 rows
+ * row0 - unchanged, row1- shifted right 1,
+ * row2 - shifted right 2 and row3 - shifted right 3
+ */
+static void inv_shift_rows(u8 *state)
+{
+       u8 tmp;
+
+       /* restore row 0 */
+       state[0] = inv_sbox[state[0]];
+       state[4] = inv_sbox[state[4]];
+       state[8] = inv_sbox[state[8]];
+       state[12] = inv_sbox[state[12]];
+
+       /* restore row 1 */
+       tmp = inv_sbox[state[13]];
+       state[13] = inv_sbox[state[9]];
+       state[9] = inv_sbox[state[5]];
+       state[5] = inv_sbox[state[1]];
+       state[1] = tmp;
+
+       /* restore row 2 */
+       tmp = inv_sbox[state[2]];
+       state[2] = inv_sbox[state[10]];
+       state[10] = tmp;
+       tmp = inv_sbox[state[6]];
+       state[6] = inv_sbox[state[14]];
+       state[14] = tmp;
+
+       /* restore row 3 */
+       tmp = inv_sbox[state[3]];
+       state[3] = inv_sbox[state[7]];
+       state[7] = inv_sbox[state[11]];
+       state[11] = inv_sbox[state[15]];
+       state[15] = tmp;
+}
+
+/* recombine and mix each row in a column */
+static void mix_sub_columns(u8 *state)
+{
+       u8 tmp[4 * AES_STATECOLS];
+
+       /* mixing column 0 */
+       tmp[0] = x2_sbox[state[0]] ^ x3_sbox[state[5]] ^
+                sbox[state[10]] ^ sbox[state[15]];
+       tmp[1] = sbox[state[0]] ^ x2_sbox[state[5]] ^
+                x3_sbox[state[10]] ^ sbox[state[15]];
+       tmp[2] = sbox[state[0]] ^ sbox[state[5]] ^
+                x2_sbox[state[10]] ^ x3_sbox[state[15]];
+       tmp[3] = x3_sbox[state[0]] ^ sbox[state[5]] ^
+                sbox[state[10]] ^ x2_sbox[state[15]];
+
+       /* mixing column 1 */
+       tmp[4] = x2_sbox[state[4]] ^ x3_sbox[state[9]] ^
+                sbox[state[14]] ^ sbox[state[3]];
+       tmp[5] = sbox[state[4]] ^ x2_sbox[state[9]] ^
+                x3_sbox[state[14]] ^ sbox[state[3]];
+       tmp[6] = sbox[state[4]] ^ sbox[state[9]] ^
+                x2_sbox[state[14]] ^ x3_sbox[state[3]];
+       tmp[7] = x3_sbox[state[4]] ^ sbox[state[9]] ^
+                sbox[state[14]] ^ x2_sbox[state[3]];
+
+       /* mixing column 2 */
+       tmp[8] = x2_sbox[state[8]] ^ x3_sbox[state[13]] ^
+                sbox[state[2]] ^ sbox[state[7]];
+       tmp[9] = sbox[state[8]] ^ x2_sbox[state[13]] ^
+                x3_sbox[state[2]] ^ sbox[state[7]];
+       tmp[10] = sbox[state[8]] ^ sbox[state[13]] ^
+                 x2_sbox[state[2]] ^ x3_sbox[state[7]];
+       tmp[11] = x3_sbox[state[8]] ^ sbox[state[13]] ^
+                 sbox[state[2]] ^ x2_sbox[state[7]];
+
+       /* mixing column 3 */
+       tmp[12] = x2_sbox[state[12]] ^ x3_sbox[state[1]] ^
+                 sbox[state[6]] ^ sbox[state[11]];
+       tmp[13] = sbox[state[12]] ^ x2_sbox[state[1]] ^
+                 x3_sbox[state[6]] ^ sbox[state[11]];
+       tmp[14] = sbox[state[12]] ^ sbox[state[1]] ^
+                 x2_sbox[state[6]] ^ x3_sbox[state[11]];
+       tmp[15] = x3_sbox[state[12]] ^ sbox[state[1]] ^
+                 sbox[state[6]] ^ x2_sbox[state[11]];
+
+       memcpy(state, tmp, sizeof(tmp));
+}
+
+/* restore and un-mix each row in a column */
+static void inv_mix_sub_columns(u8 *state)
+{
+       u8 tmp[4 * AES_STATECOLS];
+       int  i;
+
+       /* restore column 0 */
+       tmp[0] = x_time_e[state[0]] ^ x_time_b[state[1]] ^
+                x_time_d[state[2]] ^ x_time_9[state[3]];
+       tmp[5] = x_time_9[state[0]] ^ x_time_e[state[1]] ^
+                x_time_b[state[2]] ^ x_time_d[state[3]];
+       tmp[10] = x_time_d[state[0]] ^ x_time_9[state[1]] ^
+                 x_time_e[state[2]] ^ x_time_b[state[3]];
+       tmp[15] = x_time_b[state[0]] ^ x_time_d[state[1]] ^
+                 x_time_9[state[2]] ^ x_time_e[state[3]];
+
+       /* restore column 1 */
+       tmp[4] = x_time_e[state[4]] ^ x_time_b[state[5]] ^
+                x_time_d[state[6]] ^ x_time_9[state[7]];
+       tmp[9] = x_time_9[state[4]] ^ x_time_e[state[5]] ^
+                x_time_b[state[6]] ^ x_time_d[state[7]];
+       tmp[14] = x_time_d[state[4]] ^ x_time_9[state[5]] ^
+                 x_time_e[state[6]] ^ x_time_b[state[7]];
+       tmp[3] = x_time_b[state[4]] ^ x_time_d[state[5]] ^
+                x_time_9[state[6]] ^ x_time_e[state[7]];
+
+       /* restore column 2 */
+       tmp[8] = x_time_e[state[8]] ^ x_time_b[state[9]] ^
+                x_time_d[state[10]] ^ x_time_9[state[11]];
+       tmp[13] = x_time_9[state[8]] ^ x_time_e[state[9]] ^
+                 x_time_b[state[10]] ^ x_time_d[state[11]];
+       tmp[2] = x_time_d[state[8]] ^ x_time_9[state[9]] ^
+                x_time_e[state[10]] ^ x_time_b[state[11]];
+       tmp[7] = x_time_b[state[8]] ^ x_time_d[state[9]] ^
+                x_time_9[state[10]] ^ x_time_e[state[11]];
+
+       /* restore column 3 */
+       tmp[12] = x_time_e[state[12]] ^ x_time_b[state[13]] ^
+                 x_time_d[state[14]] ^ x_time_9[state[15]];
+       tmp[1] = x_time_9[state[12]] ^ x_time_e[state[13]] ^
+                x_time_b[state[14]] ^ x_time_d[state[15]];
+       tmp[6] = x_time_d[state[12]] ^ x_time_9[state[13]] ^
+                x_time_e[state[14]] ^ x_time_b[state[15]];
+       tmp[11] = x_time_b[state[12]] ^ x_time_d[state[13]] ^
+                 x_time_9[state[14]] ^ x_time_e[state[15]];
+
+       for (i = 0; i < 4 * AES_STATECOLS; i++)
+               state[i] = inv_sbox[tmp[i]];
+}
+
+/*
+ * encrypt/decrypt columns of the key
+ * n.b. you can replace this with byte-wise xor if you wish.
+ */
+static void add_round_key(u32 *state, u32 *key)
+{
+       int idx;
+
+       for (idx = 0; idx < 4; idx++)
+               state[idx] ^= key[idx];
+}
+
+static u8 rcon[11] = {
+       0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
+};
+
+/* produce AES_STATECOLS bytes for each round */
+void aes_expand_key(u8 *key, u8 *expkey)
+{
+       u8 tmp0, tmp1, tmp2, tmp3, tmp4;
+       u32 idx;
+
+       memcpy(expkey, key, AES_KEYCOLS * 4);
+
+       for (idx = AES_KEYCOLS; idx < AES_STATECOLS * (AES_ROUNDS + 1); idx++) {
+               tmp0 = expkey[4*idx - 4];
+               tmp1 = expkey[4*idx - 3];
+               tmp2 = expkey[4*idx - 2];
+               tmp3 = expkey[4*idx - 1];
+               if (!(idx % AES_KEYCOLS)) {
+                       tmp4 = tmp3;
+                       tmp3 = sbox[tmp0];
+                       tmp0 = sbox[tmp1] ^ rcon[idx / AES_KEYCOLS];
+                       tmp1 = sbox[tmp2];
+                       tmp2 = sbox[tmp4];
+               } else if ((AES_KEYCOLS > 6) && (idx % AES_KEYCOLS == 4)) {
+                       tmp0 = sbox[tmp0];
+                       tmp1 = sbox[tmp1];
+                       tmp2 = sbox[tmp2];
+                       tmp3 = sbox[tmp3];
+               }
+
+               expkey[4*idx+0] = expkey[4*idx - 4*AES_KEYCOLS + 0] ^ tmp0;
+               expkey[4*idx+1] = expkey[4*idx - 4*AES_KEYCOLS + 1] ^ tmp1;
+               expkey[4*idx+2] = expkey[4*idx - 4*AES_KEYCOLS + 2] ^ tmp2;
+               expkey[4*idx+3] = expkey[4*idx - 4*AES_KEYCOLS + 3] ^ tmp3;
+       }
+}
+
+/* encrypt one 128 bit block */
+void aes_encrypt(u8 *in, u8 *expkey, u8 *out)
+{
+       u8 state[AES_STATECOLS * 4];
+       u32 round;
+
+       memcpy(state, in, AES_STATECOLS * 4);
+       add_round_key((u32 *)state, (u32 *)expkey);
+
+       for (round = 1; round < AES_ROUNDS + 1; round++) {
+               if (round < AES_ROUNDS)
+                       mix_sub_columns(state);
+               else
+                       shift_rows(state);
+
+               add_round_key((u32 *)state,
+                             (u32 *)expkey + round * AES_STATECOLS);
+       }
+
+       memcpy(out, state, sizeof(state));
+}
+
+void aes_decrypt(u8 *in, u8 *expkey, u8 *out)
+{
+       u8 state[AES_STATECOLS * 4];
+       int round;
+
+       memcpy(state, in, sizeof(state));
+
+       add_round_key((u32 *)state,
+                     (u32 *)expkey + AES_ROUNDS * AES_STATECOLS);
+       inv_shift_rows(state);
+
+       for (round = AES_ROUNDS; round--; ) {
+               add_round_key((u32 *)state,
+                             (u32 *)expkey + round * AES_STATECOLS);
+               if (round)
+                       inv_mix_sub_columns(state);
+       }
+
+       memcpy(out, state, sizeof(state));
+}
index bdec1a0d962b1ce256b60f65e12774a42dde376c..cc09e06c730d993c06f3cc5798ef02077807d979 100644 (file)
@@ -40,6 +40,9 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(NVIDIA_TEGRA20_USB, "nvidia,tegra20-ehci"),
        COMPAT(NVIDIA_TEGRA20_I2C, "nvidia,tegra20-i2c"),
        COMPAT(NVIDIA_TEGRA20_DVC, "nvidia,tegra20-i2c-dvc"),
+       COMPAT(NVIDIA_TEGRA20_EMC, "nvidia,tegra20-emc"),
+       COMPAT(NVIDIA_TEGRA20_EMC_TABLE, "nvidia,tegra20-emc-table"),
+       COMPAT(NVIDIA_TEGRA20_KBC, "nvidia,tegra20-kbc"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
@@ -133,6 +136,21 @@ int fdtdec_next_compatible(const void *blob, int node,
        return fdt_node_offset_by_compatible(blob, node, compat_names[id]);
 }
 
+int fdtdec_next_compatible_subnode(const void *blob, int node,
+               enum fdt_compat_id id, int *depthp)
+{
+       do {
+               node = fdt_next_node(blob, node, depthp);
+       } while (*depthp > 1);
+
+       /* If this is a direct subnode, and compatible, return it */
+       if (*depthp == 1 && 0 == fdt_node_check_compatible(
+                                               blob, node, compat_names[id]))
+               return node;
+
+       return -FDT_ERR_NOTFOUND;
+}
+
 int fdtdec_next_alias(const void *blob, const char *name,
                enum fdt_compat_id id, int *upto)
 {
@@ -363,6 +381,17 @@ int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
        return err;
 }
 
+const u32 *fdtdec_locate_array(const void *blob, int node,
+                              const char *prop_name, int count)
+{
+       const u32 *cell;
+       int err;
+
+       cell = get_prop_check_min_len(blob, node, prop_name,
+                                     sizeof(u32) * count, &err);
+       return err ? NULL : cell;
+}
+
 int fdtdec_get_bool(const void *blob, int node, const char *prop_name)
 {
        const s32 *cell;
@@ -448,3 +477,27 @@ int fdtdec_setup_gpio(struct fdt_gpio_state *gpio)
                return -1;
        return 0;
 }
+
+int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
+               u8 *array, int count)
+{
+       const u8 *cell;
+       int err;
+
+       cell = get_prop_check_min_len(blob, node, prop_name, count, &err);
+       if (!err)
+               memcpy(array, cell, count);
+       return err;
+}
+
+const u8 *fdtdec_locate_byte_array(const void *blob, int node,
+                            const char *prop_name, int count)
+{
+       const u8 *cell;
+       int err;
+
+       cell = get_prop_check_min_len(blob, node, prop_name, count, &err);
+       if (err)
+               return NULL;
+       return cell;
+}
index 9e324769db12e07b49b4a6dda91c01487d1fa035..d0a7da248e4e9c57251548bbafb82b5568384698 100644 (file)
 #endif
 #include <linux/compiler.h>
 
-#define BOOTP_VENDOR_MAGIC     0x63825363      /* RFC1048 Magic Cookie         */
+#define BOOTP_VENDOR_MAGIC     0x63825363      /* RFC1048 Magic Cookie */
 
 #define TIMEOUT                5000UL  /* Milliseconds before trying BOOTP again */
 #ifndef CONFIG_NET_RETRY_COUNT
-# define TIMEOUT_COUNT 5               /* # of timeouts before giving up  */
+# define TIMEOUT_COUNT 5               /* # of timeouts before giving up */
 #else
 # define TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT)
 #endif
 
-#define PORT_BOOTPS    67              /* BOOTP server UDP port                */
-#define PORT_BOOTPC    68              /* BOOTP client UDP port                */
+#define PORT_BOOTPS    67              /* BOOTP server UDP port */
+#define PORT_BOOTPC    68              /* BOOTP client UDP port */
 
-#ifndef CONFIG_DHCP_MIN_EXT_LEN                /* minimal length of extension list     */
+#ifndef CONFIG_DHCP_MIN_EXT_LEN                /* minimal length of extension list */
 #define CONFIG_DHCP_MIN_EXT_LEN 64
 #endif
 
@@ -43,8 +43,8 @@ ulong         seed1, seed2;
 
 #if defined(CONFIG_CMD_DHCP)
 dhcp_state_t dhcp_state = INIT;
-unsigned long dhcp_leasetime = 0;
-IPaddr_t NetDHCPServerIP = 0;
+unsigned long dhcp_leasetime;
+IPaddr_t NetDHCPServerIP;
 static void DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                        unsigned len);
 
@@ -64,37 +64,29 @@ static char *dhcpmsg2str(int type)
        }
 }
 #endif
-
-#if defined(CONFIG_BOOTP_VENDOREX)
-extern u8 *dhcp_vendorex_prep (u8 *e); /*rtn new e after add own opts. */
-extern u8 *dhcp_vendorex_proc (u8 *e); /*rtn next e if mine,else NULL  */
-#endif
-
 #endif
 
 static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 {
-       Bootp_t *bp = (Bootp_t *) pkt;
+       struct Bootp_t *bp = (struct Bootp_t *) pkt;
        int retval = 0;
 
        if (dest != PORT_BOOTPC || src != PORT_BOOTPS)
                retval = -1;
-       else if (len < sizeof (Bootp_t) - OPT_SIZE)
+       else if (len < sizeof(struct Bootp_t) - OPT_SIZE)
                retval = -2;
        else if (bp->bp_op != OP_BOOTREQUEST &&
-           bp->bp_op != OP_BOOTREPLY &&
-           bp->bp_op != DHCP_OFFER &&
-           bp->bp_op != DHCP_ACK &&
-           bp->bp_op != DHCP_NAK ) {
+                       bp->bp_op != OP_BOOTREPLY &&
+                       bp->bp_op != DHCP_OFFER &&
+                       bp->bp_op != DHCP_ACK &&
+                       bp->bp_op != DHCP_NAK)
                retval = -3;
-       }
        else if (bp->bp_htype != HWT_ETHER)
                retval = -4;
        else if (bp->bp_hlen != HWL_ETHER)
                retval = -5;
-       else if (NetReadLong((ulong*)&bp->bp_id) != BootpID) {
+       else if (NetReadLong((ulong *)&bp->bp_id) != BootpID)
                retval = -6;
-       }
 
        debug("Filtering pkt = %d\n", retval);
 
@@ -104,7 +96,7 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
 /*
  * Copy parameters of interest from BOOTP_REPLY/DHCP_OFFER packet
  */
-static void BootpCopyNetParams(Bootp_t *bp)
+static void BootpCopyNetParams(struct Bootp_t *bp)
 {
        __maybe_unused IPaddr_t tmp_ip;
 
@@ -113,10 +105,10 @@ static void BootpCopyNetParams(Bootp_t *bp)
        NetCopyIP(&tmp_ip, &bp->bp_siaddr);
        if (tmp_ip != 0)
                NetCopyIP(&NetServerIP, &bp->bp_siaddr);
-       memcpy (NetServerEther, ((Ethernet_t *)NetRxPacket)->et_src, 6);
+       memcpy(NetServerEther, ((Ethernet_t *)NetRxPacket)->et_src, 6);
 #endif
        if (strlen(bp->bp_file) > 0)
-               copy_filename (BootFile, bp->bp_file, sizeof(BootFile));
+               copy_filename(BootFile, bp->bp_file, sizeof(BootFile));
 
        debug("Bootfile: %s\n", BootFile);
 
@@ -124,97 +116,95 @@ static void BootpCopyNetParams(Bootp_t *bp)
         * don't delete exising entry when BOOTP / DHCP reply does
         * not contain a new value
         */
-       if (*BootFile) {
-               setenv ("bootfile", BootFile);
-       }
+       if (*BootFile)
+               setenv("bootfile", BootFile);
 }
 
-static int truncate_sz (const char *name, int maxlen, int curlen)
+static int truncate_sz(const char *name, int maxlen, int curlen)
 {
        if (curlen >= maxlen) {
-               printf("*** WARNING: %s is too long (%d - max: %d) - truncated\n",
-                       name, curlen, maxlen);
+               printf("*** WARNING: %s is too long (%d - max: %d)"
+                       " - truncated\n", name, curlen, maxlen);
                curlen = maxlen - 1;
        }
-       return (curlen);
+       return curlen;
 }
 
 #if !defined(CONFIG_CMD_DHCP)
 
-static void BootpVendorFieldProcess (u8 * ext)
+static void BootpVendorFieldProcess(u8 *ext)
 {
        int size = *(ext + 1);
 
        debug("[BOOTP] Processing extension %d... (%d bytes)\n", *ext,
-                  *(ext + 1));
+               *(ext + 1));
 
        NetBootFileSize = 0;
 
        switch (*ext) {
                /* Fixed length fields */
-       case 1:                 /* Subnet mask                                  */
+       case 1:                 /* Subnet mask */
                if (NetOurSubnetMask == 0)
-                       NetCopyIP (&NetOurSubnetMask, (IPaddr_t *) (ext + 2));
+                       NetCopyIP(&NetOurSubnetMask, (IPaddr_t *) (ext + 2));
                break;
-       case 2:                 /* Time offset - Not yet supported              */
+       case 2:                 /* Time offset - Not yet supported */
                break;
                /* Variable length fields */
-       case 3:                 /* Gateways list                                */
-               if (NetOurGatewayIP == 0) {
-                       NetCopyIP (&NetOurGatewayIP, (IPaddr_t *) (ext + 2));
-               }
+       case 3:                 /* Gateways list */
+               if (NetOurGatewayIP == 0)
+                       NetCopyIP(&NetOurGatewayIP, (IPaddr_t *) (ext + 2));
                break;
-       case 4:                 /* Time server - Not yet supported              */
+       case 4:                 /* Time server - Not yet supported */
                break;
-       case 5:                 /* IEN-116 name server - Not yet supported      */
+       case 5:                 /* IEN-116 name server - Not yet supported */
                break;
        case 6:
-               if (NetOurDNSIP == 0) {
-                       NetCopyIP (&NetOurDNSIP, (IPaddr_t *) (ext + 2));
-               }
+               if (NetOurDNSIP == 0)
+                       NetCopyIP(&NetOurDNSIP, (IPaddr_t *) (ext + 2));
 #if defined(CONFIG_BOOTP_DNS2)
-               if ((NetOurDNS2IP == 0) && (size > 4)) {
-                       NetCopyIP (&NetOurDNS2IP, (IPaddr_t *) (ext + 2 + 4));
-               }
+               if ((NetOurDNS2IP == 0) && (size > 4))
+                       NetCopyIP(&NetOurDNS2IP, (IPaddr_t *) (ext + 2 + 4));
 #endif
                break;
-       case 7:                 /* Log server - Not yet supported               */
+       case 7:                 /* Log server - Not yet supported */
                break;
-       case 8:                 /* Cookie/Quote server - Not yet supported      */
+       case 8:                 /* Cookie/Quote server - Not yet supported */
                break;
-       case 9:                 /* LPR server - Not yet supported               */
+       case 9:                 /* LPR server - Not yet supported */
                break;
-       case 10:                /* Impress server - Not yet supported           */
+       case 10:                /* Impress server - Not yet supported */
                break;
-       case 11:                /* RPL server - Not yet supported               */
+       case 11:                /* RPL server - Not yet supported */
                break;
-       case 12:                /* Host name                                    */
+       case 12:                /* Host name */
                if (NetOurHostName[0] == 0) {
-                       size = truncate_sz ("Host Name", sizeof (NetOurHostName), size);
-                       memcpy (&NetOurHostName, ext + 2, size);
+                       size = truncate_sz("Host Name",
+                               sizeof(NetOurHostName), size);
+                       memcpy(&NetOurHostName, ext + 2, size);
                        NetOurHostName[size] = 0;
                }
                break;
-       case 13:                /* Boot file size                               */
+       case 13:                /* Boot file size */
                if (size == 2)
-                       NetBootFileSize = ntohs (*(ushort *) (ext + 2));
+                       NetBootFileSize = ntohs(*(ushort *) (ext + 2));
                else if (size == 4)
-                       NetBootFileSize = ntohl (*(ulong *) (ext + 2));
+                       NetBootFileSize = ntohl(*(ulong *) (ext + 2));
                break;
-       case 14:                /* Merit dump file - Not yet supported          */
+       case 14:                /* Merit dump file - Not yet supported */
                break;
-       case 15:                /* Domain name - Not yet supported              */
+       case 15:                /* Domain name - Not yet supported */
                break;
-       case 16:                /* Swap server - Not yet supported              */
+       case 16:                /* Swap server - Not yet supported */
                break;
-       case 17:                /* Root path                                    */
+       case 17:                /* Root path */
                if (NetOurRootPath[0] == 0) {
-                       size = truncate_sz ("Root Path", sizeof (NetOurRootPath), size);
-                       memcpy (&NetOurRootPath, ext + 2, size);
+                       size = truncate_sz("Root Path",
+                               sizeof(NetOurRootPath), size);
+                       memcpy(&NetOurRootPath, ext + 2, size);
                        NetOurRootPath[size] = 0;
                }
                break;
-       case 18:                /* Extension path - Not yet supported           */
+       case 18:                /* Extension path - Not yet supported */
                /*
                 * This can be used to send the information of the
                 * vendor area in another file that the client can
@@ -222,10 +212,11 @@ static void BootpVendorFieldProcess (u8 * ext)
                 */
                break;
                /* IP host layer fields */
-       case 40:                /* NIS Domain name                              */
+       case 40:                /* NIS Domain name */
                if (NetOurNISDomain[0] == 0) {
-                       size = truncate_sz ("NIS Domain Name", sizeof (NetOurNISDomain), size);
-                       memcpy (&NetOurNISDomain, ext + 2, size);
+                       size = truncate_sz("NIS Domain Name",
+                               sizeof(NetOurNISDomain), size);
+                       memcpy(&NetOurNISDomain, ext + 2, size);
                        NetOurNISDomain[size] = 0;
                }
                break;
@@ -235,7 +226,7 @@ static void BootpVendorFieldProcess (u8 * ext)
                break;
 #endif
                /* Application layer fields */
-       case 43:                /* Vendor specific info - Not yet supported     */
+       case 43:                /* Vendor specific info - Not yet supported */
                /*
                 * Binary information to exchange specific
                 * product information.
@@ -245,7 +236,7 @@ static void BootpVendorFieldProcess (u8 * ext)
        }
 }
 
-static void BootpVendorProcess (u8 * ext, int size)
+static void BootpVendorProcess(u8 *ext, int size)
 {
        u8 *end = ext + size;
 
@@ -259,11 +250,11 @@ static void BootpVendorProcess (u8 * ext, int size)
 
                        ext += ext[1] + 2;
                        if (ext <= end)
-                               BootpVendorFieldProcess (opt);
+                               BootpVendorFieldProcess(opt);
                }
        }
 
-       debug("[BOOTP] Received fields: \n");
+       debug("[BOOTP] Received fields:\n");
        if (NetOurSubnetMask)
                debug("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);
 
@@ -298,27 +289,28 @@ static void
 BootpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
             unsigned len)
 {
-       Bootp_t *bp;
+       struct Bootp_t *bp;
 
        debug("got BOOTP packet (src=%d, dst=%d, len=%d want_len=%zu)\n",
-               src, dest, len, sizeof (Bootp_t));
+               src, dest, len, sizeof(struct Bootp_t));
 
-       bp = (Bootp_t *)pkt;
+       bp = (struct Bootp_t *)pkt;
 
-       if (BootpCheckPkt(pkt, dest, src, len)) /* Filter out pkts we don't want */
+       /* Filter out pkts we don't want */
+       if (BootpCheckPkt(pkt, dest, src, len))
                return;
 
        /*
         *      Got a good BOOTP reply.  Copy the data into our variables.
         */
 #ifdef CONFIG_STATUS_LED
-       status_led_set (STATUS_LED_BOOT, STATUS_LED_OFF);
+       status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
 #endif
 
        BootpCopyNetParams(bp);         /* Store net parameters from reply */
 
        /* Retrieve extended information (we must parse the vendor area) */
-       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
+       if (NetReadLong((ulong *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
                BootpVendorProcess((uchar *)&bp->bp_vend[4], len);
 
        NetSetTimeout(0, (thand_f *)0);
@@ -337,11 +329,11 @@ static void
 BootpTimeout(void)
 {
        if (BootpTry >= TIMEOUT_COUNT) {
-               puts ("\nRetry count exceeded; starting again\n");
-               NetStartAgain ();
+               puts("\nRetry count exceeded; starting again\n");
+               NetStartAgain();
        } else {
-               NetSetTimeout (TIMEOUT, BootpTimeout);
-               BootpRequest ();
+               NetSetTimeout(TIMEOUT, BootpTimeout);
+               BootpRequest();
        }
 }
 
@@ -349,7 +341,8 @@ BootpTimeout(void)
  *     Initialize BOOTP extension fields in the request.
  */
 #if defined(CONFIG_CMD_DHCP)
-static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t RequestedIP)
+static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID,
+                       IPaddr_t RequestedIP)
 {
        u8 *start = e;
        u8 *cnt;
@@ -381,7 +374,7 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R
        *e++ = (576 - 312 + OPT_SIZE) & 0xff;
 
        if (ServerID) {
-               int tmp = ntohl (ServerID);
+               int tmp = ntohl(ServerID);
 
                *e++ = 54;      /* ServerID */
                *e++ = 4;
@@ -392,7 +385,7 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R
        }
 
        if (RequestedIP) {
-               int tmp = ntohl (RequestedIP);
+               int tmp = ntohl(RequestedIP);
 
                *e++ = 50;      /* Requested IP */
                *e++ = 4;
@@ -402,12 +395,13 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R
                *e++ = tmp & 0xff;
        }
 #if defined(CONFIG_BOOTP_SEND_HOSTNAME)
-       if ((hostname = getenv ("hostname"))) {
-               int hostnamelen = strlen (hostname);
+       hostname = getenv("hostname");
+       if (hostname) {
+               int hostnamelen = strlen(hostname);
 
                *e++ = 12;      /* Hostname */
                *e++ = hostnamelen;
-               memcpy (e, hostname, hostnamelen);
+               memcpy(e, hostname, hostnamelen);
                e += hostnamelen;
        }
 #endif
@@ -448,7 +442,8 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R
 #endif
 
 #if defined(CONFIG_BOOTP_VENDOREX)
-       if ((x = dhcp_vendorex_prep (e)))
+       x = dhcp_vendorex_prep(e);
+       if (x)
                return x - start;
 #endif
 
@@ -508,9 +503,9 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R
 
 #else
 /*
- *     Warning: no field size check - change CONFIG_BOOTP_* at your own risk!
+ * Warning: no field size check - change CONFIG_BOOTP_* at your own risk!
  */
-static int BootpExtended (u8 * e)
+static int BootpExtended(u8 *e)
 {
        u8 *start = e;
 
@@ -584,10 +579,10 @@ static int BootpExtended (u8 * e)
 #endif
 
 void
-BootpRequest (void)
+BootpRequest(void)
 {
-       volatile uchar *pkt, *iphdr;
-       Bootp_t *bp;
+       uchar *pkt, *iphdr;
+       struct Bootp_t *bp;
        int ext_len, pktlen, iplen;
 
        bootstage_mark_name(BOOTSTAGE_ID_BOOTP_START, "bootp_start");
@@ -600,22 +595,22 @@ BootpRequest (void)
        int   reg;
        ulong tst1, tst2, sum, m_mask, m_value = 0;
 
-       if (BootpTry ==0) {
+       if (BootpTry == 0) {
                /* get our mac */
                eth_getenv_enetaddr("ethaddr", bi_enetaddr);
 
                debug("BootpRequest => Our Mac: ");
-               for (reg=0; reg<6; reg++)
-                       debug("%x%c", bi_enetaddr[reg], reg==5 ? '\n' : ':');
+               for (reg = 0; reg < 6; reg++)
+                       debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':');
 
                /* Mac-Manipulation 2 get seed1 */
-               tst1=0;
-               tst2=0;
-               for (reg=2; reg<6; reg++) {
+               tst1 = 0;
+               tst2 = 0;
+               for (reg = 2; reg < 6; reg++) {
                        tst1 = tst1 << 8;
                        tst1 = tst1 | bi_enetaddr[reg];
                }
-               for (reg=0; reg<2; reg++) {
+               for (reg = 0; reg < 2; reg++) {
                        tst2 = tst2 | bi_enetaddr[reg];
                        tst2 = tst2 << 8;
                }
@@ -623,8 +618,8 @@ BootpRequest (void)
                seed1 = tst1^tst2;
 
                /* Mirror seed1*/
-               m_mask=0x1;
-               for (reg=1;reg<=32;reg++) {
+               m_mask = 0x1;
+               for (reg = 1; reg <= 32; reg++) {
                        m_value |= (m_mask & seed1);
                        seed1 = seed1 >> 1;
                        m_value = m_value << 1;
@@ -634,44 +629,45 @@ BootpRequest (void)
        }
 
        /* Random Number Generator */
-
-       for (reg=0;reg<=0;reg++) {
+       for (reg = 0; reg <= 0; reg++) {
                sum = seed1 + seed2;
                if (sum < seed1 || sum < seed2)
                        sum++;
                seed2 = seed1;
                seed1 = sum;
 
-               if (BootpTry<=2) {      /* Start with max 1024 * 1ms */
+               if (BootpTry <= 2) {    /* Start with max 1024 * 1ms */
                        sum = sum >> (22-BootpTry);
-               } else {                /*After 3rd BOOTP request max 8192 * 1ms */
+               } else {        /*After 3rd BOOTP request max 8192 * 1ms */
                        sum = sum >> 19;
                }
        }
 
-       printf ("Random delay: %ld ms...\n", sum);
-       for (reg=0; reg <sum; reg++) {
+       printf("Random delay: %ld ms...\n", sum);
+       for (reg = 0; reg < sum; reg++)
                udelay(1000); /*Wait 1ms*/
-       }
+
 #endif /* CONFIG_BOOTP_RANDOM_DELAY */
 
        printf("BOOTP broadcast %d\n", ++BootpTry);
        pkt = NetTxPacket;
-       memset ((void*)pkt, 0, PKTSIZE);
+       memset((void *)pkt, 0, PKTSIZE);
 
        pkt += NetSetEther(pkt, NetBcastAddr, PROT_IP);
 
        /*
-        * Next line results in incorrect packet size being transmitted, resulting
-        * in errors in some DHCP servers, reporting missing bytes.  Size must be
-        * set in packet header after extension length has been determined.
+        * Next line results in incorrect packet size being transmitted,
+        * resulting in errors in some DHCP servers, reporting missing bytes.
+        * Size must be set in packet header after extension length has been
+        * determined.
         * C. Hallinan, DS4.COM, Inc.
         */
-       /* NetSetIP(pkt, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, sizeof (Bootp_t)); */
+       /* NetSetIP(pkt, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC,
+               sizeof (struct Bootp_t)); */
        iphdr = pkt;    /* We need this later for NetSetIP() */
        pkt += IP_HDR_SIZE;
 
-       bp = (Bootp_t *)pkt;
+       bp = (struct Bootp_t *)pkt;
        bp->bp_op = OP_BOOTREQUEST;
        bp->bp_htype = HWT_ETHER;
        bp->bp_hlen = HWL_ETHER;
@@ -681,8 +677,8 @@ BootpRequest (void)
        NetWriteIP(&bp->bp_yiaddr, 0);
        NetWriteIP(&bp->bp_siaddr, 0);
        NetWriteIP(&bp->bp_giaddr, 0);
-       memcpy (bp->bp_chaddr, NetOurEther, 6);
-       copy_filename (bp->bp_file, BootFile, sizeof(bp->bp_file));
+       memcpy(bp->bp_chaddr, NetOurEther, 6);
+       copy_filename(bp->bp_file, BootFile, sizeof(bp->bp_file));
 
        /* Request additional information from the BOOTP/DHCP server */
 #if defined(CONFIG_CMD_DHCP)
@@ -707,7 +703,8 @@ BootpRequest (void)
         * Calculate proper packet lengths taking into account the
         * variable size of the options field
         */
-       pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len;
+       pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE -
+               sizeof(bp->bp_vend) + ext_len;
        iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len;
        NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
        NetSetTimeout(SELECT_TIMEOUT, BootpTimeout);
@@ -722,7 +719,7 @@ BootpRequest (void)
 }
 
 #if defined(CONFIG_CMD_DHCP)
-static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
+static void DhcpOptionsProcess(uchar *popt, struct Bootp_t *bp)
 {
        uchar *end = popt + BOOTP_HDR_SIZE;
        int oplen, size;
@@ -734,50 +731,51 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
                oplen = *(popt + 1);
                switch (*popt) {
                case 1:
-                       NetCopyIP (&NetOurSubnetMask, (popt + 2));
+                       NetCopyIP(&NetOurSubnetMask, (popt + 2));
                        break;
 #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET)
                case 2:         /* Time offset  */
                        to_ptr = &NetTimeOffset;
-                       NetCopyLong ((ulong *)to_ptr, (ulong *)(popt + 2));
-                       NetTimeOffset = ntohl (NetTimeOffset);
+                       NetCopyLong((ulong *)to_ptr, (ulong *)(popt + 2));
+                       NetTimeOffset = ntohl(NetTimeOffset);
                        break;
 #endif
                case 3:
-                       NetCopyIP (&NetOurGatewayIP, (popt + 2));
+                       NetCopyIP(&NetOurGatewayIP, (popt + 2));
                        break;
                case 6:
-                       NetCopyIP (&NetOurDNSIP, (popt + 2));
+                       NetCopyIP(&NetOurDNSIP, (popt + 2));
 #if defined(CONFIG_BOOTP_DNS2)
-                       if (*(popt + 1) > 4) {
-                               NetCopyIP (&NetOurDNS2IP, (popt + 2 + 4));
-                       }
+                       if (*(popt + 1) > 4)
+                               NetCopyIP(&NetOurDNS2IP, (popt + 2 + 4));
 #endif
                        break;
                case 12:
-                       size = truncate_sz ("Host Name", sizeof (NetOurHostName), oplen);
-                       memcpy (&NetOurHostName, popt + 2, size);
+                       size = truncate_sz("Host Name",
+                               sizeof(NetOurHostName), oplen);
+                       memcpy(&NetOurHostName, popt + 2, size);
                        NetOurHostName[size] = 0;
                        break;
                case 15:        /* Ignore Domain Name Option */
                        break;
                case 17:
-                       size = truncate_sz ("Root Path", sizeof (NetOurRootPath), oplen);
-                       memcpy (&NetOurRootPath, popt + 2, size);
+                       size = truncate_sz("Root Path",
+                               sizeof(NetOurRootPath), oplen);
+                       memcpy(&NetOurRootPath, popt + 2, size);
                        NetOurRootPath[size] = 0;
                        break;
 #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_NTPSERVER)
                case 42:        /* NTP server IP */
-                       NetCopyIP (&NetNtpServerIP, (popt + 2));
+                       NetCopyIP(&NetNtpServerIP, (popt + 2));
                        break;
 #endif
                case 51:
-                       NetCopyLong (&dhcp_leasetime, (ulong *) (popt + 2));
+                       NetCopyLong(&dhcp_leasetime, (ulong *) (popt + 2));
                        break;
                case 53:        /* Ignore Message Type Option */
                        break;
                case 54:
-                       NetCopyIP (&NetDHCPServerIP, (popt + 2));
+                       NetCopyIP(&NetDHCPServerIP, (popt + 2));
                        break;
                case 58:        /* Ignore Renewal Time Option */
                        break;
@@ -792,7 +790,7 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
                         * pass the bootp packet pointer into here as the
                         * second arg
                         */
-                       size = truncate_sz ("Opt Boot File",
+                       size = truncate_sz("Opt Boot File",
                                            sizeof(bp->bp_file),
                                            oplen);
                        if (bp->bp_file[0] == '\0' && size > 0) {
@@ -813,10 +811,11 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
                        break;
                default:
 #if defined(CONFIG_BOOTP_VENDOREX)
-                       if (dhcp_vendorex_proc (popt))
+                       if (dhcp_vendorex_proc(popt))
                                break;
 #endif
-                       printf ("*** Unhandled DHCP Option in OFFER/ACK: %d\n", *popt);
+                       printf("*** Unhandled DHCP Option in OFFER/ACK:"
+                               " %d\n", *popt);
                        break;
                }
                popt += oplen + 2;      /* Process next option */
@@ -825,42 +824,42 @@ static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)
 
 static int DhcpMessageType(unsigned char *popt)
 {
-       if (NetReadLong((ulong*)popt) != htonl(BOOTP_VENDOR_MAGIC))
+       if (NetReadLong((ulong *)popt) != htonl(BOOTP_VENDOR_MAGIC))
                return -1;
 
        popt += 4;
-       while ( *popt != 0xff ) {
-               if ( *popt == 53 )      /* DHCP Message Type */
+       while (*popt != 0xff) {
+               if (*popt == 53)        /* DHCP Message Type */
                        return *(popt + 2);
                popt += *(popt + 1) + 2;        /* Scan through all options */
        }
        return -1;
 }
 
-static void DhcpSendRequestPkt(Bootp_t *bp_offer)
+static void DhcpSendRequestPkt(struct Bootp_t *bp_offer)
 {
-       volatile uchar *pkt, *iphdr;
-       Bootp_t *bp;
+       uchar *pkt, *iphdr;
+       struct Bootp_t *bp;
        int pktlen, iplen, extlen;
        IPaddr_t OfferedIP;
 
        debug("DhcpSendRequestPkt: Sending DHCPREQUEST\n");
        pkt = NetTxPacket;
-       memset ((void*)pkt, 0, PKTSIZE);
+       memset((void *)pkt, 0, PKTSIZE);
 
        pkt += NetSetEther(pkt, NetBcastAddr, PROT_IP);
 
-       iphdr = pkt;            /* We'll need this later to set proper pkt size */
+       iphdr = pkt;    /* We'll need this later to set proper pkt size */
        pkt += IP_HDR_SIZE;
 
-       bp = (Bootp_t *)pkt;
+       bp = (struct Bootp_t *)pkt;
        bp->bp_op = OP_BOOTREQUEST;
        bp->bp_htype = HWT_ETHER;
        bp->bp_hlen = HWL_ETHER;
        bp->bp_hops = 0;
        bp->bp_secs = htons(get_timer(0) / 1000);
-       /* Do not set the client IP, your IP, or server IP yet, since it hasn't been ACK'ed by
-        * the server yet */
+       /* Do not set the client IP, your IP, or server IP yet, since it
+        * hasn't been ACK'ed by the server yet */
 
        /*
         * RFC3046 requires Relay Agents to discard packets with
@@ -868,7 +867,7 @@ static void DhcpSendRequestPkt(Bootp_t *bp_offer)
         */
        NetWriteIP(&bp->bp_giaddr, 0);
 
-       memcpy (bp->bp_chaddr, NetOurEther, 6);
+       memcpy(bp->bp_chaddr, NetOurEther, 6);
 
        /*
         * ID is the id of the OFFER packet
@@ -882,9 +881,11 @@ static void DhcpSendRequestPkt(Bootp_t *bp_offer)
 
        /* Copy offered IP into the parameters request list */
        NetCopyIP(&OfferedIP, &bp_offer->bp_yiaddr);
-       extlen = DhcpExtended((u8 *)bp->bp_vend, DHCP_REQUEST, NetDHCPServerIP, OfferedIP);
+       extlen = DhcpExtended((u8 *)bp->bp_vend, DHCP_REQUEST,
+               NetDHCPServerIP, OfferedIP);
 
-       pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;
+       pktlen = ((int)(pkt-NetTxPacket)) + BOOTP_HDR_SIZE -
+               sizeof(bp->bp_vend) + extlen;
        iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;
        NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
 
@@ -902,36 +903,38 @@ static void
 DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
            unsigned len)
 {
-       Bootp_t *bp = (Bootp_t *)pkt;
+       struct Bootp_t *bp = (struct Bootp_t *)pkt;
 
        debug("DHCPHandler: got packet: (src=%d, dst=%d, len=%d) state: %d\n",
                src, dest, len, dhcp_state);
 
-       if (BootpCheckPkt(pkt, dest, src, len)) /* Filter out pkts we don't want */
+       /* Filter out pkts we don't want */
+       if (BootpCheckPkt(pkt, dest, src, len))
                return;
 
-       debug("DHCPHandler: got DHCP packet: (src=%d, dst=%d, len=%d) state: %d\n",
-               src, dest, len, dhcp_state);
+       debug("DHCPHandler: got DHCP packet: (src=%d, dst=%d, len=%d) state:"
+               " %d\n", src, dest, len, dhcp_state);
 
        switch (dhcp_state) {
        case SELECTING:
                /*
                 * Wait an appropriate time for any potential DHCPOFFER packets
-                * to arrive.  Then select one, and generate DHCPREQUEST response.
-                * If filename is in format we recognize, assume it is a valid
-                * OFFER from a server we want.
+                * to arrive.  Then select one, and generate DHCPREQUEST
+                * response.  If filename is in format we recognize, assume it
+                * is a valid OFFER from a server we want.
                 */
                debug("DHCP: state=SELECTING bp_file: \"%s\"\n", bp->bp_file);
 #ifdef CONFIG_SYS_BOOTFILE_PREFIX
                if (strncmp(bp->bp_file,
                            CONFIG_SYS_BOOTFILE_PREFIX,
-                           strlen(CONFIG_SYS_BOOTFILE_PREFIX)) == 0 ) {
+                           strlen(CONFIG_SYS_BOOTFILE_PREFIX)) == 0) {
 #endif /* CONFIG_SYS_BOOTFILE_PREFIX */
 
                        debug("TRANSITIONING TO REQUESTING STATE\n");
                        dhcp_state = REQUESTING;
 
-                       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
+                       if (NetReadLong((ulong *)&bp->bp_vend[0]) ==
+                                               htonl(BOOTP_VENDOR_MAGIC))
                                DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp);
 
                        NetSetTimeout(TIMEOUT, BootpTimeout);
@@ -945,14 +948,17 @@ DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
        case REQUESTING:
                debug("DHCP State: REQUESTING\n");
 
-               if ( DhcpMessageType((u8 *)bp->bp_vend) == DHCP_ACK ) {
-                       if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
+               if (DhcpMessageType((u8 *)bp->bp_vend) == DHCP_ACK) {
+                       if (NetReadLong((ulong *)&bp->bp_vend[0]) ==
+                                               htonl(BOOTP_VENDOR_MAGIC))
                                DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp);
-                       BootpCopyNetParams(bp); /* Store net params from reply */
+                       /* Store net params from reply */
+                       BootpCopyNetParams(bp);
                        dhcp_state = BOUND;
-                       printf ("DHCP client bound to address %pI4\n", &NetOurIP);
+                       printf("DHCP client bound to address %pI4\n",
+                               &NetOurIP);
                        bootstage_mark_name(BOOTSTAGE_ID_BOOTP_STOP,
-                                           "bootp_stop");
+                               "bootp_stop");
 
                        net_auto_load();
                        return;
@@ -962,7 +968,7 @@ DhcpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                /* DHCP client bound to address */
                break;
        default:
-               puts ("DHCP: INVALID STATE\n");
+               puts("DHCP: INVALID STATE\n");
                break;
        }
 
index 50625abea1839e6ecff7d04c8137a3ab6ca64c32..ce7373454eedd9ec1f82bb3e0586d38a8e90a4e2 100644 (file)
@@ -10,7 +10,7 @@
 #define __BOOTP_H__
 
 #ifndef __NET_H__
-#include       <net.h>
+#include <net.h>
 #endif /* __NET_H__ */
 
 /**********************************************************************/
  *     BOOTP header.
  */
 #if defined(CONFIG_CMD_DHCP)
-#define OPT_SIZE 312   /* Minimum DHCP Options size per RFC2131 - results in 576 byte pkt */
+/* Minimum DHCP Options size per RFC2131 - results in 576 byte pkt */
+#define OPT_SIZE 312
+#if defined(CONFIG_BOOTP_VENDOREX)
+extern u8 *dhcp_vendorex_prep(u8 *e); /*rtn new e after add own opts. */
+extern u8 *dhcp_vendorex_proc(u8 *e); /*rtn next e if mine,else NULL  */
+#endif
 #else
 #define OPT_SIZE 64
 #endif
 
-typedef struct
-{
-       uchar           bp_op;          /* Operation                            */
+struct Bootp_t {
+       uchar           bp_op;          /* Operation                    */
 # define OP_BOOTREQUEST        1
 # define OP_BOOTREPLY  2
-       uchar           bp_htype;       /* Hardware type                        */
+       uchar           bp_htype;       /* Hardware type                */
 # define HWT_ETHER     1
-       uchar           bp_hlen;        /* Hardware address length              */
+       uchar           bp_hlen;        /* Hardware address length      */
 # define HWL_ETHER     6
-       uchar           bp_hops;        /* Hop count (gateway thing)            */
-       ulong           bp_id;          /* Transaction ID                       */
-       ushort          bp_secs;        /* Seconds since boot                   */
-       ushort          bp_spare1;      /* Alignment                            */
-       IPaddr_t        bp_ciaddr;      /* Client IP address                    */
-       IPaddr_t        bp_yiaddr;      /* Your (client) IP address             */
-       IPaddr_t        bp_siaddr;      /* Server IP address                    */
-       IPaddr_t        bp_giaddr;      /* Gateway IP address                   */
-       uchar           bp_chaddr[16];  /* Client hardware address              */
-       char            bp_sname[64];   /* Server host name                     */
-       char            bp_file[128];   /* Boot file name                       */
-       char            bp_vend[OPT_SIZE];      /* Vendor information                   */
-}      Bootp_t;
-
-#define BOOTP_HDR_SIZE sizeof (Bootp_t)
+       uchar           bp_hops;        /* Hop count (gateway thing)    */
+       ulong           bp_id;          /* Transaction ID               */
+       ushort          bp_secs;        /* Seconds since boot           */
+       ushort          bp_spare1;      /* Alignment                    */
+       IPaddr_t        bp_ciaddr;      /* Client IP address            */
+       IPaddr_t        bp_yiaddr;      /* Your (client) IP address     */
+       IPaddr_t        bp_siaddr;      /* Server IP address            */
+       IPaddr_t        bp_giaddr;      /* Gateway IP address           */
+       uchar           bp_chaddr[16];  /* Client hardware address      */
+       char            bp_sname[64];   /* Server host name             */
+       char            bp_file[128];   /* Boot file name               */
+       char            bp_vend[OPT_SIZE];      /* Vendor information   */
+};
+
+#define BOOTP_HDR_SIZE sizeof(struct Bootp_t)
 #define BOOTP_SIZE     (ETHER_HDR_SIZE + IP_HDR_SIZE + BOOTP_HDR_SIZE)
 
 /**********************************************************************/
@@ -56,16 +60,16 @@ typedef struct
  */
 
 /* bootp.c */
-extern ulong   BootpID;                /* ID of cur BOOTP request              */
-extern char    BootFile[128];          /* Boot file name                       */
+extern ulong   BootpID;                /* ID of cur BOOTP request      */
+extern char    BootFile[128];          /* Boot file name               */
 extern int     BootpTry;
 #ifdef CONFIG_BOOTP_RANDOM_DELAY
-extern ulong   seed1, seed2;           /* seed for random BOOTP delay          */
+extern ulong   seed1, seed2;           /* seed for random BOOTP delay  */
 #endif
 
 
 /* Send a BOOTP request */
-extern void    BootpRequest (void);
+extern void BootpRequest(void);
 
 /****************** DHCP Support *********************/
 extern void DhcpRequest(void);
index 3eeb908a3563e1dff41166dda1aac62afb463ec1..d9a643073d8a0eecd305f07e3605d97a39e71c4b 100644 (file)
--- a/net/eth.c
+++ b/net/eth.c
@@ -82,14 +82,12 @@ int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
 int board_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
 
 #ifdef CONFIG_API
-extern void (*push_packet)(volatile void *, int);
-
 static struct {
        uchar data[PKTSIZE];
        int length;
 } eth_rcv_bufs[PKTBUFSRX];
 
-static unsigned int eth_rcv_current = 0, eth_rcv_last = 0;
+static unsigned int eth_rcv_current, eth_rcv_last;
 #endif
 
 static struct eth_device *eth_devices, *eth_current;
@@ -141,11 +139,10 @@ struct eth_device *eth_get_dev_by_index(int index)
        return target_dev;
 }
 
-int eth_get_dev_index (void)
+int eth_get_dev_index(void)
 {
-       if (!eth_current) {
+       if (!eth_current)
                return -1;
-       }
 
        return eth_current->index;
 }
@@ -176,7 +173,7 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
 
        if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
                if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) &&
-                       memcmp(dev->enetaddr, env_enetaddr, 6)) {
+                               memcmp(dev->enetaddr, env_enetaddr, 6)) {
                        printf("\nWarning: %s MAC addresses don't match:\n",
                                dev->name);
                        printf("Address in SROM is         %pM\n",
@@ -189,10 +186,9 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
        }
 
        if (dev->write_hwaddr &&
-               !eth_mac_skip(eth_number) &&
-               is_valid_ether_addr(dev->enetaddr)) {
+                       !eth_mac_skip(eth_number) &&
+                       is_valid_ether_addr(dev->enetaddr))
                ret = dev->write_hwaddr(dev);
-       }
 
        return ret;
 }
@@ -200,7 +196,7 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
 int eth_register(struct eth_device *dev)
 {
        struct eth_device *d;
-       static int index = 0;
+       static int index;
 
        assert(strlen(dev->name) < sizeof(dev->name));
 
@@ -208,7 +204,7 @@ int eth_register(struct eth_device *dev)
                eth_current = eth_devices = dev;
                eth_current_changed();
        } else {
-               for (d=eth_devices; d->next!=eth_devices; d=d->next)
+               for (d = eth_devices; d->next != eth_devices; d = d->next)
                        ;
                d->next = dev;
        }
@@ -249,6 +245,14 @@ int eth_unregister(struct eth_device *dev)
        return 0;
 }
 
+static void eth_env_init(bd_t *bis)
+{
+       const char *s;
+
+       if ((s = getenv("bootfile")) != NULL)
+               copy_filename(BootFile, s, sizeof(BootFile));
+}
+
 int eth_initialize(bd_t *bis)
 {
        int num_devices = 0;
@@ -264,6 +268,8 @@ int eth_initialize(bd_t *bis)
        phy_init();
 #endif
 
+       eth_env_init(bis);
+
        /*
         * If board-specific initialization exists, call it.
         * If not, call a CPU-specific one
@@ -278,36 +284,37 @@ int eth_initialize(bd_t *bis)
                printf("Net Initialization Skipped\n");
 
        if (!eth_devices) {
-               puts ("No ethernet found.\n");
+               puts("No ethernet found.\n");
                bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
        } else {
                struct eth_device *dev = eth_devices;
-               char *ethprime = getenv ("ethprime");
+               char *ethprime = getenv("ethprime");
 
                bootstage_mark(BOOTSTAGE_ID_NET_ETH_INIT);
                do {
                        if (dev->index)
-                               puts (", ");
+                               puts(", ");
 
                        printf("%s", dev->name);
 
-                       if (ethprime && strcmp (dev->name, ethprime) == 0) {
+                       if (ethprime && strcmp(dev->name, ethprime) == 0) {
                                eth_current = dev;
-                               puts (" [PRIME]");
+                               puts(" [PRIME]");
                        }
 
                        if (strchr(dev->name, ' '))
-                               puts("\nWarning: eth device name has a space!\n");
+                               puts("\nWarning: eth device name has a space!"
+                                       "\n");
 
                        if (eth_write_hwaddr(dev, "eth", dev->index))
                                puts("\nWarning: failed to set MAC address\n");
 
                        dev = dev->next;
                        num_devices++;
-               } while(dev != eth_devices);
+               } while (dev != eth_devices);
 
                eth_current_changed();
-               putc ('\n');
+               putc('\n');
        }
 
        return num_devices;
@@ -318,9 +325,9 @@ int eth_initialize(bd_t *bis)
  * mcast_addr: multicast ipaddr from which multicast Mac is made
  * join: 1=join, 0=leave.
  */
-int eth_mcast_join( IPaddr_t mcast_ip, u8 join)
+int eth_mcast_join(IPaddr_t mcast_ip, u8 join)
 {
- u8 mcast_mac[6];
      u8 mcast_mac[6];
        if (!eth_current || !eth_current->mcast)
                return -1;
        mcast_mac[5] = htonl(mcast_ip) & 0xff;
@@ -337,7 +344,7 @@ int eth_mcast_join( IPaddr_t mcast_ip, u8 join)
  * some other adapter -- hash tables
  */
 #define CRCPOLY_LE 0xedb88320
-u32 ether_crc (size_t len, unsigned char const *p)
+u32 ether_crc(size_t len, unsigned char const *p)
 {
        int i;
        u32 crc;
@@ -364,7 +371,7 @@ int eth_init(bd_t *bis)
        struct eth_device *old_current, *dev;
 
        if (!eth_current) {
-               puts ("No ethernet found.\n");
+               puts("No ethernet found.\n");
                return -1;
        }
 
@@ -384,7 +391,7 @@ int eth_init(bd_t *bis)
        do {
                debug("Trying %s\n", eth_current->name);
 
-               if (eth_current->init(eth_current,bis) >= 0) {
+               if (eth_current->init(eth_current, bis) >= 0) {
                        eth_current->state = ETH_STATE_ACTIVE;
 
                        return 0;
@@ -407,7 +414,7 @@ void eth_halt(void)
        eth_current->state = ETH_STATE_PASSIVE;
 }
 
-int eth_send(volatile void *packet, int length)
+int eth_send(void *packet, int length)
 {
        if (!eth_current)
                return -1;
@@ -424,9 +431,9 @@ int eth_rx(void)
 }
 
 #ifdef CONFIG_API
-static void eth_save_packet(volatile void *packet, int length)
+static void eth_save_packet(void *packet, int length)
 {
-       volatile char *p = packet;
+       char *p = packet;
        int i;
 
        if ((eth_rcv_last+1) % PKTBUFSRX == eth_rcv_current)
@@ -442,9 +449,9 @@ static void eth_save_packet(volatile void *packet, int length)
        eth_rcv_last = (eth_rcv_last + 1) % PKTBUFSRX;
 }
 
-int eth_receive(volatile void *packet, int length)
+int eth_receive(void *packet, int length)
 {
-       volatile char *p = packet;
+       char *p = packet;
        void *pp = push_packet;
        int i;
 
@@ -472,38 +479,36 @@ int eth_receive(volatile void *packet, int length)
 
 void eth_try_another(int first_restart)
 {
-       static struct eth_device *first_failed = NULL;
+       static struct eth_device *first_failed;
        char *ethrotate;
 
        /*
         * Do not rotate between network interfaces when
         * 'ethrotate' variable is set to 'no'.
         */
-       if (((ethrotate = getenv ("ethrotate")) != NULL) &&
-           (strcmp(ethrotate, "no") == 0))
+       ethrotate = getenv("ethrotate");
+       if ((ethrotate != NULL) && (strcmp(ethrotate, "no") == 0))
                return;
 
        if (!eth_current)
                return;
 
-       if (first_restart) {
+       if (first_restart)
                first_failed = eth_current;
-       }
 
        eth_current = eth_current->next;
 
        eth_current_changed();
 
-       if (first_failed == eth_current) {
+       if (first_failed == eth_current)
                NetRestartWrap = 1;
-       }
 }
 
 void eth_set_current(void)
 {
-       static char *act = NULL;
-       static int  env_changed_id = 0;
-       struct eth_deviceold_current;
+       static char *act;
+       static int  env_changed_id;
+       struct eth_device *old_current;
        int     env_id;
 
        if (!eth_current)       /* XXX no current */
@@ -526,7 +531,7 @@ void eth_set_current(void)
        eth_current_changed();
 }
 
-char *eth_get_name (void)
+char *eth_get_name(void)
 {
-       return (eth_current ? eth_current->name : "unknown");
+       return eth_current ? eth_current->name : "unknown";
 }
index c5acf8ff6e1cbf2612378a1ccdad03a0d31907a3..e9536b36ef43929229ad739dddc90261392f8023 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -77,6 +77,7 @@
 #include <common.h>
 #include <watchdog.h>
 #include <command.h>
+#include <linux/compiler.h>
 #include <net.h>
 #include "bootp.h"
 #include "tftp.h"
@@ -152,7 +153,7 @@ IPaddr_t    NetOurIP;
 /* Server IP addr (0 = unknown) */
 IPaddr_t       NetServerIP;
 /* Current receive packet */
-volatile uchar *NetRxPacket;
+uchar *NetRxPacket;
 /* Current rx packet length */
 int            NetRxPacketLen;
 /* IP packet ID */
@@ -161,7 +162,7 @@ unsigned    NetIPID;
 uchar          NetBcastAddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 uchar          NetEtherNullAddr[6];
 #ifdef CONFIG_API
-void           (*push_packet)(volatile void *, int len) = 0;
+void           (*push_packet)(void *, int len) = 0;
 #endif
 #if defined(CONFIG_CMD_CDP)
 /* Ethernet bcast address */
@@ -203,15 +204,10 @@ IPaddr_t  NetNtpServerIP;
 int            NetTimeOffset;
 #endif
 
-#ifdef CONFIG_NETCONSOLE
-void NcStart(void);
-int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len);
-#endif
-
-volatile uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
+uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
 
 /* Receive packet */
-volatile uchar *NetRxPackets[PKTBUFSRX];
+uchar *NetRxPackets[PKTBUFSRX];
 
 /* Current RX packet handler */
 static rxhand_f *packetHandler;
@@ -225,7 +221,7 @@ static ulong        timeStart;
 /* Current timeout value */
 static ulong   timeDelta;
 /* THE transmit packet */
-volatile uchar *NetTxPacket;
+uchar *NetTxPacket;
 
 static int net_check_prereq(enum proto_t protocol);
 
@@ -246,7 +242,7 @@ int         NetArpWaitTry;
 
 void ArpRequest(void)
 {
-       volatile uchar *pkt;
+       uchar *pkt;
        ARP_t *arp;
 
        debug("ARP broadcast %d\n", NetArpWaitTry);
@@ -342,13 +338,11 @@ void net_auto_load(void)
 static void NetInitLoop(enum proto_t protocol)
 {
        static int env_changed_id;
-       bd_t *bd = gd->bd;
        int env_id = get_env_id();
 
        /* update only when the environment has changed */
        if (env_changed_id != env_id) {
                NetOurIP = getenv_IPaddr("ipaddr");
-               NetCopyIP(&bd->bi_ip_addr, &NetOurIP);
                NetOurGatewayIP = getenv_IPaddr("gatewayip");
                NetOurSubnetMask = getenv_IPaddr("netmask");
                NetServerIP = getenv_IPaddr("serverip");
@@ -527,10 +521,7 @@ restart:
        for (;;) {
                WATCHDOG_RESET();
 #ifdef CONFIG_SHOW_ACTIVITY
-               {
-                       extern void show_activity(int arg);
-                       show_activity(1);
-               }
+               show_activity(1);
 #endif
                /*
                 *      Check the ethernet for a new packet.  The ethernet
@@ -705,7 +696,7 @@ NetSetTimeout(ulong iv, thand_f *f)
 
 
 void
-NetSendPacket(volatile uchar *pkt, int len)
+NetSendPacket(uchar *pkt, int len)
 {
        (void) eth_send(pkt, len);
 }
@@ -768,8 +759,8 @@ static ushort PingSeqNo;
 int PingSend(void)
 {
        static uchar mac[6];
-       volatile IP_t *ip;
-       volatile ushort *s;
+       IP_t *ip;
+       ushort *s;
        uchar *pkt;
 
        /* XXX always send arp request */
@@ -784,7 +775,7 @@ int PingSend(void)
        pkt = NetArpWaitTxPacket;
        pkt += NetSetEther(pkt, mac, PROT_IP);
 
-       ip = (volatile IP_t *)pkt;
+       ip = (IP_t *)pkt;
 
        /*
         * Construct an IP and ICMP header.
@@ -936,9 +927,9 @@ static ushort CDP_compute_csum(const uchar *buff, ushort len)
 
 int CDPSendTrigger(void)
 {
-       volatile uchar *pkt;
-       volatile ushort *s;
-       volatile ushort *cp;
+       uchar *pkt;
+       ushort *s;
+       ushort *cp;
        Ethernet_t *et;
        int len;
        ushort chksum;
@@ -965,7 +956,7 @@ int CDPSendTrigger(void)
        /* CDP header */
        *pkt++ = 0x02;                          /* CDP version 2 */
        *pkt++ = 180;                           /* TTL */
-       s = (volatile ushort *)pkt;
+       s = (ushort *)pkt;
        cp = s;
        /* checksum (0 for later calculation) */
        *s++ = htons(0);
@@ -1103,8 +1094,8 @@ CDPHandler(const uchar *pkt, unsigned len)
         * output a warning
         */
        if (pkt[0] != 0x02)
-               printf("** WARNING: CDP packet received with a protocol version %d > 2\n",
-                               pkt[0] & 0xff);
+               printf("**WARNING: CDP packet received with a protocol version "
+                               "%d > 2\n", pkt[0] & 0xff);
 
        if (CDP_compute_csum(pkt, len) != 0)
                return;
@@ -1239,7 +1230,7 @@ struct hole {
 
 static IP_t *__NetDefragment(IP_t *ip, int *lenp)
 {
-       static uchar pkt_buff[IP_PKTSIZE] __attribute__((aligned(PKTALIGN)));
+       static uchar pkt_buff[IP_PKTSIZE] __aligned(PKTALIGN);
        static u16 first_hole, total_len;
        struct hole *payload, *thisfrag, *h, *newh;
        IP_t *localip = (IP_t *)pkt_buff;
@@ -1439,7 +1430,7 @@ static void receive_icmp(IP_t *ip, int len, IPaddr_t src_ip, Ethernet_t *et)
 }
 
 void
-NetReceive(volatile uchar *inpkt, int len)
+NetReceive(uchar *inpkt, int len)
 {
        Ethernet_t *et;
        IP_t    *ip;
@@ -1611,6 +1602,7 @@ NetReceive(volatile uchar *inpkt, int len)
                        /* matched waiting packet's address */
                        if (tmp == NetArpWaitReplyIP) {
                                debug("Got it\n");
+
                                /* save address for later use */
                                memcpy(NetArpWaitPacketMAC,
                                       &arp->ar_data[0], 6);
@@ -1619,7 +1611,8 @@ NetReceive(volatile uchar *inpkt, int len)
                                (*packetHandler)(0, 0, 0, 0, 0);
 #endif
                                /* modify header, and transmit it */
-                               memcpy(((Ethernet_t *)NetArpWaitTxPacket)->et_dest, NetArpWaitPacketMAC, 6);
+                               memcpy(((Ethernet_t *)NetArpWaitTxPacket)->
+                                       et_dest, NetArpWaitPacketMAC, 6);
                                (void) eth_send(NetArpWaitTxPacket,
                                                NetArpWaitTxPacketSize);
 
@@ -1856,7 +1849,6 @@ common:
        case CDP:
        case DHCP:
                if (memcmp(NetOurEther, "\0\0\0\0\0\0", 6) == 0) {
-                       extern int eth_get_dev_index(void);
                        int num = eth_get_dev_index();
 
                        switch (num) {
@@ -1918,7 +1910,7 @@ NetEthHdrSize(void)
 }
 
 int
-NetSetEther(volatile uchar *xet, uchar * addr, uint prot)
+NetSetEther(uchar *xet, uchar * addr, uint prot)
 {
        Ethernet_t *et = (Ethernet_t *)xet;
        ushort myvlanid;
@@ -1943,7 +1935,7 @@ NetSetEther(volatile uchar *xet, uchar * addr, uint prot)
 }
 
 void
-NetSetIP(volatile uchar *xip, IPaddr_t dest, int dport, int sport, int len)
+NetSetIP(uchar *xip, IPaddr_t dest, int dport, int sport, int len)
 {
        IP_t *ip = (IP_t *)xip;
 
index b5b482c3f3cefce41f22e8e596194f4e21b469a3..54f56c4611cde41091465cc8fa37401912aa05b5 100644 (file)
--- a/net/nfs.c
+++ b/net/nfs.c
@@ -33,8 +33,8 @@
 #define NFS_RETRY_COUNT 30
 #define NFS_TIMEOUT 2000UL
 
-static int fs_mounted = 0;
-static unsigned long rpc_id = 0;
+static int fs_mounted;
+static unsigned long rpc_id;
 static int nfs_offset = -1;
 static int nfs_len;
 
@@ -61,14 +61,14 @@ static char *nfs_filename;
 static char *nfs_path;
 static char nfs_path_buff[2048];
 
-static __inline__ int
-store_block (uchar * src, unsigned offset, unsigned len)
+static inline int
+store_block(uchar *src, unsigned offset, unsigned len)
 {
        ulong newsize = offset + len;
 #ifdef CONFIG_SYS_DIRECT_FLASH_NFS
        int i, rc = 0;
 
-       for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; i++) {
+       for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
                /* start address in flash? */
                if (load_addr + offset >= flash_info[i].start[0]) {
                        rc = 1;
@@ -77,15 +77,15 @@ store_block (uchar * src, unsigned offset, unsigned len)
        }
 
        if (rc) { /* Flash is destination for this packet */
-               rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len);
+               rc = flash_write((uchar *)src, (ulong)(load_addr+offset), len);
                if (rc) {
-                       flash_perror (rc);
+                       flash_perror(rc);
                        return -1;
                }
        } else
 #endif /* CONFIG_SYS_DIRECT_FLASH_NFS */
        {
-               (void)memcpy ((void *)(load_addr + offset), src, len);
+               (void)memcpy((void *)(load_addr + offset), src, len);
        }
 
        if (NetBootFileXferSize < (offset+len))
@@ -94,7 +94,7 @@ store_block (uchar * src, unsigned offset, unsigned len)
 }
 
 static char*
-basename (char *path)
+basename(char *path)
 {
        char *fname;
 
@@ -110,11 +110,11 @@ basename (char *path)
 }
 
 static char*
-dirname (char *path)
+dirname(char *path)
 {
        char *fname;
 
-       fname = basename (path);
+       fname = basename(path);
        --fname;
        *fname = '\0';
        return path;
@@ -123,14 +123,14 @@ dirname (char *path)
 /**************************************************************************
 RPC_ADD_CREDENTIALS - Add RPC authentication/verifier entries
 **************************************************************************/
-static long *rpc_add_credentials (long *p)
+static long *rpc_add_credentials(long *p)
 {
        int hl;
        int hostnamelen;
        char hostname[256];
 
-       strcpy (hostname, "");
-       hostnamelen=strlen (hostname);
+       strcpy(hostname, "");
+       hostnamelen = strlen(hostname);
 
        /* Here's the executive summary on authentication requirements of the
         * various NFS server implementations:  Linux accepts both AUTH_NONE
@@ -148,10 +148,9 @@ static long *rpc_add_credentials (long *p)
        *p++ = htonl(hl+20);            /* auth length */
        *p++ = htonl(0);                /* stamp */
        *p++ = htonl(hostnamelen);      /* hostname string */
-       if (hostnamelen & 3) {
+       if (hostnamelen & 3)
                *(p + hostnamelen / 4) = 0; /* add zero padding */
-       }
-       memcpy (p, hostname, hostnamelen);
+       memcpy(p, hostname, hostnamelen);
        p += hl / 4;
        *p++ = 0;                       /* uid */
        *p++ = 0;                       /* gid */
@@ -168,7 +167,7 @@ static long *rpc_add_credentials (long *p)
 RPC_LOOKUP - Lookup RPC Port numbers
 **************************************************************************/
 static void
-rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
+rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
 {
        struct rpc_t pkt;
        unsigned long id;
@@ -186,11 +185,12 @@ rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
        p = (uint32_t *)&(pkt.u.call.data);
 
        if (datalen)
-               memcpy ((char *)p, (char *)data, datalen*sizeof(uint32_t));
+               memcpy((char *)p, (char *)data, datalen*sizeof(uint32_t));
 
        pktlen = (char *)p + datalen*sizeof(uint32_t) - (char *)&pkt;
 
-       memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen);
+       memcpy((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE,
+               (char *)&pkt, pktlen);
 
        if (rpc_prog == PROG_PORTMAP)
                sport = SUNRPC_PORT;
@@ -199,14 +199,15 @@ rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
        else
                sport = NfsSrvNfsPort;
 
-       NetSendUDPPacket (NetServerEther, NfsServerIP, sport, NfsOurPort, pktlen);
+       NetSendUDPPacket(NetServerEther, NfsServerIP, sport, NfsOurPort,
+               pktlen);
 }
 
 /**************************************************************************
 RPC_LOOKUP - Lookup RPC Port numbers
 **************************************************************************/
 static void
-rpc_lookup_req (int prog, int ver)
+rpc_lookup_req(int prog, int ver)
 {
        uint32_t data[16];
 
@@ -217,56 +218,56 @@ rpc_lookup_req (int prog, int ver)
        data[6] = htonl(17);    /* IP_UDP */
        data[7] = 0;
 
-       rpc_req (PROG_PORTMAP, PORTMAP_GETPORT, data, 8);
+       rpc_req(PROG_PORTMAP, PORTMAP_GETPORT, data, 8);
 }
 
 /**************************************************************************
 NFS_MOUNT - Mount an NFS Filesystem
 **************************************************************************/
 static void
-nfs_mount_req (char *path)
+nfs_mount_req(char *path)
 {
        uint32_t data[1024];
        uint32_t *p;
        int len;
        int pathlen;
 
-       pathlen = strlen (path);
+       pathlen = strlen(path);
 
        p = &(data[0]);
        p = (uint32_t *)rpc_add_credentials((long *)p);
 
        *p++ = htonl(pathlen);
-       if (pathlen & 3) *(p + pathlen / 4) = 0;
-       memcpy (p, path, pathlen);
+       if (pathlen & 3)
+               *(p + pathlen / 4) = 0;
+       memcpy(p, path, pathlen);
        p += (pathlen + 3) / 4;
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
-       rpc_req (PROG_MOUNT, MOUNT_ADDENTRY, data, len);
+       rpc_req(PROG_MOUNT, MOUNT_ADDENTRY, data, len);
 }
 
 /**************************************************************************
 NFS_UMOUNTALL - Unmount all our NFS Filesystems on the Server
 **************************************************************************/
 static void
-nfs_umountall_req (void)
+nfs_umountall_req(void)
 {
        uint32_t data[1024];
        uint32_t *p;
        int len;
 
-       if ((NfsSrvMountPort == -1) || (!fs_mounted)) {
+       if ((NfsSrvMountPort == -1) || (!fs_mounted))
                /* Nothing mounted, nothing to umount */
                return;
-       }
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials ((long *)p);
+       p = (uint32_t *)rpc_add_credentials((long *)p);
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
-       rpc_req (PROG_MOUNT, MOUNT_UMOUNTALL, data, len);
+       rpc_req(PROG_MOUNT, MOUNT_UMOUNTALL, data, len);
 }
 
 /***************************************************************************
@@ -277,65 +278,66 @@ nfs_umountall_req (void)
  * so that inside the nfs() function a recursion can be done.
  **************************************************************************/
 static void
-nfs_readlink_req (void)
+nfs_readlink_req(void)
 {
        uint32_t data[1024];
        uint32_t *p;
        int len;
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials ((long *)p);
+       p = (uint32_t *)rpc_add_credentials((long *)p);
 
-       memcpy (p, filefh, NFS_FHSIZE);
+       memcpy(p, filefh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
-       rpc_req (PROG_NFS, NFS_READLINK, data, len);
+       rpc_req(PROG_NFS, NFS_READLINK, data, len);
 }
 
 /**************************************************************************
 NFS_LOOKUP - Lookup Pathname
 **************************************************************************/
 static void
-nfs_lookup_req (char *fname)
+nfs_lookup_req(char *fname)
 {
        uint32_t data[1024];
        uint32_t *p;
        int len;
        int fnamelen;
 
-       fnamelen = strlen (fname);
+       fnamelen = strlen(fname);
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials ((long *)p);
+       p = (uint32_t *)rpc_add_credentials((long *)p);
 
-       memcpy (p, dirfh, NFS_FHSIZE);
+       memcpy(p, dirfh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
        *p++ = htonl(fnamelen);
-       if (fnamelen & 3) *(p + fnamelen / 4) = 0;
-       memcpy (p, fname, fnamelen);
+       if (fnamelen & 3)
+               *(p + fnamelen / 4) = 0;
+       memcpy(p, fname, fnamelen);
        p += (fnamelen + 3) / 4;
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
-       rpc_req (PROG_NFS, NFS_LOOKUP, data, len);
+       rpc_req(PROG_NFS, NFS_LOOKUP, data, len);
 }
 
 /**************************************************************************
 NFS_READ - Read File on NFS Server
 **************************************************************************/
 static void
-nfs_read_req (int offset, int readlen)
+nfs_read_req(int offset, int readlen)
 {
        uint32_t data[1024];
        uint32_t *p;
        int len;
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials ((long *)p);
+       p = (uint32_t *)rpc_add_credentials((long *)p);
 
-       memcpy (p, filefh, NFS_FHSIZE);
+       memcpy(p, filefh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
        *p++ = htonl(offset);
        *p++ = htonl(readlen);
@@ -343,7 +345,7 @@ nfs_read_req (int offset, int readlen)
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
-       rpc_req (PROG_NFS, NFS_READ, data, len);
+       rpc_req(PROG_NFS, NFS_READ, data, len);
 }
 
 /**************************************************************************
@@ -351,31 +353,31 @@ RPC request dispatcher
 **************************************************************************/
 
 static void
-NfsSend (void)
+NfsSend(void)
 {
        debug("%s\n", __func__);
 
        switch (NfsState) {
        case STATE_PRCLOOKUP_PROG_MOUNT_REQ:
-               rpc_lookup_req (PROG_MOUNT, 1);
+               rpc_lookup_req(PROG_MOUNT, 1);
                break;
        case STATE_PRCLOOKUP_PROG_NFS_REQ:
-               rpc_lookup_req (PROG_NFS, 2);
+               rpc_lookup_req(PROG_NFS, 2);
                break;
        case STATE_MOUNT_REQ:
-               nfs_mount_req (nfs_path);
+               nfs_mount_req(nfs_path);
                break;
        case STATE_UMOUNT_REQ:
-               nfs_umountall_req ();
+               nfs_umountall_req();
                break;
        case STATE_LOOKUP_REQ:
-               nfs_lookup_req (nfs_filename);
+               nfs_lookup_req(nfs_filename);
                break;
        case STATE_READ_REQ:
-               nfs_read_req (nfs_offset, nfs_len);
+               nfs_read_req(nfs_offset, nfs_len);
                break;
        case STATE_READLINK_REQ:
-               nfs_readlink_req ();
+               nfs_readlink_req();
                break;
        }
 }
@@ -385,11 +387,11 @@ Handlers for the reply from server
 **************************************************************************/
 
 static int
-rpc_lookup_reply (int prog, uchar *pkt, unsigned len)
+rpc_lookup_reply(int prog, uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
 
-       memcpy ((unsigned char *)&rpc_pkt, pkt, len);
+       memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
        debug("%s\n", __func__);
 
@@ -398,9 +400,8 @@ rpc_lookup_reply (int prog, uchar *pkt, unsigned len)
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
-           rpc_pkt.u.reply.astatus) {
+           rpc_pkt.u.reply.astatus)
                return -1;
-       }
 
        switch (prog) {
        case PROG_MOUNT:
@@ -415,13 +416,13 @@ rpc_lookup_reply (int prog, uchar *pkt, unsigned len)
 }
 
 static int
-nfs_mount_reply (uchar *pkt, unsigned len)
+nfs_mount_reply(uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
 
        debug("%s\n", __func__);
 
-       memcpy ((unsigned char *)&rpc_pkt, pkt, len);
+       memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
        if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
                return -1;
@@ -429,48 +430,46 @@ nfs_mount_reply (uchar *pkt, unsigned len)
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
            rpc_pkt.u.reply.astatus  ||
-           rpc_pkt.u.reply.data[0]) {
+           rpc_pkt.u.reply.data[0])
                return -1;
-       }
 
        fs_mounted = 1;
-       memcpy (dirfh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
+       memcpy(dirfh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
 
        return 0;
 }
 
 static int
-nfs_umountall_reply (uchar *pkt, unsigned len)
+nfs_umountall_reply(uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
 
        debug("%s\n", __func__);
 
-       memcpy ((unsigned char *)&rpc_pkt, pkt, len);
+       memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
        if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
                return -1;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
-           rpc_pkt.u.reply.astatus) {
+           rpc_pkt.u.reply.astatus)
                return -1;
-       }
 
        fs_mounted = 0;
-       memset (dirfh, 0, sizeof(dirfh));
+       memset(dirfh, 0, sizeof(dirfh));
 
        return 0;
 }
 
 static int
-nfs_lookup_reply (uchar *pkt, unsigned len)
+nfs_lookup_reply(uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
 
        debug("%s\n", __func__);
 
-       memcpy ((unsigned char *)&rpc_pkt, pkt, len);
+       memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
        if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
                return -1;
@@ -478,24 +477,23 @@ nfs_lookup_reply (uchar *pkt, unsigned len)
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
            rpc_pkt.u.reply.astatus  ||
-           rpc_pkt.u.reply.data[0]) {
+           rpc_pkt.u.reply.data[0])
                return -1;
-       }
 
-       memcpy (filefh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
+       memcpy(filefh, rpc_pkt.u.reply.data + 1, NFS_FHSIZE);
 
        return 0;
 }
 
 static int
-nfs_readlink_reply (uchar *pkt, unsigned len)
+nfs_readlink_reply(uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
        int rlen;
 
        debug("%s\n", __func__);
 
-       memcpy ((unsigned char *)&rpc_pkt, pkt, len);
+       memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
        if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
                return -1;
@@ -503,34 +501,34 @@ nfs_readlink_reply (uchar *pkt, unsigned len)
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
            rpc_pkt.u.reply.astatus  ||
-           rpc_pkt.u.reply.data[0]) {
+           rpc_pkt.u.reply.data[0])
                return -1;
-       }
 
-       rlen = ntohl (rpc_pkt.u.reply.data[1]); /* new path length */
+       rlen = ntohl(rpc_pkt.u.reply.data[1]); /* new path length */
 
        if (*((char *)&(rpc_pkt.u.reply.data[2])) != '/') {
                int pathlen;
-               strcat (nfs_path, "/");
+               strcat(nfs_path, "/");
                pathlen = strlen(nfs_path);
-               memcpy (nfs_path+pathlen, (uchar *)&(rpc_pkt.u.reply.data[2]), rlen);
+               memcpy(nfs_path + pathlen, (uchar *)&(rpc_pkt.u.reply.data[2]),
+                       rlen);
                nfs_path[pathlen + rlen] = 0;
        } else {
-               memcpy (nfs_path, (uchar *)&(rpc_pkt.u.reply.data[2]), rlen);
+               memcpy(nfs_path, (uchar *)&(rpc_pkt.u.reply.data[2]), rlen);
                nfs_path[rlen] = 0;
        }
        return 0;
 }
 
 static int
-nfs_read_reply (uchar *pkt, unsigned len)
+nfs_read_reply(uchar *pkt, unsigned len)
 {
        struct rpc_t rpc_pkt;
        int rlen;
 
        debug("%s\n", __func__);
 
-       memcpy ((uchar *)&rpc_pkt, pkt, sizeof(rpc_pkt.u.reply));
+       memcpy((uchar *)&rpc_pkt, pkt, sizeof(rpc_pkt.u.reply));
 
        if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
                return -1;
@@ -539,24 +537,22 @@ nfs_read_reply (uchar *pkt, unsigned len)
            rpc_pkt.u.reply.verifier ||
            rpc_pkt.u.reply.astatus  ||
            rpc_pkt.u.reply.data[0]) {
-               if (rpc_pkt.u.reply.rstatus) {
+               if (rpc_pkt.u.reply.rstatus)
                        return -9999;
-               }
-               if (rpc_pkt.u.reply.astatus) {
+               if (rpc_pkt.u.reply.astatus)
                        return -9999;
-               }
-               return -ntohl(rpc_pkt.u.reply.data[0]);;
+               return -ntohl(rpc_pkt.u.reply.data[0]);
        }
 
-       if ((nfs_offset!=0) && !((nfs_offset) % (NFS_READ_SIZE/2*10*HASHES_PER_LINE))) {
-               puts ("\n\t ");
-       }
-       if (!(nfs_offset % ((NFS_READ_SIZE/2)*10))) {
-               putc ('#');
-       }
+       if ((nfs_offset != 0) && !((nfs_offset) %
+                       (NFS_READ_SIZE / 2 * 10 * HASHES_PER_LINE)))
+               puts("\n\t ");
+       if (!(nfs_offset % ((NFS_READ_SIZE / 2) * 10)))
+               putc('#');
 
        rlen = ntohl(rpc_pkt.u.reply.data[18]);
-       if ( store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen) )
+       if (store_block((uchar *)pkt + sizeof(rpc_pkt.u.reply),
+                       nfs_offset, rlen))
                return -9999;
 
        return rlen;
@@ -567,15 +563,15 @@ Interfaces of U-BOOT
 **************************************************************************/
 
 static void
-NfsTimeout (void)
+NfsTimeout(void)
 {
-       if ( ++NfsTimeoutCount > NFS_RETRY_COUNT ) {
-               puts ("\nRetry count exceeded; starting again\n");
-               NetStartAgain ();
+       if (++NfsTimeoutCount > NFS_RETRY_COUNT) {
+               puts("\nRetry count exceeded; starting again\n");
+               NetStartAgain();
        } else {
                puts("T ");
-               NetSetTimeout (NFS_TIMEOUT, NfsTimeout);
-               NfsSend ();
+               NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
+               NfsSend();
        }
 }
 
@@ -586,86 +582,87 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 
        debug("%s\n", __func__);
 
-       if (dest != NfsOurPort) return;
+       if (dest != NfsOurPort)
+               return;
 
        switch (NfsState) {
        case STATE_PRCLOOKUP_PROG_MOUNT_REQ:
-               rpc_lookup_reply (PROG_MOUNT, pkt, len);
+               rpc_lookup_reply(PROG_MOUNT, pkt, len);
                NfsState = STATE_PRCLOOKUP_PROG_NFS_REQ;
-               NfsSend ();
+               NfsSend();
                break;
 
        case STATE_PRCLOOKUP_PROG_NFS_REQ:
-               rpc_lookup_reply (PROG_NFS, pkt, len);
+               rpc_lookup_reply(PROG_NFS, pkt, len);
                NfsState = STATE_MOUNT_REQ;
-               NfsSend ();
+               NfsSend();
                break;
 
        case STATE_MOUNT_REQ:
                if (nfs_mount_reply(pkt, len)) {
-                       puts ("*** ERROR: Cannot mount\n");
+                       puts("*** ERROR: Cannot mount\n");
                        /* just to be sure... */
                        NfsState = STATE_UMOUNT_REQ;
-                       NfsSend ();
+                       NfsSend();
                } else {
                        NfsState = STATE_LOOKUP_REQ;
-                       NfsSend ();
+                       NfsSend();
                }
                break;
 
        case STATE_UMOUNT_REQ:
                if (nfs_umountall_reply(pkt, len)) {
-                       puts ("*** ERROR: Cannot umount\n");
+                       puts("*** ERROR: Cannot umount\n");
                        NetState = NETLOOP_FAIL;
                } else {
-                       puts ("\ndone\n");
+                       puts("\ndone\n");
                        NetState = NfsDownloadState;
                }
                break;
 
        case STATE_LOOKUP_REQ:
                if (nfs_lookup_reply(pkt, len)) {
-                       puts ("*** ERROR: File lookup fail\n");
+                       puts("*** ERROR: File lookup fail\n");
                        NfsState = STATE_UMOUNT_REQ;
-                       NfsSend ();
+                       NfsSend();
                } else {
                        NfsState = STATE_READ_REQ;
                        nfs_offset = 0;
                        nfs_len = NFS_READ_SIZE;
-                       NfsSend ();
+                       NfsSend();
                }
                break;
 
        case STATE_READLINK_REQ:
                if (nfs_readlink_reply(pkt, len)) {
-                       puts ("*** ERROR: Symlink fail\n");
+                       puts("*** ERROR: Symlink fail\n");
                        NfsState = STATE_UMOUNT_REQ;
-                       NfsSend ();
+                       NfsSend();
                } else {
                        debug("Symlink --> %s\n", nfs_path);
-                       nfs_filename = basename (nfs_path);
-                       nfs_path     = dirname (nfs_path);
+                       nfs_filename = basename(nfs_path);
+                       nfs_path     = dirname(nfs_path);
 
                        NfsState = STATE_MOUNT_REQ;
-                       NfsSend ();
+                       NfsSend();
                }
                break;
 
        case STATE_READ_REQ:
-               rlen = nfs_read_reply (pkt, len);
-               NetSetTimeout (NFS_TIMEOUT, NfsTimeout);
+               rlen = nfs_read_reply(pkt, len);
+               NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
                if (rlen > 0) {
                        nfs_offset += rlen;
-                       NfsSend ();
-               }
-               else if ((rlen == -NFSERR_ISDIR)||(rlen == -NFSERR_INVAL)) {
+                       NfsSend();
+               } else if ((rlen == -NFSERR_ISDIR) || (rlen == -NFSERR_INVAL)) {
                        /* symbolic link */
                        NfsState = STATE_READLINK_REQ;
-                       NfsSend ();
+                       NfsSend();
                } else {
-                       if ( ! rlen ) NfsDownloadState = NETLOOP_SUCCESS;
+                       if (!rlen)
+                               NfsDownloadState = NETLOOP_SUCCESS;
                        NfsState = STATE_UMOUNT_REQ;
-                       NfsSend ();
+                       NfsSend();
                }
                break;
        }
@@ -673,7 +670,7 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 
 
 void
-NfsStart (void)
+NfsStart(void)
 {
        debug("%s\n", __func__);
        NfsDownloadState = NETLOOP_FAIL;
@@ -683,7 +680,7 @@ NfsStart (void)
 
        if (nfs_path == NULL) {
                NetState = NETLOOP_FAIL;
-               puts ("*** ERROR: Fail allocate memory\n");
+               puts("*** ERROR: Fail allocate memory\n");
                return;
        }
 
@@ -692,29 +689,29 @@ NfsStart (void)
                        NetOurIP & 0xFF,
                        (NetOurIP >>  8) & 0xFF,
                        (NetOurIP >> 16) & 0xFF,
-                       (NetOurIP >> 24) & 0xFF );
-               strcpy (nfs_path, default_filename);
+                       (NetOurIP >> 24) & 0xFF);
+               strcpy(nfs_path, default_filename);
 
-               printf ("*** Warning: no boot file name; using '%s'\n",
+               printf("*** Warning: no boot file name; using '%s'\n",
                        nfs_path);
        } else {
-               char *p=BootFile;
+               char *p = BootFile;
 
-               p = strchr (p, ':');
+               p = strchr(p, ':');
 
                if (p != NULL) {
-                       NfsServerIP = string_to_ip (BootFile);
+                       NfsServerIP = string_to_ip(BootFile);
                        ++p;
-                       strcpy (nfs_path, p);
+                       strcpy(nfs_path, p);
                } else {
-                       strcpy (nfs_path, BootFile);
+                       strcpy(nfs_path, BootFile);
                }
        }
 
-       nfs_filename = basename (nfs_path);
-       nfs_path     = dirname (nfs_path);
+       nfs_filename = basename(nfs_path);
+       nfs_path     = dirname(nfs_path);
 
-       printf ("Using %s device\n", eth_get_name());
+       printf("Using %s device\n", eth_get_name());
 
        printf("File transfer via NFS from server %pI4"
                "; our IP address is %pI4", &NfsServerIP, &NetOurIP);
@@ -725,19 +722,20 @@ NfsStart (void)
                IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
 
                if (OurNet != ServerNet)
-                       printf("; sending through gateway %pI4", &NetOurGatewayIP);
+                       printf("; sending through gateway %pI4",
+                               &NetOurGatewayIP);
        }
-       printf ("\nFilename '%s/%s'.", nfs_path, nfs_filename);
+       printf("\nFilename '%s/%s'.", nfs_path, nfs_filename);
 
        if (NetBootFileSize) {
-               printf (" Size is 0x%x Bytes = ", NetBootFileSize<<9);
-               print_size (NetBootFileSize<<9, "");
+               printf(" Size is 0x%x Bytes = ", NetBootFileSize<<9);
+               print_size(NetBootFileSize<<9, "");
        }
-       printf ("\nLoad address: 0x%lx\n"
+       printf("\nLoad address: 0x%lx\n"
                "Loading: *\b", load_addr);
 
-       NetSetTimeout (NFS_TIMEOUT, NfsTimeout);
-       NetSetHandler (NfsHandler);
+       NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
+       NetSetHandler(NfsHandler);
 
        NfsTimeoutCount = 0;
        NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ;
@@ -747,7 +745,7 @@ NfsStart (void)
        NfsOurPort = 1000;
 
        /* zero out server ether in case the server ip has changed */
-       memset (NetServerEther, 0, 6);
+       memset(NetServerEther, 0, 6);
 
-       NfsSend ();
+       NfsSend();
 }
index de8a0c64c07ce0b3fe6fff5ea86559b32e6ef005..a5a1b432e62c7900796c45306a0542e679c7b518 100644 (file)
--- a/net/nfs.h
+++ b/net/nfs.h
@@ -72,7 +72,7 @@ struct rpc_t {
                } reply;
        } u;
 };
-extern void    NfsStart (void);        /* Begin NFS */
+extern void NfsStart(void);    /* Begin NFS */
 
 
 /**********************************************************************/
index 097f970f442770153cc3f36209c5db26f0737380..5a813a290b574be823719f0078550a8bfaee25b8 100644 (file)
@@ -58,21 +58,21 @@ static void
 RarpTimeout(void)
 {
        if (RarpTry >= TIMEOUT_COUNT) {
-               puts ("\nRetry count exceeded; starting again\n");
-               NetStartAgain ();
+               puts("\nRetry count exceeded; starting again\n");
+               NetStartAgain();
        } else {
-               NetSetTimeout (TIMEOUT, RarpTimeout);
-               RarpRequest ();
+               NetSetTimeout(TIMEOUT, RarpTimeout);
+               RarpRequest();
        }
 }
 
 
 void
-RarpRequest (void)
+RarpRequest(void)
 {
        int i;
-       volatile uchar *pkt;
-       ARP_t * rarp;
+       uchar *pkt;
+       ARP_t *rarp;
 
        printf("RARP broadcast %d\n", ++RarpTry);
        pkt = NetTxPacket;
@@ -81,18 +81,18 @@ RarpRequest (void)
 
        rarp = (ARP_t *)pkt;
 
-       rarp->ar_hrd = htons (ARP_ETHER);
-       rarp->ar_pro = htons (PROT_IP);
+       rarp->ar_hrd = htons(ARP_ETHER);
+       rarp->ar_pro = htons(PROT_IP);
        rarp->ar_hln = 6;
        rarp->ar_pln = 4;
-       rarp->ar_op  = htons (RARPOP_REQUEST);
-       memcpy (&rarp->ar_data[0],  NetOurEther, 6);    /* source ET addr */
-       memcpy (&rarp->ar_data[6],  &NetOurIP,   4);    /* source IP addr */
-       memcpy (&rarp->ar_data[10], NetOurEther, 6);    /* dest ET addr = source ET addr ??*/
+       rarp->ar_op  = htons(RARPOP_REQUEST);
+       memcpy(&rarp->ar_data[0],  NetOurEther, 6);     /* source ET addr */
+       memcpy(&rarp->ar_data[6],  &NetOurIP,   4);     /* source IP addr */
+       /* dest ET addr = source ET addr ??*/
+       memcpy(&rarp->ar_data[10], NetOurEther, 6);
        /* dest. IP addr set to broadcast */
-       for (i = 0; i <= 3; i++) {
+       for (i = 0; i <= 3; i++)
                rarp->ar_data[16 + i] = 0xff;
-       }
 
        NetSendPacket(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);
 
index 0c16d466680b8bc0872c8d7b11d081231a2b67ee..4e92d80a651225ca0bf666e3e554e1f11cc61c0a 100644 (file)
@@ -35,9 +35,9 @@
  *     Global functions and variables.
  */
 
-extern int     RarpTry;
+extern int RarpTry;
 
-extern void RarpRequest (void);        /* Send a RARP request */
+extern void RarpRequest(void); /* Send a RARP request */
 
 /**********************************************************************/
 
index 82f2fe6cd1cf45187e529a231f2538f8f2f5be1d..69cddb16b5c053ae278ade14bf412161eb8016ff 100644 (file)
@@ -17,7 +17,7 @@
 static int SntpOurPort;
 
 static void
-SntpSend (void)
+SntpSend(void)
 {
        struct sntp_pkt_t pkt;
        int pktlen = SNTP_PACKET_LEN;
@@ -25,24 +25,26 @@ SntpSend (void)
 
        debug("%s\n", __func__);
 
-       memset (&pkt, 0, sizeof(pkt));
+       memset(&pkt, 0, sizeof(pkt));
 
        pkt.li = NTP_LI_NOLEAP;
        pkt.vn = NTP_VERSION;
        pkt.mode = NTP_MODE_CLIENT;
 
-       memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen);
+       memcpy((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE,
+               (char *)&pkt, pktlen);
 
        SntpOurPort = 10000 + (get_timer(0) % 4096);
        sport = NTP_SERVICE_PORT;
 
-       NetSendUDPPacket (NetServerEther, NetNtpServerIP, sport, SntpOurPort, pktlen);
+       NetSendUDPPacket(NetServerEther, NetNtpServerIP, sport, SntpOurPort,
+               pktlen);
 }
 
 static void
-SntpTimeout (void)
+SntpTimeout(void)
 {
-       puts ("Timeout\n");
+       puts("Timeout\n");
        NetState = NETLOOP_FAIL;
        return;
 }
@@ -57,19 +59,20 @@ SntpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 
        debug("%s\n", __func__);
 
-       if (dest != SntpOurPort) return;
+       if (dest != SntpOurPort)
+               return;
 
        /*
         * As the RTC's used in U-Boot sepport second resolution only
         * we simply ignore the sub-second field.
         */
-       memcpy (&seconds, &rpktp->transmit_timestamp, sizeof(ulong));
+       memcpy(&seconds, &rpktp->transmit_timestamp, sizeof(ulong));
 
        to_tm(ntohl(seconds) - 2208988800UL + NetTimeOffset, &tm);
 #if defined(CONFIG_CMD_DATE)
-       rtc_set (&tm);
+       rtc_set(&tm);
 #endif
-       printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n",
+       printf("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n",
                tm.tm_year, tm.tm_mon, tm.tm_mday,
                tm.tm_hour, tm.tm_min, tm.tm_sec);
 
@@ -77,13 +80,13 @@ SntpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 }
 
 void
-SntpStart (void)
+SntpStart(void)
 {
        debug("%s\n", __func__);
 
-       NetSetTimeout (SNTP_TIMEOUT, SntpTimeout);
+       NetSetTimeout(SNTP_TIMEOUT, SntpTimeout);
        NetSetHandler(SntpHandler);
-       memset (NetServerEther, 0, 6);
+       memset(NetServerEther, 0, sizeof(NetServerEther));
 
-       SntpSend ();
+       SntpSend();
 }
index 8a097bfa3859107dfe0fe30b4838ed4367dbb455..1d0046e94b39a76ff4abe5f1e9c2383227e07678 100644 (file)
@@ -56,6 +56,6 @@ struct sntp_pkt_t {
        unsigned long long transmit_timestamp;
 };
 
-extern void    SntpStart (void);       /* Begin SNTP */
+extern void SntpStart(void);   /* Begin SNTP */
 
 #endif /* __SNTP_H__ */
index 7aa3e23c95d1aba5f79202b7a0f550fd04889754..bc7fe05465cb9b4c3b0a1e8a1d45264862be7fae 100644 (file)
@@ -11,6 +11,9 @@
 #include <net.h>
 #include "tftp.h"
 #include "bootp.h"
+#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP
+#include <flash.h>
+#endif
 
 /* Well known TFTP port # */
 #define WELL_KNOWN_PORT        69
@@ -112,10 +115,6 @@ static char default_filename[DEFAULT_NAME_LEN];
 
 static char tftp_filename[MAX_LEN];
 
-#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP
-extern flash_info_t flash_info[];
-#endif
-
 /* 512 is poor choice for ethernet, MTU is typically 1500.
  * Minus eth.hdrs thats 1468.  Can get 2x better throughput with
  * almost-MTU block sizes.  At least try... fall back to 512 if need be.
@@ -137,7 +136,6 @@ static unsigned *Bitmap;
 static int PrevBitmapHole, Mapsize = MTFTP_BITMAPSIZE;
 static uchar ProhibitMcast, MasterClient;
 static uchar Multicast;
-extern IPaddr_t Mcast_addr;
 static int Mcast_port;
 static ulong TftpEndingBlock; /* can get 'last' block before done..*/
 
@@ -157,7 +155,7 @@ mcast_cleanup(void)
 
 #endif /* CONFIG_MCAST_TFTP */
 
-static __inline__ void
+static inline void
 store_block(unsigned block, uchar *src, unsigned len)
 {
        ulong offset = block * TftpBlkSize + TftpBlockWrapOffset;
@@ -182,8 +180,7 @@ store_block(unsigned block, uchar *src, unsigned len)
                        NetState = NETLOOP_FAIL;
                        return;
                }
-       }
-       else
+       } else
 #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */
        {
                (void)memcpy((void *)(load_addr + offset), src, len);
@@ -310,9 +307,9 @@ static void
 TftpSend(void)
 {
        uchar *pkt;
-       volatile uchar *xp;
-       int             len = 0;
-       volatile ushort *s;
+       uchar *xp;
+       int len = 0;
+       ushort *s;
 
 #ifdef CONFIG_MCAST_TFTP
        /* Multicast TFTP.. non-MasterClients do not ACK data. */
@@ -357,12 +354,14 @@ TftpSend(void)
                                0, TftpBlkSizeOption, 0);
 #ifdef CONFIG_MCAST_TFTP
                /* Check all preconditions before even trying the option */
-               if (!ProhibitMcast
-                && (Bitmap = malloc(Mapsize))
-                && eth_get_dev()->mcast) {
-                       free(Bitmap);
-                       Bitmap = NULL;
-                       pkt += sprintf((char *)pkt, "multicast%c%c", 0, 0);
+               if (!ProhibitMcast) {
+                       Bitmap = malloc(Mapsize);
+                       if (Bitmap && eth_get_dev()->mcast) {
+                               free(Bitmap);
+                               Bitmap = NULL;
+                               pkt += sprintf((char *)pkt, "multicast%c%c",
+                                       0, 0);
+                       }
                }
 #endif /* CONFIG_MCAST_TFTP */
                len = pkt - xp;
@@ -630,8 +629,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                                mcast_cleanup();
                                NetState = NETLOOP_SUCCESS;
                        }
-               }
-               else
+               } else
 #endif
                if (len < TftpBlkSize)
                        tftp_complete();
index c51aa253c4707fdb476442c843a9b85cbef2e461..18e4c9c25d72debace773afa62e873ba372c62fd 100644 (file)
@@ -19,7 +19,7 @@
 void TftpStart(enum proto_t protocol); /* Begin TFTP get/put */
 
 #ifdef CONFIG_CMD_TFTPSRV
-extern void    TftpStartServer(void);  /* Wait for incoming TFTP put */
+extern void TftpStartServer(void);     /* Wait for incoming TFTP put */
 #endif
 
 /**********************************************************************/
diff --git a/tools/gcc-version.sh b/tools/gcc-version.sh
new file mode 100755 (executable)
index 0000000..debecb5
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# gcc-version [-p] gcc-command
+#
+# Prints the gcc version of `gcc-command' in a canonical 4-digit form
+# such as `0295' for gcc-2.95, `0303' for gcc-3.3, etc.
+#
+# With the -p option, prints the patchlevel as well, for example `029503' for
+# gcc-2.95.3, `030301' for gcc-3.3.1, etc.
+#
+
+if [ "$1" = "-p" ] ; then
+       with_patchlevel=1;
+       shift;
+fi
+
+compiler="$*"
+
+if [ ${#compiler} -eq 0 ]; then
+       echo "Error: No compiler specified."
+       printf "Usage:\n\t$0 <gcc-command>\n"
+       exit 1
+fi
+
+MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1)
+MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1)
+if [ "x$with_patchlevel" != "x" ] ; then
+       PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1)
+       printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
+else
+       printf "%02d%02d\\n" $MAJOR $MINOR
+fi