]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'master' of git://git.denx.de/u-boot-spi
authorTom Rini <trini@ti.com>
Thu, 13 Jun 2013 19:18:35 +0000 (15:18 -0400)
committerTom Rini <trini@ti.com>
Thu, 13 Jun 2013 19:18:35 +0000 (15:18 -0400)
725 files changed:
.gitignore
MAINTAINERS
Makefile
README
arch/arm/config.mk
arch/arm/cpu/arm1136/mx35/Makefile
arch/arm/cpu/arm1136/mx35/iomux.c [deleted file]
arch/arm/cpu/arm1136/start.S
arch/arm/cpu/arm1176/start.S
arch/arm/cpu/arm720t/start.S
arch/arm/cpu/arm920t/start.S
arch/arm/cpu/arm925t/start.S
arch/arm/cpu/arm926ejs/at91/Makefile
arch/arm/cpu/arm926ejs/at91/at91sam9260_devices.c
arch/arm/cpu/arm926ejs/at91/at91sam9n12_devices.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/at91/clock.c
arch/arm/cpu/arm926ejs/davinci/Makefile
arch/arm/cpu/arm926ejs/davinci/da830_pinmux.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
arch/arm/cpu/arm926ejs/mx25/generic.c
arch/arm/cpu/arm926ejs/mxs/Makefile
arch/arm/cpu/arm926ejs/mxs/clock.c
arch/arm/cpu/arm926ejs/mxs/mxs.c
arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c
arch/arm/cpu/arm926ejs/mxs/spl_power_init.c
arch/arm/cpu/arm926ejs/mxs/u-boot-imx23.bd
arch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd
arch/arm/cpu/arm926ejs/start.S
arch/arm/cpu/arm946es/start.S
arch/arm/cpu/arm_intcm/start.S
arch/arm/cpu/armv7/am33xx/clock_ti814x.c
arch/arm/cpu/armv7/am33xx/sys_info.c
arch/arm/cpu/armv7/at91/Makefile [new file with mode: 0644]
arch/arm/cpu/armv7/at91/clock.c [new file with mode: 0644]
arch/arm/cpu/armv7/at91/cpu.c [new file with mode: 0644]
arch/arm/cpu/armv7/at91/reset.c [new file with mode: 0644]
arch/arm/cpu/armv7/at91/sama5d3_devices.c [new file with mode: 0644]
arch/arm/cpu/armv7/at91/timer.c [new file with mode: 0644]
arch/arm/cpu/armv7/lowlevel_init.S
arch/arm/cpu/armv7/mx5/Makefile
arch/arm/cpu/armv7/mx5/clock.c
arch/arm/cpu/armv7/mx5/iomux.c [deleted file]
arch/arm/cpu/armv7/mx5/soc.c
arch/arm/cpu/armv7/mx6/clock.c
arch/arm/cpu/armv7/mx6/soc.c
arch/arm/cpu/armv7/omap-common/Makefile
arch/arm/cpu/armv7/omap-common/abb.c [new file with mode: 0644]
arch/arm/cpu/armv7/omap-common/boot-common.c
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.c
arch/arm/cpu/armv7/omap-common/timer.c
arch/arm/cpu/armv7/omap-common/vc.c
arch/arm/cpu/armv7/omap3/clock.c
arch/arm/cpu/armv7/omap4/emif.c
arch/arm/cpu/armv7/omap4/hw_data.c
arch/arm/cpu/armv7/omap4/hwinit.c
arch/arm/cpu/armv7/omap4/prcm-regs.c
arch/arm/cpu/armv7/omap5/Makefile
arch/arm/cpu/armv7/omap5/abb.c [new file with mode: 0644]
arch/arm/cpu/armv7/omap5/emif.c
arch/arm/cpu/armv7/omap5/hw_data.c
arch/arm/cpu/armv7/omap5/hwinit.c
arch/arm/cpu/armv7/omap5/prcm-regs.c
arch/arm/cpu/armv7/omap5/sdram.c
arch/arm/cpu/armv7/start.S
arch/arm/cpu/armv7/vf610/Makefile [new file with mode: 0644]
arch/arm/cpu/armv7/vf610/generic.c [new file with mode: 0644]
arch/arm/cpu/armv7/vf610/timer.c [new file with mode: 0644]
arch/arm/cpu/armv7/zynq/slcr.c
arch/arm/cpu/armv7/zynq/timer.c
arch/arm/cpu/ixp/config.mk
arch/arm/cpu/ixp/start.S
arch/arm/cpu/pxa/pxa2xx.c
arch/arm/cpu/pxa/start.S
arch/arm/cpu/s3c44b0/start.S
arch/arm/cpu/sa1100/start.S
arch/arm/cpu/tegra-common/ap.c
arch/arm/cpu/tegra-common/clock.c
arch/arm/imx-common/Makefile
arch/arm/imx-common/iomux-v3.c
arch/arm/imx-common/misc.c [new file with mode: 0644]
arch/arm/include/asm/arch-am33xx/ddr_defs.h
arch/arm/include/asm/arch-am33xx/hardware_ti814x.h
arch/arm/include/asm/arch-am33xx/omap.h
arch/arm/include/asm/arch-am33xx/sys_proto.h
arch/arm/include/asm/arch-at91/at91_common.h
arch/arm/include/asm/arch-at91/at91_dbu.h
arch/arm/include/asm/arch-at91/at91_pmc.h
arch/arm/include/asm/arch-at91/at91sam9_matrix.h
arch/arm/include/asm/arch-at91/at91sam9x5.h
arch/arm/include/asm/arch-at91/at91sam9x5_matrix.h
arch/arm/include/asm/arch-at91/clk.h
arch/arm/include/asm/arch-at91/hardware.h
arch/arm/include/asm/arch-at91/sama5d3.h [new file with mode: 0644]
arch/arm/include/asm/arch-at91/sama5d3_smc.h [new file with mode: 0644]
arch/arm/include/asm/arch-davinci/hardware.h
arch/arm/include/asm/arch-davinci/nand_defs.h
arch/arm/include/asm/arch-davinci/pinmux_defs.h
arch/arm/include/asm/arch-mx25/imx-regs.h
arch/arm/include/asm/arch-mx25/imx25-pinmux.h [deleted file]
arch/arm/include/asm/arch-mx25/iomux-mx25.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx27/imx-regs.h
arch/arm/include/asm/arch-mx31/imx-regs.h
arch/arm/include/asm/arch-mx35/imx-regs.h
arch/arm/include/asm/arch-mx35/iomux-mx35.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx35/iomux.h [deleted file]
arch/arm/include/asm/arch-mx35/mx35_pins.h [deleted file]
arch/arm/include/asm/arch-mx5/clock.h
arch/arm/include/asm/arch-mx5/imx-regs.h
arch/arm/include/asm/arch-mx5/iomux-mx51.h
arch/arm/include/asm/arch-mx5/iomux-mx53.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx5/iomux.h [deleted file]
arch/arm/include/asm/arch-mx5/mx5x_pins.h [deleted file]
arch/arm/include/asm/arch-mx5/spl.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx6/clock.h
arch/arm/include/asm/arch-mx6/crm_regs.h
arch/arm/include/asm/arch-mx6/imx-regs.h
arch/arm/include/asm/arch-mx6/mx6-pins.h
arch/arm/include/asm/arch-mx6/mx6dl_pins.h
arch/arm/include/asm/arch-mx6/mx6q_pins.h
arch/arm/include/asm/arch-mx6/mx6sl_pins.h [new file with mode: 0644]
arch/arm/include/asm/arch-mx6/sys_proto.h
arch/arm/include/asm/arch-mxs/clock.h
arch/arm/include/asm/arch-mxs/imx-regs.h
arch/arm/include/asm/arch-mxs/iomux.h
arch/arm/include/asm/arch-mxs/regs-clkctrl-mx23.h
arch/arm/include/asm/arch-mxs/regs-clkctrl-mx28.h
arch/arm/include/asm/arch-mxs/regs-digctl.h
arch/arm/include/asm/arch-mxs/regs-i2c.h
arch/arm/include/asm/arch-mxs/regs-lcdif.h
arch/arm/include/asm/arch-mxs/regs-lradc.h
arch/arm/include/asm/arch-mxs/regs-ocotp.h
arch/arm/include/asm/arch-mxs/regs-pinctrl.h
arch/arm/include/asm/arch-mxs/regs-power-mx23.h
arch/arm/include/asm/arch-mxs/regs-power-mx28.h
arch/arm/include/asm/arch-mxs/regs-rtc.h
arch/arm/include/asm/arch-mxs/regs-ssp.h
arch/arm/include/asm/arch-mxs/regs-timrot.h
arch/arm/include/asm/arch-omap24xx/bits.h [deleted file]
arch/arm/include/asm/arch-omap24xx/clocks.h [deleted file]
arch/arm/include/asm/arch-omap24xx/i2c.h [deleted file]
arch/arm/include/asm/arch-omap24xx/mem.h [deleted file]
arch/arm/include/asm/arch-omap24xx/mux.h [deleted file]
arch/arm/include/asm/arch-omap24xx/omap2420.h [deleted file]
arch/arm/include/asm/arch-omap24xx/sys_info.h [deleted file]
arch/arm/include/asm/arch-omap24xx/sys_proto.h [deleted file]
arch/arm/include/asm/arch-omap3/clock.h [moved from arch/arm/include/asm/arch-omap3/clocks.h with 100% similarity]
arch/arm/include/asm/arch-omap3/omap3.h
arch/arm/include/asm/arch-omap4/clock.h [moved from arch/arm/include/asm/arch-omap4/clocks.h with 90% similarity]
arch/arm/include/asm/arch-omap4/cpu.h
arch/arm/include/asm/arch-omap4/omap.h
arch/arm/include/asm/arch-omap4/sys_proto.h
arch/arm/include/asm/arch-omap5/clock.h [moved from arch/arm/include/asm/arch-omap5/clocks.h with 70% similarity]
arch/arm/include/asm/arch-omap5/cpu.h
arch/arm/include/asm/arch-omap5/i2c.h
arch/arm/include/asm/arch-omap5/mux_dra7xx.h
arch/arm/include/asm/arch-omap5/omap.h
arch/arm/include/asm/arch-omap5/sys_proto.h
arch/arm/include/asm/arch-pxa/hardware.h
arch/arm/include/asm/arch-tegra/tegra.h
arch/arm/include/asm/arch-vf610/clock.h [moved from arch/arm/include/asm/arch-mx25/sys_proto.h with 63% similarity]
arch/arm/include/asm/arch-vf610/crm_regs.h [new file with mode: 0644]
arch/arm/include/asm/arch-vf610/imx-regs.h [new file with mode: 0644]
arch/arm/include/asm/arch-vf610/iomux-vf610.h [new file with mode: 0644]
arch/arm/include/asm/arch-zynq/hardware.h
arch/arm/include/asm/arch-zynq/sys_proto.h
arch/arm/include/asm/emif.h
arch/arm/include/asm/global_data.h
arch/arm/include/asm/imx-common/dma.h [moved from arch/arm/include/asm/arch-mxs/dma.h with 93% similarity]
arch/arm/include/asm/imx-common/imximage.cfg [new file with mode: 0644]
arch/arm/include/asm/imx-common/iomux-v3.h
arch/arm/include/asm/imx-common/regs-apbh.h [moved from arch/arm/include/asm/arch-mxs/regs-apbh.h with 97% similarity]
arch/arm/include/asm/imx-common/regs-bch.h [moved from arch/arm/include/asm/arch-mxs/regs-bch.h with 96% similarity]
arch/arm/include/asm/imx-common/regs-common.h [moved from arch/arm/include/asm/arch-mxs/regs-common.h with 100% similarity]
arch/arm/include/asm/imx-common/regs-gpmi.h [moved from arch/arm/include/asm/arch-mxs/regs-gpmi.h with 99% similarity]
arch/arm/include/asm/omap_boot.h [new file with mode: 0644]
arch/arm/include/asm/omap_common.h
arch/arm/lib/Makefile
arch/arm/lib/cache.c
arch/arm/lib/crt0.S
arch/arm/lib/relocate.S [new file with mode: 0644]
arch/mips/include/asm/errno.h
arch/mips/include/asm/io.h
arch/powerpc/cpu/mpc512x/Makefile
arch/powerpc/cpu/mpc512x/cpu_init.c
arch/powerpc/cpu/mpc512x/iim.c [deleted file]
arch/powerpc/cpu/mpc8260/commproc.c
arch/powerpc/cpu/mpc8260/cpu.c
arch/powerpc/cpu/mpc8260/i2c.c
arch/powerpc/cpu/mpc8260/serial_smc.c
arch/powerpc/cpu/mpc8260/spi.c
arch/powerpc/cpu/mpc85xx/Makefile
arch/powerpc/cpu/mpc85xx/cpu_init.c
arch/powerpc/cpu/mpc85xx/cpu_init_early.c
arch/powerpc/cpu/mpc85xx/mp.c
arch/powerpc/cpu/mpc85xx/release.S
arch/powerpc/cpu/mpc85xx/speed.c
arch/powerpc/cpu/mpc85xx/start.S
arch/powerpc/cpu/mpc85xx/t1040_ids.c [new file with mode: 0644]
arch/powerpc/cpu/mpc85xx/t1040_serdes.c [new file with mode: 0644]
arch/powerpc/cpu/mpc8xx/cpu.c
arch/powerpc/cpu/mpc8xxx/cpu.c
arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c
arch/powerpc/include/asm/8xx_immap.h
arch/powerpc/include/asm/config_mpc85xx.h
arch/powerpc/include/asm/fsl_law.h
arch/powerpc/include/asm/fsl_secure_boot.h
arch/powerpc/include/asm/fsl_serdes.h
arch/powerpc/include/asm/immap_512x.h
arch/powerpc/include/asm/immap_8260.h
arch/powerpc/include/asm/immap_85xx.h
arch/powerpc/include/asm/processor.h
board/CarMediaLab/flea3/flea3.c
board/Seagate/goflexhome/Makefile [new file with mode: 0644]
board/Seagate/goflexhome/goflexhome.c [new file with mode: 0644]
board/Seagate/goflexhome/kwbimage.cfg [new file with mode: 0644]
board/ait/cam_enc_4xx/cam_enc_4xx.c
board/armltd/vexpress/Makefile
board/armltd/vexpress/vexpress_common.c [moved from board/armltd/vexpress/ca9x4_ct_vxp.c with 89% similarity]
board/atmel/at91sam9260ek/at91sam9260ek.c
board/atmel/at91sam9n12ek/Makefile [new file with mode: 0644]
board/atmel/at91sam9n12ek/at91sam9n12ek.c [new file with mode: 0644]
board/atmel/sama5d3xek/Makefile [moved from board/ti/omap2420h4/Makefile with 77% similarity]
board/atmel/sama5d3xek/sama5d3xek.c [new file with mode: 0644]
board/boundary/nitrogen6x/clocks.cfg
board/boundary/nitrogen6x/nitrogen6x.c
board/compulab/cm_t35/Makefile [moved from board/cm_t35/Makefile with 82% similarity]
board/compulab/cm_t35/cm_t35.c [moved from board/cm_t35/cm_t35.c with 96% similarity]
board/compulab/cm_t35/display.c [moved from board/cm_t35/display.c with 99% similarity]
board/compulab/cm_t35/eeprom.c [moved from board/cm_t35/eeprom.c with 100% similarity]
board/compulab/cm_t35/eeprom.h [moved from board/cm_t35/eeprom.h with 100% similarity]
board/compulab/cm_t35/leds.c [moved from board/cm_t35/leds.c with 95% similarity]
board/congatec/cgtqmx6eval/Makefile [new file with mode: 0644]
board/congatec/cgtqmx6eval/README [new file with mode: 0644]
board/congatec/cgtqmx6eval/cgtqmx6eval.c [new file with mode: 0644]
board/davinci/da8xxevm/da830evm.c
board/denx/m53evk/Makefile [new file with mode: 0644]
board/denx/m53evk/imximage.cfg [new file with mode: 0644]
board/denx/m53evk/m53evk.c [new file with mode: 0644]
board/esg/ima3-mx53/ima3-mx53.c
board/freescale/b4860qds/b4860qds.c
board/freescale/b4860qds/b4860qds_crossbar_con.h
board/freescale/b4860qds/eth_b4860qds.c
board/freescale/b4860qds/law.c
board/freescale/b4860qds/tlb.c
board/freescale/common/qixis.h
board/freescale/corenet_ds/eth_superhydra.c
board/freescale/corenet_ds/rcw_p5040ds.cfg [new file with mode: 0644]
board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
board/freescale/mx23evk/mx23evk.c
board/freescale/mx23evk/spl_boot.c
board/freescale/mx25pdk/mx25pdk.c
board/freescale/mx28evk/iomux.c
board/freescale/mx28evk/mx28evk.c
board/freescale/mx31pdk/mx31pdk.c
board/freescale/mx35pdk/mx35pdk.c
board/freescale/mx51evk/mx51evk.c
board/freescale/mx51evk/mx51evk_video.c
board/freescale/mx53ard/mx53ard.c
board/freescale/mx53evk/mx53evk.c
board/freescale/mx53loco/mx53loco.c
board/freescale/mx53loco/mx53loco_video.c
board/freescale/mx53smd/mx53smd.c
board/freescale/mx6qarm2/mx6qarm2.c
board/freescale/mx6qsabreauto/mx6qsabreauto.c
board/freescale/mx6qsabrelite/mx6qsabrelite.c
board/freescale/mx6qsabresd/mx6qsabresd.c
board/freescale/mx6slevk/Makefile [new file with mode: 0644]
board/freescale/mx6slevk/imximage.cfg [new file with mode: 0644]
board/freescale/mx6slevk/mx6slevk.c [new file with mode: 0644]
board/freescale/p2041rdb/p2041rdb.c
board/freescale/t4qds/eth.c
board/freescale/t4qds/law.c
board/freescale/t4qds/t4_pbi.cfg [new file with mode: 0644]
board/freescale/t4qds/t4_rcw.cfg [new file with mode: 0644]
board/freescale/t4qds/t4qds.c
board/freescale/t4qds/tlb.c
board/freescale/titanium/Makefile [new file with mode: 0644]
board/freescale/titanium/imximage.cfg [new file with mode: 0644]
board/freescale/titanium/titanium.c [new file with mode: 0644]
board/freescale/vf610twr/Makefile [new file with mode: 0644]
board/freescale/vf610twr/imximage.cfg [new file with mode: 0644]
board/freescale/vf610twr/vf610twr.c [new file with mode: 0644]
board/genesi/mx51_efikamx/efikamx-usb.c
board/genesi/mx51_efikamx/efikamx.c
board/h2200/h2200.c
board/htkw/mcx/mcx.c
board/icpdas/lp8x4x/Makefile [new file with mode: 0644]
board/icpdas/lp8x4x/lp8x4x.c [new file with mode: 0644]
board/isee/igep0033/Makefile [new file with mode: 0644]
board/isee/igep0033/board.c [new file with mode: 0644]
board/isee/igep0033/board.h [new file with mode: 0644]
board/isee/igep0033/mux.c [new file with mode: 0644]
board/karo/tx25/tx25.c
board/keymile/km_arm/km_arm.c
board/nokia/rx51/rx51.c
board/nvidia/beaver/Makefile [new file with mode: 0644]
board/olimex/mx23_olinuxino/spl_boot.c
board/pandora/pandora.c
board/phytec/pcm051/board.c
board/raspberrypi/rpi_b/rpi_b.c
board/syteco/zmx25/zmx25.c
board/teejet/mt_ventoux/mt_ventoux.c
board/ti/am335x/board.c
board/ti/beagle/beagle.c
board/ti/dra7xx/evm.c
board/ti/dra7xx/mux_data.h
board/ti/omap2420h4/config.mk [deleted file]
board/ti/omap2420h4/lowlevel_init.S [deleted file]
board/ti/omap2420h4/mem.c [deleted file]
board/ti/omap2420h4/omap2420h4.c [deleted file]
board/ti/omap2420h4/sys_info.c [deleted file]
board/ti/omap5_uevm/evm.c
board/ti/panda/panda.c
board/ti/sdp4430/sdp.c
board/ti/ti814x/evm.c
board/ti/ti814x/evm.h
board/ti/ti814x/mux.c
board/ttcontrol/vision2/vision2.c
board/wandboard/README
board/wandboard/wandboard.c
board/woodburn/woodburn.c
board/xilinx/zynq/board.c
boards.cfg
common/Makefile
common/board_f.c
common/board_r.c
common/cmd_bdinfo.c
common/cmd_bootm.c
common/cmd_fitupd.c
common/cmd_fpga.c
common/cmd_fuse.c [new file with mode: 0644]
common/cmd_immap.c
common/cmd_mem.c
common/cmd_nand.c
common/cmd_onenand.c
common/env_onenand.c
common/fdt_support.c
common/image-fdt.c
common/image-fit.c
common/image.c
common/lcd.c
common/main.c
common/spl/spl.c
common/spl/spl_mmc.c
common/usb_hub.c
common/usb_kbd.c
disk/part_efi.c
doc/README.at91
doc/README.b4860qds
doc/README.fsl_iim [new file with mode: 0644]
doc/README.fuse [new file with mode: 0644]
doc/README.imx25 [new file with mode: 0644]
doc/README.imx27 [new file with mode: 0644]
doc/README.imx5
doc/README.imx6 [new file with mode: 0644]
doc/README.imximage
doc/README.mxc_ocotp [new file with mode: 0644]
doc/README.omap-reset-time [new file with mode: 0644]
doc/README.scrapyard
doc/README.t4240qds
doc/README.vf610 [new file with mode: 0644]
doc/device-tree-bindings/video/simple-framebuffer.txt [new file with mode: 0644]
drivers/dma/apbh_dma.c
drivers/fpga/Makefile
drivers/fpga/fpga.c
drivers/fpga/xilinx.c
drivers/fpga/zynqpl.c [new file with mode: 0644]
drivers/i2c/Makefile
drivers/i2c/omap24xx_i2c.c
drivers/i2c/zynq_i2c.c [new file with mode: 0644]
drivers/input/key_matrix.c
drivers/misc/Makefile
drivers/misc/fsl_iim.c [new file with mode: 0644]
drivers/misc/mxc_ocotp.c [new file with mode: 0644]
drivers/misc/twl4030_led.c
drivers/mmc/Makefile
drivers/mmc/gen_atmel_mci.c
drivers/mmc/mxsmmc.c
drivers/mmc/omap_hsmmc.c
drivers/mmc/zynq_sdhci.c [new file with mode: 0644]
drivers/mtd/Makefile
drivers/mtd/cfi_flash.c
drivers/mtd/cfi_mtd.c
drivers/mtd/mtdconcat.c
drivers/mtd/mtdcore.c
drivers/mtd/mtdpart.c
drivers/mtd/nand/Makefile
drivers/mtd/nand/atmel_nand.c
drivers/mtd/nand/bfin_nand.c
drivers/mtd/nand/davinci_nand.c
drivers/mtd/nand/diskonchip.c
drivers/mtd/nand/docg4.c [new file with mode: 0644]
drivers/mtd/nand/docg4_spl.c [new file with mode: 0644]
drivers/mtd/nand/fsl_elbc_nand.c
drivers/mtd/nand/fsl_ifc_nand.c
drivers/mtd/nand/fsmc_nand.c
drivers/mtd/nand/jz4740_nand.c
drivers/mtd/nand/mpc5121_nfc.c
drivers/mtd/nand/mxc_nand.c
drivers/mtd/nand/mxc_nand_spl.c
drivers/mtd/nand/mxs_nand.c
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nand_bbt.c
drivers/mtd/nand/nand_ids.c
drivers/mtd/nand/nand_util.c
drivers/mtd/nand/ndfc.c
drivers/mtd/nand/nomadik.c
drivers/mtd/nand/omap_gpmc.c
drivers/mtd/nand/s3c2410_nand.c
drivers/mtd/nand/tegra_nand.c
drivers/mtd/nand/tegra_nand.h
drivers/mtd/onenand/onenand_base.c
drivers/mtd/onenand/onenand_bbt.c
drivers/mtd/spi/spansion.c
drivers/mtd/ubi/build.c
drivers/mtd/ubi/eba.c
drivers/mtd/ubi/io.c
drivers/mtd/ubi/kapi.c
drivers/mtd/ubi/misc.c
drivers/mtd/ubi/vtbl.c
drivers/net/cpsw.c
drivers/net/fec_mxc.c
drivers/net/fm/b4860.c
drivers/net/phy/Makefile
drivers/net/phy/et1011c.c [new file with mode: 0644]
drivers/net/phy/marvell.c
drivers/net/phy/phy.c
drivers/net/phy/teranetics.c
drivers/net/zynq_gem.c
drivers/pci/Makefile
drivers/power/Makefile
drivers/power/palmas.c [new file with mode: 0644]
drivers/power/twl4030.c
drivers/power/twl6030.c
drivers/power/twl6035.c [deleted file]
drivers/serial/Makefile
drivers/serial/ns16550.c
drivers/serial/serial_lpuart.c [new file with mode: 0644]
drivers/serial/serial_ns16550.c
drivers/spi/atmel_spi.c
drivers/spi/atmel_spi.h
drivers/spi/mxs_spi.c
drivers/tpm/Makefile
drivers/tpm/slb9635_i2c/compatibility.h [deleted file]
drivers/tpm/tis_i2c.c
drivers/tpm/tpm.c [moved from drivers/tpm/slb9635_i2c/tpm.c with 63% similarity]
drivers/tpm/tpm_private.h [moved from drivers/tpm/slb9635_i2c/tpm.h with 71% similarity]
drivers/tpm/tpm_tis_i2c.c [moved from drivers/tpm/slb9635_i2c/tpm_tis_i2c.c with 59% similarity]
drivers/tpm/tpm_tis_lpc.c [moved from drivers/tpm/generic_lpc_tpm.c with 100% similarity]
drivers/usb/eth/asix.c
drivers/usb/gadget/Makefile
drivers/usb/gadget/composite.c
drivers/usb/gadget/f_mass_storage.c
drivers/usb/gadget/fotg210.c [new file with mode: 0644]
drivers/usb/gadget/gadget_chips.h
drivers/usb/gadget/pxa25x_udc.c
drivers/usb/gadget/pxa27x_udc.c
drivers/usb/host/Makefile
drivers/usb/host/ehci-faraday.c [new file with mode: 0644]
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-mx5.c
drivers/usb/host/ohci-at91.c
drivers/usb/musb/omap3.c
drivers/usb/phy/twl4030.c
drivers/video/Makefile
drivers/video/cfb_console.c
drivers/video/mxsfb.c [new file with mode: 0644]
drivers/video/pxa_lcd.c
drivers/watchdog/Makefile
examples/standalone/mem_to_mem_idma2intr.c
fs/ext4/dev.c
fs/yaffs2/yaffs_mtdif.c
fs/yaffs2/yaffs_mtdif2.c
include/altera.h
include/asm-generic/global_data.h
include/atmel_mci.h
include/bootstage.h
include/common.h
include/commproc.h
include/config_cmd_all.h
include/configs/A3000.h
include/configs/APC405.h
include/configs/AR405.h
include/configs/ASH405.h
include/configs/B4860QDS.h
include/configs/BSC9132QDS.h
include/configs/CATcenter.h
include/configs/CPC45.h
include/configs/CPCI2DP.h
include/configs/CPCI405.h
include/configs/CPCI4052.h
include/configs/CPCI405AB.h
include/configs/CPCI405DT.h
include/configs/CPCIISER4.h
include/configs/CPU87.h
include/configs/CU824.h
include/configs/DU440.h
include/configs/ELPPC.h
include/configs/G2000.h
include/configs/HH405.h
include/configs/HIDDEN_DRAGON.h
include/configs/HWW1U1A.h
include/configs/JSE.h
include/configs/KAREF.h
include/configs/M54455EVB.h
include/configs/MERGERBOX.h
include/configs/METROBOX.h
include/configs/MIP405.h
include/configs/MOUSSE.h
include/configs/MPC8260ADS.h
include/configs/MPC8266ADS.h
include/configs/MPC8308RDB.h
include/configs/MPC8313ERDB.h
include/configs/MPC8315ERDB.h
include/configs/MPC8323ERDB.h
include/configs/MPC832XEMDS.h
include/configs/MPC8349EMDS.h
include/configs/MPC8349ITX.h
include/configs/MPC8360EMDS.h
include/configs/MPC8360ERDK.h
include/configs/MPC837XEMDS.h
include/configs/MPC837XERDB.h
include/configs/MPC8536DS.h
include/configs/MPC8540ADS.h
include/configs/MPC8541CDS.h
include/configs/MPC8544DS.h
include/configs/MPC8548CDS.h
include/configs/MPC8555CDS.h
include/configs/MPC8560ADS.h
include/configs/MPC8568MDS.h
include/configs/MPC8569MDS.h
include/configs/MPC8572DS.h
include/configs/MPC8610HPCD.h
include/configs/MPC8641HPCN.h
include/configs/MUSENKI.h
include/configs/MVBC_P.h
include/configs/MVBLM7.h
include/configs/MVBLUE.h
include/configs/MVSMR.h
include/configs/OCRTC.h
include/configs/ORSG.h
include/configs/P1010RDB.h
include/configs/P1022DS.h
include/configs/P1023RDS.h
include/configs/P1_P2_RDB.h
include/configs/P2020COME.h
include/configs/P2020DS.h
include/configs/P2041RDB.h
include/configs/PCI405.h
include/configs/PIP405.h
include/configs/PLU405.h
include/configs/PM826.h
include/configs/PM828.h
include/configs/PMC405.h
include/configs/PMC405DE.h
include/configs/PMC440.h
include/configs/PN62.h
include/configs/PPChameleonEVB.h
include/configs/SIMPC8313.h
include/configs/Sandpoint8240.h
include/configs/Sandpoint8245.h
include/configs/TQM8272.h
include/configs/TQM834x.h
include/configs/VOH405.h
include/configs/W7OLMC.h
include/configs/W7OLMG.h
include/configs/WUH405.h
include/configs/ac14xx.h
include/configs/adp-ag102.h
include/configs/alpr.h
include/configs/am335x_evm.h
include/configs/aria.h
include/configs/at91sam9260ek.h
include/configs/at91sam9n12ek.h [new file with mode: 0644]
include/configs/atc.h
include/configs/bamboo.h
include/configs/bubinga.h
include/configs/canyonlands.h
include/configs/cgtqmx6eval.h [new file with mode: 0644]
include/configs/cm_t35.h
include/configs/coreboot.h
include/configs/corenet_ds.h
include/configs/csb272.h
include/configs/csb472.h
include/configs/da830evm.h
include/configs/da850evm.h
include/configs/debris.h
include/configs/devkit8000.h
include/configs/dra7xx_evm.h
include/configs/eXalion.h
include/configs/ebony.h
include/configs/enbw_cmc.h
include/configs/ep82xxm.h
include/configs/exynos5250-dt.h
include/configs/gdppc440etx.h
include/configs/goflexhome.h [new file with mode: 0644]
include/configs/icon.h
include/configs/igep0033.h [new file with mode: 0644]
include/configs/ima3-mx53.h
include/configs/intip.h
include/configs/katmai.h
include/configs/kilauea.h
include/configs/korat.h
include/configs/kvme080.h
include/configs/linkstation.h
include/configs/lp8x4x.h [new file with mode: 0644]
include/configs/luan.h
include/configs/m28evk.h
include/configs/m53evk.h [new file with mode: 0644]
include/configs/makalu.h
include/configs/mecp5123.h
include/configs/mpc5121ads.h
include/configs/mpc8308_p1m.h
include/configs/mx23evk.h
include/configs/mx28evk.h
include/configs/mx51evk.h
include/configs/mx53ard.h
include/configs/mx53evk.h
include/configs/mx53smd.h
include/configs/mx6_common.h
include/configs/mx6qsabre_common.h
include/configs/mx6qsabreauto.h
include/configs/mx6qsabrelite.h
include/configs/mx6qsabresd.h
include/configs/mx6slevk.h [new file with mode: 0644]
include/configs/nitrogen6x.h
include/configs/ocotea.h
include/configs/omap2420h4.h [deleted file]
include/configs/omap3_mvblx.h
include/configs/omap4_common.h
include/configs/omap4_panda.h
include/configs/omap5_common.h
include/configs/omap5_uevm.h
include/configs/p1_p2_rdb_pc.h
include/configs/p3p440.h
include/configs/pcm051.h
include/configs/pcs440ep.h
include/configs/pdm360ng.h
include/configs/pm9263.h
include/configs/ppmc7xx.h
include/configs/rpi_b.h
include/configs/sama5d3xek.h [new file with mode: 0644]
include/configs/sbc405.h
include/configs/sbc8349.h
include/configs/sbc8548.h
include/configs/sbc8641d.h
include/configs/sc3.h
include/configs/sequoia.h
include/configs/socrates.h
include/configs/stxssa.h
include/configs/t3corp.h
include/configs/t4qds.h
include/configs/taihu.h
include/configs/taishan.h
include/configs/tegra-common-post.h
include/configs/tegra114-common.h
include/configs/tegra20-common.h
include/configs/tegra30-common.h
include/configs/ti814x_evm.h
include/configs/titanium.h [new file with mode: 0644]
include/configs/tnetv107x_evm.h
include/configs/utx8245.h
include/configs/ve8313.h
include/configs/vexpress_ca15_tc2.h [new file with mode: 0644]
include/configs/vexpress_ca5x2.h [new file with mode: 0644]
include/configs/vexpress_ca9x4.h [new file with mode: 0644]
include/configs/vexpress_common.h [moved from include/configs/ca9x4_ct_vxp.h with 56% similarity]
include/configs/vf610twr.h [new file with mode: 0644]
include/configs/vme8349.h
include/configs/walnut.h
include/configs/wandboard.h
include/configs/xpedite1000.h
include/configs/xpedite517x.h
include/configs/xpedite520x.h
include/configs/xpedite537x.h
include/configs/xpedite550x.h
include/configs/yosemite.h
include/configs/yucca.h
include/configs/zynq.h
include/fdtdec.h
include/fpga.h
include/fuse.h [moved from include/twl6035.h with 55% similarity]
include/image.h
include/lattice.h
include/lcd.h
include/linux/bitrev.h [new file with mode: 0644]
include/linux/mtd/bbm.h
include/linux/mtd/docg4.h [new file with mode: 0644]
include/linux/mtd/mtd.h
include/linux/mtd/nand.h
include/linux/string.h
include/linux/usb/ch9.h
include/mtd/cfi_flash.h
include/mtd/mtd-abi.h [moved from include/linux/mtd/mtd-abi.h with 65% similarity]
include/nand.h
include/net.h
include/netdev.h
include/palmas.h [new file with mode: 0644]
include/pci.h
include/phy.h
include/spl.h
include/twl4030.h
include/twl6030.h
include/usb/ehci-fsl.h
include/usb/fotg210.h [new file with mode: 0644]
include/usb/fusbh200.h [new file with mode: 0644]
include/xilinx.h
include/zynqpl.h [new file with mode: 0644]
lib/Makefile
lib/bitrev.c [new file with mode: 0644]
lib/fdtdec.c
lib/string.c
spl/Makefile
test/image/test-fit.py [new file with mode: 0755]
tools/Makefile
tools/checkpatch.pl
tools/imximage.c
tools/imximage.h
tools/logos/wandboard.bmp [new file with mode: 0644]
tools/mkimage.h
tools/mxsboot.c

index ed212032b4dd7ef53eac57f5b208fc6153c73fbe..771b860ee8ef86f50e66b9e16c9c9ede2a2bcba2 100644 (file)
@@ -46,6 +46,7 @@
 /u-boot.ais
 /u-boot.dtb
 /u-boot.sb
+/u-boot.bd
 /u-boot.geany
 
 #
@@ -79,5 +80,11 @@ cscope.*
 /ctags
 /etags
 
+# gnu global files
+GPATH
+GRTAGS
+GSYMS
+GTAGS
+
 # spl ais files
 /spl/*.ais
index 643a5acc4121c30d35567cca1be36cdf896b5915..7820375e9c9d602ffe8e18089125621c5d26b808 100644 (file)
@@ -607,6 +607,7 @@ Enric Balletbo i Serra <eballetbo@iseebcn.com>
        igep0020        ARM ARMV7 (OMAP3xx SoC)
        igep0030        ARM ARMV7 (OMAP3xx SoC)
        igep0032        ARM ARMV7 (OMAP3xx SoC)
+       igep0033        ARM ARMV7 (AM33xx Soc)
 
 Eric Benard <eric@eukrea.com>
 
@@ -664,6 +665,7 @@ Fabio Estevam <fabio.estevam@freescale.com>
        mx6qsabresd     i.MX6Q
        mx6qsabreauto   i.MX6Q
        wandboard       i.MX6DL/S
+       mx6slevk        i.MX6SL
 
 Daniel Gorsulowski <daniel.gorsulowski@esd.eu>
 
@@ -683,7 +685,7 @@ Simon Guinot <simon.guinot@sequanux.org>
 
 Igor Grinberg <grinberg@compulab.co.il>
 
-       cm-t35          ARM ARMV7 (OMAP3xx Soc)
+       cm_t35          ARM ARMV7 (OMAP3xx Soc)
 
 Stefan Herbrechtsmeier <stefan@code.herbrechtsmeier.net>
 
@@ -848,6 +850,10 @@ Sricharan R <r.sricharan@ti.com>
        omap4_sdp4430   ARM ARMV7 (OMAP4xx SoC)
        omap5_evm       ARM ARMV7 (OMAP5xx Soc)
 
+Suriyan Ramasami <suriyan.r@gmail.com>
+
+       goflexhome      ARM926EJS (Kirkwood SoC)
+
 Thierry Reding <thierry.reding@avionic-design.de>
 
        plutux          Tegra20 (ARM7 & A9 Dual Core)
@@ -877,6 +883,8 @@ Stefan Roese <sr@denx.de>
 
        x600            ARM926EJS (spear600 Soc)
 
+       titanium        i.MX6Q
+
        pdnb3           xscale/ixp
        scpu            xscale/ixp
 
@@ -889,6 +897,10 @@ Steve Sakoman <sakoman@gmail.com>
 
        omap3_overo     ARM ARMV7 (OMAP3xx SoC)
 
+Leo Sartre <lsartre@adeneo-embedded.com>
+
+       cgtqmx6qeval            i.MX6Q
+
 Jens Scharsig <esw@bus-elektronik.de>
 
        eb_cpux9k2      ARM920T (AT91RM9200 SoC)
@@ -914,6 +926,7 @@ Matt Sealey <matt@genesi-usa.com>
 
 Bo Shen <voice.shen@atmel.com>
        at91sam9x5ek            ARM926EJS (AT91SAM9G15,G25,G35,X25,X35 SoC)
+       sama5d3xek              ARMV7 (SAMA5D31, D33, D34, D35 SoC)
 
 Rajeshwari Shinde <rajeshwari.s@samsung.com>
 
@@ -954,14 +967,20 @@ Marek Vasut <marek.vasut@gmail.com>
        mx23_olinuxino  i.MX23
        m28evk          i.MX28
        sc_sps_1        i.MX28
+       m53evk          i.MX53
 
 Hugo Villeneuve <hugo.villeneuve@lyrtech.com>
 
        SFFSDR          ARM926EJS
 
+Lokesh Vutla <lokeshvutla@ti.com>
+
+       dra7xx_evm      ARM ARMV7 (DRA7xx Soc)
+
 Matt Waddel <matt.waddel@linaro.org>
 
-       ca9x4_ct_vxp    ARM ARMV7 (Quad Core)
+       vexpress_ca9x4  ARM ARMV7 (Quad Core)
+       vexpress_ca5x2  ARM ARMV7 (Dual Core)
 
 Otavio Salvador <otavio@ossystems.com.br>
 
@@ -1014,9 +1033,8 @@ Matthias Weisser <weisserm@arcor.de>
        jadecpu         ARM926EJS (MB86R01 SoC)
        zmx25           ARM926EJS (imx25 SoC)
 
-Richard Woodruff <r-woodruff2@ti.com>
-
-       omap2420h4      ARM1136EJS
+Josh Wu <josh.wu@atmel.com>
+       at91sam9n12ek   ARM926EJS (AT91SAM9N12 SoC)
 
 Ilya Yanok <yanok@emcraft.com>
 
@@ -1052,6 +1070,14 @@ Eric Nelson <eric.nelson@boundarydevices.com>
        nitrogen6s              i.MX6S          512MB
        nitrogen6s1g            i.MX6S          1GB
 
+Alison Wang <b18965@freescale.com>
+
+       vf610twr        VF610
+
+Sergey Yanovich <ynvich@gmail.com>
+
+       lp8x4x          xscale/pxa
+
 -------------------------------------------------------------------------
 
 Unknown / orphaned boards:
@@ -1072,9 +1098,19 @@ Unknown / orphaned boards:
 #      Board           CPU                                             #
 #########################################################################
 
-Graeme Russ <graeme.russ@gmail.com>
+Simon Glass <sjg@chromium.org>
+
+       chromebook-x86  Coreboot runs first, then U-Boot
+                       Supports Intel Sandy Bridge / Ivy Bridge so far
 
-       eNET            AMD SC520
+                       Chromebooks for x86, including:
+                               Samsung Series 5 Chromebook
+                               Acer AC700 Chromebook
+                               Acer C7 Chromebook
+                               Samsung Chromebook 550
+                               HP Pavillion Chromebook
+                               Acer C710 Chromebook
+                               Chromebook Pixel
 
 #########################################################################
 # MIPS Systems:                                                                #
@@ -1339,6 +1375,17 @@ Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
 
        openrisc-generic        OpenRISC
 
+#########################################################################
+# Sandbox:                                                             #
+#                                                                      #
+# Maintainer Name, Email Address                                       #
+#      Board           CPU                                             #
+#########################################################################
+
+Simon Glass <sjg@chromium.org>
+
+       sandbox         sandbox
+
 #########################################################################
 # End of MAINTAINERS list                                              #
 #########################################################################
index dbc4b709b6a7315506937b59e22774adec4ca67a..af4c3c0a98daac04d010a165cfb83e6023fde088 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -341,7 +341,7 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(C
 LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
 endif
 
-ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx31 mx35))
+ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx31 mx35 mxs vf610))
 LIBS-y += arch/$(ARCH)/imx-common/libimx-common.o
 endif
 
@@ -522,13 +522,9 @@ $(obj)u-boot.ais:       $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
                cat $(obj)spl/u-boot-spl-pad.ais $(obj)u-boot.img > \
                        $(obj)u-boot.ais
 
-# Specify the target for use in elftosb call
-ELFTOSB_TARGET-$(CONFIG_MX23) = imx23
-ELFTOSB_TARGET-$(CONFIG_MX28) = imx28
 
 $(obj)u-boot.sb:       $(obj)u-boot.bin $(obj)spl/u-boot-spl.bin
-               elftosb -zf $(ELFTOSB_TARGET-y) -c $(TOPDIR)/$(CPUDIR)/$(SOC)/u-boot-$(ELFTOSB_TARGET-y).bd \
-                       -o $(obj)u-boot.sb
+               $(MAKE) -C $(SRCTREE)/$(CPUDIR)/$(SOC)/ $(OBJTREE)/u-boot.sb
 
 # On x600 (SPEAr600) U-Boot is appended to U-Boot SPL.
 # Both images are created using mkimage (crc etc), so that the ROM
@@ -547,18 +543,15 @@ $(obj)u-boot.spr: $(obj)u-boot.img $(obj)spl/u-boot-spl.bin
                cat $(obj)spl/u-boot-spl-pad.img $(obj)u-boot.img > $@
 
 ifneq ($(CONFIG_TEGRA),)
-ifeq ($(CONFIG_OF_SEPARATE),y)
-nodtb=dtb
-dtbfile=$(obj)u-boot.dtb
-else
-nodtb=nodtb
-dtbfile=
-endif
-
-$(obj)u-boot-$(nodtb)-tegra.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin $(dtbfile)
+$(obj)u-boot-nodtb-tegra.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin
                $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(CONFIG_SYS_TEXT_BASE) -O binary $(obj)spl/u-boot-spl $(obj)spl/u-boot-spl-pad.bin
-               cat $(obj)spl/u-boot-spl-pad.bin $(obj)u-boot.bin $(dtbfile) > $@
+               cat $(obj)spl/u-boot-spl-pad.bin $(obj)u-boot.bin > $@
                rm $(obj)spl/u-boot-spl-pad.bin
+
+ifeq ($(CONFIG_OF_SEPARATE),y)
+$(obj)u-boot-dtb-tegra.bin: $(obj)u-boot-nodtb-tegra.bin $(obj)u-boot.dtb
+               cat $(obj)u-boot-nodtb-tegra.bin $(obj)u-boot.dtb > $@
+endif
 endif
 
 $(obj)u-boot-img.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
@@ -871,6 +864,7 @@ clobber:    tidy
        @rm -f $(obj)u-boot.ais
        @rm -f $(obj)u-boot.dtb
        @rm -f $(obj)u-boot.sb
+       @rm -f $(obj)u-boot.bd
        @rm -f $(obj)u-boot.spr
        @rm -f $(obj)nand_spl/{u-boot.{lds,lst},System.map}
        @rm -f $(obj)nand_spl/{u-boot-nand_spl.lds,u-boot-spl,u-boot-spl.map}
diff --git a/README b/README
index 3d81092057bcaf0a77b6f5112d37d35eccea9613..ac1ec44d155b06620303a6ccf7672fd2f15e5201 100644 (file)
--- a/README
+++ b/README
@@ -843,6 +843,7 @@ The following options need to be configured:
                CONFIG_CMD_FDOS         * Dos diskette Support
                CONFIG_CMD_FLASH          flinfo, erase, protect
                CONFIG_CMD_FPGA           FPGA device initialization support
+               CONFIG_CMD_FUSE           Device fuse support
                CONFIG_CMD_GETTIME      * Get time since boot
                CONFIG_CMD_GO           * the 'go' command (exec code)
                CONFIG_CMD_GREPENV      * search environment
@@ -1208,7 +1209,23 @@ The following options need to be configured:
                        If this option is set, the driver enables cache flush.
 
 - TPM Support:
-               CONFIG_GENERIC_LPC_TPM
+               CONFIG_TPM
+               Support TPM devices.
+
+               CONFIG_TPM_TIS_I2C
+               Support for i2c bus TPM devices. Only one device
+               per system is supported at this time.
+
+                       CONFIG_TPM_TIS_I2C_BUS_NUMBER
+                       Define the the i2c bus number for the TPM device
+
+                       CONFIG_TPM_TIS_I2C_SLAVE_ADDRESS
+                       Define the TPM's address on the i2c bus
+
+                       CONFIG_TPM_TIS_I2C_BURST_LIMITATION
+                       Define the burst count bytes upper limit
+
+               CONFIG_TPM_TIS_LPC
                Support for generic parallel port TPM devices. Only one device
                per system is supported at this time.
 
@@ -1244,6 +1261,9 @@ The following options need to be configured:
                CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the
                txfilltuning field in the EHCI controller on reset.
 
+               CONFIG_USB_HUB_MIN_POWER_ON_DELAY defines the minimum
+               interval for usb hub power-on delay.(minimum 100msec)
+
 - USB Device:
                Define the below if you wish to use the USB console.
                Once firmware is rebuilt from a serial console issue the
@@ -2915,12 +2935,30 @@ FIT uImage format:
                Address, size and partition on the MMC to load U-Boot from
                when the MMC is being used in raw mode.
 
+               CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR
+               Sector to load kernel uImage from when MMC is being
+               used in raw mode (for Falcon mode)
+
+               CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
+               CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS
+               Sector and number of sectors to load kernel argument
+               parameters from when MMC is being used in raw mode
+               (for falcon mode)
+
                CONFIG_SPL_FAT_SUPPORT
                Support for fs/fat/libfat.o in SPL binary
 
                CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME
                Filename to read to load U-Boot when reading from FAT
 
+               CONFIG_SPL_FAT_LOAD_KERNEL_NAME
+               Filename to read to load kernel uImage when reading
+               from FAT (for Falcon mode)
+
+               CONFIG_SPL_FAT_LOAD_ARGS_NAME
+               Filename to read to load kernel argument parameters
+               when reading from FAT (for Falcon mode)
+
                CONFIG_SPL_MPC83XX_WAIT_FOR_NAND
                Set this for NAND SPL on PPC mpc83xx targets, so that
                start.S waits for the rest of the SPL to load before
@@ -3345,6 +3383,10 @@ Configuration Settings:
        offset _bss_start_ofs from CONFIG_SYS_TEXT_BASE, rather than
        directly. You should not need to touch this setting.
 
+- CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC (OMAP only)
+       This is set by OMAP boards for the max time that reset should
+       be asserted. See doc/README.omap-reset-time for details on how
+       the value can be calulated on a given board.
 
 The following definitions that deal with the placement and management
 of environment data (variable area); in general, we support the
@@ -3859,6 +3901,9 @@ Low Level (hardware related) configuration options:
                a second time.  Useful for platforms that are pre-booted
                by coreboot or similar.
 
+- CONFIG_PCI_INDIRECT_BRIDGE:
+               Enable support for indirect PCI bridges.
+
 - CONFIG_SYS_SRIO:
                Chip has SRIO or not
 
@@ -5063,7 +5108,7 @@ On some platforms, it's possible to boot Linux zImage. This is done
 using the "bootz" command. The syntax of "bootz" command is the same
 as the syntax of "bootm" command.
 
-Note, defining the CONFIG_SUPPORT_INITRD_RAW allows user to supply
+Note, defining the CONFIG_SUPPORT_RAW_INITRD allows user to supply
 kernel with raw initrd images. The syntax is slightly different, the
 address of the initrd must be augmented by it's size, in the following
 format: "<initrd addres>:<initrd size>".
index 461899eabc741d2ce95b02d3112014556205bde5..dc64160789cc91527cc34d46cfbc31d2a93dbdbd 100644 (file)
@@ -31,6 +31,9 @@ CONFIG_STANDALONE_LOAD_ADDR = 0xc100000
 endif
 endif
 
+LDFLAGS_FINAL += --gc-sections
+PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
+
 # Support generic board on ARM
 __HAVE_ARCH_GENERIC_BOARD := y
 
index f4ababbe5b1f20d5a12703161bfe74a5c86ee1e5..23adac088d3990bddab7c5eaaa25d7fa909d8d9d 100644 (file)
@@ -29,7 +29,6 @@ LIB   = $(obj)lib$(SOC).o
 
 COBJS  += generic.o
 COBJS  += timer.o
-COBJS  += iomux.o
 COBJS  += mx35_sdram.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/arch/arm/cpu/arm1136/mx35/iomux.c b/arch/arm/cpu/arm1136/mx35/iomux.c
deleted file mode 100644 (file)
index a302575..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * 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/imx-regs.h>
-#include <asm/arch/mx35_pins.h>
-#include <asm/arch/iomux.h>
-
-/*
- * IOMUX register (base) addresses
- */
-enum iomux_reg_addr {
-       IOMUXGPR = IOMUXC_BASE_ADDR,                    /* General purpose */
-       IOMUXSW_MUX_CTL = IOMUXC_BASE_ADDR + 4,         /* MUX control */
-       IOMUXSW_MUX_END = IOMUXC_BASE_ADDR + 0x324,     /* last MUX control */
-       IOMUXSW_PAD_CTL = IOMUXC_BASE_ADDR + 0x328,     /* Pad control */
-       IOMUXSW_PAD_END = IOMUXC_BASE_ADDR + 0x794,     /* last Pad control */
-       IOMUXSW_INPUT_CTL = IOMUXC_BASE_ADDR + 0x7AC,   /* input select */
-       IOMUXSW_INPUT_END = IOMUXC_BASE_ADDR + 0x9F4,   /* last input select */
-};
-
-#define MUX_PIN_NUM_MAX                \
-               (((IOMUXSW_PAD_END - IOMUXSW_PAD_CTL) >> 2) + 1)
-#define MUX_INPUT_NUM_MUX      \
-               (((IOMUXSW_INPUT_END - IOMUXSW_INPUT_CTL) >> 2) + 1)
-
-/*
- * Request ownership for an IO pin. This function has to be the first one
- * being called before that pin is used.
- */
-void mxc_request_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)
-{
-       u32 mux_reg = PIN_TO_IOMUX_MUX(pin);
-
-       if (mux_reg != NON_MUX_I) {
-               mux_reg += IOMUXGPR;
-               writel(cfg, mux_reg);
-       }
-}
-
-/*
- * Release ownership for an IO pin
- */
-void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)
-{
-}
-
-/*
- * This function configures the pad value for a IOMUX pin.
- *
- * @param  pin     a pin number as defined in iomux_pin_name_t
- * @param  config  the ORed value of elements defined in iomux_pad_config_t
- */
-void mxc_iomux_set_pad(iomux_pin_name_t pin, u32 config)
-{
-       u32 pad_reg = IOMUXGPR + PIN_TO_IOMUX_PAD(pin);
-
-       writel(config, pad_reg);
-}
-
-/*
- * This function enables/disables the general purpose function for a particular
- * signal.
- *
- * @param  gp   one signal as defined in iomux_gp_func_t
- * @param  en   enable/disable
- */
-void mxc_iomux_set_gpr(iomux_gp_func_t gp, int en)
-{
-       u32 l;
-
-       l = readl(IOMUXGPR);
-       if (en)
-               l |= gp;
-       else
-               l &= ~gp;
-
-       writel(l, IOMUXGPR);
-}
-
-/*
- * This function configures input path.
- *
- * @param input index of input select register as defined in
- *                     iomux_input_select_t
- * @param config the binary value of elements defined in
- *                     iomux_input_config_t
- */
-void mxc_iomux_set_input(iomux_input_select_t input, u32 config)
-{
-       u32 reg = IOMUXSW_INPUT_CTL + (input << 2);
-
-       writel(config, reg);
-}
index ccea2d5cb4248e9fb1c7f13978d2842984b83e1d..a7e0c28c9015ac9fa8a3d118eb8c9feb8e78a3ce 100644 (file)
@@ -104,10 +104,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -146,24 +142,6 @@ reset:
        orr     r0,r0,#0xd3
        msr     cpsr,r0
 
-#ifdef CONFIG_OMAP2420H4
-       /* Copy vectors to mask ROM indirect addr */
-       adr     r0, _start              /* r0 <- current position of code   */
-               add     r0, r0, #4                              /* skip reset vector                    */
-       mov     r2, #64                 /* r2 <- size to copy  */
-       add     r2, r0, r2              /* r2 <- source end address         */
-       mov     r1, #SRAM_OFFSET0         /* build vect addr */
-       mov     r3, #SRAM_OFFSET1
-       add     r1, r1, r3
-       mov     r3, #SRAM_OFFSET2
-       add     r1, r1, r3
-next:
-       ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
-       stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       bne     next                    /* loop until equal */
-       bl      cpy_clk_code            /* put dpll adjust code behind vectors */
-#endif
        /* the mask ROM code should have PLL and others stable */
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
        bl  cpu_init_crit
@@ -173,83 +151,6 @@ next:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-#ifndef CONFIG_SPL_BUILD
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
-#endif
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index f20da8eb7bfcc73dd146789465fd7715b75b0af8..65292bcf8d8ac2b7b95abb06299b0f039ca4d8ef 100644 (file)
@@ -112,10 +112,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -225,79 +221,6 @@ skip_tcmdisable:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 9facc7e69481db7aabc7286b4d7131bb2ad04bd8..a396ebcb715ebc121d8b4e13c7b28fecc2ea2675 100644 (file)
@@ -101,10 +101,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -155,79 +151,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       mov     pc, lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
@@ -244,9 +167,9 @@ c_runtime_cpu_setup:
  *************************************************************************
  */
 
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 cpu_init_crit:
 
-#if !defined(CONFIG_TEGRA)
        mov     ip, lr
        /*
         * before relocating, we have to setup RAM timing
@@ -255,9 +178,9 @@ cpu_init_crit:
         */
        bl      lowlevel_init
        mov     lr, ip
-#endif
 
        mov     pc, lr
+#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
 
 
 #ifndef CONFIG_SPL_BUILD
index 62500250e35e19ba7fb19f9e7e525deba883cb09..3232065129f9a975b269609cb0beb12069946ae9 100644 (file)
@@ -89,10 +89,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -194,79 +190,6 @@ copyex:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       mov     pc, lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 021e2418d8f52315b559820018c93d76b1b09f4a..97eb276b5b916ff377f74972ed1a70d02379b42e 100644 (file)
@@ -95,10 +95,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -184,79 +180,6 @@ poll1:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       mov     pc, lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 346e58faeef2ce53f49fb85eaff1da438f543dba..c4408f6c9d12c5d6f29e2cda01825825cb74bbd7 100644 (file)
@@ -35,6 +35,7 @@ COBJS-$(CONFIG_AT91SAM9263)   += at91sam9263_devices.o
 COBJS-$(CONFIG_AT91SAM9RL)     += at91sam9rl_devices.o
 COBJS-$(CONFIG_AT91SAM9M10G45) += at91sam9m10g45_devices.o
 COBJS-$(CONFIG_AT91SAM9G45)    += at91sam9m10g45_devices.o
+COBJS-$(CONFIG_AT91SAM9N12)    += at91sam9n12_devices.o
 COBJS-$(CONFIG_AT91SAM9X5)     += at91sam9x5_devices.o
 COBJS-$(CONFIG_AT91_EFLASH)    += eflash.o
 COBJS-$(CONFIG_AT91_LED)       += led.o
index 19ec615c723b062cc78c449fe7a6e4ce9b950acf..5e995e1d0720c3c8c2a32d7a07f2f36d527c4d46 100644 (file)
@@ -203,6 +203,10 @@ void at91_macb_hw_init(void)
 #if defined(CONFIG_GENERIC_ATMEL_MCI)
 void at91_mci_hw_init(void)
 {
+       /* Enable mci clock */
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+       writel(1 << ATMEL_ID_MCI, &pmc->pcer);
+
        at91_set_a_periph(AT91_PIO_PORTA, 8, 1);        /* MCCK */
 #if defined(CONFIG_ATMEL_MCI_PORTB)
        at91_set_b_periph(AT91_PIO_PORTA, 1, 1);        /* MCCDB */
diff --git a/arch/arm/cpu/arm926ejs/at91/at91sam9n12_devices.c b/arch/arm/cpu/arm926ejs/at91/at91sam9n12_devices.c
new file mode 100644 (file)
index 0000000..6eaeac0
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * (C) Copyright 2013 Atmel Corporation
+ * Josh Wu <josh.wu@atmel.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/at91_common.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/at91_pio.h>
+
+unsigned int has_lcdc()
+{
+       return 1;
+}
+
+void at91_serial0_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 0, 1);                /* TXD0 */
+       at91_set_a_periph(AT91_PIO_PORTA, 1, 0);                /* RXD0 */
+       writel(1 << ATMEL_ID_USART0, &pmc->pcer);
+}
+
+void at91_serial1_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 5, 1);                /* TXD1 */
+       at91_set_a_periph(AT91_PIO_PORTA, 6, 0);                /* RXD1 */
+       writel(1 << ATMEL_ID_USART1, &pmc->pcer);
+}
+
+void at91_serial2_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 7, 1);                /* TXD2 */
+       at91_set_a_periph(AT91_PIO_PORTA, 8, 0);                /* RXD2 */
+       writel(1 << ATMEL_ID_USART2, &pmc->pcer);
+}
+
+void at91_serial3_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_b_periph(AT91_PIO_PORTC, 22, 1);               /* TXD3 */
+       at91_set_b_periph(AT91_PIO_PORTC, 23, 0);               /* RXD3 */
+       writel(1 << ATMEL_ID_USART3, &pmc->pcer);
+}
+
+void at91_seriald_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 10, 1);               /* DTXD */
+       at91_set_a_periph(AT91_PIO_PORTA, 9, 0);                /* DRXD */
+       writel(1 << ATMEL_ID_SYS, &pmc->pcer);
+}
+
+#ifdef CONFIG_ATMEL_SPI
+void at91_spi0_hw_init(unsigned long cs_mask)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* SPI0_MISO */
+       at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* SPI0_MOSI */
+       at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* SPI0_SPCK */
+
+       /* Enable clock */
+       writel(1 << ATMEL_ID_SPI0, &pmc->pcer);
+
+       if (cs_mask & (1 << 0))
+               at91_set_pio_output(AT91_PIO_PORTA, 14, 1);
+       if (cs_mask & (1 << 1))
+               at91_set_pio_output(AT91_PIO_PORTA, 7, 1);
+       if (cs_mask & (1 << 2))
+               at91_set_pio_output(AT91_PIO_PORTA, 1, 1);
+       if (cs_mask & (1 << 3))
+               at91_set_pio_output(AT91_PIO_PORTB, 3, 1);
+}
+
+void at91_spi1_hw_init(unsigned long cs_mask)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_b_periph(AT91_PIO_PORTA, 21, 0);       /* SPI1_MISO */
+       at91_set_b_periph(AT91_PIO_PORTA, 22, 0);       /* SPI1_MOSI */
+       at91_set_b_periph(AT91_PIO_PORTA, 23, 0);       /* SPI1_SPCK */
+
+       /* Enable clock */
+       writel(1 << ATMEL_ID_SPI1, &pmc->pcer);
+
+       if (cs_mask & (1 << 0))
+               at91_set_pio_output(AT91_PIO_PORTA, 8, 1);
+       if (cs_mask & (1 << 1))
+               at91_set_pio_output(AT91_PIO_PORTA, 0, 1);
+       if (cs_mask & (1 << 2))
+               at91_set_pio_output(AT91_PIO_PORTA, 31, 1);
+       if (cs_mask & (1 << 3))
+               at91_set_pio_output(AT91_PIO_PORTA, 30, 1);
+}
+#endif
+
+void at91_mci_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTA, 17, 0);       /* MCCK */
+       at91_set_a_periph(AT91_PIO_PORTA, 16, 0);       /* MCCDA */
+       at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* MCDA0 */
+       at91_set_a_periph(AT91_PIO_PORTA, 18, 0);       /* MCDA1 */
+       at91_set_a_periph(AT91_PIO_PORTA, 19, 0);       /* MCDA2 */
+       at91_set_a_periph(AT91_PIO_PORTA, 20, 0);       /* MCDA3 */
+
+       writel(1 << ATMEL_ID_HSMCI0, &pmc->pcer);
+}
+
+#ifdef CONFIG_LCD
+void at91_lcd_hw_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       at91_set_a_periph(AT91_PIO_PORTC, 24, 0);       /* LCDDPWR */
+       at91_set_a_periph(AT91_PIO_PORTC, 26, 0);       /* LCDVSYNC */
+       at91_set_a_periph(AT91_PIO_PORTC, 27, 0);       /* LCDHSYNC */
+       at91_set_a_periph(AT91_PIO_PORTC, 28, 0);       /* LCDDOTCK */
+       at91_set_a_periph(AT91_PIO_PORTC, 29, 0);       /* LCDDEN */
+       at91_set_a_periph(AT91_PIO_PORTC, 30, 0);       /* LCDDOTCK */
+
+       at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* LCDD0 */
+       at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* LCDD1 */
+       at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* LCDD2 */
+       at91_set_a_periph(AT91_PIO_PORTC, 3, 0);        /* LCDD3 */
+       at91_set_a_periph(AT91_PIO_PORTC, 4, 0);        /* LCDD4 */
+       at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* LCDD5 */
+       at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* LCDD6 */
+       at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* LCDD7 */
+       at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* LCDD8 */
+       at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* LCDD9 */
+       at91_set_a_periph(AT91_PIO_PORTC, 10, 0);       /* LCDD10 */
+       at91_set_a_periph(AT91_PIO_PORTC, 11, 0);       /* LCDD11 */
+       at91_set_a_periph(AT91_PIO_PORTC, 12, 0);       /* LCDD12 */
+       at91_set_a_periph(AT91_PIO_PORTC, 13, 0);       /* LCDD13 */
+       at91_set_a_periph(AT91_PIO_PORTC, 14, 0);       /* LCDD14 */
+       at91_set_a_periph(AT91_PIO_PORTC, 15, 0);       /* LCDD15 */
+       at91_set_a_periph(AT91_PIO_PORTC, 16, 0);       /* LCDD16 */
+       at91_set_a_periph(AT91_PIO_PORTC, 17, 0);       /* LCDD17 */
+       at91_set_a_periph(AT91_PIO_PORTC, 18, 0);       /* LCDD18 */
+       at91_set_a_periph(AT91_PIO_PORTC, 19, 0);       /* LCDD19 */
+       at91_set_a_periph(AT91_PIO_PORTC, 20, 0);       /* LCDD20 */
+       at91_set_a_periph(AT91_PIO_PORTC, 21, 0);       /* LCDD21 */
+       at91_set_a_periph(AT91_PIO_PORTC, 22, 0);       /* LCDD22 */
+       at91_set_a_periph(AT91_PIO_PORTC, 23, 0);       /* LCDD23 */
+
+       writel(1 << ATMEL_ID_LCDC, &pmc->pcer);
+}
+#endif
index f825388ae994f3dde7dca9fd1bb4cbe67beac897..5b4923f3bfcdadcd2ecc4b2a20a711033121bd5c 100644 (file)
@@ -156,7 +156,7 @@ int at91_clock_init(unsigned long main_clock)
         */
        mckr = readl(&pmc->mckr);
 #if defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) \
-               || defined(CONFIG_AT91SAM9X5)
+               || defined(CONFIG_AT91SAM9N12) || defined(CONFIG_AT91SAM9X5)
        /* plla divisor by 2 */
        gd->arch.plla_rate_hz /= (1 << ((mckr & 1 << 12) >> 12));
 #endif
@@ -171,7 +171,7 @@ int at91_clock_init(unsigned long main_clock)
        if (mckr & AT91_PMC_MCKR_MDIV_MASK)
                freq /= 2;                      /* processor clock division */
 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) \
-               || defined(CONFIG_AT91SAM9X5)
+               || defined(CONFIG_AT91SAM9N12) || defined(CONFIG_AT91SAM9X5)
        /* mdiv <==> divisor
         *  0   <==>   1
         *  1   <==>   2
index dec7bfbfaa4ea81e6b04e5c25d3adb9aa4b9e5a0..bba4671f7877ac5bca3a51521bdea9f45af8584b 100644 (file)
@@ -33,6 +33,7 @@ COBJS-$(CONFIG_SOC_DM355)     += dm355.o
 COBJS-$(CONFIG_SOC_DM365)      += dm365.o
 COBJS-$(CONFIG_SOC_DM644X)     += dm644x.o
 COBJS-$(CONFIG_SOC_DM646X)     += dm646x.o
+COBJS-$(CONFIG_SOC_DA830)      += da830_pinmux.o
 COBJS-$(CONFIG_SOC_DA850)      += da850_pinmux.o
 COBJS-$(CONFIG_DRIVER_TI_EMAC) += lxt972.o dp83848.o et1011c.o ksz8873.o
 
diff --git a/arch/arm/cpu/arm926ejs/davinci/da830_pinmux.c b/arch/arm/cpu/arm926ejs/davinci/da830_pinmux.c
new file mode 100644 (file)
index 0000000..d0c964a
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Pinmux configurations for the DA830 SoCs
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <asm/arch/davinci_misc.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/pinmux_defs.h>
+
+/* SPI0 pin muxer settings */
+const struct pinmux_config spi0_pins_base[] = {
+       { pinmux(7), 1, 3 },  /* SPI0_SOMI */
+       { pinmux(7), 1, 4 },  /* SPI0_SIMO */
+       { pinmux(7), 1, 6 }   /* SPI0_CLK */
+};
+
+const struct pinmux_config spi0_pins_scs0[] = {
+       { pinmux(7), 1, 7 }   /* SPI0_SCS[0] */
+};
+
+const struct pinmux_config spi0_pins_ena[] = {
+       { pinmux(7), 1, 5 }   /* SPI0_ENA */
+};
+
+/* NAND pin muxer settings */
+const struct pinmux_config emifa_pins_cs0[] = {
+       { pinmux(18), 1, 2 }   /* EMA_CS[0] */
+};
+
+const struct pinmux_config emifa_pins_cs2[] = {
+       { pinmux(18), 1, 3 }   /* EMA_CS[2] */
+};
+
+const struct pinmux_config emifa_pins_cs3[] = {
+       { pinmux(18), 1, 4 }   /* EMA_CS[3] */
+};
+
+#ifdef CONFIG_USE_NAND
+const struct pinmux_config emifa_pins[] = {
+       { pinmux(13), 1, 6 },  /* EMA_D[0] */
+       { pinmux(13), 1, 7 },  /* EMA_D[1] */
+       { pinmux(14), 1, 0 },  /* EMA_D[2] */
+       { pinmux(14), 1, 1 },  /* EMA_D[3] */
+       { pinmux(14), 1, 2 },  /* EMA_D[4] */
+       { pinmux(14), 1, 3 },  /* EMA_D[5] */
+       { pinmux(14), 1, 4 },  /* EMA_D[6] */
+       { pinmux(14), 1, 5 },  /* EMA_D[7] */
+       { pinmux(14), 1, 6 },  /* EMA_D[8] */
+       { pinmux(14), 1, 7 },  /* EMA_D[9] */
+       { pinmux(15), 1, 0 },  /* EMA_D[10] */
+       { pinmux(15), 1, 1 },  /* EMA_D[11] */
+       { pinmux(15), 1, 2 },  /* EMA_D[12] */
+       { pinmux(15), 1, 3 },  /* EMA_D[13] */
+       { pinmux(15), 1, 4 },  /* EMA_D[14] */
+       { pinmux(15), 1, 5 },  /* EMA_D[15] */
+       { pinmux(15), 1, 6 },  /* EMA_A[0] */
+       { pinmux(15), 1, 7 },  /* EMA_A[1] */
+       { pinmux(16), 1, 0 },  /* EMA_A[2] */
+       { pinmux(16), 1, 1 },  /* EMA_A[3] */
+       { pinmux(16), 1, 2 },  /* EMA_A[4] */
+       { pinmux(16), 1, 3 },  /* EMA_A[5] */
+       { pinmux(16), 1, 4 },  /* EMA_A[6] */
+       { pinmux(16), 1, 5 },  /* EMA_A[7] */
+       { pinmux(16), 1, 6 },  /* EMA_A[8] */
+       { pinmux(16), 1, 7 },  /* EMA_A[9] */
+       { pinmux(17), 1, 0 },  /* EMA_A[10] */
+       { pinmux(17), 1, 1 },  /* EMA_A[11] */
+       { pinmux(17), 1, 2 },  /* EMA_A[12] */
+       { pinmux(17), 1, 3 },  /* EMA_BA[1] */
+       { pinmux(17), 1, 4 },  /* EMA_BA[0] */
+       { pinmux(17), 1, 5 },  /* EMA_CLK */
+       { pinmux(17), 1, 6 },  /* EMA_SDCKE */
+       { pinmux(17), 1, 7 },  /* EMA_CAS */
+       { pinmux(18), 1, 0 },  /* EMA_CAS */
+       { pinmux(18), 1, 1 },  /* EMA_WE */
+       { pinmux(18), 1, 5 },  /* EMA_OE */
+       { pinmux(18), 1, 6 },  /* EMA_WE_DQM[1] */
+       { pinmux(18), 1, 7 },  /* EMA_WE_DQM[0] */
+       { pinmux(10), 1, 0 }   /* Tristate */
+};
+#endif
+
+/* EMAC PHY interface pins */
+const struct pinmux_config emac_pins_rmii[] = {
+       { pinmux(10), 2, 1 },  /* RMII_TXD[0] */
+       { pinmux(10), 2, 2 },  /* RMII_TXD[1] */
+       { pinmux(10), 2, 3 },  /* RMII_TXEN */
+       { pinmux(10), 2, 4 },  /* RMII_CRS_DV */
+       { pinmux(10), 2, 5 },  /* RMII_RXD[0] */
+       { pinmux(10), 2, 6 },  /* RMII_RXD[1] */
+       { pinmux(10), 2, 7 }   /* RMII_RXER */
+};
+
+const struct pinmux_config emac_pins_mdio[] = {
+       { pinmux(11), 2, 0 },  /* MDIO_CLK */
+       { pinmux(11), 2, 1 }   /* MDIO_D */
+};
+
+const struct pinmux_config emac_pins_rmii_clk_source[] = {
+       { pinmux(9), 0, 5 }    /* ref.clk from external source */
+};
+
+/* UART2 pin muxer settings */
+const struct pinmux_config uart2_pins_txrx[] = {
+       { pinmux(8), 2, 7 },   /* UART2_RXD */
+       { pinmux(9), 2, 0 }    /* UART2_TXD */
+};
+
+/* I2C0 pin muxer settings */
+const struct pinmux_config i2c0_pins[] = {
+       { pinmux(8), 2, 3 },   /* I2C0_SDA */
+       { pinmux(8), 2, 4 }    /* I2C0_SCL */
+};
+
+/* USB0_DRVVBUS pin muxer settings */
+const struct pinmux_config usb_pins[] = {
+       { pinmux(9), 1, 1 }    /* USB0_DRVVBUS */
+};
+
+#ifdef CONFIG_DAVINCI_MMC
+/* MMC0 pin muxer settings */
+const struct pinmux_config mmc0_pins_8bit[] = {
+       { pinmux(15), 2, 7 },  /* MMCSD0_CLK */
+       { pinmux(16), 2, 0 },  /* MMCSD0_CMD */
+       { pinmux(13), 2, 6 },  /* MMCSD0_DAT_0 */
+       { pinmux(13), 2, 7 },  /* MMCSD0_DAT_1 */
+       { pinmux(14), 2, 0 },  /* MMCSD0_DAT_2 */
+       { pinmux(14), 2, 1 },  /* MMCSD0_DAT_3 */
+       { pinmux(14), 2, 2 },  /* MMCSD0_DAT_4 */
+       { pinmux(14), 2, 3 },  /* MMCSD0_DAT_5 */
+       { pinmux(14), 2, 4 },  /* MMCSD0_DAT_6 */
+       { pinmux(14), 2, 5 }   /* MMCSD0_DAT_7 */
+       /* DA830 supports 8-bit mode */
+};
+#endif
index ff2e2e33dff71f9857dc12d71945f8cb4926b0fa..127beb86bc24e65ee438f87c7e5677ee18a93995 100644 (file)
 #include <asm/arch/emif_defs.h>
 #include <asm/arch/pll_defs.h>
 
+void davinci_enable_uart0(void)
+{
+       lpsc_on(DAVINCI_LPSC_UART0);
+
+       /* Bringup UART0 out of reset */
+       REG(UART0_PWREMU_MGMT) = 0x00006001;
+}
+
 #if defined(CONFIG_SYS_DA850_PLL_INIT)
 void da850_waitloop(unsigned long loopcnt)
 {
index 679273b2b4dc66828726877ffb9bb74b91da1ca8..7cbbe65784a4bdbcb4df4ac9f2397f304fb1efbd 100644 (file)
@@ -27,7 +27,6 @@
 #include <netdev.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/imx25-pinmux.h>
 #include <asm/arch/clock.h>
 
 #ifdef CONFIG_FSL_ESDHC
@@ -248,123 +247,7 @@ int cpu_mmc_init(bd_t *bis)
 }
 #endif
 
-#ifdef CONFIG_MXC_UART
-void mx25_uart1_init_pins(void)
-{
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       u32 inpadctl;
-       u32 outpadctl;
-       u32 muxmode0;
-
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-       muxmode0 = MX25_PIN_MUX_MODE(0);
-       /*
-        * set up input pins with hysteresis and 100K pull-ups
-        */
-       inpadctl = MX25_PIN_PAD_CTL_HYS
-           | MX25_PIN_PAD_CTL_PKE
-           | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PU;
-
-       /*
-        * set up output pins with 100K pull-downs
-        * FIXME: need to revisit this
-        *      PUE is ignored if PKE is not set
-        *      so the right value here is likely
-        *        0x0 for no pull up/down
-        *      or
-        *        0xc0 for 100k pull down
-        */
-       outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD;
-
-       /* UART1 */
-       /* rxd */
-       writel(muxmode0, &muxctl->pad_uart1_rxd);
-       writel(inpadctl, &padctl->pad_uart1_rxd);
-
-       /* txd */
-       writel(muxmode0, &muxctl->pad_uart1_txd);
-       writel(outpadctl, &padctl->pad_uart1_txd);
-
-       /* rts */
-       writel(muxmode0, &muxctl->pad_uart1_rts);
-       writel(outpadctl, &padctl->pad_uart1_rts);
-
-       /* cts */
-       writel(muxmode0, &muxctl->pad_uart1_cts);
-       writel(inpadctl, &padctl->pad_uart1_cts);
-}
-#endif /* CONFIG_MXC_UART */
-
 #ifdef CONFIG_FEC_MXC
-void mx25_fec_init_pins(void)
-{
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       u32 inpadctl_100kpd;
-       u32 inpadctl_22kpu;
-       u32 outpadctl;
-       u32 muxmode0;
-
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-       muxmode0 = MX25_PIN_MUX_MODE(0);
-       inpadctl_100kpd = MX25_PIN_PAD_CTL_HYS
-           | MX25_PIN_PAD_CTL_PKE
-           | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD;
-       inpadctl_22kpu = MX25_PIN_PAD_CTL_HYS
-           | MX25_PIN_PAD_CTL_PKE
-           | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_22K_PU;
-       /*
-        * set up output pins with 100K pull-downs
-        * FIXME: need to revisit this
-        *      PUE is ignored if PKE is not set
-        *      so the right value here is likely
-        *        0x0 for no pull
-        *      or
-        *        0xc0 for 100k pull down
-        */
-       outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD;
-
-       /* FEC_TX_CLK */
-       writel(muxmode0, &muxctl->pad_fec_tx_clk);
-       writel(inpadctl_100kpd, &padctl->pad_fec_tx_clk);
-
-       /* FEC_RX_DV */
-       writel(muxmode0, &muxctl->pad_fec_rx_dv);
-       writel(inpadctl_100kpd, &padctl->pad_fec_rx_dv);
-
-       /* FEC_RDATA0 */
-       writel(muxmode0, &muxctl->pad_fec_rdata0);
-       writel(inpadctl_100kpd, &padctl->pad_fec_rdata0);
-
-       /* FEC_TDATA0 */
-       writel(muxmode0, &muxctl->pad_fec_tdata0);
-       writel(outpadctl, &padctl->pad_fec_tdata0);
-
-       /* FEC_TX_EN */
-       writel(muxmode0, &muxctl->pad_fec_tx_en);
-       writel(outpadctl, &padctl->pad_fec_tx_en);
-
-       /* FEC_MDC */
-       writel(muxmode0, &muxctl->pad_fec_mdc);
-       writel(outpadctl, &padctl->pad_fec_mdc);
-
-       /* FEC_MDIO */
-       writel(muxmode0, &muxctl->pad_fec_mdio);
-       writel(inpadctl_22kpu, &padctl->pad_fec_mdio);
-
-       /* FEC_RDATA1 */
-       writel(muxmode0, &muxctl->pad_fec_rdata1);
-       writel(inpadctl_100kpd, &padctl->pad_fec_rdata1);
-
-       /* FEC_TDATA1 */
-       writel(muxmode0, &muxctl->pad_fec_tdata1);
-       writel(outpadctl, &padctl->pad_fec_tdata1);
-
-}
-
 void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 {
        int i;
index eeecf89f8b84bf5332dea4dd5f986de7d7470950..038c1c1d82bfe9b7911e5277957a2ed44347399a 100644 (file)
@@ -40,6 +40,16 @@ all: $(obj).depend $(LIB)
 $(LIB):        $(OBJS)
        $(call cmd_link_o_target, $(OBJS))
 
+# Specify the target for use in elftosb call
+ELFTOSB_TARGET-$(CONFIG_MX23) = imx23
+ELFTOSB_TARGET-$(CONFIG_MX28) = imx28
+
+$(OBJTREE)/u-boot.bd: $(SRCTREE)/$(CPUDIR)/$(SOC)/u-boot-$(ELFTOSB_TARGET-y).bd
+       sed "s@OBJTREE@$(OBJTREE)@g" $^ > $@
+
+$(OBJTREE)/u-boot.sb: $(OBJTREE)/u-boot.bin $(OBJTREE)/spl/u-boot-spl.bin $(OBJTREE)/u-boot.bd
+               elftosb -zf $(ELFTOSB_TARGET-y) -c $(OBJTREE)/u-boot.bd -o $(OBJTREE)/u-boot.sb
+
 #########################################################################
 
 # defines $(obj).depend target
index 43e766334c05b452fb51f26b0c47e6735db7719f..f94107fc1531a4b53a80e04112d73a06bbedf16a 100644 (file)
@@ -325,6 +325,99 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq)
                bus, tgtclk, freq);
 }
 
+void mxs_set_lcdclk(uint32_t freq)
+{
+       struct mxs_clkctrl_regs *clkctrl_regs =
+               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
+       uint32_t fp, x, k_rest, k_best, x_best, tk;
+       int32_t k_best_l = 999, k_best_t = 0, x_best_l = 0xff, x_best_t = 0xff;
+
+       if (freq == 0)
+               return;
+
+#if defined(CONFIG_MX23)
+       writel(CLKCTRL_CLKSEQ_BYPASS_PIX, &clkctrl_regs->hw_clkctrl_clkseq_clr);
+#elif defined(CONFIG_MX28)
+       writel(CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF, &clkctrl_regs->hw_clkctrl_clkseq_clr);
+#endif
+
+       /*
+        *             /               18 \     1       1
+        * freq kHz = | 480000000 Hz * --  | * --- * ------
+        *             \                x /     k     1000
+        *
+        *      480000000 Hz   18
+        *      ------------ * --
+        *        freq kHz      x
+        * k = -------------------
+        *             1000
+        */
+
+       fp = ((PLL_FREQ_KHZ * 1000) / freq) * 18;
+
+       for (x = 18; x <= 35; x++) {
+               tk = fp / x;
+               if ((tk / 1000 == 0) || (tk / 1000 > 255))
+                       continue;
+
+               k_rest = tk % 1000;
+
+               if (k_rest < (k_best_l % 1000)) {
+                       k_best_l = tk;
+                       x_best_l = x;
+               }
+
+               if (k_rest > (k_best_t % 1000)) {
+                       k_best_t = tk;
+                       x_best_t = x;
+               }
+       }
+
+       if (1000 - (k_best_t % 1000) > (k_best_l % 1000)) {
+               k_best = k_best_l;
+               x_best = x_best_l;
+       } else {
+               k_best = k_best_t;
+               x_best = x_best_t;
+       }
+
+       k_best /= 1000;
+
+#if defined(CONFIG_MX23)
+       writeb(CLKCTRL_FRAC_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_frac0_set[CLKCTRL_FRAC0_PIX]);
+       writeb(CLKCTRL_FRAC_CLKGATE | (x_best & CLKCTRL_FRAC_FRAC_MASK),
+               &clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_PIX]);
+       writeb(CLKCTRL_FRAC_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_frac0_clr[CLKCTRL_FRAC0_PIX]);
+
+       writel(CLKCTRL_PIX_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_pix_set);
+       clrsetbits_le32(&clkctrl_regs->hw_clkctrl_pix,
+                       CLKCTRL_PIX_DIV_MASK | CLKCTRL_PIX_CLKGATE,
+                       k_best << CLKCTRL_PIX_DIV_OFFSET);
+
+       while (readl(&clkctrl_regs->hw_clkctrl_pix) & CLKCTRL_PIX_BUSY)
+               ;
+#elif defined(CONFIG_MX28)
+       writeb(CLKCTRL_FRAC_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_frac1_set[CLKCTRL_FRAC1_PIX]);
+       writeb(CLKCTRL_FRAC_CLKGATE | (x_best & CLKCTRL_FRAC_FRAC_MASK),
+               &clkctrl_regs->hw_clkctrl_frac1[CLKCTRL_FRAC1_PIX]);
+       writeb(CLKCTRL_FRAC_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_frac1_clr[CLKCTRL_FRAC1_PIX]);
+
+       writel(CLKCTRL_DIS_LCDIF_CLKGATE,
+               &clkctrl_regs->hw_clkctrl_lcdif_set);
+       clrsetbits_le32(&clkctrl_regs->hw_clkctrl_lcdif,
+                       CLKCTRL_DIS_LCDIF_DIV_MASK | CLKCTRL_DIS_LCDIF_CLKGATE,
+                       k_best << CLKCTRL_DIS_LCDIF_DIV_OFFSET);
+
+       while (readl(&clkctrl_regs->hw_clkctrl_lcdif) & CLKCTRL_DIS_LCDIF_BUSY)
+               ;
+#endif
+}
+
 uint32_t mxc_get_clock(enum mxc_clock clk)
 {
        switch (clk) {
index e2b41965db5d8b3c98b12ef984962fd06106b9b4..45667bd8fb5fc9caba596560d6dfffa90d5dfa82 100644 (file)
@@ -30,7 +30,7 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
-#include <asm/arch/dma.h>
+#include <asm/imx-common/dma.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/iomux.h>
 #include <asm/arch/imx-regs.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* 1 second delay should be plenty of time for block reset. */
-#define        RESET_MAX_TIMEOUT       1000000
-
-#define        MXS_BLOCK_SFTRST        (1 << 31)
-#define        MXS_BLOCK_CLKGATE       (1 << 30)
-
 /* Lowlevel init isn't used on i.MX28, so just have a dummy here */
 inline void lowlevel_init(void) {}
 
@@ -82,70 +76,32 @@ void enable_caches(void)
 #endif
 }
 
-int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned
-                                                               int timeout)
-{
-       while (--timeout) {
-               if ((readl(&reg->reg) & mask) == mask)
-                       break;
-               udelay(1);
-       }
-
-       return !timeout;
-}
-
-int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned
-                                                               int timeout)
-{
-       while (--timeout) {
-               if ((readl(&reg->reg) & mask) == 0)
-                       break;
-               udelay(1);
-       }
-
-       return !timeout;
-}
-
-int mxs_reset_block(struct mxs_register_32 *reg)
-{
-       /* Clear SFTRST */
-       writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
-
-       if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
-               return 1;
-
-       /* Clear CLKGATE */
-       writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
-
-       /* Set SFTRST */
-       writel(MXS_BLOCK_SFTRST, &reg->reg_set);
-
-       /* Wait for CLKGATE being set */
-       if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
-               return 1;
-
-       /* Clear SFTRST */
-       writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
-
-       if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
-               return 1;
-
-       /* Clear CLKGATE */
-       writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
-
-       if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
-               return 1;
-
-       return 0;
-}
-
+/*
+ * This function will craft a jumptable at 0x0 which will redirect interrupt
+ * vectoring to proper location of U-Boot in RAM.
+ *
+ * The structure of the jumptable will be as follows:
+ *  ldr pc, [pc, #0x18] ..... for each vector, thus repeated 8 times
+ *  <destination address> ... for each previous ldr, thus also repeated 8 times
+ *
+ * The "ldr pc, [pc, #0x18]" instruction above loads address from memory at
+ * offset 0x18 from current value of PC register. Note that PC is already
+ * incremented by 4 when computing the offset, so the effective offset is
+ * actually 0x20, this the associated <destination address>. Loading the PC
+ * register with an address performs a jump to that address.
+ */
 void mx28_fixup_vt(uint32_t start_addr)
 {
-       uint32_t *vt = (uint32_t *)0x20;
+       /* ldr pc, [pc, #0x18] */
+       const uint32_t ldr_pc = 0xe59ff018;
+       /* Jumptable location is 0x0 */
+       uint32_t *vt = (uint32_t *)0x0;
        int i;
 
-       for (i = 0; i < 8; i++)
-               vt[i] = start_addr + (4 * i);
+       for (i = 0; i < 8; i++) {
+               vt[i] = ldr_pc;
+               vt[i + 8] = start_addr + (4 * i);
+       }
 }
 
 #ifdef CONFIG_ARCH_MISC_INIT
index bc2d69c85708a56adff0cfebf58bd5d36ecdfb12..07db27927f47aaaa22b9cb9e72eb272d953b91c1 100644 (file)
@@ -110,6 +110,7 @@ __weak void mxs_adjust_memory_params(uint32_t *dram_vals)
 {
 }
 
+#ifdef CONFIG_MX28
 static void initialize_dram_values(void)
 {
        int i;
@@ -118,15 +119,36 @@ static void initialize_dram_values(void)
 
        for (i = 0; i < ARRAY_SIZE(dram_vals); i++)
                writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));
+}
+#else
+static void initialize_dram_values(void)
+{
+       int i;
+
+       mxs_adjust_memory_params(dram_vals);
+
+       /*
+        * HW_DRAM_CTL27, HW_DRAM_CTL28 and HW_DRAM_CTL35 are not initialized as
+        * per FSL bootlets code.
+        *
+        * mx23 Reference Manual marks HW_DRAM_CTL27 and HW_DRAM_CTL28 as
+        * "reserved".
+        * HW_DRAM_CTL8 is setup as the last element.
+        * So skip the initialization of these HW_DRAM_CTL registers.
+        */
+       for (i = 0; i < ARRAY_SIZE(dram_vals); i++) {
+               if (i == 8 || i == 27 || i == 28 || i == 35)
+                       continue;
+               writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));
+       }
 
-#ifdef CONFIG_MX23
        /*
         * Enable tRAS lockout in HW_DRAM_CTL08 ; it must be the last
         * element to be set
         */
        writel((1 << 24), MXS_DRAM_BASE + (4 * 8));
-#endif
 }
+#endif
 
 static void mxs_mem_init_clock(void)
 {
@@ -234,17 +256,9 @@ static void mx23_mem_setup_vddmem(void)
        struct mxs_power_regs *power_regs =
                (struct mxs_power_regs *)MXS_POWER_BASE;
 
-       writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |
-               POWER_VDDMEMCTRL_ENABLE_ILIMIT |
-               POWER_VDDMEMCTRL_ENABLE_LINREG |
-               POWER_VDDMEMCTRL_PULLDOWN_ACTIVE,
-               &power_regs->hw_power_vddmemctrl);
+       clrbits_le32(&power_regs->hw_power_vddmemctrl,
+               POWER_VDDMEMCTRL_ENABLE_ILIMIT);
 
-       early_delay(10000);
-
-       writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |
-               POWER_VDDMEMCTRL_ENABLE_LINREG,
-               &power_regs->hw_power_vddmemctrl);
 }
 
 static void mx23_mem_init(void)
@@ -267,22 +281,18 @@ static void mx23_mem_init(void)
 
        initialize_dram_values();
 
-       /* Set START bit in DRAM_CTL16 */
+       /* Set START bit in DRAM_CTL8 */
        setbits_le32(MXS_DRAM_BASE + 0x20, 1 << 16);
 
        clrbits_le32(MXS_DRAM_BASE + 0x40, 1 << 17);
        early_delay(20000);
 
        /* Adjust EMI port priority. */
-       clrsetbits_le32(0x80020000, 0x1f << 16, 0x8);
+       clrsetbits_le32(0x80020000, 0x1f << 16, 0x2);
        early_delay(20000);
 
        setbits_le32(MXS_DRAM_BASE + 0x40, 1 << 19);
        setbits_le32(MXS_DRAM_BASE + 0x40, 1 << 11);
-
-       /* Wait for bit 10 (DRAM init complete) in DRAM_CTL18 */
-       while (!(readl(MXS_DRAM_BASE + 0x48) & (1 << 10)))
-               ;
 }
 #endif
 
index 287c698ff7994fe271d4f3e63c15d5fec94f3534..21cac7b332365d62f2865148a4327da4b8269929 100644 (file)
@@ -687,6 +687,12 @@ static void mxs_power_configure_power_source(void)
        mxs_init_batt_bo();
 
        mxs_switch_vddd_to_dcdc_source();
+
+#ifdef CONFIG_MX23
+       /* Fire up the VDDMEM LinReg now that we're all set. */
+       writel(POWER_VDDMEMCTRL_ENABLE_LINREG | POWER_VDDMEMCTRL_ENABLE_ILIMIT,
+               &power_regs->hw_power_vddmemctrl);
+#endif
 }
 
 static void mxs_enable_output_rail_protection(void)
@@ -781,7 +787,11 @@ struct mxs_vddx_cfg {
 static const struct mxs_vddx_cfg mxs_vddio_cfg = {
        .reg                    = &(((struct mxs_power_regs *)MXS_POWER_BASE)->
                                        hw_power_vddioctrl),
+#if defined(CONFIG_MX23)
+       .step_mV                = 25,
+#else
        .step_mV                = 50,
+#endif
        .lowest_mV              = 2800,
        .powered_by_linreg      = mxs_get_vddio_power_source_off,
        .trg_mask               = POWER_VDDIOCTRL_TRG_MASK,
@@ -804,6 +814,21 @@ static const struct mxs_vddx_cfg mxs_vddd_cfg = {
        .bo_offset_offset       = POWER_VDDDCTRL_BO_OFFSET_OFFSET,
 };
 
+#ifdef CONFIG_MX23
+static const struct mxs_vddx_cfg mxs_vddmem_cfg = {
+       .reg                    = &(((struct mxs_power_regs *)MXS_POWER_BASE)->
+                                       hw_power_vddmemctrl),
+       .step_mV                = 50,
+       .lowest_mV              = 1700,
+       .powered_by_linreg      = NULL,
+       .trg_mask               = POWER_VDDMEMCTRL_TRG_MASK,
+       .bo_irq                 = 0,
+       .bo_enirq               = 0,
+       .bo_offset_mask         = 0,
+       .bo_offset_offset       = 0,
+};
+#endif
+
 static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
                                uint32_t new_target, uint32_t new_brownout)
 {
@@ -821,9 +846,10 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
        cur_target += cfg->lowest_mV;
 
        adjust_up = new_target > cur_target;
-       powered_by_linreg = cfg->powered_by_linreg();
+       if (cfg->powered_by_linreg)
+               powered_by_linreg = cfg->powered_by_linreg();
 
-       if (adjust_up) {
+       if (adjust_up && cfg->bo_irq) {
                if (powered_by_linreg) {
                        bo_int = readl(cfg->reg);
                        clrbits_le32(cfg->reg, cfg->bo_enirq);
@@ -864,14 +890,16 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
                cur_target += cfg->lowest_mV;
        } while (new_target > cur_target);
 
-       if (adjust_up && powered_by_linreg) {
-               writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr);
-               if (bo_int & cfg->bo_enirq)
-                       setbits_le32(cfg->reg, cfg->bo_enirq);
-       }
+       if (cfg->bo_irq) {
+               if (adjust_up && powered_by_linreg) {
+                       writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr);
+                       if (bo_int & cfg->bo_enirq)
+                               setbits_le32(cfg->reg, cfg->bo_enirq);
+               }
 
-       clrsetbits_le32(cfg->reg, cfg->bo_offset_mask,
-                       new_brownout << cfg->bo_offset_offset);
+               clrsetbits_le32(cfg->reg, cfg->bo_offset_mask,
+                               new_brownout << cfg->bo_offset_offset);
+       }
 }
 
 static void mxs_setup_batt_detect(void)
@@ -910,7 +938,9 @@ void mxs_power_init(void)
 
        mxs_power_set_vddx(&mxs_vddio_cfg, 3300, 3150);
        mxs_power_set_vddx(&mxs_vddd_cfg, 1500, 1000);
-
+#ifdef CONFIG_MX23
+       mxs_power_set_vddx(&mxs_vddmem_cfg, 2500, 1700);
+#endif
        writel(POWER_CTRL_VDDD_BO_IRQ | POWER_CTRL_VDDA_BO_IRQ |
                POWER_CTRL_VDDIO_BO_IRQ | POWER_CTRL_VDD5V_DROOP_IRQ |
                POWER_CTRL_VBUS_VALID_IRQ | POWER_CTRL_BATT_BO_IRQ |
index 3a51879d5e4abb64b2a0ee096bfc78ae4710cf3a..8b6c30e8e9b02cdd0fa0da8e18be70c81aa3385d 100644 (file)
@@ -4,8 +4,8 @@ options {
 }
 
 sources {
-       u_boot_spl="spl/u-boot-spl.bin";
-       u_boot="u-boot.bin";
+       u_boot_spl="OBJTREE/spl/u-boot-spl.bin";
+       u_boot="OBJTREE/u-boot.bin";
 }
 
 section (0) {
index c60615a45671a59145aecd43e61a209bd9216b3f..a5fa6483a93cbf241f3ff96b5609ee6b5f27d998 100644 (file)
@@ -1,6 +1,6 @@
 sources {
-       u_boot_spl="spl/u-boot-spl.bin";
-       u_boot="u-boot.bin";
+       u_boot_spl="OBJTREE/spl/u-boot-spl.bin";
+       u_boot="OBJTREE/u-boot.bin";
 }
 
 section (0) {
index 4c5671109d43e49f3274b53c07376c98320762e5..5fc8e0459474165aa2b899e1a3e3feaeaf345b27 100644 (file)
@@ -136,10 +136,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -190,83 +186,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-#ifndef CONFIG_SPL_BUILD
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
-#endif
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 9c2b70db0db115bcc2529ce0eabbdf492a0bfbfb..e9d0c34c93a34a5e50408b44c8f496215bfd5b98 100644 (file)
@@ -105,10 +105,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -159,79 +155,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       mov     pc, lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 5e8c5289fc63c8491cd0566361b7b9f696ebea6e..8dfd9197473c9c613fe0c2c9880ffcb6bb901025 100644 (file)
@@ -101,10 +101,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -155,79 +151,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index cb4210f6e66f7dc64f659cd670abfb9aab7ddddd..8b2878d4ff157fb9a64382954e00073b61ba4644 100644 (file)
@@ -109,6 +109,8 @@ struct ad_pll {
 #define OSC_SRC_CTRL                   (PLL_SUBSYS_BASE + 0x2C0)
 
 /* PRCM */
+#define ENET_CLKCTRL_CMPL              0x30000
+
 #define CM_DEFAULT_BASE                        (PRCM_BASE + 0x0500)
 
 struct cm_def {
@@ -183,7 +185,7 @@ struct cm_alwon {
        unsigned int resv5[2];
        unsigned int gpmcclkctrl;
        unsigned int ethernet0clkctrl;
-       unsigned int resv6[1];
+       unsigned int ethernet1clkctrl;
        unsigned int mpuclkctrl;
        unsigned int debugssclkctrl;
        unsigned int l3clkctrl;
@@ -203,9 +205,67 @@ struct cm_alwon {
        unsigned int custefuseclkctrl;
 };
 
+#define SATA_PLL_BASE                  (CTRL_BASE + 0x0720)
+
+struct sata_pll {
+       unsigned int pllcfg0;
+       unsigned int pllcfg1;
+       unsigned int pllcfg2;
+       unsigned int pllcfg3;
+       unsigned int pllcfg4;
+       unsigned int pllstatus;
+       unsigned int rxstatus;
+       unsigned int txstatus;
+       unsigned int testcfg;
+};
+
+#define SEL_IN_FREQ            (0x1 << 31)
+#define DIGCLRZ                        (0x1 << 30)
+#define ENDIGLDO               (0x1 << 4)
+#define APLL_CP_CURR           (0x1 << 3)
+#define ENBGSC_REF             (0x1 << 2)
+#define ENPLLLDO               (0x1 << 1)
+#define ENPLL                  (0x1 << 0)
+
+#define SATA_PLLCFG0_1 (SEL_IN_FREQ | ENBGSC_REF)
+#define SATA_PLLCFG0_2 (SEL_IN_FREQ | ENDIGLDO | ENBGSC_REF)
+#define SATA_PLLCFG0_3 (SEL_IN_FREQ | ENDIGLDO | ENBGSC_REF | ENPLLLDO)
+#define SATA_PLLCFG0_4 (SEL_IN_FREQ | DIGCLRZ | ENDIGLDO | ENBGSC_REF | \
+                       ENPLLLDO | ENPLL)
+
+#define PLL_LOCK               (0x1 << 0)
+
+#define ENSATAMODE             (0x1 << 31)
+#define PLLREFSEL              (0x1 << 30)
+#define MDIVINT                        (0x4b << 18)
+#define EN_CLKAUX              (0x1 << 5)
+#define EN_CLK125M             (0x1 << 4)
+#define EN_CLK100M             (0x1 << 3)
+#define EN_CLK50M              (0x1 << 2)
+
+#define SATA_PLLCFG1 (ENSATAMODE |     \
+                     PLLREFSEL |       \
+                     MDIVINT |         \
+                     EN_CLKAUX |       \
+                     EN_CLK125M |      \
+                     EN_CLK100M |      \
+                     EN_CLK50M)
+
+#define DIGLDO_EN_CAPLESSMODE  (0x1 << 22)
+#define PLLDO_EN_LDO_STABLE    (0x1 << 11)
+#define PLLDO_EN_BUF_CUR       (0x1 << 7)
+#define PLLDO_EN_LP            (0x1 << 6)
+#define PLLDO_CTRL_TRIM_1_4V   (0x10 << 1)
+
+#define SATA_PLLCFG3 (DIGLDO_EN_CAPLESSMODE |  \
+                     PLLDO_EN_LDO_STABLE |     \
+                     PLLDO_EN_BUF_CUR |        \
+                     PLLDO_EN_LP |             \
+                     PLLDO_CTRL_TRIM_1_4V)
 
 const struct cm_alwon *cmalwon = (struct cm_alwon *)CM_ALWON_BASE;
 const struct cm_def *cmdef = (struct cm_def *)CM_DEFAULT_BASE;
+const struct sata_pll *spll = (struct sata_pll *)SATA_PLL_BASE;
 
 /*
  * Enable the peripheral clock for required peripherals
@@ -221,6 +281,15 @@ static void enable_per_clocks(void)
        writel(PRCM_MOD_EN, &cmalwon->mmchs1clkctrl);
        while (readl(&cmalwon->mmchs1clkctrl) != PRCM_MOD_EN)
                ;
+
+       /* Ethernet */
+       writel(PRCM_MOD_EN, &cmalwon->ethclkstctrl);
+       writel(PRCM_MOD_EN, &cmalwon->ethernet0clkctrl);
+       while ((readl(&cmalwon->ethernet0clkctrl) & ENET_CLKCTRL_CMPL) != 0)
+               ;
+       writel(PRCM_MOD_EN, &cmalwon->ethernet1clkctrl);
+       while ((readl(&cmalwon->ethernet1clkctrl) & ENET_CLKCTRL_CMPL) != 0)
+               ;
 }
 
 /*
@@ -365,6 +434,35 @@ void ddr_pll_config(unsigned int ddrpll_m)
        pll_config(DDR_PLL_BASE, DDR_N, DDR_M, DDR_M2, DDR_CLKCTRL, 1);
 }
 
+void sata_pll_config(void)
+{
+       /*
+        * This sequence for configuring the SATA PLL
+        * resident in the control module is documented
+        * in TI8148 TRM section 21.3.1
+        */
+       writel(SATA_PLLCFG1, &spll->pllcfg1);
+       udelay(50);
+
+       writel(SATA_PLLCFG3, &spll->pllcfg3);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_1, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_2, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_3, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_4, &spll->pllcfg0);
+       udelay(50);
+
+       while (((readl(&spll->pllstatus) & PLL_LOCK) == 0))
+               ;
+}
+
 void enable_emif_clocks(void) {};
 
 void enable_dmm_clocks(void)
@@ -397,9 +495,10 @@ void pll_init()
        /* Enable the control module */
        writel(PRCM_MOD_EN, &cmalwon->controlclkctrl);
 
+       /* Configure PLLs */
        mpu_pll_config();
-
        l3_pll_config();
+       sata_pll_config();
 
        /* Enable the required peripherals */
        enable_per_clocks();
index 5fd8b47b2d24e1b41b87df653abd4118b37ba05c..ac049ac4f22a690bd3a59298c949aac7bc52a161 100644 (file)
@@ -92,7 +92,6 @@ u32 get_sysboot_value(void)
 int print_cpuinfo(void)
 {
        char *cpu_s, *sec_s;
-       int arm_freq, ddr_freq;
 
        switch (get_cpu_type()) {
        case AM335X:
@@ -123,10 +122,7 @@ int print_cpuinfo(void)
                sec_s = "?";
        }
 
-       printf("%s-%s rev %d\n",
-                       cpu_s, sec_s, get_cpu_rev());
-
-       /* TODO: Print ARM and DDR frequencies  */
+       printf("%s-%s rev %d\n", cpu_s, sec_s, get_cpu_rev());
 
        return 0;
 }
diff --git a/arch/arm/cpu/armv7/at91/Makefile b/arch/arm/cpu/armv7/at91/Makefile
new file mode 100644 (file)
index 0000000..040c67d
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# (C) Copyright 2000-2008
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2013
+# Bo Shen <voice.shen@atmel.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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(SOC).o
+
+COBJS-$(CONFIG_SAMA5D3)        += sama5d3_devices.o
+COBJS-y += clock.o
+COBJS-y += cpu.o
+COBJS-y += reset.o
+COBJS-y += timer.o
+
+SRCS    := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
+OBJS    := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
+
+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/armv7/at91/clock.c b/arch/arm/cpu/armv7/at91/clock.c
new file mode 100644 (file)
index 0000000..624b52c
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * [origin: Linux kernel linux/arch/arm/mach-at91/clock.c]
+ *
+ * Copyright (C) 2005 David Brownell
+ * Copyright (C) 2005 Ivan Kokshaysky
+ * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ * Copyright (C) 2013 Bo Shen <voice.shen@atmel.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.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/clk.h>
+
+#if !defined(CONFIG_AT91FAMILY)
+# error You need to define CONFIG_AT91FAMILY in your board config!
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static unsigned long at91_css_to_rate(unsigned long css)
+{
+       switch (css) {
+       case AT91_PMC_MCKR_CSS_SLOW:
+               return CONFIG_SYS_AT91_SLOW_CLOCK;
+       case AT91_PMC_MCKR_CSS_MAIN:
+               return gd->arch.main_clk_rate_hz;
+       case AT91_PMC_MCKR_CSS_PLLA:
+               return gd->arch.plla_rate_hz;
+       }
+
+       return 0;
+}
+
+static u32 at91_pll_rate(u32 freq, u32 reg)
+{
+       unsigned mul, div;
+
+       div = reg & 0xff;
+       mul = (reg >> 18) & 0x7f;
+       if (div && mul) {
+               freq /= div;
+               freq *= mul + 1;
+       } else {
+               freq = 0;
+       }
+
+       return freq;
+}
+
+int at91_clock_init(unsigned long main_clock)
+{
+       unsigned freq, mckr;
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+#ifndef CONFIG_SYS_AT91_MAIN_CLOCK
+       unsigned tmp;
+       /*
+        * When the bootloader initialized the main oscillator correctly,
+        * there's no problem using the cycle counter.  But if it didn't,
+        * or when using oscillator bypass mode, we must be told the speed
+        * of the main clock.
+        */
+       if (!main_clock) {
+               do {
+                       tmp = readl(&pmc->mcfr);
+               } while (!(tmp & AT91_PMC_MCFR_MAINRDY));
+               tmp &= AT91_PMC_MCFR_MAINF_MASK;
+               main_clock = tmp * (CONFIG_SYS_AT91_SLOW_CLOCK / 16);
+       }
+#endif
+       gd->arch.main_clk_rate_hz = main_clock;
+
+       /* report if PLLA is more than mildly overclocked */
+       gd->arch.plla_rate_hz = at91_pll_rate(main_clock, readl(&pmc->pllar));
+
+       /*
+        * MCK and CPU derive from one of those primary clocks.
+        * For now, assume this parentage won't change.
+        */
+       mckr = readl(&pmc->mckr);
+
+       /* plla divisor by 2 */
+       if (mckr & (1 << 12))
+               gd->arch.plla_rate_hz >>= 1;
+
+       gd->arch.mck_rate_hz = at91_css_to_rate(mckr & AT91_PMC_MCKR_CSS_MASK);
+       freq = gd->arch.mck_rate_hz;
+
+       /* prescale */
+       freq >>= mckr & AT91_PMC_MCKR_PRES_MASK;
+
+       switch (mckr & AT91_PMC_MCKR_MDIV_MASK) {
+       case AT91_PMC_MCKR_MDIV_2:
+               gd->arch.mck_rate_hz = freq / 2;
+               break;
+       case AT91_PMC_MCKR_MDIV_3:
+               gd->arch.mck_rate_hz = freq / 3;
+               break;
+       case AT91_PMC_MCKR_MDIV_4:
+               gd->arch.mck_rate_hz = freq / 4;
+               break;
+       default:
+               break;
+       }
+
+       gd->arch.cpu_clk_rate_hz = freq;
+
+       return 0;
+}
+
+void at91_periph_clk_enable(int id)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+
+       if (id > 31)
+               writel(1 << (id - 32), &pmc->pcer1);
+       else
+               writel(1 << id, &pmc->pcer);
+}
diff --git a/arch/arm/cpu/armv7/at91/cpu.c b/arch/arm/cpu/armv7/at91/cpu.c
new file mode 100644 (file)
index 0000000..3df6143
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * (C) Copyright 2010
+ * Reinhard Meyer, reinhard.meyer@emk-elektronik.de
+ * (C) Copyright 2009
+ * Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ * (C) Copyright 2013
+ * Bo Shen <voice.shen@atmel.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/hardware.h>
+#include <asm/arch/at91_dbu.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/at91_pit.h>
+#include <asm/arch/at91_gpbr.h>
+#include <asm/arch/clk.h>
+
+#ifndef CONFIG_SYS_AT91_MAIN_CLOCK
+#define CONFIG_SYS_AT91_MAIN_CLOCK 0
+#endif
+
+int arch_cpu_init(void)
+{
+       return at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK);
+}
+
+void arch_preboot_os(void)
+{
+       ulong cpiv;
+       at91_pit_t *pit = (at91_pit_t *)ATMEL_BASE_PIT;
+
+       cpiv = AT91_PIT_MR_PIV_MASK(readl(&pit->piir));
+
+       /*
+        * Disable PITC
+        * Add 0x1000 to current counter to stop it faster
+        * without waiting for wrapping back to 0
+        */
+       writel(cpiv + 0x1000, &pit->mr);
+}
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+       char buf[32];
+
+       printf("CPU: %s\n", get_cpu_name());
+       printf("Crystal frequency: %8s MHz\n",
+              strmhz(buf, get_main_clk_rate()));
+       printf("CPU clock        : %8s MHz\n",
+              strmhz(buf, get_cpu_clk_rate()));
+       printf("Master clock     : %8s MHz\n",
+              strmhz(buf, get_mck_clk_rate()));
+
+       return 0;
+}
+#endif
+
+void enable_caches(void)
+{
+}
+
+unsigned int get_chip_id(void)
+{
+       return readl(ATMEL_BASE_DBGU + AT91_DBU_CIDR) & ~AT91_DBU_CIDR_MASK;
+}
+
+unsigned int get_extension_chip_id(void)
+{
+       return readl(ATMEL_BASE_DBGU + AT91_DBU_EXID);
+}
diff --git a/arch/arm/cpu/armv7/at91/reset.c b/arch/arm/cpu/armv7/at91/reset.c
new file mode 100644 (file)
index 0000000..b9f83d9
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * (C) Copyright 2007-2008
+ * Stelian Pop <stelian@popies.net>
+ * Lead Tech Design <www.leadtechdesign.com>
+ *
+ * (C) Copyright 2013
+ * Bo Shen <voice.shen@atmel.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/hardware.h>
+#include <asm/arch/at91_rstc.h>
+
+/* Reset the cpu by telling the reset controller to do so */
+void reset_cpu(ulong ignored)
+{
+       at91_rstc_t *rstc = (at91_rstc_t *)ATMEL_BASE_RSTC;
+
+       writel(AT91_RSTC_KEY
+               | AT91_RSTC_CR_PROCRST  /* Processor Reset */
+               | AT91_RSTC_CR_PERRST   /* Peripheral Reset */
+#ifdef CONFIG_AT91RESET_EXTRST
+               | AT91_RSTC_CR_EXTRST   /* External Reset (assert nRST pin) */
+#endif
+               , &rstc->cr);
+       /* never reached */
+       do { } while (1);
+}
diff --git a/arch/arm/cpu/armv7/at91/sama5d3_devices.c b/arch/arm/cpu/armv7/at91/sama5d3_devices.c
new file mode 100644 (file)
index 0000000..acf8b43
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2012-2013 Atmel Corporation
+ * Bo Shen <voice.shen@atmel.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/arch/sama5d3.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/gpio.h>
+#include <asm/io.h>
+
+unsigned int has_emac()
+{
+       return cpu_is_sama5d31() || cpu_is_sama5d35();
+}
+
+unsigned int has_gmac()
+{
+       return !cpu_is_sama5d31();
+}
+
+unsigned int has_lcdc()
+{
+       return !cpu_is_sama5d35();
+}
+
+char *get_cpu_name()
+{
+       unsigned int extension_id = get_extension_chip_id();
+
+       if (cpu_is_sama5d3())
+               switch (extension_id) {
+               case ARCH_EXID_SAMA5D31:
+                       return "SAMA5D31";
+               case ARCH_EXID_SAMA5D33:
+                       return "SAMA5D33";
+               case ARCH_EXID_SAMA5D34:
+                       return "SAMA5D34";
+               case ARCH_EXID_SAMA5D35:
+                       return "SAMA5D35";
+               default:
+                       return "Unknown CPU type";
+               }
+       else
+               return "Unknown CPU type";
+}
+
+void at91_serial0_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTD, 18, 1);       /* TXD0 */
+       at91_set_a_periph(AT91_PIO_PORTD, 17, 0);       /* RXD0 */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_USART0);
+}
+
+void at91_serial1_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTB, 29, 1);       /* TXD1 */
+       at91_set_a_periph(AT91_PIO_PORTB, 28, 0);       /* RXD1 */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_USART1);
+}
+
+void at91_serial2_hw_init(void)
+{
+       at91_set_b_periph(AT91_PIO_PORTE, 26, 1);       /* TXD2 */
+       at91_set_b_periph(AT91_PIO_PORTE, 25, 0);       /* RXD2 */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_USART2);
+}
+
+void at91_seriald_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTB, 31, 1);       /* DTXD */
+       at91_set_a_periph(AT91_PIO_PORTB, 30, 0);       /* DRXD */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_SYS);
+}
+
+#if defined(CONFIG_ATMEL_SPI)
+void at91_spi0_hw_init(unsigned long cs_mask)
+{
+       at91_set_a_periph(AT91_PIO_PORTD, 10, 0);       /* SPI0_MISO */
+       at91_set_a_periph(AT91_PIO_PORTD, 11, 0);       /* SPI0_MOSI */
+       at91_set_a_periph(AT91_PIO_PORTD, 12, 0);       /* SPI0_SPCK */
+
+       if (cs_mask & (1 << 0))
+               at91_set_pio_output(AT91_PIO_PORTD, 13, 1);
+       if (cs_mask & (1 << 1))
+               at91_set_pio_output(AT91_PIO_PORTD, 14, 1);
+       if (cs_mask & (1 << 2))
+               at91_set_pio_output(AT91_PIO_PORTD, 15, 1);
+       if (cs_mask & (1 << 3))
+               at91_set_pio_output(AT91_PIO_PORTD, 16, 1);
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_SPI0);
+}
+#endif
+
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+void at91_mci_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTD, 0, 0);        /* MCI0 CMD */
+       at91_set_a_periph(AT91_PIO_PORTD, 1, 0);        /* MCI0 DA0 */
+       at91_set_a_periph(AT91_PIO_PORTD, 2, 0);        /* MCI0 DA1 */
+       at91_set_a_periph(AT91_PIO_PORTD, 3, 0);        /* MCI0 DA2 */
+       at91_set_a_periph(AT91_PIO_PORTD, 4, 0);        /* MCI0 DA3 */
+#ifdef CONFIG_ATMEL_MCI_8BIT
+       at91_set_a_periph(AT91_PIO_PORTD, 5, 0);        /* MCI0 DA4 */
+       at91_set_a_periph(AT91_PIO_PORTD, 6, 0);        /* MCI0 DA5 */
+       at91_set_a_periph(AT91_PIO_PORTD, 7, 0);        /* MCI0 DA6 */
+       at91_set_a_periph(AT91_PIO_PORTD, 8, 0);        /* MCI0 DA7 */
+#endif
+       at91_set_a_periph(AT91_PIO_PORTD, 9, 0);        /* MCI0 CLK */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_MCI0);
+}
+#endif
+
+#ifdef CONFIG_MACB
+void at91_macb_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* ETXCK_EREFCK */
+       at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* ERXDV */
+       at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* ERX0 */
+       at91_set_a_periph(AT91_PIO_PORTC, 3, 0);        /* ERX1 */
+       at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* ERXER */
+       at91_set_a_periph(AT91_PIO_PORTC, 4, 0);        /* ETXEN */
+       at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* ETX0 */
+       at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* ETX1 */
+       at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* EMDIO */
+       at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* EMDC */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_EMAC);
+}
+#endif
+
+#ifdef CONFIG_LCD
+void at91_lcd_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTA, 24, 0);       /* LCDPWM */
+       at91_set_a_periph(AT91_PIO_PORTA, 25, 0);       /* LCDDISP */
+       at91_set_a_periph(AT91_PIO_PORTA, 26, 0);       /* LCDVSYNC */
+       at91_set_a_periph(AT91_PIO_PORTA, 27, 0);       /* LCDHSYNC */
+       at91_set_a_periph(AT91_PIO_PORTA, 28, 0);       /* LCDDOTCK */
+       at91_set_a_periph(AT91_PIO_PORTA, 29, 0);       /* LCDDEN */
+
+       /* The lower 16-bit of LCD only available on Port A */
+       at91_set_a_periph(AT91_PIO_PORTA,  0, 0);       /* LCDD0 */
+       at91_set_a_periph(AT91_PIO_PORTA,  1, 0);       /* LCDD1 */
+       at91_set_a_periph(AT91_PIO_PORTA,  2, 0);       /* LCDD2 */
+       at91_set_a_periph(AT91_PIO_PORTA,  3, 0);       /* LCDD3 */
+       at91_set_a_periph(AT91_PIO_PORTA,  4, 0);       /* LCDD4 */
+       at91_set_a_periph(AT91_PIO_PORTA,  5, 0);       /* LCDD5 */
+       at91_set_a_periph(AT91_PIO_PORTA,  6, 0);       /* LCDD6 */
+       at91_set_a_periph(AT91_PIO_PORTA,  7, 0);       /* LCDD7 */
+       at91_set_a_periph(AT91_PIO_PORTA,  8, 0);       /* LCDD8 */
+       at91_set_a_periph(AT91_PIO_PORTA,  9, 0);       /* LCDD9 */
+       at91_set_a_periph(AT91_PIO_PORTA, 10, 0);       /* LCDD10 */
+       at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* LCDD11 */
+       at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* LCDD12 */
+       at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* LCDD13 */
+       at91_set_a_periph(AT91_PIO_PORTA, 14, 0);       /* LCDD14 */
+       at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* LCDD15 */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_LCDC);
+}
+#endif
diff --git a/arch/arm/cpu/armv7/at91/timer.c b/arch/arm/cpu/armv7/at91/timer.c
new file mode 100644 (file)
index 0000000..b3a450f
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * (C) Copyright 2007-2008
+ * Stelian Pop <stelian@popies.net>
+ * Lead Tech Design <www.leadtechdesign.com>
+ *
+ * (C) Copyright 2013
+ * Bo Shen <voice.shen@atmel.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/hardware.h>
+#include <asm/arch/at91_pit.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/clk.h>
+#include <div64.h>
+
+#if !defined(CONFIG_AT91FAMILY)
+# error You need to define CONFIG_AT91FAMILY in your board config!
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * We're using the SAMA5D3x PITC in 32 bit mode, by
+ * setting the 20 bit counter period to its maximum (0xfffff).
+ * (See the relevant data sheets to understand that this really works)
+ *
+ * We do also mimic the typical powerpc way of incrementing
+ * two 32 bit registers called tbl and tbu.
+ *
+ * Those registers increment at 1/16 the main clock rate.
+ */
+
+#define TIMER_LOAD_VAL 0xfffff
+
+static inline unsigned long long tick_to_time(unsigned long long tick)
+{
+       tick *= CONFIG_SYS_HZ;
+       do_div(tick, gd->arch.timer_rate_hz);
+
+       return tick;
+}
+
+static inline unsigned long long usec_to_tick(unsigned long long usec)
+{
+       usec *= gd->arch.timer_rate_hz;
+       do_div(usec, 1000000);
+
+       return usec;
+}
+
+/*
+ * Use the PITC in full 32 bit incrementing mode
+ */
+int timer_init(void)
+{
+       at91_pit_t *pit = (at91_pit_t *)ATMEL_BASE_PIT;
+
+       /* Enable PITC Clock */
+       at91_periph_clk_enable(ATMEL_ID_SYS);
+
+       /* Enable PITC */
+       writel(TIMER_LOAD_VAL | AT91_PIT_MR_EN , &pit->mr);
+
+       gd->arch.timer_rate_hz = gd->arch.mck_rate_hz / 16;
+       gd->arch.tbu = 0;
+       gd->arch.tbl = 0;
+
+       return 0;
+}
+
+/*
+ * Get the current 64 bit timer tick count
+ */
+unsigned long long get_ticks(void)
+{
+       at91_pit_t *pit = (at91_pit_t *)ATMEL_BASE_PIT;
+
+       ulong now = readl(&pit->piir);
+
+       /* increment tbu if tbl has rolled over */
+       if (now < gd->arch.tbl)
+               gd->arch.tbu++;
+       gd->arch.tbl = now;
+       return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
+}
+
+void __udelay(unsigned long usec)
+{
+       unsigned long long start;
+       ulong tmo;
+
+       start = get_ticks();            /* get current timestamp */
+       tmo = usec_to_tick(usec);       /* convert usecs to ticks */
+       while ((get_ticks() - start) < tmo)
+               ;                       /* loop till time has passed */
+}
+
+/*
+ * get_timer(base) can be used to check for timeouts or
+ * to measure elasped time relative to an event:
+ *
+ * ulong start_time = get_timer(0) sets start_time to the current
+ * time value.
+ * get_timer(start_time) returns the time elapsed since then.
+ *
+ * The time is used in CONFIG_SYS_HZ units!
+ */
+ulong get_timer(ulong base)
+{
+       return tick_to_time(get_ticks()) - base;
+}
+
+/*
+ * Return the number of timer ticks per second.
+ */
+ulong get_tbclk(void)
+{
+       return gd->arch.timer_rate_hz;
+}
index 0d45528e999ee021799bc3556ca0059d1df5ad9b..0a15aa4671ba9b065d216c5b465382138a1e736f 100644 (file)
@@ -37,7 +37,13 @@ ENTRY(lowlevel_init)
         */
        ldr     sp, =CONFIG_SYS_INIT_SP_ADDR
        bic     sp, sp, #7 /* 8-byte alignment for ABI compliance */
-
+#ifdef CONFIG_SPL_BUILD
+       ldr     r8, =gdata
+#else
+       sub     sp, #GD_SIZE
+       bic     sp, sp, #7
+       mov     r8, sp
+#endif
        /*
         * Save the old lr(passed in ip) and the current lr to stack
         */
index ecd1184213328fe974af724cc54ae72edd2332aa..e05fae91a13f490924f0cb831308cd13e42c4f57 100644 (file)
@@ -27,7 +27,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(SOC).o
 
-COBJS  = soc.o clock.o iomux.o
+COBJS  = soc.o clock.o
 SOBJS = lowlevel_init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index 76c2c529a88fb72e7a5f96e9497725b48e1f6646..431756ed696befce787a840c5738a9c7a23e9b89 100644 (file)
@@ -739,10 +739,11 @@ static int config_core_clk(u32 ref, u32 freq)
 static int config_nfc_clk(u32 nfc_clk)
 {
        u32 parent_rate = get_emi_slow_clk();
-       u32 div = parent_rate / nfc_clk;
+       u32 div;
 
-       if (nfc_clk <= 0)
+       if (nfc_clk == 0)
                return -EINVAL;
+       div = parent_rate / nfc_clk;
        if (div == 0)
                div++;
        if (parent_rate / div > NFC_CLK_MAX)
@@ -755,6 +756,15 @@ static int config_nfc_clk(u32 nfc_clk)
        return 0;
 }
 
+void enable_nfc_clk(unsigned char enable)
+{
+       unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
+
+       clrsetbits_le32(&mxc_ccm->CCGR5,
+               MXC_CCM_CCGR5_EMI_ENFC(MXC_CCM_CCGR_CG_MASK),
+               MXC_CCM_CCGR5_EMI_ENFC(cg));
+}
+
 /* Config main_bus_clock for periphs */
 static int config_periph_clk(u32 ref, u32 freq)
 {
diff --git a/arch/arm/cpu/armv7/mx5/iomux.c b/arch/arm/cpu/armv7/mx5/iomux.c
deleted file mode 100644 (file)
index d4e3bbb..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * (C) Copyright 2009 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., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/imx-regs.h>
-#include <asm/arch/mx5x_pins.h>
-#include <asm/arch/iomux.h>
-#include <asm/arch/sys_proto.h>
-
-/* IOMUX register (base) addresses */
-enum iomux_reg_addr {
-       IOMUXGPR0 = IOMUXC_BASE_ADDR,
-       IOMUXGPR1 = IOMUXC_BASE_ADDR + 0x004,
-       IOMUXSW_MUX_CTL = IOMUXC_BASE_ADDR,
-       IOMUXSW_MUX_END = IOMUXC_BASE_ADDR + MUX_I_END,
-       IOMUXSW_PAD_CTL = IOMUXC_BASE_ADDR + PAD_I_START,
-       IOMUXSW_INPUT_CTL = IOMUXC_BASE_ADDR + INPUT_CTL_START,
-};
-
-#define MUX_PIN_NUM_MAX (((MUX_I_END - MUX_I_START) >> 2) + 1)
-
-/* Get the iomux register address of this pin */
-static inline u32 get_mux_reg(iomux_pin_name_t pin)
-{
-       u32 mux_reg = PIN_TO_IOMUX_MUX(pin);
-
-#if defined(CONFIG_MX51)
-       if (is_soc_rev(CHIP_REV_2_0) < 0) {
-               /*
-                * Fixup register address:
-                * i.MX51 TO1 has offset with the register
-                * which is define as TO2.
-                */
-               if ((pin == MX51_PIN_NANDF_RB5) ||
-                       (pin == MX51_PIN_NANDF_RB6) ||
-                       (pin == MX51_PIN_NANDF_RB7))
-                       ; /* Do nothing */
-               else if (mux_reg >= 0x2FC)
-                       mux_reg += 8;
-               else if (mux_reg >= 0x130)
-                       mux_reg += 0xC;
-       }
-#endif
-       mux_reg += IOMUXSW_MUX_CTL;
-       return mux_reg;
-}
-
-/* Get the pad register address of this pin */
-static inline u32 get_pad_reg(iomux_pin_name_t pin)
-{
-       u32 pad_reg = PIN_TO_IOMUX_PAD(pin);
-
-#if defined(CONFIG_MX51)
-       if (is_soc_rev(CHIP_REV_2_0) < 0) {
-               /*
-                * Fixup register address:
-                * i.MX51 TO1 has offset with the register
-                * which is define as TO2.
-                */
-               if ((pin == MX51_PIN_NANDF_RB5) ||
-                       (pin == MX51_PIN_NANDF_RB6) ||
-                       (pin == MX51_PIN_NANDF_RB7))
-                       ; /* Do nothing */
-               else if (pad_reg == 0x4D0 - PAD_I_START)
-                       pad_reg += 0x4C;
-               else if (pad_reg == 0x860 - PAD_I_START)
-                       pad_reg += 0x9C;
-               else if (pad_reg >= 0x804 - PAD_I_START)
-                       pad_reg += 0xB0;
-               else if (pad_reg >= 0x7FC - PAD_I_START)
-                       pad_reg += 0xB4;
-               else if (pad_reg >= 0x4E4 - PAD_I_START)
-                       pad_reg += 0xCC;
-               else
-                       pad_reg += 8;
-       }
-#endif
-       pad_reg += IOMUXSW_PAD_CTL;
-       return pad_reg;
-}
-
-/* Get the last iomux register address */
-static inline u32 get_mux_end(void)
-{
-#if defined(CONFIG_MX51)
-       if (is_soc_rev(CHIP_REV_2_0) < 0)
-               return IOMUXC_BASE_ADDR + (0x3F8 - 4);
-       else
-               return IOMUXC_BASE_ADDR + (0x3F0 - 4);
-#endif
-       return IOMUXSW_MUX_END;
-}
-
-/*
- * This function is used to configure a pin through the IOMUX module.
- * @param  pin         a pin number as defined in iomux_pin_name_t
- * @param  cfg         an output function as defined in iomux_pin_cfg_t
- *
- * @return             0 if successful; Non-zero otherwise
- */
-static void iomux_config_mux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)
-{
-       u32 mux_reg = get_mux_reg(pin);
-
-       if ((mux_reg > get_mux_end()) || (mux_reg < IOMUXSW_MUX_CTL))
-               return ;
-       if (cfg == IOMUX_CONFIG_GPIO)
-               writel(PIN_TO_ALT_GPIO(pin), mux_reg);
-       else
-               writel(cfg, mux_reg);
-}
-
-/*
- * Request ownership for an IO pin. This function has to be the first one
- * being called before that pin is used. The caller has to check the
- * return value to make sure it returns 0.
- *
- * @param  pin         a name defined by iomux_pin_name_t
- * @param  cfg         an input function as defined in iomux_pin_cfg_t
- *
- */
-void mxc_request_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)
-{
-       iomux_config_mux(pin, cfg);
-}
-
-/*
- * Release ownership for an IO pin
- *
- * @param  pin         a name defined by iomux_pin_name_t
- * @param  cfg         an input function as defined in iomux_pin_cfg_t
- */
-void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)
-{
-}
-
-/*
- * This function configures the pad value for a IOMUX pin.
- *
- * @param  pin     a pin number as defined in iomux_pin_name_t
- * @param  config  the ORed value of elements defined in iomux_pad_config_t
- */
-void mxc_iomux_set_pad(iomux_pin_name_t pin, u32 config)
-{
-       u32 pad_reg = get_pad_reg(pin);
-       writel(config, pad_reg);
-}
-
-unsigned int mxc_iomux_get_pad(iomux_pin_name_t pin)
-{
-       u32 pad_reg = get_pad_reg(pin);
-       return readl(pad_reg);
-}
-
-/*
- * This function configures daisy-chain
- *
- * @param input    index of input select register
- * @param config   the binary value of elements
- */
-void mxc_iomux_set_input(iomux_input_select_t input, u32 config)
-{
-       u32 reg = IOMUXSW_INPUT_CTL + (input << 2);
-
-       writel(config, reg);
-}
index 263658aa4be46857f2b00abc0a97a18fbce5a2c2..3d50a5d8ee9a39dbe911f711272950a06b4ccd4d 100644 (file)
@@ -72,6 +72,13 @@ u32 get_cpu_rev(void)
        return system_rev;
 }
 
+#ifdef CONFIG_REVISION_TAG
+u32 __weak get_board_rev(void)
+{
+       return get_cpu_rev();
+}
+#endif
+
 #ifndef CONFIG_SYS_DCACHE_OFF
 void enable_caches(void)
 {
index a50db70b19e45da1810cf82e2cb63496446e3eb9..3c0d908d179c9fd0fc79263950cc37a9fc6be76b 100644 (file)
@@ -37,6 +37,20 @@ enum pll_clocks {
 
 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
 
+#ifdef CONFIG_MXC_OCOTP
+void enable_ocotp_clk(unsigned char enable)
+{
+       u32 reg;
+
+       reg = __raw_readl(&imx_ccm->CCGR2);
+       if (enable)
+               reg |= MXC_CCM_CCGR2_OCOTP_CTRL_MASK;
+       else
+               reg &= ~MXC_CCM_CCGR2_OCOTP_CTRL_MASK;
+       __raw_writel(reg, &imx_ccm->CCGR2);
+}
+#endif
+
 void enable_usboh3_clk(unsigned char enable)
 {
        u32 reg;
@@ -186,12 +200,16 @@ static u32 get_ipg_per_clk(void)
 static u32 get_uart_clk(void)
 {
        u32 reg, uart_podf;
-
+       u32 freq = PLL3_80M;
        reg = __raw_readl(&imx_ccm->cscdr1);
+#ifdef CONFIG_MX6SL
+       if (reg & MXC_CCM_CSCDR1_UART_CLK_SEL)
+               freq = MXC_HCLK;
+#endif
        reg &= MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
        uart_podf = reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET;
 
-       return PLL3_80M / (uart_podf + 1);
+       return freq / (uart_podf + 1);
 }
 
 static u32 get_cspi_clk(void)
@@ -252,6 +270,35 @@ static u32 get_emi_slow_clk(void)
        return root_freq / (emi_slow_pof + 1);
 }
 
+#ifdef CONFIG_MX6SL
+static u32 get_mmdc_ch0_clk(void)
+{
+       u32 cbcmr = __raw_readl(&imx_ccm->cbcmr);
+       u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
+       u32 freq, podf;
+
+       podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) \
+                       >> MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
+
+       switch ((cbcmr & MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK) >>
+               MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET) {
+       case 0:
+               freq = decode_pll(PLL_BUS, MXC_HCLK);
+               break;
+       case 1:
+               freq = PLL2_PFD2_FREQ;
+               break;
+       case 2:
+               freq = PLL2_PFD0_FREQ;
+               break;
+       case 3:
+               freq = PLL2_PFD2_DIV_FREQ;
+       }
+
+       return freq / (podf + 1);
+
+}
+#else
 static u32 get_mmdc_ch0_clk(void)
 {
        u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
@@ -260,6 +307,7 @@ static u32 get_mmdc_ch0_clk(void)
 
        return get_periph_clk() / (mmdc_ch0_podf + 1);
 }
+#endif
 
 static u32 get_usdhc_clk(u32 port)
 {
index 2ea8ca3bd354c8a4ca25dc2345eadd15376f7cb5..fc436fbee7c971978a896cdf24ce75648260dd86 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/imx-common/boot_mode.h>
+#include <asm/imx-common/dma.h>
 #include <stdbool.h>
 
 struct scu_regs {
@@ -151,6 +152,12 @@ int arch_cpu_init(void)
        set_vddsoc(1200);       /* Set VDDSOC to 1.2V */
 
        imx_set_wdog_powerdown(false); /* Disable PDE bit of WMCR register */
+
+#ifdef CONFIG_APBH_DMA
+       /* Start APBH DMA */
+       mxs_dma_init();
+#endif
+
        return 0;
 }
 
@@ -165,8 +172,8 @@ void enable_caches(void)
 #if defined(CONFIG_FEC_MXC)
 void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 {
-       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
-       struct fuse_bank *bank = &iim->bank[4];
+       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+       struct fuse_bank *bank = &ocotp->bank[4];
        struct fuse_bank4_regs *fuse =
                        (struct fuse_bank4_regs *)bank->fuse_regs;
 
index 55e82ba3694c88be669553b575d25b938983daa8..c4b9809ad07d4145ccd7f30c6499eb4ebde68bca 100644 (file)
@@ -34,6 +34,7 @@ COBJS += hwinit-common.o
 COBJS  += clocks-common.o
 COBJS  += emif-common.o
 COBJS  += vc.o
+COBJS  += abb.o
 endif
 
 ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TI814X),)
diff --git a/arch/arm/cpu/armv7/omap-common/abb.c b/arch/arm/cpu/armv7/omap-common/abb.c
new file mode 100644 (file)
index 0000000..87d1fb8
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ *
+ * Adaptive Body Bias programming sequence for OMAP family
+ *
+ * (C) Copyright 2013
+ * Texas Instruments, <www.ti.com>
+ *
+ * Andrii Tseglytskyi <andrii.tseglytskyi@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 <asm/omap_common.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+
+__weak s8 abb_setup_ldovbb(u32 fuse, u32 ldovbb)
+{
+       return -1;
+}
+
+static void abb_setup_timings(u32 setup)
+{
+       u32 sys_rate, sr2_cnt, clk_cycles;
+
+       /*
+        * SR2_WTCNT_VALUE is the settling time for the ABB ldo after a
+        * transition and must be programmed with the correct time at boot.
+        * The value programmed into the register is the number of SYS_CLK
+        * clock cycles that match a given wall time profiled for the ldo.
+        * This value depends on:
+        * settling time of ldo in micro-seconds (varies per OMAP family),
+        * of clock cycles per SYS_CLK period (varies per OMAP family),
+        * the SYS_CLK frequency in MHz (varies per board)
+        * The formula is:
+        *
+        *                     ldo settling time (in micro-seconds)
+        * SR2_WTCNT_VALUE = ------------------------------------------
+        *                  (# system clock cycles) * (sys_clk period)
+        *
+        * Put another way:
+        *
+        * SR2_WTCNT_VALUE = settling time / (# SYS_CLK cycles / SYS_CLK rate))
+        *
+        * To avoid dividing by zero multiply both "# clock cycles" and
+        * "settling time" by 10 such that the final result is the one we want.
+        */
+
+       /* calculate SR2_WTCNT_VALUE */
+       sys_rate = DIV_ROUND(V_OSCK, 1000000);
+       clk_cycles = DIV_ROUND(OMAP_ABB_CLOCK_CYCLES * 10, sys_rate);
+       sr2_cnt = DIV_ROUND(OMAP_ABB_SETTLING_TIME * 10, clk_cycles);
+
+       setbits_le32(setup,
+                    sr2_cnt << (ffs(OMAP_ABB_SETUP_SR2_WTCNT_VALUE_MASK) - 1));
+}
+
+void abb_setup(u32 fuse, u32 ldovbb, u32 setup, u32 control,
+              u32 txdone, u32 txdone_mask, u32 opp)
+{
+       u32 abb_type_mask, opp_sel_mask;
+
+       /* sanity check */
+       if (!setup || !control || !txdone)
+               return;
+
+       /* setup ABB only in case of Fast or Slow OPP */
+       switch (opp) {
+       case OMAP_ABB_FAST_OPP:
+               abb_type_mask = OMAP_ABB_SETUP_ACTIVE_FBB_SEL_MASK;
+               opp_sel_mask = OMAP_ABB_CONTROL_FAST_OPP_SEL_MASK;
+               break;
+       case OMAP_ABB_SLOW_OPP:
+               abb_type_mask = OMAP_ABB_SETUP_ACTIVE_RBB_SEL_MASK;
+               opp_sel_mask = OMAP_ABB_CONTROL_SLOW_OPP_SEL_MASK;
+               break;
+       default:
+              return;
+       }
+
+       /*
+        * For some OMAP silicons additional setup for LDOVBB register is
+        * required. This is determined by data retrieved from corresponding
+        * OPP EFUSE register. Data, which is retrieved from EFUSE - is
+        * ABB enable/disable flag and VSET value, which must be copied
+        * to LDOVBB register. If function call fails - return quietly,
+        * it means no ABB is required for such silicon.
+        *
+        * For silicons, which don't require LDOVBB setup "fuse" and
+        * "ldovbb" offsets are not defined. ABB will be initialized in
+        * the common way for them.
+        */
+       if (fuse && ldovbb) {
+               if (abb_setup_ldovbb(fuse, ldovbb))
+                       return;
+       }
+
+       /* clear ABB registers */
+       writel(0, setup);
+       writel(0, control);
+
+       /* configure timings, based on oscillator value */
+       abb_setup_timings(setup);
+
+       /* clear pending interrupts before setup */
+       setbits_le32(txdone, txdone_mask);
+
+       /* select ABB type */
+       setbits_le32(setup, abb_type_mask | OMAP_ABB_SETUP_SR2EN_MASK);
+
+       /* initiate ABB ldo change */
+       setbits_le32(control, opp_sel_mask | OMAP_ABB_CONTROL_OPP_CHANGE_MASK);
+
+       /* wait until transition complete */
+       if (!wait_on_value(txdone_mask, txdone_mask, (void *)txdone, LDELAY))
+               puts("Error: ABB txdone is not set\n");
+
+       /* clear ABB tranxdone */
+       setbits_le32(txdone, txdone_mask);
+}
index 24cbe2da05dc55b08b07c17abeb057c5321fa434..76ae1b675fec9de008832b7d9f46c6b6f86cd0f5 100644 (file)
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/sys_proto.h>
 
-/*
- * This is used to verify if the configuration header
- * was executed by rom code prior to control of transfer
- * to the bootloader. SPL is responsible for saving and
- * passing the boot_params pointer to the u-boot.
- */
-struct omap_boot_parameters boot_params __attribute__ ((section(".data")));
+DECLARE_GLOBAL_DATA_PTR;
 
-#ifdef CONFIG_SPL_BUILD
-/*
- * We use static variables because global data is not ready yet.
- * Initialized data is available in SPL right from the beginning.
- * We would not typically need to save these parameters in regular
- * U-Boot. This is needed only in SPL at the moment.
- */
-u32 omap_bootmode = MMCSD_MODE_FAT;
+void save_omap_boot_params(void)
+{
+       u32 rom_params = *((u32 *)OMAP_SRAM_SCRATCH_BOOT_PARAMS);
+       u8 boot_device;
+       u32 dev_desc, dev_data;
+
+       if ((rom_params <  NON_SECURE_SRAM_START) ||
+           (rom_params > NON_SECURE_SRAM_END))
+               return;
+
+       /*
+        * rom_params can be type casted to omap_boot_parameters and
+        * used. But it not correct to assume that romcode structure
+        * encoding would be same as u-boot. So use the defined offsets.
+        */
+       gd->arch.omap_boot_params.omap_bootdevice = boot_device =
+                                  *((u8 *)(rom_params + BOOT_DEVICE_OFFSET));
+
+       gd->arch.omap_boot_params.ch_flags =
+                               *((u8 *)(rom_params + CH_FLAGS_OFFSET));
 
+       if ((boot_device >= MMC_BOOT_DEVICES_START) &&
+           (boot_device <= MMC_BOOT_DEVICES_END)) {
+#if !defined(CONFIG_AM33XX) && !defined(CONFIG_TI81XX)
+               if ((omap_hw_init_context() ==
+                                     OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)) {
+                       gd->arch.omap_boot_params.omap_bootmode =
+                       *((u8 *)(rom_params + BOOT_MODE_OFFSET));
+               } else
+#endif
+               {
+                       dev_desc = *((u32 *)(rom_params + DEV_DESC_PTR_OFFSET));
+                       dev_data = *((u32 *)(dev_desc + DEV_DATA_PTR_OFFSET));
+                       gd->arch.omap_boot_params.omap_bootmode =
+                                       *((u32 *)(dev_data + BOOT_MODE_OFFSET));
+               }
+       }
+}
+
+#ifdef CONFIG_SPL_BUILD
 u32 spl_boot_device(void)
 {
-       return (u32) (boot_params.omap_bootdevice);
+       return (u32) (gd->arch.omap_boot_params.omap_bootdevice);
 }
 
 u32 spl_boot_mode(void)
 {
-       return omap_bootmode;
+       return gd->arch.omap_boot_params.omap_bootmode;
 }
 
 void spl_board_init(void)
@@ -73,4 +98,15 @@ int board_mmc_init(bd_t *bis)
        }
        return 0;
 }
+
+void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
+{
+       typedef void __noreturn (*image_entry_noargs_t)(u32 *);
+       image_entry_noargs_t image_entry =
+                       (image_entry_noargs_t) spl_image->entry_point;
+
+       debug("image entry point: 0x%X\n", spl_image->entry_point);
+       /* Pass the saved boot_params from rom code */
+       image_entry((u32 *)&gd->arch.omap_boot_params);
+}
 #endif
index 2b955c7c006b2a2d9541d5ac1e8c5c4ddf76f6cb..ef23127bb6f77636416510e800283bcf41bcbe10 100644 (file)
  * MA 02111-1307 USA
  */
 #include <common.h>
+#include <i2c.h>
 #include <asm/omap_common.h>
 #include <asm/gpio.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/utils.h>
 #include <asm/omap_gpio.h>
 
 const u32 sys_clk_array[8] = {
        12000000,              /* 12 MHz */
-       13000000,              /* 13 MHz */
+       20000000,               /* 20 MHz */
        16800000,              /* 16.8 MHz */
        19200000,              /* 19.2 MHz */
        26000000,              /* 26 MHz */
        27000000,              /* 27 MHz */
        38400000,              /* 38.4 MHz */
-       20000000,               /* 20 MHz */
 };
 
 static inline u32 __get_sys_clk_index(void)
@@ -74,13 +74,6 @@ static inline u32 __get_sys_clk_index(void)
                /* SYS_CLKSEL - 1 to match the dpll param array indices */
                ind = (readl((*prcm)->cm_sys_clksel) &
                        CM_SYS_CLKSEL_SYS_CLKSEL_MASK) - 1;
-               /*
-                * SYS_CLKSEL value for 20MHz is 0. This is introduced newly
-                * in DRA7XX socs. SYS_CLKSEL -1 will be greater than
-                * NUM_SYS_CLK. So considering the last 3 bits as the index
-                * for the dpll param array.
-                */
-               ind &= CM_SYS_CLKSEL_SYS_CLKSEL_MASK;
        }
        return ind;
 }
@@ -440,6 +433,12 @@ static void setup_non_essential_dplls(void)
        params = get_abe_dpll_params(*dplls_data);
 #ifdef CONFIG_SYS_OMAP_ABE_SYSCK
        abe_ref_clk = CM_ABE_PLL_REF_CLKSEL_CLKSEL_SYSCLK;
+
+       if (omap_revision() == DRA752_ES1_0)
+               /* Select the sys clk for dpll_abe */
+               clrsetbits_le32((*prcm)->cm_abe_pll_sys_clksel,
+                               CM_CLKSEL_ABE_PLL_SYS_CLKSEL_MASK,
+                               CM_ABE_PLL_SYS_CLKSEL_SYSCLK2);
 #else
        abe_ref_clk = CM_ABE_PLL_REF_CLKSEL_CLKSEL_32KCLK;
        /*
@@ -487,6 +486,10 @@ void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic)
        u32 offset = volt_mv;
        int ret = 0;
 
+       if (!volt_mv)
+               return;
+
+       pmic->pmic_bus_init();
        /* See if we can first get the GPIO if needed */
        if (pmic->gpio_en)
                ret = gpio_request(pmic->gpio, "PMIC_GPIO");
@@ -509,14 +512,45 @@ void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic)
        debug("do_scale_vcore: volt - %d offset_code - 0x%x\n", volt_mv,
                offset_code);
 
-       if (omap_vc_bypass_send_value(SMPS_I2C_SLAVE_ADDR,
-                               vcore_reg, offset_code))
+       if (pmic->pmic_write(pmic->i2c_slave_addr, vcore_reg, offset_code))
                printf("Scaling voltage failed for 0x%x\n", vcore_reg);
 
        if (pmic->gpio_en)
                gpio_direction_output(pmic->gpio, 1);
 }
 
+static u32 optimize_vcore_voltage(struct volts const *v)
+{
+       u32 val;
+       if (!v->value)
+               return 0;
+       if (!v->efuse.reg)
+               return v->value;
+
+       switch (v->efuse.reg_bits) {
+       case 16:
+               val = readw(v->efuse.reg);
+               break;
+       case 32:
+               val = readl(v->efuse.reg);
+               break;
+       default:
+               printf("Error: efuse 0x%08x bits=%d unknown\n",
+                      v->efuse.reg, v->efuse.reg_bits);
+               return v->value;
+       }
+
+       if (!val) {
+               printf("Error: efuse 0x%08x bits=%d val=0, using %d\n",
+                      v->efuse.reg, v->efuse.reg_bits, v->value);
+               return v->value;
+       }
+
+       debug("%s:efuse 0x%08x bits=%d Vnom=%d, using efuse value %d\n",
+             __func__, v->efuse.reg, v->efuse.reg_bits, v->value, val);
+       return val;
+}
+
 /*
  * Setup the voltages for vdd_mpu, vdd_core, and vdd_iva
  * We set the maximum voltages allowed here because Smart-Reflex is not
@@ -525,16 +559,34 @@ void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic)
  */
 void scale_vcores(struct vcores_data const *vcores)
 {
-       omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
+       u32 val;
+
+       val = optimize_vcore_voltage(&vcores->core);
+       do_scale_vcore(vcores->core.addr, val, vcores->core.pmic);
+
+       val = optimize_vcore_voltage(&vcores->mpu);
+       do_scale_vcore(vcores->mpu.addr, val, vcores->mpu.pmic);
+
+       /* Configure MPU ABB LDO after scale */
+       abb_setup((*ctrl)->control_std_fuse_opp_vdd_mpu_2,
+                 (*ctrl)->control_wkup_ldovbb_mpu_voltage_ctrl,
+                 (*prcm)->prm_abbldo_mpu_setup,
+                 (*prcm)->prm_abbldo_mpu_ctrl,
+                 (*prcm)->prm_irqstatus_mpu_2,
+                 OMAP_ABB_MPU_TXDONE_MASK,
+                 OMAP_ABB_FAST_OPP);
 
-       do_scale_vcore(vcores->core.addr, vcores->core.value,
-                                         vcores->core.pmic);
+       val = optimize_vcore_voltage(&vcores->mm);
+       do_scale_vcore(vcores->mm.addr, val, vcores->mm.pmic);
 
-       do_scale_vcore(vcores->mpu.addr, vcores->mpu.value,
-                                         vcores->mpu.pmic);
+       val = optimize_vcore_voltage(&vcores->gpu);
+       do_scale_vcore(vcores->gpu.addr, val, vcores->gpu.pmic);
 
-       do_scale_vcore(vcores->mm.addr, vcores->mm.value,
-                                         vcores->mm.pmic);
+       val = optimize_vcore_voltage(&vcores->eve);
+       do_scale_vcore(vcores->eve.addr, val, vcores->eve.pmic);
+
+       val = optimize_vcore_voltage(&vcores->iva);
+       do_scale_vcore(vcores->iva.addr, val, vcores->iva.pmic);
 
         if (emif_sdram_type() == EMIF_SDRAM_TYPE_DDR3) {
                /* Configure LDO SRAM "magic" bits */
@@ -710,12 +762,14 @@ void prcm_init(void)
        case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR:
        case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH:
                enable_basic_clocks();
+               timer_init();
                scale_vcores(*omap_vcores);
                setup_dplls();
 #ifdef CONFIG_SYS_CLOCKS_ENABLE_ALL
                setup_non_essential_dplls();
                enable_non_essential_clocks();
 #endif
+               setup_warmreset_time();
                break;
        default:
                break;
@@ -724,3 +778,13 @@ void prcm_init(void)
        if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context())
                enable_basic_uboot_clocks();
 }
+
+void gpi2c_init(void)
+{
+       static int gpi2c = 1;
+
+       if (gpi2c) {
+               i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+               gpi2c = 0;
+       }
+}
index cdb443972175e6b1b0166007ab3c0a0f487e90c6..652e5a71b3445b574945546ec25c84a405dd2f54 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <common.h>
 #include <asm/emif.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/omap_common.h>
 #include <asm/utils.h>
@@ -209,7 +209,8 @@ void emif_update_timings(u32 base, const struct emif_regs *regs)
        writel(regs->temp_alert_config, &emif->emif_temp_alert_config);
        writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1_shdw);
 
-       if (omap_revision() >= OMAP5430_ES1_0) {
+       if ((omap_revision() >= OMAP5430_ES1_0) ||
+                               (omap_revision() == DRA752_ES1_0)) {
                writel(EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0,
                        &emif->emif_l3_config);
        } else if (omap_revision() >= OMAP4460_ES1_0) {
@@ -263,6 +264,18 @@ static void ddr3_leveling(u32 base, const struct emif_regs *regs)
        __udelay(130);
 }
 
+static void ddr3_sw_leveling(u32 base, const struct emif_regs *regs)
+{
+       struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
+
+       writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1);
+       writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1_shdw);
+       config_data_eye_leveling_samples(base);
+
+       writel(regs->emif_rd_wr_lvl_ctl, &emif->emif_rd_wr_lvl_ctl);
+       writel(regs->sdram_config, &emif->emif_sdram_config);
+}
+
 static void ddr3_init(u32 base, const struct emif_regs *regs)
 {
        struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
@@ -273,6 +286,7 @@ static void ddr3_init(u32 base, const struct emif_regs *regs)
         * defined, contents of mode Registers must be fully initialized.
         * H/W takes care of this initialization
         */
+       writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config);
        writel(regs->sdram_config_init, &emif->emif_sdram_config);
 
        writel(regs->emif_ddr_phy_ctlr_1_init, &emif->emif_ddr_phy_ctrl_1);
@@ -290,7 +304,10 @@ static void ddr3_init(u32 base, const struct emif_regs *regs)
        /* enable leveling */
        writel(regs->emif_rd_wr_lvl_rmp_ctl, &emif->emif_rd_wr_lvl_rmp_ctl);
 
-       ddr3_leveling(base, regs);
+       if (omap_revision() == DRA752_ES1_0)
+               ddr3_sw_leveling(base, regs);
+       else
+               ddr3_leveling(base, regs);
 }
 
 #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
@@ -1075,6 +1092,14 @@ static void do_sdram_init(u32 base)
                else
                        ddr3_init(base, regs);
        }
+       if (warm_reset() && (emif_sdram_type() == EMIF_SDRAM_TYPE_DDR3)) {
+               set_lpmode_selfrefresh(base);
+               emif_reset_phy(base);
+               if (omap_revision() == DRA752_ES1_0)
+                       ddr3_sw_leveling(base, regs);
+               else
+                       ddr3_leveling(base, regs);
+       }
 
        /* Write to the shadow registers */
        emif_update_timings(base, regs);
@@ -1262,10 +1287,10 @@ void sdram_init(void)
        in_sdram = running_from_sdram();
        debug("in_sdram = %d\n", in_sdram);
 
-       if (!(in_sdram || warm_reset())) {
-               if (sdram_type == EMIF_SDRAM_TYPE_LPDDR2)
+       if (!in_sdram) {
+               if ((sdram_type == EMIF_SDRAM_TYPE_LPDDR2) && !warm_reset())
                        bypass_dpll((*prcm)->cm_clkmode_dpll_core);
-               else
+               else if (sdram_type == EMIF_SDRAM_TYPE_DDR3)
                        writel(CM_DLL_CTRL_NO_OVERRIDE, (*prcm)->cm_dll_ctrl);
        }
 
index 70d16a816070b779cb3b6f1fac5bf9b734220f99..5df116edbe67b379b50952b896635c248ad7bc25 100644 (file)
@@ -84,7 +84,7 @@ u32 cortex_rev(void)
        return rev;
 }
 
-void omap_rev_string(void)
+static void omap_rev_string(void)
 {
        u32 omap_rev = omap_revision();
        u32 soc_variant = (omap_rev & 0xF0000000) >> 28;
@@ -101,11 +101,6 @@ void omap_rev_string(void)
 }
 
 #ifdef CONFIG_SPL_BUILD
-static void init_boot_params(void)
-{
-       boot_params_ptr = (u32 *) &boot_params;
-}
-
 void spl_display_print(void)
 {
        omap_rev_string();
@@ -116,6 +111,17 @@ void __weak srcomp_enable(void)
 {
 }
 
+#ifdef CONFIG_ARCH_CPU_INIT
+/*
+ * SOC specific cpu init
+ */
+int arch_cpu_init(void)
+{
+       save_omap_boot_params();
+       return 0;
+}
+#endif /* CONFIG_ARCH_CPU_INIT */
+
 /*
  * Routine: s_init
  * Description: Does early system init of watchdog, muxing,  andclocks
@@ -132,6 +138,14 @@ void __weak srcomp_enable(void)
  */
 void s_init(void)
 {
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+#ifdef CONFIG_SPL_BUILD
+       save_omap_boot_params();
+#endif
        init_omap_revision();
        hw_data_init();
 
@@ -152,11 +166,8 @@ void s_init(void)
 #endif
        prcm_init();
 #ifdef CONFIG_SPL_BUILD
-       timer_init();
-
        /* For regular u-boot sdram_init() is called from dram_init() */
        sdram_init();
-       init_boot_params();
 #endif
 }
 
index 90b3c8aea4ec3b7d5911bdc86a89f9c8e17f261b..c4895369bfb0c853f2cea935113cd80e0e9e4269 100644 (file)
 
 #include <config.h>
 #include <asm/arch/omap.h>
+#include <asm/omap_common.h>
 #include <asm/arch/spl.h>
 #include <linux/linkage.h>
 
 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
-        * This may happen if you are booting with the help of
-        * debugger
-        */
-       ldr     r2, =NON_SECURE_SRAM_START
-       cmp     r2, r0
-       bgt     1f
-       ldr     r2, =NON_SECURE_SRAM_END
-       cmp     r2, r0
-       blt     1f
-
-       /*
-        * store the boot params passed from rom code or saved
-        * and passed by SPL
-        */
-       cmp     r0, #0
-       beq     1f
-       ldr     r1, =boot_params
+       ldr     r1, =OMAP_SRAM_SCRATCH_BOOT_PARAMS
        str     r0, [r1]
-#ifdef CONFIG_SPL_BUILD
-       /* Store the boot device in spl_boot_device */
-       ldrb    r2, [r0, #BOOT_DEVICE_OFFSET]   @ r1 <- value of boot device
-       and     r2, #BOOT_DEVICE_MASK
-       ldr     r3, =boot_params
-       strb    r2, [r3, #BOOT_DEVICE_OFFSET]   @ spl_boot_device <- r1
-
-       /*
-        * boot mode is only valid for device that can be raw or FAT booted.
-        * in other cases it may be fatal to look.  While platforms differ
-        * in the values used for each MMC slot, they are contiguous.
-        */
-       cmp     r2, #MMC_BOOT_DEVICES_START
-       blt     2f
-       cmp     r2, #MMC_BOOT_DEVICES_END
-       bgt     2f
-       /* Store the boot mode (raw/FAT) in omap_bootmode */
-       ldr     r2, [r0, #DEV_DESC_PTR_OFFSET]  @ get the device descriptor ptr
-       ldr     r2, [r2, #DEV_DATA_PTR_OFFSET]  @ get the pDeviceData ptr
-       ldr     r2, [r2, #BOOT_MODE_OFFSET]     @ get the boot mode
-       ldr     r3, =omap_bootmode
-       str     r2, [r3]
-#endif
-2:
-       ldrb    r2, [r0, #CH_FLAGS_OFFSET]
-       ldr     r3, =boot_params
-       strb    r2, [r3, #CH_FLAGS_OFFSET]
-1:
        bx      lr
 ENDPROC(save_boot_params)
 
index 587bb47745a14eed7fcf42e8f648329b7ff70915..57ea9d99995e5798fdc0e356925cf8d3184caf08 100644 (file)
@@ -39,3 +39,7 @@ u32 __weak warm_reset(void)
 {
        return (readl(PRM_RSTST) & PRM_RSTST_WARM_RESET_MASK);
 }
+
+void __weak setup_warmreset_time(void)
+{
+}
index 507f6873e91d27f8a56e67fffc7ea073c793de21..5926a5a810f4885c589900ae7825a0ff0b2c1367 100644 (file)
@@ -35,6 +35,7 @@
 #include <common.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
+#include <asm/arch/clock.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index e6e5f7893c2c0a1c2b5eb3f1f29a77a3bc8de7a9..a68f1d145dcb480a50ed1d38dd8a2fb533a4c116 100644 (file)
@@ -17,6 +17,7 @@
 #include <common.h>
 #include <asm/omap_common.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/arch/clock.h>
 
 /*
  * Define Master code if there are multiple masters on the I2C_SR bus.
@@ -57,7 +58,7 @@
  * omap_vc_init() - Initialization for Voltage controller
  * @speed_khz: I2C buspeed in KHz
  */
-void omap_vc_init(u16 speed_khz)
+static void omap_vc_init(u16 speed_khz)
 {
        u32 val;
        u32 sys_clk_khz, cycles_hi, cycles_low;
@@ -137,3 +138,14 @@ int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data)
        /* All good.. */
        return 0;
 }
+
+void sri2c_init(void)
+{
+       static int sri2c = 1;
+
+       if (sri2c) {
+               omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
+               sri2c = 0;
+       }
+       return;
+}
index 09c51f62aad0cf1f64b3ba171a235f546bdc139d..81cc8597803e99a65ef26e56faf1729f44217490 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <common.h>
 #include <asm/io.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/arch/clocks_omap3.h>
 #include <asm/arch/mem.h>
 #include <asm/arch/sys_proto.h>
index 53f60635b195b2473df814117409545f55402f8a..0ddf35f79bdfc0df0a03c9de69b3d04665e7d3fd 100644 (file)
@@ -31,8 +31,8 @@
 #include <asm/utils.h>
 
 #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
-u32 *const T_num = (u32 *)OMAP4_SRAM_SCRATCH_EMIF_T_NUM;
-u32 *const T_den = (u32 *)OMAP4_SRAM_SCRATCH_EMIF_T_DEN;
+u32 *const T_num = (u32 *)OMAP_SRAM_SCRATCH_EMIF_T_NUM;
+u32 *const T_den = (u32 *)OMAP_SRAM_SCRATCH_EMIF_T_DEN;
 #endif
 
 #ifdef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
index 04977b4f2b2c4de5bb9a9af56b844926465fb4d5..b97cad436457931d00965cbf31c2f1616606ac75 100644 (file)
@@ -29,7 +29,7 @@
 #include <asm/arch/omap.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/omap_common.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/omap_gpio.h>
 #include <asm/io.h>
 
@@ -40,7 +40,7 @@ struct dplls const **dplls_data =
 struct vcores_data const **omap_vcores =
                (struct vcores_data const **) OMAP_SRAM_SCRATCH_VCORES_PTR;
 struct omap_sys_ctrl_regs const **ctrl =
-       (struct omap_sys_ctrl_regs const **)OMAP4_SRAM_SCRATCH_SYS_CTRL;
+       (struct omap_sys_ctrl_regs const **)OMAP_SRAM_SCRATCH_SYS_CTRL;
 
 /*
  * The M & N values in the following tables are created using the
@@ -219,6 +219,9 @@ struct pmic_data twl6030_4430es1 = {
        .step = 12660, /* 12.66 mV represented in uV */
        /* The code starts at 1 not 0 */
        .start_code = 1,
+       .i2c_slave_addr = SMPS_I2C_SLAVE_ADDR,
+       .pmic_bus_init  = sri2c_init,
+       .pmic_write     = omap_vc_bypass_send_value,
 };
 
 struct pmic_data twl6030 = {
@@ -226,6 +229,9 @@ struct pmic_data twl6030 = {
        .step = 12660, /* 12.66 mV represented in uV */
        /* The code starts at 1 not 0 */
        .start_code = 1,
+       .i2c_slave_addr = SMPS_I2C_SLAVE_ADDR,
+       .pmic_bus_init  = sri2c_init,
+       .pmic_write     = omap_vc_bypass_send_value,
 };
 
 struct pmic_data tps62361 = {
@@ -233,7 +239,10 @@ struct pmic_data tps62361 = {
        .step = 10000, /* 10 mV represented in uV */
        .start_code = 0,
        .gpio = TPS62361_VSEL0_GPIO,
-       .gpio_en = 1
+       .gpio_en = 1,
+       .i2c_slave_addr = SMPS_I2C_SLAVE_ADDR,
+       .pmic_bus_init  = sri2c_init,
+       .pmic_write     = omap_vc_bypass_send_value,
 };
 
 struct vcores_data omap4430_volts_es1 = {
index 2db517b1bf531e19cce1dd77c31bdb363c9c3b71..81f5a48e509ab2202cddc02c30c7519447e61043 100644 (file)
 #include <asm/sizes.h>
 #include <asm/emif.h>
 #include <asm/arch/gpio.h>
+#include <asm/omap_common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-u32 *const omap_si_rev = (u32 *)OMAP4_SRAM_SCRATCH_OMAP4_REV;
+u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
 
 static const struct gpio_bank gpio_bank_44xx[6] = {
        { (void *)OMAP44XX_GPIO1_BASE, METHOD_GPIO_24XX },
index 7225a301b1ef3335f934d2824aea952d0306de06..7e71ca0a264ffe0672b8a049b86658d1fc79f95e 100644 (file)
@@ -301,6 +301,8 @@ struct omap_sys_ctrl_regs const omap4_ctrl = {
        .control_ldosram_iva_voltage_ctrl       = 0x4A002320,
        .control_ldosram_mpu_voltage_ctrl       = 0x4A002324,
        .control_ldosram_core_voltage_ctrl      = 0x4A002328,
+       .control_usbotghs_ctrl                  = 0x4A00233C,
+       .control_padconf_core_base              = 0x4A100000,
        .control_pbiaslite                      = 0x4A100600,
        .control_lpddr2io1_0                    = 0x4A100638,
        .control_lpddr2io1_1                    = 0x4A10063C,
@@ -312,4 +314,5 @@ struct omap_sys_ctrl_regs const omap4_ctrl = {
        .control_lpddr2io2_3                    = 0x4A100654,
        .control_efuse_1                        = 0x4A100700,
        .control_efuse_2                        = 0x4A100704,
+       .control_padconf_wkup_base              = 0x4A31E000,
 };
index ce00e2c3c5db6ec08ae7ebb766f0650a4d65edf2..6ff8dbb4eb1c3452e06bcb8e357dfac201554cb3 100644 (file)
@@ -30,6 +30,7 @@ COBJS += emif.o
 COBJS  += sdram.o
 COBJS  += prcm-regs.o
 COBJS  += hw_data.o
+COBJS  += abb.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
diff --git a/arch/arm/cpu/armv7/omap5/abb.c b/arch/arm/cpu/armv7/omap5/abb.c
new file mode 100644 (file)
index 0000000..92470be
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *
+ * Adaptive Body Bias programming sequence for OMAP5 family
+ *
+ * (C) Copyright 2013
+ * Texas Instruments, <www.ti.com>
+ *
+ * Andrii Tseglytskyi <andrii.tseglytskyi@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 <asm/omap_common.h>
+#include <asm/io.h>
+
+/*
+ * Setup LDOVBB for OMAP5.
+ * On OMAP5+ some ABB settings are fused. They are handled
+ * in the following way:
+ *
+ * 1. corresponding EFUSE register contains ABB enable bit
+ *    and VSET value
+ * 2. If ABB enable bit is set to 1, than ABB should be
+ *    enabled, otherwise ABB should be disabled
+ * 3. If ABB is enabled, than VSET value should be copied
+ *    to corresponding MUX control register
+ */
+s8 abb_setup_ldovbb(u32 fuse, u32 ldovbb)
+{
+       u32 vset;
+
+       /*
+        * ABB parameters must be properly fused
+        * otherwise ABB should be disabled
+        */
+       vset = readl(fuse);
+       if (!(vset & OMAP5_ABB_FUSE_ENABLE_MASK))
+               return -1;
+
+       /* prepare VSET value for LDOVBB mux register */
+       vset &= OMAP5_ABB_FUSE_VSET_MASK;
+       vset >>= ffs(OMAP5_ABB_FUSE_VSET_MASK) - 1;
+       vset <<= ffs(OMAP5_ABB_LDOVBBMPU_VSET_OUT_MASK) - 1;
+       vset |= OMAP5_ABB_LDOVBBMPU_MUX_CTRL_MASK;
+
+       /* setup LDOVBB using fused value */
+       clrsetbits_le32(ldovbb,  OMAP5_ABB_LDOVBBMPU_VSET_OUT_MASK, vset);
+
+       return 0;
+}
index 3f37abdf83b735d0d9535cb3e8594b7de34ad557..b4c1319adcca2277fdc8bf44f2d607e5d46788fb 100644 (file)
@@ -32,8 +32,8 @@
 
 #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
 #define print_timing_reg(reg) debug(#reg" - 0x%08x\n", (reg))
-static u32 *const T_num = (u32 *)OMAP5_SRAM_SCRATCH_EMIF_T_NUM;
-static u32 *const T_den = (u32 *)OMAP5_SRAM_SCRATCH_EMIF_T_DEN;
+static u32 *const T_num = (u32 *)OMAP_SRAM_SCRATCH_EMIF_T_NUM;
+static u32 *const T_den = (u32 *)OMAP_SRAM_SCRATCH_EMIF_T_DEN;
 #endif
 
 #ifdef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
index ced274e4db451a3a732851736fae6398a7654f0a..56cf1f8c60d09b10e3879201b3e2362ebab80863 100644 (file)
  * MA 02111-1307 USA
  */
 #include <common.h>
+#include <palmas.h>
 #include <asm/arch/omap.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/omap_common.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/omap_gpio.h>
 #include <asm/io.h>
 #include <asm/emif.h>
@@ -41,7 +42,7 @@ struct dplls const **dplls_data =
 struct vcores_data const **omap_vcores =
                (struct vcores_data const **) OMAP_SRAM_SCRATCH_VCORES_PTR;
 struct omap_sys_ctrl_regs const **ctrl =
-       (struct omap_sys_ctrl_regs const **)OMAP5_SRAM_SCRATCH_SYS_CTRL;
+       (struct omap_sys_ctrl_regs const **)OMAP_SRAM_SCRATCH_SYS_CTRL;
 
 /* OPP HIGH FREQUENCY for ES2.0 */
 static const struct dpll_params mpu_dpll_params_1_5ghz[NUM_SYS_CLKS] = {
@@ -99,14 +100,13 @@ static const struct dpll_params mpu_dpll_params_499mhz[NUM_SYS_CLKS] = {
 };
 
 static const struct dpll_params mpu_dpll_params_1ghz[NUM_SYS_CLKS] = {
-       {250, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
-       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {119, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 16.8 MHz */
-       {625, 11, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 19.2 MHz */
-       {500, 12, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
+       {250, 2, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 12 MHz   */
+       {500, 9, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 20 MHz   */
+       {119, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 16.8 MHz */
+       {625, 11, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 19.2 MHz */
+       {500, 12, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {625, 23, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 38.4 MHz */
-       {50, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}          /* 20 MHz   */
+       {625, 23, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 38.4 MHz */
 };
 
 static const struct dpll_params
@@ -132,15 +132,14 @@ static const struct dpll_params
 };
 
 static const struct dpll_params
-               core_dpll_params_2128mhz_ddr532_dra7xx[NUM_SYS_CLKS] = {
-       {266, 2, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6},             /* 12 MHz   */
-       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {443, 6, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6},             /* 16.8 MHz */
-       {277, 4, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6},             /* 19.2 MHz */
-       {368, 8, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6},             /* 26 MHz   */
+               core_dpll_params_2128mhz_dra7xx[NUM_SYS_CLKS] = {
+       {266, 2, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 12 MHz   */
+       {266, 4, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 20 MHz   */
+       {443, 6, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 16.8 MHz */
+       {277, 4, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 19.2 MHz */
+       {368, 8, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {277, 9, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6},             /* 38.4 MHz */
-       {266, 4, 2, -1, -1, 4, 62, 5, -1, 5, 7, 6}              /* 20 MHz   */
+       {277, 9, 2, 1, -1, 4, 62, 5, -1, 5, 4, 6},              /* 38.4 MHz */
 };
 
 static const struct dpll_params
@@ -186,14 +185,13 @@ static const struct dpll_params per_dpll_params_768mhz_es2[NUM_SYS_CLKS] = {
 };
 
 static const struct dpll_params per_dpll_params_768mhz_dra7xx[NUM_SYS_CLKS] = {
-       {32, 0, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1},            /* 12 MHz   */
-       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {160, 6, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1},           /* 16.8 MHz */
-       {20, 0, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1},            /* 19.2 MHz */
-       {192, 12, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1},          /* 26 MHz   */
+       {32, 0, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},             /* 12 MHz   */
+       {96, 4, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},             /* 20 MHz   */
+       {160, 6, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},            /* 16.8 MHz */
+       {20, 0, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},             /* 19.2 MHz */
+       {192, 12, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},           /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {10, 0, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1},            /* 38.4 MHz */
-       {96, 4, 4, -1, 3, 4, 10, 2, -1, -1, -1, -1}             /* 20 MHz   */
+       {10, 0, 4, 1, 3, 4, 10, 2, -1, -1, -1, -1},             /* 38.4 MHz */
 };
 
 static const struct dpll_params iva_dpll_params_2330mhz[NUM_SYS_CLKS] = {
@@ -206,6 +204,16 @@ static const struct dpll_params iva_dpll_params_2330mhz[NUM_SYS_CLKS] = {
        {91, 2, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1}           /* 38.4 MHz */
 };
 
+static const struct dpll_params iva_dpll_params_2330mhz_dra7xx[NUM_SYS_CLKS] = {
+       {1165, 11, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 12 MHz   */
+       {233, 3, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 20 MHz */
+       {208, 2, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 16.8 MHz */
+       {182, 2, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 19.2 MHz */
+       {224, 4, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},         /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {91, 2, 3, 1, -1, -1, -1, -1, -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] = {
@@ -223,26 +231,36 @@ static const struct dpll_params abe_dpll_params_32k_196608khz = {
        750, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1
 };
 
+/* ABE M & N values with sysclk2(22.5792 MHz) as input */
+static const struct dpll_params
+               abe_dpll_params_sysclk2_361267khz[NUM_SYS_CLKS] = {
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 12 MHz   */
+       {16, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1},          /* 20 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 16.8 MHz */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 19.2 MHz */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 38.4 MHz */
+};
+
 static const struct dpll_params usb_dpll_params_1920mhz[NUM_SYS_CLKS] = {
        {400, 4, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 12 MHz   */
-       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
+       {480, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 20 MHz   */
        {400, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 16.8 MHz */
        {400, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},        /* 19.2 MHz */
        {480, 12, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
        {400, 15, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 38.4 MHz */
-       {48, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}          /* 20 MHz   */
 };
 
-static const struct dpll_params ddr_dpll_params_1066mhz[NUM_SYS_CLKS] = {
-       {533, 11, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1},         /* 12 MHz   */
-       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
-       {222, 6, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1},          /* 16.8 MHz */
-       {111, 3, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1},          /* 19.2 MHz */
-       {41, 1, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1},           /* 26 MHz   */
+static const struct dpll_params ddr_dpll_params_2128mhz[NUM_SYS_CLKS] = {
+       {266, 2, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},          /* 12 MHz   */
+       {266, 4, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},          /* 20 MHz   */
+       {190, 2, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},          /* 16.8 MHz */
+       {665, 11, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},         /* 19.2 MHz */
+       {532, 12, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},         /* 26 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
-       {347, 24, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1},         /* 38.4 MHz */
-       {533, 19, 1, 1, 4, -1, -1, -1, -1, -1, -1, -1}          /* 20 MHz   */
+       {665, 23, 2, 1, 8, -1, -1, -1, -1, -1, -1, -1},         /* 38.4 MHz */
 };
 
 struct dplls omap5_dplls_es1 = {
@@ -275,10 +293,12 @@ struct dplls omap5_dplls_es2 = {
 
 struct dplls dra7xx_dplls = {
        .mpu = mpu_dpll_params_1ghz,
-       .core = core_dpll_params_2128mhz_ddr532_dra7xx,
+       .core = core_dpll_params_2128mhz_dra7xx,
        .per = per_dpll_params_768mhz_dra7xx,
+       .abe = abe_dpll_params_sysclk2_361267khz,
+       .iva = iva_dpll_params_2330mhz_dra7xx,
        .usb = usb_dpll_params_1920mhz,
-       .ddr = ddr_dpll_params_1066mhz,
+       .ddr = ddr_dpll_params_2128mhz,
 };
 
 struct pmic_data palmas = {
@@ -289,6 +309,22 @@ struct pmic_data palmas = {
         * Offset code 0 switches OFF the SMPS
         */
        .start_code = 6,
+       .i2c_slave_addr = SMPS_I2C_SLAVE_ADDR,
+       .pmic_bus_init  = sri2c_init,
+       .pmic_write     = omap_vc_bypass_send_value,
+};
+
+struct pmic_data tps659038 = {
+       .base_offset = PALMAS_SMPS_BASE_VOLT_UV,
+       .step = 10000, /* 10 mV represented in uV */
+       /*
+        * Offset codes 1-6 all give the base voltage in Palmas
+        * Offset code 0 switches OFF the SMPS
+        */
+       .start_code = 6,
+       .i2c_slave_addr = TPS659038_I2C_SLAVE_ADDR,
+       .pmic_bus_init  = gpi2c_init,
+       .pmic_write     = palmas_i2c_write_u8,
 };
 
 struct vcores_data omap5430_volts = {
@@ -319,6 +355,38 @@ struct vcores_data omap5430_volts_es2 = {
        .mm.pmic = &palmas,
 };
 
+struct vcores_data dra752_volts = {
+       .mpu.value      = VDD_MPU_DRA752,
+       .mpu.efuse.reg  = STD_FUSE_OPP_VMIN_MPU_NOM,
+       .mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .mpu.addr       = TPS659038_REG_ADDR_SMPS12_MPU,
+       .mpu.pmic       = &tps659038,
+
+       .eve.value      = VDD_EVE_DRA752,
+       .eve.efuse.reg  = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
+       .eve.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .eve.addr       = TPS659038_REG_ADDR_SMPS45_EVE,
+       .eve.pmic       = &tps659038,
+
+       .gpu.value      = VDD_GPU_DRA752,
+       .gpu.efuse.reg  = STD_FUSE_OPP_VMIN_GPU_NOM,
+       .gpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .gpu.addr       = TPS659038_REG_ADDR_SMPS6_GPU,
+       .gpu.pmic       = &tps659038,
+
+       .core.value     = VDD_CORE_DRA752,
+       .core.efuse.reg = STD_FUSE_OPP_VMIN_CORE_NOM,
+       .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
+       .core.addr      = TPS659038_REG_ADDR_SMPS7_CORE,
+       .core.pmic      = &tps659038,
+
+       .iva.value      = VDD_IVA_DRA752,
+       .iva.efuse.reg  = STD_FUSE_OPP_VMIN_IVA_NOM,
+       .iva.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .iva.addr       = TPS659038_REG_ADDR_SMPS8_IVA,
+       .iva.pmic       = &tps659038,
+};
+
 /*
  * Enable essential clock domains, modules and
  * do some additional special settings needed
@@ -383,12 +451,6 @@ void enable_basic_clocks(void)
                         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);
@@ -403,6 +465,7 @@ void enable_basic_uboot_clocks(void)
        };
 
        u32 const clk_modules_hw_auto_essential[] = {
+               (*prcm)->cm_l3init_hsusbtll_clkctrl,
                0
        };
 
@@ -411,7 +474,7 @@ void enable_basic_uboot_clocks(void)
                (*prcm)->cm_l4per_i2c2_clkctrl,
                (*prcm)->cm_l4per_i2c3_clkctrl,
                (*prcm)->cm_l4per_i2c4_clkctrl,
-               (*prcm)->cm_l3init_hsusbtll_clkctrl,
+               (*prcm)->cm_l4per_i2c5_clkctrl,
                (*prcm)->cm_l3init_hsusbhost_clkctrl,
                (*prcm)->cm_l3init_fsusb_clkctrl,
                0
@@ -539,6 +602,17 @@ const struct ctrl_ioregs ioregs_omap5432_es2 = {
        .ctrl_emif_sdram_config_ext = SDRAM_CONFIG_EXT_RD_LVL_11_SAMPLES,
 };
 
+const struct ctrl_ioregs ioregs_dra7xx_es1 = {
+       .ctrl_ddrch = 0x40404040,
+       .ctrl_lpddr2ch = 0x40404040,
+       .ctrl_ddr3ch = 0x80808080,
+       .ctrl_ddrio_0 = 0xbae8c631,
+       .ctrl_ddrio_1 = 0xb46318d8,
+       .ctrl_ddrio_2 = 0x84210000,
+       .ctrl_emif_sdram_config_ext = 0xb2c00000,
+       .ctrl_ddr_ctrl_ext_0 = 0xA2000000,
+};
+
 void hw_data_init(void)
 {
        u32 omap_rev = omap_revision();
@@ -564,7 +638,7 @@ void hw_data_init(void)
        case DRA752_ES1_0:
        *prcm = &dra7xx_prcm;
        *dplls_data = &dra7xx_dplls;
-       *omap_vcores = &omap5430_volts_es2;
+       *omap_vcores = &dra752_volts;
        *ctrl = &dra7xx_ctrl;
        break;
 
@@ -581,14 +655,16 @@ void get_ioregs(const struct ctrl_ioregs **regs)
        case OMAP5430_ES1_0:
        case OMAP5430_ES2_0:
                *regs = &ioregs_omap5430;
-       break;
+               break;
        case OMAP5432_ES1_0:
                *regs = &ioregs_omap5432_es1;
-       break;
+               break;
        case OMAP5432_ES2_0:
-       case DRA752_ES1_0:
                *regs = &ioregs_omap5432_es2;
-       break;
+               break;
+       case DRA752_ES1_0:
+               *regs = &ioregs_dra7xx_es1;
+               break;
 
        default:
                printf("\n INVALID OMAP REVISION ");
index 2f4b24752b223206de268880f196a8788b8c9227..daf124e99cb034403bed4c765b331b3cb83db3f9 100644 (file)
 #include <asm/armv7.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/sizes.h>
 #include <asm/utils.h>
 #include <asm/arch/gpio.h>
 #include <asm/emif.h>
+#include <asm/omap_common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-u32 *const omap_si_rev = (u32 *)OMAP5_SRAM_SCRATCH_OMAP5_REV;
+u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
 
 static struct gpio_bank gpio_bank_54xx[6] = {
        { (void *)OMAP54XX_GPIO1_BASE, METHOD_GPIO_24XX },
@@ -99,16 +100,21 @@ static void io_settings_ddr3(void)
        writel(ioregs->ctrl_emif_sdram_config_ext,
               (*ctrl)->control_emif2_sdram_config_ext);
 
-       /* Disable DLL select */
-       io_settings = (readl((*ctrl)->control_port_emif1_sdram_config)
+       if (is_omap54xx()) {
+               /* Disable DLL select */
+               io_settings = (readl((*ctrl)->control_port_emif1_sdram_config)
                                                        & 0xFFEFFFFF);
-       writel(io_settings,
-               (*ctrl)->control_port_emif1_sdram_config);
+               writel(io_settings,
+                       (*ctrl)->control_port_emif1_sdram_config);
 
-       io_settings = (readl((*ctrl)->control_port_emif2_sdram_config)
+               io_settings = (readl((*ctrl)->control_port_emif2_sdram_config)
                                                        & 0xFFEFFFFF);
-       writel(io_settings,
-               (*ctrl)->control_port_emif2_sdram_config);
+               writel(io_settings,
+                       (*ctrl)->control_port_emif2_sdram_config);
+       } else {
+               writel(ioregs->ctrl_ddr_ctrl_ext_0,
+                               (*ctrl)->control_ddr_control_ext_0);
+       }
 }
 
 /*
@@ -200,6 +206,9 @@ void srcomp_enable(void)
        u32 sysclk_ind  = get_sys_clk_index();
        u32 omap_rev    = omap_revision();
 
+       if (!is_omap54xx())
+               return;
+
        mul_factor = srcomp_parameters[sysclk_ind].multiply_factor;
        div_factor = srcomp_parameters[sysclk_ind].divide_factor;
 
@@ -363,3 +372,22 @@ u32 warm_reset(void)
 {
        return readl((*prcm)->prm_rstst) & PRM_RSTST_WARM_RESET_MASK;
 }
+
+void setup_warmreset_time(void)
+{
+       u32 rst_time, rst_val;
+
+#ifndef CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC
+       rst_time = CONFIG_DEFAULT_OMAP_RESET_TIME_MAX_USEC;
+#else
+       rst_time = CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC;
+#endif
+       rst_time = usec_to_32k(rst_time) << RSTTIME1_SHIFT;
+
+       if (rst_time > RSTTIME1_MASK)
+               rst_time = RSTTIME1_MASK;
+
+       rst_val = readl((*prcm)->prm_rsttime) & ~RSTTIME1_MASK;
+       rst_val |= rst_time;
+       writel(rst_val, (*prcm)->prm_rsttime);
+}
index b8a61fe8813fd6f1bac8fd55a273dfa847f89278..e839ff5fe53828b0f38c27dea002f02c7fcd863b 100644 (file)
@@ -298,6 +298,7 @@ struct prcm_regs const omap5_es1_prcm = {
        .cm_wkupaon_io_srcomp_clkctrl = 0x4ae07898,
        .prm_rstctrl = 0x4ae07b00,
        .prm_rstst = 0x4ae07b04,
+       .prm_rsttime = 0x4ae07b08,
        .prm_vc_val_bypass = 0x4ae07ba0,
        .prm_vc_cfg_i2c_mode = 0x4ae07bb4,
        .prm_vc_cfg_i2c_clk = 0x4ae07bb8,
@@ -307,10 +308,16 @@ struct prcm_regs const omap5_es1_prcm = {
        .prm_sldo_mpu_ctrl = 0x4ae07bd0,
        .prm_sldo_mm_setup = 0x4ae07bd4,
        .prm_sldo_mm_ctrl = 0x4ae07bd8,
+
+       /* SCRM stuff, used by some boards */
+       .scrm_auxclk0 = 0x4ae0a310,
+       .scrm_auxclk1 = 0x4ae0a314,
 };
 
 struct omap_sys_ctrl_regs const omap5_ctrl = {
        .control_status                         = 0x4A002134,
+       .control_std_fuse_opp_vdd_mpu_2         = 0x4A0021B4,
+       .control_padconf_core_base              = 0x4A002800,
        .control_paconf_global                  = 0x4A002DA0,
        .control_paconf_mode                    = 0x4A002DA4,
        .control_smart1io_padconf_0             = 0x4A002DA8,
@@ -358,6 +365,8 @@ struct omap_sys_ctrl_regs const omap5_ctrl = {
        .control_port_emif2_sdram_config        = 0x4AE0C118,
        .control_emif1_sdram_config_ext         = 0x4AE0C144,
        .control_emif2_sdram_config_ext         = 0x4AE0C148,
+       .control_wkup_ldovbb_mpu_voltage_ctrl   = 0x4AE0C318,
+       .control_padconf_wkup_base              = 0x4AE0C800,
        .control_smart1nopmio_padconf_0         = 0x4AE0CDA0,
        .control_smart1nopmio_padconf_1         = 0x4AE0CDA4,
        .control_padconf_mode                   = 0x4AE0CDA8,
@@ -434,6 +443,7 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
        .control_srcomp_east_side               = 0x4A002E7C,
        .control_srcomp_west_side               = 0x4A002E80,
        .control_srcomp_code_latch              = 0x4A002E84,
+       .control_ddr_control_ext_0              = 0x4A002E88,
        .control_padconf_core_base              = 0x4A003400,
        .control_port_emif1_sdram_config        = 0x4AE0C110,
        .control_port_emif1_lpddr2_nvm_config   = 0x4AE0C114,
@@ -709,6 +719,9 @@ struct prcm_regs const omap5_es2_prcm = {
        .cm_l3init_fsusb_clkctrl = 0x4a0096d0,
        .cm_l3init_ocp2scp1_clkctrl = 0x4a0096e0,
 
+       /* prm irqstatus regs */
+       .prm_irqstatus_mpu_2 = 0x4ae06014,
+
        /* l4 wkup regs */
        .cm_abe_pll_ref_clksel = 0x4ae0610c,
        .cm_sys_clksel = 0x4ae06110,
@@ -729,6 +742,7 @@ struct prcm_regs const omap5_es2_prcm = {
        .cm_wkupaon_io_srcomp_clkctrl = 0x4ae07998,
        .prm_rstctrl = 0x4ae07c00,
        .prm_rstst = 0x4ae07c04,
+       .prm_rsttime = 0x4ae07c08,
        .prm_vc_val_bypass = 0x4ae07ca0,
        .prm_vc_cfg_i2c_mode = 0x4ae07cb4,
        .prm_vc_cfg_i2c_clk = 0x4ae07cb8,
@@ -739,6 +753,12 @@ struct prcm_regs const omap5_es2_prcm = {
        .prm_sldo_mpu_ctrl = 0x4ae07cd0,
        .prm_sldo_mm_setup = 0x4ae07cd4,
        .prm_sldo_mm_ctrl = 0x4ae07cd8,
+       .prm_abbldo_mpu_setup = 0x4ae07cdc,
+       .prm_abbldo_mpu_ctrl = 0x4ae07ce0,
+
+       /* SCRM stuff, used by some boards */
+       .scrm_auxclk0 = 0x4ae0a310,
+       .scrm_auxclk1 = 0x4ae0a314,
 };
 
 struct prcm_regs const dra7xx_prcm = {
@@ -940,6 +960,7 @@ struct prcm_regs const dra7xx_prcm = {
        /* l4 wkup regs */
        .cm_abe_pll_ref_clksel                  = 0x4ae0610c,
        .cm_sys_clksel                          = 0x4ae06110,
+       .cm_abe_pll_sys_clksel                  = 0x4ae06118,
        .cm_wkup_clkstctrl                      = 0x4ae07800,
        .cm_wkup_l4wkup_clkctrl                 = 0x4ae07820,
        .cm_wkup_wdtimer1_clkctrl               = 0x4ae07828,
@@ -952,6 +973,7 @@ struct prcm_regs const dra7xx_prcm = {
        .cm_wkupaon_scrm_clkctrl                = 0x4ae07890,
        .prm_rstctrl                            = 0x4ae07d00,
        .prm_rstst                              = 0x4ae07d04,
+       .prm_rsttime                            = 0x4ae07d08,
        .prm_vc_val_bypass                      = 0x4ae07da0,
        .prm_vc_cfg_i2c_mode                    = 0x4ae07db4,
        .prm_vc_cfg_i2c_clk                     = 0x4ae07db8,
index 6b461e4846021fee9899e77cbd23ae870382d76a..1b445a61ebabf47731a578c02f0dd2659289d9b6 100644 (file)
@@ -108,6 +108,7 @@ const struct emif_regs emif_regs_266_mhz_2cs = {
 const struct emif_regs emif_regs_ddr3_532_mhz_1cs = {
        .sdram_config_init              = 0x61851B32,
        .sdram_config                   = 0x61851B32,
+       .sdram_config2                  = 0x0,
        .ref_ctrl                       = 0x00001035,
        .sdram_tim1                     = 0xCCCF36B3,
        .sdram_tim2                     = 0x308F7FDA,
@@ -131,6 +132,7 @@ const struct emif_regs emif_regs_ddr3_532_mhz_1cs = {
 const struct emif_regs emif_regs_ddr3_532_mhz_1cs_es2 = {
        .sdram_config_init              = 0x61851B32,
        .sdram_config                   = 0x61851B32,
+       .sdram_config2                  = 0x0,
        .ref_ctrl                       = 0x00001035,
        .sdram_tim1                     = 0xCCCF36B3,
        .sdram_tim2                     = 0x308F7FDA,
@@ -151,6 +153,54 @@ const struct emif_regs emif_regs_ddr3_532_mhz_1cs_es2 = {
        .emif_rd_wr_exec_thresh         = 0x40000305
 };
 
+const struct emif_regs emif_1_regs_ddr3_532_mhz_1cs_dra_es1 = {
+       .sdram_config_init              = 0x61851ab2,
+       .sdram_config                   = 0x61851ab2,
+       .sdram_config2                  = 0x08000000,
+       .ref_ctrl                       = 0x00001035,
+       .sdram_tim1                     = 0xCCCF36B3,
+       .sdram_tim2                     = 0x308F7FDA,
+       .sdram_tim3                     = 0x027F88A8,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x0007190B,
+       .temp_alert_config              = 0x00000000,
+       .emif_ddr_phy_ctlr_1_init       = 0x0E20400A,
+       .emif_ddr_phy_ctlr_1            = 0x0E24400A,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04040100,
+       .emif_ddr_ext_phy_ctrl_2        = 0x009E009E,
+       .emif_ddr_ext_phy_ctrl_3        = 0x009E009E,
+       .emif_ddr_ext_phy_ctrl_4        = 0x009E009E,
+       .emif_ddr_ext_phy_ctrl_5        = 0x009E009E,
+       .emif_rd_wr_lvl_rmp_win         = 0x00000000,
+       .emif_rd_wr_lvl_rmp_ctl         = 0x80000000,
+       .emif_rd_wr_lvl_ctl             = 0x00000000,
+       .emif_rd_wr_exec_thresh         = 0x00000305
+};
+
+const struct emif_regs emif_2_regs_ddr3_532_mhz_1cs_dra_es1 = {
+       .sdram_config_init              = 0x61851B32,
+       .sdram_config                   = 0x61851B32,
+       .sdram_config2                  = 0x08000000,
+       .ref_ctrl                       = 0x00001035,
+       .sdram_tim1                     = 0xCCCF36B3,
+       .sdram_tim2                     = 0x308F7FDA,
+       .sdram_tim3                     = 0x027F88A8,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x0007190B,
+       .temp_alert_config              = 0x00000000,
+       .emif_ddr_phy_ctlr_1_init       = 0x0020400A,
+       .emif_ddr_phy_ctlr_1            = 0x0E24400A,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04040100,
+       .emif_ddr_ext_phy_ctrl_2        = 0x009D009D,
+       .emif_ddr_ext_phy_ctrl_3        = 0x009D009D,
+       .emif_ddr_ext_phy_ctrl_4        = 0x009D009D,
+       .emif_ddr_ext_phy_ctrl_5        = 0x009D009D,
+       .emif_rd_wr_lvl_rmp_win         = 0x00000000,
+       .emif_rd_wr_lvl_rmp_ctl         = 0x80000000,
+       .emif_rd_wr_lvl_ctl             = 0x00000000,
+       .emif_rd_wr_exec_thresh         = 0x00000305
+};
+
 const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
        .dmm_lisa_map_0 = 0x0,
        .dmm_lisa_map_1 = 0x0,
@@ -159,11 +209,39 @@ const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
        .is_ma_present  = 0x1
 };
 
-const struct dmm_lisa_map_regs lisa_map_512M_x_1 = {
+/*
+ * DRA752 EVM board has 1.5 GB of memory
+ * EMIF1 --> 2Gb * 2 =  512MB
+ * EMIF2 --> 2Gb * 4 =  1GB
+ * so mapping 1GB interleaved and 512MB non-interleaved
+ */
+const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2_2G_x_1_x_2 = {
+       .dmm_lisa_map_0 = 0x0,
+       .dmm_lisa_map_1 = 0x80640300,
+       .dmm_lisa_map_2 = 0xC0500220,
+       .dmm_lisa_map_3 = 0xFF020100,
+       .is_ma_present  = 0x1
+};
+
+/*
+ * DRA752 EVM EMIF1 ONLY CONFIGURATION
+ */
+const struct dmm_lisa_map_regs lisa_map_2G_x_1_x_2 = {
        .dmm_lisa_map_0 = 0x0,
        .dmm_lisa_map_1 = 0x0,
-       .dmm_lisa_map_2 = 0x0,
-       .dmm_lisa_map_3 = 0x80500100,
+       .dmm_lisa_map_2 = 0x80500100,
+       .dmm_lisa_map_3 = 0xFF020100,
+       .is_ma_present  = 0x1
+};
+
+/*
+ * DRA752 EVM EMIF2 ONLY CONFIGURATION
+ */
+const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2 = {
+       .dmm_lisa_map_0 = 0x0,
+       .dmm_lisa_map_1 = 0x0,
+       .dmm_lisa_map_2 = 0x80600200,
+       .dmm_lisa_map_3 = 0xFF020100,
        .is_ma_present  = 0x1
 };
 
@@ -180,9 +258,20 @@ static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
                *regs = &emif_regs_532_mhz_2cs_es2;
                break;
        case OMAP5432_ES2_0:
+               *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
+               break;
        case DRA752_ES1_0:
+               switch (emif_nr) {
+               case 1:
+                       *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
+                       break;
+               case 2:
+                       *regs = &emif_2_regs_ddr3_532_mhz_1cs_dra_es1;
+                       break;
+               }
+               break;
        default:
-               *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
+               *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
        }
 }
 
@@ -201,7 +290,7 @@ static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
                break;
        case DRA752_ES1_0:
        default:
-               *dmm_lisa_regs = &lisa_map_512M_x_1;
+               *dmm_lisa_regs = &lisa_map_2G_x_2_x_2_2G_x_1_x_2;
        }
 
 }
@@ -252,7 +341,8 @@ const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000077
+       0x00000077,
+       0x0
 };
 
 const u32 ddr3_ext_phy_ctrl_const_base_es1[EMIF_EXT_PHY_CTRL_CONST_REG] = {
@@ -274,7 +364,8 @@ const u32 ddr3_ext_phy_ctrl_const_base_es1[EMIF_EXT_PHY_CTRL_CONST_REG] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000057
+       0x00000057,
+       0x0
 };
 
 const u32 ddr3_ext_phy_ctrl_const_base_es2[EMIF_EXT_PHY_CTRL_CONST_REG] = {
@@ -296,7 +387,56 @@ const u32 ddr3_ext_phy_ctrl_const_base_es2[EMIF_EXT_PHY_CTRL_CONST_REG] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000057
+       0x00000057,
+       0x0
+};
+
+const u32
+dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[EMIF_EXT_PHY_CTRL_CONST_REG] = {
+       0x009E009E,
+       0x002E002E,
+       0x002E002E,
+       0x002E002E,
+       0x002E002E,
+       0x002E002E,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x004D004D,
+       0x0,
+       0x600020,
+       0x40010080,
+       0x8102040
+};
+
+const u32
+dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[EMIF_EXT_PHY_CTRL_CONST_REG] = {
+       0x009D009D,
+       0x002D002D,
+       0x002D002D,
+       0x002D002D,
+       0x002D002D,
+       0x002D002D,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x00570057,
+       0x0,
+       0x600020,
+       0x40010080,
+       0x8102040
 };
 
 const struct lpddr2_mr_regs mr_regs = {
@@ -307,7 +447,7 @@ const struct lpddr2_mr_regs mr_regs = {
        .mr16   = MR16_REF_FULL_ARRAY
 };
 
-static void emif_get_ext_phy_ctrl_const_regs(const u32 **regs)
+static void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs)
 {
        switch (omap_revision()) {
        case OMAP5430_ES1_0:
@@ -318,7 +458,14 @@ static void emif_get_ext_phy_ctrl_const_regs(const u32 **regs)
                *regs = ddr3_ext_phy_ctrl_const_base_es1;
                break;
        case OMAP5432_ES2_0:
+               *regs = ddr3_ext_phy_ctrl_const_base_es2;
+               break;
        case DRA752_ES1_0:
+               if (emif_nr == 1)
+                       *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
+               else
+                       *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
+               break;
        default:
                *regs = ddr3_ext_phy_ctrl_const_base_es2;
 
@@ -334,9 +481,12 @@ void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
 {
        u32 *ext_phy_ctrl_base = 0;
        u32 *emif_ext_phy_ctrl_base = 0;
+       u32 emif_nr;
        const u32 *ext_phy_ctrl_const_regs;
        u32 i = 0;
 
+       emif_nr = (base == EMIF1_BASE) ? 1 : 2;
+
        struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
 
        ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
@@ -353,7 +503,7 @@ void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
         * external phy 6-24 registers do not change with
         * ddr frequency
         */
-       emif_get_ext_phy_ctrl_const_regs(&ext_phy_ctrl_const_regs);
+       emif_get_ext_phy_ctrl_const_regs(emif_nr, &ext_phy_ctrl_const_regs);
        for (i = 0; i < EMIF_EXT_PHY_CTRL_CONST_REG; i++) {
                writel(ext_phy_ctrl_const_regs[i],
                       emif_ext_phy_ctrl_base++);
index e9e57e6450c03e73b7ea130a90b7d9dc0c916592..8e9cb191199922deb3ed16faf67f32ba90e9e748 100644 (file)
@@ -94,10 +94,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -167,80 +163,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-#ifndef CONFIG_SPL_BUILD
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-ENTRY(relocate_code)
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-
-relocate_done:
-
-       bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-ENDPROC(relocate_code)
-
-#endif
-
 ENTRY(c_runtime_cpu_setup)
 /*
  * If I-cache is enabled invalidate it
diff --git a/arch/arm/cpu/armv7/vf610/Makefile b/arch/arm/cpu/armv7/vf610/Makefile
new file mode 100644 (file)
index 0000000..9232cd4
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# Copyright 2013 Freescale Semiconductor, Inc.
+#
+# 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$(SOC).o
+
+COBJS  += generic.o
+COBJS  += timer.o
+
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+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/armv7/vf610/generic.c b/arch/arm/cpu/armv7/vf610/generic.c
new file mode 100644 (file)
index 0000000..87f2a86
--- /dev/null
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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/imx-regs.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/crm_regs.h>
+#include <netdev.h>
+#ifdef CONFIG_FSL_ESDHC
+#include <fsl_esdhc.h>
+#endif
+
+#ifdef CONFIG_FSL_ESDHC
+DECLARE_GLOBAL_DATA_PTR;
+#endif
+
+#ifdef CONFIG_MXC_OCOTP
+void enable_ocotp_clk(unsigned char enable)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 reg;
+
+       reg = readl(&ccm->ccgr6);
+       if (enable)
+               reg |= CCM_CCGR6_OCOTP_CTRL_MASK;
+       else
+               reg &= ~CCM_CCGR6_OCOTP_CTRL_MASK;
+       writel(reg, &ccm->ccgr6);
+}
+#endif
+
+static u32 get_mcu_main_clk(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 ccm_ccsr, ccm_cacrr, armclk_div;
+       u32 sysclk_sel, pll_pfd_sel = 0;
+       u32 freq = 0;
+
+       ccm_ccsr = readl(&ccm->ccsr);
+       sysclk_sel = ccm_ccsr & CCM_CCSR_SYS_CLK_SEL_MASK;
+       sysclk_sel >>= CCM_CCSR_SYS_CLK_SEL_OFFSET;
+
+       ccm_cacrr = readl(&ccm->cacrr);
+       armclk_div = ccm_cacrr & CCM_CACRR_ARM_CLK_DIV_MASK;
+       armclk_div >>= CCM_CACRR_ARM_CLK_DIV_OFFSET;
+       armclk_div += 1;
+
+       switch (sysclk_sel) {
+       case 0:
+               freq = FASE_CLK_FREQ;
+               break;
+       case 1:
+               freq = SLOW_CLK_FREQ;
+               break;
+       case 2:
+               pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL2_PFD_CLK_SEL_MASK;
+               pll_pfd_sel >>= CCM_CCSR_PLL2_PFD_CLK_SEL_OFFSET;
+               if (pll_pfd_sel == 0)
+                       freq = PLL2_MAIN_FREQ;
+               else if (pll_pfd_sel == 1)
+                       freq = PLL2_PFD1_FREQ;
+               else if (pll_pfd_sel == 2)
+                       freq = PLL2_PFD2_FREQ;
+               else if (pll_pfd_sel == 3)
+                       freq = PLL2_PFD3_FREQ;
+               else if (pll_pfd_sel == 4)
+                       freq = PLL2_PFD4_FREQ;
+               break;
+       case 3:
+               freq = PLL2_MAIN_FREQ;
+               break;
+       case 4:
+               pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL1_PFD_CLK_SEL_MASK;
+               pll_pfd_sel >>= CCM_CCSR_PLL1_PFD_CLK_SEL_OFFSET;
+               if (pll_pfd_sel == 0)
+                       freq = PLL1_MAIN_FREQ;
+               else if (pll_pfd_sel == 1)
+                       freq = PLL1_PFD1_FREQ;
+               else if (pll_pfd_sel == 2)
+                       freq = PLL1_PFD2_FREQ;
+               else if (pll_pfd_sel == 3)
+                       freq = PLL1_PFD3_FREQ;
+               else if (pll_pfd_sel == 4)
+                       freq = PLL1_PFD4_FREQ;
+               break;
+       case 5:
+               freq = PLL3_MAIN_FREQ;
+               break;
+       default:
+               printf("unsupported system clock select\n");
+       }
+
+       return freq / armclk_div;
+}
+
+static u32 get_bus_clk(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 ccm_cacrr, busclk_div;
+
+       ccm_cacrr = readl(&ccm->cacrr);
+
+       busclk_div = ccm_cacrr & CCM_CACRR_BUS_CLK_DIV_MASK;
+       busclk_div >>= CCM_CACRR_BUS_CLK_DIV_OFFSET;
+       busclk_div += 1;
+
+       return get_mcu_main_clk() / busclk_div;
+}
+
+static u32 get_ipg_clk(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 ccm_cacrr, ipgclk_div;
+
+       ccm_cacrr = readl(&ccm->cacrr);
+
+       ipgclk_div = ccm_cacrr & CCM_CACRR_IPG_CLK_DIV_MASK;
+       ipgclk_div >>= CCM_CACRR_IPG_CLK_DIV_OFFSET;
+       ipgclk_div += 1;
+
+       return get_bus_clk() / ipgclk_div;
+}
+
+static u32 get_uart_clk(void)
+{
+       return get_ipg_clk();
+}
+
+static u32 get_sdhc_clk(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 ccm_cscmr1, ccm_cscdr2, sdhc_clk_sel, sdhc_clk_div;
+       u32 freq = 0;
+
+       ccm_cscmr1 = readl(&ccm->cscmr1);
+       sdhc_clk_sel = ccm_cscmr1 & CCM_CSCMR1_ESDHC1_CLK_SEL_MASK;
+       sdhc_clk_sel >>= CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET;
+
+       ccm_cscdr2 = readl(&ccm->cscdr2);
+       sdhc_clk_div = ccm_cscdr2 & CCM_CSCDR2_ESDHC1_CLK_DIV_MASK;
+       sdhc_clk_div >>= CCM_CSCDR2_ESDHC1_CLK_DIV_OFFSET;
+       sdhc_clk_div += 1;
+
+       switch (sdhc_clk_sel) {
+       case 0:
+               freq = PLL3_MAIN_FREQ;
+               break;
+       case 1:
+               freq = PLL3_PFD3_FREQ;
+               break;
+       case 2:
+               freq = PLL1_PFD3_FREQ;
+               break;
+       case 3:
+               freq = get_bus_clk();
+               break;
+       }
+
+       return freq / sdhc_clk_div;
+}
+
+u32 get_fec_clk(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       u32 ccm_cscmr2, rmii_clk_sel;
+       u32 freq = 0;
+
+       ccm_cscmr2 = readl(&ccm->cscmr2);
+       rmii_clk_sel = ccm_cscmr2 & CCM_CSCMR2_RMII_CLK_SEL_MASK;
+       rmii_clk_sel >>= CCM_CSCMR2_RMII_CLK_SEL_OFFSET;
+
+       switch (rmii_clk_sel) {
+       case 0:
+               freq = ENET_EXTERNAL_CLK;
+               break;
+       case 1:
+               freq = AUDIO_EXTERNAL_CLK;
+               break;
+       case 2:
+               freq = PLL5_MAIN_FREQ;
+               break;
+       case 3:
+               freq = PLL5_MAIN_FREQ / 2;
+               break;
+       }
+
+       return freq;
+}
+
+unsigned int mxc_get_clock(enum mxc_clock clk)
+{
+       switch (clk) {
+       case MXC_ARM_CLK:
+               return get_mcu_main_clk();
+       case MXC_BUS_CLK:
+               return get_bus_clk();
+       case MXC_IPG_CLK:
+               return get_ipg_clk();
+       case MXC_UART_CLK:
+               return get_uart_clk();
+       case MXC_ESDHC_CLK:
+               return get_sdhc_clk();
+       case MXC_FEC_CLK:
+               return get_fec_clk();
+       default:
+               break;
+       }
+       return -1;
+}
+
+/* Dump some core clocks */
+int do_vf610_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
+                        char * const argv[])
+{
+       printf("\n");
+       printf("cpu clock : %8d MHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000);
+       printf("bus clock : %8d MHz\n", mxc_get_clock(MXC_BUS_CLK) / 1000000);
+       printf("ipg clock : %8d MHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000000);
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       clocks, CONFIG_SYS_MAXARGS, 1, do_vf610_showclocks,
+       "display clocks",
+       ""
+);
+
+#ifdef CONFIG_FEC_MXC
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
+{
+       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+       struct fuse_bank *bank = &ocotp->bank[4];
+       struct fuse_bank4_regs *fuse =
+               (struct fuse_bank4_regs *)bank->fuse_regs;
+
+       u32 value = readl(&fuse->mac_addr0);
+       mac[0] = (value >> 8);
+       mac[1] = value;
+
+       value = readl(&fuse->mac_addr1);
+       mac[2] = value >> 24;
+       mac[3] = value >> 16;
+       mac[4] = value >> 8;
+       mac[5] = value;
+}
+#endif
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+static char *get_reset_cause(void)
+{
+       u32 cause;
+       struct src *src_regs = (struct src *)SRC_BASE_ADDR;
+
+       cause = readl(&src_regs->srsr);
+       writel(cause, &src_regs->srsr);
+       cause &= 0xff;
+
+       switch (cause) {
+       case 0x08:
+               return "WDOG";
+       case 0x20:
+               return "JTAG HIGH-Z";
+       case 0x80:
+               return "EXTERNAL RESET";
+       case 0xfd:
+               return "POR";
+       default:
+               return "unknown reset";
+       }
+}
+
+int print_cpuinfo(void)
+{
+       printf("CPU:   Freescale Vybrid VF610 at %d MHz\n",
+               mxc_get_clock(MXC_ARM_CLK) / 1000000);
+       printf("Reset cause: %s\n", get_reset_cause());
+
+       return 0;
+}
+#endif
+
+int cpu_eth_init(bd_t *bis)
+{
+       int rc = -ENODEV;
+
+#if defined(CONFIG_FEC_MXC)
+       rc = fecmxc_initialize(bis);
+#endif
+
+       return rc;
+}
+
+#ifdef CONFIG_FSL_ESDHC
+int cpu_mmc_init(bd_t *bis)
+{
+       return fsl_esdhc_mmc_init(bis);
+}
+#endif
+
+int get_clocks(void)
+{
+#ifdef CONFIG_FSL_ESDHC
+       gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+#endif
+       return 0;
+}
diff --git a/arch/arm/cpu/armv7/vf610/timer.c b/arch/arm/cpu/armv7/vf610/timer.c
new file mode 100644 (file)
index 0000000..f8fbed7
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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 <div64.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/clock.h>
+
+static struct pit_reg *cur_pit = (struct pit_reg *)PIT_BASE_ADDR;
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define TIMER_LOAD_VAL 0xffffffff
+
+static inline unsigned long long tick_to_time(unsigned long long tick)
+{
+       tick *= CONFIG_SYS_HZ;
+       do_div(tick, mxc_get_clock(MXC_IPG_CLK));
+
+       return tick;
+}
+
+static inline unsigned long long us_to_tick(unsigned long long usec)
+{
+       usec = usec * mxc_get_clock(MXC_IPG_CLK)  + 999999;
+       do_div(usec, 1000000);
+
+       return usec;
+}
+
+int timer_init(void)
+{
+       __raw_writel(0, &cur_pit->mcr);
+
+       __raw_writel(TIMER_LOAD_VAL, &cur_pit->ldval1);
+       __raw_writel(0, &cur_pit->tctrl1);
+       __raw_writel(1, &cur_pit->tctrl1);
+
+       gd->arch.tbl = 0;
+       gd->arch.tbu = 0;
+
+       return 0;
+}
+
+unsigned long long get_ticks(void)
+{
+       ulong now = TIMER_LOAD_VAL - __raw_readl(&cur_pit->cval1);
+
+       /* increment tbu if tbl has rolled over */
+       if (now < gd->arch.tbl)
+               gd->arch.tbu++;
+       gd->arch.tbl = now;
+
+       return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
+}
+
+ulong get_timer_masked(void)
+{
+       return tick_to_time(get_ticks());
+}
+
+ulong get_timer(ulong base)
+{
+       return get_timer_masked() - base;
+}
+
+/* delay x useconds AND preserve advance timstamp value */
+void __udelay(unsigned long usec)
+{
+       unsigned long long start;
+       ulong tmo;
+
+       start = get_ticks();                    /* get current timestamp */
+       tmo = us_to_tick(usec);                 /* convert usecs to ticks */
+       while ((get_ticks() - start) < tmo)
+               ;                               /* loop till time has passed */
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On ARM it returns the number of timer ticks per second.
+ */
+ulong get_tbclk(void)
+{
+       return mxc_get_clock(MXC_IPG_CLK);
+}
index 788a8fd14f54f41a4c906620bdb1183b531d57c4..52048c67662e7185ba854b402a0b433ef06ec718 100644 (file)
@@ -28,6 +28,9 @@
 #define SLCR_LOCK_MAGIC                0x767B
 #define SLCR_UNLOCK_MAGIC      0xDF0D
 
+#define SLCR_IDCODE_MASK       0x1F000
+#define SLCR_IDCODE_SHIFT      12
+
 static int slcr_lock = 1; /* 1 means locked, 0 means unlocked */
 
 void zynq_slcr_lock(void)
@@ -61,3 +64,61 @@ void zynq_slcr_cpu_reset(void)
 
        writel(1, &slcr_base->pss_rst_ctrl);
 }
+
+/* Setup clk for network */
+void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk)
+{
+       zynq_slcr_unlock();
+
+       if (gem_id > 1) {
+               printf("Non existing GEM id %d\n", gem_id);
+               goto out;
+       }
+
+       if (gem_id) {
+               /* Set divisors for appropriate frequency in GEM_CLK_CTRL */
+               writel(clk, &slcr_base->gem1_clk_ctrl);
+               /* Configure GEM_RCLK_CTRL */
+               writel(rclk, &slcr_base->gem1_rclk_ctrl);
+       } else {
+               /* Set divisors for appropriate frequency in GEM_CLK_CTRL */
+               writel(clk, &slcr_base->gem0_clk_ctrl);
+               /* Configure GEM_RCLK_CTRL */
+               writel(rclk, &slcr_base->gem0_rclk_ctrl);
+       }
+
+out:
+       zynq_slcr_lock();
+}
+
+void zynq_slcr_devcfg_disable(void)
+{
+       zynq_slcr_unlock();
+
+       /* Disable AXI interface */
+       writel(0xFFFFFFFF, &slcr_base->fpga_rst_ctrl);
+
+       /* Set Level Shifters DT618760 */
+       writel(0xA, &slcr_base->lvl_shftr_en);
+
+       zynq_slcr_lock();
+}
+
+void zynq_slcr_devcfg_enable(void)
+{
+       zynq_slcr_unlock();
+
+       /* Set Level Shifters DT618760 */
+       writel(0xF, &slcr_base->lvl_shftr_en);
+
+       /* Disable AXI interface */
+       writel(0x0, &slcr_base->fpga_rst_ctrl);
+
+       zynq_slcr_lock();
+}
+
+u32 zynq_slcr_get_idcode(void)
+{
+       return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >>
+                                                       SLCR_IDCODE_SHIFT;
+}
index 45b405a4ba2a764831615a24ecd86d2cb6214466..8c4357de4202c1b8197b916c575165ed1e84facc 100644 (file)
@@ -44,6 +44,7 @@
 #include <common.h>
 #include <div64.h>
 #include <asm/io.h>
+#include <asm/arch/hardware.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -54,7 +55,7 @@ struct scu_timer {
 };
 
 static struct scu_timer *timer_base =
-                             (struct scu_timer *) CONFIG_SCUTIMER_BASEADDR;
+                             (struct scu_timer *)ZYNQ_SCUTIMER_BASEADDR;
 
 #define SCUTIMER_CONTROL_PRESCALER_MASK        0x0000FF00 /* Prescaler */
 #define SCUTIMER_CONTROL_PRESCALER_SHIFT       8
@@ -114,15 +115,43 @@ ulong get_timer_masked(void)
 
 void __udelay(unsigned long usec)
 {
-       unsigned long long tmp;
-       ulong tmo;
-
-       tmo = usec / (1000000 / CONFIG_SYS_HZ);
-       tmp = get_ticks() + tmo; /* Get current timestamp */
-
-       while (get_ticks() < tmp) { /* Loop till event */
-                /* NOP */;
-       }
+       u32 countticks;
+       u32 timeend;
+       u32 timediff;
+       u32 timenow;
+
+       if (usec == 0)
+               return;
+
+       countticks = (u32) (((unsigned long long) TIMER_TICK_HZ * usec) /
+                                                               1000000);
+
+       /* decrementing timer */
+       timeend = readl(&timer_base->counter) - countticks;
+
+#if TIMER_LOAD_VAL != 0xFFFFFFFF
+       /* do not manage multiple overflow */
+       if (countticks >= TIMER_LOAD_VAL)
+               countticks = TIMER_LOAD_VAL - 1;
+#endif
+
+       do {
+               timenow = readl(&timer_base->counter);
+
+               if (timenow >= timeend) {
+                       /* normal case */
+                       timediff = timenow - timeend;
+               } else {
+                       if ((TIMER_LOAD_VAL - timeend + timenow) <=
+                                                               countticks) {
+                               /* overflow */
+                               timediff = TIMER_LOAD_VAL - timeend + timenow;
+                       } else {
+                               /* missed the exact match */
+                               break;
+                       }
+               }
+       } while (timediff > 0);
 }
 
 /* Timer without interrupts */
index b02e8af6ecbcae84a8d8784fa5bb138cc8a63c0b..fd3c29f62428a9931aab31ad6c1293107c663c59 100644 (file)
@@ -31,10 +31,6 @@ PLATFORM_CPPFLAGS += -mbig-endian -march=armv5te -mtune=strongarm1100
 PLATFORM_LDFLAGS += -EB
 USE_PRIVATE_LIBGCC = yes
 
-# -fdata-sections triggers "section .bss overlaps section .rel.dyn" linker error
-PLATFORM_RELFLAGS += -ffunction-sections
-LDFLAGS_u-boot += --gc-sections
-
 # =========================================================================
 #
 # Supply options according to compiler version
index 69ef8aa61fa79ffe56a5bfc9068f1c11eca1ee6a..46cba0cf7d1e24995be4ebaf3244ab6208c4275f 100644 (file)
@@ -114,10 +114,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -257,79 +253,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 09e8177f7b8292cca79c2b6f4631cc94eeb28f42..f07dc67823faebc4a49908d08715f5b829d763be 100644 (file)
@@ -244,7 +244,7 @@ void pxa_clock_setup(void)
 {
        writel(CONFIG_SYS_CKEN, CKEN);
        writel(CONFIG_SYS_CCCR, CCCR);
-       asm volatile("mcr       p14, 0, %0, c6, c0, 0" : : "r"(2));
+       asm volatile("mcr       p14, 0, %0, c6, c0, 0" : : "r"(0x0b));
 
        /* enable the 32Khz oscillator for RTC and PowerManager */
        writel(OSCC_OON, OSCC);
@@ -284,7 +284,7 @@ void i2c_clk_enable(void)
        writel(readl(CKEN) | CKEN14_I2C, CKEN);
 }
 
-void reset_cpu(ulong ignored) __attribute__((noreturn));
+void __attribute__((weak)) reset_cpu(ulong ignored) __attribute__((noreturn));
 
 void reset_cpu(ulong ignored)
 {
index ada91a66c98d27f611cc7abed4222a7453554685..2e3f65ee8493ddd061e7fe869827226b8937dd7e 100644 (file)
@@ -118,10 +118,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -171,94 +167,24 @@ reset:
        bl      _main
 
 /*------------------------------------------------------------------------------*/
-#ifndef CONFIG_SPL_BUILD
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-/* Disable the Dcache RAM lock for stack now */
-#ifdef CONFIG_CPU_PXA25X
-       mov     r12, lr
-       bl      cpu_init_crit
-       mov     lr, r12
-#endif
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
 
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
+       .globl  c_runtime_cpu_setup
+c_runtime_cpu_setup:
 
-#ifndef CONFIG_SPL_BUILD
+#ifdef CONFIG_CPU_PXA25X
        /*
-        * fix .rel.dyn relocations
+        * Unlock (actually, disable) the cache now that board_init_f
+        * is done. We could do this earlier but we would need to add
+        * a new C runtime hook, whereas c_runtime_cpu_setup already
+        * exists.
+        * As this routine is just a call to cpu_init_crit, let us
+        * tail-optimize and do a simple branch here.
         */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
+       b       cpu_init_crit
+#else
        bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
 #endif
 
-       .globl  c_runtime_cpu_setup
-c_runtime_cpu_setup:
-
-       bx      lr
-
 /*
  *************************************************************************
  *
index 7361aa268a6683242a35229906d72630bc8a3c2a..78183fc19bc40874a341e000277868164d5447f2 100644 (file)
@@ -80,10 +80,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -140,79 +136,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       bx      lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 8a2eafd6a4af816a204bc6f23c822ff8c9c92c1c..30d5a9021f63fe6a9007a4cb10aeba824aac6a9f 100644 (file)
@@ -90,10 +90,6 @@ _TEXT_BASE:
 _bss_start_ofs:
        .word __bss_start - _start
 
-.globl _image_copy_end_ofs
-_image_copy_end_ofs:
-       .word __image_copy_end - _start
-
 .globl _bss_end_ofs
 _bss_end_ofs:
        .word __bss_end - _start
@@ -144,79 +140,6 @@ reset:
 
 /*------------------------------------------------------------------------------*/
 
-/*
- * void relocate_code(addr_moni)
- *
- * This function relocates the monitor code.
- */
-       .globl  relocate_code
-relocate_code:
-       mov     r6, r0  /* save addr of destination */
-
-       adr     r0, _start
-       subs    r9, r6, r0              /* r9 <- relocation offset */
-       beq     relocate_done           /* skip relocation */
-       mov     r1, r6                  /* r1 <- scratch for copy_loop */
-       ldr     r3, _image_copy_end_ofs
-       add     r2, r0, r3              /* r2 <- source end address         */
-
-copy_loop:
-       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
-       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       blo     copy_loop
-
-#ifndef CONFIG_SPL_BUILD
-       /*
-        * fix .rel.dyn relocations
-        */
-       ldr     r0, _TEXT_BASE          /* r0 <- Text base */
-       ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
-       add     r10, r10, r0            /* r10 <- sym table in FLASH */
-       ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
-       add     r2, r2, r0              /* r2 <- rel dyn start in FLASH */
-       ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
-       add     r3, r3, r0              /* r3 <- rel dyn end in FLASH */
-fixloop:
-       ldr     r0, [r2]                /* r0 <- location to fix up, IN FLASH! */
-       add     r0, r0, r9              /* r0 <- location to fix up in RAM */
-       ldr     r1, [r2, #4]
-       and     r7, r1, #0xff
-       cmp     r7, #23                 /* relative fixup? */
-       beq     fixrel
-       cmp     r7, #2                  /* absolute fixup? */
-       beq     fixabs
-       /* ignore unknown type of fixup */
-       b       fixnext
-fixabs:
-       /* absolute fix: set location to (offset) symbol value */
-       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
-       add     r1, r10, r1             /* r1 <- address of symbol in table */
-       ldr     r1, [r1, #4]            /* r1 <- symbol value */
-       add     r1, r1, r9              /* r1 <- relocated sym addr */
-       b       fixnext
-fixrel:
-       /* relative fix: increase location by offset */
-       ldr     r1, [r0]
-       add     r1, r1, r9
-fixnext:
-       str     r1, [r0]
-       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
-       cmp     r2, r3
-       blo     fixloop
-#endif
-
-relocate_done:
-
-       mov     pc, lr
-
-_rel_dyn_start_ofs:
-       .word __rel_dyn_start - _start
-_rel_dyn_end_ofs:
-       .word __rel_dyn_end - _start
-_dynsym_start_ofs:
-       .word __dynsym_start - _start
-
        .globl  c_runtime_cpu_setup
 c_runtime_cpu_setup:
 
index 9b77b2b82ef935bf12d4adb6a39352e2586a9f86..9e6d51dd12a37f12597945336fad7432adbd62c3 100644 (file)
@@ -72,6 +72,7 @@ int tegra_get_chip_sku(void)
        switch (chip_id) {
        case CHIPID_TEGRA20:
                switch (sku_id) {
+               case SKU_ID_T20_7:
                case SKU_ID_T20:
                        return TEGRA_SOC_T20;
                case SKU_ID_T25SE:
@@ -92,6 +93,7 @@ int tegra_get_chip_sku(void)
        case CHIPID_TEGRA114:
                switch (sku_id) {
                case SKU_ID_T114_ENG:
+               case SKU_ID_T114_1:
                        return TEGRA_SOC_T114;
                }
                break;
@@ -107,6 +109,10 @@ static void enable_scu(void)
        struct scu_ctlr *scu = (struct scu_ctlr *)NV_PA_ARM_PERIPHBASE;
        u32 reg;
 
+       /* Only enable the SCU on T20/T25 */
+       if (tegra_get_chip() != CHIPID_TEGRA20)
+               return;
+
        /* If SCU already setup/enabled, return */
        if (readl(&scu->scu_ctrl) & SCU_CTRL_ENABLE)
                return;
index 9156d009b2843290661a269732a047237b1d456c..268fb912b502d84f3345841f19325160d5a5fc67 100644 (file)
@@ -321,17 +321,17 @@ unsigned clock_adjust_periph_pll_div(enum periph_id periph_id,
        unsigned effective_rate;
        int mux_bits, divider_bits, source;
        int divider;
+       int xdiv = 0;
 
        /* work out the source clock and set it */
        source = get_periph_clock_source(periph_id, parent, &mux_bits,
                                         &divider_bits);
 
+       divider = find_best_divider(divider_bits, pll_rate[parent],
+                                   rate, &xdiv);
        if (extra_div)
-               divider = find_best_divider(divider_bits, pll_rate[parent],
-                                               rate, extra_div);
-       else
-               divider = clk_get_divider(divider_bits, pll_rate[parent],
-                                         rate);
+               *extra_div = xdiv;
+
        assert(divider >= 0);
        if (adjust_periph_pll(periph_id, source, mux_bits, divider))
                return -1U;
index 44b68228057d800e02eea66024a076f2aa52d2aa..949232661500f517d25d131486a1b58d28fe43f1 100644 (file)
@@ -27,10 +27,16 @@ include $(TOPDIR)/config.mk
 
 LIB     = $(obj)libimx-common.o
 
+ifeq ($(SOC),$(filter $(SOC),mx25 mx35 mx5 mx6 vf610))
+COBJS-y        = iomux-v3.o
+endif
 ifeq ($(SOC),$(filter $(SOC),mx5 mx6))
-COBJS-y        = iomux-v3.o timer.o cpu.o speed.o
+COBJS-y        += timer.o cpu.o speed.o
 COBJS-$(CONFIG_I2C_MXC) += i2c-mxv7.o
 endif
+ifeq ($(SOC),$(filter $(SOC),mx6 mxs))
+COBJS-y        += misc.o
+endif
 COBJS-$(CONFIG_CMD_BMODE) += cmd_bmode.o
 COBJS-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
 COBJS  := $(sort $(COBJS-y))
@@ -58,8 +64,11 @@ $(OBJTREE)/SPL: $(OBJTREE)/spl/u-boot-spl.bin $(OBJTREE)/$(patsubst "%",%,$(CONF
 $(OBJTREE)/u-boot-with-spl.imx: $(OBJTREE)/SPL $(OBJTREE)/u-boot.bin
        $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(CONFIG_SPL_PAD_TO) \
                -I binary -O binary $< $(OBJTREE)/spl/u-boot-spl-pad.imx
-       cat $(OBJTREE)/spl/u-boot-spl-pad.imx $(OBJTREE)/u-boot.bin > $@
-       rm $(OBJTREE)/spl/u-boot-spl-pad.imx
+       $(OBJTREE)/tools/mkimage -A arm -O U-Boot -a $(CONFIG_SYS_TEXT_BASE) \
+               -e $(CONFIG_SYS_TEXT_BASE) -C none -d $(OBJTREE)/u-boot.bin \
+               $(OBJTREE)/u-boot.uim
+       cat $(OBJTREE)/spl/u-boot-spl-pad.imx $(OBJTREE)/u-boot.uim > $@
+       rm $(OBJTREE)/spl/u-boot-spl-pad.imx $(OBJTREE)/u-boot.uim
 
 $(OBJTREE)/u-boot-with-nand-spl.imx: $(OBJTREE)/SPL $(OBJTREE)/u-boot.bin
        (echo -ne '\x00\x00\x00\x00\x46\x43\x42\x20\x01' && \
@@ -69,8 +78,11 @@ $(OBJTREE)/u-boot-with-nand-spl.imx: $(OBJTREE)/SPL $(OBJTREE)/u-boot.bin
                -I binary -O binary $(OBJTREE)/spl/u-boot-nand-spl.imx \
                $(OBJTREE)/spl/u-boot-nand-spl-pad.imx
        rm $(OBJTREE)/spl/u-boot-nand-spl.imx
-       cat $(OBJTREE)/spl/u-boot-nand-spl-pad.imx $(OBJTREE)/u-boot.bin > $@
-       rm $(OBJTREE)/spl/u-boot-nand-spl-pad.imx
+       $(OBJTREE)/tools/mkimage -A arm -O U-Boot -a $(CONFIG_SYS_TEXT_BASE) \
+               -e $(CONFIG_SYS_TEXT_BASE) -C none -d $(OBJTREE)/u-boot.bin \
+               $(OBJTREE)/u-boot.uim
+       cat $(OBJTREE)/spl/u-boot-nand-spl-pad.imx $(OBJTREE)/u-boot.uim > $@
+       rm $(OBJTREE)/spl/u-boot-nand-spl-pad.imx $(OBJTREE)/u-boot.uim
 
 
 #########################################################################
index 08fad7851c98e8d64ddc05b06b356884b3f7a75f..35880c7a7ceb6d7219e28757c53299fd459b736d 100644 (file)
@@ -30,7 +30,7 @@ static void *base = (void *)IOMUXC_BASE_ADDR;
 /*
  * configures a single pad in the iomuxer
  */
-int imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
+void imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
 {
        u32 mux_ctrl_ofs = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;
        u32 mux_mode = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;
@@ -48,24 +48,22 @@ int imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
        if (sel_input_ofs)
                __raw_writel(sel_input, base + sel_input_ofs);
 
+#ifdef CONFIG_IOMUX_SHARE_CONF_REG
+       if (!(pad_ctrl & NO_PAD_CTRL))
+               __raw_writel((mux_mode << PAD_MUX_MODE_SHIFT) | pad_ctrl,
+                       base + pad_ctrl_ofs);
+#else
        if (!(pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)
                __raw_writel(pad_ctrl, base + pad_ctrl_ofs);
-
-       return 0;
+#endif
 }
 
-int imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
-                                    unsigned count)
+void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
+                                     unsigned count)
 {
        iomux_v3_cfg_t const *p = pad_list;
        int i;
-       int ret;
 
-       for (i = 0; i < count; i++) {
-               ret = imx_iomux_v3_setup_pad(*p);
-               if (ret)
-                       return ret;
-               p++;
-       }
-       return 0;
+       for (i = 0; i < count; i++)
+               imx_iomux_v3_setup_pad(*p++);
 }
diff --git a/arch/arm/imx-common/misc.c b/arch/arm/imx-common/misc.c
new file mode 100644 (file)
index 0000000..220785c
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2013 Stefan Roese <sr@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.
+ */
+
+#include <common.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/imx-common/regs-common.h>
+
+/* 1 second delay should be plenty of time for block reset. */
+#define        RESET_MAX_TIMEOUT       1000000
+
+#define        MXS_BLOCK_SFTRST        (1 << 31)
+#define        MXS_BLOCK_CLKGATE       (1 << 30)
+
+int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned
+                                                               int timeout)
+{
+       while (--timeout) {
+               if ((readl(&reg->reg) & mask) == mask)
+                       break;
+               udelay(1);
+       }
+
+       return !timeout;
+}
+
+int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned
+                                                               int timeout)
+{
+       while (--timeout) {
+               if ((readl(&reg->reg) & mask) == 0)
+                       break;
+               udelay(1);
+       }
+
+       return !timeout;
+}
+
+int mxs_reset_block(struct mxs_register_32 *reg)
+{
+       /* Clear SFTRST */
+       writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
+
+       if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
+               return 1;
+
+       /* Clear CLKGATE */
+       writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
+
+       /* Set SFTRST */
+       writel(MXS_BLOCK_SFTRST, &reg->reg_set);
+
+       /* Wait for CLKGATE being set */
+       if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
+               return 1;
+
+       /* Clear SFTRST */
+       writel(MXS_BLOCK_SFTRST, &reg->reg_clr);
+
+       if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
+               return 1;
+
+       /* Clear CLKGATE */
+       writel(MXS_BLOCK_CLKGATE, &reg->reg_clr);
+
+       if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
+               return 1;
+
+       return 0;
+}
index fb4e78edfed1d69b08b7c4991cafb7f8f7587811..bb53a6a14edc976d9e1a5e3236f1fac41eef7caa 100644 (file)
 #define MT41J512M8RH125_PHY_WR_DATA            0x74
 #define MT41J512M8RH125_IOCTRL_VALUE           0x18B
 
+/* Samsung K4B2G1646E-BIH9 */
+#define K4B2G1646EBIH9_EMIF_READ_LATENCY       0x06
+#define K4B2G1646EBIH9_EMIF_TIM1               0x0888A39B
+#define K4B2G1646EBIH9_EMIF_TIM2               0x2A04011A
+#define K4B2G1646EBIH9_EMIF_TIM3               0x501F820F
+#define K4B2G1646EBIH9_EMIF_SDCFG              0x61C24AB2
+#define K4B2G1646EBIH9_EMIF_SDREF              0x0000093B
+#define K4B2G1646EBIH9_ZQ_CFG                  0x50074BE4
+#define K4B2G1646EBIH9_DLL_LOCK_DIFF           0x1
+#define K4B2G1646EBIH9_RATIO                   0x40
+#define K4B2G1646EBIH9_INVERT_CLKOUT           0x1
+#define K4B2G1646EBIH9_RD_DQS                  0x3B
+#define K4B2G1646EBIH9_WR_DQS                  0x85
+#define K4B2G1646EBIH9_PHY_FIFO_WE             0x100
+#define K4B2G1646EBIH9_PHY_WR_DATA             0xC1
+#define K4B2G1646EBIH9_IOCTRL_VALUE            0x18B
+
 /**
  * Configure DMM
  */
index a950ac3c188a0ad090fbe228f0517a13839c7f79..8f9315c0201c93867baeccfdafcab054a2e64e38 100644 (file)
@@ -29,6 +29,7 @@
 
 /* Control Module Base Address */
 #define CTRL_BASE                      0x48140000
+#define CTRL_DEVICE_BASE               0x48140600
 
 /* PRCM Base Address */
 #define PRCM_BASE                      0x48180000
index d28f9a83ff25b249d76eb3485a9f5352a110a92c..e7576c110631c971aae8f0ab831de7d517dc7283 100644 (file)
  * at 0x40304000(EMU base) so that our code works for both EMU and GP
  */
 #ifdef CONFIG_AM33XX
-#define NON_SECURE_SRAM_START  0x40304000
-#define NON_SECURE_SRAM_END    0x4030E000
+#define NON_SECURE_SRAM_START  0x402F0400
+#define NON_SECURE_SRAM_END    0x40310000
+#define SRAM_SCRATCH_SPACE_ADDR        0x4030C000
 #elif defined(CONFIG_TI814X)
 #define NON_SECURE_SRAM_START  0x40300000
 #define NON_SECURE_SRAM_END    0x40320000
-#endif
-
-/* ROM code defines */
-/* Boot device */
-#define BOOT_DEVICE_MASK       0xFF
-#define BOOT_DEVICE_OFFSET     0x8
-#define DEV_DESC_PTR_OFFSET    0x4
-#define DEV_DATA_PTR_OFFSET    0x18
-#define BOOT_MODE_OFFSET       0x8
-#define RESET_REASON_OFFSET    0x9
-#define CH_FLAGS_OFFSET                0xA
-
-#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
-#define CH_FLAGS_CHRAM         (0x1 << 1)
-#define CH_FLAGS_CHFLASH       (0x1 << 2)
-#define CH_FLAGS_CHMMCSD       (0x1 << 3)
-
-#ifndef __ASSEMBLY__
-struct omap_boot_parameters {
-       char *boot_message;
-       unsigned int mem_boot_descriptor;
-       unsigned char omap_bootdevice;
-       unsigned char reset_reason;
-       unsigned char ch_flags;
-};
+#define SRAM_SCRATCH_SPACE_ADDR        0x4031B800
 #endif
 #endif
index c913b5f318451c561eee7a2e9475fc50c4143c81..fedc674031d2d3321cabc02754d456106cc1bb91 100644 (file)
@@ -30,6 +30,7 @@ int print_cpuinfo(void);
 
 extern struct ctrl_stat *cstat;
 u32 get_device_type(void);
+void save_omap_boot_params(void);
 void setup_clocks_for_console(void);
 void ddr_pll_config(unsigned int ddrpll_M);
 
index 8282f461999d89f744ac6ab13eedf741e6865556..584393572c08964eb69261455168e5b028a145e9 100644 (file)
@@ -35,5 +35,6 @@ void at91_seriald_hw_init(void);
 void at91_spi0_hw_init(unsigned long cs_mask);
 void at91_spi1_hw_init(unsigned long cs_mask);
 void at91_uhp_hw_init(void);
+void at91_lcd_hw_init(void);
 
 #endif /* AT91_COMMON_H */
index 3429293535988e0fff312fd9c30748cbe8d8f129..9a640a5b045d3919024fc535f591774b84130b67 100644 (file)
@@ -38,4 +38,8 @@ typedef struct at91_dbu {
 #define AT91_DBU_CID_ARCH_9xx          0x01900000
 #define AT91_DBU_CID_ARCH_9XExx        0x02900000
 
+#define AT91_DBU_CIDR_MASK             0x1f
+#define AT91_DBU_CIDR                  0x40
+#define AT91_DBU_EXID                  0x44
+
 #endif
index 086cb9b34e69289e7d38afc2b01af994d560b398..66075b4807d9f60db84a343e8996eacef8248050 100644 (file)
@@ -55,7 +55,16 @@ typedef struct at91_pmc {
        u32     reserved5[21];
        u32     wpmr;           /* 0xE4 Write Protect Mode Register (CAP0) */
        u32     wpsr;           /* 0xE8 Write Protect Status Register (CAP0) */
+#ifdef CONFIG_SAMA5D3
+       u32     reserved6[8];
+       u32     pcer1;          /* 0x100 Periperial Clock Enable Register 1 */
+       u32     pcdr1;          /* 0x104 Periperial Clock Disable Register 1 */
+       u32     pcsr1;          /* 0x108 Periperial Clock Status Register 1 */
+       u32     pcr;            /* 0x10c Periperial Control Register */
+       u32     ocr;            /* 0x110 Oscillator Calibration Register */
+#else
        u32     reserved8[5];
+#endif
 } at91_pmc_t;
 
 #endif /* end not assembly */
@@ -82,6 +91,16 @@ typedef struct at91_pmc {
 #define AT91_PMC_MCKR_CSS_PLLB         0x00000003
 #define AT91_PMC_MCKR_CSS_MASK         0x00000003
 
+#ifdef CONFIG_SAMA5D3
+#define AT91_PMC_MCKR_PRES_1           0x00000000
+#define AT91_PMC_MCKR_PRES_2           0x00000010
+#define AT91_PMC_MCKR_PRES_4           0x00000020
+#define AT91_PMC_MCKR_PRES_8           0x00000030
+#define AT91_PMC_MCKR_PRES_16          0x00000040
+#define AT91_PMC_MCKR_PRES_32          0x00000050
+#define AT91_PMC_MCKR_PRES_64          0x00000060
+#define AT91_PMC_MCKR_PRES_MASK                0x00000070
+#else
 #define AT91_PMC_MCKR_PRES_1           0x00000000
 #define AT91_PMC_MCKR_PRES_2           0x00000004
 #define AT91_PMC_MCKR_PRES_4           0x00000008
@@ -90,6 +109,7 @@ typedef struct at91_pmc {
 #define AT91_PMC_MCKR_PRES_32          0x00000014
 #define AT91_PMC_MCKR_PRES_64          0x00000018
 #define AT91_PMC_MCKR_PRES_MASK                0x0000001C
+#endif
 
 #ifdef CONFIG_AT91RM9200
 #define AT91_PMC_MCKR_MDIV_1           0x00000000
@@ -100,6 +120,9 @@ typedef struct at91_pmc {
 #else
 #define AT91_PMC_MCKR_MDIV_1           0x00000000
 #define AT91_PMC_MCKR_MDIV_2           0x00000100
+#ifdef CONFIG_SAMA5D3
+#define AT91_PMC_MCKR_MDIV_3           0x00000300
+#endif
 #define AT91_PMC_MCKR_MDIV_4           0x00000200
 #define AT91_PMC_MCKR_MDIV_MASK                0x00000300
 #endif
index b9a93b0c8f7a393340ded5d7a4762a6638d5e0ee..6e0bebd1bb6aa860a69c428adbc065b062a0cdd0 100644 (file)
@@ -23,7 +23,7 @@
 #include <asm/arch/at91cap9_matrix.h>
 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
 #include <asm/arch/at91sam9g45_matrix.h>
-#elif defined(CONFIG_AT91SAM9X5)
+#elif defined(CONFIG_AT91SAM9N12) || defined(CONFIG_AT91SAM9X5)
 #include <asm/arch/at91sam9x5_matrix.h>
 #else
 #error "Unsupported AT91SAM9/CAP9 processor"
index b7d1932f42d6b331d846ce0b3b54af7b3517126e..85e42f582b5857e8fc6b5e00778370b665011b3e 100644 (file)
@@ -1,10 +1,10 @@
 /*
  * Chip-specific header file for the AT91SAM9x5 family
  *
- *  Copyright (C) 2012 Atmel Corporation.
+ *  Copyright (C) 2012-2013 Atmel Corporation.
  *
  * Definitions for the SoC:
- * AT91SAM9x5
+ * AT91SAM9x5 & AT91SAM9N12
  *
  * 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
 #define ATMEL_ID_SYS   1       /* System Controller Interrupt */
 #define ATMEL_ID_PIOAB 2       /* Parallel I/O Controller A and B */
 #define ATMEL_ID_PIOCD 3       /* Parallel I/O Controller C and D */
-#define ATMEL_ID_SMD   4       /* SMD Soft Modem (SMD) */
+#define ATMEL_ID_SMD   4       /* SMD Soft Modem (SMD), only for AT91SAM9X5 */
+#define ATMEL_ID_FUSE  4       /* FUSE Controller, only for AT91SAM9N12 */
 #define ATMEL_ID_USART0        5       /* USART 0 */
 #define ATMEL_ID_USART1        6       /* USART 1 */
 #define ATMEL_ID_USART2        7       /* USART 2 */
+#define ATMEL_ID_USART3        8       /* USART 3 */
 #define ATMEL_ID_TWI0  9       /* Two-Wire Interface 0 */
 #define ATMEL_ID_TWI1  10      /* Two-Wire Interface 1 */
 #define ATMEL_ID_TWI2  11      /* Two-Wire Interface 2 */
@@ -46,6 +48,7 @@
 #define ATMEL_ID_HSMCI1        26      /* High Speed Multimedia Card Interface 1 */
 #define ATMEL_ID_EMAC1 27      /* Ethernet MAC1 */
 #define ATMEL_ID_SSC   28      /* Synchronous Serial Controller */
+#define ATMEL_ID_TRNG  30      /* True Random Number Generator */
 #define ATMEL_ID_IRQ   31      /* Advanced Interrupt Controller */
 
 /*
@@ -85,6 +88,7 @@
 /*
  * System Peripherals
  */
+#define ATMEL_BASE_FUSE                0xffffdc00
 #define ATMEL_BASE_MATRIX      0xffffde00
 #define ATMEL_BASE_PMECC       0xffffe000
 #define ATMEL_BASE_PMERRLOC    0xffffe600
  */
 #define ATMEL_BASE_ROM         0x00100000 /* Internal ROM base address */
 #define ATMEL_BASE_SRAM                0x00300000 /* Internal SRAM base address */
+
+#ifdef CONFIG_AT91SAM9N12
+#define ATMEL_BASE_OHCI                0x00500000 /* USB Host controller */
+#else  /* AT91SAM9X5 */
 #define ATMEL_BASE_SMD         0x00400000 /* SMD Controller */
 #define ATMEL_BASE_UDPHS_FIFO  0x00500000 /* USB Device HS controller */
 #define ATMEL_BASE_OHCI                0x00600000 /* USB Host controller (OHCI) */
 #define ATMEL_BASE_EHCI                0x00700000 /* USB Host controller (EHCI) */
+#endif
 
 /* 9x5 series chip id definitions */
 #define ARCH_ID_AT91SAM9X5     0x819a05a0
 /*
  * Cpu Name
  */
+#ifdef CONFIG_AT91SAM9N12
+#define ATMEL_CPU_NAME "AT91SAM9N12"
+#else  /* AT91SAM9X5 */
 #define ATMEL_CPU_NAME get_cpu_name()
+#endif
 
 /*
  * Other misc defines
index d6ce6fad55ef47d75a8430dafe74e5a04e58aada..0d330694411688fda002ee7b90931064eebedb76 100644 (file)
@@ -1,10 +1,10 @@
 /*
  * Matrix-centric header file for the AT91SAM9X5 family
  *
- *  Copyright (C) 2012 Atmel Corporation.
+ *  Copyright (C) 2012-2013 Atmel Corporation.
  *
  * Memory Controllers (MATRIX, EBI) - System peripherals registers.
- * Based on AT91SAM9X5 preliminary datasheet.
+ * Based on AT91SAM9X5 & AT91SAM9N12 preliminary datasheet.
  *
  * 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
 
 #ifndef __ASSEMBLY__
 
+/* AT91SAM9N12 Matrix definition is a subset of AT91SAM9X5. */
 struct at91_matrix {
        u32     mcfg[16];
        u32     scfg[16];
        u32     pras[16][2];
        u32     mrcr;           /* 0x100 Master Remap Control */
-       u32     filler[7];
+       u32     filler[5];
+#ifdef CONFIG_AT91SAM9X5
+       u32     filler1[2];
+#endif
+       /* EBI Chip Select Assignment Register
+        * 0x118: AT91SAM9N12
+        * 0x120: AT91SAM9X5
+        */
        u32     ebicsa;
        u32     filler4[47];
+#ifdef CONFIG_AT91SAM9N12
+       u32     filler5[2];
+#endif
        u32     wpmr;
        u32     wpsr;
 };
index d4852a38c19c3eb25b960626f03eaad9d55fc39f..04b0f8322ca17b71b151fcd9de297ad9d21cbe3d 100644 (file)
@@ -95,4 +95,5 @@ static inline unsigned long get_mci_clk_rate(void)
 }
 
 int at91_clock_init(unsigned long main_clock);
+void at91_periph_clk_enable(int id);
 #endif /* __ASM_ARM_ARCH_CLK_H__ */
index 4c4ee703a642a6a58437bf94bdf429cadc50925f..b04641e0140da31c76589ae1860fc803883a06a3 100644 (file)
 # include <asm/arch/at91sam9rl.h>
 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
 # include <asm/arch/at91sam9g45.h>
-#elif defined(CONFIG_AT91SAM9X5)
+#elif defined(CONFIG_AT91SAM9N12) || defined(CONFIG_AT91SAM9X5)
 # include <asm/arch/at91sam9x5.h>
 #elif defined(CONFIG_AT91CAP9)
 # include <asm/arch/at91cap9.h>
 #elif defined(CONFIG_AT91X40)
 # include <asm/arch/at91x40.h>
+#elif defined(CONFIG_SAMA5D3)
+# include <asm/arch/sama5d3.h>
 #else
 # error "Unsupported AT91 processor"
 #endif
diff --git a/arch/arm/include/asm/arch-at91/sama5d3.h b/arch/arm/include/asm/arch-at91/sama5d3.h
new file mode 100644 (file)
index 0000000..883b932
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Chip-specific header file for the SAMA5D3 family
+ *
+ * (C) 2012 - 2013 Atmel Corporation.
+ * Bo Shen <voice.shen@atmel.com>
+ *
+ * Definitions for the SoC:
+ * SAMA5D3
+ *
+ * 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.
+ */
+
+#ifndef SAMA5D3_H
+#define SAMA5D3_H
+
+/*
+ * defines to be used in other places
+ */
+#define CONFIG_ARMV7           /* ARM A5 Core */
+#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
+
+/*
+ * Peripheral identifiers/interrupts.
+ */
+#define ATMEL_ID_FIQ   0       /* Advanced Interrupt Controller (FIQ) */
+#define ATMEL_ID_SYS   1       /* System Controller Interrupt */
+#define ATMEL_ID_DBGU  2       /* Debug Unit Interrupt */
+#define ATMEL_ID_PIT   3       /* Periodic Interval Timer Interrupt */
+#define ATMEL_ID_WDT   4       /* Watchdog timer Interrupt */
+#define ATMEL_ID_SMC   5       /* Multi-bit ECC Interrupt */
+#define ATMEL_ID_PIOA  6       /* Parallel I/O Controller A */
+#define ATMEL_ID_PIOB  7       /* Parallel I/O Controller B */
+#define ATMEL_ID_PIOC  8       /* Parallel I/O Controller C */
+#define ATMEL_ID_PIOD  9       /* Parallel I/O Controller D */
+#define ATMEL_ID_PIOE  10      /* Parallel I/O Controller E */
+#define ATMEL_ID_SMD   11      /* SMD Soft Modem */
+#define ATMEL_ID_USART0        12      /* USART 0 */
+#define ATMEL_ID_USART1        13      /* USART 1 */
+#define ATMEL_ID_USART2        14      /* USART 2 */
+#define ATMEL_ID_USART3        15      /* USART 3 */
+#define ATMEL_ID_UART0 16
+#define ATMEL_ID_UART1 17
+#define ATMEL_ID_TWI0  18      /* Two-Wire Interface 0 */
+#define ATMEL_ID_TWI1  19      /* Two-Wire Interface 1 */
+#define ATMEL_ID_TWI2  20      /* Two-Wire Interface 2 */
+#define ATMEL_ID_MCI0  21      /* High Speed Multimedia Card Interface 0 */
+#define ATMEL_ID_MCI1  22      /*  */
+#define ATMEL_ID_MCI2  23      /*  */
+#define ATMEL_ID_SPI0  24      /* Serial Peripheral Interface 0 */
+#define ATMEL_ID_SPI1  25      /* Serial Peripheral Interface 1 */
+#define ATMEL_ID_TC0   26      /* */
+#define ATMEL_ID_TC1   27      /* */
+#define ATMEL_ID_PWMC  28      /* Pulse Width Modulation Controller */
+#define ATMEL_ID_TSC   29      /* Touch Screen ADC Controller */
+#define ATMEL_ID_DMA0  30      /* DMA Controller */
+#define ATMEL_ID_DMA1  31      /* DMA Controller */
+#define ATMEL_ID_UHPHS 32      /* USB Host High Speed */
+#define ATMEL_ID_UDPHS 33      /* USB Device High Speed */
+#define ATMEL_ID_GMAC  34
+#define ATMEL_ID_EMAC  35      /* Ethernet MAC */
+#define ATMEL_ID_LCDC  36      /* LCD Controller */
+#define ATMEL_ID_ISI   37      /* Image Sensor Interface */
+#define ATMEL_ID_SSC0  38      /* Synchronous Serial Controller 0 */
+#define ATMEL_ID_SSC1  39      /* Synchronous Serial Controller 1 */
+#define ATMEL_ID_CAN0  40
+#define ATMEL_ID_CAN1  41
+#define ATMEL_ID_SHA   42
+#define ATMEL_ID_AES   43
+#define ATMEL_ID_TDES  44
+#define ATMEL_ID_TRNG  45
+#define ATMEL_ID_ARM   46
+#define ATMEL_ID_IRQ0  47      /* Advanced Interrupt Controller */
+#define ATMEL_ID_FUSE  48
+#define ATMEL_ID_MPDDRC        49
+
+/* sama5d3 series chip id definitions */
+#define ARCH_ID_SAMA5D3                0x8a5c07c0
+#define ARCH_EXID_SAMA5D31     0x00444300
+#define ARCH_EXID_SAMA5D33     0x00414300
+#define ARCH_EXID_SAMA5D34     0x00414301
+#define ARCH_EXID_SAMA5D35     0x00584300
+
+#define cpu_is_sama5d3()       (get_chip_id() == ARCH_ID_SAMA5D3)
+#define cpu_is_sama5d31()      (cpu_is_sama5d3() && \
+               (get_extension_chip_id() == ARCH_EXID_SAMA5D31))
+#define cpu_is_sama5d33()      (cpu_is_sama5d3() && \
+               (get_extension_chip_id() == ARCH_EXID_SAMA5D33))
+#define cpu_is_sama5d34()      (cpu_is_sama5d3() && \
+               (get_extension_chip_id() == ARCH_EXID_SAMA5D34))
+#define cpu_is_sama5d35()      (cpu_is_sama5d3() && \
+               (get_extension_chip_id() == ARCH_EXID_SAMA5D35))
+
+/*
+ * User Peripherals physical base addresses.
+ */
+#define ATMEL_BASE_MCI0                0xf0000000
+#define ATMEL_BASE_SPI0                0xf0004000
+#define ATMEL_BASE_SSC0                0xf000C000
+#define ATMEL_BASE_TC2         0xf0010000
+#define ATMEL_BASE_TWI0                0xf0014000
+#define ATMEL_BASE_TWI1                0xf0018000
+#define ATMEL_BASE_USART0      0xf001c000
+#define ATMEL_BASE_USART1      0xf0020000
+#define ATMEL_BASE_UART0       0xf0024000
+#define ATMEL_BASE_GMAC                0xf0028000
+#define ATMEL_BASE_PWMC                0xf002c000
+#define ATMEL_BASE_LCDC                0xf0030000
+#define ATMEL_BASE_ISI         0xf0034000
+#define ATMEL_BASE_SFR         0xf0038000
+/* Reserved: 0xf003c000 - 0xf8000000 */
+#define ATMEL_BASE_MCI1                0xf8000000
+#define ATMEL_BASE_MCI2                0xf8004000
+#define ATMEL_BASE_SPI1                0xf8008000
+#define ATMEL_BASE_SSC1                0xf800c000
+#define ATMEL_BASE_CAN1                0xf8010000
+#define ATMEL_BASE_TC3         0xf8014000
+#define ATMEL_BASE_TSADC       0xf8018000
+#define ATMEL_BASE_TWI2                0xf801c000
+#define ATMEL_BASE_USART2      0xf8020000
+#define ATMEL_BASE_USART3      0xf8024000
+#define ATMEL_BASE_UART1       0xf8028000
+#define ATMEL_BASE_EMAC                0xf802c000
+#define ATMEL_BASE_UDHPS       0xf8030000
+#define ATMEL_BASE_SHA         0xf8034000
+#define ATMEL_BASE_AES         0xf8038000
+#define ATMEL_BASE_TDES                0xf803c000
+#define ATMEL_BASE_TRNG                0xf8040000
+/* Reserved:   0xf804400 - 0xffffc00 */
+
+/*
+ * System Peripherals physical base addresses.
+ */
+#define ATMEL_BASE_SYS         0xffffc000
+#define ATMEL_BASE_SMC         0xffffc000
+#define ATMEL_BASE_PMECC       (ATMEL_BASE_SMC + 0x070)
+#define ATMEL_BASE_PMERRLOC    (ATMEL_BASE_SMC + 0x500)
+#define ATMEL_BASE_FUSE                0xffffe400
+#define ATMEL_BASE_DMAC0       0xffffe600
+#define ATMEL_BASE_DMAC1       0xffffe800
+#define ATMEL_BASE_MPDDRC      0xffffea00
+#define ATMEL_BASE_MATRIX      0xffffec00
+#define ATMEL_BASE_DBGU                0xffffee00
+#define ATMEL_BASE_AIC         0xfffff000
+#define ATMEL_BASE_PIOA                0xfffff200
+#define ATMEL_BASE_PIOB                0xfffff400
+#define ATMEL_BASE_PIOC                0xfffff600
+#define ATMEL_BASE_PIOD                0xfffff800
+#define ATMEL_BASE_PIOE                0xfffffa00
+#define ATMEL_BASE_PMC         0xfffffc00
+#define ATMEL_BASE_RSTC                0xfffffe00
+#define ATMEL_BASE_SHDWN       0xfffffe10
+#define ATMEL_BASE_PIT         0xfffffe30
+#define ATMEL_BASE_WDT         0xfffffe40
+#define ATMEL_BASE_SCKCR       0xfffffe50
+#define ATMEL_BASE_GPBR                0xfffffe60
+#define ATMEL_BASE_RTC         0xfffffeb0
+/* Reserved:   0xfffffee0 - 0xffffffff */
+
+/*
+ * Internal Memory.
+ */
+#define ATMEL_BASE_ROM         0x00100000      /* Internal ROM base address */
+#define ATMEL_BASE_SRAM                0x00200000      /* Internal ROM base address */
+#define ATMEL_BASE_SRAM0       0x00300000      /* Internal SRAM base address */
+#define ATMEL_BASE_SRAM1       0x00310000      /* Internal SRAM base address */
+#define ATMEL_BASE_SMD         0x00400000      /* Internal ROM base address */
+#define ATMEL_BASE_UDPHS_FIFO  0x00500000      /* USB Device HS controller */
+#define ATMEL_BASE_OHCI                0x00600000      /* USB Host controller (OHCI) */
+#define ATMEL_BASE_EHCI                0x00700000      /* USB Host controller (EHCI) */
+#define ATMEL_BASE_AXI         0x00800000      /* Video Decoder Controller */
+#define ATMEL_BASE_DAP         0x00900000      /* Video Decoder Controller */
+
+/*
+ * External memory
+ */
+#define ATMEL_BASE_CS0         0x10000000
+#define ATMEL_BASE_DDRCS       0x20000000
+#define ATMEL_BASE_CS1         0x40000000
+#define ATMEL_BASE_CS2         0x50000000
+#define ATMEL_BASE_CS3         0x60000000
+
+/*
+ * Other misc defines
+ */
+#define ATMEL_PIO_PORTS                5
+#define CPU_HAS_PIO3
+#define PIO_SCDR_DIV           0x3fff
+
+/*
+ * PMECC table in ROM
+ */
+#define ATMEL_PMECC_INDEX_OFFSET_512   0x10000
+#define ATMEL_PMECC_INDEX_OFFSET_1024  0x18000
+#define ATMEL_PMECC_ALPHA_OFFSET_512   0x10000
+#define ATMEL_PMECC_ALPHA_OFFSET_1024  0x18000
+
+/*
+ * SAMA5D3 specific prototypes
+ */
+#ifndef __ASSEMBLY__
+unsigned int get_chip_id(void);
+unsigned int get_extension_chip_id(void);
+unsigned int has_emac(void);
+unsigned int has_gmac(void);
+unsigned int has_lcdc(void);
+char *get_cpu_name(void);
+#endif
+
+#endif
diff --git a/arch/arm/include/asm/arch-at91/sama5d3_smc.h b/arch/arm/include/asm/arch-at91/sama5d3_smc.h
new file mode 100644 (file)
index 0000000..eb53eba
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Atmel Corporation.
+ *
+ * Static Memory Controllers (SMC) - System peripherals registers.
+ * Based on SAMA5D3 datasheet.
+ *
+ * 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.
+ */
+
+#ifndef SAMA5D3_SMC_H
+#define SAMA5D3_SMC_H
+
+#ifdef __ASSEMBLY__
+#define AT91_ASM_SMC_SETUP0    (ATMEL_BASE_SMC + 0x600)
+#define AT91_ASM_SMC_PULSE0    (ATMEL_BASE_SMC + 0x604)
+#define AT91_ASM_SMC_CYCLE0    (ATMEL_BASE_SMC + 0x608)
+#define AT91_ASM_SMC_MODE0     (ATMEL_BASE_SMC + 0x60C)
+#else
+struct at91_cs {
+       u32     reserved[96];
+       u32     setup;          /* 0x600 SMC Setup Register */
+       u32     pulse;          /* 0x604 SMC Pulse Register */
+       u32     cycle;          /* 0x608 SMC Cycle Register */
+       u32     timings;        /* 0x60C SMC Cycle Register */
+       u32     mode;           /* 0x610 SMC Mode Register */
+};
+
+struct at91_smc {
+       struct at91_cs cs[4];
+};
+#endif /*  __ASSEMBLY__ */
+
+#define AT91_SMC_SETUP_NWE(x)          (x & 0x3f)
+#define AT91_SMC_SETUP_NCS_WR(x)       ((x & 0x3f) << 8)
+#define AT91_SMC_SETUP_NRD(x)          ((x & 0x3f) << 16)
+#define AT91_SMC_SETUP_NCS_RD(x)       ((x & 0x3f) << 24)
+
+#define AT91_SMC_PULSE_NWE(x)          (x & 0x3f)
+#define AT91_SMC_PULSE_NCS_WR(x)       ((x & 0x3f) << 8)
+#define AT91_SMC_PULSE_NRD(x)          ((x & 0x3f) << 16)
+#define AT91_SMC_PULSE_NCS_RD(x)       ((x & 0x3f) << 24)
+
+#define AT91_SMC_CYCLE_NWE(x)          (x & 0x1ff)
+#define AT91_SMC_CYCLE_NRD(x)          ((x & 0x1ff) << 16)
+
+#define AT91_SMC_TIMINGS_TCLR(x)       (x & 0xf)
+#define AT91_SMC_TIMINGS_TADL(x)       ((x & 0xf) << 4)
+#define AT91_SMC_TIMINGS_TAR(x)                ((x & 0xf) << 8)
+#define AT91_SMC_TIMINGS_OCMS(x)       ((x & 0x1) << 12)
+#define AT91_SMC_TIMINGS_TRR(x)                ((x & 0xf) << 16)
+#define AT91_SMC_TIMINGS_TWB(x)                ((x & 0xf) << 24)
+#define AT91_SMC_TIMINGS_RBNSEL(x)     ((x & 0xf) << 28)
+#define AT91_SMC_TIMINGS_NFSEL(x)      ((x & 0x1) << 31)
+
+#define AT91_SMC_MODE_RM_NCS           0x00000000
+#define AT91_SMC_MODE_RM_NRD           0x00000001
+#define AT91_SMC_MODE_WM_NCS           0x00000000
+#define AT91_SMC_MODE_WM_NWE           0x00000002
+
+#define AT91_SMC_MODE_EXNW_DISABLE     0x00000000
+#define AT91_SMC_MODE_EXNW_FROZEN      0x00000020
+#define AT91_SMC_MODE_EXNW_READY       0x00000030
+
+#define AT91_SMC_MODE_BAT              0x00000100
+#define AT91_SMC_MODE_DBW_8            0x00000000
+#define AT91_SMC_MODE_DBW_16           0x00001000
+#define AT91_SMC_MODE_DBW_32           0x00002000
+#define AT91_SMC_MODE_TDF_CYCLE(x)     ((x & 0xf) << 16)
+#define AT91_SMC_MODE_TDF              0x00100000
+#define AT91_SMC_MODE_PMEN             0x01000000
+#define AT91_SMC_MODE_PS_4             0x00000000
+#define AT91_SMC_MODE_PS_8             0x10000000
+#define AT91_SMC_MODE_PS_16            0x20000000
+#define AT91_SMC_MODE_PS_32            0x30000000
+
+#endif
index 6eed6c95a704b53fdb5f8d75aef9e63b55ef6aa2..a9017e4683e2c07e658965e5a8b636110467c692 100644 (file)
@@ -346,6 +346,8 @@ void davinci_errata_workarounds(void);
 #define PSC_PSC0_MODULE_ID_CNT         16
 #define PSC_PSC1_MODULE_ID_CNT         32
 
+#define UART0_PWREMU_MGMT              (0x01c42030)
+
 struct davinci_psc_regs {
        dv_reg  revid;
        dv_reg  rsvd0[71];
index 10f3a392abaf9d3abfc096073ab1ed130637a635..4a30813808afd4c09d05a9ce9bf91ebcdac2913e 100644 (file)
 #define        MASK_ALE        0x08
 #endif
 
+#ifdef CONFIG_SYS_NAND_MASK_CLE
+#undef MASK_CLE
+#define MASK_CLE CONFIG_SYS_NAND_MASK_CLE
+#endif
+#ifdef CONFIG_SYS_NAND_MASK_ALE
+#undef MASK_ALE
+#define MASK_ALE CONFIG_SYS_NAND_MASK_ALE
+#endif
+
 #define NAND_READ_START                0x00
 #define NAND_READ_END          0x30
 #define NAND_STATUS            0x70
index a851f1f50f41ec453acdbd933eee936af4ebcdb6..beaf0d601a3c6ef3ad08ba17a06b7a5e5001236f 100644 (file)
 #define __ASM_ARCH_PINMUX_DEFS_H
 
 #include <asm/arch/davinci_misc.h>
+#include <config.h>
 
-/* SPI pin muxer settings */
+/* SPI0 pin muxer settings */
+extern const struct pinmux_config spi0_pins_base[3];
+extern const struct pinmux_config spi0_pins_scs0[1];
+extern const struct pinmux_config spi0_pins_ena[1];
+
+/* SPI1 pin muxer settings */
 extern const struct pinmux_config spi1_pins_base[3];
 extern const struct pinmux_config spi1_pins_scs0[1];
 
@@ -35,6 +41,7 @@ extern const struct pinmux_config uart2_pins_rtscts[2];
 
 /* EMAC pin muxer settings*/
 extern const struct pinmux_config emac_pins_rmii[7];
+extern const struct pinmux_config emac_pins_rmii_clk_source[1];
 extern const struct pinmux_config emac_pins_mii[15];
 extern const struct pinmux_config emac_pins_mdio[2];
 
@@ -43,13 +50,19 @@ extern const struct pinmux_config i2c0_pins[2];
 extern const struct pinmux_config i2c1_pins[2];
 
 /* EMIFA pin muxer settings */
+extern const struct pinmux_config emifa_pins[40];
+extern const struct pinmux_config emifa_pins_cs0[1];
 extern const struct pinmux_config emifa_pins_cs2[1];
 extern const struct pinmux_config emifa_pins_cs3[1];
 extern const struct pinmux_config emifa_pins_cs4[1];
 extern const struct pinmux_config emifa_pins_nand[12];
 extern const struct pinmux_config emifa_pins_nor[43];
 
+/* USB pin mux setting */
+extern const struct pinmux_config usb_pins[1];
+
 /* MMC pin muxer settings */
+extern const struct pinmux_config mmc0_pins_8bit[10];
 extern const struct pinmux_config mmc0_pins[6];
 
 #endif
index 5f4b543823470e037b6828ca99ff3876382c3b6f..46f59d7652a6287372dd38021f482d188e97edcd 100644 (file)
@@ -113,8 +113,12 @@ struct iim_regs {
        u32 iim_sdat;
        u32 iim_prev;
        u32 iim_srev;
-       u32 iim_prog_p;
-       u32 res1[0x1f5];
+       u32 iim_prg_p;
+       u32 iim_scs0;
+       u32 iim_scs1;
+       u32 iim_scs2;
+       u32 iim_scs3;
+       u32 res1[0x1f1];
        struct fuse_bank {
                u32 fuse_regs[0x20];
                u32 fuse_rsvd[0xe0];
@@ -122,10 +126,19 @@ struct iim_regs {
 };
 
 struct fuse_bank0_regs {
-       u32 fuse0_25[0x1a];
+       u32 fuse0_7[8];
+       u32 uid[8];
+       u32 fuse16_25[0xa];
        u32 mac_addr[6];
 };
 
+struct fuse_bank1_regs {
+       u32 fuse0_21[0x16];
+       u32 usr5;
+       u32 fuse23_29[7];
+       u32 usr6[2];
+};
+
 /* Multi-Layer AHB Crossbar Switch (MAX) registers */
 struct max_regs {
        u32 mpr0;
@@ -187,6 +200,7 @@ struct aips_regs {
 #define IMX_CSPI1_BASE         (0x43FA4000)
 #define IMX_KPP_BASE           (0x43FA8000)
 #define IMX_IOPADMUX_BASE      (0x43FAC000)
+#define IOMUXC_BASE_ADDR       IMX_IOPADMUX_BASE
 #define IMX_IOPADCTL_BASE      (0x43FAC22C)
 #define IMX_IOPADGRPCTL_BASE   (0x43FAC418)
 #define IMX_IOPADINPUTSEL_BASE (0x43FAC460)
@@ -240,6 +254,7 @@ struct aips_regs {
 #define IMX_PWM1_BASE          (0x53FE0000)
 #define IMX_RTIC_BASE          (0x53FEC000)
 #define IMX_IIM_BASE           (0x53FF0000)
+#define IIM_BASE_ADDR          IMX_IIM_BASE
 #define IMX_USB_BASE           (0x53FF4000)
 #define IMX_USB_PORT_OFFSET    0x200
 #define IMX_CSI_BASE           (0x53FF8000)
diff --git a/arch/arm/include/asm/arch-mx25/imx25-pinmux.h b/arch/arm/include/asm/arch-mx25/imx25-pinmux.h
deleted file mode 100644 (file)
index a4c658b..0000000
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * iopin settings are controlled by four different sets of registers
- *     iopad mux control
- *     individual iopad setup (voltage select, pull/keep, drive strength ...)
- *     group iopad setup (same as above but for groups of signals)
- *     input select when multiple inputs are possible
- */
-
-/*
- * software pad mux control
- */
-/* SW Input On (Loopback) */
-#define MX25_PIN_MUX_SION              (1 << 4)
-/* MUX Mode (0-7) */
-#define MX25_PIN_MUX_MODE(mode)                ((mode & 0x7) << 0)
-struct iomuxc_mux_ctl {
-       u32 gpr1;
-       u32 observe_int_mux;
-       u32 pad_a10;
-       u32 pad_a13;
-       u32 pad_a14;
-       u32 pad_a15;
-       u32 pad_a16;
-       u32 pad_a17;
-       u32 pad_a18;
-       u32 pad_a19;
-       u32 pad_a20;
-       u32 pad_a21;
-       u32 pad_a22;
-       u32 pad_a23;
-       u32 pad_a24;
-       u32 pad_a25;
-       u32 pad_eb0;
-       u32 pad_eb1;
-       u32 pad_oe;
-       u32 pad_cs0;
-       u32 pad_cs1;
-       u32 pad_cs4;
-       u32 pad_cs5;
-       u32 pad_nf_ce0;
-       u32 pad_ecb;
-       u32 pad_lba;
-       u32 pad_bclk;
-       u32 pad_rw;
-       u32 pad_nfwe_b;
-       u32 pad_nfre_b;
-       u32 pad_nfale;
-       u32 pad_nfcle;
-       u32 pad_nfwp_b;
-       u32 pad_nfrb;
-       u32 pad_d15;
-       u32 pad_d14;
-       u32 pad_d13;
-       u32 pad_d12;
-       u32 pad_d11;
-       u32 pad_d10;
-       u32 pad_d9;
-       u32 pad_d8;
-       u32 pad_d7;
-       u32 pad_d6;
-       u32 pad_d5;
-       u32 pad_d4;
-       u32 pad_d3;
-       u32 pad_d2;
-       u32 pad_d1;
-       u32 pad_d0;
-       u32 pad_ld0;
-       u32 pad_ld1;
-       u32 pad_ld2;
-       u32 pad_ld3;
-       u32 pad_ld4;
-       u32 pad_ld5;
-       u32 pad_ld6;
-       u32 pad_ld7;
-       u32 pad_ld8;
-       u32 pad_ld9;
-       u32 pad_ld10;
-       u32 pad_ld11;
-       u32 pad_ld12;
-       u32 pad_ld13;
-       u32 pad_ld14;
-       u32 pad_ld15;
-       u32 pad_hsync;
-       u32 pad_vsync;
-       u32 pad_lsclk;
-       u32 pad_oe_acd;
-       u32 pad_contrast;
-       u32 pad_pwm;
-       u32 pad_csi_d2;
-       u32 pad_csi_d3;
-       u32 pad_csi_d4;
-       u32 pad_csi_d5;
-       u32 pad_csi_d6;
-       u32 pad_csi_d7;
-       u32 pad_csi_d8;
-       u32 pad_csi_d9;
-       u32 pad_csi_mclk;
-       u32 pad_csi_vsync;
-       u32 pad_csi_hsync;
-       u32 pad_csi_pixclk;
-       u32 pad_i2c1_clk;
-       u32 pad_i2c1_dat;
-       u32 pad_cspi1_mosi;
-       u32 pad_cspi1_miso;
-       u32 pad_cspi1_ss0;
-       u32 pad_cspi1_ss1;
-       u32 pad_cspi1_sclk;
-       u32 pad_cspi1_rdy;
-       u32 pad_uart1_rxd;
-       u32 pad_uart1_txd;
-       u32 pad_uart1_rts;
-       u32 pad_uart1_cts;
-       u32 pad_uart2_rxd;
-       u32 pad_uart2_txd;
-       u32 pad_uart2_rts;
-       u32 pad_uart2_cts;
-       u32 pad_sd1_cmd;
-       u32 pad_sd1_clk;
-       u32 pad_sd1_data0;
-       u32 pad_sd1_data1;
-       u32 pad_sd1_data2;
-       u32 pad_sd1_data3;
-       u32 pad_kpp_row0;
-       u32 pad_kpp_row1;
-       u32 pad_kpp_row2;
-       u32 pad_kpp_row3;
-       u32 pad_kpp_col0;
-       u32 pad_kpp_col1;
-       u32 pad_kpp_col2;
-       u32 pad_kpp_col3;
-       u32 pad_fec_mdc;
-       u32 pad_fec_mdio;
-       u32 pad_fec_tdata0;
-       u32 pad_fec_tdata1;
-       u32 pad_fec_tx_en;
-       u32 pad_fec_rdata0;
-       u32 pad_fec_rdata1;
-       u32 pad_fec_rx_dv;
-       u32 pad_fec_tx_clk;
-       u32 pad_rtck;
-       u32 pad_de_b;
-       u32 pad_gpio_a;
-       u32 pad_gpio_b;
-       u32 pad_gpio_c;
-       u32 pad_gpio_d;
-       u32 pad_gpio_e;
-       u32 pad_gpio_f;
-       u32 pad_ext_armclk;
-       u32 pad_upll_bypclk;
-       u32 pad_vstby_req;
-       u32 pad_vstby_ack;
-       u32 pad_power_fail;
-       u32 pad_clko;
-       u32 pad_boot_mode0;
-       u32 pad_boot_mode1;
-};
-
-/*
- * software pad control
- */
-/* Select 3.3 or 1.8 volts */
-#define MX25_PIN_PAD_CTL_DVS_33                        (0 << 13)
-#define MX25_PIN_PAD_CTL_DVS_18                        (1 << 13)
-/* Enable hysteresis */
-#define MX25_PIN_PAD_CTL_HYS                   (1 << 8)
-/* Enable pull/keeper */
-#define MX25_PIN_PAD_CTL_PKE                   (1 << 7)
-/* 0 - keeper / 1 - pull */
-#define MX25_PIN_PAD_CTL_PUE                   (1 << 6)
-/* pull up/down strength */
-#define MX25_PIN_PAD_CTL_100K_PD               (0 << 4)
-#define MX25_PIN_PAD_CTL_47K_PU                        (1 << 4)
-#define MX25_PIN_PAD_CTL_100K_PU               (2 << 4)
-#define MX25_PIN_PAD_CTL_22K_PU                        (3 << 4)
-/* open drain control */
-#define MX25_PIN_PAD_CTL_OD                    (1 << 3)
-/* drive strength */
-#define MX25_PIN_PAD_CTL_DS_NOM                        (0 << 1)
-#define MX25_PIN_PAD_CTL_DS_HIGH               (1 << 1)
-#define MX25_PIN_PAD_CTL_DS_MAX                        (2 << 1)
-#define MX25_PIN_PAD_CTL_DS_MAX11              (3 << 1)
-/* slew rate */
-#define MX25_PIN_PAD_CTL_SRE_SLOW              (0 << 0)
-#define MX25_PIN_PAD_CTL_SRE_FAST              (1 << 0)
-struct  iomuxc_pad_ctl {
-       u32 pad_a13;
-       u32 pad_a14;
-       u32 pad_a15;
-       u32 pad_a17;
-       u32 pad_a18;
-       u32 pad_a19;
-       u32 pad_a20;
-       u32 pad_a21;
-       u32 pad_a23;
-       u32 pad_a24;
-       u32 pad_a25;
-       u32 pad_eb0;
-       u32 pad_eb1;
-       u32 pad_oe;
-       u32 pad_cs4;
-       u32 pad_cs5;
-       u32 pad_nf_ce0;
-       u32 pad_ecb;
-       u32 pad_lba;
-       u32 pad_rw;
-       u32 pad_nfrb;
-       u32 pad_d15;
-       u32 pad_d14;
-       u32 pad_d13;
-       u32 pad_d12;
-       u32 pad_d11;
-       u32 pad_d10;
-       u32 pad_d9;
-       u32 pad_d8;
-       u32 pad_d7;
-       u32 pad_d6;
-       u32 pad_d5;
-       u32 pad_d4;
-       u32 pad_d3;
-       u32 pad_d2;
-       u32 pad_d1;
-       u32 pad_d0;
-       u32 pad_ld0;
-       u32 pad_ld1;
-       u32 pad_ld2;
-       u32 pad_ld3;
-       u32 pad_ld4;
-       u32 pad_ld5;
-       u32 pad_ld6;
-       u32 pad_ld7;
-       u32 pad_ld8;
-       u32 pad_ld9;
-       u32 pad_ld10;
-       u32 pad_ld11;
-       u32 pad_ld12;
-       u32 pad_ld13;
-       u32 pad_ld14;
-       u32 pad_ld15;
-       u32 pad_hsync;
-       u32 pad_vsync;
-       u32 pad_lsclk;
-       u32 pad_oe_acd;
-       u32 pad_contrast;
-       u32 pad_pwm;
-       u32 pad_csi_d2;
-       u32 pad_csi_d3;
-       u32 pad_csi_d4;
-       u32 pad_csi_d5;
-       u32 pad_csi_d6;
-       u32 pad_csi_d7;
-       u32 pad_csi_d8;
-       u32 pad_csi_d9;
-       u32 pad_csi_mclk;
-       u32 pad_csi_vsync;
-       u32 pad_csi_hsync;
-       u32 pad_csi_pixclk;
-       u32 pad_i2c1_clk;
-       u32 pad_i2c1_dat;
-       u32 pad_cspi1_mosi;
-       u32 pad_cspi1_miso;
-       u32 pad_cspi1_ss0;
-       u32 pad_cspi1_ss1;
-       u32 pad_cspi1_sclk;
-       u32 pad_cspi1_rdy;
-       u32 pad_uart1_rxd;
-       u32 pad_uart1_txd;
-       u32 pad_uart1_rts;
-       u32 pad_uart1_cts;
-       u32 pad_uart2_rxd;
-       u32 pad_uart2_txd;
-       u32 pad_uart2_rts;
-       u32 pad_uart2_cts;
-       u32 pad_sd1_cmd;
-       u32 pad_sd1_clk;
-       u32 pad_sd1_data0;
-       u32 pad_sd1_data1;
-       u32 pad_sd1_data2;
-       u32 pad_sd1_data3;
-       u32 pad_kpp_row0;
-       u32 pad_kpp_row1;
-       u32 pad_kpp_row2;
-       u32 pad_kpp_row3;
-       u32 pad_kpp_col0;
-       u32 pad_kpp_col1;
-       u32 pad_kpp_col2;
-       u32 pad_kpp_col3;
-       u32 pad_fec_mdc;
-       u32 pad_fec_mdio;
-       u32 pad_fec_tdata0;
-       u32 pad_fec_tdata1;
-       u32 pad_fec_tx_en;
-       u32 pad_fec_rdata0;
-       u32 pad_fec_rdata1;
-       u32 pad_fec_rx_dv;
-       u32 pad_fec_tx_clk;
-       u32 pad_rtck;
-       u32 pad_tdo;
-       u32 pad_de_b;
-       u32 pad_gpio_a;
-       u32 pad_gpio_b;
-       u32 pad_gpio_c;
-       u32 pad_gpio_d;
-       u32 pad_gpio_e;
-       u32 pad_gpio_f;
-       u32 pad_vstby_req;
-       u32 pad_vstby_ack;
-       u32 pad_power_fail;
-       u32 pad_clko;
-};
-
-
-/*
- * Pad group drive strength and voltage select
- * Same fields as iomuxc_pad_ctl plus ddr type
- */
-/* Select DDR type */
-#define MX25_PIN_PAD_CTL_DDR_18                        (0 << 11)
-#define MX25_PIN_PAD_CTL_DDR_33                        (1 << 11)
-#define MX25_PIN_PAD_CTL_DDR_MAX               (2 << 11)
-struct iomuxc_pad_grp_ctl {
-       u32 grp_dvs_misc;
-       u32 grp_dse_fec;
-       u32 grp_dvs_jtag;
-       u32 grp_dse_nfc;
-       u32 grp_dse_csi;
-       u32 grp_dse_weim;
-       u32 grp_dse_ddr;
-       u32 grp_dvs_crm;
-       u32 grp_dse_kpp;
-       u32 grp_dse_sdhc1;
-       u32 grp_dse_lcd;
-       u32 grp_dse_uart;
-       u32 grp_dvs_nfc;
-       u32 grp_dvs_csi;
-       u32 grp_dse_cspi1;
-       u32 grp_ddrtype;
-       u32 grp_dvs_sdhc1;
-       u32 grp_dvs_lcd;
-};
-
-/*
- * Pad input select control
- * Select which pad to connect to an input port
- * where multiple pads can function as given input
- */
-#define MX25_PAD_INPUT_SELECT_DAISY(in)                ((in & 0x7) << 0)
-struct iomuxc_pad_input_select {
-       u32 audmux_p4_input_da_amx;
-       u32 audmux_p4_input_db_amx;
-       u32 audmux_p4_input_rxclk_amx;
-       u32 audmux_p4_input_rxfs_amx;
-       u32 audmux_p4_input_txclk_amx;
-       u32 audmux_p4_input_txfs_amx;
-       u32 audmux_p7_input_da_amx;
-       u32 audmux_p7_input_txfs_amx;
-       u32 can1_ipp_ind_canrx;
-       u32 can2_ipp_ind_canrx;
-       u32 csi_ipp_csi_d_0;
-       u32 csi_ipp_csi_d_1;
-       u32 cspi1_ipp_ind_ss3_b;
-       u32 cspi2_ipp_cspi_clk_in;
-       u32 cspi2_ipp_ind_dataready_b;
-       u32 cspi2_ipp_ind_miso;
-       u32 cspi2_ipp_ind_mosi;
-       u32 cspi2_ipp_ind_ss0_b;
-       u32 cspi2_ipp_ind_ss1_b;
-       u32 cspi3_ipp_cspi_clk_in;
-       u32 cspi3_ipp_ind_dataready_b;
-       u32 cspi3_ipp_ind_miso;
-       u32 cspi3_ipp_ind_mosi;
-       u32 cspi3_ipp_ind_ss0_b;
-       u32 cspi3_ipp_ind_ss1_b;
-       u32 cspi3_ipp_ind_ss2_b;
-       u32 cspi3_ipp_ind_ss3_b;
-       u32 esdhc1_ipp_dat4_in;
-       u32 esdhc1_ipp_dat5_in;
-       u32 esdhc1_ipp_dat6_in;
-       u32 esdhc1_ipp_dat7_in;
-       u32 esdhc2_ipp_card_clk_in;
-       u32 esdhc2_ipp_cmd_in;
-       u32 esdhc2_ipp_dat0_in;
-       u32 esdhc2_ipp_dat1_in;
-       u32 esdhc2_ipp_dat2_in;
-       u32 esdhc2_ipp_dat3_in;
-       u32 esdhc2_ipp_dat4_in;
-       u32 esdhc2_ipp_dat5_in;
-       u32 esdhc2_ipp_dat6_in;
-       u32 esdhc2_ipp_dat7_in;
-       u32 fec_fec_col;
-       u32 fec_fec_crs;
-       u32 fec_fec_rdata_2;
-       u32 fec_fec_rdata_3;
-       u32 fec_fec_rx_clk;
-       u32 fec_fec_rx_er;
-       u32 i2c2_ipp_scl_in;
-       u32 i2c2_ipp_sda_in;
-       u32 i2c3_ipp_scl_in;
-       u32 i2c3_ipp_sda_in;
-       u32 kpp_ipp_ind_col_4;
-       u32 kpp_ipp_ind_col_5;
-       u32 kpp_ipp_ind_col_6;
-       u32 kpp_ipp_ind_col_7;
-       u32 kpp_ipp_ind_row_4;
-       u32 kpp_ipp_ind_row_5;
-       u32 kpp_ipp_ind_row_6;
-       u32 kpp_ipp_ind_row_7;
-       u32 sim1_pin_sim_rcvd1_in;
-       u32 sim1_pin_sim_simpd1;
-       u32 sim1_sim_rcvd1_io;
-       u32 sim2_pin_sim_rcvd1_in;
-       u32 sim2_pin_sim_simpd1;
-       u32 sim2_sim_rcvd1_io;
-       u32 uart3_ipp_uart_rts_b;
-       u32 uart3_ipp_uart_rxd_mux;
-       u32 uart4_ipp_uart_rts_b;
-       u32 uart4_ipp_uart_rxd_mux;
-       u32 uart5_ipp_uart_rts_b;
-       u32 uart5_ipp_uart_rxd_mux;
-       u32 usb_top_ipp_ind_otg_usb_oc;
-       u32 usb_top_ipp_ind_uh2_usb_oc;
-};
diff --git a/arch/arm/include/asm/arch-mx25/iomux-mx25.h b/arch/arm/include/asm/arch-mx25/iomux-mx25.h
new file mode 100644 (file)
index 0000000..c0f5c61
--- /dev/null
@@ -0,0 +1,545 @@
+/*
+ * (C) Copyright 2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on mainline Linux i.MX iomux-mx25.h file:
+ * Copyright (C) 2009 by Lothar Wassmann <LW@KARO-electronics.de>
+ *
+ * Based on Linux arch/arm/mach-mx25/mx25_pins.h:
+ * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
+ * and Linux arch/arm/plat-mxc/include/mach/iomux-mx35.h:
+ * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH <armlinux@phytec.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
+ */
+
+#ifndef __IOMUX_MX25_H__
+#define __IOMUX_MX25_H__
+
+#include <asm/imx-common/iomux-v3.h>
+
+/* Pad control groupings */
+#define MX25_KPP_ROW_PAD_CTRL  PAD_CTL_PUS_100K_UP
+#define MX25_KPP_COL_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
+/*
+ * The naming convention for the pad modes is MX25_PAD_<padname>__<padmode>
+ * If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num>
+ * See also iomux-v3.h
+ */
+
+/*                                                         PAD    MUX    ALT INPSE PATH PADCTRL */
+enum {
+       MX25_PAD_A10__A10                       = IOMUX_PAD(0x000, 0x008, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A10__GPIO_4_0                  = IOMUX_PAD(0x000, 0x008, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A13__A13                       = IOMUX_PAD(0x22C, 0x00c, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A13__GPIO_4_1                  = IOMUX_PAD(0x22C, 0x00c, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A14__A14                       = IOMUX_PAD(0x230, 0x010, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A14__GPIO_2_0                  = IOMUX_PAD(0x230, 0x010, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A15__A15                       = IOMUX_PAD(0x234, 0x014, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A15__GPIO_2_1                  = IOMUX_PAD(0x234, 0x014, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A16__A16                       = IOMUX_PAD(0x000, 0x018, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A16__GPIO_2_2                  = IOMUX_PAD(0x000, 0x018, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A17__A17                       = IOMUX_PAD(0x238, 0x01c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A17__GPIO_2_3                  = IOMUX_PAD(0x238, 0x01c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A18__A18                       = IOMUX_PAD(0x23c, 0x020, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A18__GPIO_2_4                  = IOMUX_PAD(0x23c, 0x020, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A18__FEC_COL                   = IOMUX_PAD(0x23c, 0x020, 0x17, 0x504, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A19__A19                       = IOMUX_PAD(0x240, 0x024, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A19__FEC_RX_ER                 = IOMUX_PAD(0x240, 0x024, 0x17, 0x518, 0, NO_PAD_CTRL),
+       MX25_PAD_A19__GPIO_2_5                  = IOMUX_PAD(0x240, 0x024, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A20__A20                       = IOMUX_PAD(0x244, 0x028, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A20__GPIO_2_6                  = IOMUX_PAD(0x244, 0x028, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A20__FEC_RDATA2                = IOMUX_PAD(0x244, 0x028, 0x17, 0x50c, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A21__A21                       = IOMUX_PAD(0x248, 0x02c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A21__GPIO_2_7                  = IOMUX_PAD(0x248, 0x02c, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A21__FEC_RDATA3                = IOMUX_PAD(0x248, 0x02c, 0x17, 0x510, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A22__A22                       = IOMUX_PAD(0x000, 0x030, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A22__GPIO_2_8                  = IOMUX_PAD(0x000, 0x030, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A23__A23                       = IOMUX_PAD(0x24c, 0x034, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A23__GPIO_2_9                  = IOMUX_PAD(0x24c, 0x034, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A24__A24                       = IOMUX_PAD(0x250, 0x038, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A24__GPIO_2_10                 = IOMUX_PAD(0x250, 0x038, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A24__FEC_RX_CLK                = IOMUX_PAD(0x250, 0x038, 0x17, 0x514, 0, NO_PAD_CTRL),
+
+       MX25_PAD_A25__A25                       = IOMUX_PAD(0x254, 0x03c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A25__GPIO_2_11                 = IOMUX_PAD(0x254, 0x03c, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_A25__FEC_CRS                   = IOMUX_PAD(0x254, 0x03c, 0x17, 0x508, 0, NO_PAD_CTRL),
+
+       MX25_PAD_EB0__EB0                       = IOMUX_PAD(0x258, 0x040, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_EB0__AUD4_TXD                  = IOMUX_PAD(0x258, 0x040, 0x14, 0x464, 0, NO_PAD_CTRL),
+       MX25_PAD_EB0__GPIO_2_12                 = IOMUX_PAD(0x258, 0x040, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_EB1__EB1                       = IOMUX_PAD(0x25c, 0x044, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_EB1__AUD4_RXD                  = IOMUX_PAD(0x25c, 0x044, 0x14, 0x460, 0, NO_PAD_CTRL),
+       MX25_PAD_EB1__GPIO_2_13                 = IOMUX_PAD(0x25c, 0x044, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_OE__OE                         = IOMUX_PAD(0x260, 0x048, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_OE__AUD4_TXC                   = IOMUX_PAD(0x260, 0x048, 0x14, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_OE__GPIO_2_14                  = IOMUX_PAD(0x260, 0x048, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CS0__CS0                       = IOMUX_PAD(0x000, 0x04c, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS0__GPIO_4_2                  = IOMUX_PAD(0x000, 0x04c, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CS1__CS1                       = IOMUX_PAD(0x000, 0x050, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS1__NF_CE3                    = IOMUX_PAD(0x000, 0x050, 0x01, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS1__GPIO_4_3                  = IOMUX_PAD(0x000, 0x050, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CS4__CS4                       = IOMUX_PAD(0x264, 0x054, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS4__NF_CE1                    = IOMUX_PAD(0x264, 0x054, 0x01, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS4__UART5_CTS                 = IOMUX_PAD(0x264, 0x054, 0x13, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS4__GPIO_3_20                 = IOMUX_PAD(0x264, 0x054, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CS5__CS5                       = IOMUX_PAD(0x268, 0x058, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS5__NF_CE2                    = IOMUX_PAD(0x268, 0x058, 0x01, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CS5__UART5_RTS                 = IOMUX_PAD(0x268, 0x058, 0x13, 0x574, 0, NO_PAD_CTRL),
+       MX25_PAD_CS5__GPIO_3_21                 = IOMUX_PAD(0x268, 0x058, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NF_CE0__NF_CE0                 = IOMUX_PAD(0x26c, 0x05c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NF_CE0__GPIO_3_22              = IOMUX_PAD(0x26c, 0x05c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_ECB__ECB                       = IOMUX_PAD(0x270, 0x060, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_ECB__UART5_TXD_MUX             = IOMUX_PAD(0x270, 0x060, 0x13, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_ECB__GPIO_3_23                 = IOMUX_PAD(0x270, 0x060, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LBA__LBA                       = IOMUX_PAD(0x274, 0x064, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_LBA__UART5_RXD_MUX             = IOMUX_PAD(0x274, 0x064, 0x13, 0x578, 0, NO_PAD_CTRL),
+       MX25_PAD_LBA__GPIO_3_24                 = IOMUX_PAD(0x274, 0x064, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_BCLK__BCLK                     = IOMUX_PAD(0x000, 0x068, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_BCLK__GPIO_4_4                 = IOMUX_PAD(0x000, 0x068, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_RW__RW                         = IOMUX_PAD(0x278, 0x06c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_RW__AUD4_TXFS                  = IOMUX_PAD(0x278, 0x06c, 0x14, 0x474, 0, NO_PAD_CTRL),
+       MX25_PAD_RW__GPIO_3_25                  = IOMUX_PAD(0x278, 0x06c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFWE_B__NFWE_B                 = IOMUX_PAD(0x000, 0x070, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NFWE_B__GPIO_3_26              = IOMUX_PAD(0x000, 0x070, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFRE_B__NFRE_B                 = IOMUX_PAD(0x000, 0x074, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NFRE_B__GPIO_3_27              = IOMUX_PAD(0x000, 0x074, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFALE__NFALE                   = IOMUX_PAD(0x000, 0x078, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NFALE__GPIO_3_28               = IOMUX_PAD(0x000, 0x078, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFCLE__NFCLE                   = IOMUX_PAD(0x000, 0x07c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NFCLE__GPIO_3_29               = IOMUX_PAD(0x000, 0x07c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFWP_B__NFWP_B                 = IOMUX_PAD(0x000, 0x080, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_NFWP_B__GPIO_3_30              = IOMUX_PAD(0x000, 0x080, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_NFRB__NFRB                     = IOMUX_PAD(0x27c, 0x084, 0x10, 0, 0, PAD_CTL_PKE),
+       MX25_PAD_NFRB__GPIO_3_31                = IOMUX_PAD(0x27c, 0x084, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D15__D15                       = IOMUX_PAD(0x280, 0x088, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D15__LD16                      = IOMUX_PAD(0x280, 0x088, 0x01, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_D15__GPIO_4_5                  = IOMUX_PAD(0x280, 0x088, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D14__D14                       = IOMUX_PAD(0x284, 0x08c, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D14__LD17                      = IOMUX_PAD(0x284, 0x08c, 0x01, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_D14__GPIO_4_6                  = IOMUX_PAD(0x284, 0x08c, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D13__D13                       = IOMUX_PAD(0x288, 0x090, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D13__LD18                      = IOMUX_PAD(0x288, 0x090, 0x01, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_D13__GPIO_4_7                  = IOMUX_PAD(0x288, 0x090, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D12__D12                       = IOMUX_PAD(0x28c, 0x094, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D12__GPIO_4_8                  = IOMUX_PAD(0x28c, 0x094, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D11__D11                       = IOMUX_PAD(0x290, 0x098, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D11__GPIO_4_9                  = IOMUX_PAD(0x290, 0x098, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D10__D10                       = IOMUX_PAD(0x294, 0x09c, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D10__GPIO_4_10                 = IOMUX_PAD(0x294, 0x09c, 0x05, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D10__USBOTG_OC                 = IOMUX_PAD(0x294, 0x09c, 0x06, 0x57c, 0, PAD_CTL_PUS_100K_UP),
+
+       MX25_PAD_D9__D9                         = IOMUX_PAD(0x298, 0x0a0, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D9__GPIO_4_11                  = IOMUX_PAD(0x298, 0x0a0, 0x05, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D9__USBH2_PWR                  = IOMUX_PAD(0x298, 0x0a0, 0x06, 0, 0, PAD_CTL_PKE),
+
+       MX25_PAD_D8__D8                         = IOMUX_PAD(0x29c, 0x0a4, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D8__GPIO_4_12                  = IOMUX_PAD(0x29c, 0x0a4, 0x05, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D8__USBH2_OC                   = IOMUX_PAD(0x29c, 0x0a4, 0x06, 0x580, 0, PAD_CTL_PUS_100K_UP),
+
+       MX25_PAD_D7__D7                         = IOMUX_PAD(0x2a0, 0x0a8, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D7__GPIO_4_13                  = IOMUX_PAD(0x2a0, 0x0a8, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D6__D6                         = IOMUX_PAD(0x2a4, 0x0ac, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D6__GPIO_4_14                  = IOMUX_PAD(0x2a4, 0x0ac, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D5__D5                         = IOMUX_PAD(0x2a8, 0x0b0, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D5__GPIO_4_15                  = IOMUX_PAD(0x2a8, 0x0b0, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D4__D4                         = IOMUX_PAD(0x2ac, 0x0b4, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D4__GPIO_4_16                  = IOMUX_PAD(0x2ac, 0x0b4, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D3__D3                         = IOMUX_PAD(0x2b0, 0x0b8, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D3__GPIO_4_17                  = IOMUX_PAD(0x2b0, 0x0b8, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D2__D2                         = IOMUX_PAD(0x2b4, 0x0bc, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D2__GPIO_4_18                  = IOMUX_PAD(0x2b4, 0x0bc, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D1__D1                         = IOMUX_PAD(0x2b8, 0x0c0, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D1__GPIO_4_19                  = IOMUX_PAD(0x2b8, 0x0c0, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_D0__D0                         = IOMUX_PAD(0x2bc, 0x0c4, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_D0__GPIO_4_20                  = IOMUX_PAD(0x2bc, 0x0c4, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD0__LD0                       = IOMUX_PAD(0x2c0, 0x0c8, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD0__CSI_D0                    = IOMUX_PAD(0x2c0, 0x0c8, 0x12, 0x488, 0, NO_PAD_CTRL),
+       MX25_PAD_LD0__GPIO_2_15                 = IOMUX_PAD(0x2c0, 0x0c8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD1__LD1                       = IOMUX_PAD(0x2c4, 0x0cc, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD1__CSI_D1                    = IOMUX_PAD(0x2c4, 0x0cc, 0x12, 0x48c, 0, NO_PAD_CTRL),
+       MX25_PAD_LD1__GPIO_2_16                 = IOMUX_PAD(0x2c4, 0x0cc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD2__LD2                       = IOMUX_PAD(0x2c8, 0x0d0, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD2__GPIO_2_17                 = IOMUX_PAD(0x2c8, 0x0d0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD3__LD3                       = IOMUX_PAD(0x2cc, 0x0d4, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD3__GPIO_2_18                 = IOMUX_PAD(0x2cc, 0x0d4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD4__LD4                       = IOMUX_PAD(0x2d0, 0x0d8, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD4__GPIO_2_19                 = IOMUX_PAD(0x2d0, 0x0d8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD5__LD5                       = IOMUX_PAD(0x2d4, 0x0dc, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD5__GPIO_1_19                 = IOMUX_PAD(0x2d4, 0x0dc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD6__LD6                       = IOMUX_PAD(0x2d8, 0x0e0, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD6__GPIO_1_20                 = IOMUX_PAD(0x2d8, 0x0e0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD7__LD7                       = IOMUX_PAD(0x2dc, 0x0e4, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD7__GPIO_1_21                 = IOMUX_PAD(0x2dc, 0x0e4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD8__LD8                       = IOMUX_PAD(0x2e0, 0x0e8, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD8__FEC_TX_ERR                = IOMUX_PAD(0x2e0, 0x0e8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD9__LD9                       = IOMUX_PAD(0x2e4, 0x0ec, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD9__FEC_COL                   = IOMUX_PAD(0x2e4, 0x0ec, 0x15, 0x504, 1, NO_PAD_CTRL),
+
+       MX25_PAD_LD10__LD10                     = IOMUX_PAD(0x2e8, 0x0f0, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD10__FEC_RX_ER                = IOMUX_PAD(0x2e8, 0x0f0, 0x15, 0x518, 1, NO_PAD_CTRL),
+
+       MX25_PAD_LD11__LD11                     = IOMUX_PAD(0x2ec, 0x0f4, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD11__FEC_RDATA2               = IOMUX_PAD(0x2ec, 0x0f4, 0x15, 0x50c, 1, NO_PAD_CTRL),
+
+       MX25_PAD_LD12__LD12                     = IOMUX_PAD(0x2f0, 0x0f8, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD12__FEC_RDATA3               = IOMUX_PAD(0x2f0, 0x0f8, 0x15, 0x510, 1, NO_PAD_CTRL),
+
+       MX25_PAD_LD13__LD13                     = IOMUX_PAD(0x2f4, 0x0fc, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD13__FEC_TDATA2               = IOMUX_PAD(0x2f4, 0x0fc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD14__LD14                     = IOMUX_PAD(0x2f8, 0x100, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD14__FEC_TDATA3               = IOMUX_PAD(0x2f8, 0x100, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LD15__LD15                     = IOMUX_PAD(0x2fc, 0x104, 0x10, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_LD15__FEC_RX_CLK               = IOMUX_PAD(0x2fc, 0x104, 0x15, 0x514, 1, NO_PAD_CTRL),
+
+       MX25_PAD_HSYNC__HSYNC                   = IOMUX_PAD(0x300, 0x108, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_HSYNC__GPIO_1_22               = IOMUX_PAD(0x300, 0x108, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_VSYNC__VSYNC                   = IOMUX_PAD(0x304, 0x10c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_VSYNC__GPIO_1_23               = IOMUX_PAD(0x304, 0x10c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_LSCLK__LSCLK                   = IOMUX_PAD(0x308, 0x110, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_LSCLK__GPIO_1_24               = IOMUX_PAD(0x308, 0x110, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_OE_ACD__OE_ACD                 = IOMUX_PAD(0x30c, 0x114, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_OE_ACD__GPIO_1_25              = IOMUX_PAD(0x30c, 0x114, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CONTRAST__CONTRAST             = IOMUX_PAD(0x310, 0x118, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CONTRAST__PWM4_PWMO            = IOMUX_PAD(0x310, 0x118, 0x14, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CONTRAST__FEC_CRS              = IOMUX_PAD(0x310, 0x118, 0x15, 0x508, 1, NO_PAD_CTRL),
+
+       MX25_PAD_PWM__PWM                       = IOMUX_PAD(0x314, 0x11c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_PWM__GPIO_1_26                 = IOMUX_PAD(0x314, 0x11c, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_PWM__USBH2_OC                  = IOMUX_PAD(0x314, 0x11c, 0x16, 0x580, 1, PAD_CTL_PUS_100K_UP),
+
+       MX25_PAD_CSI_D2__CSI_D2                 = IOMUX_PAD(0x318, 0x120, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D2__UART5_RXD_MUX          = IOMUX_PAD(0x318, 0x120, 0x11, 0x578, 1, NO_PAD_CTRL),
+       MX25_PAD_CSI_D2__GPIO_1_27              = IOMUX_PAD(0x318, 0x120, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D2__CSPI3_MOSI             = IOMUX_PAD(0x318, 0x120, 0x17, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D3__CSI_D3                 = IOMUX_PAD(0x31c, 0x124, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D3__GPIO_1_28              = IOMUX_PAD(0x31c, 0x124, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D3__CSPI3_MISO             = IOMUX_PAD(0x31c, 0x124, 0x17, 0x4b4, 1, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D4__CSI_D4                 = IOMUX_PAD(0x320, 0x128, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D4__UART5_RTS              = IOMUX_PAD(0x320, 0x128, 0x11, 0x574, 1, NO_PAD_CTRL),
+       MX25_PAD_CSI_D4__GPIO_1_29              = IOMUX_PAD(0x320, 0x128, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D4__CSPI3_SCLK             = IOMUX_PAD(0x320, 0x128, 0x17, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D5__CSI_D5                 = IOMUX_PAD(0x324, 0x12c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D5__GPIO_1_30              = IOMUX_PAD(0x324, 0x12c, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D5__CSPI3_RDY              = IOMUX_PAD(0x324, 0x12c, 0x17, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D6__CSI_D6                 = IOMUX_PAD(0x328, 0x130, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D6__GPIO_1_31              = IOMUX_PAD(0x328, 0x130, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D7__CSI_D7                 = IOMUX_PAD(0x32c, 0x134, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D7__GPIO_1_6               = IOMUX_PAD(0x32c, 0x134, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D8__CSI_D8                 = IOMUX_PAD(0x330, 0x138, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D8__GPIO_1_7               = IOMUX_PAD(0x330, 0x138, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_D9__CSI_D9                 = IOMUX_PAD(0x334, 0x13c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_D9__GPIO_4_21              = IOMUX_PAD(0x334, 0x13c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_MCLK__CSI_MCLK             = IOMUX_PAD(0x338, 0x140, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_MCLK__GPIO_1_8             = IOMUX_PAD(0x338, 0x140, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_VSYNC__CSI_VSYNC           = IOMUX_PAD(0x33c, 0x144, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_VSYNC__GPIO_1_9            = IOMUX_PAD(0x33c, 0x144, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_HSYNC__CSI_HSYNC           = IOMUX_PAD(0x340, 0x148, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_HSYNC__GPIO_1_10           = IOMUX_PAD(0x340, 0x148, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSI_PIXCLK__CSI_PIXCLK         = IOMUX_PAD(0x344, 0x14c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSI_PIXCLK__GPIO_1_11          = IOMUX_PAD(0x344, 0x14c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_I2C1_CLK__I2C1_CLK             = IOMUX_PAD(0x348, 0x150, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_I2C1_CLK__GPIO_1_12            = IOMUX_PAD(0x348, 0x150, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_I2C1_DAT__I2C1_DAT             = IOMUX_PAD(0x34c, 0x154, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_I2C1_DAT__GPIO_1_13            = IOMUX_PAD(0x34c, 0x154, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_MOSI__CSPI1_MOSI         = IOMUX_PAD(0x350, 0x158, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_MOSI__GPIO_1_14          = IOMUX_PAD(0x350, 0x158, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_MISO__CSPI1_MISO         = IOMUX_PAD(0x354, 0x15c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_MISO__GPIO_1_15          = IOMUX_PAD(0x354, 0x15c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_SS0__CSPI1_SS0           = IOMUX_PAD(0x358, 0x160, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_SS0__GPIO_1_16           = IOMUX_PAD(0x358, 0x160, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_SS1__CSPI1_SS1           = IOMUX_PAD(0x35c, 0x164, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_SS1__I2C3_DAT            = IOMUX_PAD(0x35c, 0x164, 0x11, 0x528, 1, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_SS1__GPIO_1_17           = IOMUX_PAD(0x35c, 0x164, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_SCLK__CSPI1_SCLK         = IOMUX_PAD(0x360, 0x168, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CSPI1_SCLK__GPIO_1_18          = IOMUX_PAD(0x360, 0x168, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CSPI1_RDY__CSPI1_RDY           = IOMUX_PAD(0x364, 0x16c, 0x10, 0, 0, PAD_CTL_PKE),
+       MX25_PAD_CSPI1_RDY__GPIO_2_22           = IOMUX_PAD(0x364, 0x16c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART1_RXD__UART1_RXD           = IOMUX_PAD(0x368, 0x170, 0x10, 0, 0, PAD_CTL_PUS_100K_DOWN),
+       MX25_PAD_UART1_RXD__GPIO_4_22           = IOMUX_PAD(0x368, 0x170, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART1_TXD__UART1_TXD           = IOMUX_PAD(0x36c, 0x174, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UART1_TXD__GPIO_4_23           = IOMUX_PAD(0x36c, 0x174, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART1_RTS__UART1_RTS           = IOMUX_PAD(0x370, 0x178, 0x10, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_UART1_RTS__CSI_D0              = IOMUX_PAD(0x370, 0x178, 0x11, 0x488, 1, NO_PAD_CTRL),
+       MX25_PAD_UART1_RTS__GPIO_4_24           = IOMUX_PAD(0x370, 0x178, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART1_CTS__UART1_CTS           = IOMUX_PAD(0x374, 0x17c, 0x10, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_UART1_CTS__CSI_D1              = IOMUX_PAD(0x374, 0x17c, 0x11, 0x48c, 1, NO_PAD_CTRL),
+       MX25_PAD_UART1_CTS__GPIO_4_25           = IOMUX_PAD(0x374, 0x17c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART2_RXD__UART2_RXD           = IOMUX_PAD(0x378, 0x180, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UART2_RXD__GPIO_4_26           = IOMUX_PAD(0x378, 0x180, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART2_TXD__UART2_TXD           = IOMUX_PAD(0x37c, 0x184, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UART2_TXD__GPIO_4_27           = IOMUX_PAD(0x37c, 0x184, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART2_RTS__UART2_RTS           = IOMUX_PAD(0x380, 0x188, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UART2_RTS__FEC_COL             = IOMUX_PAD(0x380, 0x188, 0x12, 0x504, 2, NO_PAD_CTRL),
+       MX25_PAD_UART2_RTS__GPIO_4_28           = IOMUX_PAD(0x380, 0x188, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UART2_CTS__FEC_RX_ER           = IOMUX_PAD(0x384, 0x18c, 0x12, 0x518, 2, NO_PAD_CTRL),
+       MX25_PAD_UART2_CTS__UART2_CTS           = IOMUX_PAD(0x384, 0x18c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UART2_CTS__GPIO_4_29           = IOMUX_PAD(0x384, 0x18c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_CMD__SD1_CMD               = IOMUX_PAD(0x388, 0x190, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_CMD__FEC_RDATA2            = IOMUX_PAD(0x388, 0x190, 0x12, 0x50c, 2, NO_PAD_CTRL),
+       MX25_PAD_SD1_CMD__GPIO_2_23             = IOMUX_PAD(0x388, 0x190, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_CLK__SD1_CLK               = IOMUX_PAD(0x38c, 0x194, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_CLK__FEC_RDATA3            = IOMUX_PAD(0x38c, 0x194, 0x12, 0x510, 2, NO_PAD_CTRL),
+       MX25_PAD_SD1_CLK__GPIO_2_24             = IOMUX_PAD(0x38c, 0x194, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_DATA0__SD1_DATA0           = IOMUX_PAD(0x390, 0x198, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_DATA0__GPIO_2_25           = IOMUX_PAD(0x390, 0x198, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_DATA1__SD1_DATA1           = IOMUX_PAD(0x394, 0x19c, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_DATA1__AUD7_RXD            = IOMUX_PAD(0x394, 0x19c, 0x13, 0x478, 0, NO_PAD_CTRL),
+       MX25_PAD_SD1_DATA1__GPIO_2_26           = IOMUX_PAD(0x394, 0x19c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_DATA2__SD1_DATA2           = IOMUX_PAD(0x398, 0x1a0, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_DATA2__FEC_RX_CLK          = IOMUX_PAD(0x398, 0x1a0, 0x15, 0x514, 2, NO_PAD_CTRL),
+       MX25_PAD_SD1_DATA2__GPIO_2_27           = IOMUX_PAD(0x398, 0x1a0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_SD1_DATA3__SD1_DATA3           = IOMUX_PAD(0x39c, 0x1a4, 0x10, 0, 0, PAD_CTL_PUS_47K_UP),
+       MX25_PAD_SD1_DATA3__FEC_CRS             = IOMUX_PAD(0x39c, 0x1a4, 0x10, 0x508, 2, NO_PAD_CTRL),
+       MX25_PAD_SD1_DATA3__GPIO_2_28           = IOMUX_PAD(0x39c, 0x1a4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_ROW0__KPP_ROW0             = IOMUX_PAD(0x3a0, 0x1a8, 0x10, 0, 0, MX25_KPP_ROW_PAD_CTRL),
+       MX25_PAD_KPP_ROW0__GPIO_2_29            = IOMUX_PAD(0x3a0, 0x1a8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_ROW1__KPP_ROW1             = IOMUX_PAD(0x3a4, 0x1ac, 0x10, 0, 0, MX25_KPP_ROW_PAD_CTRL),
+       MX25_PAD_KPP_ROW1__GPIO_2_30            = IOMUX_PAD(0x3a4, 0x1ac, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_ROW2__KPP_ROW2             = IOMUX_PAD(0x3a8, 0x1b0, 0x10, 0, 0, MX25_KPP_ROW_PAD_CTRL),
+       MX25_PAD_KPP_ROW2__CSI_D0               = IOMUX_PAD(0x3a8, 0x1b0, 0x13, 0x488, 2, NO_PAD_CTRL),
+       MX25_PAD_KPP_ROW2__GPIO_2_31            = IOMUX_PAD(0x3a8, 0x1b0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_ROW3__KPP_ROW3             = IOMUX_PAD(0x3ac, 0x1b4, 0x10, 0, 0, MX25_KPP_ROW_PAD_CTRL),
+       MX25_PAD_KPP_ROW3__CSI_LD1              = IOMUX_PAD(0x3ac, 0x1b4, 0x13, 0x48c, 2, NO_PAD_CTRL),
+       MX25_PAD_KPP_ROW3__GPIO_3_0             = IOMUX_PAD(0x3ac, 0x1b4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_COL0__KPP_COL0             = IOMUX_PAD(0x3b0, 0x1b8, 0x10, 0, 0, MX25_KPP_COL_PAD_CTRL),
+       MX25_PAD_KPP_COL0__UART4_RXD_MUX        = IOMUX_PAD(0x3b0, 0x1b8, 0x11, 0x570, 1, NO_PAD_CTRL),
+       MX25_PAD_KPP_COL0__AUD5_TXD             = IOMUX_PAD(0x3b0, 0x1b8, 0x12, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_KPP_COL0__GPIO_3_1             = IOMUX_PAD(0x3b0, 0x1b8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_COL1__KPP_COL1             = IOMUX_PAD(0x3b4, 0x1bc, 0x10, 0, 0, MX25_KPP_COL_PAD_CTRL),
+       MX25_PAD_KPP_COL1__UART4_TXD_MUX        = IOMUX_PAD(0x3b4, 0x1bc, 0x11, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_KPP_COL1__AUD5_RXD             = IOMUX_PAD(0x3b4, 0x1bc, 0x12, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_KPP_COL1__GPIO_3_2             = IOMUX_PAD(0x3b4, 0x1bc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_COL2__KPP_COL2             = IOMUX_PAD(0x3b8, 0x1c0, 0x10, 0, 0, MX25_KPP_COL_PAD_CTRL),
+       MX25_PAD_KPP_COL2__UART4_RTS            = IOMUX_PAD(0x3b8, 0x1c0, 0x11, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_KPP_COL2__AUD5_TXC             = IOMUX_PAD(0x3b8, 0x1c0, 0x12, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_KPP_COL2__GPIO_3_3             = IOMUX_PAD(0x3b8, 0x1c0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_KPP_COL3__KPP_COL3             = IOMUX_PAD(0x3bc, 0x1c4, 0x10, 0, 0, MX25_KPP_COL_PAD_CTRL),
+       MX25_PAD_KPP_COL3__UART4_CTS            = IOMUX_PAD(0x3bc, 0x1c4, 0x11, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_KPP_COL3__AUD5_TXFS            = IOMUX_PAD(0x3bc, 0x1c4, 0x12, 0, 0, PAD_CTL_PUS_100K_UP),
+       MX25_PAD_KPP_COL3__GPIO_3_4             = IOMUX_PAD(0x3bc, 0x1c4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_MDC__FEC_MDC               = IOMUX_PAD(0x3c0, 0x1c8, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_FEC_MDC__AUD4_TXD              = IOMUX_PAD(0x3c0, 0x1c8, 0x12, 0x464, 1, NO_PAD_CTRL),
+       MX25_PAD_FEC_MDC__GPIO_3_5              = IOMUX_PAD(0x3c0, 0x1c8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_MDIO__FEC_MDIO             = IOMUX_PAD(0x3c4, 0x1cc, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_22K_UP),
+       MX25_PAD_FEC_MDIO__AUD4_RXD             = IOMUX_PAD(0x3c4, 0x1cc, 0x12, 0x460, 1, NO_PAD_CTRL),
+       MX25_PAD_FEC_MDIO__GPIO_3_6             = IOMUX_PAD(0x3c4, 0x1cc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_TDATA0__FEC_TDATA0         = IOMUX_PAD(0x3c8, 0x1d0, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_FEC_TDATA0__GPIO_3_7           = IOMUX_PAD(0x3c8, 0x1d0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_TDATA1__FEC_TDATA1         = IOMUX_PAD(0x3cc, 0x1d4, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_FEC_TDATA1__AUD4_TXFS          = IOMUX_PAD(0x3cc, 0x1d4, 0x12, 0x474, 1, NO_PAD_CTRL),
+       MX25_PAD_FEC_TDATA1__GPIO_3_8           = IOMUX_PAD(0x3cc, 0x1d4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_TX_EN__FEC_TX_EN           = IOMUX_PAD(0x3d0, 0x1d8, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_FEC_TX_EN__GPIO_3_9            = IOMUX_PAD(0x3d0, 0x1d8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_RDATA0__FEC_RDATA0         = IOMUX_PAD(0x3d4, 0x1dc, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+       MX25_PAD_FEC_RDATA0__GPIO_3_10          = IOMUX_PAD(0x3d4, 0x1dc, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_RDATA1__FEC_RDATA1         = IOMUX_PAD(0x3d8, 0x1e0, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+       MX25_PAD_FEC_RDATA1__GPIO_3_11          = IOMUX_PAD(0x3d8, 0x1e0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_RX_DV__FEC_RX_DV           = IOMUX_PAD(0x3dc, 0x1e4, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+       MX25_PAD_FEC_RX_DV__CAN2_RX             = IOMUX_PAD(0x3dc, 0x1e4, 0x14, 0x484, 0, PAD_CTL_PUS_22K_UP),
+       MX25_PAD_FEC_RX_DV__GPIO_3_12           = IOMUX_PAD(0x3dc, 0x1e4, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_FEC_TX_CLK__FEC_TX_CLK         = IOMUX_PAD(0x3e0, 0x1e8, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+       MX25_PAD_FEC_TX_CLK__GPIO_3_13          = IOMUX_PAD(0x3e0, 0x1e8, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_RTCK__RTCK                     = IOMUX_PAD(0x3e4, 0x1ec, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_RTCK__OWIRE                    = IOMUX_PAD(0x3e4, 0x1ec, 0x11, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_RTCK__GPIO_3_14                = IOMUX_PAD(0x3e4, 0x1ec, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_DE_B__DE_B                     = IOMUX_PAD(0x3ec, 0x1f0, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_DE_B__GPIO_2_20                = IOMUX_PAD(0x3ec, 0x1f0, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_TDO__TDO                       = IOMUX_PAD(0x3e8, 0x000, 0x00, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_GPIO_A__GPIO_A                 = IOMUX_PAD(0x3f0, 0x1f4, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_A__CAN1_TX                = IOMUX_PAD(0x3f0, 0x1f4, 0x16, 0, 0, PAD_CTL_PUS_22K_UP),
+       MX25_PAD_GPIO_A__USBOTG_PWR             = IOMUX_PAD(0x3f0, 0x1f4, 0x12, 0, 0, PAD_CTL_PKE),
+
+       MX25_PAD_GPIO_B__GPIO_B                 = IOMUX_PAD(0x3f4, 0x1f8, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_B__CAN1_RX                = IOMUX_PAD(0x3f4, 0x1f8, 0x16, 0x480, 1, PAD_CTL_PUS_22K_UP),
+       MX25_PAD_GPIO_B__USBOTG_OC              = IOMUX_PAD(0x3f4, 0x1f8, 0x12, 0x57c, 1, PAD_CTL_PUS_100K_UP),
+
+       MX25_PAD_GPIO_C__GPIO_C                 = IOMUX_PAD(0x3f8, 0x1fc, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_C__CAN2_TX                = IOMUX_PAD(0x3f8, 0x1fc, 0x16, 0, 0, PAD_CTL_PUS_22K_UP),
+
+       MX25_PAD_GPIO_D__GPIO_D                 = IOMUX_PAD(0x3fc, 0x200, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_E__LD16                   = IOMUX_PAD(0x400, 0x204, 0x02, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_GPIO_D__CAN2_RX                = IOMUX_PAD(0x3fc, 0x200, 0x16, 0x484, 1, PAD_CTL_PUS_22K_UP),
+
+       MX25_PAD_GPIO_E__GPIO_E                 = IOMUX_PAD(0x400, 0x204, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_F__LD17                   = IOMUX_PAD(0x404, 0x208, 0x02, 0, 0, PAD_CTL_SRE_FAST),
+       MX25_PAD_GPIO_E__I2C3_CLK               = IOMUX_PAD(0x400, 0x204, 0x11, 0x524, 2, NO_PAD_CTRL),
+       MX25_PAD_GPIO_E__AUD7_TXD               = IOMUX_PAD(0x400, 0x204, 0x14, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_GPIO_F__GPIO_F                 = IOMUX_PAD(0x404, 0x208, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_GPIO_F__AUD7_TXC               = IOMUX_PAD(0x404, 0x208, 0x14, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_EXT_ARMCLK__EXT_ARMCLK         = IOMUX_PAD(0x000, 0x20c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_EXT_ARMCLK__GPIO_3_15          = IOMUX_PAD(0x000, 0x20c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_UPLL_BYPCLK__UPLL_BYPCLK       = IOMUX_PAD(0x000, 0x210, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_UPLL_BYPCLK__GPIO_3_16         = IOMUX_PAD(0x000, 0x210, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_VSTBY_REQ__VSTBY_REQ           = IOMUX_PAD(0x408, 0x214, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_VSTBY_REQ__AUD7_TXFS           = IOMUX_PAD(0x408, 0x214, 0x14, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_VSTBY_REQ__GPIO_3_17           = IOMUX_PAD(0x408, 0x214, 0x15, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_VSTBY_ACK__VSTBY_ACK           = IOMUX_PAD(0x40c, 0x218, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_VSTBY_ACK__GPIO_3_18           = IOMUX_PAD(0x40c, 0x218, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_POWER_FAIL__POWER_FAIL         = IOMUX_PAD(0x410, 0x21c, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_POWER_FAIL__AUD7_RXD           = IOMUX_PAD(0x410, 0x21c, 0x14, 0x478, 1, NO_PAD_CTRL),
+       MX25_PAD_POWER_FAIL__GPIO_3_19          = IOMUX_PAD(0x410, 0x21c, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CLKO__CLKO                     = IOMUX_PAD(0x414, 0x220, 0x10, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CLKO__GPIO_2_21                = IOMUX_PAD(0x414, 0x220, 0x15, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_BOOT_MODE0__BOOT_MODE0         = IOMUX_PAD(0x000, 0x224, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_BOOT_MODE0__GPIO_4_30          = IOMUX_PAD(0x000, 0x224, 0x05, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_BOOT_MODE1__BOOT_MODE1         = IOMUX_PAD(0x000, 0x228, 0x00, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_BOOT_MODE1__GPIO_4_31          = IOMUX_PAD(0x000, 0x228, 0x05, 0, 0, NO_PAD_CTRL),
+
+       MX25_PAD_CTL_GRP_DVS_MISC               = IOMUX_PAD(0x418, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_FEC                = IOMUX_PAD(0x41c, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_JTAG               = IOMUX_PAD(0x420, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_NFC                = IOMUX_PAD(0x424, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_CSI                = IOMUX_PAD(0x428, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_WEIM               = IOMUX_PAD(0x42c, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_DDR                = IOMUX_PAD(0x430, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_CRM                = IOMUX_PAD(0x434, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_KPP                = IOMUX_PAD(0x438, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_SDHC1              = IOMUX_PAD(0x43c, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_LCD                = IOMUX_PAD(0x440, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_UART               = IOMUX_PAD(0x444, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_NFC                = IOMUX_PAD(0x448, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_CSI                = IOMUX_PAD(0x44c, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DSE_CSPI1              = IOMUX_PAD(0x450, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DDRTYPE                = IOMUX_PAD(0x454, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_SDHC1              = IOMUX_PAD(0x458, 0x000, 0, 0, 0, NO_PAD_CTRL),
+       MX25_PAD_CTL_GRP_DVS_LCD                = IOMUX_PAD(0x45c, 0x000, 0, 0, 0, NO_PAD_CTRL),
+};
+
+#endif /* __IOMUX_MX25_H__ */
index 2f6c823722a0d2f8c0672460594d52f0f2a84197..8867e9f3f56db06ac90de39f537c4c829f1a823a 100644 (file)
@@ -176,7 +176,7 @@ struct iim_regs {
        u32 iim_sdat;
        u32 iim_prev;
        u32 iim_srev;
-       u32 iim_prog_p;
+       u32 iim_prg_p;
        u32 iim_scs0;
        u32 iim_scs1;
        u32 iim_scs2;
@@ -222,6 +222,7 @@ struct fuse_bank0_regs {
 #define IMX_PLL_BASE           (0x27000 + IMX_IO_BASE)
 #define IMX_SYSTEM_CTL_BASE    (0x27800 + IMX_IO_BASE)
 #define IMX_IIM_BASE           (0x28000 + IMX_IO_BASE)
+#define IIM_BASE_ADDR          IMX_IIM_BASE
 #define IMX_FEC_BASE           (0x2b000 + IMX_IO_BASE)
 
 #define IMX_ESD_BASE           (0xD8001000)
index 3f58318b023b3d85fe6778f0855235f7838f759b..67fddac83a222b92df5d06a2cb26cdc036c9e360 100644 (file)
@@ -68,7 +68,7 @@ struct cspi_regs {
        u32 test;
 };
 
-/* IIM Control Registers */
+/* IIM control registers */
 struct iim_regs {
        u32 iim_stat;
        u32 iim_statm;
@@ -80,11 +80,28 @@ struct iim_regs {
        u32 iim_sdat;
        u32 iim_prev;
        u32 iim_srev;
-       u32 iim_prog_p;
+       u32 iim_prg_p;
        u32 iim_scs0;
        u32 iim_scs1;
        u32 iim_scs2;
        u32 iim_scs3;
+       u32 res[0x1f1];
+       struct fuse_bank {
+               u32 fuse_regs[0x20];
+               u32 fuse_rsvd[0xe0];
+       } bank[3];
+};
+
+struct fuse_bank0_regs {
+       u32 fuse0_5[6];
+       u32 usr;
+       u32 fuse7_15[9];
+};
+
+struct fuse_bank2_regs {
+       u32 fuse0;
+       u32 uid[8];
+       u32 fuse9_15[7];
 };
 
 struct iomuxc_regs {
@@ -557,6 +574,7 @@ struct esdc_regs {
 #define CCMR_CKIH      (2 << 1)
 
 #define MX31_IIM_BASE_ADDR     0x5001C000
+#define IIM_BASE_ADDR          MX31_IIM_BASE_ADDR
 
 #define PDR0_CSI_PODF(x)       (((x) & 0x3f) << 26)
 #define PDR0_CSI_PRDF(x)       (((x) & 0x7) << 23)
index 7f337be557fd75067c9c1c17f865b7ecc884d6be..63c6e24b1e08a1f96f28528a290ad4edd0354077 100644 (file)
@@ -262,11 +262,28 @@ struct iim_regs {
        u32 iim_sdat;
        u32 iim_prev;
        u32 iim_srev;
-       u32 iim_prog_p;
+       u32 iim_prg_p;
        u32 iim_scs0;
        u32 iim_scs1;
        u32 iim_scs2;
        u32 iim_scs3;
+       u32 res1[0x1f1];
+       struct fuse_bank {
+               u32 fuse_regs[0x20];
+               u32 fuse_rsvd[0xe0];
+       } bank[3];
+};
+
+struct fuse_bank0_regs {
+       u32 fuse0_7[8];
+       u32 uid[8];
+       u32 fuse16_31[0x10];
+};
+
+struct fuse_bank1_regs {
+       u32 fuse0_21[0x16];
+       u32 usr;
+       u32 fuse23_31[9];
 };
 
 /* General Purpose Timer (GPT) registers */
diff --git a/arch/arm/include/asm/arch-mx35/iomux-mx35.h b/arch/arm/include/asm/arch-mx35/iomux-mx35.h
new file mode 100644 (file)
index 0000000..8016cb3
--- /dev/null
@@ -0,0 +1,1276 @@
+/*
+ * (C) Copyright 2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on mainline Linux i.MX iomux-mx35.h file:
+ * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH <armlinux@phytec.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
+ */
+
+#ifndef __IOMUX_MX35_H__
+#define __IOMUX_MX35_H__
+
+#include <asm/imx-common/iomux-v3.h>
+
+/*
+ * The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
+ * If <padname> or <padmode> refers to a GPIO, it is named GPIO<unit>_<num>
+ * See also iomux-v3.h
+ */
+
+/*                                                                         PAD    MUX   ALT INPSE PATH PADCTRL */
+enum {
+       MX35_PAD_CAPTURE__GPT_CAPIN1                            = IOMUX_PAD(0x328, 0x004, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CAPTURE__GPT_CMPOUT2                           = IOMUX_PAD(0x328, 0x004, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CAPTURE__CSPI2_SS1                             = IOMUX_PAD(0x328, 0x004, 2, 0x7f4, 0, NO_PAD_CTRL),
+       MX35_PAD_CAPTURE__EPIT1_EPITO                           = IOMUX_PAD(0x328, 0x004, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CAPTURE__CCM_CLK32K                            = IOMUX_PAD(0x328, 0x004, 4, 0x7d0, 0, NO_PAD_CTRL),
+       MX35_PAD_CAPTURE__GPIO1_4                               = IOMUX_PAD(0x328, 0x004, 5, 0x850, 0, NO_PAD_CTRL),
+
+       MX35_PAD_COMPARE__GPT_CMPOUT1                           = IOMUX_PAD(0x32c, 0x008, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_COMPARE__GPT_CAPIN2                            = IOMUX_PAD(0x32c, 0x008, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_COMPARE__GPT_CMPOUT3                           = IOMUX_PAD(0x32c, 0x008, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_COMPARE__EPIT2_EPITO                           = IOMUX_PAD(0x32c, 0x008, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_COMPARE__GPIO1_5                               = IOMUX_PAD(0x32c, 0x008, 5, 0x854, 0, NO_PAD_CTRL),
+       MX35_PAD_COMPARE__SDMA_EXTDMA_2                         = IOMUX_PAD(0x32c, 0x008, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_WDOG_RST__WDOG_WDOG_B                          = IOMUX_PAD(0x330, 0x00c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_WDOG_RST__IPU_FLASH_STROBE                     = IOMUX_PAD(0x330, 0x00c, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_WDOG_RST__GPIO1_6                              = IOMUX_PAD(0x330, 0x00c, 5, 0x858, 0, NO_PAD_CTRL),
+
+       MX35_PAD_GPIO1_0__GPIO1_0                               = IOMUX_PAD(0x334, 0x010, 0, 0x82c, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_0__CCM_PMIC_RDY                          = IOMUX_PAD(0x334, 0x010, 1, 0x7d4, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_0__OWIRE_LINE                            = IOMUX_PAD(0x334, 0x010, 2, 0x990, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_0__SDMA_EXTDMA_0                         = IOMUX_PAD(0x334, 0x010, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_GPIO1_1__GPIO1_1                               = IOMUX_PAD(0x338, 0x014, 0, 0x838, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_1__PWM_PWMO                              = IOMUX_PAD(0x338, 0x014, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_1__CSPI1_SS2                             = IOMUX_PAD(0x338, 0x014, 3, 0x7d8, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_1__SCC_TAMPER_DETECT                     = IOMUX_PAD(0x338, 0x014, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_GPIO1_1__SDMA_EXTDMA_1                         = IOMUX_PAD(0x338, 0x014, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_GPIO2_0__GPIO2_0                               = IOMUX_PAD(0x33c, 0x018, 0, 0x868, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO2_0__USB_TOP_USBOTG_CLK                    = IOMUX_PAD(0x33c, 0x018, 1, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_GPIO3_0__GPIO3_0                               = IOMUX_PAD(0x340, 0x01c, 0, 0x8e8, 0, NO_PAD_CTRL),
+       MX35_PAD_GPIO3_0__USB_TOP_USBH2_CLK                     = IOMUX_PAD(0x340, 0x01c, 1, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RESET_IN_B__CCM_RESET_IN_B                     = IOMUX_PAD(0x344, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_POR_B__CCM_POR_B                               = IOMUX_PAD(0x348, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CLKO__CCM_CLKO                                 = IOMUX_PAD(0x34c, 0x020, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CLKO__GPIO1_8                                  = IOMUX_PAD(0x34c, 0x020, 5, 0x860, 0, NO_PAD_CTRL),
+
+       MX35_PAD_BOOT_MODE0__CCM_BOOT_MODE_0                    = IOMUX_PAD(0x350, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_BOOT_MODE1__CCM_BOOT_MODE_1                    = IOMUX_PAD(0x354, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CLK_MODE0__CCM_CLK_MODE_0                      = IOMUX_PAD(0x358, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CLK_MODE1__CCM_CLK_MODE_1                      = IOMUX_PAD(0x35c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_POWER_FAIL__CCM_DSM_WAKEUP_INT_26              = IOMUX_PAD(0x360, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_VSTBY__CCM_VSTBY                               = IOMUX_PAD(0x364, 0x024, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_VSTBY__GPIO1_7                                 = IOMUX_PAD(0x364, 0x024, 5, 0x85c, 0, NO_PAD_CTRL),
+
+       MX35_PAD_A0__EMI_EIM_DA_L_0                             = IOMUX_PAD(0x368, 0x028, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A1__EMI_EIM_DA_L_1                             = IOMUX_PAD(0x36c, 0x02c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A2__EMI_EIM_DA_L_2                             = IOMUX_PAD(0x370, 0x030, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A3__EMI_EIM_DA_L_3                             = IOMUX_PAD(0x374, 0x034, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A4__EMI_EIM_DA_L_4                             = IOMUX_PAD(0x378, 0x038, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A5__EMI_EIM_DA_L_5                             = IOMUX_PAD(0x37c, 0x03c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A6__EMI_EIM_DA_L_6                             = IOMUX_PAD(0x380, 0x040, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A7__EMI_EIM_DA_L_7                             = IOMUX_PAD(0x384, 0x044, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A8__EMI_EIM_DA_H_8                             = IOMUX_PAD(0x388, 0x048, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A9__EMI_EIM_DA_H_9                             = IOMUX_PAD(0x38c, 0x04c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A10__EMI_EIM_DA_H_10                           = IOMUX_PAD(0x390, 0x050, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_MA10__EMI_MA10                                 = IOMUX_PAD(0x394, 0x054, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A11__EMI_EIM_DA_H_11                           = IOMUX_PAD(0x398, 0x058, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A12__EMI_EIM_DA_H_12                           = IOMUX_PAD(0x39c, 0x05c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A13__EMI_EIM_DA_H_13                           = IOMUX_PAD(0x3a0, 0x060, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A14__EMI_EIM_DA_H2_14                          = IOMUX_PAD(0x3a4, 0x064, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A15__EMI_EIM_DA_H2_15                          = IOMUX_PAD(0x3a8, 0x068, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A16__EMI_EIM_A_16                              = IOMUX_PAD(0x3ac, 0x06c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A17__EMI_EIM_A_17                              = IOMUX_PAD(0x3b0, 0x070, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A18__EMI_EIM_A_18                              = IOMUX_PAD(0x3b4, 0x074, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A19__EMI_EIM_A_19                              = IOMUX_PAD(0x3b8, 0x078, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A20__EMI_EIM_A_20                              = IOMUX_PAD(0x3bc, 0x07c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A21__EMI_EIM_A_21                              = IOMUX_PAD(0x3c0, 0x080, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A22__EMI_EIM_A_22                              = IOMUX_PAD(0x3c4, 0x084, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A23__EMI_EIM_A_23                              = IOMUX_PAD(0x3c8, 0x088, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A24__EMI_EIM_A_24                              = IOMUX_PAD(0x3cc, 0x08c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_A25__EMI_EIM_A_25                              = IOMUX_PAD(0x3d0, 0x090, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDBA1__EMI_EIM_SDBA1                           = IOMUX_PAD(0x3d4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDBA0__EMI_EIM_SDBA0                           = IOMUX_PAD(0x3d8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD0__EMI_DRAM_D_0                              = IOMUX_PAD(0x3dc, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1__EMI_DRAM_D_1                              = IOMUX_PAD(0x3e0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD2__EMI_DRAM_D_2                              = IOMUX_PAD(0x3e4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD3__EMI_DRAM_D_3                              = IOMUX_PAD(0x3e8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD4__EMI_DRAM_D_4                              = IOMUX_PAD(0x3ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD5__EMI_DRAM_D_5                              = IOMUX_PAD(0x3f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD6__EMI_DRAM_D_6                              = IOMUX_PAD(0x3f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD7__EMI_DRAM_D_7                              = IOMUX_PAD(0x3f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD8__EMI_DRAM_D_8                              = IOMUX_PAD(0x3fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD9__EMI_DRAM_D_9                              = IOMUX_PAD(0x400, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD10__EMI_DRAM_D_10                            = IOMUX_PAD(0x404, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD11__EMI_DRAM_D_11                            = IOMUX_PAD(0x408, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD12__EMI_DRAM_D_12                            = IOMUX_PAD(0x40c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD13__EMI_DRAM_D_13                            = IOMUX_PAD(0x410, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD14__EMI_DRAM_D_14                            = IOMUX_PAD(0x414, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD15__EMI_DRAM_D_15                            = IOMUX_PAD(0x418, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD16__EMI_DRAM_D_16                            = IOMUX_PAD(0x41c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD17__EMI_DRAM_D_17                            = IOMUX_PAD(0x420, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD18__EMI_DRAM_D_18                            = IOMUX_PAD(0x424, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD19__EMI_DRAM_D_19                            = IOMUX_PAD(0x428, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD20__EMI_DRAM_D_20                            = IOMUX_PAD(0x42c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD21__EMI_DRAM_D_21                            = IOMUX_PAD(0x430, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD22__EMI_DRAM_D_22                            = IOMUX_PAD(0x434, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD23__EMI_DRAM_D_23                            = IOMUX_PAD(0x438, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD24__EMI_DRAM_D_24                            = IOMUX_PAD(0x43c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD25__EMI_DRAM_D_25                            = IOMUX_PAD(0x440, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD26__EMI_DRAM_D_26                            = IOMUX_PAD(0x444, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD27__EMI_DRAM_D_27                            = IOMUX_PAD(0x448, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD28__EMI_DRAM_D_28                            = IOMUX_PAD(0x44c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD29__EMI_DRAM_D_29                            = IOMUX_PAD(0x450, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD30__EMI_DRAM_D_30                            = IOMUX_PAD(0x454, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD31__EMI_DRAM_D_31                            = IOMUX_PAD(0x458, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_DQM0__EMI_DRAM_DQM_0                           = IOMUX_PAD(0x45c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_DQM1__EMI_DRAM_DQM_1                           = IOMUX_PAD(0x460, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_DQM2__EMI_DRAM_DQM_2                           = IOMUX_PAD(0x464, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_DQM3__EMI_DRAM_DQM_3                           = IOMUX_PAD(0x468, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_EB0__EMI_EIM_EB0_B                             = IOMUX_PAD(0x46c, 0x094, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_EB1__EMI_EIM_EB1_B                             = IOMUX_PAD(0x470, 0x098, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_OE__EMI_EIM_OE                                 = IOMUX_PAD(0x474, 0x09c, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CS0__EMI_EIM_CS0                               = IOMUX_PAD(0x478, 0x0a0, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CS1__EMI_EIM_CS1                               = IOMUX_PAD(0x47c, 0x0a4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CS1__EMI_NANDF_CE3                             = IOMUX_PAD(0x47c, 0x0a4, 3, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CS2__EMI_EIM_CS2                               = IOMUX_PAD(0x480, 0x0a8, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CS3__EMI_EIM_CS3                               = IOMUX_PAD(0x484, 0x0ac, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CS4__EMI_EIM_CS4                               = IOMUX_PAD(0x488, 0x0b0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CS4__EMI_DTACK_B                               = IOMUX_PAD(0x488, 0x0b0, 1, 0x800, 0, NO_PAD_CTRL),
+       MX35_PAD_CS4__EMI_NANDF_CE1                             = IOMUX_PAD(0x488, 0x0b0, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CS4__GPIO1_20                                  = IOMUX_PAD(0x488, 0x0b0, 5, 0x83c, 0, NO_PAD_CTRL),
+
+       MX35_PAD_CS5__EMI_EIM_CS5                               = IOMUX_PAD(0x48c, 0x0b4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CS5__CSPI2_SS2                                 = IOMUX_PAD(0x48c, 0x0b4, 1, 0x7f8, 0, NO_PAD_CTRL),
+       MX35_PAD_CS5__CSPI1_SS2                                 = IOMUX_PAD(0x48c, 0x0b4, 2, 0x7d8, 1, NO_PAD_CTRL),
+       MX35_PAD_CS5__EMI_NANDF_CE2                             = IOMUX_PAD(0x48c, 0x0b4, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CS5__GPIO1_21                                  = IOMUX_PAD(0x48c, 0x0b4, 5, 0x840, 0, NO_PAD_CTRL),
+
+       MX35_PAD_NF_CE0__EMI_NANDF_CE0                          = IOMUX_PAD(0x490, 0x0b8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NF_CE0__GPIO1_22                               = IOMUX_PAD(0x490, 0x0b8, 5, 0x844, 0, NO_PAD_CTRL),
+
+       MX35_PAD_ECB__EMI_EIM_ECB                               = IOMUX_PAD(0x494, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LBA__EMI_EIM_LBA                               = IOMUX_PAD(0x498, 0x0bc, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_BCLK__EMI_EIM_BCLK                             = IOMUX_PAD(0x49c, 0x0c0, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RW__EMI_EIM_RW                                 = IOMUX_PAD(0x4a0, 0x0c4, 0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RAS__EMI_DRAM_RAS                              = IOMUX_PAD(0x4a4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CAS__EMI_DRAM_CAS                              = IOMUX_PAD(0x4a8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDWE__EMI_DRAM_SDWE                            = IOMUX_PAD(0x4ac, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDCKE0__EMI_DRAM_SDCKE_0                       = IOMUX_PAD(0x4b0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDCKE1__EMI_DRAM_SDCKE_1                       = IOMUX_PAD(0x4b4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDCLK__EMI_DRAM_SDCLK                          = IOMUX_PAD(0x4b8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDQS0__EMI_DRAM_SDQS_0                         = IOMUX_PAD(0x4bc, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDQS1__EMI_DRAM_SDQS_1                         = IOMUX_PAD(0x4c0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDQS2__EMI_DRAM_SDQS_2                         = IOMUX_PAD(0x4c4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SDQS3__EMI_DRAM_SDQS_3                         = IOMUX_PAD(0x4c8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFWE_B__EMI_NANDF_WE_B                         = IOMUX_PAD(0x4cc, 0x0c8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFWE_B__USB_TOP_USBH2_DATA_3                   = IOMUX_PAD(0x4cc, 0x0c8, 1, 0x9d8, 0, NO_PAD_CTRL),
+       MX35_PAD_NFWE_B__IPU_DISPB_D0_VSYNC                     = IOMUX_PAD(0x4cc, 0x0c8, 2, 0x924, 0, NO_PAD_CTRL),
+       MX35_PAD_NFWE_B__GPIO2_18                               = IOMUX_PAD(0x4cc, 0x0c8, 5, 0x88c, 0, NO_PAD_CTRL),
+       MX35_PAD_NFWE_B__ARM11P_TOP_TRACE_0                     = IOMUX_PAD(0x4cc, 0x0c8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFRE_B__EMI_NANDF_RE_B                         = IOMUX_PAD(0x4d0, 0x0cc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFRE_B__USB_TOP_USBH2_DIR                      = IOMUX_PAD(0x4d0, 0x0cc, 1, 0x9ec, 0, NO_PAD_CTRL),
+       MX35_PAD_NFRE_B__IPU_DISPB_BCLK                         = IOMUX_PAD(0x4d0, 0x0cc, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFRE_B__GPIO2_19                               = IOMUX_PAD(0x4d0, 0x0cc, 5, 0x890, 0, NO_PAD_CTRL),
+       MX35_PAD_NFRE_B__ARM11P_TOP_TRACE_1                     = IOMUX_PAD(0x4d0, 0x0cc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFALE__EMI_NANDF_ALE                           = IOMUX_PAD(0x4d4, 0x0d0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFALE__USB_TOP_USBH2_STP                       = IOMUX_PAD(0x4d4, 0x0d0, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFALE__IPU_DISPB_CS0                           = IOMUX_PAD(0x4d4, 0x0d0, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFALE__GPIO2_20                                = IOMUX_PAD(0x4d4, 0x0d0, 5, 0x898, 0, NO_PAD_CTRL),
+       MX35_PAD_NFALE__ARM11P_TOP_TRACE_2                      = IOMUX_PAD(0x4d4, 0x0d0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFCLE__EMI_NANDF_CLE                           = IOMUX_PAD(0x4d8, 0x0d4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFCLE__USB_TOP_USBH2_NXT                       = IOMUX_PAD(0x4d8, 0x0d4, 1, 0x9f0, 0, NO_PAD_CTRL),
+       MX35_PAD_NFCLE__IPU_DISPB_PAR_RS                        = IOMUX_PAD(0x4d8, 0x0d4, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFCLE__GPIO2_21                                = IOMUX_PAD(0x4d8, 0x0d4, 5, 0x89c, 0, NO_PAD_CTRL),
+       MX35_PAD_NFCLE__ARM11P_TOP_TRACE_3                      = IOMUX_PAD(0x4d8, 0x0d4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFWP_B__EMI_NANDF_WP_B                         = IOMUX_PAD(0x4dc, 0x0d8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFWP_B__USB_TOP_USBH2_DATA_7                   = IOMUX_PAD(0x4dc, 0x0d8, 1, 0x9e8, 0, NO_PAD_CTRL),
+       MX35_PAD_NFWP_B__IPU_DISPB_WR                           = IOMUX_PAD(0x4dc, 0x0d8, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFWP_B__GPIO2_22                               = IOMUX_PAD(0x4dc, 0x0d8, 5, 0x8a0, 0, NO_PAD_CTRL),
+       MX35_PAD_NFWP_B__ARM11P_TOP_TRCTL                       = IOMUX_PAD(0x4dc, 0x0d8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_NFRB__EMI_NANDF_RB                             = IOMUX_PAD(0x4e0, 0x0dc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFRB__IPU_DISPB_RD                             = IOMUX_PAD(0x4e0, 0x0dc, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_NFRB__GPIO2_23                                 = IOMUX_PAD(0x4e0, 0x0dc, 5, 0x8a4, 0, NO_PAD_CTRL),
+       MX35_PAD_NFRB__ARM11P_TOP_TRCLK                         = IOMUX_PAD(0x4e0, 0x0dc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D15__EMI_EIM_D_15                              = IOMUX_PAD(0x4e4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D14__EMI_EIM_D_14                              = IOMUX_PAD(0x4e8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D13__EMI_EIM_D_13                              = IOMUX_PAD(0x4ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D12__EMI_EIM_D_12                              = IOMUX_PAD(0x4f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D11__EMI_EIM_D_11                              = IOMUX_PAD(0x4f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D10__EMI_EIM_D_10                              = IOMUX_PAD(0x4f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D9__EMI_EIM_D_9                                = IOMUX_PAD(0x4fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D8__EMI_EIM_D_8                                = IOMUX_PAD(0x500, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D7__EMI_EIM_D_7                                = IOMUX_PAD(0x504, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D6__EMI_EIM_D_6                                = IOMUX_PAD(0x508, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D5__EMI_EIM_D_5                                = IOMUX_PAD(0x50c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D4__EMI_EIM_D_4                                = IOMUX_PAD(0x510, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3__EMI_EIM_D_3                                = IOMUX_PAD(0x514, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D2__EMI_EIM_D_2                                = IOMUX_PAD(0x518, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D1__EMI_EIM_D_1                                = IOMUX_PAD(0x51c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D0__EMI_EIM_D_0                                = IOMUX_PAD(0x520, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D8__IPU_CSI_D_8                            = IOMUX_PAD(0x524, 0x0e0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D8__KPP_COL_0                              = IOMUX_PAD(0x524, 0x0e0, 1, 0x950, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D8__GPIO1_20                               = IOMUX_PAD(0x524, 0x0e0, 5, 0x83c, 1, NO_PAD_CTRL),
+       MX35_PAD_CSI_D8__ARM11P_TOP_EVNTBUS_13                  = IOMUX_PAD(0x524, 0x0e0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D9__IPU_CSI_D_9                            = IOMUX_PAD(0x528, 0x0e4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D9__KPP_COL_1                              = IOMUX_PAD(0x528, 0x0e4, 1, 0x954, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D9__GPIO1_21                               = IOMUX_PAD(0x528, 0x0e4, 5, 0x840, 1, NO_PAD_CTRL),
+       MX35_PAD_CSI_D9__ARM11P_TOP_EVNTBUS_14                  = IOMUX_PAD(0x528, 0x0e4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D10__IPU_CSI_D_10                          = IOMUX_PAD(0x52c, 0x0e8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D10__KPP_COL_2                             = IOMUX_PAD(0x52c, 0x0e8, 1, 0x958, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D10__GPIO1_22                              = IOMUX_PAD(0x52c, 0x0e8, 5, 0x844, 1, NO_PAD_CTRL),
+       MX35_PAD_CSI_D10__ARM11P_TOP_EVNTBUS_15                 = IOMUX_PAD(0x52c, 0x0e8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D11__IPU_CSI_D_11                          = IOMUX_PAD(0x530, 0x0ec, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D11__KPP_COL_3                             = IOMUX_PAD(0x530, 0x0ec, 1, 0x95c, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D11__GPIO1_23                              = IOMUX_PAD(0x530, 0x0ec, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D12__IPU_CSI_D_12                          = IOMUX_PAD(0x534, 0x0f0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D12__KPP_ROW_0                             = IOMUX_PAD(0x534, 0x0f0, 1, 0x970, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D12__GPIO1_24                              = IOMUX_PAD(0x534, 0x0f0, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D13__IPU_CSI_D_13                          = IOMUX_PAD(0x538, 0x0f4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D13__KPP_ROW_1                             = IOMUX_PAD(0x538, 0x0f4, 1, 0x974, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D13__GPIO1_25                              = IOMUX_PAD(0x538, 0x0f4, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D14__IPU_CSI_D_14                          = IOMUX_PAD(0x53c, 0x0f8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D14__KPP_ROW_2                             = IOMUX_PAD(0x53c, 0x0f8, 1, 0x978, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D14__GPIO1_26                              = IOMUX_PAD(0x53c, 0x0f8, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_D15__IPU_CSI_D_15                          = IOMUX_PAD(0x540, 0x0fc, 0, 0x97c, 0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D15__KPP_ROW_3                             = IOMUX_PAD(0x540, 0x0fc, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_D15__GPIO1_27                              = IOMUX_PAD(0x540, 0x0fc, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_MCLK__IPU_CSI_MCLK                         = IOMUX_PAD(0x544, 0x100, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_MCLK__GPIO1_28                             = IOMUX_PAD(0x544, 0x100, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_VSYNC__IPU_CSI_VSYNC                       = IOMUX_PAD(0x548, 0x104, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_VSYNC__GPIO1_29                            = IOMUX_PAD(0x548, 0x104, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_HSYNC__IPU_CSI_HSYNC                       = IOMUX_PAD(0x54c, 0x108, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_HSYNC__GPIO1_30                            = IOMUX_PAD(0x54c, 0x108, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSI_PIXCLK__IPU_CSI_PIXCLK                     = IOMUX_PAD(0x550, 0x10c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSI_PIXCLK__GPIO1_31                           = IOMUX_PAD(0x550, 0x10c, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_I2C1_CLK__I2C1_SCL                             = IOMUX_PAD(0x554, 0x110, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C1_CLK__GPIO2_24                             = IOMUX_PAD(0x554, 0x110, 5, 0x8a8, 0, NO_PAD_CTRL),
+       MX35_PAD_I2C1_CLK__CCM_USB_BYP_CLK                      = IOMUX_PAD(0x554, 0x110, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_I2C1_DAT__I2C1_SDA                             = IOMUX_PAD(0x558, 0x114, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C1_DAT__GPIO2_25                             = IOMUX_PAD(0x558, 0x114, 5, 0x8ac, 0, NO_PAD_CTRL),
+
+       MX35_PAD_I2C2_CLK__I2C2_SCL                             = IOMUX_PAD(0x55c, 0x118, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_CLK__CAN1_TXCAN                           = IOMUX_PAD(0x55c, 0x118, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_CLK__USB_TOP_USBH2_PWR                    = IOMUX_PAD(0x55c, 0x118, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_CLK__GPIO2_26                             = IOMUX_PAD(0x55c, 0x118, 5, 0x8b0, 0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_CLK__SDMA_DEBUG_BUS_DEVICE_2              = IOMUX_PAD(0x55c, 0x118, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_I2C2_DAT__I2C2_SDA                             = IOMUX_PAD(0x560, 0x11c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_DAT__CAN1_RXCAN                           = IOMUX_PAD(0x560, 0x11c, 1, 0x7c8, 0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_DAT__USB_TOP_USBH2_OC                     = IOMUX_PAD(0x560, 0x11c, 2, 0x9f4, 0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_DAT__GPIO2_27                             = IOMUX_PAD(0x560, 0x11c, 5, 0x8b4, 0, NO_PAD_CTRL),
+       MX35_PAD_I2C2_DAT__SDMA_DEBUG_BUS_DEVICE_3              = IOMUX_PAD(0x560, 0x11c, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_STXD4__AUDMUX_AUD4_TXD                         = IOMUX_PAD(0x564, 0x120, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_STXD4__GPIO2_28                                = IOMUX_PAD(0x564, 0x120, 5, 0x8b8, 0, NO_PAD_CTRL),
+       MX35_PAD_STXD4__ARM11P_TOP_ARM_COREASID0                = IOMUX_PAD(0x564, 0x120, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SRXD4__AUDMUX_AUD4_RXD                         = IOMUX_PAD(0x568, 0x124, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SRXD4__GPIO2_29                                = IOMUX_PAD(0x568, 0x124, 5, 0x8bc, 0, NO_PAD_CTRL),
+       MX35_PAD_SRXD4__ARM11P_TOP_ARM_COREASID1                = IOMUX_PAD(0x568, 0x124, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SCK4__AUDMUX_AUD4_TXC                          = IOMUX_PAD(0x56c, 0x128, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SCK4__GPIO2_30                                 = IOMUX_PAD(0x56c, 0x128, 5, 0x8c4, 0, NO_PAD_CTRL),
+       MX35_PAD_SCK4__ARM11P_TOP_ARM_COREASID2                 = IOMUX_PAD(0x56c, 0x128, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_STXFS4__AUDMUX_AUD4_TXFS                       = IOMUX_PAD(0x570, 0x12c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_STXFS4__GPIO2_31                               = IOMUX_PAD(0x570, 0x12c, 5, 0x8c8, 0, NO_PAD_CTRL),
+       MX35_PAD_STXFS4__ARM11P_TOP_ARM_COREASID3               = IOMUX_PAD(0x570, 0x12c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_STXD5__AUDMUX_AUD5_TXD                         = IOMUX_PAD(0x574, 0x130, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_STXD5__SPDIF_SPDIF_OUT1                        = IOMUX_PAD(0x574, 0x130, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_STXD5__CSPI2_MOSI                              = IOMUX_PAD(0x574, 0x130, 2, 0x7ec, 0, NO_PAD_CTRL),
+       MX35_PAD_STXD5__GPIO1_0                                 = IOMUX_PAD(0x574, 0x130, 5, 0x82c, 1, NO_PAD_CTRL),
+       MX35_PAD_STXD5__ARM11P_TOP_ARM_COREASID4                = IOMUX_PAD(0x574, 0x130, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SRXD5__AUDMUX_AUD5_RXD                         = IOMUX_PAD(0x578, 0x134, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SRXD5__SPDIF_SPDIF_IN1                         = IOMUX_PAD(0x578, 0x134, 1, 0x998, 0, NO_PAD_CTRL),
+       MX35_PAD_SRXD5__CSPI2_MISO                              = IOMUX_PAD(0x578, 0x134, 2, 0x7e8, 0, NO_PAD_CTRL),
+       MX35_PAD_SRXD5__GPIO1_1                                 = IOMUX_PAD(0x578, 0x134, 5, 0x838, 1, NO_PAD_CTRL),
+       MX35_PAD_SRXD5__ARM11P_TOP_ARM_COREASID5                = IOMUX_PAD(0x578, 0x134, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SCK5__AUDMUX_AUD5_TXC                          = IOMUX_PAD(0x57c, 0x138, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SCK5__SPDIF_SPDIF_EXTCLK                       = IOMUX_PAD(0x57c, 0x138, 1, 0x994, 0, NO_PAD_CTRL),
+       MX35_PAD_SCK5__CSPI2_SCLK                               = IOMUX_PAD(0x57c, 0x138, 2, 0x7e0, 0, NO_PAD_CTRL),
+       MX35_PAD_SCK5__GPIO1_2                                  = IOMUX_PAD(0x57c, 0x138, 5, 0x848, 0, NO_PAD_CTRL),
+       MX35_PAD_SCK5__ARM11P_TOP_ARM_COREASID6                 = IOMUX_PAD(0x57c, 0x138, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_STXFS5__AUDMUX_AUD5_TXFS                       = IOMUX_PAD(0x580, 0x13c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_STXFS5__CSPI2_RDY                              = IOMUX_PAD(0x580, 0x13c, 2, 0x7e4, 0, NO_PAD_CTRL),
+       MX35_PAD_STXFS5__GPIO1_3                                = IOMUX_PAD(0x580, 0x13c, 5, 0x84c, 0, NO_PAD_CTRL),
+       MX35_PAD_STXFS5__ARM11P_TOP_ARM_COREASID7               = IOMUX_PAD(0x580, 0x13c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SCKR__ESAI_SCKR                                = IOMUX_PAD(0x584, 0x140, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SCKR__GPIO1_4                                  = IOMUX_PAD(0x584, 0x140, 5, 0x850, 1, NO_PAD_CTRL),
+       MX35_PAD_SCKR__ARM11P_TOP_EVNTBUS_10                    = IOMUX_PAD(0x584, 0x140, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FSR__ESAI_FSR                                  = IOMUX_PAD(0x588, 0x144, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FSR__GPIO1_5                                   = IOMUX_PAD(0x588, 0x144, 5, 0x854, 1, NO_PAD_CTRL),
+       MX35_PAD_FSR__ARM11P_TOP_EVNTBUS_11                     = IOMUX_PAD(0x588, 0x144, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_HCKR__ESAI_HCKR                                = IOMUX_PAD(0x58c, 0x148, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_HCKR__AUDMUX_AUD5_RXFS                         = IOMUX_PAD(0x58c, 0x148, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_HCKR__CSPI2_SS0                                = IOMUX_PAD(0x58c, 0x148, 2, 0x7f0, 0, NO_PAD_CTRL),
+       MX35_PAD_HCKR__IPU_FLASH_STROBE                         = IOMUX_PAD(0x58c, 0x148, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_HCKR__GPIO1_6                                  = IOMUX_PAD(0x58c, 0x148, 5, 0x858, 1, NO_PAD_CTRL),
+       MX35_PAD_HCKR__ARM11P_TOP_EVNTBUS_12                    = IOMUX_PAD(0x58c, 0x148, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SCKT__ESAI_SCKT                                = IOMUX_PAD(0x590, 0x14c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SCKT__GPIO1_7                                  = IOMUX_PAD(0x590, 0x14c, 5, 0x85c, 1, NO_PAD_CTRL),
+       MX35_PAD_SCKT__IPU_CSI_D_0                              = IOMUX_PAD(0x590, 0x14c, 6, 0x930, 0, NO_PAD_CTRL),
+       MX35_PAD_SCKT__KPP_ROW_2                                = IOMUX_PAD(0x590, 0x14c, 7, 0x978, 1, NO_PAD_CTRL),
+
+       MX35_PAD_FST__ESAI_FST                                  = IOMUX_PAD(0x594, 0x150, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FST__GPIO1_8                                   = IOMUX_PAD(0x594, 0x150, 5, 0x860, 1, NO_PAD_CTRL),
+       MX35_PAD_FST__IPU_CSI_D_1                               = IOMUX_PAD(0x594, 0x150, 6, 0x934, 0, NO_PAD_CTRL),
+       MX35_PAD_FST__KPP_ROW_3                                 = IOMUX_PAD(0x594, 0x150, 7, 0x97c, 1, NO_PAD_CTRL),
+
+       MX35_PAD_HCKT__ESAI_HCKT                                = IOMUX_PAD(0x598, 0x154, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_HCKT__AUDMUX_AUD5_RXC                          = IOMUX_PAD(0x598, 0x154, 1, 0x7a8, 0, NO_PAD_CTRL),
+       MX35_PAD_HCKT__GPIO1_9                                  = IOMUX_PAD(0x598, 0x154, 5, 0x864, 0, NO_PAD_CTRL),
+       MX35_PAD_HCKT__IPU_CSI_D_2                              = IOMUX_PAD(0x598, 0x154, 6, 0x938, 0, NO_PAD_CTRL),
+       MX35_PAD_HCKT__KPP_COL_3                                = IOMUX_PAD(0x598, 0x154, 7, 0x95c, 1, NO_PAD_CTRL),
+
+       MX35_PAD_TX5_RX0__ESAI_TX5_RX0                          = IOMUX_PAD(0x59c, 0x158, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__AUDMUX_AUD4_RXC                       = IOMUX_PAD(0x59c, 0x158, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__CSPI2_SS2                             = IOMUX_PAD(0x59c, 0x158, 2, 0x7f8, 1, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__CAN2_TXCAN                            = IOMUX_PAD(0x59c, 0x158, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__UART2_DTR                             = IOMUX_PAD(0x59c, 0x158, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__GPIO1_10                              = IOMUX_PAD(0x59c, 0x158, 5, 0x830, 0, NO_PAD_CTRL),
+       MX35_PAD_TX5_RX0__EMI_M3IF_CHOSEN_MASTER_0              = IOMUX_PAD(0x59c, 0x158, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TX4_RX1__ESAI_TX4_RX1                          = IOMUX_PAD(0x5a0, 0x15c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__AUDMUX_AUD4_RXFS                      = IOMUX_PAD(0x5a0, 0x15c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__CSPI2_SS3                             = IOMUX_PAD(0x5a0, 0x15c, 2, 0x7fc, 0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__CAN2_RXCAN                            = IOMUX_PAD(0x5a0, 0x15c, 3, 0x7cc, 0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__UART2_DSR                             = IOMUX_PAD(0x5a0, 0x15c, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__GPIO1_11                              = IOMUX_PAD(0x5a0, 0x15c, 5, 0x834, 0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__IPU_CSI_D_3                           = IOMUX_PAD(0x5a0, 0x15c, 6, 0x93c, 0, NO_PAD_CTRL),
+       MX35_PAD_TX4_RX1__KPP_ROW_0                             = IOMUX_PAD(0x5a0, 0x15c, 7, 0x970, 1, NO_PAD_CTRL),
+
+       MX35_PAD_TX3_RX2__ESAI_TX3_RX2                          = IOMUX_PAD(0x5a4, 0x160, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX3_RX2__I2C3_SCL                              = IOMUX_PAD(0x5a4, 0x160, 1, 0x91c, 0, NO_PAD_CTRL),
+       MX35_PAD_TX3_RX2__EMI_NANDF_CE1                         = IOMUX_PAD(0x5a4, 0x160, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX3_RX2__GPIO1_12                              = IOMUX_PAD(0x5a4, 0x160, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX3_RX2__IPU_CSI_D_4                           = IOMUX_PAD(0x5a4, 0x160, 6, 0x940, 0, NO_PAD_CTRL),
+       MX35_PAD_TX3_RX2__KPP_ROW_1                             = IOMUX_PAD(0x5a4, 0x160, 7, 0x974, 1, NO_PAD_CTRL),
+
+       MX35_PAD_TX2_RX3__ESAI_TX2_RX3                          = IOMUX_PAD(0x5a8, 0x164, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX2_RX3__I2C3_SDA                              = IOMUX_PAD(0x5a8, 0x164, 1, 0x920, 0, NO_PAD_CTRL),
+       MX35_PAD_TX2_RX3__EMI_NANDF_CE2                         = IOMUX_PAD(0x5a8, 0x164, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX2_RX3__GPIO1_13                              = IOMUX_PAD(0x5a8, 0x164, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX2_RX3__IPU_CSI_D_5                           = IOMUX_PAD(0x5a8, 0x164, 6, 0x944, 0, NO_PAD_CTRL),
+       MX35_PAD_TX2_RX3__KPP_COL_0                             = IOMUX_PAD(0x5a8, 0x164, 7, 0x950, 1, NO_PAD_CTRL),
+
+       MX35_PAD_TX1__ESAI_TX1                                  = IOMUX_PAD(0x5ac, 0x168, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX1__CCM_PMIC_RDY                              = IOMUX_PAD(0x5ac, 0x168, 1, 0x7d4, 1, NO_PAD_CTRL),
+       MX35_PAD_TX1__CSPI1_SS2                                 = IOMUX_PAD(0x5ac, 0x168, 2, 0x7d8, 2, NO_PAD_CTRL),
+       MX35_PAD_TX1__EMI_NANDF_CE3                             = IOMUX_PAD(0x5ac, 0x168, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX1__UART2_RI                                  = IOMUX_PAD(0x5ac, 0x168, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX1__GPIO1_14                                  = IOMUX_PAD(0x5ac, 0x168, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX1__IPU_CSI_D_6                               = IOMUX_PAD(0x5ac, 0x168, 6, 0x948, 0, NO_PAD_CTRL),
+       MX35_PAD_TX1__KPP_COL_1                                 = IOMUX_PAD(0x5ac, 0x168, 7, 0x954, 1, NO_PAD_CTRL),
+
+       MX35_PAD_TX0__ESAI_TX0                                  = IOMUX_PAD(0x5b0, 0x16c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX0__SPDIF_SPDIF_EXTCLK                        = IOMUX_PAD(0x5b0, 0x16c, 1, 0x994, 1, NO_PAD_CTRL),
+       MX35_PAD_TX0__CSPI1_SS3                                 = IOMUX_PAD(0x5b0, 0x16c, 2, 0x7dc, 0, NO_PAD_CTRL),
+       MX35_PAD_TX0__EMI_DTACK_B                               = IOMUX_PAD(0x5b0, 0x16c, 3, 0x800, 1, NO_PAD_CTRL),
+       MX35_PAD_TX0__UART2_DCD                                 = IOMUX_PAD(0x5b0, 0x16c, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX0__GPIO1_15                                  = IOMUX_PAD(0x5b0, 0x16c, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TX0__IPU_CSI_D_7                               = IOMUX_PAD(0x5b0, 0x16c, 6, 0x94c, 0, NO_PAD_CTRL),
+       MX35_PAD_TX0__KPP_COL_2                                 = IOMUX_PAD(0x5b0, 0x16c, 7, 0x958, 1, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_MOSI__CSPI1_MOSI                         = IOMUX_PAD(0x5b4, 0x170, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_MOSI__GPIO1_16                           = IOMUX_PAD(0x5b4, 0x170, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_MOSI__ECT_CTI_TRIG_OUT1_2                = IOMUX_PAD(0x5b4, 0x170, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_MISO__CSPI1_MISO                         = IOMUX_PAD(0x5b8, 0x174, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_MISO__GPIO1_17                           = IOMUX_PAD(0x5b8, 0x174, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_MISO__ECT_CTI_TRIG_OUT1_3                = IOMUX_PAD(0x5b8, 0x174, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_SS0__CSPI1_SS0                           = IOMUX_PAD(0x5bc, 0x178, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS0__OWIRE_LINE                          = IOMUX_PAD(0x5bc, 0x178, 1, 0x990, 1, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS0__CSPI2_SS3                           = IOMUX_PAD(0x5bc, 0x178, 2, 0x7fc, 1, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS0__GPIO1_18                            = IOMUX_PAD(0x5bc, 0x178, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS0__ECT_CTI_TRIG_OUT1_4                 = IOMUX_PAD(0x5bc, 0x178, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_SS1__CSPI1_SS1                           = IOMUX_PAD(0x5c0, 0x17c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS1__PWM_PWMO                            = IOMUX_PAD(0x5c0, 0x17c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS1__CCM_CLK32K                          = IOMUX_PAD(0x5c0, 0x17c, 2, 0x7d0, 1, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS1__GPIO1_19                            = IOMUX_PAD(0x5c0, 0x17c, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS1__IPU_DIAGB_29                        = IOMUX_PAD(0x5c0, 0x17c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SS1__ECT_CTI_TRIG_OUT1_5                 = IOMUX_PAD(0x5c0, 0x17c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_SCLK__CSPI1_SCLK                         = IOMUX_PAD(0x5c4, 0x180, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SCLK__GPIO3_4                            = IOMUX_PAD(0x5c4, 0x180, 5, 0x904, 0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SCLK__IPU_DIAGB_30                       = IOMUX_PAD(0x5c4, 0x180, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SCLK__EMI_M3IF_CHOSEN_MASTER_1           = IOMUX_PAD(0x5c4, 0x180, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CSPI1_SPI_RDY__CSPI1_RDY                       = IOMUX_PAD(0x5c8, 0x184, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SPI_RDY__GPIO3_5                         = IOMUX_PAD(0x5c8, 0x184, 5, 0x908, 0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SPI_RDY__IPU_DIAGB_31                    = IOMUX_PAD(0x5c8, 0x184, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CSPI1_SPI_RDY__EMI_M3IF_CHOSEN_MASTER_2        = IOMUX_PAD(0x5c8, 0x184, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RXD1__UART1_RXD_MUX                            = IOMUX_PAD(0x5cc, 0x188, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RXD1__CSPI2_MOSI                               = IOMUX_PAD(0x5cc, 0x188, 1, 0x7ec, 1, NO_PAD_CTRL),
+       MX35_PAD_RXD1__KPP_COL_4                                = IOMUX_PAD(0x5cc, 0x188, 4, 0x960, 0, NO_PAD_CTRL),
+       MX35_PAD_RXD1__GPIO3_6                                  = IOMUX_PAD(0x5cc, 0x188, 5, 0x90c, 0, NO_PAD_CTRL),
+       MX35_PAD_RXD1__ARM11P_TOP_EVNTBUS_16                    = IOMUX_PAD(0x5cc, 0x188, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TXD1__UART1_TXD_MUX                            = IOMUX_PAD(0x5d0, 0x18c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TXD1__CSPI2_MISO                               = IOMUX_PAD(0x5d0, 0x18c, 1, 0x7e8, 1, NO_PAD_CTRL),
+       MX35_PAD_TXD1__KPP_COL_5                                = IOMUX_PAD(0x5d0, 0x18c, 4, 0x964, 0, NO_PAD_CTRL),
+       MX35_PAD_TXD1__GPIO3_7                                  = IOMUX_PAD(0x5d0, 0x18c, 5, 0x910, 0, NO_PAD_CTRL),
+       MX35_PAD_TXD1__ARM11P_TOP_EVNTBUS_17                    = IOMUX_PAD(0x5d0, 0x18c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RTS1__UART1_RTS                                = IOMUX_PAD(0x5d4, 0x190, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RTS1__CSPI2_SCLK                               = IOMUX_PAD(0x5d4, 0x190, 1, 0x7e0, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS1__I2C3_SCL                                 = IOMUX_PAD(0x5d4, 0x190, 2, 0x91c, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS1__IPU_CSI_D_0                              = IOMUX_PAD(0x5d4, 0x190, 3, 0x930, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS1__KPP_COL_6                                = IOMUX_PAD(0x5d4, 0x190, 4, 0x968, 0, NO_PAD_CTRL),
+       MX35_PAD_RTS1__GPIO3_8                                  = IOMUX_PAD(0x5d4, 0x190, 5, 0x914, 0, NO_PAD_CTRL),
+       MX35_PAD_RTS1__EMI_NANDF_CE1                            = IOMUX_PAD(0x5d4, 0x190, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RTS1__ARM11P_TOP_EVNTBUS_18                    = IOMUX_PAD(0x5d4, 0x190, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CTS1__UART1_CTS                                = IOMUX_PAD(0x5d8, 0x194, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS1__CSPI2_RDY                                = IOMUX_PAD(0x5d8, 0x194, 1, 0x7e4, 1, NO_PAD_CTRL),
+       MX35_PAD_CTS1__I2C3_SDA                                 = IOMUX_PAD(0x5d8, 0x194, 2, 0x920, 1, NO_PAD_CTRL),
+       MX35_PAD_CTS1__IPU_CSI_D_1                              = IOMUX_PAD(0x5d8, 0x194, 3, 0x934, 1, NO_PAD_CTRL),
+       MX35_PAD_CTS1__KPP_COL_7                                = IOMUX_PAD(0x5d8, 0x194, 4, 0x96c, 0, NO_PAD_CTRL),
+       MX35_PAD_CTS1__GPIO3_9                                  = IOMUX_PAD(0x5d8, 0x194, 5, 0x918, 0, NO_PAD_CTRL),
+       MX35_PAD_CTS1__EMI_NANDF_CE2                            = IOMUX_PAD(0x5d8, 0x194, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS1__ARM11P_TOP_EVNTBUS_19                    = IOMUX_PAD(0x5d8, 0x194, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RXD2__UART2_RXD_MUX                            = IOMUX_PAD(0x5dc, 0x198, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RXD2__KPP_ROW_4                                = IOMUX_PAD(0x5dc, 0x198, 4, 0x980, 0, NO_PAD_CTRL),
+       MX35_PAD_RXD2__GPIO3_10                                 = IOMUX_PAD(0x5dc, 0x198, 5, 0x8ec, 0, NO_PAD_CTRL),
+
+       MX35_PAD_TXD2__UART2_TXD_MUX                            = IOMUX_PAD(0x5e0, 0x19c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_TXD2__SPDIF_SPDIF_EXTCLK                       = IOMUX_PAD(0x5e0, 0x19c, 1, 0x994, 2, NO_PAD_CTRL),
+       MX35_PAD_TXD2__KPP_ROW_5                                = IOMUX_PAD(0x5e0, 0x19c, 4, 0x984, 0, NO_PAD_CTRL),
+       MX35_PAD_TXD2__GPIO3_11                                 = IOMUX_PAD(0x5e0, 0x19c, 5, 0x8f0, 0, NO_PAD_CTRL),
+
+       MX35_PAD_RTS2__UART2_RTS                                = IOMUX_PAD(0x5e4, 0x1a0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RTS2__SPDIF_SPDIF_IN1                          = IOMUX_PAD(0x5e4, 0x1a0, 1, 0x998, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS2__CAN2_RXCAN                               = IOMUX_PAD(0x5e4, 0x1a0, 2, 0x7cc, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS2__IPU_CSI_D_2                              = IOMUX_PAD(0x5e4, 0x1a0, 3, 0x938, 1, NO_PAD_CTRL),
+       MX35_PAD_RTS2__KPP_ROW_6                                = IOMUX_PAD(0x5e4, 0x1a0, 4, 0x988, 0, NO_PAD_CTRL),
+       MX35_PAD_RTS2__GPIO3_12                                 = IOMUX_PAD(0x5e4, 0x1a0, 5, 0x8f4, 0, NO_PAD_CTRL),
+       MX35_PAD_RTS2__AUDMUX_AUD5_RXC                          = IOMUX_PAD(0x5e4, 0x1a0, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_RTS2__UART3_RXD_MUX                            = IOMUX_PAD(0x5e4, 0x1a0, 7, 0x9a0, 0, NO_PAD_CTRL),
+
+       MX35_PAD_CTS2__UART2_CTS                                = IOMUX_PAD(0x5e8, 0x1a4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__SPDIF_SPDIF_OUT1                         = IOMUX_PAD(0x5e8, 0x1a4, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__CAN2_TXCAN                               = IOMUX_PAD(0x5e8, 0x1a4, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__IPU_CSI_D_3                              = IOMUX_PAD(0x5e8, 0x1a4, 3, 0x93c, 1, NO_PAD_CTRL),
+       MX35_PAD_CTS2__KPP_ROW_7                                = IOMUX_PAD(0x5e8, 0x1a4, 4, 0x98c, 0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__GPIO3_13                                 = IOMUX_PAD(0x5e8, 0x1a4, 5, 0x8f8, 0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__AUDMUX_AUD5_RXFS                         = IOMUX_PAD(0x5e8, 0x1a4, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CTS2__UART3_TXD_MUX                            = IOMUX_PAD(0x5e8, 0x1a4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_RTCK__ARM11P_TOP_RTCK                          = IOMUX_PAD(0x5ec, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TCK__SJC_TCK                                   = IOMUX_PAD(0x5f0, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TMS__SJC_TMS                                   = IOMUX_PAD(0x5f4, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TDI__SJC_TDI                                   = IOMUX_PAD(0x5f8, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TDO__SJC_TDO                                   = IOMUX_PAD(0x5fc, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TRSTB__SJC_TRSTB                               = IOMUX_PAD(0x600, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_DE_B__SJC_DE_B                                 = IOMUX_PAD(0x604, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SJC_MOD__SJC_MOD                               = IOMUX_PAD(0x608, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_USBOTG_PWR__USB_TOP_USBOTG_PWR                 = IOMUX_PAD(0x60c, 0x1a8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_USBOTG_PWR__USB_TOP_USBH2_PWR                  = IOMUX_PAD(0x60c, 0x1a8, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_USBOTG_PWR__GPIO3_14                           = IOMUX_PAD(0x60c, 0x1a8, 5, 0x8fc, 0, NO_PAD_CTRL),
+
+       MX35_PAD_USBOTG_OC__USB_TOP_USBOTG_OC                   = IOMUX_PAD(0x610, 0x1ac, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_USBOTG_OC__USB_TOP_USBH2_OC                    = IOMUX_PAD(0x610, 0x1ac, 1, 0x9f4, 1, NO_PAD_CTRL),
+       MX35_PAD_USBOTG_OC__GPIO3_15                            = IOMUX_PAD(0x610, 0x1ac, 5, 0x900, 0, NO_PAD_CTRL),
+
+       MX35_PAD_LD0__IPU_DISPB_DAT_0                           = IOMUX_PAD(0x614, 0x1b0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD0__GPIO2_0                                   = IOMUX_PAD(0x614, 0x1b0, 5, 0x868, 1, NO_PAD_CTRL),
+       MX35_PAD_LD0__SDMA_SDMA_DEBUG_PC_0                      = IOMUX_PAD(0x614, 0x1b0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD1__IPU_DISPB_DAT_1                           = IOMUX_PAD(0x618, 0x1b4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD1__GPIO2_1                                   = IOMUX_PAD(0x618, 0x1b4, 5, 0x894, 0, NO_PAD_CTRL),
+       MX35_PAD_LD1__SDMA_SDMA_DEBUG_PC_1                      = IOMUX_PAD(0x618, 0x1b4, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD2__IPU_DISPB_DAT_2                           = IOMUX_PAD(0x61c, 0x1b8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD2__GPIO2_2                                   = IOMUX_PAD(0x61c, 0x1b8, 5, 0x8c0, 0, NO_PAD_CTRL),
+       MX35_PAD_LD2__SDMA_SDMA_DEBUG_PC_2                      = IOMUX_PAD(0x61c, 0x1b8, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD3__IPU_DISPB_DAT_3                           = IOMUX_PAD(0x620, 0x1bc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD3__GPIO2_3                                   = IOMUX_PAD(0x620, 0x1bc, 5, 0x8cc, 0, NO_PAD_CTRL),
+       MX35_PAD_LD3__SDMA_SDMA_DEBUG_PC_3                      = IOMUX_PAD(0x620, 0x1bc, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD4__IPU_DISPB_DAT_4                           = IOMUX_PAD(0x624, 0x1c0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD4__GPIO2_4                                   = IOMUX_PAD(0x624, 0x1c0, 5, 0x8d0, 0, NO_PAD_CTRL),
+       MX35_PAD_LD4__SDMA_SDMA_DEBUG_PC_4                      = IOMUX_PAD(0x624, 0x1c0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD5__IPU_DISPB_DAT_5                           = IOMUX_PAD(0x628, 0x1c4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD5__GPIO2_5                                   = IOMUX_PAD(0x628, 0x1c4, 5, 0x8d4, 0, NO_PAD_CTRL),
+       MX35_PAD_LD5__SDMA_SDMA_DEBUG_PC_5                      = IOMUX_PAD(0x628, 0x1c4, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD6__IPU_DISPB_DAT_6                           = IOMUX_PAD(0x62c, 0x1c8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD6__GPIO2_6                                   = IOMUX_PAD(0x62c, 0x1c8, 5, 0x8d8, 0, NO_PAD_CTRL),
+       MX35_PAD_LD6__SDMA_SDMA_DEBUG_PC_6                      = IOMUX_PAD(0x62c, 0x1c8, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD7__IPU_DISPB_DAT_7                           = IOMUX_PAD(0x630, 0x1cc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD7__GPIO2_7                                   = IOMUX_PAD(0x630, 0x1cc, 5, 0x8dc, 0, NO_PAD_CTRL),
+       MX35_PAD_LD7__SDMA_SDMA_DEBUG_PC_7                      = IOMUX_PAD(0x630, 0x1cc, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD8__IPU_DISPB_DAT_8                           = IOMUX_PAD(0x634, 0x1d0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD8__GPIO2_8                                   = IOMUX_PAD(0x634, 0x1d0, 5, 0x8e0, 0, NO_PAD_CTRL),
+       MX35_PAD_LD8__SDMA_SDMA_DEBUG_PC_8                      = IOMUX_PAD(0x634, 0x1d0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD9__IPU_DISPB_DAT_9                           = IOMUX_PAD(0x638, 0x1d4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD9__GPIO2_9                                   = IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4, 0, NO_PAD_CTRL),
+       MX35_PAD_LD9__SDMA_SDMA_DEBUG_PC_9                      = IOMUX_PAD(0x638, 0x1d4, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD10__IPU_DISPB_DAT_10                         = IOMUX_PAD(0x63c, 0x1d8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD10__GPIO2_10                                 = IOMUX_PAD(0x63c, 0x1d8, 5, 0x86c, 0, NO_PAD_CTRL),
+       MX35_PAD_LD10__SDMA_SDMA_DEBUG_PC_10                    = IOMUX_PAD(0x63c, 0x1d8, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD11__IPU_DISPB_DAT_11                         = IOMUX_PAD(0x640, 0x1dc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD11__GPIO2_11                                 = IOMUX_PAD(0x640, 0x1dc, 5, 0x870, 0, NO_PAD_CTRL),
+       MX35_PAD_LD11__SDMA_SDMA_DEBUG_PC_11                    = IOMUX_PAD(0x640, 0x1dc, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD11__ARM11P_TOP_TRACE_4                       = IOMUX_PAD(0x640, 0x1dc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD12__IPU_DISPB_DAT_12                         = IOMUX_PAD(0x644, 0x1e0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD12__GPIO2_12                                 = IOMUX_PAD(0x644, 0x1e0, 5, 0x874, 0, NO_PAD_CTRL),
+       MX35_PAD_LD12__SDMA_SDMA_DEBUG_PC_12                    = IOMUX_PAD(0x644, 0x1e0, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD12__ARM11P_TOP_TRACE_5                       = IOMUX_PAD(0x644, 0x1e0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD13__IPU_DISPB_DAT_13                         = IOMUX_PAD(0x648, 0x1e4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD13__GPIO2_13                                 = IOMUX_PAD(0x648, 0x1e4, 5, 0x878, 0, NO_PAD_CTRL),
+       MX35_PAD_LD13__SDMA_SDMA_DEBUG_PC_13                    = IOMUX_PAD(0x648, 0x1e4, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD13__ARM11P_TOP_TRACE_6                       = IOMUX_PAD(0x648, 0x1e4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD14__IPU_DISPB_DAT_14                         = IOMUX_PAD(0x64c, 0x1e8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD14__GPIO2_14                                 = IOMUX_PAD(0x64c, 0x1e8, 5, 0x87c, 0, NO_PAD_CTRL),
+       MX35_PAD_LD14__SDMA_SDMA_DEBUG_EVENT_CHANNEL_0          = IOMUX_PAD(0x64c, 0x1e8, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD14__ARM11P_TOP_TRACE_7                       = IOMUX_PAD(0x64c, 0x1e8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD15__IPU_DISPB_DAT_15                         = IOMUX_PAD(0x650, 0x1ec, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD15__GPIO2_15                                 = IOMUX_PAD(0x650, 0x1ec, 5, 0x880, 0, NO_PAD_CTRL),
+       MX35_PAD_LD15__SDMA_SDMA_DEBUG_EVENT_CHANNEL_1          = IOMUX_PAD(0x650, 0x1ec, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD15__ARM11P_TOP_TRACE_8                       = IOMUX_PAD(0x650, 0x1ec, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD16__IPU_DISPB_DAT_16                         = IOMUX_PAD(0x654, 0x1f0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD16__IPU_DISPB_D12_VSYNC                      = IOMUX_PAD(0x654, 0x1f0, 2, 0x928, 0, NO_PAD_CTRL),
+       MX35_PAD_LD16__GPIO2_16                                 = IOMUX_PAD(0x654, 0x1f0, 5, 0x884, 0, NO_PAD_CTRL),
+       MX35_PAD_LD16__SDMA_SDMA_DEBUG_EVENT_CHANNEL_2          = IOMUX_PAD(0x654, 0x1f0, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD16__ARM11P_TOP_TRACE_9                       = IOMUX_PAD(0x654, 0x1f0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD17__IPU_DISPB_DAT_17                         = IOMUX_PAD(0x658, 0x1f4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD17__IPU_DISPB_CS2                            = IOMUX_PAD(0x658, 0x1f4, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD17__GPIO2_17                                 = IOMUX_PAD(0x658, 0x1f4, 5, 0x888, 0, NO_PAD_CTRL),
+       MX35_PAD_LD17__SDMA_SDMA_DEBUG_EVENT_CHANNEL_3          = IOMUX_PAD(0x658, 0x1f4, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD17__ARM11P_TOP_TRACE_10                      = IOMUX_PAD(0x658, 0x1f4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD18__IPU_DISPB_DAT_18                         = IOMUX_PAD(0x65c, 0x1f8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD18__IPU_DISPB_D0_VSYNC                       = IOMUX_PAD(0x65c, 0x1f8, 1, 0x924, 1, NO_PAD_CTRL),
+       MX35_PAD_LD18__IPU_DISPB_D12_VSYNC                      = IOMUX_PAD(0x65c, 0x1f8, 2, 0x928, 1, NO_PAD_CTRL),
+       MX35_PAD_LD18__ESDHC3_CMD                               = IOMUX_PAD(0x65c, 0x1f8, 3, 0x818, 0, NO_PAD_CTRL),
+       MX35_PAD_LD18__USB_TOP_USBOTG_DATA_3                    = IOMUX_PAD(0x65c, 0x1f8, 4, 0x9b0, 0, NO_PAD_CTRL),
+       MX35_PAD_LD18__GPIO3_24                                 = IOMUX_PAD(0x65c, 0x1f8, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD18__SDMA_SDMA_DEBUG_EVENT_CHANNEL_4          = IOMUX_PAD(0x65c, 0x1f8, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD18__ARM11P_TOP_TRACE_11                      = IOMUX_PAD(0x65c, 0x1f8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD19__IPU_DISPB_DAT_19                         = IOMUX_PAD(0x660, 0x1fc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD19__IPU_DISPB_BCLK                           = IOMUX_PAD(0x660, 0x1fc, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD19__IPU_DISPB_CS1                            = IOMUX_PAD(0x660, 0x1fc, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD19__ESDHC3_CLK                               = IOMUX_PAD(0x660, 0x1fc, 3, 0x814, 0, NO_PAD_CTRL),
+       MX35_PAD_LD19__USB_TOP_USBOTG_DIR                       = IOMUX_PAD(0x660, 0x1fc, 4, 0x9c4, 0, NO_PAD_CTRL),
+       MX35_PAD_LD19__GPIO3_25                                 = IOMUX_PAD(0x660, 0x1fc, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD19__SDMA_SDMA_DEBUG_EVENT_CHANNEL_5          = IOMUX_PAD(0x660, 0x1fc, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD19__ARM11P_TOP_TRACE_12                      = IOMUX_PAD(0x660, 0x1fc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD20__IPU_DISPB_DAT_20                         = IOMUX_PAD(0x664, 0x200, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD20__IPU_DISPB_CS0                            = IOMUX_PAD(0x664, 0x200, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD20__IPU_DISPB_SD_CLK                         = IOMUX_PAD(0x664, 0x200, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD20__ESDHC3_DAT0                              = IOMUX_PAD(0x664, 0x200, 3, 0x81c, 0, NO_PAD_CTRL),
+       MX35_PAD_LD20__GPIO3_26                                 = IOMUX_PAD(0x664, 0x200, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD20__SDMA_SDMA_DEBUG_CORE_STATUS_3            = IOMUX_PAD(0x664, 0x200, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD20__ARM11P_TOP_TRACE_13                      = IOMUX_PAD(0x664, 0x200, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD21__IPU_DISPB_DAT_21                         = IOMUX_PAD(0x668, 0x204, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__IPU_DISPB_PAR_RS                         = IOMUX_PAD(0x668, 0x204, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__IPU_DISPB_SER_RS                         = IOMUX_PAD(0x668, 0x204, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__ESDHC3_DAT1                              = IOMUX_PAD(0x668, 0x204, 3, 0x820, 0, NO_PAD_CTRL),
+       MX35_PAD_LD21__USB_TOP_USBOTG_STP                       = IOMUX_PAD(0x668, 0x204, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__GPIO3_27                                 = IOMUX_PAD(0x668, 0x204, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__SDMA_DEBUG_EVENT_CHANNEL_SEL             = IOMUX_PAD(0x668, 0x204, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD21__ARM11P_TOP_TRACE_14                      = IOMUX_PAD(0x668, 0x204, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD22__IPU_DISPB_DAT_22                         = IOMUX_PAD(0x66c, 0x208, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD22__IPU_DISPB_WR                             = IOMUX_PAD(0x66c, 0x208, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD22__IPU_DISPB_SD_D_I                         = IOMUX_PAD(0x66c, 0x208, 2, 0x92c, 0, NO_PAD_CTRL),
+       MX35_PAD_LD22__ESDHC3_DAT2                              = IOMUX_PAD(0x66c, 0x208, 3, 0x824, 0, NO_PAD_CTRL),
+       MX35_PAD_LD22__USB_TOP_USBOTG_NXT                       = IOMUX_PAD(0x66c, 0x208, 4, 0x9c8, 0, NO_PAD_CTRL),
+       MX35_PAD_LD22__GPIO3_28                                 = IOMUX_PAD(0x66c, 0x208, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD22__SDMA_DEBUG_BUS_ERROR                     = IOMUX_PAD(0x66c, 0x208, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD22__ARM11P_TOP_TRCTL                         = IOMUX_PAD(0x66c, 0x208, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_LD23__IPU_DISPB_DAT_23                         = IOMUX_PAD(0x670, 0x20c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD23__IPU_DISPB_RD                             = IOMUX_PAD(0x670, 0x20c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD23__IPU_DISPB_SD_D_IO                        = IOMUX_PAD(0x670, 0x20c, 2, 0x92c, 1, NO_PAD_CTRL),
+       MX35_PAD_LD23__ESDHC3_DAT3                              = IOMUX_PAD(0x670, 0x20c, 3, 0x828, 0, NO_PAD_CTRL),
+       MX35_PAD_LD23__USB_TOP_USBOTG_DATA_7                    = IOMUX_PAD(0x670, 0x20c, 4, 0x9c0, 0, NO_PAD_CTRL),
+       MX35_PAD_LD23__GPIO3_29                                 = IOMUX_PAD(0x670, 0x20c, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD23__SDMA_DEBUG_MATCHED_DMBUS                 = IOMUX_PAD(0x670, 0x20c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_LD23__ARM11P_TOP_TRCLK                         = IOMUX_PAD(0x670, 0x20c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_HSYNC__IPU_DISPB_D3_HSYNC                   = IOMUX_PAD(0x674, 0x210, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_HSYNC__IPU_DISPB_SD_D_IO                    = IOMUX_PAD(0x674, 0x210, 2, 0x92c, 2, NO_PAD_CTRL),
+       MX35_PAD_D3_HSYNC__GPIO3_30                             = IOMUX_PAD(0x674, 0x210, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_HSYNC__SDMA_DEBUG_RTBUFFER_WRITE            = IOMUX_PAD(0x674, 0x210, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_HSYNC__ARM11P_TOP_TRACE_15                  = IOMUX_PAD(0x674, 0x210, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_FPSHIFT__IPU_DISPB_D3_CLK                   = IOMUX_PAD(0x678, 0x214, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_FPSHIFT__IPU_DISPB_SD_CLK                   = IOMUX_PAD(0x678, 0x214, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_FPSHIFT__GPIO3_31                           = IOMUX_PAD(0x678, 0x214, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_FPSHIFT__SDMA_SDMA_DEBUG_CORE_STATUS_0      = IOMUX_PAD(0x678, 0x214, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_FPSHIFT__ARM11P_TOP_TRACE_16                = IOMUX_PAD(0x678, 0x214, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_DRDY__IPU_DISPB_D3_DRDY                     = IOMUX_PAD(0x67c, 0x218, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_DRDY__IPU_DISPB_SD_D_O                      = IOMUX_PAD(0x67c, 0x218, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_DRDY__GPIO1_0                               = IOMUX_PAD(0x67c, 0x218, 5, 0x82c, 2, NO_PAD_CTRL),
+       MX35_PAD_D3_DRDY__SDMA_SDMA_DEBUG_CORE_STATUS_1         = IOMUX_PAD(0x67c, 0x218, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_DRDY__ARM11P_TOP_TRACE_17                   = IOMUX_PAD(0x67c, 0x218, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_CONTRAST__IPU_DISPB_CONTR                      = IOMUX_PAD(0x680, 0x21c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CONTRAST__GPIO1_1                              = IOMUX_PAD(0x680, 0x21c, 5, 0x838, 2, NO_PAD_CTRL),
+       MX35_PAD_CONTRAST__SDMA_SDMA_DEBUG_CORE_STATUS_2        = IOMUX_PAD(0x680, 0x21c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_CONTRAST__ARM11P_TOP_TRACE_18                  = IOMUX_PAD(0x680, 0x21c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC                   = IOMUX_PAD(0x684, 0x220, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_VSYNC__IPU_DISPB_CS1                        = IOMUX_PAD(0x684, 0x220, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_VSYNC__GPIO1_2                              = IOMUX_PAD(0x684, 0x220, 5, 0x848, 1, NO_PAD_CTRL),
+       MX35_PAD_D3_VSYNC__SDMA_DEBUG_YIELD                     = IOMUX_PAD(0x684, 0x220, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_VSYNC__ARM11P_TOP_TRACE_19                  = IOMUX_PAD(0x684, 0x220, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_REV__IPU_DISPB_D3_REV                       = IOMUX_PAD(0x688, 0x224, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_REV__IPU_DISPB_SER_RS                       = IOMUX_PAD(0x688, 0x224, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_REV__GPIO1_3                                = IOMUX_PAD(0x688, 0x224, 5, 0x84c, 1, NO_PAD_CTRL),
+       MX35_PAD_D3_REV__SDMA_DEBUG_BUS_RWB                     = IOMUX_PAD(0x688, 0x224, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_REV__ARM11P_TOP_TRACE_20                    = IOMUX_PAD(0x688, 0x224, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS                       = IOMUX_PAD(0x68c, 0x228, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_CLS__IPU_DISPB_CS2                          = IOMUX_PAD(0x68c, 0x228, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_CLS__GPIO1_4                                = IOMUX_PAD(0x68c, 0x228, 5, 0x850, 2, NO_PAD_CTRL),
+       MX35_PAD_D3_CLS__SDMA_DEBUG_BUS_DEVICE_0                = IOMUX_PAD(0x68c, 0x228, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_CLS__ARM11P_TOP_TRACE_21                    = IOMUX_PAD(0x68c, 0x228, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_D3_SPL__IPU_DISPB_D3_SPL                       = IOMUX_PAD(0x690, 0x22c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_SPL__IPU_DISPB_D12_VSYNC                    = IOMUX_PAD(0x690, 0x22c, 2, 0x928, 2, NO_PAD_CTRL),
+       MX35_PAD_D3_SPL__GPIO1_5                                = IOMUX_PAD(0x690, 0x22c, 5, 0x854, 2, NO_PAD_CTRL),
+       MX35_PAD_D3_SPL__SDMA_DEBUG_BUS_DEVICE_1                = IOMUX_PAD(0x690, 0x22c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_D3_SPL__ARM11P_TOP_TRACE_22                    = IOMUX_PAD(0x690, 0x22c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_CMD__ESDHC1_CMD                            = IOMUX_PAD(0x694, 0x230, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CMD__MSHC_SCLK                             = IOMUX_PAD(0x694, 0x230, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CMD__IPU_DISPB_D0_VSYNC                    = IOMUX_PAD(0x694, 0x230, 3, 0x924, 2, NO_PAD_CTRL),
+       MX35_PAD_SD1_CMD__USB_TOP_USBOTG_DATA_4                 = IOMUX_PAD(0x694, 0x230, 4, 0x9b4, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CMD__GPIO1_6                               = IOMUX_PAD(0x694, 0x230, 5, 0x858, 2, NO_PAD_CTRL),
+       MX35_PAD_SD1_CMD__ARM11P_TOP_TRCTL                      = IOMUX_PAD(0x694, 0x230, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_CLK__ESDHC1_CLK                            = IOMUX_PAD(0x698, 0x234, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CLK__MSHC_BS                               = IOMUX_PAD(0x698, 0x234, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CLK__IPU_DISPB_BCLK                        = IOMUX_PAD(0x698, 0x234, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CLK__USB_TOP_USBOTG_DATA_5                 = IOMUX_PAD(0x698, 0x234, 4, 0x9b8, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_CLK__GPIO1_7                               = IOMUX_PAD(0x698, 0x234, 5, 0x85c, 2, NO_PAD_CTRL),
+       MX35_PAD_SD1_CLK__ARM11P_TOP_TRCLK                      = IOMUX_PAD(0x698, 0x234, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_DATA0__ESDHC1_DAT0                         = IOMUX_PAD(0x69c, 0x238, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA0__MSHC_DATA_0                         = IOMUX_PAD(0x69c, 0x238, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA0__IPU_DISPB_CS0                       = IOMUX_PAD(0x69c, 0x238, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA0__USB_TOP_USBOTG_DATA_6               = IOMUX_PAD(0x69c, 0x238, 4, 0x9bc, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA0__GPIO1_8                             = IOMUX_PAD(0x69c, 0x238, 5, 0x860, 2, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA0__ARM11P_TOP_TRACE_23                 = IOMUX_PAD(0x69c, 0x238, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_DATA1__ESDHC1_DAT1                         = IOMUX_PAD(0x6a0, 0x23c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA1__MSHC_DATA_1                         = IOMUX_PAD(0x6a0, 0x23c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA1__IPU_DISPB_PAR_RS                    = IOMUX_PAD(0x6a0, 0x23c, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA1__USB_TOP_USBOTG_DATA_0               = IOMUX_PAD(0x6a0, 0x23c, 4, 0x9a4, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA1__GPIO1_9                             = IOMUX_PAD(0x6a0, 0x23c, 5, 0x864, 1, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA1__ARM11P_TOP_TRACE_24                 = IOMUX_PAD(0x6a0, 0x23c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_DATA2__ESDHC1_DAT2                         = IOMUX_PAD(0x6a4, 0x240, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA2__MSHC_DATA_2                         = IOMUX_PAD(0x6a4, 0x240, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA2__IPU_DISPB_WR                        = IOMUX_PAD(0x6a4, 0x240, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA2__USB_TOP_USBOTG_DATA_1               = IOMUX_PAD(0x6a4, 0x240, 4, 0x9a8, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA2__GPIO1_10                            = IOMUX_PAD(0x6a4, 0x240, 5, 0x830, 1, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA2__ARM11P_TOP_TRACE_25                 = IOMUX_PAD(0x6a4, 0x240, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD1_DATA3__ESDHC1_DAT3                         = IOMUX_PAD(0x6a8, 0x244, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA3__MSHC_DATA_3                         = IOMUX_PAD(0x6a8, 0x244, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA3__IPU_DISPB_RD                        = IOMUX_PAD(0x6a8, 0x244, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA3__USB_TOP_USBOTG_DATA_2               = IOMUX_PAD(0x6a8, 0x244, 4, 0x9ac, 0, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA3__GPIO1_11                            = IOMUX_PAD(0x6a8, 0x244, 5, 0x834, 1, NO_PAD_CTRL),
+       MX35_PAD_SD1_DATA3__ARM11P_TOP_TRACE_26                 = IOMUX_PAD(0x6a8, 0x244, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_CMD__ESDHC2_CMD                            = IOMUX_PAD(0x6ac, 0x248, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__I2C3_SCL                              = IOMUX_PAD(0x6ac, 0x248, 1, 0x91c, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__ESDHC1_DAT4                           = IOMUX_PAD(0x6ac, 0x248, 2, 0x804, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__IPU_CSI_D_2                           = IOMUX_PAD(0x6ac, 0x248, 3, 0x938, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__USB_TOP_USBH2_DATA_4                  = IOMUX_PAD(0x6ac, 0x248, 4, 0x9dc, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__GPIO2_0                               = IOMUX_PAD(0x6ac, 0x248, 5, 0x868, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__SPDIF_SPDIF_OUT1                      = IOMUX_PAD(0x6ac, 0x248, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CMD__IPU_DISPB_D12_VSYNC                   = IOMUX_PAD(0x6ac, 0x248, 7, 0x928, 3, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_CLK__ESDHC2_CLK                            = IOMUX_PAD(0x6b0, 0x24c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__I2C3_SDA                              = IOMUX_PAD(0x6b0, 0x24c, 1, 0x920, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__ESDHC1_DAT5                           = IOMUX_PAD(0x6b0, 0x24c, 2, 0x808, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__IPU_CSI_D_3                           = IOMUX_PAD(0x6b0, 0x24c, 3, 0x93c, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__USB_TOP_USBH2_DATA_5                  = IOMUX_PAD(0x6b0, 0x24c, 4, 0x9e0, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__GPIO2_1                               = IOMUX_PAD(0x6b0, 0x24c, 5, 0x894, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__SPDIF_SPDIF_IN1                       = IOMUX_PAD(0x6b0, 0x24c, 6, 0x998, 2, NO_PAD_CTRL),
+       MX35_PAD_SD2_CLK__IPU_DISPB_CS2                         = IOMUX_PAD(0x6b0, 0x24c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_DATA0__ESDHC2_DAT0                         = IOMUX_PAD(0x6b4, 0x250, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__UART3_RXD_MUX                       = IOMUX_PAD(0x6b4, 0x250, 1, 0x9a0, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__ESDHC1_DAT6                         = IOMUX_PAD(0x6b4, 0x250, 2, 0x80c, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__IPU_CSI_D_4                         = IOMUX_PAD(0x6b4, 0x250, 3, 0x940, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__USB_TOP_USBH2_DATA_6                = IOMUX_PAD(0x6b4, 0x250, 4, 0x9e4, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__GPIO2_2                             = IOMUX_PAD(0x6b4, 0x250, 5, 0x8c0, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA0__SPDIF_SPDIF_EXTCLK                  = IOMUX_PAD(0x6b4, 0x250, 6, 0x994, 3, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_DATA1__ESDHC2_DAT1                         = IOMUX_PAD(0x6b8, 0x254, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA1__UART3_TXD_MUX                       = IOMUX_PAD(0x6b8, 0x254, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA1__ESDHC1_DAT7                         = IOMUX_PAD(0x6b8, 0x254, 2, 0x810, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA1__IPU_CSI_D_5                         = IOMUX_PAD(0x6b8, 0x254, 3, 0x944, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA1__USB_TOP_USBH2_DATA_0                = IOMUX_PAD(0x6b8, 0x254, 4, 0x9cc, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA1__GPIO2_3                             = IOMUX_PAD(0x6b8, 0x254, 5, 0x8cc, 1, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_DATA2__ESDHC2_DAT2                         = IOMUX_PAD(0x6bc, 0x258, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA2__UART3_RTS                           = IOMUX_PAD(0x6bc, 0x258, 1, 0x99c, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA2__CAN1_RXCAN                          = IOMUX_PAD(0x6bc, 0x258, 2, 0x7c8, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA2__IPU_CSI_D_6                         = IOMUX_PAD(0x6bc, 0x258, 3, 0x948, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA2__USB_TOP_USBH2_DATA_1                = IOMUX_PAD(0x6bc, 0x258, 4, 0x9d0, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA2__GPIO2_4                             = IOMUX_PAD(0x6bc, 0x258, 5, 0x8d0, 1, NO_PAD_CTRL),
+
+       MX35_PAD_SD2_DATA3__ESDHC2_DAT3                         = IOMUX_PAD(0x6c0, 0x25c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA3__UART3_CTS                           = IOMUX_PAD(0x6c0, 0x25c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA3__CAN1_TXCAN                          = IOMUX_PAD(0x6c0, 0x25c, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA3__IPU_CSI_D_7                         = IOMUX_PAD(0x6c0, 0x25c, 3, 0x94c, 1, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA3__USB_TOP_USBH2_DATA_2                = IOMUX_PAD(0x6c0, 0x25c, 4, 0x9d4, 0, NO_PAD_CTRL),
+       MX35_PAD_SD2_DATA3__GPIO2_5                             = IOMUX_PAD(0x6c0, 0x25c, 5, 0x8d4, 1, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_CS0__ATA_CS0                               = IOMUX_PAD(0x6c4, 0x260, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS0__CSPI1_SS3                             = IOMUX_PAD(0x6c4, 0x260, 1, 0x7dc, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS0__IPU_DISPB_CS1                         = IOMUX_PAD(0x6c4, 0x260, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS0__GPIO2_6                               = IOMUX_PAD(0x6c4, 0x260, 5, 0x8d8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS0__IPU_DIAGB_0                           = IOMUX_PAD(0x6c4, 0x260, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS0__ARM11P_TOP_MAX1_HMASTER_0             = IOMUX_PAD(0x6c4, 0x260, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_CS1__ATA_CS1                               = IOMUX_PAD(0x6c8, 0x264, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS1__IPU_DISPB_CS2                         = IOMUX_PAD(0x6c8, 0x264, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS1__CSPI2_SS0                             = IOMUX_PAD(0x6c8, 0x264, 4, 0x7f0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS1__GPIO2_7                               = IOMUX_PAD(0x6c8, 0x264, 5, 0x8dc, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS1__IPU_DIAGB_1                           = IOMUX_PAD(0x6c8, 0x264, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_CS1__ARM11P_TOP_MAX1_HMASTER_1             = IOMUX_PAD(0x6c8, 0x264, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DIOR__ATA_DIOR                             = IOMUX_PAD(0x6cc, 0x268, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__ESDHC3_DAT0                          = IOMUX_PAD(0x6cc, 0x268, 1, 0x81c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__USB_TOP_USBOTG_DIR                   = IOMUX_PAD(0x6cc, 0x268, 2, 0x9c4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__IPU_DISPB_BE0                        = IOMUX_PAD(0x6cc, 0x268, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__CSPI2_SS1                            = IOMUX_PAD(0x6cc, 0x268, 4, 0x7f4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__GPIO2_8                              = IOMUX_PAD(0x6cc, 0x268, 5, 0x8e0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__IPU_DIAGB_2                          = IOMUX_PAD(0x6cc, 0x268, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOR__ARM11P_TOP_MAX1_HMASTER_2            = IOMUX_PAD(0x6cc, 0x268, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DIOW__ATA_DIOW                             = IOMUX_PAD(0x6d0, 0x26c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__ESDHC3_DAT1                          = IOMUX_PAD(0x6d0, 0x26c, 1, 0x820, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__USB_TOP_USBOTG_STP                   = IOMUX_PAD(0x6d0, 0x26c, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__IPU_DISPB_BE1                        = IOMUX_PAD(0x6d0, 0x26c, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__CSPI2_MOSI                           = IOMUX_PAD(0x6d0, 0x26c, 4, 0x7ec, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__GPIO2_9                              = IOMUX_PAD(0x6d0, 0x26c, 5, 0x8e4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__IPU_DIAGB_3                          = IOMUX_PAD(0x6d0, 0x26c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DIOW__ARM11P_TOP_MAX1_HMASTER_3            = IOMUX_PAD(0x6d0, 0x26c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DMACK__ATA_DMACK                           = IOMUX_PAD(0x6d4, 0x270, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__ESDHC3_DAT2                         = IOMUX_PAD(0x6d4, 0x270, 1, 0x824, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__USB_TOP_USBOTG_NXT                  = IOMUX_PAD(0x6d4, 0x270, 2, 0x9c8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__CSPI2_MISO                          = IOMUX_PAD(0x6d4, 0x270, 4, 0x7e8, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__GPIO2_10                            = IOMUX_PAD(0x6d4, 0x270, 5, 0x86c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__IPU_DIAGB_4                         = IOMUX_PAD(0x6d4, 0x270, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMACK__ARM11P_TOP_MAX0_HMASTER_0           = IOMUX_PAD(0x6d4, 0x270, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_RESET_B__ATA_RESET_B                       = IOMUX_PAD(0x6d8, 0x274, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__ESDHC3_DAT3                       = IOMUX_PAD(0x6d8, 0x274, 1, 0x828, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__USB_TOP_USBOTG_DATA_0             = IOMUX_PAD(0x6d8, 0x274, 2, 0x9a4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__IPU_DISPB_SD_D_O                  = IOMUX_PAD(0x6d8, 0x274, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__CSPI2_RDY                         = IOMUX_PAD(0x6d8, 0x274, 4, 0x7e4, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__GPIO2_11                          = IOMUX_PAD(0x6d8, 0x274, 5, 0x870, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__IPU_DIAGB_5                       = IOMUX_PAD(0x6d8, 0x274, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_RESET_B__ARM11P_TOP_MAX0_HMASTER_1         = IOMUX_PAD(0x6d8, 0x274, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_IORDY__ATA_IORDY                           = IOMUX_PAD(0x6dc, 0x278, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__ESDHC3_DAT4                         = IOMUX_PAD(0x6dc, 0x278, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__USB_TOP_USBOTG_DATA_1               = IOMUX_PAD(0x6dc, 0x278, 2, 0x9a8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__IPU_DISPB_SD_D_IO                   = IOMUX_PAD(0x6dc, 0x278, 3, 0x92c, 3, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__ESDHC2_DAT4                         = IOMUX_PAD(0x6dc, 0x278, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__GPIO2_12                            = IOMUX_PAD(0x6dc, 0x278, 5, 0x874, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__IPU_DIAGB_6                         = IOMUX_PAD(0x6dc, 0x278, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_IORDY__ARM11P_TOP_MAX0_HMASTER_2           = IOMUX_PAD(0x6dc, 0x278, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA0__ATA_DATA_0                          = IOMUX_PAD(0x6e0, 0x27c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__ESDHC3_DAT5                         = IOMUX_PAD(0x6e0, 0x27c, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__USB_TOP_USBOTG_DATA_2               = IOMUX_PAD(0x6e0, 0x27c, 2, 0x9ac, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__IPU_DISPB_D12_VSYNC                 = IOMUX_PAD(0x6e0, 0x27c, 3, 0x928, 4, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__ESDHC2_DAT5                         = IOMUX_PAD(0x6e0, 0x27c, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__GPIO2_13                            = IOMUX_PAD(0x6e0, 0x27c, 5, 0x878, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__IPU_DIAGB_7                         = IOMUX_PAD(0x6e0, 0x27c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA0__ARM11P_TOP_MAX0_HMASTER_3           = IOMUX_PAD(0x6e0, 0x27c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA1__ATA_DATA_1                          = IOMUX_PAD(0x6e4, 0x280, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__ESDHC3_DAT6                         = IOMUX_PAD(0x6e4, 0x280, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__USB_TOP_USBOTG_DATA_3               = IOMUX_PAD(0x6e4, 0x280, 2, 0x9b0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__IPU_DISPB_SD_CLK                    = IOMUX_PAD(0x6e4, 0x280, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__ESDHC2_DAT6                         = IOMUX_PAD(0x6e4, 0x280, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__GPIO2_14                            = IOMUX_PAD(0x6e4, 0x280, 5, 0x87c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__IPU_DIAGB_8                         = IOMUX_PAD(0x6e4, 0x280, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA1__ARM11P_TOP_TRACE_27                 = IOMUX_PAD(0x6e4, 0x280, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA2__ATA_DATA_2                          = IOMUX_PAD(0x6e8, 0x284, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__ESDHC3_DAT7                         = IOMUX_PAD(0x6e8, 0x284, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__USB_TOP_USBOTG_DATA_4               = IOMUX_PAD(0x6e8, 0x284, 2, 0x9b4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__IPU_DISPB_SER_RS                    = IOMUX_PAD(0x6e8, 0x284, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__ESDHC2_DAT7                         = IOMUX_PAD(0x6e8, 0x284, 4, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__GPIO2_15                            = IOMUX_PAD(0x6e8, 0x284, 5, 0x880, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__IPU_DIAGB_9                         = IOMUX_PAD(0x6e8, 0x284, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA2__ARM11P_TOP_TRACE_28                 = IOMUX_PAD(0x6e8, 0x284, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA3__ATA_DATA_3                          = IOMUX_PAD(0x6ec, 0x288, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__ESDHC3_CLK                          = IOMUX_PAD(0x6ec, 0x288, 1, 0x814, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__USB_TOP_USBOTG_DATA_5               = IOMUX_PAD(0x6ec, 0x288, 2, 0x9b8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__CSPI2_SCLK                          = IOMUX_PAD(0x6ec, 0x288, 4, 0x7e0, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__GPIO2_16                            = IOMUX_PAD(0x6ec, 0x288, 5, 0x884, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__IPU_DIAGB_10                        = IOMUX_PAD(0x6ec, 0x288, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA3__ARM11P_TOP_TRACE_29                 = IOMUX_PAD(0x6ec, 0x288, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA4__ATA_DATA_4                          = IOMUX_PAD(0x6f0, 0x28c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA4__ESDHC3_CMD                          = IOMUX_PAD(0x6f0, 0x28c, 1, 0x818, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA4__USB_TOP_USBOTG_DATA_6               = IOMUX_PAD(0x6f0, 0x28c, 2, 0x9bc, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA4__GPIO2_17                            = IOMUX_PAD(0x6f0, 0x28c, 5, 0x888, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA4__IPU_DIAGB_11                        = IOMUX_PAD(0x6f0, 0x28c, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA4__ARM11P_TOP_TRACE_30                 = IOMUX_PAD(0x6f0, 0x28c, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA5__ATA_DATA_5                          = IOMUX_PAD(0x6f4, 0x290, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA5__USB_TOP_USBOTG_DATA_7               = IOMUX_PAD(0x6f4, 0x290, 2, 0x9c0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA5__GPIO2_18                            = IOMUX_PAD(0x6f4, 0x290, 5, 0x88c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA5__IPU_DIAGB_12                        = IOMUX_PAD(0x6f4, 0x290, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA5__ARM11P_TOP_TRACE_31                 = IOMUX_PAD(0x6f4, 0x290, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA6__ATA_DATA_6                          = IOMUX_PAD(0x6f8, 0x294, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA6__CAN1_TXCAN                          = IOMUX_PAD(0x6f8, 0x294, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA6__UART1_DTR                           = IOMUX_PAD(0x6f8, 0x294, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA6__AUDMUX_AUD6_TXD                     = IOMUX_PAD(0x6f8, 0x294, 3, 0x7b4, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA6__GPIO2_19                            = IOMUX_PAD(0x6f8, 0x294, 5, 0x890, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA6__IPU_DIAGB_13                        = IOMUX_PAD(0x6f8, 0x294, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA7__ATA_DATA_7                          = IOMUX_PAD(0x6fc, 0x298, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA7__CAN1_RXCAN                          = IOMUX_PAD(0x6fc, 0x298, 1, 0x7c8, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA7__UART1_DSR                           = IOMUX_PAD(0x6fc, 0x298, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA7__AUDMUX_AUD6_RXD                     = IOMUX_PAD(0x6fc, 0x298, 3, 0x7b0, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA7__GPIO2_20                            = IOMUX_PAD(0x6fc, 0x298, 5, 0x898, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA7__IPU_DIAGB_14                        = IOMUX_PAD(0x6fc, 0x298, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA8__ATA_DATA_8                          = IOMUX_PAD(0x700, 0x29c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA8__UART3_RTS                           = IOMUX_PAD(0x700, 0x29c, 1, 0x99c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA8__UART1_RI                            = IOMUX_PAD(0x700, 0x29c, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA8__AUDMUX_AUD6_TXC                     = IOMUX_PAD(0x700, 0x29c, 3, 0x7c0, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA8__GPIO2_21                            = IOMUX_PAD(0x700, 0x29c, 5, 0x89c, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA8__IPU_DIAGB_15                        = IOMUX_PAD(0x700, 0x29c, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA9__ATA_DATA_9                          = IOMUX_PAD(0x704, 0x2a0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA9__UART3_CTS                           = IOMUX_PAD(0x704, 0x2a0, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA9__UART1_DCD                           = IOMUX_PAD(0x704, 0x2a0, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA9__AUDMUX_AUD6_TXFS                    = IOMUX_PAD(0x704, 0x2a0, 3, 0x7c4, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA9__GPIO2_22                            = IOMUX_PAD(0x704, 0x2a0, 5, 0x8a0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA9__IPU_DIAGB_16                        = IOMUX_PAD(0x704, 0x2a0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA10__ATA_DATA_10                        = IOMUX_PAD(0x708, 0x2a4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA10__UART3_RXD_MUX                      = IOMUX_PAD(0x708, 0x2a4, 1, 0x9a0, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA10__AUDMUX_AUD6_RXC                    = IOMUX_PAD(0x708, 0x2a4, 3, 0x7b8, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA10__GPIO2_23                           = IOMUX_PAD(0x708, 0x2a4, 5, 0x8a4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA10__IPU_DIAGB_17                       = IOMUX_PAD(0x708, 0x2a4, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA11__ATA_DATA_11                        = IOMUX_PAD(0x70c, 0x2a8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA11__UART3_TXD_MUX                      = IOMUX_PAD(0x70c, 0x2a8, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA11__AUDMUX_AUD6_RXFS                   = IOMUX_PAD(0x70c, 0x2a8, 3, 0x7bc, 0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA11__GPIO2_24                           = IOMUX_PAD(0x70c, 0x2a8, 5, 0x8a8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA11__IPU_DIAGB_18                       = IOMUX_PAD(0x70c, 0x2a8, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA12__ATA_DATA_12                        = IOMUX_PAD(0x710, 0x2ac, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA12__I2C3_SCL                           = IOMUX_PAD(0x710, 0x2ac, 1, 0x91c, 3, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA12__GPIO2_25                           = IOMUX_PAD(0x710, 0x2ac, 5, 0x8ac, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA12__IPU_DIAGB_19                       = IOMUX_PAD(0x710, 0x2ac, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA13__ATA_DATA_13                        = IOMUX_PAD(0x714, 0x2b0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA13__I2C3_SDA                           = IOMUX_PAD(0x714, 0x2b0, 1, 0x920, 3, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA13__GPIO2_26                           = IOMUX_PAD(0x714, 0x2b0, 5, 0x8b0, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA13__IPU_DIAGB_20                       = IOMUX_PAD(0x714, 0x2b0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA14__ATA_DATA_14                        = IOMUX_PAD(0x718, 0x2b4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA14__IPU_CSI_D_0                        = IOMUX_PAD(0x718, 0x2b4, 1, 0x930, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA14__KPP_ROW_0                          = IOMUX_PAD(0x718, 0x2b4, 3, 0x970, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA14__GPIO2_27                           = IOMUX_PAD(0x718, 0x2b4, 5, 0x8b4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA14__IPU_DIAGB_21                       = IOMUX_PAD(0x718, 0x2b4, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DATA15__ATA_DATA_15                        = IOMUX_PAD(0x71c, 0x2b8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA15__IPU_CSI_D_1                        = IOMUX_PAD(0x71c, 0x2b8, 1, 0x934, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA15__KPP_ROW_1                          = IOMUX_PAD(0x71c, 0x2b8, 3, 0x974, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA15__GPIO2_28                           = IOMUX_PAD(0x71c, 0x2b8, 5, 0x8b8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DATA15__IPU_DIAGB_22                       = IOMUX_PAD(0x71c, 0x2b8, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_INTRQ__ATA_INTRQ                           = IOMUX_PAD(0x720, 0x2bc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_INTRQ__IPU_CSI_D_2                         = IOMUX_PAD(0x720, 0x2bc, 1, 0x938, 3, NO_PAD_CTRL),
+       MX35_PAD_ATA_INTRQ__KPP_ROW_2                           = IOMUX_PAD(0x720, 0x2bc, 3, 0x978, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_INTRQ__GPIO2_29                            = IOMUX_PAD(0x720, 0x2bc, 5, 0x8bc, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_INTRQ__IPU_DIAGB_23                        = IOMUX_PAD(0x720, 0x2bc, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_BUFF_EN__ATA_BUFFER_EN                     = IOMUX_PAD(0x724, 0x2c0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_BUFF_EN__IPU_CSI_D_3                       = IOMUX_PAD(0x724, 0x2c0, 1, 0x93c, 3, NO_PAD_CTRL),
+       MX35_PAD_ATA_BUFF_EN__KPP_ROW_3                         = IOMUX_PAD(0x724, 0x2c0, 3, 0x97c, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_BUFF_EN__GPIO2_30                          = IOMUX_PAD(0x724, 0x2c0, 5, 0x8c4, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_BUFF_EN__IPU_DIAGB_24                      = IOMUX_PAD(0x724, 0x2c0, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DMARQ__ATA_DMARQ                           = IOMUX_PAD(0x728, 0x2c4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMARQ__IPU_CSI_D_4                         = IOMUX_PAD(0x728, 0x2c4, 1, 0x940, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMARQ__KPP_COL_0                           = IOMUX_PAD(0x728, 0x2c4, 3, 0x950, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMARQ__GPIO2_31                            = IOMUX_PAD(0x728, 0x2c4, 5, 0x8c8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMARQ__IPU_DIAGB_25                        = IOMUX_PAD(0x728, 0x2c4, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DMARQ__ECT_CTI_TRIG_IN1_4                  = IOMUX_PAD(0x728, 0x2c4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DA0__ATA_DA_0                              = IOMUX_PAD(0x72c, 0x2c8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA0__IPU_CSI_D_5                           = IOMUX_PAD(0x72c, 0x2c8, 1, 0x944, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA0__KPP_COL_1                             = IOMUX_PAD(0x72c, 0x2c8, 3, 0x954, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA0__GPIO3_0                               = IOMUX_PAD(0x72c, 0x2c8, 5, 0x8e8, 1, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA0__IPU_DIAGB_26                          = IOMUX_PAD(0x72c, 0x2c8, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA0__ECT_CTI_TRIG_IN1_5                    = IOMUX_PAD(0x72c, 0x2c8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DA1__ATA_DA_1                              = IOMUX_PAD(0x730, 0x2cc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA1__IPU_CSI_D_6                           = IOMUX_PAD(0x730, 0x2cc, 1, 0x948, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA1__KPP_COL_2                             = IOMUX_PAD(0x730, 0x2cc, 3, 0x958, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA1__GPIO3_1                               = IOMUX_PAD(0x730, 0x2cc, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA1__IPU_DIAGB_27                          = IOMUX_PAD(0x730, 0x2cc, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA1__ECT_CTI_TRIG_IN1_6                    = IOMUX_PAD(0x730, 0x2cc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_ATA_DA2__ATA_DA_2                              = IOMUX_PAD(0x734, 0x2d0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA2__IPU_CSI_D_7                           = IOMUX_PAD(0x734, 0x2d0, 1, 0x94c, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA2__KPP_COL_3                             = IOMUX_PAD(0x734, 0x2d0, 3, 0x95c, 2, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA2__GPIO3_2                               = IOMUX_PAD(0x734, 0x2d0, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA2__IPU_DIAGB_28                          = IOMUX_PAD(0x734, 0x2d0, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_ATA_DA2__ECT_CTI_TRIG_IN1_7                    = IOMUX_PAD(0x734, 0x2d0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_MLB_CLK__MLB_MLBCLK                            = IOMUX_PAD(0x738, 0x2d4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_MLB_CLK__GPIO3_3                               = IOMUX_PAD(0x738, 0x2d4, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_MLB_DAT__MLB_MLBDAT                            = IOMUX_PAD(0x73c, 0x2d8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_MLB_DAT__GPIO3_4                               = IOMUX_PAD(0x73c, 0x2d8, 5, 0x904, 1, NO_PAD_CTRL),
+
+       MX35_PAD_MLB_SIG__MLB_MLBSIG                            = IOMUX_PAD(0x740, 0x2dc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_MLB_SIG__GPIO3_5                               = IOMUX_PAD(0x740, 0x2dc, 5, 0x908, 1, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TX_CLK__FEC_TX_CLK                         = IOMUX_PAD(0x744, 0x2e0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__ESDHC1_DAT4                        = IOMUX_PAD(0x744, 0x2e0, 1, 0x804, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__UART3_RXD_MUX                      = IOMUX_PAD(0x744, 0x2e0, 2, 0x9a0, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__USB_TOP_USBH2_DIR                  = IOMUX_PAD(0x744, 0x2e0, 3, 0x9ec, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__CSPI2_MOSI                         = IOMUX_PAD(0x744, 0x2e0, 4, 0x7ec, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__GPIO3_6                            = IOMUX_PAD(0x744, 0x2e0, 5, 0x90c, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__IPU_DISPB_D12_VSYNC                = IOMUX_PAD(0x744, 0x2e0, 6, 0x928, 5, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_CLK__ARM11P_TOP_EVNTBUS_0               = IOMUX_PAD(0x744, 0x2e0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RX_CLK__FEC_RX_CLK                         = IOMUX_PAD(0x748, 0x2e4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__ESDHC1_DAT5                        = IOMUX_PAD(0x748, 0x2e4, 1, 0x808, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__UART3_TXD_MUX                      = IOMUX_PAD(0x748, 0x2e4, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__USB_TOP_USBH2_STP                  = IOMUX_PAD(0x748, 0x2e4, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__CSPI2_MISO                         = IOMUX_PAD(0x748, 0x2e4, 4, 0x7e8, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__GPIO3_7                            = IOMUX_PAD(0x748, 0x2e4, 5, 0x910, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__IPU_DISPB_SD_D_I                   = IOMUX_PAD(0x748, 0x2e4, 6, 0x92c, 4, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_CLK__ARM11P_TOP_EVNTBUS_1               = IOMUX_PAD(0x748, 0x2e4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RX_DV__FEC_RX_DV                           = IOMUX_PAD(0x74c, 0x2e8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__ESDHC1_DAT6                         = IOMUX_PAD(0x74c, 0x2e8, 1, 0x80c, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__UART3_RTS                           = IOMUX_PAD(0x74c, 0x2e8, 2, 0x99c, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__USB_TOP_USBH2_NXT                   = IOMUX_PAD(0x74c, 0x2e8, 3, 0x9f0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__CSPI2_SCLK                          = IOMUX_PAD(0x74c, 0x2e8, 4, 0x7e0, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__GPIO3_8                             = IOMUX_PAD(0x74c, 0x2e8, 5, 0x914, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__IPU_DISPB_SD_CLK                    = IOMUX_PAD(0x74c, 0x2e8, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_DV__ARM11P_TOP_EVNTBUS_2                = IOMUX_PAD(0x74c, 0x2e8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_COL__FEC_COL                               = IOMUX_PAD(0x750, 0x2ec, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__ESDHC1_DAT7                           = IOMUX_PAD(0x750, 0x2ec, 1, 0x810, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__UART3_CTS                             = IOMUX_PAD(0x750, 0x2ec, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__USB_TOP_USBH2_DATA_0                  = IOMUX_PAD(0x750, 0x2ec, 3, 0x9cc, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__CSPI2_RDY                             = IOMUX_PAD(0x750, 0x2ec, 4, 0x7e4, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__GPIO3_9                               = IOMUX_PAD(0x750, 0x2ec, 5, 0x918, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__IPU_DISPB_SER_RS                      = IOMUX_PAD(0x750, 0x2ec, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_COL__ARM11P_TOP_EVNTBUS_3                  = IOMUX_PAD(0x750, 0x2ec, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RDATA0__FEC_RDATA_0                        = IOMUX_PAD(0x754, 0x2f0, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__PWM_PWMO                           = IOMUX_PAD(0x754, 0x2f0, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__UART3_DTR                          = IOMUX_PAD(0x754, 0x2f0, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__USB_TOP_USBH2_DATA_1               = IOMUX_PAD(0x754, 0x2f0, 3, 0x9d0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__CSPI2_SS0                          = IOMUX_PAD(0x754, 0x2f0, 4, 0x7f0, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__GPIO3_10                           = IOMUX_PAD(0x754, 0x2f0, 5, 0x8ec, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__IPU_DISPB_CS1                      = IOMUX_PAD(0x754, 0x2f0, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA0__ARM11P_TOP_EVNTBUS_4               = IOMUX_PAD(0x754, 0x2f0, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TDATA0__FEC_TDATA_0                        = IOMUX_PAD(0x758, 0x2f4, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__SPDIF_SPDIF_OUT1                   = IOMUX_PAD(0x758, 0x2f4, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__UART3_DSR                          = IOMUX_PAD(0x758, 0x2f4, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__USB_TOP_USBH2_DATA_2               = IOMUX_PAD(0x758, 0x2f4, 3, 0x9d4, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__CSPI2_SS1                          = IOMUX_PAD(0x758, 0x2f4, 4, 0x7f4, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__GPIO3_11                           = IOMUX_PAD(0x758, 0x2f4, 5, 0x8f0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__IPU_DISPB_CS0                      = IOMUX_PAD(0x758, 0x2f4, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA0__ARM11P_TOP_EVNTBUS_5               = IOMUX_PAD(0x758, 0x2f4, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TX_EN__FEC_TX_EN                           = IOMUX_PAD(0x75c, 0x2f8, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__SPDIF_SPDIF_IN1                     = IOMUX_PAD(0x75c, 0x2f8, 1, 0x998, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__UART3_RI                            = IOMUX_PAD(0x75c, 0x2f8, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__USB_TOP_USBH2_DATA_3                = IOMUX_PAD(0x75c, 0x2f8, 3, 0x9d8, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__GPIO3_12                            = IOMUX_PAD(0x75c, 0x2f8, 5, 0x8f4, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__IPU_DISPB_PAR_RS                    = IOMUX_PAD(0x75c, 0x2f8, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_EN__ARM11P_TOP_EVNTBUS_6                = IOMUX_PAD(0x75c, 0x2f8, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_MDC__FEC_MDC                               = IOMUX_PAD(0x760, 0x2fc, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__CAN2_TXCAN                            = IOMUX_PAD(0x760, 0x2fc, 1, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__UART3_DCD                             = IOMUX_PAD(0x760, 0x2fc, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__USB_TOP_USBH2_DATA_4                  = IOMUX_PAD(0x760, 0x2fc, 3, 0x9dc, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__GPIO3_13                              = IOMUX_PAD(0x760, 0x2fc, 5, 0x8f8, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__IPU_DISPB_WR                          = IOMUX_PAD(0x760, 0x2fc, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDC__ARM11P_TOP_EVNTBUS_7                  = IOMUX_PAD(0x760, 0x2fc, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_MDIO__FEC_MDIO                             = IOMUX_PAD(0x764, 0x300, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDIO__CAN2_RXCAN                           = IOMUX_PAD(0x764, 0x300, 1, 0x7cc, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDIO__USB_TOP_USBH2_DATA_5                 = IOMUX_PAD(0x764, 0x300, 3, 0x9e0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDIO__GPIO3_14                             = IOMUX_PAD(0x764, 0x300, 5, 0x8fc, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDIO__IPU_DISPB_RD                         = IOMUX_PAD(0x764, 0x300, 6, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_MDIO__ARM11P_TOP_EVNTBUS_8                 = IOMUX_PAD(0x764, 0x300, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TX_ERR__FEC_TX_ERR                         = IOMUX_PAD(0x768, 0x304, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__OWIRE_LINE                         = IOMUX_PAD(0x768, 0x304, 1, 0x990, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__SPDIF_SPDIF_EXTCLK                 = IOMUX_PAD(0x768, 0x304, 2, 0x994, 4, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__USB_TOP_USBH2_DATA_6               = IOMUX_PAD(0x768, 0x304, 3, 0x9e4, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__GPIO3_15                           = IOMUX_PAD(0x768, 0x304, 5, 0x900, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__IPU_DISPB_D0_VSYNC                 = IOMUX_PAD(0x768, 0x304, 6, 0x924, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TX_ERR__ARM11P_TOP_EVNTBUS_9               = IOMUX_PAD(0x768, 0x304, 7, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RX_ERR__FEC_RX_ERR                         = IOMUX_PAD(0x76c, 0x308, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_ERR__IPU_CSI_D_0                        = IOMUX_PAD(0x76c, 0x308, 1, 0x930, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_ERR__USB_TOP_USBH2_DATA_7               = IOMUX_PAD(0x76c, 0x308, 3, 0x9e8, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_ERR__KPP_COL_4                          = IOMUX_PAD(0x76c, 0x308, 4, 0x960, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_ERR__GPIO3_16                           = IOMUX_PAD(0x76c, 0x308, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RX_ERR__IPU_DISPB_SD_D_IO                  = IOMUX_PAD(0x76c, 0x308, 6, 0x92c, 5, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_CRS__FEC_CRS                               = IOMUX_PAD(0x770, 0x30c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_CRS__IPU_CSI_D_1                           = IOMUX_PAD(0x770, 0x30c, 1, 0x934, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_CRS__USB_TOP_USBH2_PWR                     = IOMUX_PAD(0x770, 0x30c, 3, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_CRS__KPP_COL_5                             = IOMUX_PAD(0x770, 0x30c, 4, 0x964, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_CRS__GPIO3_17                              = IOMUX_PAD(0x770, 0x30c, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_CRS__IPU_FLASH_STROBE                      = IOMUX_PAD(0x770, 0x30c, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RDATA1__FEC_RDATA_1                        = IOMUX_PAD(0x774, 0x310, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__IPU_CSI_D_2                        = IOMUX_PAD(0x774, 0x310, 1, 0x938, 4, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__AUDMUX_AUD6_RXC                    = IOMUX_PAD(0x774, 0x310, 2, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__USB_TOP_USBH2_OC                   = IOMUX_PAD(0x774, 0x310, 3, 0x9f4, 2, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__KPP_COL_6                          = IOMUX_PAD(0x774, 0x310, 4, 0x968, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__GPIO3_18                           = IOMUX_PAD(0x774, 0x310, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA1__IPU_DISPB_BE0                      = IOMUX_PAD(0x774, 0x310, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TDATA1__FEC_TDATA_1                        = IOMUX_PAD(0x778, 0x314, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA1__IPU_CSI_D_3                        = IOMUX_PAD(0x778, 0x314, 1, 0x93c, 4, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA1__AUDMUX_AUD6_RXFS                   = IOMUX_PAD(0x778, 0x314, 2, 0x7bc, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA1__KPP_COL_7                          = IOMUX_PAD(0x778, 0x314, 4, 0x96c, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA1__GPIO3_19                           = IOMUX_PAD(0x778, 0x314, 5, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA1__IPU_DISPB_BE1                      = IOMUX_PAD(0x778, 0x314, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RDATA2__FEC_RDATA_2                        = IOMUX_PAD(0x77c, 0x318, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA2__IPU_CSI_D_4                        = IOMUX_PAD(0x77c, 0x318, 1, 0x940, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA2__AUDMUX_AUD6_TXD                    = IOMUX_PAD(0x77c, 0x318, 2, 0x7b4, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA2__KPP_ROW_4                          = IOMUX_PAD(0x77c, 0x318, 4, 0x980, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA2__GPIO3_20                           = IOMUX_PAD(0x77c, 0x318, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TDATA2__FEC_TDATA_2                        = IOMUX_PAD(0x780, 0x31c, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA2__IPU_CSI_D_5                        = IOMUX_PAD(0x780, 0x31c, 1, 0x944, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA2__AUDMUX_AUD6_RXD                    = IOMUX_PAD(0x780, 0x31c, 2, 0x7b0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA2__KPP_ROW_5                          = IOMUX_PAD(0x780, 0x31c, 4, 0x984, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA2__GPIO3_21                           = IOMUX_PAD(0x780, 0x31c, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_RDATA3__FEC_RDATA_3                        = IOMUX_PAD(0x784, 0x320, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA3__IPU_CSI_D_6                        = IOMUX_PAD(0x784, 0x320, 1, 0x948, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA3__AUDMUX_AUD6_TXC                    = IOMUX_PAD(0x784, 0x320, 2, 0x7c0, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA3__KPP_ROW_6                          = IOMUX_PAD(0x784, 0x320, 4, 0x988, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_RDATA3__GPIO3_22                           = IOMUX_PAD(0x784, 0x320, 6, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_FEC_TDATA3__FEC_TDATA_3                        = IOMUX_PAD(0x788, 0x324, 0, 0x0,   0, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA3__IPU_CSI_D_7                        = IOMUX_PAD(0x788, 0x324, 1, 0x94c, 3, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA3__AUDMUX_AUD6_TXFS                   = IOMUX_PAD(0x788, 0x324, 2, 0x7c4, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA3__KPP_ROW_7                          = IOMUX_PAD(0x788, 0x324, 4, 0x98c, 1, NO_PAD_CTRL),
+       MX35_PAD_FEC_TDATA3__GPIO3_23                           = IOMUX_PAD(0x788, 0x324, 5, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_EXT_ARMCLK__CCM_EXT_ARMCLK                     = IOMUX_PAD(0x78c, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+
+       MX35_PAD_TEST_MODE__TCU_TEST_MODE                       = IOMUX_PAD(0x790, 0x0,   0, 0x0,   0, NO_PAD_CTRL),
+};
+
+#endif /* __IOMUX_MX35_H__ */
diff --git a/arch/arm/include/asm/arch-mx35/iomux.h b/arch/arm/include/asm/arch-mx35/iomux.h
deleted file mode 100644 (file)
index 52c15bc..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * (C) Copyright 2011
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * 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 __MACH_MX35_IOMUX_H__
-#define __MACH_MX35_IOMUX_H__
-
-#include <asm/arch/imx-regs.h>
-
-/*
- * various IOMUX functions
- */
-typedef enum iomux_pin_config {
-       MUX_CONFIG_FUNC = 0,    /* used as function */
-       MUX_CONFIG_ALT1,        /* used as alternate function 1 */
-       MUX_CONFIG_ALT2,        /* used as alternate function 2 */
-       MUX_CONFIG_ALT3,        /* used as alternate function 3 */
-       MUX_CONFIG_ALT4,        /* used as alternate function 4 */
-       MUX_CONFIG_ALT5,        /* used as alternate function 5 */
-       MUX_CONFIG_ALT6,        /* used as alternate function 6 */
-       MUX_CONFIG_ALT7,        /* used as alternate function 7 */
-       MUX_CONFIG_SION = 0x1 << 4,     /* used as LOOPBACK:MUX SION bit */
-       MUX_CONFIG_GPIO = MUX_CONFIG_ALT5,      /* used as GPIO */
-} iomux_pin_cfg_t;
-
-/*
- * various IOMUX pad functions
- */
-typedef enum iomux_pad_config {
-       PAD_CTL_DRV_3_3V = 0x0 << 13,
-       PAD_CTL_DRV_1_8V = 0x1 << 13,
-       PAD_CTL_HYS_CMOS = 0x0 << 8,
-       PAD_CTL_HYS_SCHMITZ = 0x1 << 8,
-       PAD_CTL_PKE_NONE = 0x0 << 7,
-       PAD_CTL_PKE_ENABLE = 0x1 << 7,
-       PAD_CTL_PUE_KEEPER = 0x0 << 6,
-       PAD_CTL_PUE_PUD = 0x1 << 6,
-       PAD_CTL_100K_PD = 0x0 << 4,
-       PAD_CTL_47K_PU = 0x1 << 4,
-       PAD_CTL_100K_PU = 0x2 << 4,
-       PAD_CTL_22K_PU = 0x3 << 4,
-       PAD_CTL_ODE_CMOS = 0x0 << 3,
-       PAD_CTL_ODE_OpenDrain = 0x1 << 3,
-       PAD_CTL_DRV_NORMAL = 0x0 << 1,
-       PAD_CTL_DRV_HIGH = 0x1 << 1,
-       PAD_CTL_DRV_MAX = 0x2 << 1,
-       PAD_CTL_SRE_SLOW = 0x0 << 0,
-       PAD_CTL_SRE_FAST = 0x1 << 0
-} iomux_pad_config_t;
-
-/*
- * various IOMUX general purpose functions
- */
-typedef enum iomux_gp_func {
-       MUX_SDCTL_CSD0_SEL = 0x1 << 0,
-       MUX_SDCTL_CSD1_SEL = 0x1 << 1,
-       MUX_TAMPER_DETECT_EN = 0x1 << 2,
-} iomux_gp_func_t;
-
-/*
- * various IOMUX input select register index
- */
-typedef enum iomux_input_select {
-       MUX_IN_AMX_P5_RXCLK = 0,
-       MUX_IN_AMX_P5_RXFS,
-       MUX_IN_AMX_P6_DA,
-       MUX_IN_AMX_P6_DB,
-       MUX_IN_AMX_P6_RXCLK,
-       MUX_IN_AMX_P6_RXFS,
-       MUX_IN_AMX_P6_TXCLK,
-       MUX_IN_AMX_P6_TXFS,
-       MUX_IN_CAN1_CANRX,
-       MUX_IN_CAN2_CANRX,
-       MUX_IN_CCM_32K_MUXED,
-       MUX_IN_CCM_PMIC_RDY,
-       MUX_IN_CSPI1_SS2_B,
-       MUX_IN_CSPI1_SS3_B,
-       MUX_IN_CSPI2_CLK_IN,
-       MUX_IN_CSPI2_DATAREADY_B,
-       MUX_IN_CSPI2_MISO,
-       MUX_IN_CSPI2_MOSI,
-       MUX_IN_CSPI2_SS0_B,
-       MUX_IN_CSPI2_SS1_B,
-       MUX_IN_CSPI2_SS2_B,
-       MUX_IN_CSPI2_SS3_B,
-       MUX_IN_EMI_WEIM_DTACK_B,
-       MUX_IN_ESDHC1_DAT4_IN,
-       MUX_IN_ESDHC1_DAT5_IN,
-       MUX_IN_ESDHC1_DAT6_IN,
-       MUX_IN_ESDHC1_DAT7_IN,
-       MUX_IN_ESDHC3_CARD_CLK_IN,
-       MUX_IN_ESDHC3_CMD_IN,
-       MUX_IN_ESDHC3_DAT0,
-       MUX_IN_ESDHC3_DAT1,
-       MUX_IN_ESDHC3_DAT2,
-       MUX_IN_ESDHC3_DAT3,
-       MUX_IN_GPIO1_IN_0,
-       MUX_IN_GPIO1_IN_10,
-       MUX_IN_GPIO1_IN_11,
-       MUX_IN_GPIO1_IN_1,
-       MUX_IN_GPIO1_IN_20,
-       MUX_IN_GPIO1_IN_21,
-       MUX_IN_GPIO1_IN_22,
-       MUX_IN_GPIO1_IN_2,
-       MUX_IN_GPIO1_IN_3,
-       MUX_IN_GPIO1_IN_4,
-       MUX_IN_GPIO1_IN_5,
-       MUX_IN_GPIO1_IN_6,
-       MUX_IN_GPIO1_IN_7,
-       MUX_IN_GPIO1_IN_8,
-       MUX_IN_GPIO1_IN_9,
-       MUX_IN_GPIO2_IN_0,
-       MUX_IN_GPIO2_IN_10,
-       MUX_IN_GPIO2_IN_11,
-       MUX_IN_GPIO2_IN_12,
-       MUX_IN_GPIO2_IN_13,
-       MUX_IN_GPIO2_IN_14,
-       MUX_IN_GPIO2_IN_15,
-       MUX_IN_GPIO2_IN_16,
-       MUX_IN_GPIO2_IN_17,
-       MUX_IN_GPIO2_IN_18,
-       MUX_IN_GPIO2_IN_19,
-       MUX_IN_GPIO2_IN_20,
-       MUX_IN_GPIO2_IN_21,
-       MUX_IN_GPIO2_IN_22,
-       MUX_IN_GPIO2_IN_23,
-       MUX_IN_GPIO2_IN_24,
-       MUX_IN_GPIO2_IN_25,
-       MUX_IN_GPIO2_IN_26,
-       MUX_IN_GPIO2_IN_27,
-       MUX_IN_GPIO2_IN_28,
-       MUX_IN_GPIO2_IN_29,
-       MUX_IN_GPIO2_IN_2,
-       MUX_IN_GPIO2_IN_30,
-       MUX_IN_GPIO2_IN_31,
-       MUX_IN_GPIO2_IN_3,
-       MUX_IN_GPIO2_IN_4,
-       MUX_IN_GPIO2_IN_5,
-       MUX_IN_GPIO2_IN_6,
-       MUX_IN_GPIO2_IN_7,
-       MUX_IN_GPIO2_IN_8,
-       MUX_IN_GPIO2_IN_9,
-       MUX_IN_GPIO3_IN_0,
-       MUX_IN_GPIO3_IN_10,
-       MUX_IN_GPIO3_IN_11,
-       MUX_IN_GPIO3_IN_12,
-       MUX_IN_GPIO3_IN_13,
-       MUX_IN_GPIO3_IN_14,
-       MUX_IN_GPIO3_IN_15,
-       MUX_IN_GPIO3_IN_4,
-       MUX_IN_GPIO3_IN_5,
-       MUX_IN_GPIO3_IN_6,
-       MUX_IN_GPIO3_IN_7,
-       MUX_IN_GPIO3_IN_8,
-       MUX_IN_GPIO3_IN_9,
-       MUX_IN_I2C3_SCL_IN,
-       MUX_IN_I2C3_SDA_IN,
-       MUX_IN_IPU_DISPB_D0_VSYNC,
-       MUX_IN_IPU_DISPB_D12_VSYNC,
-       MUX_IN_IPU_DISPB_SD_D,
-       MUX_IN_IPU_SENSB_DATA_0,
-       MUX_IN_IPU_SENSB_DATA_1,
-       MUX_IN_IPU_SENSB_DATA_2,
-       MUX_IN_IPU_SENSB_DATA_3,
-       MUX_IN_IPU_SENSB_DATA_4,
-       MUX_IN_IPU_SENSB_DATA_5,
-       MUX_IN_IPU_SENSB_DATA_6,
-       MUX_IN_IPU_SENSB_DATA_7,
-       MUX_IN_KPP_COL_0,
-       MUX_IN_KPP_COL_1,
-       MUX_IN_KPP_COL_2,
-       MUX_IN_KPP_COL_3,
-       MUX_IN_KPP_COL_4,
-       MUX_IN_KPP_COL_5,
-       MUX_IN_KPP_COL_6,
-       MUX_IN_KPP_COL_7,
-       MUX_IN_KPP_ROW_0,
-       MUX_IN_KPP_ROW_1,
-       MUX_IN_KPP_ROW_2,
-       MUX_IN_KPP_ROW_3,
-       MUX_IN_KPP_ROW_4,
-       MUX_IN_KPP_ROW_5,
-       MUX_IN_KPP_ROW_6,
-       MUX_IN_KPP_ROW_7,
-       MUX_IN_OWIRE_BATTERY_LINE,
-       MUX_IN_SPDIF_HCKT_CLK2,
-       MUX_IN_SPDIF_SPDIF_IN1,
-       MUX_IN_UART3_UART_RTS_B,
-       MUX_IN_UART3_UART_RXD_MUX,
-       MUX_IN_USB_OTG_DATA_0,
-       MUX_IN_USB_OTG_DATA_1,
-       MUX_IN_USB_OTG_DATA_2,
-       MUX_IN_USB_OTG_DATA_3,
-       MUX_IN_USB_OTG_DATA_4,
-       MUX_IN_USB_OTG_DATA_5,
-       MUX_IN_USB_OTG_DATA_6,
-       MUX_IN_USB_OTG_DATA_7,
-       MUX_IN_USB_OTG_DIR,
-       MUX_IN_USB_OTG_NXT,
-       MUX_IN_USB_UH2_DATA_0,
-       MUX_IN_USB_UH2_DATA_1,
-       MUX_IN_USB_UH2_DATA_2,
-       MUX_IN_USB_UH2_DATA_3,
-       MUX_IN_USB_UH2_DATA_4,
-       MUX_IN_USB_UH2_DATA_5,
-       MUX_IN_USB_UH2_DATA_6,
-       MUX_IN_USB_UH2_DATA_7,
-       MUX_IN_USB_UH2_DIR,
-       MUX_IN_USB_UH2_NXT,
-       MUX_IN_USB_UH2_USB_OC,
-} iomux_input_select_t;
-
-/*
- * various IOMUX input functions
- */
-typedef enum iomux_input_config {
-       INPUT_CTL_PATH0 = 0x0,
-       INPUT_CTL_PATH1,
-       INPUT_CTL_PATH2,
-       INPUT_CTL_PATH3,
-       INPUT_CTL_PATH4,
-       INPUT_CTL_PATH5,
-       INPUT_CTL_PATH6,
-       INPUT_CTL_PATH7,
-} iomux_input_cfg_t;
-
-/*
- * Request ownership for an IO pin. This function has to be the first one
- * being called before that pin is used. The caller has to check the
- * return value to make sure it returns 0.
- *
- * @param  pin         a name defined by iomux_pin_name_t
- * @param  cfg         an input function as defined in iomux_pin_cfg_t
- *
- * @return             0 if successful; Non-zero otherwise
- */
-void mxc_request_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg);
-
-/*
- * Release ownership for an IO pin
- *
- * @param  pin         a name defined by iomux_pin_name_t
- * @param  cfg         an input function as defined in iomux_pin_cfg_t
- */
-void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg);
-
-/*
- * This function enables/disables the general purpose function for a particular
- * signal.
- *
- * @param  gp   one signal as defined in iomux_gp_func_t
- * @param  en   1 to enable; 0 to disable
- */
-void mxc_iomux_set_gpr(iomux_gp_func_t gp, int en);
-
-/*
- * This function configures the pad value for a IOMUX pin.
- *
- * @param  pin          a pin number as defined in iomux_pin_name_t
- * @param  config       the ORed value of elements defined in
- *                             iomux_pad_config_t
- */
-void mxc_iomux_set_pad(iomux_pin_name_t pin, u32 config);
-
-/*
- * This function configures input path.
- *
- * @param  input        index of input select register as defined in
- *                             iomux_input_select_t
- * @param  config       the binary value of elements defined in
- *                             iomux_input_cfg_t
- */
-void mxc_iomux_set_input(iomux_input_select_t input, u32 config);
-#endif
diff --git a/arch/arm/include/asm/arch-mx35/mx35_pins.h b/arch/arm/include/asm/arch-mx35/mx35_pins.h
deleted file mode 100644 (file)
index 00e5e75..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * (C) Copyright 2011
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * 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 __ASM_ARCH_MXC_MX35_PINS_H__
-#define __ASM_ARCH_MXC_MX35_PINS_H__
-
-/*!
- * @file arch-mxc/mx35_pins.h
- *
- * @brief MX35 I/O Pin List
- *
- * @ingroup GPIO_MX35
- */
-
-#ifndef __ASSEMBLY__
-
-/*!
- * @name IOMUX/PAD Bit field definitions
- */
-
-/*! @{ */
-
-/*!
- * In order to identify pins more effectively, each mux-controlled pin's
- * enumerated value is constructed in the following way:
- *
- * -------------------------------------------------------------------
- * 31-29 | 28 - 24 |23 - 21| 20 - 10| 9 - 0
- * -------------------------------------------------------------------
- * IO_P  |  IO_I   | RSVD  | PAD_I | MUX_I
- * -------------------------------------------------------------------
- *
- * Bit 0 to 7 contains MUX_I used to identify the register
- * offset (base is IOMUX_module_base ) defined in the Section
- * "sw_pad_ctl & sw_mux_ctl details" of the IC Spec. The similar field
- * definitions are used for the pad control register.the MX35_PIN_A0 is
- * defined in the enumeration: ( 0x28 << MUX_I) |( 0x368 << PAD_I)
- * So the absolute address is: IOMUX_module_base + 0x28.
- * The pad control register offset is: 0x368.
- */
-
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent the
- * MUX control register offset
- */
-#define MUX_I          0
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent the
- * PAD control register offset
- */
-#define PAD_I          10
-
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent the
- * reserved filed
- */
-#define RSVD_I         21
-
-#define MUX_IO_P                29
-#define MUX_IO_I                24
-#define IOMUX_TO_GPIO(pin)      ((((unsigned int)pin >> MUX_IO_P) * \
-                                       GPIO_NUM_PIN) + ((pin >> MUX_IO_I) &\
-                                       ((1 << (MUX_IO_P - MUX_IO_I)) - 1)))
-#define IOMUX_TO_IRQ(pin)       (MXC_GPIO_INT_BASE + IOMUX_TO_GPIO(pin))
-
-#define NON_GPIO_I     0x7
-#define PIN_TO_MUX_MASK        ((1<<(PAD_I - MUX_I)) - 1)
-#define PIN_TO_PAD_MASK        ((1<<(RSVD_I - PAD_I)) - 1)
-#define NON_MUX_I      PIN_TO_MUX_MASK
-
-#define _MXC_BUILD_PIN(gp, gi, mi, pi) \
-               (((gp) << MUX_IO_P) | ((gi) << MUX_IO_I) | \
-               ((mi) << MUX_I) | ((pi) << PAD_I))
-
-#define _MXC_BUILD_GPIO_PIN(gp, gi, mi, pi) \
-               _MXC_BUILD_PIN(gp, gi, mi, pi)
-
-#define _MXC_BUILD_NON_GPIO_PIN(mi, pi) \
-               _MXC_BUILD_PIN(NON_GPIO_I, 0, mi, pi)
-
-#define PIN_TO_IOMUX_MUX(pin) ((pin >> MUX_I) & PIN_TO_MUX_MASK)
-#define PIN_TO_IOMUX_PAD(pin) ((pin >> PAD_I) & PIN_TO_PAD_MASK)
-
-/*! @} End IOMUX/PAD Bit field definitions */
-
-/*!
- * This enumeration is constructed based on the Section
- * "sw_pad_ctl & sw_mux_ctl details" of the MX35 IC Spec. Each enumerated
- * value is constructed based on the rules described above.
- */
-typedef enum iomux_pins {
-       MX35_PIN_CAPTURE = _MXC_BUILD_GPIO_PIN(0, 4, 0x4, 0x328),
-       MX35_PIN_COMPARE = _MXC_BUILD_GPIO_PIN(0, 5, 0x8, 0x32C),
-       MX35_PIN_WATCHDOG_RST = _MXC_BUILD_GPIO_PIN(0, 6, 0xC, 0x330),
-       MX35_PIN_GPIO1_0 = _MXC_BUILD_GPIO_PIN(0, 0, 0x10, 0x334),
-       MX35_PIN_GPIO1_1 = _MXC_BUILD_GPIO_PIN(0, 1, 0x14, 0x338),
-       MX35_PIN_GPIO2_0 = _MXC_BUILD_GPIO_PIN(1, 0, 0x18, 0x33C),
-       MX35_PIN_GPIO3_0 = _MXC_BUILD_GPIO_PIN(2, 1, 0x1C, 0x340),
-       MX35_PIN_CLKO = _MXC_BUILD_GPIO_PIN(0, 8, 0x20, 0x34C),
-
-       MX35_PIN_POWER_FAIL = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x360),
-       MX35_PIN_VSTBY = _MXC_BUILD_GPIO_PIN(0, 7, 0x24, 0x364),
-       MX35_PIN_A0 = _MXC_BUILD_NON_GPIO_PIN(0x28, 0x368),
-       MX35_PIN_A1 = _MXC_BUILD_NON_GPIO_PIN(0x2C, 0x36C),
-       MX35_PIN_A2 = _MXC_BUILD_NON_GPIO_PIN(0x30, 0x370),
-       MX35_PIN_A3 = _MXC_BUILD_NON_GPIO_PIN(0x34, 0x374),
-       MX35_PIN_A4 = _MXC_BUILD_NON_GPIO_PIN(0x38, 0x378),
-       MX35_PIN_A5 = _MXC_BUILD_NON_GPIO_PIN(0x3C, 0x37C),
-       MX35_PIN_A6 = _MXC_BUILD_NON_GPIO_PIN(0x40, 0x380),
-       MX35_PIN_A7 = _MXC_BUILD_NON_GPIO_PIN(0x44, 0x384),
-       MX35_PIN_A8 = _MXC_BUILD_NON_GPIO_PIN(0x48, 0x388),
-       MX35_PIN_A9 = _MXC_BUILD_NON_GPIO_PIN(0x4C, 0x38C),
-       MX35_PIN_A10 = _MXC_BUILD_NON_GPIO_PIN(0x50, 0x390),
-       MX35_PIN_MA10 = _MXC_BUILD_NON_GPIO_PIN(0x54, 0x394),
-       MX35_PIN_A11 = _MXC_BUILD_NON_GPIO_PIN(0x58, 0x398),
-       MX35_PIN_A12 = _MXC_BUILD_NON_GPIO_PIN(0x5C, 0x39C),
-       MX35_PIN_A13 = _MXC_BUILD_NON_GPIO_PIN(0x60, 0x3A0),
-       MX35_PIN_A14 = _MXC_BUILD_NON_GPIO_PIN(0x64, 0x3A4),
-       MX35_PIN_A15 = _MXC_BUILD_NON_GPIO_PIN(0x68, 0x3A8),
-       MX35_PIN_A16 = _MXC_BUILD_NON_GPIO_PIN(0x6C, 0x3AC),
-       MX35_PIN_A17 = _MXC_BUILD_NON_GPIO_PIN(0x70, 0x3B0),
-       MX35_PIN_A18 = _MXC_BUILD_NON_GPIO_PIN(0x74, 0x3B4),
-       MX35_PIN_A19 = _MXC_BUILD_NON_GPIO_PIN(0x78, 0x3B8),
-       MX35_PIN_A20 = _MXC_BUILD_NON_GPIO_PIN(0x7C, 0x3BC),
-       MX35_PIN_A21 = _MXC_BUILD_NON_GPIO_PIN(0x80, 0x3C0),
-       MX35_PIN_A22 = _MXC_BUILD_NON_GPIO_PIN(0x84, 0x3C4),
-       MX35_PIN_A23 = _MXC_BUILD_NON_GPIO_PIN(0x88, 0x3C8),
-       MX35_PIN_A24 = _MXC_BUILD_NON_GPIO_PIN(0x8C, 0x3CC),
-       MX35_PIN_A25 = _MXC_BUILD_NON_GPIO_PIN(0x90, 0x3D0),
-
-       MX35_PIN_EB0 = _MXC_BUILD_NON_GPIO_PIN(0x94, 0x46C),
-       MX35_PIN_EB1 = _MXC_BUILD_NON_GPIO_PIN(0x98, 0x470),
-       MX35_PIN_OE = _MXC_BUILD_NON_GPIO_PIN(0x9C, 0x474),
-       MX35_PIN_CS0 = _MXC_BUILD_NON_GPIO_PIN(0xA0, 0x478),
-       MX35_PIN_CS1 = _MXC_BUILD_NON_GPIO_PIN(0xA4, 0x47C),
-       MX35_PIN_CS2 = _MXC_BUILD_NON_GPIO_PIN(0xA8, 0x480),
-       MX35_PIN_CS3 = _MXC_BUILD_NON_GPIO_PIN(0xAC, 0x484),
-       MX35_PIN_CS4 = _MXC_BUILD_GPIO_PIN(0, 20, 0xB0, 0x488),
-       MX35_PIN_CS5 = _MXC_BUILD_GPIO_PIN(0, 21, 0xB4, 0x48C),
-       MX35_PIN_NFCE_B = _MXC_BUILD_GPIO_PIN(0, 22, 0xB8, 0x490),
-
-       MX35_PIN_LBA = _MXC_BUILD_NON_GPIO_PIN(0xBC, 0x498),
-       MX35_PIN_BCLK = _MXC_BUILD_NON_GPIO_PIN(0xC0, 0x49C),
-       MX35_PIN_RW = _MXC_BUILD_NON_GPIO_PIN(0xC4, 0x4A0),
-
-       MX35_PIN_NFWE_B = _MXC_BUILD_GPIO_PIN(0, 18, 0xC8, 0x4CC),
-       MX35_PIN_NFRE_B = _MXC_BUILD_GPIO_PIN(0, 19, 0xCC, 0x4D0),
-       MX35_PIN_NFALE = _MXC_BUILD_GPIO_PIN(0, 20, 0xD0, 0x4D4),
-       MX35_PIN_NFCLE = _MXC_BUILD_GPIO_PIN(0, 21, 0xD4, 0x4D8),
-       MX35_PIN_NFWP_B = _MXC_BUILD_GPIO_PIN(0, 22, 0xD8, 0x4DC),
-       MX35_PIN_NFRB = _MXC_BUILD_GPIO_PIN(0, 23, 0xDC, 0x4E0),
-
-       MX35_PIN_D15 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4E4),
-       MX35_PIN_D14 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4E8),
-       MX35_PIN_D13 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4EC),
-       MX35_PIN_D12 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4F0),
-       MX35_PIN_D11 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4F4),
-       MX35_PIN_D10 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4F8),
-       MX35_PIN_D9 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4FC),
-       MX35_PIN_D8 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x500),
-       MX35_PIN_D7 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x504),
-       MX35_PIN_D6 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x508),
-       MX35_PIN_D5 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x50C),
-       MX35_PIN_D4 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x510),
-       MX35_PIN_D3 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x514),
-       MX35_PIN_D2 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x518),
-       MX35_PIN_D1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x51C),
-       MX35_PIN_D0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x520),
-
-       MX35_PIN_CSI_D8 = _MXC_BUILD_GPIO_PIN(0, 20, 0xE0, 0x524),
-       MX35_PIN_CSI_D9 = _MXC_BUILD_GPIO_PIN(0, 21, 0xE4, 0x528),
-       MX35_PIN_CSI_D10 = _MXC_BUILD_GPIO_PIN(0, 22, 0xE8, 0x52C),
-       MX35_PIN_CSI_D11 = _MXC_BUILD_GPIO_PIN(0, 23, 0xEC, 0x530),
-       MX35_PIN_CSI_D12 = _MXC_BUILD_GPIO_PIN(0, 24, 0xF0, 0x534),
-       MX35_PIN_CSI_D13 = _MXC_BUILD_GPIO_PIN(0, 25, 0xF4, 0x538),
-       MX35_PIN_CSI_D14 = _MXC_BUILD_GPIO_PIN(0, 26, 0xF8, 0x53C),
-       MX35_PIN_CSI_D15 = _MXC_BUILD_GPIO_PIN(0, 27, 0xFC, 0x540),
-       MX35_PIN_CSI_MCLK = _MXC_BUILD_GPIO_PIN(0, 28, 0x100, 0x544),
-       MX35_PIN_CSI_VSYNC = _MXC_BUILD_GPIO_PIN(0, 29, 0x104, 0x548),
-       MX35_PIN_CSI_HSYNC = _MXC_BUILD_GPIO_PIN(0, 30, 0x108, 0x54C),
-       MX35_PIN_CSI_PIXCLK = _MXC_BUILD_GPIO_PIN(0, 31, 0x10C, 0x550),
-
-       MX35_PIN_I2C1_CLK = _MXC_BUILD_GPIO_PIN(1, 24, 0x110, 0x554),
-       MX35_PIN_I2C1_DAT = _MXC_BUILD_GPIO_PIN(1, 25, 0x114, 0x558),
-       MX35_PIN_I2C2_CLK = _MXC_BUILD_GPIO_PIN(1, 26, 0x118, 0x55C),
-       MX35_PIN_I2C2_DAT = _MXC_BUILD_GPIO_PIN(1, 27, 0x11C, 0x560),
-
-       MX35_PIN_STXD4 = _MXC_BUILD_GPIO_PIN(1, 28, 0x120, 0x564),
-       MX35_PIN_SRXD4 = _MXC_BUILD_GPIO_PIN(1, 29, 0x124, 0x568),
-       MX35_PIN_SCK4 = _MXC_BUILD_GPIO_PIN(1, 30, 0x128, 0x56C),
-       MX35_PIN_STXFS4 = _MXC_BUILD_GPIO_PIN(1, 31, 0x12C, 0x570),
-       MX35_PIN_STXD5 = _MXC_BUILD_GPIO_PIN(0, 0, 0x130, 0x574),
-       MX35_PIN_SRXD5 = _MXC_BUILD_GPIO_PIN(0, 1, 0x134, 0x578),
-       MX35_PIN_SCK5 = _MXC_BUILD_GPIO_PIN(0, 2, 0x138, 0x57C),
-       MX35_PIN_STXFS5 = _MXC_BUILD_GPIO_PIN(0, 3, 0x13C, 0x580),
-
-       MX35_PIN_SCKR = _MXC_BUILD_GPIO_PIN(0, 4, 0x140, 0x584),
-       MX35_PIN_FSR = _MXC_BUILD_GPIO_PIN(0, 5, 0x144, 0x588),
-       MX35_PIN_HCKR = _MXC_BUILD_GPIO_PIN(0, 6, 0x148, 0x58C),
-       MX35_PIN_SCKT = _MXC_BUILD_GPIO_PIN(0, 7, 0x14C, 0x590),
-       MX35_PIN_FST = _MXC_BUILD_GPIO_PIN(0, 8, 0x150, 0x594),
-       MX35_PIN_HCKT = _MXC_BUILD_GPIO_PIN(0, 9, 0x154, 0x598),
-       MX35_PIN_TX5_RX0 = _MXC_BUILD_GPIO_PIN(0, 10, 0x158, 0x59C),
-       MX35_PIN_TX4_RX1 = _MXC_BUILD_GPIO_PIN(0, 11, 0x15C, 0x5A0),
-       MX35_PIN_TX3_RX2 = _MXC_BUILD_GPIO_PIN(0, 12, 0x160, 0x5A4),
-       MX35_PIN_TX2_RX3 = _MXC_BUILD_GPIO_PIN(0, 13, 0x164, 0x5A8),
-       MX35_PIN_TX1 = _MXC_BUILD_GPIO_PIN(0, 14, 0x168, 0x5AC),
-       MX35_PIN_TX0 = _MXC_BUILD_GPIO_PIN(0, 15, 0x16C, 0x5B0),
-
-       MX35_PIN_CSPI1_MOSI = _MXC_BUILD_GPIO_PIN(0, 16, 0x170, 0x5B4),
-       MX35_PIN_CSPI1_MISO = _MXC_BUILD_GPIO_PIN(0, 17, 0x174, 0x5B8),
-       MX35_PIN_CSPI1_SS0 = _MXC_BUILD_GPIO_PIN(0, 18, 0x178, 0x5BC),
-       MX35_PIN_CSPI1_SS1 = _MXC_BUILD_GPIO_PIN(0, 19, 0x17C, 0x5C0),
-       MX35_PIN_CSPI1_SCLK = _MXC_BUILD_GPIO_PIN(2, 4, 0x180, 0x5C4),
-       MX35_PIN_CSPI1_SPI_RDY = _MXC_BUILD_GPIO_PIN(2, 5, 0x184, 0x5C8),
-
-       MX35_PIN_RXD1 = _MXC_BUILD_GPIO_PIN(2, 6, 0x188, 0x5CC),
-       MX35_PIN_TXD1 = _MXC_BUILD_GPIO_PIN(2, 7, 0x18C, 0x5D0),
-       MX35_PIN_RTS1 = _MXC_BUILD_GPIO_PIN(2, 8, 0x190, 0x5D4),
-       MX35_PIN_CTS1 = _MXC_BUILD_GPIO_PIN(2, 9, 0x194, 0x5D8),
-       MX35_PIN_RXD2 = _MXC_BUILD_GPIO_PIN(2, 10, 0x198, 0x5DC),
-       MX35_PIN_TXD2 = _MXC_BUILD_GPIO_PIN(1, 11, 0x19C, 0x5E0),
-       MX35_PIN_RTS2 = _MXC_BUILD_GPIO_PIN(1, 12, 0x1A0, 0x5E4),
-       MX35_PIN_CTS2 = _MXC_BUILD_GPIO_PIN(1, 13, 0x1A4, 0x5E8),
-
-       MX35_PIN_USBOTG_PWR = _MXC_BUILD_GPIO_PIN(2, 14, 0x1A8, 0x60C),
-       MX35_PIN_USBOTG_OC = _MXC_BUILD_GPIO_PIN(2, 15, 0x1AC, 0x610),
-
-       MX35_PIN_LD0 = _MXC_BUILD_GPIO_PIN(1, 0, 0x1B0, 0x614),
-       MX35_PIN_LD1 = _MXC_BUILD_GPIO_PIN(1, 1, 0x1B4, 0x618),
-       MX35_PIN_LD2 = _MXC_BUILD_GPIO_PIN(1, 2, 0x1B8, 0x61C),
-       MX35_PIN_LD3 = _MXC_BUILD_GPIO_PIN(1, 3, 0x1BC, 0x620),
-       MX35_PIN_LD4 = _MXC_BUILD_GPIO_PIN(1, 4, 0x1C0, 0x624),
-       MX35_PIN_LD5 = _MXC_BUILD_GPIO_PIN(1, 5, 0x1C4, 0x628),
-       MX35_PIN_LD6 = _MXC_BUILD_GPIO_PIN(1, 6, 0x1C8, 0x62C),
-       MX35_PIN_LD7 = _MXC_BUILD_GPIO_PIN(1, 7, 0x1CC, 0x630),
-       MX35_PIN_LD8 = _MXC_BUILD_GPIO_PIN(1, 8, 0x1D0, 0x634),
-       MX35_PIN_LD9 = _MXC_BUILD_GPIO_PIN(1, 9, 0x1D4, 0x638),
-       MX35_PIN_LD10 = _MXC_BUILD_GPIO_PIN(1, 10, 0x1D8, 0x63C),
-       MX35_PIN_LD11 = _MXC_BUILD_GPIO_PIN(1, 11, 0x1DC, 0x640),
-       MX35_PIN_LD12 = _MXC_BUILD_GPIO_PIN(1, 12, 0x1E0, 0x644),
-       MX35_PIN_LD13 = _MXC_BUILD_GPIO_PIN(1, 13, 0x1E4, 0x648),
-       MX35_PIN_LD14 = _MXC_BUILD_GPIO_PIN(1, 14, 0x1E8, 0x64C),
-       MX35_PIN_LD15 = _MXC_BUILD_GPIO_PIN(1, 15, 0x1EC, 0x650),
-       MX35_PIN_LD16 = _MXC_BUILD_GPIO_PIN(1, 16, 0x1F0, 0x654),
-       MX35_PIN_LD17 = _MXC_BUILD_GPIO_PIN(1, 17, 0x1F4, 0x658),
-       MX35_PIN_LD18 = _MXC_BUILD_GPIO_PIN(2, 24, 0x1F8, 0x65C),
-       MX35_PIN_LD19 = _MXC_BUILD_GPIO_PIN(2, 25, 0x1FC, 0x660),
-       MX35_PIN_LD20 = _MXC_BUILD_GPIO_PIN(2, 26, 0x200, 0x664),
-       MX35_PIN_LD21 = _MXC_BUILD_GPIO_PIN(2, 27, 0x204, 0x668),
-       MX35_PIN_LD22 = _MXC_BUILD_GPIO_PIN(2, 28, 0x208, 0x66C),
-       MX35_PIN_LD23 = _MXC_BUILD_GPIO_PIN(2, 29, 0x20C, 0x670),
-
-       MX35_PIN_D3_HSYNC = _MXC_BUILD_GPIO_PIN(2, 30, 0x210, 0x674),
-       MX35_PIN_D3_FPSHIFT = _MXC_BUILD_GPIO_PIN(2, 31, 0x214, 0x678),
-       MX35_PIN_D3_DRDY = _MXC_BUILD_GPIO_PIN(0, 0, 0x218, 0x67C),
-       MX35_PIN_CONTRAST = _MXC_BUILD_GPIO_PIN(0, 1, 0x21C, 0x680),
-       MX35_PIN_D3_VSYNC = _MXC_BUILD_GPIO_PIN(0, 2, 0x220, 0x684),
-       MX35_PIN_D3_REV = _MXC_BUILD_GPIO_PIN(0, 3, 0x224, 0x688),
-       MX35_PIN_D3_CLS = _MXC_BUILD_GPIO_PIN(0, 4, 0x228, 0x68C),
-       MX35_PIN_D3_SPL = _MXC_BUILD_GPIO_PIN(0, 5, 0x22C, 0x690),
-
-       MX35_PIN_SD1_CMD = _MXC_BUILD_GPIO_PIN(0, 6, 0x230, 0x694),
-       MX35_PIN_SD1_CLK = _MXC_BUILD_GPIO_PIN(0, 7, 0x234, 0x698),
-       MX35_PIN_SD1_DATA0 = _MXC_BUILD_GPIO_PIN(0, 8, 0x238, 0x69C),
-       MX35_PIN_SD1_DATA1 = _MXC_BUILD_GPIO_PIN(0, 9, 0x23C, 0x6A0),
-       MX35_PIN_SD1_DATA2 = _MXC_BUILD_GPIO_PIN(0, 10, 0x240, 0x6A4),
-       MX35_PIN_SD1_DATA3 = _MXC_BUILD_GPIO_PIN(0, 11, 0x244, 0x6A8),
-       MX35_PIN_SD2_CMD = _MXC_BUILD_GPIO_PIN(1, 0, 0x248, 0x6AC),
-       MX35_PIN_SD2_CLK = _MXC_BUILD_GPIO_PIN(1, 1, 0x24C, 0x6B0),
-       MX35_PIN_SD2_DATA0 = _MXC_BUILD_GPIO_PIN(1, 2, 0x250, 0x6B4),
-       MX35_PIN_SD2_DATA1 = _MXC_BUILD_GPIO_PIN(1, 3, 0x254, 0x6B8),
-       MX35_PIN_SD2_DATA2 = _MXC_BUILD_GPIO_PIN(1, 4, 0x258, 0x6BC),
-       MX35_PIN_SD2_DATA3 = _MXC_BUILD_GPIO_PIN(1, 5, 0x25C, 0x6C0),
-
-       MX35_PIN_ATA_CS0 = _MXC_BUILD_GPIO_PIN(1, 6, 0x260, 0x6C4),
-       MX35_PIN_ATA_CS1 = _MXC_BUILD_GPIO_PIN(1, 7, 0x264, 0x6C8),
-       MX35_PIN_ATA_DIOR = _MXC_BUILD_GPIO_PIN(1, 8, 0x268, 0x6CC),
-       MX35_PIN_ATA_DIOW = _MXC_BUILD_GPIO_PIN(1, 9, 0x26C, 0x6D0),
-       MX35_PIN_ATA_DMACK = _MXC_BUILD_GPIO_PIN(1, 10, 0x270, 0x6D4),
-       MX35_PIN_ATA_RESET_B = _MXC_BUILD_GPIO_PIN(1, 11, 0x274, 0x6D8),
-       MX35_PIN_ATA_IORDY = _MXC_BUILD_GPIO_PIN(1, 12, 0x278, 0x6DC),
-       MX35_PIN_ATA_DATA0 = _MXC_BUILD_GPIO_PIN(1, 13, 0x27C, 0x6E0),
-       MX35_PIN_ATA_DATA1 = _MXC_BUILD_GPIO_PIN(1, 14, 0x280, 0x6E4),
-       MX35_PIN_ATA_DATA2 = _MXC_BUILD_GPIO_PIN(1, 15, 0x284, 0x6E8),
-       MX35_PIN_ATA_DATA3 = _MXC_BUILD_GPIO_PIN(1, 16, 0x288, 0x6EC),
-       MX35_PIN_ATA_DATA4 = _MXC_BUILD_GPIO_PIN(1, 17, 0x28C, 0x6F0),
-       MX35_PIN_ATA_DATA5 = _MXC_BUILD_GPIO_PIN(1, 18, 0x290, 0x6F4),
-       MX35_PIN_ATA_DATA6 = _MXC_BUILD_GPIO_PIN(1, 19, 0x294, 0x6F8),
-       MX35_PIN_ATA_DATA7 = _MXC_BUILD_GPIO_PIN(1, 20, 0x298, 0x6FC),
-       MX35_PIN_ATA_DATA8 = _MXC_BUILD_GPIO_PIN(1, 21, 0x29C, 0x700),
-       MX35_PIN_ATA_DATA9 = _MXC_BUILD_GPIO_PIN(1, 22, 0x2A0, 0x704),
-       MX35_PIN_ATA_DATA10 = _MXC_BUILD_GPIO_PIN(1, 23, 0x2A4, 0x708),
-       MX35_PIN_ATA_DATA11 = _MXC_BUILD_GPIO_PIN(1, 24, 0x2A8, 0x70C),
-       MX35_PIN_ATA_DATA12 = _MXC_BUILD_GPIO_PIN(1, 25, 0x2AC, 0x710),
-       MX35_PIN_ATA_DATA13 = _MXC_BUILD_GPIO_PIN(1, 26, 0x2B0, 0x714),
-       MX35_PIN_ATA_DATA14 = _MXC_BUILD_GPIO_PIN(1, 27, 0x2B4, 0x718),
-       MX35_PIN_ATA_DATA15 = _MXC_BUILD_GPIO_PIN(1, 28, 0x2B8, 0x71C),
-       MX35_PIN_ATA_INTRQ = _MXC_BUILD_GPIO_PIN(1, 29, 0x2BC, 0x720),
-       MX35_PIN_ATA_BUFF_EN = _MXC_BUILD_GPIO_PIN(1, 30, 0x2C0, 0x724),
-       MX35_PIN_ATA_DMARQ = _MXC_BUILD_GPIO_PIN(1, 31, 0x2C4, 0x728),
-       MX35_PIN_ATA_DA0 = _MXC_BUILD_GPIO_PIN(2, 0, 0x2C8, 0x72C),
-       MX35_PIN_ATA_DA1 = _MXC_BUILD_GPIO_PIN(2, 1, 0x2CC, 0x730),
-       MX35_PIN_ATA_DA2 = _MXC_BUILD_GPIO_PIN(2, 2, 0x2D0, 0x734),
-
-       MX35_PIN_MLB_CLK = _MXC_BUILD_GPIO_PIN(2, 3, 0x2D4, 0x738),
-       MX35_PIN_MLB_DAT = _MXC_BUILD_GPIO_PIN(2, 4, 0x2D8, 0x73C),
-       MX35_PIN_MLB_SIG = _MXC_BUILD_GPIO_PIN(2, 5, 0x2DC, 0x740),
-
-       MX35_PIN_FEC_TX_CLK = _MXC_BUILD_GPIO_PIN(2, 6, 0x2E0, 0x744),
-       MX35_PIN_FEC_RX_CLK = _MXC_BUILD_GPIO_PIN(2, 7, 0x2E4, 0x748),
-       MX35_PIN_FEC_RX_DV = _MXC_BUILD_GPIO_PIN(2, 8, 0x2E8, 0x74C),
-       MX35_PIN_FEC_COL = _MXC_BUILD_GPIO_PIN(2, 9, 0x2EC, 0x750),
-       MX35_PIN_FEC_RDATA0 = _MXC_BUILD_GPIO_PIN(2, 10, 0x2F0, 0x754),
-       MX35_PIN_FEC_TDATA0 = _MXC_BUILD_GPIO_PIN(2, 11, 0x2F4, 0x758),
-       MX35_PIN_FEC_TX_EN = _MXC_BUILD_GPIO_PIN(2, 12, 0x2F8, 0x75C),
-       MX35_PIN_FEC_MDC = _MXC_BUILD_GPIO_PIN(2, 13, 0x2FC, 0x760),
-       MX35_PIN_FEC_MDIO = _MXC_BUILD_GPIO_PIN(2, 14, 0x300, 0x764),
-       MX35_PIN_FEC_TX_ERR = _MXC_BUILD_GPIO_PIN(2, 15, 0x304, 0x768),
-       MX35_PIN_FEC_RX_ERR = _MXC_BUILD_GPIO_PIN(2, 16, 0x308, 0x76C),
-       MX35_PIN_FEC_CRS = _MXC_BUILD_GPIO_PIN(2, 17, 0x30C, 0x770),
-       MX35_PIN_FEC_RDATA1 = _MXC_BUILD_GPIO_PIN(2, 18, 0x310, 0x774),
-       MX35_PIN_FEC_TDATA1 = _MXC_BUILD_GPIO_PIN(2, 19, 0x314, 0x778),
-       MX35_PIN_FEC_RDATA2 = _MXC_BUILD_GPIO_PIN(2, 20, 0x318, 0x77C),
-       MX35_PIN_FEC_TDATA2 = _MXC_BUILD_GPIO_PIN(2, 21, 0x31C, 0x780),
-       MX35_PIN_FEC_RDATA3 = _MXC_BUILD_GPIO_PIN(2, 22, 0x320, 0x784),
-       MX35_PIN_FEC_TDATA3 = _MXC_BUILD_GPIO_PIN(2, 23, 0x324, 0x788),
-} iomux_pin_name_t;
-
-#endif
-#endif
index 9cdfb48a7a546a4c88e1124e4310c9c1c201c67d..6910192659db7309a4bbabcd41d797adb53f601b 100644 (file)
@@ -68,5 +68,6 @@ void set_usboh3_clk(void);
 void enable_usboh3_clk(unsigned char enable);
 void mxc_set_sata_internal_clock(void);
 int enable_i2c_clk(unsigned char enable, unsigned i2c_num);
+void enable_nfc_clk(unsigned char enable);
 
 #endif /* __ASM_ARCH_CLOCK_H */
index a71cc13e2ab498d0ea615d4dad98641786a33165..8984e423e61f7087db1c118f539d6bb6e8754265 100644 (file)
 /* M4IF */
 #define M4IF_FBPM0     0x40
 #define M4IF_FIDBP     0x48
+#define M4IF_GENP_WEIM_MM_MASK         0x00000001
+#define WEIM_GCR2_MUX16_BYP_GRANT_MASK 0x00001000
 
 /* Assuming 24MHz input clock with doubler ON */
 /*                            MFI         PDF */
@@ -499,7 +501,7 @@ struct iim_regs {
        u32     sdat;
        u32     prev;
        u32     srev;
-       u32     preg_p;
+       u32     prg_p;
        u32     scs0;
        u32     scs1;
        u32     scs2;
@@ -508,12 +510,22 @@ struct iim_regs {
        struct fuse_bank {
                u32     fuse_regs[0x20];
                u32     fuse_rsvd[0xe0];
+#if defined(CONFIG_MX51)
        } bank[4];
+#elif defined(CONFIG_MX53)
+       } bank[5];
+#endif
 };
 
 struct fuse_bank0_regs {
-       u32     fuse0_23[24];
+       u32     fuse0_7[8];
+       u32     uid[8];
+       u32     fuse16_23[8];
+#if defined(CONFIG_MX51)
+       u32     imei[8];
+#elif defined(CONFIG_MX53)
        u32     gp[8];
+#endif
 };
 
 struct fuse_bank1_regs {
@@ -522,6 +534,14 @@ struct fuse_bank1_regs {
        u32     fuse15_31[0x11];
 };
 
+#if defined(CONFIG_MX53)
+struct fuse_bank4_regs {
+       u32     fuse0_4[5];
+       u32     gp[3];
+       u32     fuse8_31[0x18];
+};
+#endif
+
 #endif /* __ASSEMBLER__*/
 
 #endif                         /* __ASM_ARCH_MX5_IMX_REGS_H__ */
index 4f37295994a6771f06033cb11567f9f3e0f8982f..70aaa37f9d5c5f72078e54097ef9c4457ed0b121 100644 (file)
 
 #include <asm/imx-common/iomux-v3.h>
 
-#define PAD_CTL_DVS                    (1 << 13)
-#define PAD_CTL_INPUT_DDR              (1 << 9)
-#define PAD_CTL_HYS                    (1 << 8)
-
-#define PAD_CTL_PKE                    (1 << 7)
-#define PAD_CTL_PUE                    (1 << 6 | PAD_CTL_PKE)
-#define PAD_CTL_PUS_100K_DOWN          (0 << 4 | PAD_CTL_PUE)
-#define PAD_CTL_PUS_47K_UP             (1 << 4 | PAD_CTL_PUE)
-#define PAD_CTL_PUS_100K_UP            (2 << 4 | PAD_CTL_PUE)
-#define PAD_CTL_PUS_22K_UP             (3 << 4 | PAD_CTL_PUE)
-
-#define PAD_CTL_ODE                    (1 << 3)
-
-#define PAD_CTL_DSE_LOW                        (0 << 1)
-#define PAD_CTL_DSE_MED                        (1 << 1)
-#define PAD_CTL_DSE_HIGH               (2 << 1)
-#define PAD_CTL_DSE_MAX                        (3 << 1)
-
-#define PAD_CTL_SRE_FAST               (1 << 0)
-#define PAD_CTL_SRE_SLOW               (0 << 0)
-
 /* Pad control groupings */
-#define MX51_UART_PAD_CTRL     (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_DSE_HIGH | \
+#define MX51_UART_PAD_CTRL     (PAD_CTL_PUS_100K_DOWN | PAD_CTL_DSE_HIGH | \
                                PAD_CTL_HYS | PAD_CTL_SRE_FAST)
 #define MX51_I2C_PAD_CTRL      (PAD_CTL_SRE_FAST | PAD_CTL_ODE | \
                                PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
 #define MX51_ESDHC_PAD_CTRL    (PAD_CTL_SRE_FAST | PAD_CTL_ODE | \
                                PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
                                PAD_CTL_HYS)
-#define MX51_USBH1_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_SRE_FAST | \
-                               PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
-                               PAD_CTL_HYS | PAD_CTL_PUE)
+#define MX51_USBH_PAD_CTRL     (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
+                               PAD_CTL_PUS_100K_UP | PAD_CTL_HYS)
 #define MX51_ECSPI_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_HYS | \
                                PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST)
-#define MX51_SDHCI_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_DSE_HIGH | \
-                               PAD_CTL_PUS_47K_UP | PAD_CTL_PUE | \
+#define MX51_SDHCI_PAD_CTRL    (PAD_CTL_DSE_HIGH | PAD_CTL_PUS_47K_UP | \
                                PAD_CTL_SRE_FAST | PAD_CTL_DVS)
 #define MX51_GPIO_PAD_CTRL     (PAD_CTL_DSE_HIGH | PAD_CTL_PKE | PAD_CTL_SRE_FAST)
 
-#define __NA_ 0x000
+#define MX51_PAD_CTRL_2                (PAD_CTL_PKE | PAD_CTL_HYS)
+#define MX51_PAD_CTRL_4                (PAD_CTL_PKE | PAD_CTL_DVS | PAD_CTL_HYS)
+#define MX51_PAD_CTRL_5                (PAD_CTL_DVS | PAD_CTL_DSE_HIGH)
 
 /*
  * The naming convention for the pad modes is MX51_PAD_<padname>__<padmode>
  * See also iomux-v3.h
  */
 
-/*                                                             PAD    MUX   ALT INPSE PATH PADCTRL */
+/*                                                         PAD    MUX   ALT INPSE PATH PADCTRL */
 enum {
-       MX51_PAD_EIM_D16__USBH2_DATA0           = IOMUX_PAD(0x3f0, 0x05c, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D17__USBH2_DATA1           = IOMUX_PAD(0x3f4, 0x060, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D18__USBH2_DATA2           = IOMUX_PAD(0x3f8, 0x064, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D19__USBH2_DATA3           = IOMUX_PAD(0x3fc, 0x068, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D20__USBH2_DATA4           = IOMUX_PAD(0x400, 0x06c, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D21__USBH2_DATA5           = IOMUX_PAD(0x404, 0x070, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D22__USBH2_DATA6           = IOMUX_PAD(0x408, 0x074, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_D23__USBH2_DATA7           = IOMUX_PAD(0x40c, 0x078, 2, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_EIM_D16__USBH2_DATA0           = IOMUX_PAD(0x3f0, 0x05c, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D17__GPIO2_1               = IOMUX_PAD(0x3f4, 0x060, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_D17__USBH2_DATA1           = IOMUX_PAD(0x3f4, 0x060, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D18__USBH2_DATA2           = IOMUX_PAD(0x3f8, 0x064, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D19__USBH2_DATA3           = IOMUX_PAD(0x3fc, 0x068, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D20__USBH2_DATA4           = IOMUX_PAD(0x400, 0x06c, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D21__GPIO2_5               = IOMUX_PAD(0x404, 0x070, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_D21__USBH2_DATA5           = IOMUX_PAD(0x404, 0x070, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D22__USBH2_DATA6           = IOMUX_PAD(0x408, 0x074, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D23__USBH2_DATA7           = IOMUX_PAD(0x40c, 0x078, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_D25__UART3_RXD             = IOMUX_PAD(0x414, 0x080, 3, 0x9f4, 0, MX51_UART_PAD_CTRL),
+       MX51_PAD_EIM_D26__UART3_TXD             = IOMUX_PAD(0x418, 0x084, 3, __NA_, 0, MX51_UART_PAD_CTRL),
        MX51_PAD_EIM_D27__GPIO2_9               = IOMUX_PAD(0x41c, 0x088, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
-       MX51_PAD_EIM_A24__USBH2_CLK             = IOMUX_PAD(0x450, 0x0bc, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_A25__USBH2_DIR             = IOMUX_PAD(0x454, 0x0c0, 2, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_EIM_A16__GPIO2_10              = IOMUX_PAD(0x430, 0x09c, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_A17__GPIO2_11              = IOMUX_PAD(0x434, 0x0a0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_A20__GPIO2_14              = IOMUX_PAD(0x440, 0x0ac, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_A22__GPIO2_16              = IOMUX_PAD(0x448, 0x0b4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_A24__USBH2_CLK             = IOMUX_PAD(0x450, 0x0bc, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_A25__USBH2_DIR             = IOMUX_PAD(0x454, 0x0c0, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
        MX51_PAD_EIM_A26__GPIO2_20              = IOMUX_PAD(0x458, 0x0c4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
-       MX51_PAD_EIM_A26__USBH2_STP             = IOMUX_PAD(0x458, 0x0c4, 2, __NA_, 0, NO_PAD_CTRL),
-       MX51_PAD_EIM_A27__USBH2_NXT             = IOMUX_PAD(0x45c, 0x0c8, 2, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_EIM_A26__USBH2_STP             = IOMUX_PAD(0x458, 0x0c4, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_A27__USBH2_NXT             = IOMUX_PAD(0x45c, 0x0c8, 2, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_EIM_EB2__FEC_MDIO              = IOMUX_PAD(0x468, 0x0d4, 3, 0x954, 0, PAD_CTL_PUS_22K_UP | PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_HYS),
+       MX51_PAD_EIM_EB3__FEC_RDATA1            = IOMUX_PAD(0x46c, 0x0d8, 3, 0x95c, 0, NO_PAD_CTRL),
+       MX51_PAD_EIM_EB3__GPIO2_23              = IOMUX_PAD(0x46c, 0x0d8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_EIM_CS0__GPIO2_25              = IOMUX_PAD(0x474, 0x0e0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
-       MX51_PAD_EIM_CS2__SD1_CD                = IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_ESDHC_PAD_CTRL),
+       MX51_PAD_EIM_CS2__FEC_RDATA2            = IOMUX_PAD(0x47c, 0x0e8, 3, 0x960, 0, NO_PAD_CTRL),
+       MX51_PAD_EIM_CS2__GPIO2_27              = IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_CS3__FEC_RDATA3            = IOMUX_PAD(0x480, 0x0ec, 3, 0x964, 0, NO_PAD_CTRL),
        MX51_PAD_EIM_CS3__GPIO2_28              = IOMUX_PAD(0x480, 0x0ec, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_CS4__FEC_RX_ER             = IOMUX_PAD(0x484, 0x0f0, 3, 0x970, 0, MX51_PAD_CTRL_2),
        MX51_PAD_EIM_CS4__GPIO2_29              = IOMUX_PAD(0x484, 0x0f0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_EIM_CS5__FEC_CRS               = IOMUX_PAD(0x488, 0x0f4, 3, 0x950, 0, MX51_PAD_CTRL_2),
+       MX51_PAD_DRAM_RAS__DRAM_RAS             = IOMUX_PAD(0x4a4, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_CAS__DRAM_CAS             = IOMUX_PAD(0x4a8, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDWE__DRAM_SDWE           = IOMUX_PAD(0x4ac, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDCKE0__DRAM_SDCKE0       = IOMUX_PAD(0x4b0, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDCKE1__DRAM_SDCKE1       = IOMUX_PAD(0x4b4, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDCLK__DRAM_SDCLK         = IOMUX_PAD(0x4b8, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDQS0__DRAM_SDQS0         = IOMUX_PAD(0x4bc, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDQS1__DRAM_SDQS1         = IOMUX_PAD(0x4c0, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDQS2__DRAM_SDQS2         = IOMUX_PAD(0x4c4, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_SDQS3__DRAM_SDQS3         = IOMUX_PAD(0x4c8, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_CS0__DRAM_CS0             = IOMUX_PAD(0x4cc, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_CS1__DRAM_CS1             = IOMUX_PAD(0x4d0, 0x104, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_DQM0__DRAM_DQM0           = IOMUX_PAD(0x4d4, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_DQM1__DRAM_DQM1           = IOMUX_PAD(0x4d8, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_DQM2__DRAM_DQM2           = IOMUX_PAD(0x4dc, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DRAM_DQM3__DRAM_DQM3           = IOMUX_PAD(0x4e0, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_WE_B__PATA_DIOW          = IOMUX_PAD(0x4e4, 0x108, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_RE_B__PATA_DIOR          = IOMUX_PAD(0x4e8, 0x10c, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_ALE__PATA_BUFFER_EN      = IOMUX_PAD(0x4ec, 0x110, 1, __NA_, 0, NO_PAD_CTRL),
@@ -96,19 +106,38 @@ enum {
        MX51_PAD_NANDF_WP_B__PATA_DMACK         = IOMUX_PAD(0x4f4, 0x118, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_RB0__PATA_DMARQ          = IOMUX_PAD(0x4f8, 0x11c, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_RB1__PATA_IORDY          = IOMUX_PAD(0x4fc, 0x120, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_RB2__FEC_COL             = IOMUX_PAD(0x500, 0x124, 1, 0x94c, 0, MX51_PAD_CTRL_2),
+       MX51_PAD_NANDF_RB2__GPIO3_10            = IOMUX_PAD(0x500, 0x124, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_NANDF_RB3__FEC_RX_CLK          = IOMUX_PAD(0x504, 0x128, 1, 0x968, 0, MX51_PAD_CTRL_2),
+       MX51_PAD_NANDF_RB3__GPIO3_11            = IOMUX_PAD(0x504, 0x128, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_GPIO_NAND__PATA_INTRQ          = IOMUX_PAD(0x514, 0x12c, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS2__FEC_TX_ER           = IOMUX_PAD(0x520, 0x138, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_CS2__PATA_CS_0           = IOMUX_PAD(0x520, 0x138, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS3__FEC_MDC             = IOMUX_PAD(0x524, 0x13c, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_CS3__PATA_CS_1           = IOMUX_PAD(0x524, 0x13c, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS4__FEC_TDATA1          = IOMUX_PAD(0x528, 0x140, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_CS4__PATA_DA_0           = IOMUX_PAD(0x528, 0x140, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS5__FEC_TDATA2          = IOMUX_PAD(0x52c, 0x144, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_CS5__PATA_DA_1           = IOMUX_PAD(0x52c, 0x144, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS6__FEC_TDATA3          = IOMUX_PAD(0x530, 0x148, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_CS6__PATA_DA_2           = IOMUX_PAD(0x530, 0x148, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_CS7__FEC_TX_EN           = IOMUX_PAD(0x534, 0x14c, 1, __NA_, 0, MX51_PAD_CTRL_5),
+       MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK      = IOMUX_PAD(0x538, 0x150, 1, 0x974, 0, MX51_PAD_CTRL_4),
+       MX51_PAD_NANDF_D15__GPIO3_25            = IOMUX_PAD(0x53c, 0x154, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_NANDF_D15__PATA_DATA15         = IOMUX_PAD(0x53c, 0x154, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D14__GPIO3_26            = IOMUX_PAD(0x540, 0x158, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_NANDF_D14__PATA_DATA14         = IOMUX_PAD(0x540, 0x158, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D13__GPIO3_27            = IOMUX_PAD(0x544, 0x15c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_NANDF_D13__PATA_DATA13         = IOMUX_PAD(0x544, 0x15c, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D12__PATA_DATA12         = IOMUX_PAD(0x548, 0x160, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D11__FEC_RX_DV           = IOMUX_PAD(0x54c, 0x164, 2, 0x96c, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D11__PATA_DATA11         = IOMUX_PAD(0x54c, 0x164, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D10__GPIO3_30            = IOMUX_PAD(0x550, 0x168, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_NANDF_D10__PATA_DATA10         = IOMUX_PAD(0x550, 0x168, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D9__FEC_RDATA0           = IOMUX_PAD(0x554, 0x16c, 0x12, 0x958, 0, MX51_PAD_CTRL_4),
+       MX51_PAD_NANDF_D9__GPIO3_31             = IOMUX_PAD(0x554, 0x16c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_NANDF_D9__PATA_DATA9           = IOMUX_PAD(0x554, 0x16c, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_NANDF_D8__FEC_TDATA0           = IOMUX_PAD(0x558, 0x170, 2, __NA_, 0, MX51_PAD_CTRL_5),
        MX51_PAD_NANDF_D8__PATA_DATA8           = IOMUX_PAD(0x558, 0x170, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D7__PATA_DATA7           = IOMUX_PAD(0x55c, 0x174, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D6__PATA_DATA6           = IOMUX_PAD(0x560, 0x178, 1, __NA_, 0, NO_PAD_CTRL),
@@ -118,34 +147,52 @@ enum {
        MX51_PAD_NANDF_D2__PATA_DATA2           = IOMUX_PAD(0x570, 0x188, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D1__PATA_DATA1           = IOMUX_PAD(0x574, 0x18c, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_NANDF_D0__PATA_DATA0           = IOMUX_PAD(0x578, 0x190, 1, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_CSI2_D12__GPIO4_9              = IOMUX_PAD(0x5bc, 0x1cc, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_CSI2_D13__GPIO4_10             = IOMUX_PAD(0x5c0, 0x1d0, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI        = IOMUX_PAD(0x600, 0x210, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
        MX51_PAD_CSPI1_MISO__ECSPI1_MISO        = IOMUX_PAD(0x604, 0x214, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
+       MX51_PAD_CSPI1_SS0__ECSPI1_SS0          = IOMUX_PAD(0x608, 0x218, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
        MX51_PAD_CSPI1_SS0__GPIO4_24            = IOMUX_PAD(0x608, 0x218, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_CSPI1_SS1__ECSPI1_SS1          = IOMUX_PAD(0x60c, 0x21c, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
        MX51_PAD_CSPI1_SS1__GPIO4_25            = IOMUX_PAD(0x60c, 0x21c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_CSPI1_RDY__ECSPI1_RDY          = IOMUX_PAD(0x610, 0x220, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
+       MX51_PAD_CSPI1_RDY__GPIO4_26            = IOMUX_PAD(0x610, 0x220, 3, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK        = IOMUX_PAD(0x614, 0x224, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL),
        MX51_PAD_UART1_RXD__UART1_RXD           = IOMUX_PAD(0x618, 0x228, 0, 0x9e4, 0, MX51_UART_PAD_CTRL),
        MX51_PAD_UART1_TXD__UART1_TXD           = IOMUX_PAD(0x61c, 0x22c, 0, __NA_, 0, MX51_UART_PAD_CTRL),
        MX51_PAD_UART1_RTS__UART1_RTS           = IOMUX_PAD(0x620, 0x230, 0, 0x9e0, 0, MX51_UART_PAD_CTRL),
        MX51_PAD_UART1_CTS__UART1_CTS           = IOMUX_PAD(0x624, 0x234, 0, __NA_, 0, MX51_UART_PAD_CTRL),
-       MX51_PAD_USBH1_CLK__USBH1_CLK           = IOMUX_PAD(0x678, 0x278, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DIR__USBH1_DIR           = IOMUX_PAD(0x67c, 0x27c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_STP__USBH1_STP           = IOMUX_PAD(0x680, 0x280, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
+       MX51_PAD_USBH1_CLK__USBH1_CLK           = IOMUX_PAD(0x678, 0x278, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DIR__USBH1_DIR           = IOMUX_PAD(0x67c, 0x27c, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
        MX51_PAD_USBH1_STP__GPIO1_27            = IOMUX_PAD(0x680, 0x280, 2, __NA_, 0, MX51_GPIO_PAD_CTRL),
-       MX51_PAD_USBH1_NXT__USBH1_NXT           = IOMUX_PAD(0x684, 0x284, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA0__USBH1_DATA0       = IOMUX_PAD(0x688, 0x288, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA1__USBH1_DATA1       = IOMUX_PAD(0x68c, 0x28c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA2__USBH1_DATA2       = IOMUX_PAD(0x690, 0x290, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA3__USBH1_DATA3       = IOMUX_PAD(0x694, 0x294, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA4__USBH1_DATA4       = IOMUX_PAD(0x698, 0x298, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA5__USBH1_DATA5       = IOMUX_PAD(0x69c, 0x29c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA6__USBH1_DATA6       = IOMUX_PAD(0x6a0, 0x2a0, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
-       MX51_PAD_USBH1_DATA7__USBH1_DATA7       = IOMUX_PAD(0x6a4, 0x2a4, 0, __NA_, 0, MX51_USBH1_PAD_CTRL),
+       MX51_PAD_USBH1_STP__USBH1_STP           = IOMUX_PAD(0x680, 0x280, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_NXT__USBH1_NXT           = IOMUX_PAD(0x684, 0x284, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA0__USBH1_DATA0       = IOMUX_PAD(0x688, 0x288, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA1__USBH1_DATA1       = IOMUX_PAD(0x68c, 0x28c, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA2__USBH1_DATA2       = IOMUX_PAD(0x690, 0x290, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA3__USBH1_DATA3       = IOMUX_PAD(0x694, 0x294, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA4__USBH1_DATA4       = IOMUX_PAD(0x698, 0x298, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA5__USBH1_DATA5       = IOMUX_PAD(0x69c, 0x29c, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA6__USBH1_DATA6       = IOMUX_PAD(0x6a0, 0x2a0, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_USBH1_DATA7__USBH1_DATA7       = IOMUX_PAD(0x6a4, 0x2a4, 0, __NA_, 0, MX51_USBH_PAD_CTRL),
+       MX51_PAD_DI1_PIN11__ECSPI1_SS2          = IOMUX_PAD(0x6a8, 0x2a8, 7, __NA_, 0, MX51_ECSPI_PAD_CTRL),
+       MX51_PAD_DI1_PIN12__GPIO3_1             = IOMUX_PAD(0x6ac, 0x2ac, 4, 0x978, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DI1_PIN13__GPIO3_2             = IOMUX_PAD(0x6b0, 0x2b0, 4, 0x97c, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DI1_D0_CS__GPIO3_3             = IOMUX_PAD(0x6b4, 0x2b4, 4, 0x980, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DI1_D1_CS__GPIO3_4             = IOMUX_PAD(0x6b8, 0x2b8, 4, 0x984, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DISPB2_SER_DIN__GPIO3_5        = IOMUX_PAD(0x6bc, 0x2bc, 4, 0x988, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DISPB2_SER_DIO__GPIO3_6        = IOMUX_PAD(0x6c0, 0x2c0, 4, 0x98c, 1, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_DI1_PIN3__DI1_PIN3             = IOMUX_PAD(0x72c, 0x32c, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DI1_PIN2__DI1_PIN2             = IOMUX_PAD(0x734, 0x330, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK     = IOMUX_PAD(0x754, 0x34c, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_PAD_DI_GP4__DI2_PIN15              = IOMUX_PAD(0x758, 0x350, 4, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_SD1_CMD__SD1_CMD               = IOMUX_PAD(0x79c, 0x394, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD1_CLK__SD1_CLK               = IOMUX_PAD(0x7a0, 0x398, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS),
        MX51_PAD_SD1_DATA0__SD1_DATA0           = IOMUX_PAD(0x7a4, 0x39c, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD1_DATA1__SD1_DATA1           = IOMUX_PAD(0x7a8, 0x3a0, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD1_DATA2__SD1_DATA2           = IOMUX_PAD(0x7ac, 0x3a4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD1_DATA3__SD1_DATA3           = IOMUX_PAD(0x7b0, 0x3a8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
+       MX51_PAD_GPIO1_0__GPIO1_0               = IOMUX_PAD(0x7b4, 0x3ac, 1, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_GPIO1_0__SD1_CD                = IOMUX_PAD(0x7b4, 0x3ac, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL),
        MX51_PAD_GPIO1_1__SD1_WP                = IOMUX_PAD(0x7b8, 0x3b0, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL),
        MX51_PAD_SD2_CMD__SD2_CMD               = IOMUX_PAD(0x7bc, 0x3b4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
@@ -154,11 +201,36 @@ enum {
        MX51_PAD_SD2_DATA1__SD2_DATA1           = IOMUX_PAD(0x7c8, 0x3c0, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD2_DATA2__SD2_DATA2           = IOMUX_PAD(0x7cc, 0x3c4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
        MX51_PAD_SD2_DATA3__SD2_DATA3           = IOMUX_PAD(0x7d0, 0x3c8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL),
+       MX51_PAD_GPIO1_2__GPIO1_2               = IOMUX_PAD(0x7d4, 0x3cc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_GPIO1_2__PWM1_PWMO             = IOMUX_PAD(0x7d4, 0x3cc, 1, __NA_, 0, NO_PAD_CTRL),
        MX51_PAD_GPIO1_3__GPIO1_3               = IOMUX_PAD(0x7d8, 0x3d0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_GPIO1_5__GPIO1_5               = IOMUX_PAD(0x808, 0x3dc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_GPIO1_6__GPIO1_6               = IOMUX_PAD(0x80c, 0x3e0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL),
+       MX51_PAD_GPIO1_7__GPIO1_7               = IOMUX_PAD(0x810, 0x3e4, 0, __NA_, 0, MX51_GPIO_PAD_CTRL),
        MX51_PAD_GPIO1_7__SD2_WP                = IOMUX_PAD(0x810, 0x3e4, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL),
        MX51_PAD_GPIO1_8__SD2_CD                = IOMUX_PAD(0x814, 0x3e8, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL),
+       MX51_GRP_DDRPKS                         = IOMUX_PAD(0x820, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_B4                        = IOMUX_PAD(0x82c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_PKEDDR                         = IOMUX_PAD(0x838, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDR_A0                         = IOMUX_PAD(0x83c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDR_A1                         = IOMUX_PAD(0x848, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDRAPUS                        = IOMUX_PAD(0x84c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_HYSDDR0                        = IOMUX_PAD(0x85c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_HYSDDR1                        = IOMUX_PAD(0x864, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_HYSDDR2                        = IOMUX_PAD(0x86c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_HYSDDR3                        = IOMUX_PAD(0x874, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_SR_B0                     = IOMUX_PAD(0x878, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDRAPKS                        = IOMUX_PAD(0x87c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_SR_B1                     = IOMUX_PAD(0x880, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDRPUS                         = IOMUX_PAD(0x884, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_SR_B2                     = IOMUX_PAD(0x88c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_PKEADDR                        = IOMUX_PAD(0x890, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_SR_B4                     = IOMUX_PAD(0x89c, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_INMODE1                        = IOMUX_PAD(0x8a0, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_B0                        = IOMUX_PAD(0x8a4, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_B1                        = IOMUX_PAD(0x8ac, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DRAM_B2                        = IOMUX_PAD(0x8b8, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
+       MX51_GRP_DDR_SR_A1                      = IOMUX_PAD(0x8bc, __NA_, 0, __NA_, 0, NO_PAD_CTRL),
 };
 
 #endif /* __IOMUX_MX51_H__ */
diff --git a/arch/arm/include/asm/arch-mx5/iomux-mx53.h b/arch/arm/include/asm/arch-mx5/iomux-mx53.h
new file mode 100644 (file)
index 0000000..f55c0f5
--- /dev/null
@@ -0,0 +1,1232 @@
+/*
+ * (C) Copyright 2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on Freescale's Linux i.MX iomux-mx53.h file:
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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 __IOMUX_MX53_H__
+#define __IOMUX_MX53_H__
+
+#include <asm/imx-common/iomux-v3.h>
+
+/* Pad control groupings */
+#define MX53_UART_PAD_CTRL     (PAD_CTL_PUS_100K_DOWN | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_SRE_FAST | PAD_CTL_HYS)
+#define MX53_SDHC_PAD_CTRL     (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST)
+
+/*
+ * The naming convention for the pad modes is MX53_PAD_<padname>__<padmode>
+ * If <padname> refers to a GPIO, it is named GPIO_<unit>
+ * If <padmode> refers to a GPIO, it is named GPIO<unit>_<num>
+ * See also iomux-v3.h
+ */
+
+/*                                                                 PAD    MUX   ALT INPSE PATH PADCTRL */
+enum {
+       MX53_PAD_GPIO_19__KPP_COL_5                     = IOMUX_PAD(0x348, 0x020, 0, 0x840, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__GPIO4_5                       = IOMUX_PAD(0x348, 0x020, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__CCM_CLKO                      = IOMUX_PAD(0x348, 0x020, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__SPDIF_OUT1                    = IOMUX_PAD(0x348, 0x020, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__RTC_CE_RTC_EXT_TRIG2          = IOMUX_PAD(0x348, 0x020, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__ECSPI1_RDY                    = IOMUX_PAD(0x348, 0x020, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__FEC_TDATA_3                   = IOMUX_PAD(0x348, 0x020, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_19__SRC_INT_BOOT                  = IOMUX_PAD(0x348, 0x020, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__KPP_COL_0                    = IOMUX_PAD(0x34C, 0x024, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__GPIO4_6                      = IOMUX_PAD(0x34C, 0x024, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC              = IOMUX_PAD(0x34C, 0x024, 2, 0x758, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__UART4_TXD_MUX                = IOMUX_PAD(0x34C, 0x024, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_COL0__ECSPI1_SCLK                  = IOMUX_PAD(0x34C, 0x024, 5, 0x79C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__FEC_RDATA_3                  = IOMUX_PAD(0x34C, 0x024, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL0__SRC_ANY_PU_RST               = IOMUX_PAD(0x34C, 0x024, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__KPP_ROW_0                    = IOMUX_PAD(0x350, 0x028, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__GPIO4_7                      = IOMUX_PAD(0x350, 0x028, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD              = IOMUX_PAD(0x350, 0x028, 2, 0x74C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__UART4_RXD_MUX                = IOMUX_PAD(0x350, 0x028, 4, 0x890, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__ECSPI1_MOSI                  = IOMUX_PAD(0x350, 0x028, 5, 0x7A4, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW0__FEC_TX_ER                    = IOMUX_PAD(0x350, 0x028, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__KPP_COL_1                    = IOMUX_PAD(0x354, 0x02C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__GPIO4_8                      = IOMUX_PAD(0x354, 0x02C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS             = IOMUX_PAD(0x354, 0x02C, 2, 0x75C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__UART5_TXD_MUX                = IOMUX_PAD(0x354, 0x02C, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_COL1__ECSPI1_MISO                  = IOMUX_PAD(0x354, 0x02C, 5, 0x7A0, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__FEC_RX_CLK                   = IOMUX_PAD(0x354, 0x02C, 6, 0x808, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL1__USBPHY1_TXREADY              = IOMUX_PAD(0x354, 0x02C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__KPP_ROW_1                    = IOMUX_PAD(0x358, 0x030, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__GPIO4_9                      = IOMUX_PAD(0x358, 0x030, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD              = IOMUX_PAD(0x358, 0x030, 2, 0x748, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__UART5_RXD_MUX                = IOMUX_PAD(0x358, 0x030, 4, 0x898, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__ECSPI1_SS0                   = IOMUX_PAD(0x358, 0x030, 5, 0x7A8, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__FEC_COL                      = IOMUX_PAD(0x358, 0x030, 6, 0x800, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW1__USBPHY1_RXVALID              = IOMUX_PAD(0x358, 0x030, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__KPP_COL_2                    = IOMUX_PAD(0x35C, 0x034, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__GPIO4_10                     = IOMUX_PAD(0x35C, 0x034, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__CAN1_TXCAN                   = IOMUX_PAD(0x35C, 0x034, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__FEC_MDIO                     = IOMUX_PAD(0x35C, 0x034, 4, 0x804, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__ECSPI1_SS1                   = IOMUX_PAD(0x35C, 0x034, 5, 0x7AC, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__FEC_RDATA_2                  = IOMUX_PAD(0x35C, 0x034, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL2__USBPHY1_RXACTIVE             = IOMUX_PAD(0x35C, 0x034, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__KPP_ROW_2                    = IOMUX_PAD(0x360, 0x038, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__GPIO4_11                     = IOMUX_PAD(0x360, 0x038, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__CAN1_RXCAN                   = IOMUX_PAD(0x360, 0x038, 2, 0x760, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__FEC_MDC                      = IOMUX_PAD(0x360, 0x038, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__ECSPI1_SS2                   = IOMUX_PAD(0x360, 0x038, 5, 0x7B0, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__FEC_TDATA_2                  = IOMUX_PAD(0x360, 0x038, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW2__USBPHY1_RXERROR              = IOMUX_PAD(0x360, 0x038, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__KPP_COL_3                    = IOMUX_PAD(0x364, 0x03C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__GPIO4_12                     = IOMUX_PAD(0x364, 0x03C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__USBOH3_H2_DP                 = IOMUX_PAD(0x364, 0x03C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__SPDIF_IN1                    = IOMUX_PAD(0x364, 0x03C, 3, 0x870, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__I2C2_SCL                     = IOMUX_PAD(0x364, 0x03C, 4 | IOMUX_CONFIG_SION, 0x81C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__ECSPI1_SS3                   = IOMUX_PAD(0x364, 0x03C, 5, 0x7B4, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__FEC_CRS                      = IOMUX_PAD(0x364, 0x03C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL3__USBPHY1_SIECLOCK             = IOMUX_PAD(0x364, 0x03C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__KPP_ROW_3                    = IOMUX_PAD(0x368, 0x040, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__GPIO4_13                     = IOMUX_PAD(0x368, 0x040, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__USBOH3_H2_DM                 = IOMUX_PAD(0x368, 0x040, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__CCM_ASRC_EXT_CLK             = IOMUX_PAD(0x368, 0x040, 3, 0x768, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__I2C2_SDA                     = IOMUX_PAD(0x368, 0x040, 4 | IOMUX_CONFIG_SION, 0x820, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__OSC32K_32K_OUT               = IOMUX_PAD(0x368, 0x040, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__CCM_PLL4_BYP                 = IOMUX_PAD(0x368, 0x040, 6, 0x77C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW3__USBPHY1_LINESTATE_0          = IOMUX_PAD(0x368, 0x040, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__KPP_COL_4                    = IOMUX_PAD(0x36C, 0x044, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__GPIO4_14                     = IOMUX_PAD(0x36C, 0x044, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__CAN2_TXCAN                   = IOMUX_PAD(0x36C, 0x044, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__IPU_SISG_4                   = IOMUX_PAD(0x36C, 0x044, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__UART5_RTS                    = IOMUX_PAD(0x36C, 0x044, 4, 0x894, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_COL4__USBOH3_USBOTG_OC             = IOMUX_PAD(0x36C, 0x044, 5, 0x89C, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_COL4__USBPHY1_LINESTATE_1          = IOMUX_PAD(0x36C, 0x044, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__KPP_ROW_4                    = IOMUX_PAD(0x370, 0x048, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__GPIO4_15                     = IOMUX_PAD(0x370, 0x048, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__CAN2_RXCAN                   = IOMUX_PAD(0x370, 0x048, 2, 0x764, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__IPU_SISG_5                   = IOMUX_PAD(0x370, 0x048, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__UART5_CTS                    = IOMUX_PAD(0x370, 0x048, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__USBOH3_USBOTG_PWR            = IOMUX_PAD(0x370, 0x048, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_KEY_ROW4__USBPHY1_VBUSVALID            = IOMUX_PAD(0x370, 0x048, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK         = IOMUX_PAD(0x378, 0x04C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__GPIO4_16                 = IOMUX_PAD(0x378, 0x04C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__USBOH3_USBH2_DIR         = IOMUX_PAD(0x378, 0x04C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__SDMA_DEBUG_CORE_STATE_0  = IOMUX_PAD(0x378, 0x04C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__EMI_EMI_DEBUG_0          = IOMUX_PAD(0x378, 0x04C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_DISP_CLK__USBPHY1_AVALID           = IOMUX_PAD(0x378, 0x04C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__IPU_DI0_PIN15               = IOMUX_PAD(0x37C, 0x050, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__GPIO4_17                    = IOMUX_PAD(0x37C, 0x050, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__AUDMUX_AUD6_TXC             = IOMUX_PAD(0x37C, 0x050, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__SDMA_DEBUG_CORE_STATE_1     = IOMUX_PAD(0x37C, 0x050, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__EMI_EMI_DEBUG_1             = IOMUX_PAD(0x37C, 0x050, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN15__USBPHY1_BVALID              = IOMUX_PAD(0x37C, 0x050, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__IPU_DI0_PIN2                 = IOMUX_PAD(0x380, 0x054, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__GPIO4_18                     = IOMUX_PAD(0x380, 0x054, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__AUDMUX_AUD6_TXD              = IOMUX_PAD(0x380, 0x054, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__SDMA_DEBUG_CORE_STATE_2      = IOMUX_PAD(0x380, 0x054, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__EMI_EMI_DEBUG_2              = IOMUX_PAD(0x380, 0x054, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN2__USBPHY1_ENDSESSION           = IOMUX_PAD(0x380, 0x054, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__IPU_DI0_PIN3                 = IOMUX_PAD(0x384, 0x058, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__GPIO4_19                     = IOMUX_PAD(0x384, 0x058, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__AUDMUX_AUD6_TXFS             = IOMUX_PAD(0x384, 0x058, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__SDMA_DEBUG_CORE_STATE_3      = IOMUX_PAD(0x384, 0x058, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__EMI_EMI_DEBUG_3              = IOMUX_PAD(0x384, 0x058, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN3__USBPHY1_IDDIG                = IOMUX_PAD(0x384, 0x058, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__IPU_DI0_PIN4                 = IOMUX_PAD(0x388, 0x05C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__GPIO4_20                     = IOMUX_PAD(0x388, 0x05C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__AUDMUX_AUD6_RXD              = IOMUX_PAD(0x388, 0x05C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__ESDHC1_WP                    = IOMUX_PAD(0x388, 0x05C, 3, 0x7FC, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__SDMA_DEBUG_YIELD             = IOMUX_PAD(0x388, 0x05C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__EMI_EMI_DEBUG_4              = IOMUX_PAD(0x388, 0x05C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DI0_PIN4__USBPHY1_HOSTDISCONNECT       = IOMUX_PAD(0x388, 0x05C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0            = IOMUX_PAD(0x38C, 0x060, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__GPIO4_21                   = IOMUX_PAD(0x38C, 0x060, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__CSPI_SCLK                  = IOMUX_PAD(0x38C, 0x060, 2, 0x780, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__USBOH3_USBH2_DATA_0        = IOMUX_PAD(0x38C, 0x060, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__SDMA_DEBUG_CORE_RUN        = IOMUX_PAD(0x38C, 0x060, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__EMI_EMI_DEBUG_5            = IOMUX_PAD(0x38C, 0x060, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT0__USBPHY2_TXREADY            = IOMUX_PAD(0x38C, 0x060, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1            = IOMUX_PAD(0x390, 0x064, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__GPIO4_22                   = IOMUX_PAD(0x390, 0x064, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__CSPI_MOSI                  = IOMUX_PAD(0x390, 0x064, 2, 0x788, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__USBOH3_USBH2_DATA_1        = IOMUX_PAD(0x390, 0x064, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__SDMA_DEBUG_EVENT_CHANNEL_SEL
+                                                       = IOMUX_PAD(0x390, 0x064, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__EMI_EMI_DEBUG_6            = IOMUX_PAD(0x390, 0x064, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT1__USBPHY2_RXVALID            = IOMUX_PAD(0x390, 0x064, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2            = IOMUX_PAD(0x394, 0x068, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__GPIO4_23                   = IOMUX_PAD(0x394, 0x068, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__CSPI_MISO                  = IOMUX_PAD(0x394, 0x068, 2, 0x784, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__USBOH3_USBH2_DATA_2        = IOMUX_PAD(0x394, 0x068, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__SDMA_DEBUG_MODE            = IOMUX_PAD(0x394, 0x068, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__EMI_EMI_DEBUG_7            = IOMUX_PAD(0x394, 0x068, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT2__USBPHY2_RXACTIVE           = IOMUX_PAD(0x394, 0x068, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3            = IOMUX_PAD(0x398, 0x06C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__GPIO4_24                   = IOMUX_PAD(0x398, 0x06C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__CSPI_SS0                   = IOMUX_PAD(0x398, 0x06C, 2, 0x78C, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__USBOH3_USBH2_DATA_3        = IOMUX_PAD(0x398, 0x06C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__SDMA_DEBUG_BUS_ERROR       = IOMUX_PAD(0x398, 0x06C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__EMI_EMI_DEBUG_8            = IOMUX_PAD(0x398, 0x06C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT3__USBPHY2_RXERROR            = IOMUX_PAD(0x398, 0x06C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4            = IOMUX_PAD(0x39C, 0x070, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__GPIO4_25                   = IOMUX_PAD(0x39C, 0x070, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__CSPI_SS1                   = IOMUX_PAD(0x39C, 0x070, 2, 0x790, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__USBOH3_USBH2_DATA_4        = IOMUX_PAD(0x39C, 0x070, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__SDMA_DEBUG_BUS_RWB         = IOMUX_PAD(0x39C, 0x070, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__EMI_EMI_DEBUG_9            = IOMUX_PAD(0x39C, 0x070, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT4__USBPHY2_SIECLOCK           = IOMUX_PAD(0x39C, 0x070, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5            = IOMUX_PAD(0x3A0, 0x074, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__GPIO4_26                   = IOMUX_PAD(0x3A0, 0x074, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__CSPI_SS2                   = IOMUX_PAD(0x3A0, 0x074, 2, 0x794, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__USBOH3_USBH2_DATA_5        = IOMUX_PAD(0x3A0, 0x074, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__SDMA_DEBUG_MATCHED_DMBUS   = IOMUX_PAD(0x3A0, 0x074, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__EMI_EMI_DEBUG_10           = IOMUX_PAD(0x3A0, 0x074, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT5__USBPHY2_LINESTATE_0        = IOMUX_PAD(0x3A0, 0x074, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6            = IOMUX_PAD(0x3A4, 0x078, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__GPIO4_27                   = IOMUX_PAD(0x3A4, 0x078, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__CSPI_SS3                   = IOMUX_PAD(0x3A4, 0x078, 2, 0x798, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__USBOH3_USBH2_DATA_6        = IOMUX_PAD(0x3A4, 0x078, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__SDMA_DEBUG_RTBUFFER_WRITE  = IOMUX_PAD(0x3A4, 0x078, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__EMI_EMI_DEBUG_11           = IOMUX_PAD(0x3A4, 0x078, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT6__USBPHY2_LINESTATE_1        = IOMUX_PAD(0x3A4, 0x078, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7            = IOMUX_PAD(0x3A8, 0x07C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__GPIO4_28                   = IOMUX_PAD(0x3A8, 0x07C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__CSPI_RDY                   = IOMUX_PAD(0x3A8, 0x07C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__USBOH3_USBH2_DATA_7        = IOMUX_PAD(0x3A8, 0x07C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__SDMA_DEBUG_EVENT_CHANNEL_0 = IOMUX_PAD(0x3A8, 0x07C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__EMI_EMI_DEBUG_12           = IOMUX_PAD(0x3A8, 0x07C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT7__USBPHY2_VBUSVALID          = IOMUX_PAD(0x3A8, 0x07C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8            = IOMUX_PAD(0x3AC, 0x080, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__GPIO4_29                   = IOMUX_PAD(0x3AC, 0x080, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__PWM1_PWMO                  = IOMUX_PAD(0x3AC, 0x080, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__WDOG1_WDOG_B               = IOMUX_PAD(0x3AC, 0x080, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__SDMA_DEBUG_EVENT_CHANNEL_1 = IOMUX_PAD(0x3AC, 0x080, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__EMI_EMI_DEBUG_13           = IOMUX_PAD(0x3AC, 0x080, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT8__USBPHY2_AVALID             = IOMUX_PAD(0x3AC, 0x080, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9            = IOMUX_PAD(0x3B0, 0x084, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__GPIO4_30                   = IOMUX_PAD(0x3B0, 0x084, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__PWM2_PWMO                  = IOMUX_PAD(0x3B0, 0x084, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__WDOG2_WDOG_B               = IOMUX_PAD(0x3B0, 0x084, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__SDMA_DEBUG_EVENT_CHANNEL_2 = IOMUX_PAD(0x3B0, 0x084, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__EMI_EMI_DEBUG_14           = IOMUX_PAD(0x3B0, 0x084, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT9__USBPHY2_VSTATUS_0          = IOMUX_PAD(0x3B0, 0x084, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10          = IOMUX_PAD(0x3B4, 0x088, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__GPIO4_31                  = IOMUX_PAD(0x3B4, 0x088, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__USBOH3_USBH2_STP          = IOMUX_PAD(0x3B4, 0x088, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__SDMA_DEBUG_EVENT_CHANNEL_3
+                                                       = IOMUX_PAD(0x3B4, 0x088, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__EMI_EMI_DEBUG_15          = IOMUX_PAD(0x3B4, 0x088, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT10__USBPHY2_VSTATUS_1         = IOMUX_PAD(0x3B4, 0x088, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11          = IOMUX_PAD(0x3B8, 0x08C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__GPIO5_5                   = IOMUX_PAD(0x3B8, 0x08C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__USBOH3_USBH2_NXT          = IOMUX_PAD(0x3B8, 0x08C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__SDMA_DEBUG_EVENT_CHANNEL_4
+                                                       = IOMUX_PAD(0x3B8, 0x08C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__EMI_EMI_DEBUG_16          = IOMUX_PAD(0x3B8, 0x08C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT11__USBPHY2_VSTATUS_2         = IOMUX_PAD(0x3B8, 0x08C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12          = IOMUX_PAD(0x3BC, 0x090, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__GPIO5_6                   = IOMUX_PAD(0x3BC, 0x090, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__USBOH3_USBH2_CLK          = IOMUX_PAD(0x3BC, 0x090, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__SDMA_DEBUG_EVENT_CHANNEL_5
+                                                       = IOMUX_PAD(0x3BC, 0x090, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__EMI_EMI_DEBUG_17          = IOMUX_PAD(0x3BC, 0x090, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT12__USBPHY2_VSTATUS_3         = IOMUX_PAD(0x3BC, 0x090, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13          = IOMUX_PAD(0x3C0, 0x094, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__GPIO5_7                   = IOMUX_PAD(0x3C0, 0x094, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__AUDMUX_AUD5_RXFS          = IOMUX_PAD(0x3C0, 0x094, 3, 0x754, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__SDMA_DEBUG_EVT_CHN_LINES_0
+                                                       = IOMUX_PAD(0x3C0, 0x094, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__EMI_EMI_DEBUG_18          = IOMUX_PAD(0x3C0, 0x094, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT13__USBPHY2_VSTATUS_4         = IOMUX_PAD(0x3C0, 0x094, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14          = IOMUX_PAD(0x3C4, 0x098, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__GPIO5_8                   = IOMUX_PAD(0x3C4, 0x098, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__AUDMUX_AUD5_RXC           = IOMUX_PAD(0x3C4, 0x098, 3, 0x750, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__SDMA_DEBUG_EVT_CHN_LINES_1
+                                                       = IOMUX_PAD(0x3C4, 0x098, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__EMI_EMI_DEBUG_19          = IOMUX_PAD(0x3C4, 0x098, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT14__USBPHY2_VSTATUS_5         = IOMUX_PAD(0x3C4, 0x098, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15          = IOMUX_PAD(0x3C8, 0x09C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__GPIO5_9                   = IOMUX_PAD(0x3C8, 0x09C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__ECSPI1_SS1                = IOMUX_PAD(0x3C8, 0x09C, 2, 0x7AC, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__ECSPI2_SS1                = IOMUX_PAD(0x3C8, 0x09C, 3, 0x7C8, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__SDMA_DEBUG_EVT_CHN_LINES_2
+                                                       = IOMUX_PAD(0x3C8, 0x09C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__EMI_EMI_DEBUG_20          = IOMUX_PAD(0x3C8, 0x09C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT15__USBPHY2_VSTATUS_6         = IOMUX_PAD(0x3C8, 0x09C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16          = IOMUX_PAD(0x3CC, 0x0A0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__GPIO5_10                  = IOMUX_PAD(0x3CC, 0x0A0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__ECSPI2_MOSI               = IOMUX_PAD(0x3CC, 0x0A0, 2, 0x7C0, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__AUDMUX_AUD5_TXC           = IOMUX_PAD(0x3CC, 0x0A0, 3, 0x758, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__SDMA_EXT_EVENT_0          = IOMUX_PAD(0x3CC, 0x0A0, 4, 0x868, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__SDMA_DEBUG_EVT_CHN_LINES_3
+                                                       = IOMUX_PAD(0x3CC, 0x0A0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__EMI_EMI_DEBUG_21          = IOMUX_PAD(0x3CC, 0x0A0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT16__USBPHY2_VSTATUS_7         = IOMUX_PAD(0x3CC, 0x0A0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17          = IOMUX_PAD(0x3D0, 0x0A4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__GPIO5_11                  = IOMUX_PAD(0x3D0, 0x0A4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__ECSPI2_MISO               = IOMUX_PAD(0x3D0, 0x0A4, 2, 0x7BC, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__AUDMUX_AUD5_TXD           = IOMUX_PAD(0x3D0, 0x0A4, 3, 0x74C, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__SDMA_EXT_EVENT_1          = IOMUX_PAD(0x3D0, 0x0A4, 4, 0x86C, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__SDMA_DEBUG_EVT_CHN_LINES_4
+                                                       = IOMUX_PAD(0x3D0, 0x0A4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT17__EMI_EMI_DEBUG_22          = IOMUX_PAD(0x3D0, 0x0A4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18          = IOMUX_PAD(0x3D4, 0x0A8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__GPIO5_12                  = IOMUX_PAD(0x3D4, 0x0A8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__ECSPI2_SS0                = IOMUX_PAD(0x3D4, 0x0A8, 2, 0x7C4, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__AUDMUX_AUD5_TXFS          = IOMUX_PAD(0x3D4, 0x0A8, 3, 0x75C, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__AUDMUX_AUD4_RXFS          = IOMUX_PAD(0x3D4, 0x0A8, 4, 0x73C, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__SDMA_DEBUG_EVT_CHN_LINES_5
+                                                       = IOMUX_PAD(0x3D4, 0x0A8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__EMI_EMI_DEBUG_23          = IOMUX_PAD(0x3D4, 0x0A8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT18__EMI_WEIM_CS_2             = IOMUX_PAD(0x3D4, 0x0A8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19          = IOMUX_PAD(0x3D8, 0x0AC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__GPIO5_13                  = IOMUX_PAD(0x3D8, 0x0AC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__ECSPI2_SCLK               = IOMUX_PAD(0x3D8, 0x0AC, 2, 0x7B8, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__AUDMUX_AUD5_RXD           = IOMUX_PAD(0x3D8, 0x0AC, 3, 0x748, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__AUDMUX_AUD4_RXC           = IOMUX_PAD(0x3D8, 0x0AC, 4, 0x738, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__SDMA_DEBUG_EVT_CHN_LINES_6
+                                                       = IOMUX_PAD(0x3D8, 0x0AC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__EMI_EMI_DEBUG_24          = IOMUX_PAD(0x3D8, 0x0AC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT19__EMI_WEIM_CS_3             = IOMUX_PAD(0x3D8, 0x0AC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20          = IOMUX_PAD(0x3DC, 0x0B0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__GPIO5_14                  = IOMUX_PAD(0x3DC, 0x0B0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__ECSPI1_SCLK               = IOMUX_PAD(0x3DC, 0x0B0, 2, 0x79C, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__AUDMUX_AUD4_TXC           = IOMUX_PAD(0x3DC, 0x0B0, 3, 0x740, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__SDMA_DEBUG_EVT_CHN_LINES_7
+                                                       = IOMUX_PAD(0x3DC, 0x0B0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__EMI_EMI_DEBUG_25          = IOMUX_PAD(0x3DC, 0x0B0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT20__SATA_PHY_TDI              = IOMUX_PAD(0x3DC, 0x0B0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21          = IOMUX_PAD(0x3E0, 0x0B4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__GPIO5_15                  = IOMUX_PAD(0x3E0, 0x0B4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__ECSPI1_MOSI               = IOMUX_PAD(0x3E0, 0x0B4, 2, 0x7A4, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__AUDMUX_AUD4_TXD           = IOMUX_PAD(0x3E0, 0x0B4, 3, 0x734, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__SDMA_DEBUG_BUS_DEVICE_0   = IOMUX_PAD(0x3E0, 0x0B4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__EMI_EMI_DEBUG_26          = IOMUX_PAD(0x3E0, 0x0B4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT21__SATA_PHY_TDO              = IOMUX_PAD(0x3E0, 0x0B4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22          = IOMUX_PAD(0x3E4, 0x0B8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__GPIO5_16                  = IOMUX_PAD(0x3E4, 0x0B8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__ECSPI1_MISO               = IOMUX_PAD(0x3E4, 0x0B8, 2, 0x7A0, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__AUDMUX_AUD4_TXFS          = IOMUX_PAD(0x3E4, 0x0B8, 3, 0x744, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__SDMA_DEBUG_BUS_DEVICE_1   = IOMUX_PAD(0x3E4, 0x0B8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__EMI_EMI_DEBUG_27          = IOMUX_PAD(0x3E4, 0x0B8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT22__SATA_PHY_TCK              = IOMUX_PAD(0x3E4, 0x0B8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23          = IOMUX_PAD(0x3E8, 0x0BC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__GPIO5_17                  = IOMUX_PAD(0x3E8, 0x0BC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__ECSPI1_SS0                = IOMUX_PAD(0x3E8, 0x0BC, 2, 0x7A8, 1, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__AUDMUX_AUD4_RXD           = IOMUX_PAD(0x3E8, 0x0BC, 3, 0x730, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__SDMA_DEBUG_BUS_DEVICE_2   = IOMUX_PAD(0x3E8, 0x0BC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__EMI_EMI_DEBUG_28          = IOMUX_PAD(0x3E8, 0x0BC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_DISP0_DAT23__SATA_PHY_TMS              = IOMUX_PAD(0x3E8, 0x0BC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_PIXCLK__IPU_CSI0_PIXCLK           = IOMUX_PAD(0x3EC, 0x0C0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_PIXCLK__GPIO5_18                  = IOMUX_PAD(0x3EC, 0x0C0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_PIXCLK__SDMA_DEBUG_PC_0           = IOMUX_PAD(0x3EC, 0x0C0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_PIXCLK__EMI_EMI_DEBUG_29          = IOMUX_PAD(0x3EC, 0x0C0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__IPU_CSI0_HSYNC              = IOMUX_PAD(0x3F0, 0x0C4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__GPIO5_19                    = IOMUX_PAD(0x3F0, 0x0C4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__CCM_CSI0_MCLK               = IOMUX_PAD(0x3F0, 0x0C4, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__SDMA_DEBUG_PC_1             = IOMUX_PAD(0x3F0, 0x0C4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__EMI_EMI_DEBUG_30            = IOMUX_PAD(0x3F0, 0x0C4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_MCLK__TPIU_TRCTL                  = IOMUX_PAD(0x3F0, 0x0C4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DATA_EN__IPU_CSI0_DATA_EN         = IOMUX_PAD(0x3F4, 0x0C8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DATA_EN__GPIO5_20                 = IOMUX_PAD(0x3F4, 0x0C8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DATA_EN__SDMA_DEBUG_PC_2          = IOMUX_PAD(0x3F4, 0x0C8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DATA_EN__EMI_EMI_DEBUG_31         = IOMUX_PAD(0x3F4, 0x0C8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DATA_EN__TPIU_TRCLK               = IOMUX_PAD(0x3F4, 0x0C8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_VSYNC__IPU_CSI0_VSYNC             = IOMUX_PAD(0x3F8, 0x0CC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_VSYNC__GPIO5_21                   = IOMUX_PAD(0x3F8, 0x0CC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_VSYNC__SDMA_DEBUG_PC_3            = IOMUX_PAD(0x3F8, 0x0CC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_VSYNC__EMI_EMI_DEBUG_32           = IOMUX_PAD(0x3F8, 0x0CC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_VSYNC__TPIU_TRACE_0               = IOMUX_PAD(0x3F8, 0x0CC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__IPU_CSI0_D_4                = IOMUX_PAD(0x3FC, 0x0D0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__GPIO5_22                    = IOMUX_PAD(0x3FC, 0x0D0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__KPP_COL_5                   = IOMUX_PAD(0x3FC, 0x0D0, 2, 0x840, 1, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__ECSPI1_SCLK                 = IOMUX_PAD(0x3FC, 0x0D0, 3, 0x79C, 2, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__USBOH3_USBH3_STP            = IOMUX_PAD(0x3FC, 0x0D0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__AUDMUX_AUD3_TXC             = IOMUX_PAD(0x3FC, 0x0D0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__EMI_EMI_DEBUG_33            = IOMUX_PAD(0x3FC, 0x0D0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT4__TPIU_TRACE_1                = IOMUX_PAD(0x3FC, 0x0D0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__IPU_CSI0_D_5                = IOMUX_PAD(0x400, 0x0D4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__GPIO5_23                    = IOMUX_PAD(0x400, 0x0D4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__KPP_ROW_5                   = IOMUX_PAD(0x400, 0x0D4, 2, 0x84C, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__ECSPI1_MOSI                 = IOMUX_PAD(0x400, 0x0D4, 3, 0x7A4, 2, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__USBOH3_USBH3_NXT            = IOMUX_PAD(0x400, 0x0D4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__AUDMUX_AUD3_TXD             = IOMUX_PAD(0x400, 0x0D4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__EMI_EMI_DEBUG_34            = IOMUX_PAD(0x400, 0x0D4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT5__TPIU_TRACE_2                = IOMUX_PAD(0x400, 0x0D4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__IPU_CSI0_D_6                = IOMUX_PAD(0x404, 0x0D8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__GPIO5_24                    = IOMUX_PAD(0x404, 0x0D8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__KPP_COL_6                   = IOMUX_PAD(0x404, 0x0D8, 2, 0x844, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__ECSPI1_MISO                 = IOMUX_PAD(0x404, 0x0D8, 3, 0x7A0, 2, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__USBOH3_USBH3_CLK            = IOMUX_PAD(0x404, 0x0D8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__AUDMUX_AUD3_TXFS            = IOMUX_PAD(0x404, 0x0D8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__EMI_EMI_DEBUG_35            = IOMUX_PAD(0x404, 0x0D8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT6__TPIU_TRACE_3                = IOMUX_PAD(0x404, 0x0D8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__IPU_CSI0_D_7                = IOMUX_PAD(0x408, 0x0DC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__GPIO5_25                    = IOMUX_PAD(0x408, 0x0DC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__KPP_ROW_6                   = IOMUX_PAD(0x408, 0x0DC, 2, 0x850, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__ECSPI1_SS0                  = IOMUX_PAD(0x408, 0x0DC, 3, 0x7A8, 2, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__USBOH3_USBH3_DIR            = IOMUX_PAD(0x408, 0x0DC, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__AUDMUX_AUD3_RXD             = IOMUX_PAD(0x408, 0x0DC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__EMI_EMI_DEBUG_36            = IOMUX_PAD(0x408, 0x0DC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT7__TPIU_TRACE_4                = IOMUX_PAD(0x408, 0x0DC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__IPU_CSI0_D_8                = IOMUX_PAD(0x40C, 0x0E0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__GPIO5_26                    = IOMUX_PAD(0x40C, 0x0E0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__KPP_COL_7                   = IOMUX_PAD(0x40C, 0x0E0, 2, 0x848, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__ECSPI2_SCLK                 = IOMUX_PAD(0x40C, 0x0E0, 3, 0x7B8, 1, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__USBOH3_USBH3_OC             = IOMUX_PAD(0x40C, 0x0E0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__I2C1_SDA                    = IOMUX_PAD(0x40C, 0x0E0, 5 | IOMUX_CONFIG_SION, 0x818, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__EMI_EMI_DEBUG_37            = IOMUX_PAD(0x40C, 0x0E0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT8__TPIU_TRACE_5                = IOMUX_PAD(0x40C, 0x0E0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__IPU_CSI0_D_9                = IOMUX_PAD(0x410, 0x0E4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__GPIO5_27                    = IOMUX_PAD(0x410, 0x0E4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__KPP_ROW_7                   = IOMUX_PAD(0x410, 0x0E4, 2, 0x854, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__ECSPI2_MOSI                 = IOMUX_PAD(0x410, 0x0E4, 3, 0x7C0, 1, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__USBOH3_USBH3_PWR            = IOMUX_PAD(0x410, 0x0E4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__I2C1_SCL                    = IOMUX_PAD(0x410, 0x0E4, 5 | IOMUX_CONFIG_SION, 0x814, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__EMI_EMI_DEBUG_38            = IOMUX_PAD(0x410, 0x0E4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT9__TPIU_TRACE_6                = IOMUX_PAD(0x410, 0x0E4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__IPU_CSI0_D_10              = IOMUX_PAD(0x414, 0x0E8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__GPIO5_28                   = IOMUX_PAD(0x414, 0x0E8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__UART1_TXD_MUX              = IOMUX_PAD(0x414, 0x0E8, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__ECSPI2_MISO                = IOMUX_PAD(0x414, 0x0E8, 3, 0x7BC, 1, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__AUDMUX_AUD3_RXC            = IOMUX_PAD(0x414, 0x0E8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__SDMA_DEBUG_PC_4            = IOMUX_PAD(0x414, 0x0E8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__EMI_EMI_DEBUG_39           = IOMUX_PAD(0x414, 0x0E8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT10__TPIU_TRACE_7               = IOMUX_PAD(0x414, 0x0E8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__IPU_CSI0_D_11              = IOMUX_PAD(0x418, 0x0EC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__GPIO5_29                   = IOMUX_PAD(0x418, 0x0EC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__UART1_RXD_MUX              = IOMUX_PAD(0x418, 0x0EC, 2, 0x878, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__ECSPI2_SS0                 = IOMUX_PAD(0x418, 0x0EC, 3, 0x7C4, 1, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__AUDMUX_AUD3_RXFS           = IOMUX_PAD(0x418, 0x0EC, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__SDMA_DEBUG_PC_5            = IOMUX_PAD(0x418, 0x0EC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__EMI_EMI_DEBUG_40           = IOMUX_PAD(0x418, 0x0EC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT11__TPIU_TRACE_8               = IOMUX_PAD(0x418, 0x0EC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__IPU_CSI0_D_12              = IOMUX_PAD(0x41C, 0x0F0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__GPIO5_30                   = IOMUX_PAD(0x41C, 0x0F0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__UART4_TXD_MUX              = IOMUX_PAD(0x41C, 0x0F0, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__USBOH3_USBH3_DATA_0        = IOMUX_PAD(0x41C, 0x0F0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__SDMA_DEBUG_PC_6            = IOMUX_PAD(0x41C, 0x0F0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__EMI_EMI_DEBUG_41           = IOMUX_PAD(0x41C, 0x0F0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT12__TPIU_TRACE_9               = IOMUX_PAD(0x41C, 0x0F0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__IPU_CSI0_D_13              = IOMUX_PAD(0x420, 0x0F4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__GPIO5_31                   = IOMUX_PAD(0x420, 0x0F4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__UART4_RXD_MUX              = IOMUX_PAD(0x420, 0x0F4, 2, 0x890, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__USBOH3_USBH3_DATA_1        = IOMUX_PAD(0x420, 0x0F4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__SDMA_DEBUG_PC_7            = IOMUX_PAD(0x420, 0x0F4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__EMI_EMI_DEBUG_42           = IOMUX_PAD(0x420, 0x0F4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT13__TPIU_TRACE_10              = IOMUX_PAD(0x420, 0x0F4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__IPU_CSI0_D_14              = IOMUX_PAD(0x424, 0x0F8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__GPIO6_0                    = IOMUX_PAD(0x424, 0x0F8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__UART5_TXD_MUX              = IOMUX_PAD(0x424, 0x0F8, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__USBOH3_USBH3_DATA_2        = IOMUX_PAD(0x424, 0x0F8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__SDMA_DEBUG_PC_8            = IOMUX_PAD(0x424, 0x0F8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__EMI_EMI_DEBUG_43           = IOMUX_PAD(0x424, 0x0F8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT14__TPIU_TRACE_11              = IOMUX_PAD(0x424, 0x0F8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__IPU_CSI0_D_15              = IOMUX_PAD(0x428, 0x0FC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__GPIO6_1                    = IOMUX_PAD(0x428, 0x0FC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__UART5_RXD_MUX              = IOMUX_PAD(0x428, 0x0FC, 2, 0x898, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__USBOH3_USBH3_DATA_3        = IOMUX_PAD(0x428, 0x0FC, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__SDMA_DEBUG_PC_9            = IOMUX_PAD(0x428, 0x0FC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__EMI_EMI_DEBUG_44           = IOMUX_PAD(0x428, 0x0FC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT15__TPIU_TRACE_12              = IOMUX_PAD(0x428, 0x0FC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__IPU_CSI0_D_16              = IOMUX_PAD(0x42C, 0x100, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__GPIO6_2                    = IOMUX_PAD(0x42C, 0x100, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__UART4_RTS                  = IOMUX_PAD(0x42C, 0x100, 2, 0x88C, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__USBOH3_USBH3_DATA_4        = IOMUX_PAD(0x42C, 0x100, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__SDMA_DEBUG_PC_10           = IOMUX_PAD(0x42C, 0x100, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__EMI_EMI_DEBUG_45           = IOMUX_PAD(0x42C, 0x100, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT16__TPIU_TRACE_13              = IOMUX_PAD(0x42C, 0x100, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17              = IOMUX_PAD(0x430, 0x104, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__GPIO6_3                    = IOMUX_PAD(0x430, 0x104, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__UART4_CTS                  = IOMUX_PAD(0x430, 0x104, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__USBOH3_USBH3_DATA_5        = IOMUX_PAD(0x430, 0x104, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__SDMA_DEBUG_PC_11           = IOMUX_PAD(0x430, 0x104, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__EMI_EMI_DEBUG_46           = IOMUX_PAD(0x430, 0x104, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT17__TPIU_TRACE_14              = IOMUX_PAD(0x430, 0x104, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__IPU_CSI0_D_18              = IOMUX_PAD(0x434, 0x108, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__GPIO6_4                    = IOMUX_PAD(0x434, 0x108, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__UART5_RTS                  = IOMUX_PAD(0x434, 0x108, 2, 0x894, 2, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__USBOH3_USBH3_DATA_6        = IOMUX_PAD(0x434, 0x108, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__SDMA_DEBUG_PC_12           = IOMUX_PAD(0x434, 0x108, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__EMI_EMI_DEBUG_47           = IOMUX_PAD(0x434, 0x108, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT18__TPIU_TRACE_15              = IOMUX_PAD(0x434, 0x108, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__IPU_CSI0_D_19              = IOMUX_PAD(0x438, 0x10C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__GPIO6_5                    = IOMUX_PAD(0x438, 0x10C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__UART5_CTS                  = IOMUX_PAD(0x438, 0x10C, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__USBOH3_USBH3_DATA_7        = IOMUX_PAD(0x438, 0x10C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__SDMA_DEBUG_PC_13           = IOMUX_PAD(0x438, 0x10C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__EMI_EMI_DEBUG_48           = IOMUX_PAD(0x438, 0x10C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_CSI0_DAT19__USBPHY2_BISTOK             = IOMUX_PAD(0x438, 0x10C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__EMI_WEIM_A_25                 = IOMUX_PAD(0x458, 0x110, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__GPIO5_2                       = IOMUX_PAD(0x458, 0x110, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__ECSPI2_RDY                    = IOMUX_PAD(0x458, 0x110, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__IPU_DI1_PIN12                 = IOMUX_PAD(0x458, 0x110, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__CSPI_SS1                      = IOMUX_PAD(0x458, 0x110, 4, 0x790, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__IPU_DI0_D1_CS                 = IOMUX_PAD(0x458, 0x110, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A25__USBPHY1_BISTOK                = IOMUX_PAD(0x458, 0x110, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__EMI_WEIM_EB_2                 = IOMUX_PAD(0x45C, 0x114, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__GPIO2_30                      = IOMUX_PAD(0x45C, 0x114, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__CCM_DI1_EXT_CLK               = IOMUX_PAD(0x45C, 0x114, 2, 0x76C, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__IPU_SER_DISP1_CS              = IOMUX_PAD(0x45C, 0x114, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__ECSPI1_SS0                    = IOMUX_PAD(0x45C, 0x114, 4, 0x7A8, 3, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB2__I2C2_SCL                      = IOMUX_PAD(0x45C, 0x114, 5 | IOMUX_CONFIG_SION, 0x81C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__EMI_WEIM_D_16                 = IOMUX_PAD(0x460, 0x118, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__GPIO3_16                      = IOMUX_PAD(0x460, 0x118, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__IPU_DI0_PIN5                  = IOMUX_PAD(0x460, 0x118, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__IPU_DISPB1_SER_CLK            = IOMUX_PAD(0x460, 0x118, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__ECSPI1_SCLK                   = IOMUX_PAD(0x460, 0x118, 4, 0x79C, 3, NO_PAD_CTRL),
+       MX53_PAD_EIM_D16__I2C2_SDA                      = IOMUX_PAD(0x460, 0x118, 5 | IOMUX_CONFIG_SION, 0x820, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__EMI_WEIM_D_17                 = IOMUX_PAD(0x464, 0x11C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__GPIO3_17                      = IOMUX_PAD(0x464, 0x11C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__IPU_DI0_PIN6                  = IOMUX_PAD(0x464, 0x11C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__IPU_DISPB1_SER_DIN            = IOMUX_PAD(0x464, 0x11C, 3, 0x830, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__ECSPI1_MISO                   = IOMUX_PAD(0x464, 0x11C, 4, 0x7A0, 3, NO_PAD_CTRL),
+       MX53_PAD_EIM_D17__I2C3_SCL                      = IOMUX_PAD(0x464, 0x11C, 5 | IOMUX_CONFIG_SION, 0x824, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__EMI_WEIM_D_18                 = IOMUX_PAD(0x468, 0x120, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__GPIO3_18                      = IOMUX_PAD(0x468, 0x120, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__IPU_DI0_PIN7                  = IOMUX_PAD(0x468, 0x120, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__IPU_DISPB1_SER_DIO            = IOMUX_PAD(0x468, 0x120, 3, 0x830, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__ECSPI1_MOSI                   = IOMUX_PAD(0x468, 0x120, 4, 0x7A4, 3, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__I2C3_SDA                      = IOMUX_PAD(0x468, 0x120, 5 | IOMUX_CONFIG_SION, 0x828, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D18__IPU_DI1_D0_CS                 = IOMUX_PAD(0x468, 0x120, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__EMI_WEIM_D_19                 = IOMUX_PAD(0x46C, 0x124, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__GPIO3_19                      = IOMUX_PAD(0x46C, 0x124, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__IPU_DI0_PIN8                  = IOMUX_PAD(0x46C, 0x124, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__IPU_DISPB1_SER_RS             = IOMUX_PAD(0x46C, 0x124, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__ECSPI1_SS1                    = IOMUX_PAD(0x46C, 0x124, 4, 0x7AC, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__EPIT1_EPITO                   = IOMUX_PAD(0x46C, 0x124, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D19__UART1_CTS                     = IOMUX_PAD(0x46C, 0x124, 6, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D19__USBOH3_USBH2_OC               = IOMUX_PAD(0x46C, 0x124, 7, 0x8A4, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__EMI_WEIM_D_20                 = IOMUX_PAD(0x470, 0x128, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__GPIO3_20                      = IOMUX_PAD(0x470, 0x128, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__IPU_DI0_PIN16                 = IOMUX_PAD(0x470, 0x128, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__IPU_SER_DISP0_CS              = IOMUX_PAD(0x470, 0x128, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__CSPI_SS0                      = IOMUX_PAD(0x470, 0x128, 4, 0x78C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__EPIT2_EPITO                   = IOMUX_PAD(0x470, 0x128, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D20__UART1_RTS                     = IOMUX_PAD(0x470, 0x128, 6, 0x874, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D20__USBOH3_USBH2_PWR              = IOMUX_PAD(0x470, 0x128, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__EMI_WEIM_D_21                 = IOMUX_PAD(0x474, 0x12C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__GPIO3_21                      = IOMUX_PAD(0x474, 0x12C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__IPU_DI0_PIN17                 = IOMUX_PAD(0x474, 0x12C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__IPU_DISPB0_SER_CLK            = IOMUX_PAD(0x474, 0x12C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__CSPI_SCLK                     = IOMUX_PAD(0x474, 0x12C, 4, 0x780, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__I2C1_SCL                      = IOMUX_PAD(0x474, 0x12C, 5 | IOMUX_CONFIG_SION, 0x814, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D21__USBOH3_USBOTG_OC              = IOMUX_PAD(0x474, 0x12C, 6, 0x89C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__EMI_WEIM_D_22                 = IOMUX_PAD(0x478, 0x130, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__GPIO3_22                      = IOMUX_PAD(0x478, 0x130, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__IPU_DI0_PIN1                  = IOMUX_PAD(0x478, 0x130, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__IPU_DISPB0_SER_DIN            = IOMUX_PAD(0x478, 0x130, 3, 0x82C, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__CSPI_MISO                     = IOMUX_PAD(0x478, 0x130, 4, 0x784, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D22__USBOH3_USBOTG_PWR             = IOMUX_PAD(0x478, 0x130, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__EMI_WEIM_D_23                 = IOMUX_PAD(0x47C, 0x134, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__GPIO3_23                      = IOMUX_PAD(0x47C, 0x134, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__UART3_CTS                     = IOMUX_PAD(0x47C, 0x134, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D23__UART1_DCD                     = IOMUX_PAD(0x47C, 0x134, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__IPU_DI0_D0_CS                 = IOMUX_PAD(0x47C, 0x134, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__IPU_DI1_PIN2                  = IOMUX_PAD(0x47C, 0x134, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__IPU_CSI1_DATA_EN              = IOMUX_PAD(0x47C, 0x134, 6, 0x834, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D23__IPU_DI1_PIN14                 = IOMUX_PAD(0x47C, 0x134, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__EMI_WEIM_EB_3                 = IOMUX_PAD(0x480, 0x138, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__GPIO2_31                      = IOMUX_PAD(0x480, 0x138, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__UART3_RTS                     = IOMUX_PAD(0x480, 0x138, 2, 0x884, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_EB3__UART1_RI                      = IOMUX_PAD(0x480, 0x138, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__IPU_DI1_PIN3                  = IOMUX_PAD(0x480, 0x138, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__IPU_CSI1_HSYNC                = IOMUX_PAD(0x480, 0x138, 6, 0x838, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB3__IPU_DI1_PIN16                 = IOMUX_PAD(0x480, 0x138, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__EMI_WEIM_D_24                 = IOMUX_PAD(0x484, 0x13C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__GPIO3_24                      = IOMUX_PAD(0x484, 0x13C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__UART3_TXD_MUX                 = IOMUX_PAD(0x484, 0x13C, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D24__ECSPI1_SS2                    = IOMUX_PAD(0x484, 0x13C, 3, 0x7B0, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__CSPI_SS2                      = IOMUX_PAD(0x484, 0x13C, 4, 0x794, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__AUDMUX_AUD5_RXFS              = IOMUX_PAD(0x484, 0x13C, 5, 0x754, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__ECSPI2_SS2                    = IOMUX_PAD(0x484, 0x13C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D24__UART1_DTR                     = IOMUX_PAD(0x484, 0x13C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__EMI_WEIM_D_25                 = IOMUX_PAD(0x488, 0x140, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__GPIO3_25                      = IOMUX_PAD(0x488, 0x140, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__UART3_RXD_MUX                 = IOMUX_PAD(0x488, 0x140, 2, 0x888, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D25__ECSPI1_SS3                    = IOMUX_PAD(0x488, 0x140, 3, 0x7B4, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__CSPI_SS3                      = IOMUX_PAD(0x488, 0x140, 4, 0x798, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__AUDMUX_AUD5_RXC               = IOMUX_PAD(0x488, 0x140, 5, 0x750, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__ECSPI2_SS3                    = IOMUX_PAD(0x488, 0x140, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D25__UART1_DSR                     = IOMUX_PAD(0x488, 0x140, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__EMI_WEIM_D_26                 = IOMUX_PAD(0x48C, 0x144, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__GPIO3_26                      = IOMUX_PAD(0x48C, 0x144, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__UART2_TXD_MUX                 = IOMUX_PAD(0x48C, 0x144, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D26__FIRI_RXD                      = IOMUX_PAD(0x48C, 0x144, 3, 0x80C, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__IPU_CSI0_D_1                  = IOMUX_PAD(0x48C, 0x144, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__IPU_DI1_PIN11                 = IOMUX_PAD(0x48C, 0x144, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__IPU_SISG_2                    = IOMUX_PAD(0x48C, 0x144, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D26__IPU_DISP1_DAT_22              = IOMUX_PAD(0x48C, 0x144, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__EMI_WEIM_D_27                 = IOMUX_PAD(0x490, 0x148, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__GPIO3_27                      = IOMUX_PAD(0x490, 0x148, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__UART2_RXD_MUX                 = IOMUX_PAD(0x490, 0x148, 2, 0x880, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D27__FIRI_TXD                      = IOMUX_PAD(0x490, 0x148, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__IPU_CSI0_D_0                  = IOMUX_PAD(0x490, 0x148, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__IPU_DI1_PIN13                 = IOMUX_PAD(0x490, 0x148, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__IPU_SISG_3                    = IOMUX_PAD(0x490, 0x148, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D27__IPU_DISP1_DAT_23              = IOMUX_PAD(0x490, 0x148, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__EMI_WEIM_D_28                 = IOMUX_PAD(0x494, 0x14C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__GPIO3_28                      = IOMUX_PAD(0x494, 0x14C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__UART2_CTS                     = IOMUX_PAD(0x494, 0x14C, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D28__IPU_DISPB0_SER_DIO            = IOMUX_PAD(0x494, 0x14C, 3, 0x82C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__CSPI_MOSI                     = IOMUX_PAD(0x494, 0x14C, 4, 0x788, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__I2C1_SDA                      = IOMUX_PAD(0x494, 0x14C, 5 | IOMUX_CONFIG_SION, 0x818, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__IPU_EXT_TRIG                  = IOMUX_PAD(0x494, 0x14C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D28__IPU_DI0_PIN13                 = IOMUX_PAD(0x494, 0x14C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__EMI_WEIM_D_29                 = IOMUX_PAD(0x498, 0x150, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__GPIO3_29                      = IOMUX_PAD(0x498, 0x150, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__UART2_RTS                     = IOMUX_PAD(0x498, 0x150, 2, 0x87C, 1, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D29__IPU_DISPB0_SER_RS             = IOMUX_PAD(0x498, 0x150, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__CSPI_SS0                      = IOMUX_PAD(0x498, 0x150, 4, 0x78C, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__IPU_DI1_PIN15                 = IOMUX_PAD(0x498, 0x150, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__IPU_CSI1_VSYNC                = IOMUX_PAD(0x498, 0x150, 6, 0x83C, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D29__IPU_DI0_PIN14                 = IOMUX_PAD(0x498, 0x150, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__EMI_WEIM_D_30                 = IOMUX_PAD(0x49C, 0x154, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__GPIO3_30                      = IOMUX_PAD(0x49C, 0x154, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__UART3_CTS                     = IOMUX_PAD(0x49C, 0x154, 2, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D30__IPU_CSI0_D_3                  = IOMUX_PAD(0x49C, 0x154, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__IPU_DI0_PIN11                 = IOMUX_PAD(0x49C, 0x154, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__IPU_DISP1_DAT_21              = IOMUX_PAD(0x49C, 0x154, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__USBOH3_USBH1_OC               = IOMUX_PAD(0x49C, 0x154, 6, 0x8A0, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D30__USBOH3_USBH2_OC               = IOMUX_PAD(0x49C, 0x154, 7, 0x8A4, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__EMI_WEIM_D_31                 = IOMUX_PAD(0x4A0, 0x158, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__GPIO3_31                      = IOMUX_PAD(0x4A0, 0x158, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__UART3_RTS                     = IOMUX_PAD(0x4A0, 0x158, 2, 0x884, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_EIM_D31__IPU_CSI0_D_2                  = IOMUX_PAD(0x4A0, 0x158, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__IPU_DI0_PIN12                 = IOMUX_PAD(0x4A0, 0x158, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__IPU_DISP1_DAT_20              = IOMUX_PAD(0x4A0, 0x158, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__USBOH3_USBH1_PWR              = IOMUX_PAD(0x4A0, 0x158, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_D31__USBOH3_USBH2_PWR              = IOMUX_PAD(0x4A0, 0x158, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__EMI_WEIM_A_24                 = IOMUX_PAD(0x4A8, 0x15C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__GPIO5_4                       = IOMUX_PAD(0x4A8, 0x15C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__IPU_DISP1_DAT_19              = IOMUX_PAD(0x4A8, 0x15C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__IPU_CSI1_D_19                 = IOMUX_PAD(0x4A8, 0x15C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__IPU_SISG_2                    = IOMUX_PAD(0x4A8, 0x15C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A24__USBPHY2_BVALID                = IOMUX_PAD(0x4A8, 0x15C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__EMI_WEIM_A_23                 = IOMUX_PAD(0x4AC, 0x160, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__GPIO6_6                       = IOMUX_PAD(0x4AC, 0x160, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__IPU_DISP1_DAT_18              = IOMUX_PAD(0x4AC, 0x160, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__IPU_CSI1_D_18                 = IOMUX_PAD(0x4AC, 0x160, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__IPU_SISG_3                    = IOMUX_PAD(0x4AC, 0x160, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A23__USBPHY2_ENDSESSION            = IOMUX_PAD(0x4AC, 0x160, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A22__EMI_WEIM_A_22                 = IOMUX_PAD(0x4B0, 0x164, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A22__GPIO2_16                      = IOMUX_PAD(0x4B0, 0x164, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A22__IPU_DISP1_DAT_17              = IOMUX_PAD(0x4B0, 0x164, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A22__IPU_CSI1_D_17                 = IOMUX_PAD(0x4B0, 0x164, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A22__SRC_BT_CFG1_7                 = IOMUX_PAD(0x4B0, 0x164, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A21__EMI_WEIM_A_21                 = IOMUX_PAD(0x4B4, 0x168, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A21__GPIO2_17                      = IOMUX_PAD(0x4B4, 0x168, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A21__IPU_DISP1_DAT_16              = IOMUX_PAD(0x4B4, 0x168, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A21__IPU_CSI1_D_16                 = IOMUX_PAD(0x4B4, 0x168, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A21__SRC_BT_CFG1_6                 = IOMUX_PAD(0x4B4, 0x168, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A20__EMI_WEIM_A_20                 = IOMUX_PAD(0x4B8, 0x16C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A20__GPIO2_18                      = IOMUX_PAD(0x4B8, 0x16C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A20__IPU_DISP1_DAT_15              = IOMUX_PAD(0x4B8, 0x16C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A20__IPU_CSI1_D_15                 = IOMUX_PAD(0x4B8, 0x16C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A20__SRC_BT_CFG1_5                 = IOMUX_PAD(0x4B8, 0x16C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A19__EMI_WEIM_A_19                 = IOMUX_PAD(0x4BC, 0x170, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A19__GPIO2_19                      = IOMUX_PAD(0x4BC, 0x170, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A19__IPU_DISP1_DAT_14              = IOMUX_PAD(0x4BC, 0x170, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A19__IPU_CSI1_D_14                 = IOMUX_PAD(0x4BC, 0x170, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A19__SRC_BT_CFG1_4                 = IOMUX_PAD(0x4BC, 0x170, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A18__EMI_WEIM_A_18                 = IOMUX_PAD(0x4C0, 0x174, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A18__GPIO2_20                      = IOMUX_PAD(0x4C0, 0x174, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A18__IPU_DISP1_DAT_13              = IOMUX_PAD(0x4C0, 0x174, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A18__IPU_CSI1_D_13                 = IOMUX_PAD(0x4C0, 0x174, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A18__SRC_BT_CFG1_3                 = IOMUX_PAD(0x4C0, 0x174, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A17__EMI_WEIM_A_17                 = IOMUX_PAD(0x4C4, 0x178, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A17__GPIO2_21                      = IOMUX_PAD(0x4C4, 0x178, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A17__IPU_DISP1_DAT_12              = IOMUX_PAD(0x4C4, 0x178, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A17__IPU_CSI1_D_12                 = IOMUX_PAD(0x4C4, 0x178, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A17__SRC_BT_CFG1_2                 = IOMUX_PAD(0x4C4, 0x178, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A16__EMI_WEIM_A_16                 = IOMUX_PAD(0x4C8, 0x17C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A16__GPIO2_22                      = IOMUX_PAD(0x4C8, 0x17C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A16__IPU_DI1_DISP_CLK              = IOMUX_PAD(0x4C8, 0x17C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A16__IPU_CSI1_PIXCLK               = IOMUX_PAD(0x4C8, 0x17C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_A16__SRC_BT_CFG1_1                 = IOMUX_PAD(0x4C8, 0x17C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS0__EMI_WEIM_CS_0                 = IOMUX_PAD(0x4CC, 0x180, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS0__GPIO2_23                      = IOMUX_PAD(0x4CC, 0x180, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS0__ECSPI2_SCLK                   = IOMUX_PAD(0x4CC, 0x180, 2, 0x7B8, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS0__IPU_DI1_PIN5                  = IOMUX_PAD(0x4CC, 0x180, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS1__EMI_WEIM_CS_1                 = IOMUX_PAD(0x4D0, 0x184, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS1__GPIO2_24                      = IOMUX_PAD(0x4D0, 0x184, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS1__ECSPI2_MOSI                   = IOMUX_PAD(0x4D0, 0x184, 2, 0x7C0, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_CS1__IPU_DI1_PIN6                  = IOMUX_PAD(0x4D0, 0x184, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_OE__EMI_WEIM_OE                    = IOMUX_PAD(0x4D4, 0x188, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_OE__GPIO2_25                       = IOMUX_PAD(0x4D4, 0x188, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_OE__ECSPI2_MISO                    = IOMUX_PAD(0x4D4, 0x188, 2, 0x7BC, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_OE__IPU_DI1_PIN7                   = IOMUX_PAD(0x4D4, 0x188, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_OE__USBPHY2_IDDIG                  = IOMUX_PAD(0x4D4, 0x188, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_RW__EMI_WEIM_RW                    = IOMUX_PAD(0x4D8, 0x18C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_RW__GPIO2_26                       = IOMUX_PAD(0x4D8, 0x18C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_RW__ECSPI2_SS0                     = IOMUX_PAD(0x4D8, 0x18C, 2, 0x7C4, 2, NO_PAD_CTRL),
+       MX53_PAD_EIM_RW__IPU_DI1_PIN8                   = IOMUX_PAD(0x4D8, 0x18C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_RW__USBPHY2_HOSTDISCONNECT         = IOMUX_PAD(0x4D8, 0x18C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_LBA__EMI_WEIM_LBA                  = IOMUX_PAD(0x4DC, 0x190, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_LBA__GPIO2_27                      = IOMUX_PAD(0x4DC, 0x190, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_LBA__ECSPI2_SS1                    = IOMUX_PAD(0x4DC, 0x190, 2, 0x7C8, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_LBA__IPU_DI1_PIN17                 = IOMUX_PAD(0x4DC, 0x190, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_LBA__SRC_BT_CFG1_0                 = IOMUX_PAD(0x4DC, 0x190, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__EMI_WEIM_EB_0                 = IOMUX_PAD(0x4E4, 0x194, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__GPIO2_28                      = IOMUX_PAD(0x4E4, 0x194, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__IPU_DISP1_DAT_11              = IOMUX_PAD(0x4E4, 0x194, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__IPU_CSI1_D_11                 = IOMUX_PAD(0x4E4, 0x194, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__GPC_PMIC_RDY                  = IOMUX_PAD(0x4E4, 0x194, 5, 0x810, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB0__SRC_BT_CFG2_7                 = IOMUX_PAD(0x4E4, 0x194, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB1__EMI_WEIM_EB_1                 = IOMUX_PAD(0x4E8, 0x198, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB1__GPIO2_29                      = IOMUX_PAD(0x4E8, 0x198, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB1__IPU_DISP1_DAT_10              = IOMUX_PAD(0x4E8, 0x198, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB1__IPU_CSI1_D_10                 = IOMUX_PAD(0x4E8, 0x198, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_EB1__SRC_BT_CFG2_6                 = IOMUX_PAD(0x4E8, 0x198, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0            = IOMUX_PAD(0x4EC, 0x19C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA0__GPIO3_0                       = IOMUX_PAD(0x4EC, 0x19C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA0__IPU_DISP1_DAT_9               = IOMUX_PAD(0x4EC, 0x19C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA0__IPU_CSI1_D_9                  = IOMUX_PAD(0x4EC, 0x19C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA0__SRC_BT_CFG2_5                 = IOMUX_PAD(0x4EC, 0x19C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1            = IOMUX_PAD(0x4F0, 0x1A0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA1__GPIO3_1                       = IOMUX_PAD(0x4F0, 0x1A0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA1__IPU_DISP1_DAT_8               = IOMUX_PAD(0x4F0, 0x1A0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA1__IPU_CSI1_D_8                  = IOMUX_PAD(0x4F0, 0x1A0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA1__SRC_BT_CFG2_4                 = IOMUX_PAD(0x4F0, 0x1A0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2            = IOMUX_PAD(0x4F4, 0x1A4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA2__GPIO3_2                       = IOMUX_PAD(0x4F4, 0x1A4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA2__IPU_DISP1_DAT_7               = IOMUX_PAD(0x4F4, 0x1A4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA2__IPU_CSI1_D_7                  = IOMUX_PAD(0x4F4, 0x1A4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA2__SRC_BT_CFG2_3                 = IOMUX_PAD(0x4F4, 0x1A4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3            = IOMUX_PAD(0x4F8, 0x1A8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA3__GPIO3_3                       = IOMUX_PAD(0x4F8, 0x1A8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA3__IPU_DISP1_DAT_6               = IOMUX_PAD(0x4F8, 0x1A8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA3__IPU_CSI1_D_6                  = IOMUX_PAD(0x4F8, 0x1A8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA3__SRC_BT_CFG2_2                 = IOMUX_PAD(0x4F8, 0x1A8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4            = IOMUX_PAD(0x4FC, 0x1AC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA4__GPIO3_4                       = IOMUX_PAD(0x4FC, 0x1AC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA4__IPU_DISP1_DAT_5               = IOMUX_PAD(0x4FC, 0x1AC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA4__IPU_CSI1_D_5                  = IOMUX_PAD(0x4FC, 0x1AC, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA4__SRC_BT_CFG3_7                 = IOMUX_PAD(0x4FC, 0x1AC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5            = IOMUX_PAD(0x500, 0x1B0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA5__GPIO3_5                       = IOMUX_PAD(0x500, 0x1B0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA5__IPU_DISP1_DAT_4               = IOMUX_PAD(0x500, 0x1B0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA5__IPU_CSI1_D_4                  = IOMUX_PAD(0x500, 0x1B0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA5__SRC_BT_CFG3_6                 = IOMUX_PAD(0x500, 0x1B0, 7 | IOMUX_CONFIG_SION, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6            = IOMUX_PAD(0x504, 0x1B4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA6__GPIO3_6                       = IOMUX_PAD(0x504, 0x1B4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA6__IPU_DISP1_DAT_3               = IOMUX_PAD(0x504, 0x1B4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA6__IPU_CSI1_D_3                  = IOMUX_PAD(0x504, 0x1B4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA6__SRC_BT_CFG3_5                 = IOMUX_PAD(0x504, 0x1B4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA7__EMI_NAND_WEIM_DA_7            = IOMUX_PAD(0x508, 0x1B8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA7__GPIO3_7                       = IOMUX_PAD(0x508, 0x1B8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA7__IPU_DISP1_DAT_2               = IOMUX_PAD(0x508, 0x1B8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA7__IPU_CSI1_D_2                  = IOMUX_PAD(0x508, 0x1B8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA7__SRC_BT_CFG3_4                 = IOMUX_PAD(0x508, 0x1B8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA8__EMI_NAND_WEIM_DA_8            = IOMUX_PAD(0x50C, 0x1BC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA8__GPIO3_8                       = IOMUX_PAD(0x50C, 0x1BC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA8__IPU_DISP1_DAT_1               = IOMUX_PAD(0x50C, 0x1BC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA8__IPU_CSI1_D_1                  = IOMUX_PAD(0x50C, 0x1BC, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA8__SRC_BT_CFG3_3                 = IOMUX_PAD(0x50C, 0x1BC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA9__EMI_NAND_WEIM_DA_9            = IOMUX_PAD(0x510, 0x1C0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA9__GPIO3_9                       = IOMUX_PAD(0x510, 0x1C0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA9__IPU_DISP1_DAT_0               = IOMUX_PAD(0x510, 0x1C0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA9__IPU_CSI1_D_0                  = IOMUX_PAD(0x510, 0x1C0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA9__SRC_BT_CFG3_2                 = IOMUX_PAD(0x510, 0x1C0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA10__EMI_NAND_WEIM_DA_10          = IOMUX_PAD(0x514, 0x1C4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA10__GPIO3_10                     = IOMUX_PAD(0x514, 0x1C4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA10__IPU_DI1_PIN15                = IOMUX_PAD(0x514, 0x1C4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA10__IPU_CSI1_DATA_EN             = IOMUX_PAD(0x514, 0x1C4, 4, 0x834, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA10__SRC_BT_CFG3_1                = IOMUX_PAD(0x514, 0x1C4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA11__EMI_NAND_WEIM_DA_11          = IOMUX_PAD(0x518, 0x1C8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA11__GPIO3_11                     = IOMUX_PAD(0x518, 0x1C8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA11__IPU_DI1_PIN2                 = IOMUX_PAD(0x518, 0x1C8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA11__IPU_CSI1_HSYNC               = IOMUX_PAD(0x518, 0x1C8, 4, 0x838, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA12__EMI_NAND_WEIM_DA_12          = IOMUX_PAD(0x51C, 0x1CC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA12__GPIO3_12                     = IOMUX_PAD(0x51C, 0x1CC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA12__IPU_DI1_PIN3                 = IOMUX_PAD(0x51C, 0x1CC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA12__IPU_CSI1_VSYNC               = IOMUX_PAD(0x51C, 0x1CC, 4, 0x83C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA13__EMI_NAND_WEIM_DA_13          = IOMUX_PAD(0x520, 0x1D0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA13__GPIO3_13                     = IOMUX_PAD(0x520, 0x1D0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA13__IPU_DI1_D0_CS                = IOMUX_PAD(0x520, 0x1D0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA13__CCM_DI1_EXT_CLK              = IOMUX_PAD(0x520, 0x1D0, 4, 0x76C, 1, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA14__EMI_NAND_WEIM_DA_14          = IOMUX_PAD(0x524, 0x1D4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA14__GPIO3_14                     = IOMUX_PAD(0x524, 0x1D4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA14__IPU_DI1_D1_CS                = IOMUX_PAD(0x524, 0x1D4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA14__CCM_DI0_EXT_CLK              = IOMUX_PAD(0x524, 0x1D4, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA15__EMI_NAND_WEIM_DA_15          = IOMUX_PAD(0x528, 0x1D8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA15__GPIO3_15                     = IOMUX_PAD(0x528, 0x1D8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA15__IPU_DI1_PIN1                 = IOMUX_PAD(0x528, 0x1D8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_DA15__IPU_DI1_PIN4                 = IOMUX_PAD(0x528, 0x1D8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B             = IOMUX_PAD(0x52C, 0x1DC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_WE_B__GPIO6_12                   = IOMUX_PAD(0x52C, 0x1DC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B             = IOMUX_PAD(0x530, 0x1E0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_RE_B__GPIO6_13                   = IOMUX_PAD(0x530, 0x1E0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_WAIT__EMI_WEIM_WAIT                = IOMUX_PAD(0x534, 0x1E4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_WAIT__GPIO5_0                      = IOMUX_PAD(0x534, 0x1E4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_EIM_WAIT__EMI_WEIM_DTACK_B             = IOMUX_PAD(0x534, 0x1E4, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX3_P__GPIO6_22                  = IOMUX_PAD(__NA_, 0x1EC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX3_P__LDB_LVDS1_TX3             = IOMUX_PAD(__NA_, 0x1EC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX2_P__GPIO6_24                  = IOMUX_PAD(__NA_, 0x1F0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX2_P__LDB_LVDS1_TX2             = IOMUX_PAD(__NA_, 0x1F0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_CLK_P__GPIO6_26                  = IOMUX_PAD(__NA_, 0x1F4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_CLK_P__LDB_LVDS1_CLK             = IOMUX_PAD(__NA_, 0x1F4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX1_P__GPIO6_28                  = IOMUX_PAD(__NA_, 0x1F8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX1_P__LDB_LVDS1_TX1             = IOMUX_PAD(__NA_, 0x1F8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX0_P__GPIO6_30                  = IOMUX_PAD(__NA_, 0x1FC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS1_TX0_P__LDB_LVDS1_TX0             = IOMUX_PAD(__NA_, 0x1FC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX3_P__GPIO7_22                  = IOMUX_PAD(__NA_, 0x200, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX3_P__LDB_LVDS0_TX3             = IOMUX_PAD(__NA_, 0x200, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_CLK_P__GPIO7_24                  = IOMUX_PAD(__NA_, 0x204, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_CLK_P__LDB_LVDS0_CLK             = IOMUX_PAD(__NA_, 0x204, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX2_P__GPIO7_26                  = IOMUX_PAD(__NA_, 0x208, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX2_P__LDB_LVDS0_TX2             = IOMUX_PAD(__NA_, 0x208, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX1_P__GPIO7_28                  = IOMUX_PAD(__NA_, 0x20C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX1_P__LDB_LVDS0_TX1             = IOMUX_PAD(__NA_, 0x20C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX0_P__GPIO7_30                  = IOMUX_PAD(__NA_, 0x210, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_LVDS0_TX0_P__LDB_LVDS0_TX0             = IOMUX_PAD(__NA_, 0x210, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_10__GPIO4_0                       = IOMUX_PAD(0x540, 0x214, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_10__OSC32k_32K_OUT                = IOMUX_PAD(0x540, 0x214, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_11__GPIO4_1                       = IOMUX_PAD(0x544, 0x218, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_12__GPIO4_2                       = IOMUX_PAD(0x548, 0x21C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_13__GPIO4_3                       = IOMUX_PAD(0x54C, 0x220, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_14__GPIO4_4                       = IOMUX_PAD(0x550, 0x224, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CLE__EMI_NANDF_CLE               = IOMUX_PAD(0x5A0, 0x228, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CLE__GPIO6_7                     = IOMUX_PAD(0x5A0, 0x228, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CLE__USBPHY1_VSTATUS_0           = IOMUX_PAD(0x5A0, 0x228, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_ALE__EMI_NANDF_ALE               = IOMUX_PAD(0x5A4, 0x22C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_ALE__GPIO6_8                     = IOMUX_PAD(0x5A4, 0x22C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_ALE__USBPHY1_VSTATUS_1           = IOMUX_PAD(0x5A4, 0x22C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B             = IOMUX_PAD(0x5A8, 0x230, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_WP_B__GPIO6_9                    = IOMUX_PAD(0x5A8, 0x230, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_WP_B__USBPHY1_VSTATUS_2          = IOMUX_PAD(0x5A8, 0x230, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0              = IOMUX_PAD(0x5AC, 0x234, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_RB0__GPIO6_10                    = IOMUX_PAD(0x5AC, 0x234, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_RB0__USBPHY1_VSTATUS_3           = IOMUX_PAD(0x5AC, 0x234, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0              = IOMUX_PAD(0x5B0, 0x238, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS0__GPIO6_11                    = IOMUX_PAD(0x5B0, 0x238, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS0__USBPHY1_VSTATUS_4           = IOMUX_PAD(0x5B0, 0x238, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS1__EMI_NANDF_CS_1              = IOMUX_PAD(0x5B4, 0x23C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS1__GPIO6_14                    = IOMUX_PAD(0x5B4, 0x23C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS1__MLB_MLBCLK                  = IOMUX_PAD(0x5B4, 0x23C, 6, 0x858, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS1__USBPHY1_VSTATUS_5           = IOMUX_PAD(0x5B4, 0x23C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__EMI_NANDF_CS_2              = IOMUX_PAD(0x5B8, 0x240, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__GPIO6_15                    = IOMUX_PAD(0x5B8, 0x240, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__IPU_SISG_0                  = IOMUX_PAD(0x5B8, 0x240, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__ESAI1_TX0                   = IOMUX_PAD(0x5B8, 0x240, 3, 0x7E4, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__EMI_WEIM_CRE                = IOMUX_PAD(0x5B8, 0x240, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__CCM_CSI0_MCLK               = IOMUX_PAD(0x5B8, 0x240, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__MLB_MLBSIG                  = IOMUX_PAD(0x5B8, 0x240, 6, 0x860, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS2__USBPHY1_VSTATUS_6           = IOMUX_PAD(0x5B8, 0x240, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__EMI_NANDF_CS_3              = IOMUX_PAD(0x5BC, 0x244, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__GPIO6_16                    = IOMUX_PAD(0x5BC, 0x244, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__IPU_SISG_1                  = IOMUX_PAD(0x5BC, 0x244, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__ESAI1_TX1                   = IOMUX_PAD(0x5BC, 0x244, 3, 0x7E8, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__EMI_WEIM_A_26               = IOMUX_PAD(0x5BC, 0x244, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__MLB_MLBDAT                  = IOMUX_PAD(0x5BC, 0x244, 6, 0x85C, 0, NO_PAD_CTRL),
+       MX53_PAD_NANDF_CS3__USBPHY1_VSTATUS_7           = IOMUX_PAD(0x5BC, 0x244, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__FEC_MDIO                     = IOMUX_PAD(0x5C4, 0x248, 0, 0x804, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__GPIO1_22                     = IOMUX_PAD(0x5C4, 0x248, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__ESAI1_SCKR                   = IOMUX_PAD(0x5C4, 0x248, 2, 0x7DC, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__FEC_COL                      = IOMUX_PAD(0x5C4, 0x248, 3, 0x800, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__RTC_CE_RTC_PS2               = IOMUX_PAD(0x5C4, 0x248, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__SDMA_DEBUG_BUS_DEVICE_3      = IOMUX_PAD(0x5C4, 0x248, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDIO__EMI_EMI_DEBUG_49             = IOMUX_PAD(0x5C4, 0x248, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_REF_CLK__FEC_TX_CLK                = IOMUX_PAD(0x5C8, 0x24C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_REF_CLK__GPIO1_23                  = IOMUX_PAD(0x5C8, 0x24C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_REF_CLK__ESAI1_FSR                 = IOMUX_PAD(0x5C8, 0x24C, 2, 0x7CC, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_REF_CLK__SDMA_DEBUG_BUS_DEVICE_4   = IOMUX_PAD(0x5C8, 0x24C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_REF_CLK__EMI_EMI_DEBUG_50          = IOMUX_PAD(0x5C8, 0x24C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RX_ER__FEC_RX_ER                   = IOMUX_PAD(0x5CC, 0x250, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RX_ER__GPIO1_24                    = IOMUX_PAD(0x5CC, 0x250, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RX_ER__ESAI1_HCKR                  = IOMUX_PAD(0x5CC, 0x250, 2, 0x7D4, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RX_ER__FEC_RX_CLK                  = IOMUX_PAD(0x5CC, 0x250, 3, 0x808, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_RX_ER__RTC_CE_RTC_PS3              = IOMUX_PAD(0x5CC, 0x250, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_CRS_DV__FEC_RX_DV                  = IOMUX_PAD(0x5D0, 0x254, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_CRS_DV__GPIO1_25                   = IOMUX_PAD(0x5D0, 0x254, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_CRS_DV__ESAI1_SCKT                 = IOMUX_PAD(0x5D0, 0x254, 2, 0x7E0, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD1__FEC_RDATA_1                  = IOMUX_PAD(0x5D4, 0x258, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD1__GPIO1_26                     = IOMUX_PAD(0x5D4, 0x258, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD1__ESAI1_FST                    = IOMUX_PAD(0x5D4, 0x258, 2, 0x7D0, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD1__MLB_MLBSIG                   = IOMUX_PAD(0x5D4, 0x258, 3, 0x860, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD1__RTC_CE_RTC_PS1               = IOMUX_PAD(0x5D4, 0x258, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD0__FEC_RDATA_0                  = IOMUX_PAD(0x5D8, 0x25C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD0__GPIO1_27                     = IOMUX_PAD(0x5D8, 0x25C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD0__ESAI1_HCKT                   = IOMUX_PAD(0x5D8, 0x25C, 2, 0x7D8, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_RXD0__OSC32k_32K_OUT               = IOMUX_PAD(0x5D8, 0x25C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TX_EN__FEC_TX_EN                   = IOMUX_PAD(0x5DC, 0x260, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TX_EN__GPIO1_28                    = IOMUX_PAD(0x5DC, 0x260, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TX_EN__ESAI1_TX3_RX2               = IOMUX_PAD(0x5DC, 0x260, 2, 0x7F0, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD1__FEC_TDATA_1                  = IOMUX_PAD(0x5E0, 0x264, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD1__GPIO1_29                     = IOMUX_PAD(0x5E0, 0x264, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD1__ESAI1_TX2_RX3                = IOMUX_PAD(0x5E0, 0x264, 2, 0x7EC, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD1__MLB_MLBCLK                   = IOMUX_PAD(0x5E0, 0x264, 3, 0x858, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD1__RTC_CE_RTC_PRSC_CLK          = IOMUX_PAD(0x5E0, 0x264, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD0__FEC_TDATA_0                  = IOMUX_PAD(0x5E4, 0x268, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD0__GPIO1_30                     = IOMUX_PAD(0x5E4, 0x268, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD0__ESAI1_TX4_RX1                = IOMUX_PAD(0x5E4, 0x268, 2, 0x7F4, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_TXD0__USBPHY2_DATAOUT_0            = IOMUX_PAD(0x5E4, 0x268, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__FEC_MDC                       = IOMUX_PAD(0x5E8, 0x26C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__GPIO1_31                      = IOMUX_PAD(0x5E8, 0x26C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__ESAI1_TX5_RX0                 = IOMUX_PAD(0x5E8, 0x26C, 2, 0x7F8, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__MLB_MLBDAT                    = IOMUX_PAD(0x5E8, 0x26C, 3, 0x85C, 1, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__RTC_CE_RTC_ALARM1_TRIG        = IOMUX_PAD(0x5E8, 0x26C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_FEC_MDC__USBPHY2_DATAOUT_1             = IOMUX_PAD(0x5E8, 0x26C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOW__PATA_DIOW                   = IOMUX_PAD(0x5F0, 0x270, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOW__GPIO6_17                    = IOMUX_PAD(0x5F0, 0x270, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOW__UART1_TXD_MUX               = IOMUX_PAD(0x5F0, 0x270, 3, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DIOW__USBPHY2_DATAOUT_2           = IOMUX_PAD(0x5F0, 0x270, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMACK__PATA_DMACK                 = IOMUX_PAD(0x5F4, 0x274, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMACK__GPIO6_18                   = IOMUX_PAD(0x5F4, 0x274, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMACK__UART1_RXD_MUX              = IOMUX_PAD(0x5F4, 0x274, 3, 0x878, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DMACK__USBPHY2_DATAOUT_3          = IOMUX_PAD(0x5F4, 0x274, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMARQ__PATA_DMARQ                 = IOMUX_PAD(0x5F8, 0x278, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMARQ__GPIO7_0                    = IOMUX_PAD(0x5F8, 0x278, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMARQ__UART2_TXD_MUX              = IOMUX_PAD(0x5F8, 0x278, 3, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DMARQ__CCM_CCM_OUT_0              = IOMUX_PAD(0x5F8, 0x278, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DMARQ__USBPHY2_DATAOUT_4          = IOMUX_PAD(0x5F8, 0x278, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_BUFFER_EN__PATA_BUFFER_EN         = IOMUX_PAD(0x5FC, 0x27C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_BUFFER_EN__GPIO7_1                = IOMUX_PAD(0x5FC, 0x27C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX          = IOMUX_PAD(0x5FC, 0x27C, 3, 0x880, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_BUFFER_EN__CCM_CCM_OUT_1          = IOMUX_PAD(0x5FC, 0x27C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_BUFFER_EN__USBPHY2_DATAOUT_5      = IOMUX_PAD(0x5FC, 0x27C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__PATA_INTRQ                 = IOMUX_PAD(0x600, 0x280, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__GPIO7_2                    = IOMUX_PAD(0x600, 0x280, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__UART2_CTS                  = IOMUX_PAD(0x600, 0x280, 3, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__CAN1_TXCAN                 = IOMUX_PAD(0x600, 0x280, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__CCM_CCM_OUT_2              = IOMUX_PAD(0x600, 0x280, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_INTRQ__USBPHY2_DATAOUT_6          = IOMUX_PAD(0x600, 0x280, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOR__PATA_DIOR                   = IOMUX_PAD(0x604, 0x284, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOR__GPIO7_3                     = IOMUX_PAD(0x604, 0x284, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOR__UART2_RTS                   = IOMUX_PAD(0x604, 0x284, 3, 0x87C, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DIOR__CAN1_RXCAN                  = IOMUX_PAD(0x604, 0x284, 4, 0x760, 1, NO_PAD_CTRL),
+       MX53_PAD_PATA_DIOR__USBPHY2_DATAOUT_7           = IOMUX_PAD(0x604, 0x284, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__PATA_PATA_RESET_B        = IOMUX_PAD(0x608, 0x288, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__GPIO7_4                  = IOMUX_PAD(0x608, 0x288, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__ESDHC3_CMD               = IOMUX_PAD(0x608, 0x288, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__UART1_CTS                = IOMUX_PAD(0x608, 0x288, 3, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__CAN2_TXCAN               = IOMUX_PAD(0x608, 0x288, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_RESET_B__USBPHY1_DATAOUT_0        = IOMUX_PAD(0x608, 0x288, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__PATA_IORDY                 = IOMUX_PAD(0x60C, 0x28C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__GPIO7_5                    = IOMUX_PAD(0x60C, 0x28C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__ESDHC3_CLK                 = IOMUX_PAD(0x60C, 0x28C, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__UART1_RTS                  = IOMUX_PAD(0x60C, 0x28C, 3, 0x874, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__CAN2_RXCAN                 = IOMUX_PAD(0x60C, 0x28C, 4, 0x764, 1, NO_PAD_CTRL),
+       MX53_PAD_PATA_IORDY__USBPHY1_DATAOUT_1          = IOMUX_PAD(0x60C, 0x28C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_0__PATA_DA_0                   = IOMUX_PAD(0x610, 0x290, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_0__GPIO7_6                     = IOMUX_PAD(0x610, 0x290, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_0__ESDHC3_RST                  = IOMUX_PAD(0x610, 0x290, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_0__OWIRE_LINE                  = IOMUX_PAD(0x610, 0x290, 4, 0x864, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_0__USBPHY1_DATAOUT_2           = IOMUX_PAD(0x610, 0x290, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_1__PATA_DA_1                   = IOMUX_PAD(0x614, 0x294, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_1__GPIO7_7                     = IOMUX_PAD(0x614, 0x294, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_1__ESDHC4_CMD                  = IOMUX_PAD(0x614, 0x294, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DA_1__UART3_CTS                   = IOMUX_PAD(0x614, 0x294, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DA_1__USBPHY1_DATAOUT_3           = IOMUX_PAD(0x614, 0x294, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_2__PATA_DA_2                   = IOMUX_PAD(0x618, 0x298, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_2__GPIO7_8                     = IOMUX_PAD(0x618, 0x298, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DA_2__ESDHC4_CLK                  = IOMUX_PAD(0x618, 0x298, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DA_2__UART3_RTS                   = IOMUX_PAD(0x618, 0x298, 4, 0x884, 5, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_DA_2__USBPHY1_DATAOUT_4           = IOMUX_PAD(0x618, 0x298, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_0__PATA_CS_0                   = IOMUX_PAD(0x61C, 0x29C, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_0__GPIO7_9                     = IOMUX_PAD(0x61C, 0x29C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_0__UART3_TXD_MUX               = IOMUX_PAD(0x61C, 0x29C, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_CS_0__USBPHY1_DATAOUT_5           = IOMUX_PAD(0x61C, 0x29C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_1__PATA_CS_1                   = IOMUX_PAD(0x620, 0x2A0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_1__GPIO7_10                    = IOMUX_PAD(0x620, 0x2A0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_CS_1__UART3_RXD_MUX               = IOMUX_PAD(0x620, 0x2A0, 4, 0x888, 3, MX53_UART_PAD_CTRL),
+       MX53_PAD_PATA_CS_1__USBPHY1_DATAOUT_6           = IOMUX_PAD(0x620, 0x2A0, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__PATA_DATA_0                = IOMUX_PAD(0x628, 0x2A4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__GPIO2_0                    = IOMUX_PAD(0x628, 0x2A4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__EMI_NANDF_D_0              = IOMUX_PAD(0x628, 0x2A4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__ESDHC3_DAT4                = IOMUX_PAD(0x628, 0x2A4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__GPU3d_GPU_DEBUG_OUT_0      = IOMUX_PAD(0x628, 0x2A4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__IPU_DIAG_BUS_0             = IOMUX_PAD(0x628, 0x2A4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA0__USBPHY1_DATAOUT_7          = IOMUX_PAD(0x628, 0x2A4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__PATA_DATA_1                = IOMUX_PAD(0x62C, 0x2A8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__GPIO2_1                    = IOMUX_PAD(0x62C, 0x2A8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__EMI_NANDF_D_1              = IOMUX_PAD(0x62C, 0x2A8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__ESDHC3_DAT5                = IOMUX_PAD(0x62C, 0x2A8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__GPU3d_GPU_DEBUG_OUT_1      = IOMUX_PAD(0x62C, 0x2A8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA1__IPU_DIAG_BUS_1             = IOMUX_PAD(0x62C, 0x2A8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__PATA_DATA_2                = IOMUX_PAD(0x630, 0x2AC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__GPIO2_2                    = IOMUX_PAD(0x630, 0x2AC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__EMI_NANDF_D_2              = IOMUX_PAD(0x630, 0x2AC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__ESDHC3_DAT6                = IOMUX_PAD(0x630, 0x2AC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__GPU3d_GPU_DEBUG_OUT_2      = IOMUX_PAD(0x630, 0x2AC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA2__IPU_DIAG_BUS_2             = IOMUX_PAD(0x630, 0x2AC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__PATA_DATA_3                = IOMUX_PAD(0x634, 0x2B0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__GPIO2_3                    = IOMUX_PAD(0x634, 0x2B0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__EMI_NANDF_D_3              = IOMUX_PAD(0x634, 0x2B0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__ESDHC3_DAT7                = IOMUX_PAD(0x634, 0x2B0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__GPU3d_GPU_DEBUG_OUT_3      = IOMUX_PAD(0x634, 0x2B0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA3__IPU_DIAG_BUS_3             = IOMUX_PAD(0x634, 0x2B0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__PATA_DATA_4                = IOMUX_PAD(0x638, 0x2B4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__GPIO2_4                    = IOMUX_PAD(0x638, 0x2B4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__EMI_NANDF_D_4              = IOMUX_PAD(0x638, 0x2B4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__ESDHC4_DAT4                = IOMUX_PAD(0x638, 0x2B4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__GPU3d_GPU_DEBUG_OUT_4      = IOMUX_PAD(0x638, 0x2B4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA4__IPU_DIAG_BUS_4             = IOMUX_PAD(0x638, 0x2B4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__PATA_DATA_5                = IOMUX_PAD(0x63C, 0x2B8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__GPIO2_5                    = IOMUX_PAD(0x63C, 0x2B8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__EMI_NANDF_D_5              = IOMUX_PAD(0x63C, 0x2B8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__ESDHC4_DAT5                = IOMUX_PAD(0x63C, 0x2B8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__GPU3d_GPU_DEBUG_OUT_5      = IOMUX_PAD(0x63C, 0x2B8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA5__IPU_DIAG_BUS_5             = IOMUX_PAD(0x63C, 0x2B8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__PATA_DATA_6                = IOMUX_PAD(0x640, 0x2BC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__GPIO2_6                    = IOMUX_PAD(0x640, 0x2BC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__EMI_NANDF_D_6              = IOMUX_PAD(0x640, 0x2BC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__ESDHC4_DAT6                = IOMUX_PAD(0x640, 0x2BC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__GPU3d_GPU_DEBUG_OUT_6      = IOMUX_PAD(0x640, 0x2BC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA6__IPU_DIAG_BUS_6             = IOMUX_PAD(0x640, 0x2BC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__PATA_DATA_7                = IOMUX_PAD(0x644, 0x2C0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__GPIO2_7                    = IOMUX_PAD(0x644, 0x2C0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__EMI_NANDF_D_7              = IOMUX_PAD(0x644, 0x2C0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__ESDHC4_DAT7                = IOMUX_PAD(0x644, 0x2C0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__GPU3d_GPU_DEBUG_OUT_7      = IOMUX_PAD(0x644, 0x2C0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA7__IPU_DIAG_BUS_7             = IOMUX_PAD(0x644, 0x2C0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__PATA_DATA_8                = IOMUX_PAD(0x648, 0x2C4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__GPIO2_8                    = IOMUX_PAD(0x648, 0x2C4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__ESDHC1_DAT4                = IOMUX_PAD(0x648, 0x2C4, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__EMI_NANDF_D_8              = IOMUX_PAD(0x648, 0x2C4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__ESDHC3_DAT0                = IOMUX_PAD(0x648, 0x2C4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__GPU3d_GPU_DEBUG_OUT_8      = IOMUX_PAD(0x648, 0x2C4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA8__IPU_DIAG_BUS_8             = IOMUX_PAD(0x648, 0x2C4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__PATA_DATA_9                = IOMUX_PAD(0x64C, 0x2C8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__GPIO2_9                    = IOMUX_PAD(0x64C, 0x2C8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__ESDHC1_DAT5                = IOMUX_PAD(0x64C, 0x2C8, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__EMI_NANDF_D_9              = IOMUX_PAD(0x64C, 0x2C8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__ESDHC3_DAT1                = IOMUX_PAD(0x64C, 0x2C8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__GPU3d_GPU_DEBUG_OUT_9      = IOMUX_PAD(0x64C, 0x2C8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA9__IPU_DIAG_BUS_9             = IOMUX_PAD(0x64C, 0x2C8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__PATA_DATA_10              = IOMUX_PAD(0x650, 0x2CC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__GPIO2_10                  = IOMUX_PAD(0x650, 0x2CC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__ESDHC1_DAT6               = IOMUX_PAD(0x650, 0x2CC, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__EMI_NANDF_D_10            = IOMUX_PAD(0x650, 0x2CC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__ESDHC3_DAT2               = IOMUX_PAD(0x650, 0x2CC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__GPU3d_GPU_DEBUG_OUT_10    = IOMUX_PAD(0x650, 0x2CC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA10__IPU_DIAG_BUS_10           = IOMUX_PAD(0x650, 0x2CC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__PATA_DATA_11              = IOMUX_PAD(0x654, 0x2D0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__GPIO2_11                  = IOMUX_PAD(0x654, 0x2D0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__ESDHC1_DAT7               = IOMUX_PAD(0x654, 0x2D0, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__EMI_NANDF_D_11            = IOMUX_PAD(0x654, 0x2D0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__ESDHC3_DAT3               = IOMUX_PAD(0x654, 0x2D0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__GPU3d_GPU_DEBUG_OUT_11    = IOMUX_PAD(0x654, 0x2D0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA11__IPU_DIAG_BUS_11           = IOMUX_PAD(0x654, 0x2D0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__PATA_DATA_12              = IOMUX_PAD(0x658, 0x2D4, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__GPIO2_12                  = IOMUX_PAD(0x658, 0x2D4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__ESDHC2_DAT4               = IOMUX_PAD(0x658, 0x2D4, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__EMI_NANDF_D_12            = IOMUX_PAD(0x658, 0x2D4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__ESDHC4_DAT0               = IOMUX_PAD(0x658, 0x2D4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__GPU3d_GPU_DEBUG_OUT_12    = IOMUX_PAD(0x658, 0x2D4, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA12__IPU_DIAG_BUS_12           = IOMUX_PAD(0x658, 0x2D4, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__PATA_DATA_13              = IOMUX_PAD(0x65C, 0x2D8, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__GPIO2_13                  = IOMUX_PAD(0x65C, 0x2D8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__ESDHC2_DAT5               = IOMUX_PAD(0x65C, 0x2D8, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__EMI_NANDF_D_13            = IOMUX_PAD(0x65C, 0x2D8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__ESDHC4_DAT1               = IOMUX_PAD(0x65C, 0x2D8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__GPU3d_GPU_DEBUG_OUT_13    = IOMUX_PAD(0x65C, 0x2D8, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA13__IPU_DIAG_BUS_13           = IOMUX_PAD(0x65C, 0x2D8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__PATA_DATA_14              = IOMUX_PAD(0x660, 0x2DC, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__GPIO2_14                  = IOMUX_PAD(0x660, 0x2DC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__ESDHC2_DAT6               = IOMUX_PAD(0x660, 0x2DC, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__EMI_NANDF_D_14            = IOMUX_PAD(0x660, 0x2DC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__ESDHC4_DAT2               = IOMUX_PAD(0x660, 0x2DC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__GPU3d_GPU_DEBUG_OUT_14    = IOMUX_PAD(0x660, 0x2DC, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA14__IPU_DIAG_BUS_14           = IOMUX_PAD(0x660, 0x2DC, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__PATA_DATA_15              = IOMUX_PAD(0x664, 0x2E0, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__GPIO2_15                  = IOMUX_PAD(0x664, 0x2E0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__ESDHC2_DAT7               = IOMUX_PAD(0x664, 0x2E0, 2, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__EMI_NANDF_D_15            = IOMUX_PAD(0x664, 0x2E0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__ESDHC4_DAT3               = IOMUX_PAD(0x664, 0x2E0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__GPU3d_GPU_DEBUG_OUT_15    = IOMUX_PAD(0x664, 0x2E0, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_PATA_DATA15__IPU_DIAG_BUS_15           = IOMUX_PAD(0x664, 0x2E0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA0__ESDHC1_DAT0                 = IOMUX_PAD(0x66C, 0x2E4, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_DATA0__GPIO1_16                    = IOMUX_PAD(0x66C, 0x2E4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA0__GPT_CAPIN1                  = IOMUX_PAD(0x66C, 0x2E4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA0__CSPI_MISO                   = IOMUX_PAD(0x66C, 0x2E4, 5, 0x784, 2, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA0__CCM_PLL3_BYP                = IOMUX_PAD(0x66C, 0x2E4, 7, 0x778, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA1__ESDHC1_DAT1                 = IOMUX_PAD(0x670, 0x2E8, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_DATA1__GPIO1_17                    = IOMUX_PAD(0x670, 0x2E8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA1__GPT_CAPIN2                  = IOMUX_PAD(0x670, 0x2E8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA1__CSPI_SS0                    = IOMUX_PAD(0x670, 0x2E8, 5, 0x78C, 3, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA1__CCM_PLL4_BYP                = IOMUX_PAD(0x670, 0x2E8, 7, 0x77C, 1, NO_PAD_CTRL),
+       MX53_PAD_SD1_CMD__ESDHC1_CMD                    = IOMUX_PAD(0x674, 0x2EC, 0 | IOMUX_CONFIG_SION, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_CMD__GPIO1_18                      = IOMUX_PAD(0x674, 0x2EC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CMD__GPT_CMPOUT1                   = IOMUX_PAD(0x674, 0x2EC, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CMD__CSPI_MOSI                     = IOMUX_PAD(0x674, 0x2EC, 5, 0x788, 2, NO_PAD_CTRL),
+       MX53_PAD_SD1_CMD__CCM_PLL1_BYP                  = IOMUX_PAD(0x674, 0x2EC, 7, 0x770, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__ESDHC1_DAT2                 = IOMUX_PAD(0x678, 0x2F0, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__GPIO1_19                    = IOMUX_PAD(0x678, 0x2F0, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__GPT_CMPOUT2                 = IOMUX_PAD(0x678, 0x2F0, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__PWM2_PWMO                   = IOMUX_PAD(0x678, 0x2F0, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__WDOG1_WDOG_B                = IOMUX_PAD(0x678, 0x2F0, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__CSPI_SS1                    = IOMUX_PAD(0x678, 0x2F0, 5, 0x790, 2, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__WDOG1_WDOG_RST_B_DEB        = IOMUX_PAD(0x678, 0x2F0, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA2__CCM_PLL2_BYP                = IOMUX_PAD(0x678, 0x2F0, 7, 0x774, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CLK__ESDHC1_CLK                    = IOMUX_PAD(0x67C, 0x2F4, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_CLK__GPIO1_20                      = IOMUX_PAD(0x67C, 0x2F4, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CLK__OSC32k_32K_OUT                = IOMUX_PAD(0x67C, 0x2F4, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CLK__GPT_CLKIN                     = IOMUX_PAD(0x67C, 0x2F4, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_CLK__CSPI_SCLK                     = IOMUX_PAD(0x67C, 0x2F4, 5, 0x780, 2, NO_PAD_CTRL),
+       MX53_PAD_SD1_CLK__SATA_PHY_DTB_0                = IOMUX_PAD(0x67C, 0x2F4, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__ESDHC1_DAT3                 = IOMUX_PAD(0x680, 0x2F8, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__GPIO1_21                    = IOMUX_PAD(0x680, 0x2F8, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__GPT_CMPOUT3                 = IOMUX_PAD(0x680, 0x2F8, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__PWM1_PWMO                   = IOMUX_PAD(0x680, 0x2F8, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__WDOG2_WDOG_B                = IOMUX_PAD(0x680, 0x2F8, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__CSPI_SS2                    = IOMUX_PAD(0x680, 0x2F8, 5, 0x794, 2, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__WDOG2_WDOG_RST_B_DEB        = IOMUX_PAD(0x680, 0x2F8, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD1_DATA3__SATA_PHY_DTB_1              = IOMUX_PAD(0x680, 0x2F8, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_CLK__ESDHC2_CLK                    = IOMUX_PAD(0x688, 0x2FC, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_CLK__GPIO1_10                      = IOMUX_PAD(0x688, 0x2FC, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_CLK__KPP_COL_5                     = IOMUX_PAD(0x688, 0x2FC, 2, 0x840, 2, NO_PAD_CTRL),
+       MX53_PAD_SD2_CLK__AUDMUX_AUD4_RXFS              = IOMUX_PAD(0x688, 0x2FC, 3, 0x73C, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_CLK__CSPI_SCLK                     = IOMUX_PAD(0x688, 0x2FC, 5, 0x780, 3, NO_PAD_CTRL),
+       MX53_PAD_SD2_CLK__SCC_RANDOM_V                  = IOMUX_PAD(0x688, 0x2FC, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_CMD__ESDHC2_CMD                    = IOMUX_PAD(0x68C, 0x300, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_CMD__GPIO1_11                      = IOMUX_PAD(0x68C, 0x300, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_CMD__KPP_ROW_5                     = IOMUX_PAD(0x68C, 0x300, 2, 0x84C, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_CMD__AUDMUX_AUD4_RXC               = IOMUX_PAD(0x68C, 0x300, 3, 0x738, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_CMD__CSPI_MOSI                     = IOMUX_PAD(0x68C, 0x300, 5, 0x788, 3, NO_PAD_CTRL),
+       MX53_PAD_SD2_CMD__SCC_RANDOM                    = IOMUX_PAD(0x68C, 0x300, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__ESDHC2_DAT3                 = IOMUX_PAD(0x690, 0x304, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__GPIO1_12                    = IOMUX_PAD(0x690, 0x304, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__KPP_COL_6                   = IOMUX_PAD(0x690, 0x304, 2, 0x844, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__AUDMUX_AUD4_TXC             = IOMUX_PAD(0x690, 0x304, 3, 0x740, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__CSPI_SS2                    = IOMUX_PAD(0x690, 0x304, 5, 0x794, 3, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA3__SJC_DONE                    = IOMUX_PAD(0x690, 0x304, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__ESDHC2_DAT2                 = IOMUX_PAD(0x694, 0x308, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__GPIO1_13                    = IOMUX_PAD(0x694, 0x308, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__KPP_ROW_6                   = IOMUX_PAD(0x694, 0x308, 2, 0x850, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__AUDMUX_AUD4_TXD             = IOMUX_PAD(0x694, 0x308, 3, 0x734, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__CSPI_SS1                    = IOMUX_PAD(0x694, 0x308, 5, 0x790, 3, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA2__SJC_FAIL                    = IOMUX_PAD(0x694, 0x308, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__ESDHC2_DAT1                 = IOMUX_PAD(0x698, 0x30C, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__GPIO1_14                    = IOMUX_PAD(0x698, 0x30C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__KPP_COL_7                   = IOMUX_PAD(0x698, 0x30C, 2, 0x848, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__AUDMUX_AUD4_TXFS            = IOMUX_PAD(0x698, 0x30C, 3, 0x744, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__CSPI_SS0                    = IOMUX_PAD(0x698, 0x30C, 5, 0x78C, 4, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA1__RTIC_SEC_VIO                = IOMUX_PAD(0x698, 0x30C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__ESDHC2_DAT0                 = IOMUX_PAD(0x69C, 0x310, 0, __NA_, 0, MX53_SDHC_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__GPIO1_15                    = IOMUX_PAD(0x69C, 0x310, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__KPP_ROW_7                   = IOMUX_PAD(0x69C, 0x310, 2, 0x854, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__AUDMUX_AUD4_RXD             = IOMUX_PAD(0x69C, 0x310, 3, 0x730, 1, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__CSPI_MISO                   = IOMUX_PAD(0x69C, 0x310, 5, 0x784, 3, NO_PAD_CTRL),
+       MX53_PAD_SD2_DATA0__RTIC_DONE_INT               = IOMUX_PAD(0x69C, 0x310, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__CCM_CLKO                       = IOMUX_PAD(0x6A4, 0x314, 0, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__GPIO1_0                        = IOMUX_PAD(0x6A4, 0x314, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__KPP_COL_5                      = IOMUX_PAD(0x6A4, 0x314, 2, 0x840, 3, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK               = IOMUX_PAD(0x6A4, 0x314, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__EPIT1_EPITO                    = IOMUX_PAD(0x6A4, 0x314, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__SRTC_ALARM_DEB                 = IOMUX_PAD(0x6A4, 0x314, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__USBOH3_USBH1_PWR               = IOMUX_PAD(0x6A4, 0x314, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_0__CSU_TD                         = IOMUX_PAD(0x6A4, 0x314, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__ESAI1_SCKR                     = IOMUX_PAD(0x6A8, 0x318, 0, 0x7DC, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__GPIO1_1                        = IOMUX_PAD(0x6A8, 0x318, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__KPP_ROW_5                      = IOMUX_PAD(0x6A8, 0x318, 2, 0x84C, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__CCM_SSI_EXT2_CLK               = IOMUX_PAD(0x6A8, 0x318, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__PWM2_PWMO                      = IOMUX_PAD(0x6A8, 0x318, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__WDOG2_WDOG_B                   = IOMUX_PAD(0x6A8, 0x318, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__ESDHC1_CD                      = IOMUX_PAD(0x6A8, 0x318, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_1__SRC_TESTER_ACK                 = IOMUX_PAD(0x6A8, 0x318, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__ESAI1_FSR                      = IOMUX_PAD(0x6AC, 0x31C, 0, 0x7CC, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__GPIO1_9                        = IOMUX_PAD(0x6AC, 0x31C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__KPP_COL_6                      = IOMUX_PAD(0x6AC, 0x31C, 2, 0x844, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__CCM_REF_EN_B                   = IOMUX_PAD(0x6AC, 0x31C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__PWM1_PWMO                      = IOMUX_PAD(0x6AC, 0x31C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__WDOG1_WDOG_B                   = IOMUX_PAD(0x6AC, 0x31C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__ESDHC1_WP                      = IOMUX_PAD(0x6AC, 0x31C, 6, 0x7FC, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_9__SCC_FAIL_STATE                 = IOMUX_PAD(0x6AC, 0x31C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__ESAI1_HCKR                     = IOMUX_PAD(0x6B0, 0x320, 0, 0x7D4, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__GPIO1_3                        = IOMUX_PAD(0x6B0, 0x320, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__I2C3_SCL                       = IOMUX_PAD(0x6B0, 0x320, 2 | IOMUX_CONFIG_SION, 0x824, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__DPLLIP1_TOG_EN                 = IOMUX_PAD(0x6B0, 0x320, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__CCM_CLKO2                      = IOMUX_PAD(0x6B0, 0x320, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__OBSERVE_MUX_OBSRV_INT_OUT0     = IOMUX_PAD(0x6B0, 0x320, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__USBOH3_USBH1_OC                = IOMUX_PAD(0x6B0, 0x320, 6, 0x8A0, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_3__MLB_MLBCLK                     = IOMUX_PAD(0x6B0, 0x320, 7, 0x858, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__ESAI1_SCKT                     = IOMUX_PAD(0x6B4, 0x324, 0, 0x7E0, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__GPIO1_6                        = IOMUX_PAD(0x6B4, 0x324, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__I2C3_SDA                       = IOMUX_PAD(0x6B4, 0x324, 2 | IOMUX_CONFIG_SION, 0x828, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__CCM_CCM_OUT_0                  = IOMUX_PAD(0x6B4, 0x324, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__CSU_CSU_INT_DEB                = IOMUX_PAD(0x6B4, 0x324, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__OBSERVE_MUX_OBSRV_INT_OUT1     = IOMUX_PAD(0x6B4, 0x324, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__ESDHC2_LCTL                    = IOMUX_PAD(0x6B4, 0x324, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_6__MLB_MLBSIG                     = IOMUX_PAD(0x6B4, 0x324, 7, 0x860, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__ESAI1_FST                      = IOMUX_PAD(0x6B8, 0x328, 0, 0x7D0, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__GPIO1_2                        = IOMUX_PAD(0x6B8, 0x328, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__KPP_ROW_6                      = IOMUX_PAD(0x6B8, 0x328, 2, 0x850, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__CCM_CCM_OUT_1                  = IOMUX_PAD(0x6B8, 0x328, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__CSU_CSU_ALARM_AUT_0            = IOMUX_PAD(0x6B8, 0x328, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__OBSERVE_MUX_OBSRV_INT_OUT2     = IOMUX_PAD(0x6B8, 0x328, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__ESDHC2_WP                      = IOMUX_PAD(0x6B8, 0x328, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_2__MLB_MLBDAT                     = IOMUX_PAD(0x6B8, 0x328, 7, 0x85C, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__ESAI1_HCKT                     = IOMUX_PAD(0x6BC, 0x32C, 0, 0x7D8, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__GPIO1_4                        = IOMUX_PAD(0x6BC, 0x32C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__KPP_COL_7                      = IOMUX_PAD(0x6BC, 0x32C, 2, 0x848, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__CCM_CCM_OUT_2                  = IOMUX_PAD(0x6BC, 0x32C, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__CSU_CSU_ALARM_AUT_1            = IOMUX_PAD(0x6BC, 0x32C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__OBSERVE_MUX_OBSRV_INT_OUT3     = IOMUX_PAD(0x6BC, 0x32C, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__ESDHC2_CD                      = IOMUX_PAD(0x6BC, 0x32C, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_4__SCC_SEC_STATE                  = IOMUX_PAD(0x6BC, 0x32C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__ESAI1_TX2_RX3                  = IOMUX_PAD(0x6C0, 0x330, 0, 0x7EC, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__GPIO1_5                        = IOMUX_PAD(0x6C0, 0x330, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__KPP_ROW_7                      = IOMUX_PAD(0x6C0, 0x330, 2, 0x854, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__CCM_CLKO                       = IOMUX_PAD(0x6C0, 0x330, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__CSU_CSU_ALARM_AUT_2            = IOMUX_PAD(0x6C0, 0x330, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__OBSERVE_MUX_OBSRV_INT_OUT4     = IOMUX_PAD(0x6C0, 0x330, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__I2C3_SCL                       = IOMUX_PAD(0x6C0, 0x330, 6 | IOMUX_CONFIG_SION, 0x824, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_5__CCM_PLL1_BYP                   = IOMUX_PAD(0x6C0, 0x330, 7, 0x770, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__ESAI1_TX4_RX1                  = IOMUX_PAD(0x6C4, 0x334, 0, 0x7F4, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__GPIO1_7                        = IOMUX_PAD(0x6C4, 0x334, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__EPIT1_EPITO                    = IOMUX_PAD(0x6C4, 0x334, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__CAN1_TXCAN                     = IOMUX_PAD(0x6C4, 0x334, 3, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__UART2_TXD_MUX                  = IOMUX_PAD(0x6C4, 0x334, 4, __NA_, 0, MX53_UART_PAD_CTRL),
+       MX53_PAD_GPIO_7__FIRI_RXD                       = IOMUX_PAD(0x6C4, 0x334, 5, 0x80C, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__SPDIF_PLOCK                    = IOMUX_PAD(0x6C4, 0x334, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_7__CCM_PLL2_BYP                   = IOMUX_PAD(0x6C4, 0x334, 7, 0x774, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__ESAI1_TX5_RX0                  = IOMUX_PAD(0x6C8, 0x338, 0, 0x7F8, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__GPIO1_8                        = IOMUX_PAD(0x6C8, 0x338, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__EPIT2_EPITO                    = IOMUX_PAD(0x6C8, 0x338, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__CAN1_RXCAN                     = IOMUX_PAD(0x6C8, 0x338, 3, 0x760, 3, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__UART2_RXD_MUX                  = IOMUX_PAD(0x6C8, 0x338, 4, 0x880, 5, MX53_UART_PAD_CTRL),
+       MX53_PAD_GPIO_8__FIRI_TXD                       = IOMUX_PAD(0x6C8, 0x338, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__SPDIF_SRCLK                    = IOMUX_PAD(0x6C8, 0x338, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_8__CCM_PLL3_BYP                   = IOMUX_PAD(0x6C8, 0x338, 7, 0x778, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__ESAI1_TX3_RX2                 = IOMUX_PAD(0x6CC, 0x33C, 0, 0x7F0, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__GPIO7_11                      = IOMUX_PAD(0x6CC, 0x33C, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__TZIC_PWRFAIL_INT              = IOMUX_PAD(0x6CC, 0x33C, 2, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__RTC_CE_RTC_EXT_TRIG1          = IOMUX_PAD(0x6CC, 0x33C, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__SPDIF_IN1                     = IOMUX_PAD(0x6CC, 0x33C, 5, 0x870, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__I2C3_SDA                      = IOMUX_PAD(0x6CC, 0x33C, 6 | IOMUX_CONFIG_SION, 0x828, 2, NO_PAD_CTRL),
+       MX53_PAD_GPIO_16__SJC_DE_B                      = IOMUX_PAD(0x6CC, 0x33C, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__ESAI1_TX0                     = IOMUX_PAD(0x6D0, 0x340, 0, 0x7E4, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__GPIO7_12                      = IOMUX_PAD(0x6D0, 0x340, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__SDMA_EXT_EVENT_0              = IOMUX_PAD(0x6D0, 0x340, 2, 0x868, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__GPC_PMIC_RDY                  = IOMUX_PAD(0x6D0, 0x340, 3, 0x810, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__RTC_CE_RTC_FSV_TRIG           = IOMUX_PAD(0x6D0, 0x340, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__SPDIF_OUT1                    = IOMUX_PAD(0x6D0, 0x340, 5, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__IPU_SNOOP2                    = IOMUX_PAD(0x6D0, 0x340, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_17__SJC_JTAG_ACT                  = IOMUX_PAD(0x6D0, 0x340, 7, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__ESAI1_TX1                     = IOMUX_PAD(0x6D4, 0x344, 0, 0x7E8, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__GPIO7_13                      = IOMUX_PAD(0x6D4, 0x344, 1, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__SDMA_EXT_EVENT_1              = IOMUX_PAD(0x6D4, 0x344, 2, 0x86C, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__OWIRE_LINE                    = IOMUX_PAD(0x6D4, 0x344, 3, 0x864, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__RTC_CE_RTC_ALARM2_TRIG        = IOMUX_PAD(0x6D4, 0x344, 4, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__CCM_ASRC_EXT_CLK              = IOMUX_PAD(0x6D4, 0x344, 5, 0x768, 1, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__ESDHC1_LCTL                   = IOMUX_PAD(0x6D4, 0x344, 6, __NA_, 0, NO_PAD_CTRL),
+       MX53_PAD_GPIO_18__SRC_SYSTEM_RST                = IOMUX_PAD(0x6D4, 0x344, 7, __NA_, 0, NO_PAD_CTRL),
+};
+
+#endif /* __IOMUX_MX53_H__ */
diff --git a/arch/arm/include/asm/arch-mx5/iomux.h b/arch/arm/include/asm/arch-mx5/iomux.h
deleted file mode 100644 (file)
index e3765a3..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * (C) Copyright 2008-2009 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., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#ifndef __MACH_MX5_IOMUX_H__
-#define __MACH_MX5_IOMUX_H__
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/imx-regs.h>
-#include <asm/arch/mx5x_pins.h>
-
-typedef unsigned int iomux_pin_name_t;
-
-/* various IOMUX output functions */
-typedef enum iomux_config {
-       IOMUX_CONFIG_ALT0,      /*!< used as alternate function 0 */
-       IOMUX_CONFIG_ALT1,      /*!< used as alternate function 1 */
-       IOMUX_CONFIG_ALT2,      /*!< used as alternate function 2 */
-       IOMUX_CONFIG_ALT3,      /*!< used as alternate function 3 */
-       IOMUX_CONFIG_ALT4,      /*!< used as alternate function 4 */
-       IOMUX_CONFIG_ALT5,      /*!< used as alternate function 5 */
-       IOMUX_CONFIG_ALT6,      /*!< used as alternate function 6 */
-       IOMUX_CONFIG_ALT7,      /*!< used as alternate function 7 */
-       IOMUX_CONFIG_GPIO,      /*!< added to help user use GPIO mode */
-       IOMUX_CONFIG_SION = 0x1 << 4,   /*!< used as LOOPBACK:MUX SION bit */
-} iomux_pin_cfg_t;
-
-/* various IOMUX pad functions */
-typedef enum iomux_pad_config {
-       PAD_CTL_SRE_SLOW = 0x0 << 0,    /* Slow slew rate */
-       PAD_CTL_SRE_FAST = 0x1 << 0,    /* Fast slew rate */
-       PAD_CTL_DRV_LOW = 0x0 << 1,     /* Low drive strength */
-       PAD_CTL_DRV_MEDIUM = 0x1 << 1,  /* Medium drive strength */
-       PAD_CTL_DRV_HIGH = 0x2 << 1,    /* High drive strength */
-       PAD_CTL_DRV_MAX = 0x3 << 1,     /* Max drive strength */
-       PAD_CTL_ODE_OPENDRAIN_NONE = 0x0 << 3,  /* Opendrain disable */
-       PAD_CTL_ODE_OPENDRAIN_ENABLE = 0x1 << 3,/* Opendrain enable */
-       PAD_CTL_100K_PD = 0x0 << 4,     /* 100Kohm pulldown */
-       PAD_CTL_47K_PU = 0x1 << 4,      /* 47Kohm pullup */
-       PAD_CTL_100K_PU = 0x2 << 4,     /* 100Kohm pullup */
-       PAD_CTL_22K_PU = 0x3 << 4,      /* 22Kohm pullup */
-       PAD_CTL_PUE_KEEPER = 0x0 << 6,  /* enable pulldown */
-       PAD_CTL_PUE_PULL = 0x1 << 6,    /* enable pullup */
-       PAD_CTL_PKE_NONE = 0x0 << 7,    /* Disable pullup/pulldown */
-       PAD_CTL_PKE_ENABLE = 0x1 << 7,  /* Enable pullup/pulldown */
-       PAD_CTL_HYS_NONE = 0x0 << 8,    /* Hysteresis disabled */
-       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 = 0x1 << 13, /* Low voltage mode */
-       PAD_CTL_DRV_VOT_HIGH = 0x0 << 13,/* High voltage mode */
-} iomux_pad_config_t;
-
-/* various IOMUX input functions */
-typedef enum iomux_input_config {
-       INPUT_CTL_PATH0 = 0x0,
-       INPUT_CTL_PATH1,
-       INPUT_CTL_PATH2,
-       INPUT_CTL_PATH3,
-       INPUT_CTL_PATH4,
-       INPUT_CTL_PATH5,
-       INPUT_CTL_PATH6,
-       INPUT_CTL_PATH7,
-} iomux_input_config_t;
-
-void mxc_request_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t config);
-void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t config);
-void mxc_iomux_set_pad(iomux_pin_name_t pin, u32 config);
-unsigned int mxc_iomux_get_pad(iomux_pin_name_t pin);
-void mxc_iomux_set_input(iomux_input_select_t input, u32 config);
-
-#endif                         /*  __MACH_MX5_IOMUX_H__ */
diff --git a/arch/arm/include/asm/arch-mx5/mx5x_pins.h b/arch/arm/include/asm/arch-mx5/mx5x_pins.h
deleted file mode 100644 (file)
index 3457f6a..0000000
+++ /dev/null
@@ -1,879 +0,0 @@
-/*
- * (C) Copyright 2008-2009 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., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#ifndef __ASM_ARCH_MX5_MX5X_PINS_H__
-#define __ASM_ARCH_MX5_MX5X_PINS_H__
-
-#ifndef __ASSEMBLY__
-
-/*
- * In order to identify pins more effectively, each mux-controlled pin's
- * enumerated value is constructed in the following way:
- *
- * -------------------------------------------------------------------
- * 31-29 | 28 - 24 |  23 - 21 | 20  - 10| 9 - 0
- * -------------------------------------------------------------------
- * IO_P  |  IO_I   | GPIO_I   | PAD_I   | MUX_I
- * -------------------------------------------------------------------
- *
- * Bit 0 to 9 contains MUX_I used to identify the register
- * offset (0-based. base is IOMUX_module_base) defined in the Section
- * "sw_pad_ctl & sw_mux_ctl details" of the IC Spec. The
- * similar field definitions are used for the pad control register.
- * The IOMUX controller can be split in two parts. At the begeinning,
- * there is the register definitions for the multiplexing each pin.
- * Then there is a set of registers (PAD_I) to configure each pin
- * (pullup, pulldown, etc).
- * PAD_I defines the offset of the pad register for each pin.
- * GPIO_I defines, if available, the number of gpio that can be
- * connected to that pad
- * IO_I defines the multiplexer mode required to set the pad in gpio mode
- * IO_P defines the gpio structure (gpio1..gpio4) the pad belongs
- *
- * For example, the MX51_PIN_ETM_D0 is defined in the enumeration:
- *    ( (0x28 - MUX_I_START) << MUX_I)|( (0x250 - PAD_I_START) << PAD_I)
- * It means the mux control register is at register offset 0x28. The pad control
- * register offset is: 0x250 and also occupy the least significant bits
- * within the register.
- */
-
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent the
- * MUX control register offset
- */
-#define MUX_I                  0
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent the
- * PAD control register offset
- */
-#define PAD_I                  10
-/*!
- * Starting bit position within each entry of \b iomux_pins to represent which
- * mux mode is for GPIO (0-based)
- */
-#define GPIO_I                 21
-
-#define MUX_IO_P                29
-#define MUX_IO_I                24
-#define IOMUX_TO_GPIO(pin)      ((((unsigned int)pin >> MUX_IO_P) * \
-                                       GPIO_NUM_PIN) + ((pin >> MUX_IO_I) &\
-                                       ((1 << (MUX_IO_P - MUX_IO_I)) - 1)))
-#define IOMUX_TO_IRQ(pin)       (MXC_GPIO_INT_BASE + IOMUX_TO_GPIO(pin))
-
-#define NON_GPIO_PORT          0x7
-#define PIN_TO_MUX_MASK                ((1 << (PAD_I - MUX_I)) - 1)
-#define PIN_TO_PAD_MASK                ((1 << (GPIO_I - PAD_I)) - 1)
-#define PIN_TO_ALT_GPIO_MASK           ((1 << (MUX_IO_I - GPIO_I)) - 1)
-
-#define NON_MUX_I              PIN_TO_MUX_MASK
-#define NON_PAD_I              PIN_TO_PAD_MASK
-
-#if defined(CONFIG_MX51)
-#define MUX_I_START            0x001C
-#define PAD_I_START            0x3F0
-#define INPUT_CTL_START                0x8C4
-#define MUX_I_END              (PAD_I_START - 4)
-#elif defined(CONFIG_MX53)
-#define MUX_I_START            0x0020
-#define PAD_I_START            0x348
-#define INPUT_CTL_START        0x730
-#define MUX_I_END              (PAD_I_START - 4)
-#else
-#error "CPU_TYPE not defined"
-#endif
-
-#define _MXC_BUILD_PIN(gp, gi, ga, mi, pi) \
-       (((gp) << MUX_IO_P) | ((gi) << MUX_IO_I) | \
-       ((mi) << MUX_I) | \
-       ((pi - PAD_I_START) << PAD_I) | \
-       ((ga) << GPIO_I))
-
-#define _MXC_BUILD_GPIO_PIN(gp, gi, ga, mi, pi) \
-       _MXC_BUILD_PIN(gp, gi, ga, mi, pi)
-
-#define _MXC_BUILD_NON_GPIO_PIN(mi, pi) \
-       _MXC_BUILD_PIN(NON_GPIO_PORT, 0, 0, mi, pi)
-
-#define PIN_TO_IOMUX_MUX(pin)  ((pin >> MUX_I) & PIN_TO_MUX_MASK)
-#define PIN_TO_IOMUX_PAD(pin)  ((pin >> PAD_I) & PIN_TO_PAD_MASK)
-#define PIN_TO_ALT_GPIO(pin)   ((pin >> GPIO_I) & PIN_TO_ALT_GPIO_MASK)
-#define PIN_TO_IOMUX_INDEX(pin)        (PIN_TO_IOMUX_MUX(pin) >> 2)
-
-/*
- * This enumeration is constructed based on the Section
- * "sw_pad_ctl & sw_mux_ctl details" of the MX51 IC Spec. Each enumerated
- * value is constructed based on the rules described above.
- */
-enum {
-       MX51_PIN_EIM_DA0 = _MXC_BUILD_NON_GPIO_PIN(0x1C, 0x7A8),
-       MX51_PIN_EIM_DA1 = _MXC_BUILD_NON_GPIO_PIN(0x20, 0x7A8),
-       MX51_PIN_EIM_DA2 = _MXC_BUILD_NON_GPIO_PIN(0x24, 0x7A8),
-       MX51_PIN_EIM_DA3 = _MXC_BUILD_NON_GPIO_PIN(0x28, 0x7A8),
-       MX51_PIN_EIM_DA4 = _MXC_BUILD_NON_GPIO_PIN(0x2C, 0x7AC),
-       MX51_PIN_EIM_DA5 = _MXC_BUILD_NON_GPIO_PIN(0x30, 0x7AC),
-       MX51_PIN_EIM_DA6 = _MXC_BUILD_NON_GPIO_PIN(0x34, 0x7AC),
-       MX51_PIN_EIM_DA7 = _MXC_BUILD_NON_GPIO_PIN(0x38, 0x7AC),
-       MX51_PIN_EIM_DA8 = _MXC_BUILD_NON_GPIO_PIN(0x3C, 0x7B0),
-       MX51_PIN_EIM_DA9 = _MXC_BUILD_NON_GPIO_PIN(0x40, 0x7B0),
-       MX51_PIN_EIM_DA10 = _MXC_BUILD_NON_GPIO_PIN(0x44, 0x7B0),
-       MX51_PIN_EIM_DA11 = _MXC_BUILD_NON_GPIO_PIN(0x48, 0x7B0),
-       MX51_PIN_EIM_DA12 = _MXC_BUILD_NON_GPIO_PIN(0x4C, 0x7BC),
-       MX51_PIN_EIM_DA13 = _MXC_BUILD_NON_GPIO_PIN(0x50, 0x7BC),
-       MX51_PIN_EIM_DA14 = _MXC_BUILD_NON_GPIO_PIN(0x54, 0x7BC),
-       MX51_PIN_EIM_DA15 = _MXC_BUILD_NON_GPIO_PIN(0x58, 0x7BC),
-       MX51_PIN_EIM_D16 = _MXC_BUILD_GPIO_PIN(1, 0, 1, 0x5C, 0x3F0),
-       MX51_PIN_EIM_D17 = _MXC_BUILD_GPIO_PIN(1, 1, 1, 0x60, 0x3F4),
-       MX51_PIN_EIM_D18 = _MXC_BUILD_GPIO_PIN(1, 2, 1, 0x64, 0x3F8),
-       MX51_PIN_EIM_D19 = _MXC_BUILD_GPIO_PIN(1, 3, 1, 0x68, 0x3FC),
-       MX51_PIN_EIM_D20 = _MXC_BUILD_GPIO_PIN(1, 4, 1, 0x6C, 0x400),
-       MX51_PIN_EIM_D21 = _MXC_BUILD_GPIO_PIN(1, 5, 1, 0x70, 0x404),
-       MX51_PIN_EIM_D22 = _MXC_BUILD_GPIO_PIN(1, 6, 1, 0x74, 0x408),
-       MX51_PIN_EIM_D23 = _MXC_BUILD_GPIO_PIN(1, 7, 1, 0x78, 0x40C),
-       MX51_PIN_EIM_D24 = _MXC_BUILD_GPIO_PIN(1, 8, 1, 0x7C, 0x410),
-       MX51_PIN_EIM_D25 = _MXC_BUILD_NON_GPIO_PIN(0x80, 0x414),
-       MX51_PIN_EIM_D26 = _MXC_BUILD_NON_GPIO_PIN(0x84, 0x418),
-       MX51_PIN_EIM_D27 = _MXC_BUILD_GPIO_PIN(1, 9, 1, 0x88, 0x41C),
-       MX51_PIN_EIM_D28 = _MXC_BUILD_NON_GPIO_PIN(0x8C, 0x420),
-       MX51_PIN_EIM_D29 = _MXC_BUILD_NON_GPIO_PIN(0x90, 0x424),
-       MX51_PIN_EIM_D30 = _MXC_BUILD_NON_GPIO_PIN(0x94, 0x428),
-       MX51_PIN_EIM_D31 = _MXC_BUILD_NON_GPIO_PIN(0x98, 0x42C),
-       MX51_PIN_EIM_A16 = _MXC_BUILD_GPIO_PIN(1, 10, 1, 0x9C, 0x430),
-       MX51_PIN_EIM_A17 = _MXC_BUILD_GPIO_PIN(1, 11, 1, 0xA0, 0x434),
-       MX51_PIN_EIM_A18 = _MXC_BUILD_GPIO_PIN(1, 12, 1, 0xA4, 0x438),
-       MX51_PIN_EIM_A19 = _MXC_BUILD_GPIO_PIN(1, 13, 1, 0xA8, 0x43C),
-       MX51_PIN_EIM_A20 = _MXC_BUILD_GPIO_PIN(1, 14, 1, 0xAC, 0x440),
-       MX51_PIN_EIM_A21 = _MXC_BUILD_GPIO_PIN(1, 15, 1, 0xB0, 0x444),
-       MX51_PIN_EIM_A22 = _MXC_BUILD_GPIO_PIN(1, 16, 1, 0xB4, 0x448),
-       MX51_PIN_EIM_A23 = _MXC_BUILD_GPIO_PIN(1, 17, 1, 0xB8, 0x44C),
-       MX51_PIN_EIM_A24 = _MXC_BUILD_GPIO_PIN(1, 18, 1, 0xBC, 0x450),
-       MX51_PIN_EIM_A25 = _MXC_BUILD_GPIO_PIN(1, 19, 1, 0xC0, 0x454),
-       MX51_PIN_EIM_A26 = _MXC_BUILD_GPIO_PIN(1, 20, 1, 0xC4, 0x458),
-       MX51_PIN_EIM_A27 = _MXC_BUILD_GPIO_PIN(1, 21, 1, 0xC8, 0x45C),
-       MX51_PIN_EIM_EB0 = _MXC_BUILD_NON_GPIO_PIN(0xCC, 0x460),
-       MX51_PIN_EIM_EB1 = _MXC_BUILD_NON_GPIO_PIN(0xD0, 0x464),
-       MX51_PIN_EIM_EB2 = _MXC_BUILD_GPIO_PIN(1, 22, 1, 0xD4, 0x468),
-       MX51_PIN_EIM_EB3 = _MXC_BUILD_GPIO_PIN(1, 23, 1, 0xD8, 0x46C),
-       MX51_PIN_EIM_OE = _MXC_BUILD_GPIO_PIN(1, 24, 1, 0xDC, 0x470),
-       MX51_PIN_EIM_CS0 = _MXC_BUILD_GPIO_PIN(1, 25, 1, 0xE0, 0x474),
-       MX51_PIN_EIM_CS1 = _MXC_BUILD_GPIO_PIN(1, 26, 1, 0xE4, 0x478),
-       MX51_PIN_EIM_CS2 = _MXC_BUILD_GPIO_PIN(1, 27, 1, 0xE8, 0x47C),
-       MX51_PIN_EIM_CS3 = _MXC_BUILD_GPIO_PIN(1, 28, 1, 0xEC, 0x480),
-       MX51_PIN_EIM_CS4 = _MXC_BUILD_GPIO_PIN(1, 29, 1, 0xF0, 0x484),
-       MX51_PIN_EIM_CS5 = _MXC_BUILD_GPIO_PIN(1, 30, 1, 0xF4, 0x488),
-       MX51_PIN_EIM_DTACK = _MXC_BUILD_GPIO_PIN(1, 31, 1, 0xF8, 0x48C),
-       MX51_PIN_EIM_LBA = _MXC_BUILD_GPIO_PIN(2, 1, 1, 0xFC, 0x494),
-       MX51_PIN_EIM_CRE = _MXC_BUILD_GPIO_PIN(2, 2, 1, 0x100, 0x4A0),
-       MX51_PIN_DRAM_CS1 = _MXC_BUILD_NON_GPIO_PIN(0x104, 0x4D0),
-       MX51_PIN_NANDF_WE_B = _MXC_BUILD_GPIO_PIN(2, 3, 3, 0x108, 0x4E4),
-       MX51_PIN_NANDF_RE_B = _MXC_BUILD_GPIO_PIN(2, 4, 3, 0x10C, 0x4E8),
-       MX51_PIN_NANDF_ALE = _MXC_BUILD_GPIO_PIN(2, 5, 3, 0x110, 0x4EC),
-       MX51_PIN_NANDF_CLE = _MXC_BUILD_GPIO_PIN(2, 6, 3, 0x114, 0x4F0),
-       MX51_PIN_NANDF_WP_B = _MXC_BUILD_GPIO_PIN(2, 7, 3, 0x118, 0x4F4),
-       MX51_PIN_NANDF_RB0 = _MXC_BUILD_GPIO_PIN(2, 8, 3, 0x11C, 0x4F8),
-       MX51_PIN_NANDF_RB1 = _MXC_BUILD_GPIO_PIN(2, 9, 3, 0x120, 0x4FC),
-       MX51_PIN_NANDF_RB2 = _MXC_BUILD_GPIO_PIN(2, 10, 3, 0x124, 0x500),
-       MX51_PIN_NANDF_RB3 = _MXC_BUILD_GPIO_PIN(2, 11, 3, 0x128, 0x504),
-       MX51_PIN_GPIO_NAND = _MXC_BUILD_GPIO_PIN(2, 12, 3, 0x12C, 0x514),
-       MX51_PIN_NANDF_RB4 = MX51_PIN_GPIO_NAND,
-       MX51_PIN_NANDF_RB5 = _MXC_BUILD_GPIO_PIN(2, 13, 3, 0x130, 0x5D8),
-       MX51_PIN_NANDF_RB6 = _MXC_BUILD_GPIO_PIN(2, 14, 3, 0x134, 0x5DC),
-       MX51_PIN_NANDF_RB7 = _MXC_BUILD_GPIO_PIN(2, 15, 3, 0x138, 0x5E0),
-       MX51_PIN_NANDF_CS0 = _MXC_BUILD_GPIO_PIN(2, 16, 3, 0x130, 0x518),
-       MX51_PIN_NANDF_CS1 = _MXC_BUILD_GPIO_PIN(2, 17, 3, 0x134, 0x51C),
-       MX51_PIN_NANDF_CS2 = _MXC_BUILD_GPIO_PIN(2, 18, 3, 0x138, 0x520),
-       MX51_PIN_NANDF_CS3 = _MXC_BUILD_GPIO_PIN(2, 19, 3, 0x13C, 0x524),
-       MX51_PIN_NANDF_CS4 = _MXC_BUILD_GPIO_PIN(2, 20, 3, 0x140, 0x528),
-       MX51_PIN_NANDF_CS5 = _MXC_BUILD_GPIO_PIN(2, 21, 3, 0x144, 0x52C),
-       MX51_PIN_NANDF_CS6 = _MXC_BUILD_GPIO_PIN(2, 22, 3, 0x148, 0x530),
-       MX51_PIN_NANDF_CS7 = _MXC_BUILD_GPIO_PIN(2, 23, 3, 0x14C, 0x534),
-       MX51_PIN_NANDF_RDY_INT = _MXC_BUILD_GPIO_PIN(2, 24, 3, 0x150, 0x538),
-       MX51_PIN_NANDF_D15 = _MXC_BUILD_GPIO_PIN(2, 25, 3, 0x154, 0x53C),
-       MX51_PIN_NANDF_D14 = _MXC_BUILD_GPIO_PIN(2, 26, 3, 0x158, 0x540),
-       MX51_PIN_NANDF_D13 = _MXC_BUILD_GPIO_PIN(2, 27, 3, 0x15C, 0x544),
-       MX51_PIN_NANDF_D12 = _MXC_BUILD_GPIO_PIN(2, 28, 3, 0x160, 0x548),
-       MX51_PIN_NANDF_D11 = _MXC_BUILD_GPIO_PIN(2, 29, 3, 0x164, 0x54C),
-       MX51_PIN_NANDF_D10 = _MXC_BUILD_GPIO_PIN(2, 30, 3, 0x168, 0x550),
-       MX51_PIN_NANDF_D9 = _MXC_BUILD_GPIO_PIN(2, 31, 3, 0x16C, 0x554),
-       MX51_PIN_NANDF_D8 = _MXC_BUILD_GPIO_PIN(3, 0, 3, 0x170, 0x558),
-       MX51_PIN_NANDF_D7 = _MXC_BUILD_GPIO_PIN(3, 1, 3, 0x174, 0x55C),
-       MX51_PIN_NANDF_D6 = _MXC_BUILD_GPIO_PIN(3, 2, 3, 0x178, 0x560),
-       MX51_PIN_NANDF_D5 = _MXC_BUILD_GPIO_PIN(3, 3, 3, 0x17C, 0x564),
-       MX51_PIN_NANDF_D4 = _MXC_BUILD_GPIO_PIN(3, 4, 3, 0x180, 0x568),
-       MX51_PIN_NANDF_D3 = _MXC_BUILD_GPIO_PIN(3, 5, 3, 0x184, 0x56C),
-       MX51_PIN_NANDF_D2 = _MXC_BUILD_GPIO_PIN(3, 6, 3, 0x188, 0x570),
-       MX51_PIN_NANDF_D1 = _MXC_BUILD_GPIO_PIN(3, 7, 3, 0x18C, 0x574),
-       MX51_PIN_NANDF_D0 = _MXC_BUILD_GPIO_PIN(3, 8, 3, 0x190, 0x578),
-       MX51_PIN_CSI1_D8 = _MXC_BUILD_GPIO_PIN(2, 12, 3, 0x194, 0x57C),
-       MX51_PIN_CSI1_D9 = _MXC_BUILD_GPIO_PIN(2, 13, 3, 0x198, 0x580),
-       MX51_PIN_CSI1_D10 = _MXC_BUILD_NON_GPIO_PIN(0x19C, 0x584),
-       MX51_PIN_CSI1_D11 = _MXC_BUILD_NON_GPIO_PIN(0x1A0, 0x588),
-       MX51_PIN_CSI1_D12 = _MXC_BUILD_NON_GPIO_PIN(0x1A4, 0x58C),
-       MX51_PIN_CSI1_D13 = _MXC_BUILD_NON_GPIO_PIN(0x1A8, 0x590),
-       MX51_PIN_CSI1_D14 = _MXC_BUILD_NON_GPIO_PIN(0x1AC, 0x594),
-       MX51_PIN_CSI1_D15 = _MXC_BUILD_NON_GPIO_PIN(0x1B0, 0x598),
-       MX51_PIN_CSI1_D16 = _MXC_BUILD_NON_GPIO_PIN(0x1B4, 0x59C),
-       MX51_PIN_CSI1_D17 = _MXC_BUILD_NON_GPIO_PIN(0x1B8, 0x5A0),
-       MX51_PIN_CSI1_D18 = _MXC_BUILD_NON_GPIO_PIN(0x1BC, 0x5A4),
-       MX51_PIN_CSI1_D19 = _MXC_BUILD_NON_GPIO_PIN(0x1C0, 0x5A8),
-       MX51_PIN_CSI1_VSYNC = _MXC_BUILD_NON_GPIO_PIN(0x1C4, 0x5AC),
-       MX51_PIN_CSI1_HSYNC = _MXC_BUILD_NON_GPIO_PIN(0x1C8, 0x5B0),
-       MX51_PIN_CSI1_PIXCLK = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x5B4),
-       MX51_PIN_CSI1_MCLK = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x5B8),
-       MX51_PIN_CSI1_PKE0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x860),
-       MX51_PIN_CSI2_D12 = _MXC_BUILD_GPIO_PIN(3, 9, 3, 0x1CC, 0x5BC),
-       MX51_PIN_CSI2_D13 = _MXC_BUILD_GPIO_PIN(3, 10, 3, 0x1D0, 0x5C0),
-       MX51_PIN_CSI2_D14 = _MXC_BUILD_GPIO_PIN(3, 11, 3, 0x1D4, 0x5C4),
-       MX51_PIN_CSI2_D15 = _MXC_BUILD_GPIO_PIN(3, 12, 3, 0x1D8, 0x5C8),
-       MX51_PIN_CSI2_D16 = _MXC_BUILD_GPIO_PIN(3, 11, 3, 0x1DC, 0x5CC),
-       MX51_PIN_CSI2_D17 = _MXC_BUILD_GPIO_PIN(3, 12, 3, 0x1E0, 0x5D0),
-       MX51_PIN_CSI2_D18 = _MXC_BUILD_GPIO_PIN(3, 11, 3, 0x1E4, 0x5D4),
-       MX51_PIN_CSI2_D19 = _MXC_BUILD_GPIO_PIN(3, 12, 3, 0x1E8, 0x5D8),
-       MX51_PIN_CSI2_VSYNC = _MXC_BUILD_GPIO_PIN(3, 13, 3, 0x1EC, 0x5DC),
-       MX51_PIN_CSI2_HSYNC = _MXC_BUILD_GPIO_PIN(3, 14, 3, 0x1F0, 0x5E0),
-       MX51_PIN_CSI2_PIXCLK = _MXC_BUILD_GPIO_PIN(3, 15, 3, 0x1F4, 0x5E4),
-       MX51_PIN_CSI2_PKE0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x81C),
-       MX51_PIN_I2C1_CLK = _MXC_BUILD_GPIO_PIN(3, 16, 3, 0x1F8, 0x5E8),
-       MX51_PIN_I2C1_DAT = _MXC_BUILD_GPIO_PIN(3, 17, 3, 0x1FC, 0x5EC),
-       MX51_PIN_AUD3_BB_TXD = _MXC_BUILD_GPIO_PIN(3, 18, 3, 0x200, 0x5F0),
-       MX51_PIN_AUD3_BB_RXD = _MXC_BUILD_GPIO_PIN(3, 19, 3, 0x204, 0x5F4),
-       MX51_PIN_AUD3_BB_CK = _MXC_BUILD_GPIO_PIN(3, 20, 3, 0x208, 0x5F8),
-       MX51_PIN_AUD3_BB_FS = _MXC_BUILD_GPIO_PIN(3, 21, 3, 0x20C, 0x5FC),
-       MX51_PIN_CSPI1_MOSI = _MXC_BUILD_GPIO_PIN(3, 22, 3, 0x210, 0x600),
-       MX51_PIN_CSPI1_MISO = _MXC_BUILD_GPIO_PIN(3, 23, 3, 0x214, 0x604),
-       MX51_PIN_CSPI1_SS0 = _MXC_BUILD_GPIO_PIN(3, 24, 3, 0x218, 0x608),
-       MX51_PIN_CSPI1_SS1 = _MXC_BUILD_GPIO_PIN(3, 25, 3, 0x21C, 0x60C),
-       MX51_PIN_CSPI1_RDY = _MXC_BUILD_GPIO_PIN(3, 26, 3, 0x220, 0x610),
-       MX51_PIN_CSPI1_SCLK = _MXC_BUILD_GPIO_PIN(3, 27, 3, 0x224, 0x614),
-       MX51_PIN_UART1_RXD = _MXC_BUILD_GPIO_PIN(3, 28, 3, 0x228, 0x618),
-       MX51_PIN_UART1_TXD = _MXC_BUILD_GPIO_PIN(3, 29, 3, 0x22C, 0x61C),
-       MX51_PIN_UART1_RTS = _MXC_BUILD_GPIO_PIN(3, 30, 3, 0x230, 0x620),
-       MX51_PIN_UART1_CTS = _MXC_BUILD_GPIO_PIN(3, 31, 3, 0x234, 0x624),
-       MX51_PIN_UART2_RXD = _MXC_BUILD_GPIO_PIN(0, 20, 3, 0x238, 0x628),
-       MX51_PIN_UART2_TXD = _MXC_BUILD_GPIO_PIN(0, 21, 3, 0x23C, 0x62C),
-       MX51_PIN_UART3_RXD = _MXC_BUILD_GPIO_PIN(0, 22, 3, 0x240, 0x630),
-       MX51_PIN_UART3_TXD = _MXC_BUILD_GPIO_PIN(0, 23, 3, 0x244, 0x634),
-       MX51_PIN_OWIRE_LINE = _MXC_BUILD_GPIO_PIN(0, 24, 3, 0x248, 0x638),
-       MX51_PIN_KEY_ROW0 = _MXC_BUILD_NON_GPIO_PIN(0x24C, 0x63C),
-       MX51_PIN_KEY_ROW1 = _MXC_BUILD_NON_GPIO_PIN(0x250, 0x640),
-       MX51_PIN_KEY_ROW2 = _MXC_BUILD_NON_GPIO_PIN(0x254, 0x644),
-       MX51_PIN_KEY_ROW3 = _MXC_BUILD_NON_GPIO_PIN(0x258, 0x648),
-       MX51_PIN_KEY_COL0 = _MXC_BUILD_NON_GPIO_PIN(0x25C, 0x64C),
-       MX51_PIN_KEY_COL1 = _MXC_BUILD_NON_GPIO_PIN(0x260, 0x650),
-       MX51_PIN_KEY_COL2 = _MXC_BUILD_NON_GPIO_PIN(0x264, 0x654),
-       MX51_PIN_KEY_COL3 = _MXC_BUILD_NON_GPIO_PIN(0x268, 0x658),
-       MX51_PIN_KEY_COL4 = _MXC_BUILD_NON_GPIO_PIN(0x26C, 0x65C),
-       MX51_PIN_KEY_COL5 = _MXC_BUILD_NON_GPIO_PIN(0x270, 0x660),
-       MX51_PIN_USBH1_CLK = _MXC_BUILD_GPIO_PIN(0, 25, 2, 0x278, 0x678),
-       MX51_PIN_USBH1_DIR = _MXC_BUILD_GPIO_PIN(0, 26, 2, 0x27C, 0x67C),
-       MX51_PIN_USBH1_STP = _MXC_BUILD_GPIO_PIN(0, 27, 2, 0x280, 0x680),
-       MX51_PIN_USBH1_NXT = _MXC_BUILD_GPIO_PIN(0, 28, 2, 0x284, 0x684),
-       MX51_PIN_USBH1_DATA0 = _MXC_BUILD_GPIO_PIN(0, 11, 2, 0x288, 0x688),
-       MX51_PIN_USBH1_DATA1 = _MXC_BUILD_GPIO_PIN(0, 12, 2, 0x28C, 0x68C),
-       MX51_PIN_USBH1_DATA2 = _MXC_BUILD_GPIO_PIN(0, 13, 2, 0x290, 0x690),
-       MX51_PIN_USBH1_DATA3 = _MXC_BUILD_GPIO_PIN(0, 14, 2, 0x294, 0x694),
-       MX51_PIN_USBH1_DATA4 = _MXC_BUILD_GPIO_PIN(0, 15, 2, 0x298, 0x698),
-       MX51_PIN_USBH1_DATA5 = _MXC_BUILD_GPIO_PIN(0, 16, 2, 0x29C, 0x69C),
-       MX51_PIN_USBH1_DATA6 = _MXC_BUILD_GPIO_PIN(0, 17, 2, 0x2A0, 0x6A0),
-       MX51_PIN_USBH1_DATA7 = _MXC_BUILD_GPIO_PIN(0, 18, 2, 0x2A4, 0x6A4),
-       MX51_PIN_DI1_PIN11 = _MXC_BUILD_GPIO_PIN(2, 0, 4, 0x2A8, 0x6A8),
-       MX51_PIN_DI1_PIN12 = _MXC_BUILD_GPIO_PIN(2, 1, 4, 0x2AC, 0x6AC),
-       MX51_PIN_DI1_PIN13 = _MXC_BUILD_GPIO_PIN(2, 2, 4, 0x2B0, 0x6B0),
-       MX51_PIN_DI1_D0_CS = _MXC_BUILD_GPIO_PIN(2, 3, 4, 0x2B4, 0x6B4),
-       MX51_PIN_DI1_D1_CS = _MXC_BUILD_GPIO_PIN(2, 4, 4, 0x2B8, 0x6B8),
-       MX51_PIN_DISPB2_SER_DIN = _MXC_BUILD_GPIO_PIN(2, 5, 4, 0x2BC, 0x6BC),
-       MX51_PIN_DISPB2_SER_DIO = _MXC_BUILD_GPIO_PIN(2, 6, 4, 0x2C0, 0x6C0),
-       MX51_PIN_DISPB2_SER_CLK = _MXC_BUILD_GPIO_PIN(2, 7, 4, 0x2C4, 0x6C4),
-       MX51_PIN_DISPB2_SER_RS = _MXC_BUILD_GPIO_PIN(2, 8, 4, 0x2C8, 0x6C8),
-       MX51_PIN_DISP1_DAT0 = _MXC_BUILD_NON_GPIO_PIN(0x2CC, 0x6CC),
-       MX51_PIN_DISP1_DAT1 = _MXC_BUILD_NON_GPIO_PIN(0x2D0, 0x6D0),
-       MX51_PIN_DISP1_DAT2 = _MXC_BUILD_NON_GPIO_PIN(0x2D4, 0x6D4),
-       MX51_PIN_DISP1_DAT3 = _MXC_BUILD_NON_GPIO_PIN(0x2D8, 0x6D8),
-       MX51_PIN_DISP1_DAT4 = _MXC_BUILD_NON_GPIO_PIN(0x2DC, 0x6DC),
-       MX51_PIN_DISP1_DAT5 = _MXC_BUILD_NON_GPIO_PIN(0x2E0, 0x6E0),
-       MX51_PIN_DISP1_DAT6 = _MXC_BUILD_NON_GPIO_PIN(0x2E4, 0x6E4),
-       MX51_PIN_DISP1_DAT7 = _MXC_BUILD_NON_GPIO_PIN(0x2E8, 0x6E8),
-       MX51_PIN_DISP1_DAT8 = _MXC_BUILD_NON_GPIO_PIN(0x2EC, 0x6EC),
-       MX51_PIN_DISP1_DAT9 = _MXC_BUILD_NON_GPIO_PIN(0x2F0, 0x6F0),
-       MX51_PIN_DISP1_DAT10 = _MXC_BUILD_NON_GPIO_PIN(0x2F4, 0x6F4),
-       MX51_PIN_DISP1_DAT11 = _MXC_BUILD_NON_GPIO_PIN(0x2F8, 0x6F8),
-       MX51_PIN_DISP1_DAT12 = _MXC_BUILD_NON_GPIO_PIN(0x2FC, 0x6FC),
-       MX51_PIN_DISP1_DAT13 = _MXC_BUILD_NON_GPIO_PIN(0x300, 0x700),
-       MX51_PIN_DISP1_DAT14 = _MXC_BUILD_NON_GPIO_PIN(0x304, 0x704),
-       MX51_PIN_DISP1_DAT15 = _MXC_BUILD_NON_GPIO_PIN(0x308, 0x708),
-       MX51_PIN_DISP1_DAT16 = _MXC_BUILD_NON_GPIO_PIN(0x30C, 0x70C),
-       MX51_PIN_DISP1_DAT17 = _MXC_BUILD_NON_GPIO_PIN(0x310, 0x710),
-       MX51_PIN_DISP1_DAT18 = _MXC_BUILD_NON_GPIO_PIN(0x314, 0x714),
-       MX51_PIN_DISP1_DAT19 = _MXC_BUILD_NON_GPIO_PIN(0x318, 0x718),
-       MX51_PIN_DISP1_DAT20 = _MXC_BUILD_NON_GPIO_PIN(0x31C, 0x71C),
-       MX51_PIN_DISP1_DAT21 = _MXC_BUILD_NON_GPIO_PIN(0x320, 0x720),
-       MX51_PIN_DISP1_DAT22 = _MXC_BUILD_NON_GPIO_PIN(0x324, 0x724),
-       MX51_PIN_DISP1_DAT23 = _MXC_BUILD_NON_GPIO_PIN(0x328, 0x728),
-       MX51_PIN_DI1_PIN3 = _MXC_BUILD_NON_GPIO_PIN(0x32C, 0x72C),
-       MX51_PIN_DI1_PIN2 = _MXC_BUILD_NON_GPIO_PIN(0x330, 0x734),
-       MX51_PIN_DI_GP1 = _MXC_BUILD_NON_GPIO_PIN(0x334, 0x73C),
-       MX51_PIN_DI_GP2 = _MXC_BUILD_NON_GPIO_PIN(0x338, 0x740),
-       MX51_PIN_DI_GP3 = _MXC_BUILD_NON_GPIO_PIN(0x33C, 0x744),
-       MX51_PIN_DI2_PIN4 = _MXC_BUILD_NON_GPIO_PIN(0x340, 0x748),
-       MX51_PIN_DI2_PIN2 = _MXC_BUILD_NON_GPIO_PIN(0x344, 0x74C),
-       MX51_PIN_DI2_PIN3 = _MXC_BUILD_NON_GPIO_PIN(0x348, 0x750),
-       MX51_PIN_DI2_DISP_CLK = _MXC_BUILD_NON_GPIO_PIN(0x34C, 0x754),
-       MX51_PIN_DI_GP4 = _MXC_BUILD_NON_GPIO_PIN(0x350, 0x758),
-       MX51_PIN_DISP2_DAT0 = _MXC_BUILD_NON_GPIO_PIN(0x354, 0x75C),
-       MX51_PIN_DISP2_DAT1 = _MXC_BUILD_NON_GPIO_PIN(0x358, 0x760),
-       MX51_PIN_DISP2_DAT2 = _MXC_BUILD_NON_GPIO_PIN(0x35C, 0x764),
-       MX51_PIN_DISP2_DAT3 = _MXC_BUILD_NON_GPIO_PIN(0x360, 0x768),
-       MX51_PIN_DISP2_DAT4 = _MXC_BUILD_NON_GPIO_PIN(0x364, 0x76C),
-       MX51_PIN_DISP2_DAT5 = _MXC_BUILD_NON_GPIO_PIN(0x368, 0x770),
-       MX51_PIN_DISP2_DAT6 = _MXC_BUILD_GPIO_PIN(0, 19, 5, 0x36C, 0x774),
-       MX51_PIN_DISP2_DAT7 = _MXC_BUILD_GPIO_PIN(0, 29, 5, 0x370, 0x778),
-       MX51_PIN_DISP2_DAT8 = _MXC_BUILD_GPIO_PIN(0, 30, 5, 0x374, 0x77C),
-       MX51_PIN_DISP2_DAT9 = _MXC_BUILD_GPIO_PIN(0, 31, 5, 0x378, 0x780),
-       MX51_PIN_DISP2_DAT10 = _MXC_BUILD_NON_GPIO_PIN(0x37C, 0x784),
-       MX51_PIN_DISP2_DAT11 = _MXC_BUILD_NON_GPIO_PIN(0x380, 0x788),
-       MX51_PIN_DISP2_DAT12 = _MXC_BUILD_NON_GPIO_PIN(0x384, 0x78C),
-       MX51_PIN_DISP2_DAT13 = _MXC_BUILD_NON_GPIO_PIN(0x388, 0x790),
-       MX51_PIN_DISP2_DAT14 = _MXC_BUILD_NON_GPIO_PIN(0x38C, 0x794),
-       MX51_PIN_DISP2_DAT15 = _MXC_BUILD_NON_GPIO_PIN(0x390, 0x798),
-       MX51_PIN_SD1_CMD = _MXC_BUILD_NON_GPIO_PIN(0x394, 0x79C),
-       MX51_PIN_SD1_CLK = _MXC_BUILD_NON_GPIO_PIN(0x398, 0x7A0),
-       MX51_PIN_SD1_DATA0 = _MXC_BUILD_NON_GPIO_PIN(0x39C, 0x7A4),
-       MX51_PIN_SD1_DATA1 = _MXC_BUILD_NON_GPIO_PIN(0x3A0, 0x7A8),
-       MX51_PIN_SD1_DATA2 = _MXC_BUILD_NON_GPIO_PIN(0x3A4, 0x7AC),
-       MX51_PIN_SD1_DATA3 = _MXC_BUILD_NON_GPIO_PIN(0x3A8, 0x7B0),
-       MX51_PIN_GPIO1_0 = _MXC_BUILD_GPIO_PIN(0, 0, 1, 0x3AC, 0x7B4),
-       MX51_PIN_GPIO1_1 = _MXC_BUILD_GPIO_PIN(0, 1, 1, 0x3B0, 0x7B8),
-       MX51_PIN_SD2_CMD = _MXC_BUILD_NON_GPIO_PIN(0x3B4, 0x7BC),
-       MX51_PIN_SD2_CLK = _MXC_BUILD_NON_GPIO_PIN(0x3B8, 0x7C0),
-       MX51_PIN_SD2_DATA0 = _MXC_BUILD_NON_GPIO_PIN(0x3BC, 0x7C4),
-       MX51_PIN_SD2_DATA1 = _MXC_BUILD_NON_GPIO_PIN(0x3C0, 0x7C8),
-       MX51_PIN_SD2_DATA2 = _MXC_BUILD_NON_GPIO_PIN(0x3C4, 0x7CC),
-       MX51_PIN_SD2_DATA3 = _MXC_BUILD_NON_GPIO_PIN(0x3C8, 0x7D0),
-       MX51_PIN_GPIO1_2 = _MXC_BUILD_GPIO_PIN(0, 2, 0, 0x3CC, 0x7D4),
-       MX51_PIN_GPIO1_3 = _MXC_BUILD_GPIO_PIN(0, 3, 0, 0x3D0, 0x7D8),
-       MX51_PIN_PMIC_INT_REQ = _MXC_BUILD_NON_GPIO_PIN(0x3D4, 0x7FC),
-       MX51_PIN_GPIO1_4 = _MXC_BUILD_GPIO_PIN(0, 4, 0, 0x3D8, 0x804),
-       MX51_PIN_GPIO1_5 = _MXC_BUILD_GPIO_PIN(0, 5, 0, 0x3DC, 0x808),
-       MX51_PIN_GPIO1_6 = _MXC_BUILD_GPIO_PIN(0, 6, 0, 0x3E0, 0x80C),
-       MX51_PIN_GPIO1_7 = _MXC_BUILD_GPIO_PIN(0, 7, 0, 0x3E4, 0x810),
-       MX51_PIN_GPIO1_8 = _MXC_BUILD_GPIO_PIN(0, 8, 0, 0x3E8, 0x814),
-       MX51_PIN_GPIO1_9 = _MXC_BUILD_GPIO_PIN(0, 9, 0, 0x3EC, 0x818),
-
-       /* The following are PADS used for drive strength */
-
-       MX51_PIN_CTL_GRP_DDRPKS = _MXC_BUILD_NON_GPIO_PIN(0, 0x820),
-       MX51_PIN_CTL_GRP_PKEDDR = _MXC_BUILD_NON_GPIO_PIN(0, 0x838),
-       MX51_PIN_CTL_GRP_PKEADDR = _MXC_BUILD_NON_GPIO_PIN(0, 0x890),
-       MX51_PIN_CTL_GRP_DDRAPKS = _MXC_BUILD_NON_GPIO_PIN(0, 0x87C),
-       MX51_PIN_CTL_GRP_DDRAPUS = _MXC_BUILD_NON_GPIO_PIN(0, 0x84C),
-       MX51_PIN_CTL_GRP_DDRPUS = _MXC_BUILD_NON_GPIO_PIN(0, 0x884),
-       MX51_PIN_CTL_GRP_HYSDDR0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x85C),
-       MX51_PIN_CTL_GRP_HYSDDR1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x864),
-       MX51_PIN_CTL_GRP_HYSDDR2 = _MXC_BUILD_NON_GPIO_PIN(0, 0x86C),
-       MX51_PIN_CTL_GRP_HYSDDR3 = _MXC_BUILD_NON_GPIO_PIN(0, 0x874),
-       MX51_PIN_CTL_GRP_DDR_SR_B0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x878),
-       MX51_PIN_CTL_GRP_DDR_SR_B1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x880),
-       MX51_PIN_CTL_GRP_DDR_SR_B2 = _MXC_BUILD_NON_GPIO_PIN(0, 0x88C),
-       MX51_PIN_CTL_GRP_DDR_SR_B4 = _MXC_BUILD_NON_GPIO_PIN(0, 0x89C),
-       MX51_PIN_CTL_GRP_DRAM_B0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8A4),
-       MX51_PIN_CTL_GRP_DRAM_B1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8AC),
-       MX51_PIN_CTL_GRP_DRAM_B2 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8B8),
-       MX51_PIN_CTL_GRP_DRAM_B4 = _MXC_BUILD_NON_GPIO_PIN(0, 0x82C),
-       MX51_PIN_CTL_GRP_INMODE1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8A0),
-       MX51_PIN_CTL_GRP_DDR_SR_A0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8B0),
-       MX51_PIN_CTL_GRP_EMI_DS5 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8B4),
-       MX51_PIN_CTL_GRP_DDR_SR_A1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x8BC),
-       MX51_PIN_CTL_GRP_DDR_A0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x83C),
-       MX51_PIN_CTL_GRP_DDR_A1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x848),
-       MX51_PIN_CTL_GRP_DISP_PKE0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x868),
-       MX51_PIN_CTL_DRAM_RAS = _MXC_BUILD_NON_GPIO_PIN(0, 0x4A4),
-       MX51_PIN_CTL_DRAM_CAS = _MXC_BUILD_NON_GPIO_PIN(0, 0x4A8),
-       MX51_PIN_CTL_DRAM_SDWE = _MXC_BUILD_NON_GPIO_PIN(0, 0x4Ac),
-       MX51_PIN_CTL_DRAM_SDCKE0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4B0),
-       MX51_PIN_CTL_DRAM_SDCKE1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4B4),
-       MX51_PIN_CTL_DRAM_SDCLK = _MXC_BUILD_NON_GPIO_PIN(0, 0x4B8),
-       MX51_PIN_CTL_DRAM_SDQS0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4BC),
-       MX51_PIN_CTL_DRAM_SDQS1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4C0),
-       MX51_PIN_CTL_DRAM_SDQS2 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4C4),
-       MX51_PIN_CTL_DRAM_SDQS3 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4C8),
-       MX51_PIN_CTL_DRAM_CS0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4CC),
-       MX51_PIN_CTL_DRAM_CS1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4D0),
-       MX51_PIN_CTL_DRAM_DQM0 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4D4),
-       MX51_PIN_CTL_DRAM_DQM1 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4D8),
-       MX51_PIN_CTL_DRAM_DQM2 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4DC),
-       MX51_PIN_CTL_DRAM_DQM3 = _MXC_BUILD_NON_GPIO_PIN(0, 0x4E0),
-};
-
-enum {
-       MX53_PIN_GPIO_19  = _MXC_BUILD_GPIO_PIN(3, 5, 1, 0x20, 0x348),
-       MX53_PIN_KEY_COL0 = _MXC_BUILD_GPIO_PIN(3, 6, 1, 0x24, 0x34C),
-       MX53_PIN_KEY_ROW0 = _MXC_BUILD_GPIO_PIN(3, 7, 1, 0x28, 0x350),
-       MX53_PIN_KEY_COL1 = _MXC_BUILD_GPIO_PIN(3, 8, 1, 0x2C, 0x354),
-       MX53_PIN_KEY_ROW1 = _MXC_BUILD_GPIO_PIN(3, 9, 1, 0x30, 0x358),
-       MX53_PIN_KEY_COL2 = _MXC_BUILD_GPIO_PIN(3, 10, 1, 0x34, 0x35C),
-       MX53_PIN_KEY_ROW2 = _MXC_BUILD_GPIO_PIN(3, 11, 1, 0x38, 0x360),
-       MX53_PIN_KEY_COL3 = _MXC_BUILD_GPIO_PIN(3, 12, 1, 0x3C, 0x364),
-       MX53_PIN_KEY_ROW3 = _MXC_BUILD_GPIO_PIN(3, 13, 1, 0x40, 0x368),
-       MX53_PIN_KEY_COL4 = _MXC_BUILD_GPIO_PIN(3, 14, 1, 0x44, 0x36C),
-       MX53_PIN_KEY_ROW4 = _MXC_BUILD_GPIO_PIN(3, 15, 1, 0x48, 0x370),
-       MX53_PIN_NVCC_KEYPAD = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x374),
-       MX53_PIN_DI0_DISP_CLK = _MXC_BUILD_GPIO_PIN(3, 16, 1, 0x4C, 0x378),
-       MX53_PIN_DI0_PIN15 = _MXC_BUILD_GPIO_PIN(3, 17, 1, 0x50, 0x37C),
-       MX53_PIN_DI0_PIN2 = _MXC_BUILD_GPIO_PIN(3, 18, 1, 0x54, 0x380),
-       MX53_PIN_DI0_PIN3 = _MXC_BUILD_GPIO_PIN(3, 19, 1, 0x58, 0x384),
-       MX53_PIN_DI0_PIN4 = _MXC_BUILD_GPIO_PIN(3, 20, 1, 0x5C, 0x388),
-       MX53_PIN_DISP0_DAT0 = _MXC_BUILD_GPIO_PIN(3, 21, 1, 0x60, 0x38C),
-       MX53_PIN_DISP0_DAT1 = _MXC_BUILD_GPIO_PIN(3, 22, 1, 0x64, 0x390),
-       MX53_PIN_DISP0_DAT2 = _MXC_BUILD_GPIO_PIN(3, 23, 1, 0x68, 0x394),
-       MX53_PIN_DISP0_DAT3 = _MXC_BUILD_GPIO_PIN(3, 24, 1, 0x6C, 0x398),
-       MX53_PIN_DISP0_DAT4 = _MXC_BUILD_GPIO_PIN(3, 25, 1, 0x70, 0x39C),
-       MX53_PIN_DISP0_DAT5 = _MXC_BUILD_GPIO_PIN(3, 26, 1, 0x74, 0x3A0),
-       MX53_PIN_DISP0_DAT6 = _MXC_BUILD_GPIO_PIN(3, 27, 1, 0x78, 0x3A4),
-       MX53_PIN_DISP0_DAT7 = _MXC_BUILD_GPIO_PIN(3, 28, 1, 0x7C, 0x3A8),
-       MX53_PIN_DISP0_DAT8 = _MXC_BUILD_GPIO_PIN(3, 29, 1, 0x80, 0x3AC),
-       MX53_PIN_DISP0_DAT9 = _MXC_BUILD_GPIO_PIN(3, 30, 1, 0x84, 0x3B0),
-       MX53_PIN_DISP0_DAT10 = _MXC_BUILD_GPIO_PIN(3, 31, 1, 0x88, 0x3B4),
-       MX53_PIN_DISP0_DAT11 = _MXC_BUILD_GPIO_PIN(4, 5, 1, 0x8C, 0x3B8),
-       MX53_PIN_DISP0_DAT12 = _MXC_BUILD_GPIO_PIN(4, 6, 1, 0x90, 0x3BC),
-       MX53_PIN_DISP0_DAT13 = _MXC_BUILD_GPIO_PIN(4, 7, 1, 0x94, 0x3C0),
-       MX53_PIN_DISP0_DAT14 = _MXC_BUILD_GPIO_PIN(4, 8, 1, 0x98, 0x3C4),
-       MX53_PIN_DISP0_DAT15 = _MXC_BUILD_GPIO_PIN(4, 9, 1, 0x9C, 0x3C8),
-       MX53_PIN_DISP0_DAT16 = _MXC_BUILD_GPIO_PIN(4, 10, 1, 0xA0, 0x3CC),
-       MX53_PIN_DISP0_DAT17 = _MXC_BUILD_GPIO_PIN(4, 11, 1, 0xA4, 0x3D0),
-       MX53_PIN_DISP0_DAT18 = _MXC_BUILD_GPIO_PIN(4, 12, 1, 0xA8, 0x3D4),
-       MX53_PIN_DISP0_DAT19 = _MXC_BUILD_GPIO_PIN(4, 13, 1, 0xAC, 0x3D8),
-       MX53_PIN_DISP0_DAT20 = _MXC_BUILD_GPIO_PIN(4, 14, 1, 0xB0, 0x3DC),
-       MX53_PIN_DISP0_DAT21 = _MXC_BUILD_GPIO_PIN(4, 15, 1, 0xB4, 0x3E0),
-       MX53_PIN_DISP0_DAT22 = _MXC_BUILD_GPIO_PIN(4, 16, 1, 0xB8, 0x3E4),
-       MX53_PIN_DISP0_DAT23 = _MXC_BUILD_GPIO_PIN(4, 17, 1, 0xBC, 0x3E8),
-       MX53_PIN_CSI0_PIXCLK = _MXC_BUILD_GPIO_PIN(4, 18, 1, 0xC0, 0x3EC),
-       MX53_PIN_CSI0_MCLK = _MXC_BUILD_GPIO_PIN(4, 19, 1, 0xC4, 0x3F0),
-       MX53_PIN_CSI0_DATA_EN = _MXC_BUILD_GPIO_PIN(4, 20, 1, 0xC8, 0x3F4),
-       MX53_PIN_CSI0_VSYNC = _MXC_BUILD_GPIO_PIN(4, 21, 1, 0xCC, 0x3F8),
-       MX53_PIN_CSI0_D4 = _MXC_BUILD_GPIO_PIN(4, 22, 1, 0xD0, 0x3FC),
-       MX53_PIN_CSI0_D5 = _MXC_BUILD_GPIO_PIN(4, 23, 1, 0xD4, 0x400),
-       MX53_PIN_CSI0_D6 = _MXC_BUILD_GPIO_PIN(4, 24, 1, 0xD8, 0x404),
-       MX53_PIN_CSI0_D7 = _MXC_BUILD_GPIO_PIN(4, 25, 1, 0xDC, 0x408),
-       MX53_PIN_CSI0_D8 = _MXC_BUILD_GPIO_PIN(4, 26, 1, 0xE0, 0x40C),
-       MX53_PIN_CSI0_D9 = _MXC_BUILD_GPIO_PIN(4, 27, 1, 0xE4, 0x410),
-       MX53_PIN_CSI0_D10 = _MXC_BUILD_GPIO_PIN(4, 28, 1, 0xE8, 0x414),
-       MX53_PIN_CSI0_D11 = _MXC_BUILD_GPIO_PIN(4, 29, 1, 0xEC, 0x418),
-       MX53_PIN_CSI0_D12 = _MXC_BUILD_GPIO_PIN(4, 30, 1, 0xF0, 0x41C),
-       MX53_PIN_CSI0_D13 = _MXC_BUILD_GPIO_PIN(4, 31, 1, 0xF4, 0x420),
-       MX53_PIN_CSI0_D14 = _MXC_BUILD_GPIO_PIN(5, 0, 1, 0xF8, 0x424),
-       MX53_PIN_CSI0_D15 = _MXC_BUILD_GPIO_PIN(5, 1, 1, 0xFC, 0x428),
-       MX53_PIN_CSI0_D16 = _MXC_BUILD_GPIO_PIN(5, 2, 1, 0x100, 0x42C),
-       MX53_PIN_CSI0_D17 = _MXC_BUILD_GPIO_PIN(5, 3, 1, 0x104, 0x430),
-       MX53_PIN_CSI0_D18 = _MXC_BUILD_GPIO_PIN(5, 4, 1, 0x108, 0x434),
-       MX53_PIN_CSI0_D19 = _MXC_BUILD_GPIO_PIN(5, 5, 1, 0x10C, 0x438),
-       MX53_PIN_NVCC_CSI0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x43C),
-       MX53_PIN_JTAG_TMS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x440),
-       MX53_PIN_JTAG_MOD = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x444),
-       MX53_PIN_JTAG_TRSTB = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x448),
-       MX53_PIN_JTAG_TDI = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x44C),
-       MX53_PIN_JTAG_TCK = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x450),
-       MX53_PIN_JTAG_TDO = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x454),
-       MX53_PIN_EIM_A25 = _MXC_BUILD_GPIO_PIN(4, 2, 1, 0x110, 0x458),
-       MX53_PIN_EIM_EB2 = _MXC_BUILD_GPIO_PIN(1, 30, 1, 0x114, 0x45C),
-       MX53_PIN_EIM_D16 = _MXC_BUILD_GPIO_PIN(2, 16, 1, 0x118, 0x460),
-       MX53_PIN_EIM_D17 = _MXC_BUILD_GPIO_PIN(2, 17, 1, 0x11C, 0x464),
-       MX53_PIN_EIM_D18 = _MXC_BUILD_GPIO_PIN(2, 18, 1, 0x120, 0x468),
-       MX53_PIN_EIM_D19 = _MXC_BUILD_GPIO_PIN(2, 19, 1, 0x124, 0x46C),
-       MX53_PIN_EIM_D20 = _MXC_BUILD_GPIO_PIN(2, 20, 1, 0x128, 0x470),
-       MX53_PIN_EIM_D21 = _MXC_BUILD_GPIO_PIN(2, 21, 1, 0x12C, 0x474),
-       MX53_PIN_EIM_D22 = _MXC_BUILD_GPIO_PIN(2, 22, 1, 0x130, 0x478),
-       MX53_PIN_EIM_D23 = _MXC_BUILD_GPIO_PIN(2, 23, 1, 0x134, 0x47C),
-       MX53_PIN_EIM_EB3 = _MXC_BUILD_GPIO_PIN(1, 31, 1, 0x138, 0x480),
-       MX53_PIN_EIM_D24 = _MXC_BUILD_GPIO_PIN(2, 24, 1, 0x13C, 0x484),
-       MX53_PIN_EIM_D25 = _MXC_BUILD_GPIO_PIN(2, 25, 1, 0x140, 0x488),
-       MX53_PIN_EIM_D26 = _MXC_BUILD_GPIO_PIN(2, 26, 1, 0x144, 0x48C),
-       MX53_PIN_EIM_D27 = _MXC_BUILD_GPIO_PIN(2, 27, 1, 0x148, 0x490),
-       MX53_PIN_EIM_D28 = _MXC_BUILD_GPIO_PIN(2, 28, 1, 0x14C, 0x494),
-       MX53_PIN_EIM_D29 = _MXC_BUILD_GPIO_PIN(2, 29, 1, 0x150, 0x498),
-       MX53_PIN_EIM_D30 = _MXC_BUILD_GPIO_PIN(2, 30, 1, 0x154, 0x49C),
-       MX53_PIN_EIM_D31 = _MXC_BUILD_GPIO_PIN(2, 31, 1, 0x158, 0x4A0),
-       MX53_PIN_NVCC_EIM1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4A4),
-       MX53_PIN_EIM_A24 = _MXC_BUILD_GPIO_PIN(4, 4, 1, 0x15C, 0x4A8),
-       MX53_PIN_EIM_A23 = _MXC_BUILD_GPIO_PIN(5, 6, 1, 0x160, 0x4AC),
-       MX53_PIN_EIM_A22 = _MXC_BUILD_GPIO_PIN(1, 16, 1, 0x164, 0x4B0),
-       MX53_PIN_EIM_A21 = _MXC_BUILD_GPIO_PIN(1, 17, 1, 0x168, 0x4B4),
-       MX53_PIN_EIM_A20 = _MXC_BUILD_GPIO_PIN(1, 18, 1, 0x16C, 0x4B8),
-       MX53_PIN_EIM_A19 = _MXC_BUILD_GPIO_PIN(1, 19, 1, 0x170, 0x4BC),
-       MX53_PIN_EIM_A18 = _MXC_BUILD_GPIO_PIN(1, 20, 1, 0x174, 0x4C0),
-       MX53_PIN_EIM_A17 = _MXC_BUILD_GPIO_PIN(1, 21, 1, 0x178, 0x4C4),
-       MX53_PIN_EIM_A16 = _MXC_BUILD_GPIO_PIN(1, 22, 1, 0x17C, 0x4C8),
-       MX53_PIN_EIM_CS0 = _MXC_BUILD_GPIO_PIN(1, 23, 1, 0x180, 0x4CC),
-       MX53_PIN_EIM_CS1 = _MXC_BUILD_GPIO_PIN(1, 24, 1, 0x184, 0x4D0),
-       MX53_PIN_EIM_OE = _MXC_BUILD_GPIO_PIN(1, 25, 1, 0x188, 0x4D4),
-       MX53_PIN_EIM_RW = _MXC_BUILD_GPIO_PIN(1, 26, 1, 0x18C, 0x4D8),
-       MX53_PIN_EIM_LBA = _MXC_BUILD_GPIO_PIN(1, 27, 1, 0x190, 0x4DC),
-       MX53_PIN_NVCC_EIM4 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x4E0),
-       MX53_PIN_EIM_EB0 = _MXC_BUILD_GPIO_PIN(1, 28, 1, 0x194, 0x4E4),
-       MX53_PIN_EIM_EB1 = _MXC_BUILD_GPIO_PIN(1, 29, 1, 0x198, 0x4E8),
-       MX53_PIN_EIM_DA0 = _MXC_BUILD_GPIO_PIN(2, 0, 1, 0x19C, 0x4EC),
-       MX53_PIN_EIM_DA1 = _MXC_BUILD_GPIO_PIN(2, 1, 1, 0x1A0, 0x4F0),
-       MX53_PIN_EIM_DA2 = _MXC_BUILD_GPIO_PIN(2, 2, 1, 0x1A4, 0x4F4),
-       MX53_PIN_EIM_DA3 = _MXC_BUILD_GPIO_PIN(2, 3, 1, 0x1A8, 0x4F8),
-       MX53_PIN_EIM_DA4 = _MXC_BUILD_GPIO_PIN(2, 4, 1, 0x1AC, 0x4FC),
-       MX53_PIN_EIM_DA5 = _MXC_BUILD_GPIO_PIN(2, 5, 1, 0x1B0, 0x500),
-       MX53_PIN_EIM_DA6 = _MXC_BUILD_GPIO_PIN(2, 6, 1, 0x1B4, 0x504),
-       MX53_PIN_EIM_DA7 = _MXC_BUILD_GPIO_PIN(2, 7, 1, 0x1B8, 0x508),
-       MX53_PIN_EIM_DA8 = _MXC_BUILD_GPIO_PIN(2, 8, 1, 0x1BC, 0x50C),
-       MX53_PIN_EIM_DA9 = _MXC_BUILD_GPIO_PIN(2, 9, 1, 0x1C0, 0x510),
-       MX53_PIN_EIM_DA10 = _MXC_BUILD_GPIO_PIN(2, 10, 1, 0x1C4, 0x514),
-       MX53_PIN_EIM_DA11 = _MXC_BUILD_GPIO_PIN(2, 11, 1, 0x1C8, 0x518),
-       MX53_PIN_EIM_DA12 = _MXC_BUILD_GPIO_PIN(2, 12, 1, 0x1CC, 0x51C),
-       MX53_PIN_EIM_DA13 = _MXC_BUILD_GPIO_PIN(2, 13, 1, 0x1D0, 0x520),
-       MX53_PIN_EIM_DA14 = _MXC_BUILD_GPIO_PIN(2, 14, 1, 0x1D4, 0x524),
-       MX53_PIN_EIM_DA15 = _MXC_BUILD_GPIO_PIN(2, 15, 1, 0x1D8, 0x528),
-       MX53_PIN_NANDF_WE_B = _MXC_BUILD_GPIO_PIN(5, 12, 1, 0x1DC, 0x52C),
-       MX53_PIN_NANDF_RE_B = _MXC_BUILD_GPIO_PIN(5, 13, 1, 0x1E0, 0x530),
-       MX53_PIN_EIM_WAIT = _MXC_BUILD_GPIO_PIN(4, 0, 1, 0x1E4, 0x534),
-       MX53_PIN_EIM_BCLK = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x538),
-       MX53_PIN_NVCC_EIM7 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x53C),
-       MX53_PIN_LVDS1_TX3_P = _MXC_BUILD_GPIO_PIN(5, 22, 0, 0x1EC, NON_PAD_I),
-       MX53_PIN_LVDS1_TX2_P = _MXC_BUILD_GPIO_PIN(5, 24, 0, 0x1F0, NON_PAD_I),
-       MX53_PIN_LVDS1_CLK_P = _MXC_BUILD_GPIO_PIN(5, 26, 0, 0x1F4, NON_PAD_I),
-       MX53_PIN_LVDS1_TX1_P = _MXC_BUILD_GPIO_PIN(5, 28, 0, 0x1F8, NON_PAD_I),
-       MX53_PIN_LVDS1_TX0_P = _MXC_BUILD_GPIO_PIN(5, 30, 0, 0x1FC, NON_PAD_I),
-       MX53_PIN_LVDS0_TX3_P = _MXC_BUILD_GPIO_PIN(6, 22, 0, 0x200, NON_PAD_I),
-       MX53_PIN_LVDS0_CLK_P = _MXC_BUILD_GPIO_PIN(6, 24, 0, 0x204, NON_PAD_I),
-       MX53_PIN_LVDS0_TX2_P = _MXC_BUILD_GPIO_PIN(6, 26, 0, 0x208, NON_PAD_I),
-       MX53_PIN_LVDS0_TX1_P = _MXC_BUILD_GPIO_PIN(6, 28, 0, 0x20C, NON_PAD_I),
-       MX53_PIN_LVDS0_TX0_P = _MXC_BUILD_GPIO_PIN(6, 30, 0, 0x210, NON_PAD_I),
-       MX53_PIN_GPIO_10 = _MXC_BUILD_GPIO_PIN(3, 0, 0, 0x214, 0x540),
-       MX53_PIN_GPIO_11 = _MXC_BUILD_GPIO_PIN(3, 1, 0, 0x218, 0x544),
-       MX53_PIN_GPIO_12 = _MXC_BUILD_GPIO_PIN(3, 2, 0, 0x21C, 0x548),
-       MX53_PIN_GPIO_13 = _MXC_BUILD_GPIO_PIN(3, 3, 0, 0x220, 0x54C),
-       MX53_PIN_GPIO_14 = _MXC_BUILD_GPIO_PIN(3, 4, 0, 0x224, 0x550),
-       MX53_PIN_DRAM_DQM3 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x554),
-       MX53_PIN_DRAM_SDQS3 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x558),
-       MX53_PIN_DRAM_SDCKE1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x55C),
-       MX53_PIN_DRAM_DQM2 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x560),
-       MX53_PIN_DRAM_SDODT1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x564),
-       MX53_PIN_DRAM_SDQS2 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x568),
-       MX53_PIN_DRAM_RESET = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x56C),
-       MX53_PIN_DRAM_SDCLK1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x570),
-       MX53_PIN_DRAM_CAS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x574),
-       MX53_PIN_DRAM_SDCLK0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x578),
-       MX53_PIN_DRAM_SDQS0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x57C),
-       MX53_PIN_DRAM_SDODT0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x580),
-       MX53_PIN_DRAM_DQM0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x584),
-       MX53_PIN_DRAM_RAS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x588),
-       MX53_PIN_DRAM_SDCKE0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x58C),
-       MX53_PIN_DRAM_SDQS1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x590),
-       MX53_PIN_DRAM_DQM1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x594),
-       MX53_PIN_PMIC_ON_REQ = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x598),
-       MX53_PIN_PMIC_STBY_REQ = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x59C),
-       MX53_PIN_NANDF_CLE = _MXC_BUILD_GPIO_PIN(5, 7, 1, 0x228, 0x5A0),
-       MX53_PIN_NANDF_ALE = _MXC_BUILD_GPIO_PIN(5, 8 , 1, 0x22C, 0x5A4),
-       MX53_PIN_NANDF_WP_B = _MXC_BUILD_GPIO_PIN(5, 9, 1, 0x230, 0x5A8),
-       MX53_PIN_NANDF_RB0 = _MXC_BUILD_GPIO_PIN(5, 10, 1, 0x234, 0x5AC),
-       MX53_PIN_NANDF_CS0 = _MXC_BUILD_GPIO_PIN(5, 11, 1, 0x238, 0x5B0),
-       MX53_PIN_NANDF_CS1 = _MXC_BUILD_GPIO_PIN(5, 14, 1, 0x23C, 0x5B4),
-       MX53_PIN_NANDF_CS2 = _MXC_BUILD_GPIO_PIN(5, 15, 1, 0x240, 0x5B8),
-       MX53_PIN_NANDF_CS3 = _MXC_BUILD_GPIO_PIN(5, 16, 1, 0x244, 0x5BC),
-       MX53_PIN_NVCC_NANDF = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x5C0),
-       MX53_PIN_FEC_MDIO = _MXC_BUILD_GPIO_PIN(0, 22, 1, 0x248, 0x5C4),
-       MX53_PIN_FEC_REF_CLK = _MXC_BUILD_GPIO_PIN(0, 23, 1, 0x24C, 0x5C8),
-       MX53_PIN_FEC_RX_ER = _MXC_BUILD_GPIO_PIN(0, 24, 1, 0x250, 0x5CC),
-       MX53_PIN_FEC_CRS_DV = _MXC_BUILD_GPIO_PIN(0, 25, 1, 0x254, 0x5D0),
-       MX53_PIN_FEC_RXD1 = _MXC_BUILD_GPIO_PIN(0, 26, 1, 0x258, 0x5D4),
-       MX53_PIN_FEC_RXD0 = _MXC_BUILD_GPIO_PIN(0, 27, 1, 0x25C, 0x5D8),
-       MX53_PIN_FEC_TX_EN = _MXC_BUILD_GPIO_PIN(0, 28, 1, 0x260, 0x5DC),
-       MX53_PIN_FEC_TXD1 = _MXC_BUILD_GPIO_PIN(0, 29, 1, 0x264, 0x5E0),
-       MX53_PIN_FEC_TXD0 = _MXC_BUILD_GPIO_PIN(0, 30, 1, 0x268, 0x5E4),
-       MX53_PIN_FEC_MDC = _MXC_BUILD_GPIO_PIN(0, 31, 1, 0x26C, 0x5E8),
-       MX53_PIN_NVCC_FEC = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x5EC),
-       MX53_PIN_ATA_DIOW = _MXC_BUILD_GPIO_PIN(5, 17, 1, 0x270, 0x5F0),
-       MX53_PIN_ATA_DMACK = _MXC_BUILD_GPIO_PIN(5, 18, 1, 0x274, 0x5F4),
-       MX53_PIN_ATA_DMARQ = _MXC_BUILD_GPIO_PIN(6, 0, 1, 0x278, 0x5F8),
-       MX53_PIN_ATA_BUFFER_EN = _MXC_BUILD_GPIO_PIN(6, 1, 1, 0x27C, 0x5FC),
-       MX53_PIN_ATA_INTRQ = _MXC_BUILD_GPIO_PIN(6, 2, 1, 0x280, 0x600),
-       MX53_PIN_ATA_DIOR = _MXC_BUILD_GPIO_PIN(6, 3, 1, 0x284, 0x604),
-       MX53_PIN_ATA_RESET_B = _MXC_BUILD_GPIO_PIN(6, 4, 1, 0x288, 0x608),
-       MX53_PIN_ATA_IORDY = _MXC_BUILD_GPIO_PIN(6, 5, 1, 0x28C, 0x60C),
-       MX53_PIN_ATA_DA_0 = _MXC_BUILD_GPIO_PIN(6, 6, 1, 0x290, 0x610),
-       MX53_PIN_ATA_DA_1 = _MXC_BUILD_GPIO_PIN(6, 7, 1, 0x294, 0x614),
-       MX53_PIN_ATA_DA_2 = _MXC_BUILD_GPIO_PIN(6, 8, 1, 0x298, 0x618),
-       MX53_PIN_ATA_CS_0 = _MXC_BUILD_GPIO_PIN(6, 9, 1, 0x29C, 0x61C),
-       MX53_PIN_ATA_CS_1 = _MXC_BUILD_GPIO_PIN(6, 10, 1, 0x2A0, 0x620),
-       MX53_PIN_NVCC_ATA2 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x624),
-       MX53_PIN_ATA_DATA0 = _MXC_BUILD_GPIO_PIN(1, 0, 1, 0x2A4, 0x628),
-       MX53_PIN_ATA_DATA1 = _MXC_BUILD_GPIO_PIN(1, 1, 1, 0x2A8, 0x62C),
-       MX53_PIN_ATA_DATA2 = _MXC_BUILD_GPIO_PIN(1, 2, 1, 0x2AC, 0x630),
-       MX53_PIN_ATA_DATA3 = _MXC_BUILD_GPIO_PIN(1, 3, 1, 0x2B0, 0x634),
-       MX53_PIN_ATA_DATA4 = _MXC_BUILD_GPIO_PIN(1, 4, 1, 0x2B4, 0x638),
-       MX53_PIN_ATA_DATA5 = _MXC_BUILD_GPIO_PIN(1, 5, 1, 0x2B8, 0x63C),
-       MX53_PIN_ATA_DATA6 = _MXC_BUILD_GPIO_PIN(1, 6, 1, 0x2BC, 0x640),
-       MX53_PIN_ATA_DATA7 = _MXC_BUILD_GPIO_PIN(1, 7, 1, 0x2C0, 0x644),
-       MX53_PIN_ATA_DATA8 = _MXC_BUILD_GPIO_PIN(1, 8, 1, 0x2C4, 0x648),
-       MX53_PIN_ATA_DATA9 = _MXC_BUILD_GPIO_PIN(1, 9, 1, 0x2C8, 0x64C),
-       MX53_PIN_ATA_DATA10 = _MXC_BUILD_GPIO_PIN(1, 10, 1, 0x2CC, 0x650),
-       MX53_PIN_ATA_DATA11 = _MXC_BUILD_GPIO_PIN(1, 11, 1, 0x2D0, 0x654),
-       MX53_PIN_ATA_DATA12 = _MXC_BUILD_GPIO_PIN(1, 12, 1, 0x2D4, 0x658),
-       MX53_PIN_ATA_DATA13 = _MXC_BUILD_GPIO_PIN(1, 13, 1, 0x2D8, 0x65C),
-       MX53_PIN_ATA_DATA14 = _MXC_BUILD_GPIO_PIN(1, 14, 1, 0x2DC, 0x660),
-       MX53_PIN_ATA_DATA15 = _MXC_BUILD_GPIO_PIN(1, 15, 1, 0x2E0, 0x664),
-       MX53_PIN_NVCC_ATA0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x668),
-       MX53_PIN_SD1_DATA0 = _MXC_BUILD_GPIO_PIN(0, 16, 1, 0x2E4, 0x66C),
-       MX53_PIN_SD1_DATA1 = _MXC_BUILD_GPIO_PIN(0, 17, 1, 0x2E8, 0x670),
-       MX53_PIN_SD1_CMD = _MXC_BUILD_GPIO_PIN(0, 18, 1, 0x2EC, 0x674),
-       MX53_PIN_SD1_DATA2 = _MXC_BUILD_GPIO_PIN(0, 19, 1, 0x2F0, 0x678),
-       MX53_PIN_SD1_CLK = _MXC_BUILD_GPIO_PIN(0, 20, 1, 0x2F4, 0x67C),
-       MX53_PIN_SD1_DATA3 = _MXC_BUILD_GPIO_PIN(0, 21, 1, 0x2F8, 0x680),
-       MX53_PIN_NVCC_SD1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x684),
-       MX53_PIN_SD2_CLK = _MXC_BUILD_GPIO_PIN(0, 10, 1, 0x2FC, 0x688),
-       MX53_PIN_SD2_CMD = _MXC_BUILD_GPIO_PIN(0, 11, 1, 0x300, 0x68C),
-       MX53_PIN_SD2_DATA3 = _MXC_BUILD_GPIO_PIN(0, 12, 1, 0x304, 0x690),
-       MX53_PIN_SD2_DATA2 = _MXC_BUILD_GPIO_PIN(0, 13, 1, 0x308, 0x694),
-       MX53_PIN_SD2_DATA1 = _MXC_BUILD_GPIO_PIN(0, 14, 1, 0x30C, 0x698),
-       MX53_PIN_SD2_DATA0 = _MXC_BUILD_GPIO_PIN(0, 15, 1, 0x310, 0x69C),
-       MX53_PIN_NVCC_SD2 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6A0),
-       MX53_PIN_GPIO_0 = _MXC_BUILD_GPIO_PIN(0, 0, 1, 0x314, 0x6A4),
-       MX53_PIN_GPIO_1 = _MXC_BUILD_GPIO_PIN(0, 1, 1, 0x318, 0x6A8),
-       MX53_PIN_GPIO_9 = _MXC_BUILD_GPIO_PIN(0, 9, 1, 0x31C, 0x6AC),
-       MX53_PIN_GPIO_3 = _MXC_BUILD_GPIO_PIN(0, 3, 1, 0x320, 0x6B0),
-       MX53_PIN_GPIO_6 = _MXC_BUILD_GPIO_PIN(0, 6, 1, 0x324, 0x6B4),
-       MX53_PIN_GPIO_2 = _MXC_BUILD_GPIO_PIN(0, 2, 1, 0x328, 0x6B8),
-       MX53_PIN_GPIO_4 = _MXC_BUILD_GPIO_PIN(0, 4, 1, 0x32C, 0x6BC),
-       MX53_PIN_GPIO_5 = _MXC_BUILD_GPIO_PIN(0, 5, 1, 0x330, 0x6C0),
-       MX53_PIN_GPIO_7 = _MXC_BUILD_GPIO_PIN(0, 7, 1, 0x334, 0x6C4),
-       MX53_PIN_GPIO_8 = _MXC_BUILD_GPIO_PIN(0, 8, 1, 0x338, 0x6C8),
-       MX53_PIN_GPIO_16 = _MXC_BUILD_GPIO_PIN(6, 11, 1, 0x33C, 0x6CC),
-       MX53_PIN_GPIO_17 = _MXC_BUILD_GPIO_PIN(6, 12, 1, 0x340, 0x6D0),
-       MX53_PIN_GPIO_18 = _MXC_BUILD_GPIO_PIN(6, 13, 1, 0x344, 0x6D4),
-       MX53_PIN_NVCC_GPIO = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6D8),
-       MX53_PIN_POR_B = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6DC),
-       MX53_PIN_BOOT_MODE1 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6E0),
-       MX53_PIN_RESET_IN_B = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6E4),
-       MX53_PIN_BOOT_MODE0 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6E8),
-       MX53_PIN_TEST_MODE = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6EC),
-       MX53_PIN_GRP_ADDDS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6F0),
-       MX53_PIN_GRP_DDRMODE_CTL = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6F4),
-       MX53_PIN_GRP_DDRPKE = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x6FC),
-       MX53_PIN_GRP_DDRPK = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x708),
-       MX53_PIN_GRP_TERM_CTL3 = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x70C),
-       MX53_PIN_GRP_DDRHYS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x710),
-       MX53_PIN_GRP_DDRMODE = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x714),
-       MX53_PIN_GRP_B0DS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x718),
-       MX53_PIN_GRP_B1DS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x71C),
-       MX53_PIN_GRP_CTLDS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x720),
-       MX53_PIN_GRP_DDR_TYPE = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x724),
-       MX53_PIN_GRP_B2DS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x728),
-       MX53_PIN_GRP_B3DS = _MXC_BUILD_NON_GPIO_PIN(NON_MUX_I, 0x72C),
-};
-/* various IOMUX input select register index */
-typedef enum iomux_input_select {
-       MX51_AUDMUX_P4_INPUT_DA_AMX_SELECT_I = 0,
-       MX51_AUDMUX_P4_INPUT_DB_AMX_SELECT_I,
-       MX51_AUDMUX_P4_INPUT_TXCLK_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P4_INPUT_TXFS_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P5_INPUT_DA_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P5_INPUT_DB_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P5_INPUT_RXCLK_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P5_INPUT_RXFS_AMX_SELECT,
-       MX51_AUDMUX_P5_INPUT_TXCLK_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P5_INPUT_TXFS_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_DA_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_DB_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_RXCLK_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_RXFS_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_TXCLK_AMX_SELECT_INPUT,
-       MX51_AUDMUX_P6_INPUT_TXFS_AMX_SELECT_INPUT,
-       MX51_CCM_IPP_DI_CLK_SELECT_INPUT,
-       /* TO2 */
-       MX51_CCM_IPP_DI1_CLK_SELECT_INPUT,
-       MX51_CCM_PLL1_BYPASS_CLK_SELECT_INPUT,
-       MX51_CCM_PLL2_BYPASS_CLK_SELECT_INPUT,
-       MX51_CSPI_IPP_CSPI_CLK_IN_SELECT_INPUT,
-       MX51_CSPI_IPP_IND_MISO_SELECT_INPUT,
-       MX51_CSPI_IPP_IND_MOSI_SELECT_INPUT,
-       MX51_CSPI_IPP_IND_SS_B_1_SELECT_INPUT,
-       MX51_CSPI_IPP_IND_SS_B_2_SELECT_INPUT,
-       MX51_CSPI_IPP_IND_SS_B_3_SELECT_INPUT,
-       MX51_DPLLIP1_L1T_TOG_EN_SELECT_INPUT,
-       /* TO2 */
-       MX51_ECSPI2_IPP_IND_SS_B_1_SELECT_INPUT,
-       MX51_ECSPI2_IPP_IND_SS_B_3_SELECT_INPUT,
-       MX51_EMI_IPP_IND_RDY_INT_SELECT_INPUT,
-       MX51_ESDHC3_IPP_DAT0_IN_SELECT_INPUT,
-       MX51_ESDHC3_IPP_DAT1_IN_SELECT_INPUT,
-       MX51_ESDHC3_IPP_DAT2_IN_SELECT_INPUT,
-       MX51_ESDHC3_IPP_DAT3_IN_SELECT_INPUT,
-       MX51_FEC_FEC_COL_SELECT_INPUT,
-       MX51_FEC_FEC_CRS_SELECT_INPUT,
-       MX51_FEC_FEC_MDI_SELECT_INPUT,
-       MX51_FEC_FEC_RDATA_0_SELECT_INPUT,
-       MX51_FEC_FEC_RDATA_1_SELECT_INPUT,
-       MX51_FEC_FEC_RDATA_2_SELECT_INPUT,
-       MX51_FEC_FEC_RDATA_3_SELECT_INPUT,
-       MX51_FEC_FEC_RX_CLK_SELECT_INPUT,
-       MX51_FEC_FEC_RX_DV_SELECT_INPUT,
-       MX51_FEC_FEC_RX_ER_SELECT_INPUT,
-       MX51_FEC_FEC_TX_CLK_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_1_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_2_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_3_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_4_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_5_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_6_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_7_SELECT_INPUT,
-       MX51_GPIO3_IPP_IND_G_IN_8_SELECT_INPUT,
-       /* TO2 */
-       MX51_GPIO3_IPP_IND_G_IN_12_SELECT_INPUT,
-       MX51_HSC_MIPI_MIX_IPP_IND_SENS1_DATA_EN_SELECT_INPUT,
-       MX51_HSC_MIPI_MIX_IPP_IND_SENS2_DATA_EN_SELECT_INPUT,
-       /* TO2 */
-       MX51_HSC_MIPI_MIX_PAR_VSYNC_SELECT_INPUT,
-       /* TO2 */
-       MX51_HSC_MIPI_MIX_PAR_DI_WAIT_SELECT_INPUT,
-       MX51_HSC_MIPI_MIX_PAR_SISG_TRIG_SELECT_INPUT,
-       MX51_I2C1_IPP_SCL_IN_SELECT_INPUT,
-       MX51_I2C1_IPP_SDA_IN_SELECT_INPUT,
-       MX51_I2C2_IPP_SCL_IN_SELECT_INPUT,
-       MX51_I2C2_IPP_SDA_IN_SELECT_INPUT,
-       MX51_IPU_IPP_DI_0_IND_DISPB_SD_D_SELECT_INPUT,
-       MX51_IPU_IPP_DI_1_IND_DISPB_SD_D_SELECT_INPUT,
-       MX51_KPP_IPP_IND_COL_6_SELECT_INPUT,
-       MX51_KPP_IPP_IND_COL_7_SELECT_INPUT,
-       MX51_KPP_IPP_IND_ROW_4_SELECT_INPUT,
-       MX51_KPP_IPP_IND_ROW_5_SELECT_INPUT,
-       MX51_KPP_IPP_IND_ROW_6_SELECT_INPUT,
-       MX51_KPP_IPP_IND_ROW_7_SELECT_INPUT,
-       MX51_UART1_IPP_UART_RTS_B_SELECT_INPUT,
-       MX51_UART1_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX51_UART2_IPP_UART_RTS_B_SELECT_INPUT,
-       MX51_UART2_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX51_UART3_IPP_UART_RTS_B_SELECT_INPUT,
-       MX51_UART3_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_CLK_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_0_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_1_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_2_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_3_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_4_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_5_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_6_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DATA_7_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_DIR_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_NXT_SELECT_INPUT,
-       MX51_USBOH3_IPP_IND_UH3_STP_SELECT_INPUT,
-       MX51PUT_NUM_MUX,
-       /* MX53 */
-       MX53_AUDMUX_P4_INPUT_DA_AMX_SELECT_I = 0,
-       MX53_AUDMUX_P4_INPUT_DB_AMX_SELECT_I,
-       MX53_AUDMUX_P4_INPUT_RXCLK_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P4_INPUT_RXFS_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P4_INPUT_TXCLK_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P4_INPUT_TXFS_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P5_INPUT_DA_AMX_SELECT_I,
-       MX53_AUDMUX_P5_INPUT_DB_AMX_SELECT_I,
-       MX53_AUDMUX_P5_INPUT_RXCLK_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P5_INPUT_RXFS_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P5_INPUT_TXCLK_AMX_SELECT_INPUT,
-       MX53_AUDMUX_P5_INPUT_TXFS_AMX_SELECT_INPUT,
-       MX53_CAN1_IPP_IND_CANRX_SELECT_INPUT,
-       MX53_CAN2_IPP_IND_CANRX_SELECT_INPUT,
-       MX53_CCM_IPP_ASRC_EXT_SELECT_INPUT,
-       MX53_CCM_IPP_DI1_CLK_SELECT_INPUT,
-       MX53_CCM_PLL1_BYPASS_CLK_SELECT_INPUT,
-       MX53_CCM_PLL2_BYPASS_CLK_SELECT_INPUT,
-       MX53_CCM_PLL3_BYPASS_CLK_SELECT_INPUT,
-       MX53_CCM_PLL4_BYPASS_CLK_SELECT_INPUT,
-       MX53_CSPI_IPP_CSPI_CLK_IN_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_MISO_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_MOSI_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_SS_B_0_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_SS_B_1_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_SS_B_2_SELECT_INPUT,
-       MX53_CSPI_IPP_IND_SS_B_3_SELECT_INPUT,
-       MX53_ECSPI1_IPP_CSPI_CLK_IN_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_MISO_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_MOSI_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_SS_B_0_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_SS_B_2_SELECT_INPUT,
-       MX53_ECSPI1_IPP_IND_SS_B_3_SELECT_INPUT,
-       MX53_ECSPI2_IPP_CSPI_CLK_IN_SELECT_INPUT,
-       MX53_ECSPI2_IPP_IND_MISO_SELECT_INPUT,
-       MX53_ECSPI2_IPP_IND_MOSI_SELECT_INPUT,
-       MX53_ECSPI2_IPP_IND_SS_B_0_SELECT_INPUT,
-       MX53_ECSPI2_IPP_IND_SS_B_1_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_FSR_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_FST_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_HCKR_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_HCKT_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SCKR_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SCKT_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO0_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO1_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO2_SDI3_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO3_SDI2_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO4_SDI1_SELECT_INPUT,
-       MX53_ESAI1_IPP_IND_SDO5_SDI0_SELECT_INPUT,
-       MX53_ESDHC1_IPP_WP_ON_SELECT_INPUT,
-       MX53_FEC_FEC_COL_SELECT_INPUT,
-       MX53_FEC_FEC_MDI_SELECT_INPUT,
-       MX53_FEC_FEC_RX_CLK_SELECT_INPUT,
-       MX53_FIRI_IPP_IND_RXD_SELECT_INPUT,
-       MX53_GPC_PMIC_RDY_SELECT_INPUT,
-       MX53_I2C1_IPP_SCL_IN_SELECT_INPUT,
-       MX53_I2C1_IPP_SDA_IN_SELECT_INPUT,
-       MX53_I2C2_IPP_SCL_IN_SELECT_INPUT,
-       MX53_I2C2_IPP_SDA_IN_SELECT_INPUT,
-       MX53_I2C3_IPP_SCL_IN_SELECT_INPUT,
-       MX53_I2C3_IPP_SDA_IN_SELECT_INPUT,
-       MX53_IPU_IPP_DI_0_IND_DISPB_SD_D_SELECT_INPUT,
-       MX53_IPU_IPP_DI_1_IND_DISPB_SD_D_SELECT_INPUT,
-       MX53_IPU_IPP_IND_SENS1_DATA_EN_SELECT_INPUT,
-       MX53_IPU_IPP_IND_SENS1_HSYNC_SELECT_INPUT,
-       MX53_IPU_IPP_IND_SENS1_VSYNC_SELECT_INPUT,
-       MX53_KPP_IPP_IND_COL_5_SELECT_INPUT,
-       MX53_KPP_IPP_IND_COL_6_SELECT_INPUT,
-       MX53_KPP_IPP_IND_COL_7_SELECT_INPUT,
-       MX53_KPP_IPP_IND_ROW_5_SELECT_INPUT,
-       MX53_KPP_IPP_IND_ROW_6_SELECT_INPUT,
-       MX53_KPP_IPP_IND_ROW_7_SELECT_INPUT,
-       MX53_MLB_MLBCLK_IN_SELECT_INPUT,
-       MX53_MLB_MLBDAT_IN_SELECT_INPUT,
-       MX53_MLB_MLBSIG_IN_SELECT_INPUT,
-       MX53_OWIRE_BATTERY_LINE_IN_SELECT_INPUT,
-       MX53_SDMA_EVENTS_14_SELECT_INPUT,
-       MX53_SDMA_EVENTS_15_SELECT_INPUT,
-       MX53_SPDIF_SPDIF_IN1_SELECT_INPUT,
-       MX53_UART1_IPP_UART_RTS_B_SELECT_INPUT,
-       MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX53_UART2_IPP_UART_RTS_B_SELECT_INPUT,
-       MX53_UART2_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX53_UART3_IPP_UART_RTS_B_SELECT_INPUT,
-       MX53_UART3_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX53_UART4_IPP_UART_RTS_B_SELECT_INPUT,
-       MX53_UART4_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX53_UART5_IPP_UART_RTS_B_SELECT_INPUT,
-       MX53_UART5_IPP_UART_RXD_MUX_SELECT_INPUT,
-       MX53_USBOH3_IPP_IND_OTG_OC_SELECT_INPUT,
-       MX53_USBOH3_IPP_IND_UH1_OC_SELECT_INPUT,
-       MX53_USBOH3_IPP_IND_UH2_OC_SELECT_INPUT,
-} iomux_input_select_t;
-
-#endif                         /* __ASSEMBLY__ */
-#endif                         /* __ASM_ARCH_MX5_MX5X_PINS_H__ */
diff --git a/arch/arm/include/asm/arch-mx5/spl.h b/arch/arm/include/asm/arch-mx5/spl.h
new file mode 100644 (file)
index 0000000..e0b6e3e
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 Marek Vasut <marex@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.
+ */
+
+#ifndef __ASM_ARCH_SPL_H__
+#define __ASM_ARCH_SPL_H__
+
+#define BOOT_DEVICE_NONE       0
+#define BOOT_DEVICE_NAND       1
+
+#endif /* __ASM_ARCH_SPL_H__ */
index db377cc31dc976b392069b75ed9db0d3d619669d..cfd4edcb5e1cec21c48147d47b89fc4dfc87ea37 100644 (file)
@@ -61,6 +61,7 @@ enum mxc_clock {
 u32 imx_get_uartclk(void);
 u32 imx_get_fecclk(void);
 unsigned int mxc_get_clock(enum mxc_clock clk);
+void enable_ocotp_clk(unsigned char enable);
 void enable_usboh3_clk(unsigned char enable);
 int enable_sata_clock(void);
 int enable_i2c_clk(unsigned char enable, unsigned i2c_num);
index 76764571a700b9e7d64ef4ebb0b0d5c884a83b26..aa9747ce334662d3f6192aa0f42092c224c2decb 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef __ARCH_ARM_MACH_MX6_CCM_REGS_H__
 #define __ARCH_ARM_MACH_MX6_CCM_REGS_H__
 
+#define CCM_CCOSR              0x020c4060
 #define CCM_CCGR0              0x020C4068
 #define CCM_CCGR1              0x020C406c
 #define CCM_CCGR2              0x020C4070
@@ -244,7 +245,12 @@ struct mxc_ccm_reg {
 #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)
+#ifdef CONFIG_MX6SL
+#define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK              0x1F
+#define MXC_CCM_CSCDR1_UART_CLK_SEL                    (1 << 6)
+#else
 #define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK              0x3F
+#endif
 #define MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET            0
 
 /* Define the bits in register CS1CDR */
@@ -262,10 +268,13 @@ struct mxc_ccm_reg {
 /* 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_PODF(v)                        (((v) & 0x3f) << 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_PRED(v)                        (((v) & 0x7) << 18)
 #define MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK               (0x3 << 16)
 #define MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET             16
+#define MXC_CCM_CS2CDR_ENFC_CLK_SEL(v)                 (((v) & 0x3) << 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)
@@ -412,183 +421,183 @@ struct mxc_ccm_reg {
 #define MXC_CCM_CCGR_CG_MASK                           3
 
 #define MXC_CCM_CCGR0_AIPS_TZ1_OFFSET                  0
-#define MXC_CCM_CCGR0_AIPS_TZ1_MASK                    (3<<MXC_CCM_CCGR0_AIPS_TZ1_OFFSET)
+#define MXC_CCM_CCGR0_AIPS_TZ1_MASK                    (3 << MXC_CCM_CCGR0_AIPS_TZ1_OFFSET)
 #define MXC_CCM_CCGR0_AIPS_TZ2_OFFSET                  2
-#define MXC_CCM_CCGR0_AIPS_TZ2_MASK                    (3<<MXC_CCM_CCGR0_AIPS_TZ2_OFFSET)
-#define MXC_CCM_CCGR0_APBHDMA HCLK_OFFSET              4
-#define MXC_CCM_CCGR0_AMASK                            (3<<MXC_CCM_CCGR0_APBHDMA)
+#define MXC_CCM_CCGR0_AIPS_TZ2_MASK                    (3 << MXC_CCM_CCGR0_AIPS_TZ2_OFFSET)
+#define MXC_CCM_CCGR0_APBHDMA_OFFSET                   4
+#define MXC_CCM_CCGR0_APBHDMA_MASK                     (3 << MXC_CCM_CCGR0_APBHDMA_OFFSET)
 #define MXC_CCM_CCGR0_ASRC_OFFSET                      6
-#define MXC_CCM_CCGR0_ASRC_MASK                                (3<<MXC_CCM_CCGR0_ASRC_OFFSET)
+#define MXC_CCM_CCGR0_ASRC_MASK                                (3 << MXC_CCM_CCGR0_ASRC_OFFSET)
 #define MXC_CCM_CCGR0_CAAM_SECURE_MEM_OFFSET           8
-#define MXC_CCM_CCGR0_CAAM_SECURE_MEM_MASK             (3<<MXC_CCM_CCGR0_CAAM_SECURE_MEM_OFFSET)
+#define MXC_CCM_CCGR0_CAAM_SECURE_MEM_MASK             (3 << MXC_CCM_CCGR0_CAAM_SECURE_MEM_OFFSET)
 #define MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_OFFSET         10
-#define MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_MASK           (3<<MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_OFFSET)
+#define MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_MASK           (3 << MXC_CCM_CCGR0_CAAM_WRAPPER_ACLK_OFFSET)
 #define MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_OFFSET          12
-#define MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_MASK            (3<<MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_OFFSET)
+#define MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_MASK            (3 << MXC_CCM_CCGR0_CAAM_WRAPPER_IPG_OFFSET)
 #define MXC_CCM_CCGR0_CAN1_OFFSET                      14
-#define MXC_CCM_CCGR0_CAN1_MASK                                (3<<MXC_CCM_CCGR0_CAN1_OFFSET)
+#define MXC_CCM_CCGR0_CAN1_MASK                                (3 << MXC_CCM_CCGR0_CAN1_OFFSET)
 #define MXC_CCM_CCGR0_CAN1_SERIAL_OFFSET               16
-#define MXC_CCM_CCGR0_CAN1_SERIAL_MASK                 (3<<MXC_CCM_CCGR0_CAN1_SERIAL_OFFSET)
+#define MXC_CCM_CCGR0_CAN1_SERIAL_MASK                 (3 << MXC_CCM_CCGR0_CAN1_SERIAL_OFFSET)
 #define MXC_CCM_CCGR0_CAN2_OFFSET                      18
-#define MXC_CCM_CCGR0_CAN2_MASK                                (3<<MXC_CCM_CCGR0_CAN2_OFFSET)
+#define MXC_CCM_CCGR0_CAN2_MASK                                (3 << MXC_CCM_CCGR0_CAN2_OFFSET)
 #define MXC_CCM_CCGR0_CAN2_SERIAL_OFFSET               20
-#define MXC_CCM_CCGR0_CAN2_SERIAL_MASK                 (3<<MXC_CCM_CCGR0_CAN2_SERIAL_OFFSET)
+#define MXC_CCM_CCGR0_CAN2_SERIAL_MASK                 (3 << MXC_CCM_CCGR0_CAN2_SERIAL_OFFSET)
 #define MXC_CCM_CCGR0_CHEETAH_DBG_CLK_OFFSET           22
-#define MXC_CCM_CCGR0_CHEETAH_DBG_CLK_MASK             (3<<MXC_CCM_CCGR0_CHEETAH_DBG_CLK_OFFSET)
+#define MXC_CCM_CCGR0_CHEETAH_DBG_CLK_MASK             (3 << MXC_CCM_CCGR0_CHEETAH_DBG_CLK_OFFSET)
 #define MXC_CCM_CCGR0_DCIC1_OFFSET                     24
-#define MXC_CCM_CCGR0_DCIC1_MASK                       (3<<MXC_CCM_CCGR0_DCIC1_OFFSET)
+#define MXC_CCM_CCGR0_DCIC1_MASK                       (3 << MXC_CCM_CCGR0_DCIC1_OFFSET)
 #define MXC_CCM_CCGR0_DCIC2_OFFSET                     26
-#define MXC_CCM_CCGR0_DCIC2_MASK                       (3<<MXC_CCM_CCGR0_DCIC2_OFFSET)
+#define MXC_CCM_CCGR0_DCIC2_MASK                       (3 << MXC_CCM_CCGR0_DCIC2_OFFSET)
 #define MXC_CCM_CCGR0_DTCP_OFFSET                      28
-#define MXC_CCM_CCGR0_DTCP_MASK                                (3<<MXC_CCM_CCGR0_DTCP_OFFSET)
+#define MXC_CCM_CCGR0_DTCP_MASK                                (3 << MXC_CCM_CCGR0_DTCP_OFFSET)
 
 #define MXC_CCM_CCGR1_ECSPI1S_OFFSET                   0
-#define MXC_CCM_CCGR1_ECSPI1S_MASK                     (3<<MXC_CCM_CCGR1_ECSPI1S_OFFSET)
+#define MXC_CCM_CCGR1_ECSPI1S_MASK                     (3 << MXC_CCM_CCGR1_ECSPI1S_OFFSET)
 #define MXC_CCM_CCGR1_ECSPI2S_OFFSET                   2
-#define MXC_CCM_CCGR1_ECSPI2S_MASK                     (3<<MXC_CCM_CCGR1_ECSPI2S_OFFSET)
+#define MXC_CCM_CCGR1_ECSPI2S_MASK                     (3 << MXC_CCM_CCGR1_ECSPI2S_OFFSET)
 #define MXC_CCM_CCGR1_ECSPI3S_OFFSET                   4
-#define MXC_CCM_CCGR1_ECSPI3S_MASK                     (3<<MXC_CCM_CCGR1_ECSPI3S_OFFSET)
+#define MXC_CCM_CCGR1_ECSPI3S_MASK                     (3 << MXC_CCM_CCGR1_ECSPI3S_OFFSET)
 #define MXC_CCM_CCGR1_ECSPI4S_OFFSET                   6
-#define MXC_CCM_CCGR1_ECSPI4S_MASK                     (3<<MXC_CCM_CCGR1_ECSPI4S_OFFSET)
+#define MXC_CCM_CCGR1_ECSPI4S_MASK                     (3 << MXC_CCM_CCGR1_ECSPI4S_OFFSET)
 #define MXC_CCM_CCGR1_ECSPI5S_OFFSET                   8
-#define MXC_CCM_CCGR1_ECSPI5S_MASK                     (3<<MXC_CCM_CCGR1_ECSPI5S_OFFSET)
+#define MXC_CCM_CCGR1_ECSPI5S_MASK                     (3 << MXC_CCM_CCGR1_ECSPI5S_OFFSET)
 #define MXC_CCM_CCGR1_ENET_CLK_ENABLE_OFFSET           10
-#define MXC_CCM_CCGR1_ENET_CLK_ENABLE_MASK             (3<<MXC_CCM_CCGR1_ENET_CLK_ENABLE_OFFSET)
+#define MXC_CCM_CCGR1_ENET_CLK_ENABLE_MASK             (3 << MXC_CCM_CCGR1_ENET_CLK_ENABLE_OFFSET)
 #define MXC_CCM_CCGR1_EPIT1S_OFFSET                    12
-#define MXC_CCM_CCGR1_EPIT1S_MASK                      (3<<MXC_CCM_CCGR1_EPIT1S_OFFSET)
+#define MXC_CCM_CCGR1_EPIT1S_MASK                      (3 << MXC_CCM_CCGR1_EPIT1S_OFFSET)
 #define MXC_CCM_CCGR1_EPIT2S_OFFSET                    14
-#define MXC_CCM_CCGR1_EPIT2S_MASK                      (3<<MXC_CCM_CCGR1_EPIT2S_OFFSET)
+#define MXC_CCM_CCGR1_EPIT2S_MASK                      (3 << MXC_CCM_CCGR1_EPIT2S_OFFSET)
 #define MXC_CCM_CCGR1_ESAIS_OFFSET                     16
-#define MXC_CCM_CCGR1_ESAIS_MASK                       (3<<MXC_CCM_CCGR1_ESAIS_OFFSET)
+#define MXC_CCM_CCGR1_ESAIS_MASK                       (3 << MXC_CCM_CCGR1_ESAIS_OFFSET)
 #define MXC_CCM_CCGR1_GPT_BUS_OFFSET                   20
-#define MXC_CCM_CCGR1_GPT_BUS_MASK                     (3<<MXC_CCM_CCGR1_GPT_BUS_OFFSET)
+#define MXC_CCM_CCGR1_GPT_BUS_MASK                     (3 << MXC_CCM_CCGR1_GPT_BUS_OFFSET)
 #define MXC_CCM_CCGR1_GPT_SERIAL_OFFSET                        22
-#define MXC_CCM_CCGR1_GPT_SERIAL_MASK                  (3<<MXC_CCM_CCGR1_GPT_SERIAL_OFFSET)
+#define MXC_CCM_CCGR1_GPT_SERIAL_MASK                  (3 << MXC_CCM_CCGR1_GPT_SERIAL_OFFSET)
 #define MXC_CCM_CCGR1_GPU2D_OFFSET                     24
-#define MXC_CCM_CCGR1_GPU2D_MASK                       (3<<MXC_CCM_CCGR1_GPU2D_OFFSET)
+#define MXC_CCM_CCGR1_GPU2D_MASK                       (3 << MXC_CCM_CCGR1_GPU2D_OFFSET)
 #define MXC_CCM_CCGR1_GPU3D_OFFSET                     26
-#define MXC_CCM_CCGR1_GPU3D_MASK                       (3<<MXC_CCM_CCGR1_GPU3D_OFFSET)
+#define MXC_CCM_CCGR1_GPU3D_MASK                       (3 << MXC_CCM_CCGR1_GPU3D_OFFSET)
 
 #define MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_OFFSET           0
-#define MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK             (3<<MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_OFFSET)
+#define MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK             (3 << MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_OFFSET)
 #define MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_OFFSET           4
-#define MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK             (3<<MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_OFFSET)
+#define MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK             (3 << MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_OFFSET)
 #define MXC_CCM_CCGR2_I2C1_SERIAL_OFFSET               6
-#define MXC_CCM_CCGR2_I2C1_SERIAL_MASK                 (3<<MXC_CCM_CCGR2_I2C1_SERIAL_OFFSET)
+#define MXC_CCM_CCGR2_I2C1_SERIAL_MASK                 (3 << MXC_CCM_CCGR2_I2C1_SERIAL_OFFSET)
 #define MXC_CCM_CCGR2_I2C2_SERIAL_OFFSET               8
-#define MXC_CCM_CCGR2_I2C2_SERIAL_MASK                 (3<<MXC_CCM_CCGR2_I2C2_SERIAL_OFFSET)
+#define MXC_CCM_CCGR2_I2C2_SERIAL_MASK                 (3 << MXC_CCM_CCGR2_I2C2_SERIAL_OFFSET)
 #define MXC_CCM_CCGR2_I2C3_SERIAL_OFFSET               10
-#define MXC_CCM_CCGR2_I2C3_SERIAL_MASK                 (3<<MXC_CCM_CCGR2_I2C3_SERIAL_OFFSET)
+#define MXC_CCM_CCGR2_I2C3_SERIAL_MASK                 (3 << MXC_CCM_CCGR2_I2C3_SERIAL_OFFSET)
 #define MXC_CCM_CCGR2_OCOTP_CTRL_OFFSET                        12
-#define MXC_CCM_CCGR2_OCOTP_CTRL_MASK                  (3<<MXC_CCM_CCGR2_OCOTP_CTRL_OFFSET)
+#define MXC_CCM_CCGR2_OCOTP_CTRL_MASK                  (3 << MXC_CCM_CCGR2_OCOTP_CTRL_OFFSET)
 #define MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_OFFSET          14
-#define MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK            (3<<MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_OFFSET)
+#define MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_MASK            (3 << MXC_CCM_CCGR2_IOMUX_IPT_CLK_IO_OFFSET)
 #define MXC_CCM_CCGR2_IPMUX1_OFFSET                    16
-#define MXC_CCM_CCGR2_IPMUX1_MASK                      (3<<MXC_CCM_CCGR2_IPMUX1_OFFSET)
+#define MXC_CCM_CCGR2_IPMUX1_MASK                      (3 << MXC_CCM_CCGR2_IPMUX1_OFFSET)
 #define MXC_CCM_CCGR2_IPMUX2_OFFSET                    18
-#define MXC_CCM_CCGR2_IPMUX2_MASK                      (3<<MXC_CCM_CCGR2_IPMUX2_OFFSET)
+#define MXC_CCM_CCGR2_IPMUX2_MASK                      (3 << MXC_CCM_CCGR2_IPMUX2_OFFSET)
 #define MXC_CCM_CCGR2_IPMUX3_OFFSET                    20
-#define MXC_CCM_CCGR2_IPMUX3_MASK                      (3<<MXC_CCM_CCGR2_IPMUX3_OFFSET)
+#define MXC_CCM_CCGR2_IPMUX3_MASK                      (3 << MXC_CCM_CCGR2_IPMUX3_OFFSET)
 #define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET 22
-#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_MASK   (3<<MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET)
+#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_MASK   (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET)
 #define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET  24
-#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_MASK    (3<<MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET)
+#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_MASK    (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET)
 #define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET        26
-#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_MASK  (3<<MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET)
+#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_MASK  (3 << MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET)
 
 #define MXC_CCM_CCGR3_IPU1_IPU_OFFSET                          0
-#define MXC_CCM_CCGR3_IPU1_IPU_MASK                            (3<<MXC_CCM_CCGR3_IPU1_IPU_OFFSET)
+#define MXC_CCM_CCGR3_IPU1_IPU_MASK                            (3 << MXC_CCM_CCGR3_IPU1_IPU_OFFSET)
 #define MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET                      2
-#define MXC_CCM_CCGR3_IPU1_IPU_DI0_MASK                                (3<<MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET)
+#define MXC_CCM_CCGR3_IPU1_IPU_DI0_MASK                                (3 << MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET)
 #define MXC_CCM_CCGR3_IPU1_IPU_DI1_OFFSET                      4
-#define MXC_CCM_CCGR3_IPU1_IPU_DI1_MASK                                (3<<MXC_CCM_CCGR3_IPU1_IPU_DI1_OFFSET)
+#define MXC_CCM_CCGR3_IPU1_IPU_DI1_MASK                                (3 << MXC_CCM_CCGR3_IPU1_IPU_DI1_OFFSET)
 #define MXC_CCM_CCGR3_IPU2_IPU_OFFSET                          6
-#define MXC_CCM_CCGR3_IPU2_IPU_MASK                            (3<<MXC_CCM_CCGR3_IPU2_IPU_OFFSET)
+#define MXC_CCM_CCGR3_IPU2_IPU_MASK                            (3 << MXC_CCM_CCGR3_IPU2_IPU_OFFSET)
 #define MXC_CCM_CCGR3_IPU2_IPU_DI0_OFFSET                      8
-#define MXC_CCM_CCGR3_IPU2_IPU_DI0_MASK                                (3<<MXC_CCM_CCGR3_IPU2_IPU_DI0_OFFSET)
+#define MXC_CCM_CCGR3_IPU2_IPU_DI0_MASK                                (3 << MXC_CCM_CCGR3_IPU2_IPU_DI0_OFFSET)
 #define MXC_CCM_CCGR3_IPU2_IPU_DI1_OFFSET                      10
-#define MXC_CCM_CCGR3_IPU2_IPU_DI1_MASK                                (3<<MXC_CCM_CCGR3_IPU2_IPU_DI1_OFFSET)
+#define MXC_CCM_CCGR3_IPU2_IPU_DI1_MASK                                (3 << MXC_CCM_CCGR3_IPU2_IPU_DI1_OFFSET)
 #define MXC_CCM_CCGR3_LDB_DI0_OFFSET                           12
-#define MXC_CCM_CCGR3_LDB_DI0_MASK                             (3<<MXC_CCM_CCGR3_LDB_DI0_OFFSET)
+#define MXC_CCM_CCGR3_LDB_DI0_MASK                             (3 << MXC_CCM_CCGR3_LDB_DI0_OFFSET)
 #define MXC_CCM_CCGR3_LDB_DI1_OFFSET                           14
-#define MXC_CCM_CCGR3_LDB_DI1_MASK                             (3<<MXC_CCM_CCGR3_LDB_DI1_OFFSET)
+#define MXC_CCM_CCGR3_LDB_DI1_MASK                             (3 << MXC_CCM_CCGR3_LDB_DI1_OFFSET)
 #define MXC_CCM_CCGR3_MIPI_CORE_CFG_OFFSET                     16
-#define MXC_CCM_CCGR3_MIPI_CORE_CFG_MASK                       (3<<MXC_CCM_CCGR3_MIPI_CORE_CFG_OFFSET)
+#define MXC_CCM_CCGR3_MIPI_CORE_CFG_MASK                       (3 << MXC_CCM_CCGR3_MIPI_CORE_CFG_OFFSET)
 #define MXC_CCM_CCGR3_MLB_OFFSET                               18
-#define MXC_CCM_CCGR3_MLB_MASK                                 (3<<MXC_CCM_CCGR3_MLB_OFFSET)
+#define MXC_CCM_CCGR3_MLB_MASK                                 (3 << MXC_CCM_CCGR3_MLB_OFFSET)
 #define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P0_OFFSET       20
-#define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P0_MASK         (3<<MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P0_OFFSET)
+#define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P0_MASK         (3 << MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P0_OFFSET)
 #define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P1_OFFSET       22
-#define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P1_MASK         (3<<MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P1_OFFSET)
+#define MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P1_MASK         (3 << MXC_CCM_CCGR3_MMDC_CORE_ACLK_FAST_CORE_P1_OFFSET)
 #define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_OFFSET              24
-#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_MASK                        (3<<MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_OFFSET)
+#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_MASK                        (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_OFFSET)
 #define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET              26
-#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_MASK                        (3<<MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET)
+#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_MASK                        (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET)
 #define MXC_CCM_CCGR3_OCRAM_OFFSET                             28
-#define MXC_CCM_CCGR3_OCRAM_MASK                               (3<<MXC_CCM_CCGR3_OCRAM_OFFSET)
+#define MXC_CCM_CCGR3_OCRAM_MASK                               (3 << MXC_CCM_CCGR3_OCRAM_OFFSET)
 #define MXC_CCM_CCGR3_OPENVGAXICLK_OFFSET                      30
-#define MXC_CCM_CCGR3_OPENVGAXICLK_MASK                                (3<<MXC_CCM_CCGR3_OPENVGAXICLK_OFFSET)
+#define MXC_CCM_CCGR3_OPENVGAXICLK_MASK                                (3 << MXC_CCM_CCGR3_OPENVGAXICLK_OFFSET)
 
 #define MXC_CCM_CCGR4_PCIE_OFFSET                              0
-#define MXC_CCM_CCGR4_PCIE_MASK                                        (3<<MXC_CCM_CCGR4_PCIE_OFFSET)
+#define MXC_CCM_CCGR4_PCIE_MASK                                        (3 << MXC_CCM_CCGR4_PCIE_OFFSET)
 #define MXC_CCM_CCGR4_PL301_MX6QFAST1_S133_OFFSET              8
-#define MXC_CCM_CCGR4_PL301_MX6QFAST1_S133_MASK                        (3<<MXC_CCM_CCGR4_PL301_MX6QFAST1_S133_OFFSET)
+#define MXC_CCM_CCGR4_PL301_MX6QFAST1_S133_MASK                        (3 << MXC_CCM_CCGR4_PL301_MX6QFAST1_S133_OFFSET)
 #define MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET                        12
-#define MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_MASK                  (3<<MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET)
+#define MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_MASK                  (3 << MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET)
 #define MXC_CCM_CCGR4_PL301_MX6QPER2_MAINCLK_ENABLE_OFFSET     14
-#define MXC_CCM_CCGR4_PL301_MX6QPER2_MAINCLK_ENABLE_MASK       (3<<MXC_CCM_CCGR4_PL301_MX6QPER2_MAINCLK_ENABLE_OFFSET)
+#define MXC_CCM_CCGR4_PL301_MX6QPER2_MAINCLK_ENABLE_MASK       (3 << MXC_CCM_CCGR4_PL301_MX6QPER2_MAINCLK_ENABLE_OFFSET)
 #define MXC_CCM_CCGR4_PWM1_OFFSET                              16
-#define MXC_CCM_CCGR4_PWM1_MASK                                        (3<<MXC_CCM_CCGR4_PWM1_OFFSET)
+#define MXC_CCM_CCGR4_PWM1_MASK                                        (3 << MXC_CCM_CCGR4_PWM1_OFFSET)
 #define MXC_CCM_CCGR4_PWM2_OFFSET                              18
-#define MXC_CCM_CCGR4_PWM2_MASK                                        (3<<MXC_CCM_CCGR4_PWM2_OFFSET)
+#define MXC_CCM_CCGR4_PWM2_MASK                                        (3 << MXC_CCM_CCGR4_PWM2_OFFSET)
 #define MXC_CCM_CCGR4_PWM3_OFFSET                              20
-#define MXC_CCM_CCGR4_PWM3_MASK                                        (3<<MXC_CCM_CCGR4_PWM3_OFFSET)
+#define MXC_CCM_CCGR4_PWM3_MASK                                        (3 << MXC_CCM_CCGR4_PWM3_OFFSET)
 #define MXC_CCM_CCGR4_PWM4_OFFSET                              22
-#define MXC_CCM_CCGR4_PWM4_MASK                                        (3<<MXC_CCM_CCGR4_PWM4_OFFSET)
+#define MXC_CCM_CCGR4_PWM4_MASK                                        (3 << MXC_CCM_CCGR4_PWM4_OFFSET)
 #define MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_OFFSET           24
-#define MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK             (3<<MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_OFFSET)
+#define MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK             (3 << MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_OFFSET)
 #define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_OFFSET      26
-#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK                (3<<MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_OFFSET)
+#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK                (3 << MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_OFFSET)
 #define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_OFFSET  28
-#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK    (3<<MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_OFFSET)
+#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK    (3 << MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_OFFSET)
 #define MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_OFFSET          30
-#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK            (3<<MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_OFFSET)
+#define MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK            (3 << MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_OFFSET)
 
 #define MXC_CCM_CCGR5_ROM_OFFSET                       0
-#define MXC_CCM_CCGR5_ROM_MASK                         (3<<MXC_CCM_CCGR5_ROM_OFFSET)
+#define MXC_CCM_CCGR5_ROM_MASK                         (3 << MXC_CCM_CCGR5_ROM_OFFSET)
 #define MXC_CCM_CCGR5_SATA_OFFSET                      4
-#define MXC_CCM_CCGR5_SATA_MASK                                (3<<MXC_CCM_CCGR5_SATA_OFFSET)
+#define MXC_CCM_CCGR5_SATA_MASK                                (3 << MXC_CCM_CCGR5_SATA_OFFSET)
 #define MXC_CCM_CCGR5_SDMA_OFFSET                      6
-#define MXC_CCM_CCGR5_SDMA_MASK                                (3<<MXC_CCM_CCGR5_SDMA_OFFSET)
+#define MXC_CCM_CCGR5_SDMA_MASK                                (3 << MXC_CCM_CCGR5_SDMA_OFFSET)
 #define MXC_CCM_CCGR5_SPBA_OFFSET                      12
-#define MXC_CCM_CCGR5_SPBA_MASK                                (3<<MXC_CCM_CCGR5_SPBA_OFFSET)
+#define MXC_CCM_CCGR5_SPBA_MASK                                (3 << MXC_CCM_CCGR5_SPBA_OFFSET)
 #define MXC_CCM_CCGR5_SPDIF_OFFSET                     14
-#define MXC_CCM_CCGR5_SPDIF_MASK                       (3<<MXC_CCM_CCGR5_SPDIF_OFFSET)
+#define MXC_CCM_CCGR5_SPDIF_MASK                       (3 << MXC_CCM_CCGR5_SPDIF_OFFSET)
 #define MXC_CCM_CCGR5_SSI1_OFFSET                      18
-#define MXC_CCM_CCGR5_SSI1_MASK                                (3<<MXC_CCM_CCGR5_SSI1_OFFSET)
+#define MXC_CCM_CCGR5_SSI1_MASK                                (3 << MXC_CCM_CCGR5_SSI1_OFFSET)
 #define MXC_CCM_CCGR5_SSI2_OFFSET                      20
-#define MXC_CCM_CCGR5_SSI2_MASK                                (3<<MXC_CCM_CCGR5_SSI2_OFFSET)
+#define MXC_CCM_CCGR5_SSI2_MASK                                (3 << MXC_CCM_CCGR5_SSI2_OFFSET)
 #define MXC_CCM_CCGR5_SSI3_OFFSET                      22
-#define MXC_CCM_CCGR5_SSI3_MASK                                (3<<MXC_CCM_CCGR5_SSI3_OFFSET)
+#define MXC_CCM_CCGR5_SSI3_MASK                                (3 << MXC_CCM_CCGR5_SSI3_OFFSET)
 #define MXC_CCM_CCGR5_UART_OFFSET                      24
-#define MXC_CCM_CCGR5_UART_MASK                                (3<<MXC_CCM_CCGR5_UART_OFFSET)
+#define MXC_CCM_CCGR5_UART_MASK                                (3 << MXC_CCM_CCGR5_UART_OFFSET)
 #define MXC_CCM_CCGR5_UART_SERIAL_OFFSET               26
-#define MXC_CCM_CCGR5_UART_SERIAL_MASK                 (3<<MXC_CCM_CCGR5_UART_SERIAL_OFFSET)
+#define MXC_CCM_CCGR5_UART_SERIAL_MASK                 (3 << MXC_CCM_CCGR5_UART_SERIAL_OFFSET)
 
 #define MXC_CCM_CCGR6_USBOH3_OFFSET            0
-#define MXC_CCM_CCGR6_USBOH3_MASK              (3<<MXC_CCM_CCGR6_USBOH3_OFFSET)
+#define MXC_CCM_CCGR6_USBOH3_MASK              (3 << MXC_CCM_CCGR6_USBOH3_OFFSET)
 #define MXC_CCM_CCGR6_USDHC1_OFFSET            2
-#define MXC_CCM_CCGR6_USDHC1_MASK              (3<<MXC_CCM_CCGR6_USDHC1_OFFSET)
+#define MXC_CCM_CCGR6_USDHC1_MASK              (3 << MXC_CCM_CCGR6_USDHC1_OFFSET)
 #define MXC_CCM_CCGR6_USDHC2_OFFSET            4
-#define MXC_CCM_CCGR6_USDHC2_MASK              (3<<MXC_CCM_CCGR6_USDHC2_OFFSET)
+#define MXC_CCM_CCGR6_USDHC2_MASK              (3 << MXC_CCM_CCGR6_USDHC2_OFFSET)
 #define MXC_CCM_CCGR6_USDHC3_OFFSET            6
-#define MXC_CCM_CCGR6_USDHC3_MASK              (3<<MXC_CCM_CCGR6_USDHC3_OFFSET)
+#define MXC_CCM_CCGR6_USDHC3_MASK              (3 << MXC_CCM_CCGR6_USDHC3_OFFSET)
 #define MXC_CCM_CCGR6_USDHC4_OFFSET            8
-#define MXC_CCM_CCGR6_USDHC4_MASK              (3<<MXC_CCM_CCGR6_USDHC4_OFFSET)
+#define MXC_CCM_CCGR6_USDHC4_MASK              (3 << MXC_CCM_CCGR6_USDHC4_OFFSET)
 #define MXC_CCM_CCGR6_EMI_SLOW_OFFSET          10
-#define MXC_CCM_CCGR6_EMI_SLOW_MASK            (3<<MXC_CCM_CCGR6_EMI_SLOW_OFFSET)
+#define MXC_CCM_CCGR6_EMI_SLOW_MASK            (3 << MXC_CCM_CCGR6_EMI_SLOW_OFFSET)
 #define MXC_CCM_CCGR6_VDOAXICLK_OFFSET         12
-#define MXC_CCM_CCGR6_VDOAXICLK_MASK           (3<<MXC_CCM_CCGR6_VDOAXICLK_OFFSET)
+#define MXC_CCM_CCGR6_VDOAXICLK_MASK           (3 << MXC_CCM_CCGR6_VDOAXICLK_OFFSET)
 
 #define BM_ANADIG_PLL_SYS_LOCK 0x80000000
 #define BP_ANADIG_PLL_SYS_RSVD0      20
index d79ab2f13fee81b02348565f9b5498482156d12b..03abb2a8b7568f00b6b999f5054a5437b0413351 100644 (file)
 
 #define ROMCP_ARB_BASE_ADDR             0x00000000
 #define ROMCP_ARB_END_ADDR              0x000FFFFF
+
+#ifdef CONFIG_MX6SL
+#define GPU_2D_ARB_BASE_ADDR            0x02200000
+#define GPU_2D_ARB_END_ADDR             0x02203FFF
+#define OPENVG_ARB_BASE_ADDR            0x02204000
+#define OPENVG_ARB_END_ADDR             0x02207FFF
+#else
 #define CAAM_ARB_BASE_ADDR              0x00100000
 #define CAAM_ARB_END_ADDR               0x00103FFF
 #define APBH_DMA_ARB_BASE_ADDR          0x00110000
 #define GPU_2D_ARB_END_ADDR             0x00137FFF
 #define DTCP_ARB_BASE_ADDR              0x00138000
 #define DTCP_ARB_END_ADDR               0x0013BFFF
+#endif /* CONFIG_MX6SL */
+
+#define MXS_APBH_BASE                  APBH_DMA_ARB_BASE_ADDR
+#define MXS_GPMI_BASE                  (APBH_DMA_ARB_BASE_ADDR + 0x02000)
+#define MXS_BCH_BASE                   (APBH_DMA_ARB_BASE_ADDR + 0x04000)
 
 /* GPV - PL301 configuration ports */
+#ifdef CONFIG_MX6SL
+#define GPV2_BASE_ADDR                  0x00D00000
+#else
 #define GPV2_BASE_ADDR                 0x00200000
+#endif
+
 #define GPV3_BASE_ADDR                 0x00300000
 #define GPV4_BASE_ADDR                 0x00800000
 #define IRAM_BASE_ADDR                 0x00900000
 #define WEIM_ARB_BASE_ADDR              0x08000000
 #define WEIM_ARB_END_ADDR               0x0FFFFFFF
 
+#ifdef CONFIG_MX6SL
+#define MMDC0_ARB_BASE_ADDR             0x80000000
+#define MMDC0_ARB_END_ADDR              0xFFFFFFFF
+#define MMDC1_ARB_BASE_ADDR             0xC0000000
+#define MMDC1_ARB_END_ADDR              0xFFFFFFFF
+#else
 #define MMDC0_ARB_BASE_ADDR             0x10000000
 #define MMDC0_ARB_END_ADDR              0x7FFFFFFF
 #define MMDC1_ARB_BASE_ADDR             0x80000000
 #define MMDC1_ARB_END_ADDR              0xFFFFFFFF
+#endif
 
 #define IPU_SOC_BASE_ADDR              IPU1_ARB_BASE_ADDR
 #define IPU_SOC_OFFSET                 0x00200000
 #define ECSPI2_BASE_ADDR            (ATZ1_BASE_ADDR + 0x0C000)
 #define ECSPI3_BASE_ADDR            (ATZ1_BASE_ADDR + 0x10000)
 #define ECSPI4_BASE_ADDR            (ATZ1_BASE_ADDR + 0x14000)
+#ifdef CONFIG_MX6SL
+#define UART5_IPS_BASE_ADDR         (ATZ1_BASE_ADDR + 0x18000)
+#define UART1_IPS_BASE_ADDR         (ATZ1_BASE_ADDR + 0x20000)
+#define UART2_IPS_BASE_ADDR         (ATZ1_BASE_ADDR + 0x24000)
+#define SSI1_IPS_BASE_ADDR          (ATZ1_BASE_ADDR + 0x28000)
+#define SSI2_IPS_BASE_ADDR          (ATZ1_BASE_ADDR + 0x2C000)
+#define SSI3_IPS_BASE_ADDR          (ATZ1_BASE_ADDR + 0x30000)
+#define UART3_IPS_BASE_ADDR         (ATZ1_BASE_ADDR + 0x34000)
+#define UART4_IPS_BASE_ADDR         (ATZ1_BASE_ADDR + 0x38000)
+#else
 #define ECSPI5_BASE_ADDR            (ATZ1_BASE_ADDR + 0x18000)
 #define UART1_BASE                  (ATZ1_BASE_ADDR + 0x20000)
 #define ESAI1_BASE_ADDR             (ATZ1_BASE_ADDR + 0x24000)
 #define SSI2_BASE_ADDR              (ATZ1_BASE_ADDR + 0x2C000)
 #define SSI3_BASE_ADDR              (ATZ1_BASE_ADDR + 0x30000)
 #define ASRC_BASE_ADDR              (ATZ1_BASE_ADDR + 0x34000)
+#endif
+
 #define SPBA_BASE_ADDR              (ATZ1_BASE_ADDR + 0x3C000)
 #define VPU_BASE_ADDR               (ATZ1_BASE_ADDR + 0x40000)
 #define AIPS1_ON_BASE_ADDR          (ATZ1_BASE_ADDR + 0x7C000)
 #define SRC_BASE_ADDR               (AIPS1_OFF_BASE_ADDR + 0x58000)
 #define GPC_BASE_ADDR               (AIPS1_OFF_BASE_ADDR + 0x5C000)
 #define IOMUXC_BASE_ADDR            (AIPS1_OFF_BASE_ADDR + 0x60000)
+#ifdef CONFIG_MX6SL
+#define CSI_BASE_ADDR               (AIPS1_OFF_BASE_ADDR + 0x64000)
+#define SIPIX_BASE_ADDR             (AIPS1_OFF_BASE_ADDR + 0x68000)
+#define SDMA_PORT_HOST_BASE_ADDR    (AIPS1_OFF_BASE_ADDR + 0x6C000)
+#else
 #define DCIC1_BASE_ADDR             (AIPS1_OFF_BASE_ADDR + 0x64000)
 #define DCIC2_BASE_ADDR             (AIPS1_OFF_BASE_ADDR + 0x68000)
 #define DMA_REQ_PORT_HOST_BASE_ADDR (AIPS1_OFF_BASE_ADDR + 0x6C000)
+#endif
 
 #define AIPS2_ON_BASE_ADDR          (ATZ2_BASE_ADDR + 0x7C000)
 #define AIPS2_OFF_BASE_ADDR         (ATZ2_BASE_ADDR + 0x80000)
 #define CAAM_BASE_ADDR              (ATZ2_BASE_ADDR)
 #define ARM_BASE_ADDR              (ATZ2_BASE_ADDR + 0x40000)
+#ifdef CONFIG_MX6SL
+#define USBO2H_PL301_IPS_BASE_ADDR  (AIPS2_OFF_BASE_ADDR + 0x0000)
+#define USBO2H_USB_BASE_ADDR        (AIPS2_OFF_BASE_ADDR + 0x4000)
+#else
 #define USBOH3_PL301_BASE_ADDR      (AIPS2_OFF_BASE_ADDR + 0x0000)
 #define USBOH3_USB_BASE_ADDR        (AIPS2_OFF_BASE_ADDR + 0x4000)
+#endif
+
 #define ENET_BASE_ADDR              (AIPS2_OFF_BASE_ADDR + 0x8000)
+#ifdef CONFIG_MX6SL
+#define MSHC_IPS_BASE_ADDR          (AIPS2_OFF_BASE_ADDR + 0xC000)
+#else
 #define MLB_BASE_ADDR               (AIPS2_OFF_BASE_ADDR + 0xC000)
+#endif
+
 #define USDHC1_BASE_ADDR            (AIPS2_OFF_BASE_ADDR + 0x10000)
 #define USDHC2_BASE_ADDR            (AIPS2_OFF_BASE_ADDR + 0x14000)
 #define USDHC3_BASE_ADDR            (AIPS2_OFF_BASE_ADDR + 0x18000)
 #define I2C3_BASE_ADDR              (AIPS2_OFF_BASE_ADDR + 0x28000)
 #define ROMCP_BASE_ADDR             (AIPS2_OFF_BASE_ADDR + 0x2C000)
 #define MMDC_P0_BASE_ADDR           (AIPS2_OFF_BASE_ADDR + 0x30000)
+#ifdef CONFIG_MX6SL
+#define RNGB_IPS_BASE_ADDR          (AIPS2_OFF_BASE_ADDR + 0x34000)
+#else
 #define MMDC_P1_BASE_ADDR           (AIPS2_OFF_BASE_ADDR + 0x34000)
+#endif
+
 #define WEIM_BASE_ADDR              (AIPS2_OFF_BASE_ADDR + 0x38000)
 #define OCOTP_BASE_ADDR             (AIPS2_OFF_BASE_ADDR + 0x3C000)
 #define CSU_BASE_ADDR               (AIPS2_OFF_BASE_ADDR + 0x40000)
 
 #define CHIP_REV_1_0                 0x10
 #define IRAM_SIZE                    0x00040000
-#define IMX_IIM_BASE                 OCOTP_BASE_ADDR
 #define FEC_QUIRK_ENET_MAC
 
 #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
@@ -200,12 +257,6 @@ struct src {
        u32     gpr10;
 };
 
-/* OCOTP Registers */
-struct ocotp_regs {
-       u32     reserved[0x198];
-       u32     gp1;    /* 0x660 */
-};
-
 /* GPR3 bitfields */
 #define IOMUXC_GPR3_GPU_DBG_OFFSET             29
 #define IOMUXC_GPR3_GPU_DBG_MASK               (3<<IOMUXC_GPR3_GPU_DBG_OFFSET)
@@ -365,14 +416,22 @@ struct cspi_regs {
 #define MXC_CSPICON_POL                4
 #define MXC_CSPICON_PHA                0
 #define MXC_CSPICON_SSPOL      12
+#ifdef CONFIG_MX6SL
+#define MXC_SPI_BASE_ADDRESSES \
+       ECSPI1_BASE_ADDR, \
+       ECSPI2_BASE_ADDR, \
+       ECSPI3_BASE_ADDR, \
+       ECSPI4_BASE_ADDR
+#else
 #define MXC_SPI_BASE_ADDRESSES \
        ECSPI1_BASE_ADDR, \
        ECSPI2_BASE_ADDR, \
        ECSPI3_BASE_ADDR, \
        ECSPI4_BASE_ADDR, \
        ECSPI5_BASE_ADDR
+#endif
 
-struct iim_regs {
+struct ocotp_regs {
        u32     ctrl;
        u32     ctrl_set;
        u32     ctrl_clr;
@@ -383,9 +442,9 @@ struct iim_regs {
        u32     rsvd1[3];
        u32     read_ctrl;
        u32     rsvd2[3];
-       u32     fuse_data;
+       u32     read_fuse_data;
        u32     rsvd3[3];
-       u32     sticky;
+       u32     sw_sticky;
        u32     rsvd4[3];
        u32     scs;
        u32     scs_set;
@@ -400,7 +459,16 @@ struct iim_regs {
 
        struct fuse_bank {
                u32     fuse_regs[0x20];
-       } bank[15];
+       } bank[16];
+};
+
+struct fuse_bank0_regs {
+       u32     lock;
+       u32     rsvd0[3];
+       u32     uid_low;
+       u32     rsvd1[3];
+       u32     uid_high;
+       u32     rsvd2[0x17];
 };
 
 struct fuse_bank4_regs {
@@ -411,7 +479,11 @@ struct fuse_bank4_regs {
        u32     mac_addr_low;
        u32     rsvd2[3];
        u32     mac_addr_high;
-       u32     rsvd3[0x13];
+       u32     rsvd3[0xb];
+       u32     gp1;
+       u32     rsvd4[3];
+       u32     gp2;
+       u32     rsvd5[3];
 };
 
 struct aipstz_regs {
index 63f485666a0ba4cfbdb82e82a96a88943ab17676..ce865a6b8f9d8d4c62afcbea3f601ac2e53af155 100644 (file)
 #if defined(CONFIG_MX6DL) || defined(CONFIG_MX6S)
 #include "mx6dl_pins.h"
 #else
+#if defined(CONFIG_MX6SL)
+#include "mx6sl_pins.h"
+#else
 #error "Please select cpu"
+#endif /* CONFIG_MX6SL */
 #endif /* CONFIG_MX6DL or CONFIG_MX6S */
 #endif /* CONFIG_MX6Q */
 
index 9846f1bcb5a8fd15fe4e107a7912fc6dbfa187f1..a4134a0d094f9f5a0850cf0e604498821f8080d4 100644 (file)
 
 #include <asm/imx-common/iomux-v3.h>
 
-/* Use to set PAD control */
-#define PAD_CTL_HYS            (1 << 16)
-#define PAD_CTL_PUS_100K_DOWN  (0 << 14)
-#define PAD_CTL_PUS_47K_UP     (1 << 14)
-#define PAD_CTL_PUS_100K_UP    (2 << 14)
-#define PAD_CTL_PUS_22K_UP     (3 << 14)
-
-#define PAD_CTL_PUE            (1 << 13)
-#define PAD_CTL_PKE            (1 << 12)
-#define PAD_CTL_ODE            (1 << 11)
-#define PAD_CTL_SPEED_LOW      (1 << 6)
-#define PAD_CTL_SPEED_MED      (2 << 6)
-#define PAD_CTL_SPEED_HIGH     (3 << 6)
-#define PAD_CTL_DSE_DISABLE    (0 << 3)
-#define PAD_CTL_DSE_240ohm     (1 << 3)
-#define PAD_CTL_DSE_120ohm     (2 << 3)
-#define PAD_CTL_DSE_80ohm      (3 << 3)
-#define PAD_CTL_DSE_60ohm      (4 << 3)
-#define PAD_CTL_DSE_48ohm      (5 << 3)
-#define PAD_CTL_DSE_40ohm      (6 << 3)
-#define PAD_CTL_DSE_34ohm      (7 << 3)
-#define PAD_CTL_SRE_FAST       (1 << 0)
-#define PAD_CTL_SRE_SLOW       (0 << 0)
-
-#define IOMUX_CONFIG_SION 0x10
-#define NO_MUX_I                0
-#define NO_PAD_I                0
 enum {
        MX6_PAD_CSI0_DAT10__UART1_TXD           = IOMUX_PAD(0x0360, 0x004C, 3, 0x0000, 0, 0),
        MX6_PAD_CSI0_DAT11__UART1_RXD           = IOMUX_PAD(0x0364, 0x0050, 3, 0x08FC, 1, 0),
@@ -93,6 +66,7 @@ enum {
        MX6_PAD_EIM_D28__I2C1_SDA               = IOMUX_PAD(0x0544, 0x0174, 1 | IOMUX_CONFIG_SION, 0x086C, 1, 0),
        MX6_PAD_EIM_D28__GPIO_3_28              = IOMUX_PAD(0x0544, 0x0174, 5, 0x0000, 0, 0),
        MX6_PAD_EIM_D29__GPIO_3_29              = IOMUX_PAD(0x0548, 0x0178, 5, 0x0000, 0, 0),
+       MX6_PAD_EIM_DA9__GPIO_3_9               = IOMUX_PAD(0x0590, 0x01C0, 5, 0x0000, 0, 0),
        MX6_PAD_ENET_MDC__ENET_MDC              = IOMUX_PAD(0x05B8, 0x01E8, 1, 0x0000, 0,  0),
        MX6_PAD_ENET_MDIO__ENET_MDIO            = IOMUX_PAD(0x05BC, 0x01EC, 1, 0x0810, 0, 0),
        MX6_PAD_ENET_REF_CLK__ENET_TX_CLK       = IOMUX_PAD(0x05C0, 0x01F0, 1, 0x0000, 0, 0),
@@ -102,6 +76,7 @@ enum {
        MX6_PAD_GPIO_17__GPIO_7_12              = IOMUX_PAD(0x05E8, 0x0218, 5, 0x0000, 0, 0),
        MX6_PAD_GPIO_18__GPIO_7_13              = IOMUX_PAD(0x05EC, 0x021C, 5, 0x0000, 0, 0),
        MX6_PAD_GPIO_19__GPIO_4_5               = IOMUX_PAD(0x05F0, 0x0220, 5, 0x0000, 0, 0),
+       MX6_PAD_GPIO_2__GPIO_1_2                = IOMUX_PAD(0x05F4, 0x0224, 5, 0x0000, 0, 0),
        MX6_PAD_GPIO_5__GPIO_1_5                = IOMUX_PAD(0x0600, 0x0230, 5, 0x0000, 0, 0),
        MX6_PAD_GPIO_5__I2C3_SCL                = IOMUX_PAD(0x0600, 0x0230, 6 | IOMUX_CONFIG_SION, 0x0878, 2, 0),
        MX6_PAD_KEY_COL3__I2C2_SCL              = IOMUX_PAD(0x0638, 0x0250, 4 | IOMUX_CONFIG_SION, 0x0870, 1, 0),
@@ -134,8 +109,14 @@ enum {
        MX6_PAD_RGMII_TD3__ENET_RGMII_TD3       = IOMUX_PAD(0x06B8, 0x02D0, 1, 0x0000, 0, 0),
        MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL      = IOMUX_PAD(0x06BC, 0x02D4, 1, 0x0000, 0, 0),
        MX6_PAD_RGMII_TXC__ENET_RGMII_TXC       = IOMUX_PAD(0x06C0, 0x02D8, 1, 0x0000, 0, 0),
+       MX6_PAD_SD1_CLK__USDHC1_CLK             = IOMUX_PAD(0x06C4, 0x02DC, 0, 0x0928, 1, 0),
+       MX6_PAD_SD1_CMD__USDHC1_CMD             = IOMUX_PAD(0x06C8, 0x02E0, 0 | IOMUX_CONFIG_SION, 0x0000, 0, 0),
        MX6_PAD_SD1_CMD__GPIO_1_18              = IOMUX_PAD(0x06C8, 0x02E0, 5, 0x0000, 0, 0),
        MX6_PAD_SD1_DAT3__GPIO_1_21             = IOMUX_PAD(0x06D8, 0x02F0, 5, 0x0000, 0, 0),
+       MX6_PAD_SD1_DAT0__USDHC1_DAT0           = IOMUX_PAD(0x06CC, 0x02E4, 0, 0x0000, 0, 0),
+       MX6_PAD_SD1_DAT1__USDHC1_DAT1           = IOMUX_PAD(0x06D0, 0x02E8, 0, 0x0000, 0, 0),
+       MX6_PAD_SD1_DAT2__USDHC1_DAT2           = IOMUX_PAD(0x06D4, 0x02EC, 0, 0x0000, 0, 0),
+       MX6_PAD_SD1_DAT3__USDHC1_DAT3           = IOMUX_PAD(0x06D8, 0x02F0, 0, 0x0000, 0, 0),
        MX6_PAD_SD3_CLK__USDHC3_CLK             = IOMUX_PAD(0x06F4, 0x030C, 0, 0x0934, 1, 0),
        MX6_PAD_SD3_CMD__USDHC3_CMD             = IOMUX_PAD(0x06F8, 0x0310, 0 | IOMUX_CONFIG_SION, 0x0000, 0, 0),
        MX6_PAD_SD3_DAT0__USDHC3_DAT0           = IOMUX_PAD(0x06FC, 0x0314, 0, 0x0000, 0, 0),
index 1c1c00855f41bedaa34d5f21b01525f80d993c17..02a40d4f5c6cca27e6b0729ead032a70e23a9cd2 100644 (file)
 
 #include <asm/imx-common/iomux-v3.h>
 
-/* Use to set PAD control */
-#define PAD_CTL_HYS            (1 << 16)
-#define PAD_CTL_PUS_100K_DOWN  (0 << 14)
-#define PAD_CTL_PUS_47K_UP     (1 << 14)
-#define PAD_CTL_PUS_100K_UP    (2 << 14)
-#define PAD_CTL_PUS_22K_UP     (3 << 14)
-
-#define PAD_CTL_PUE            (1 << 13)
-#define PAD_CTL_PKE            (1 << 12)
-#define PAD_CTL_ODE            (1 << 11)
-#define PAD_CTL_SPEED_LOW      (1 << 6)
-#define PAD_CTL_SPEED_MED      (2 << 6)
-#define PAD_CTL_SPEED_HIGH     (3 << 6)
-#define PAD_CTL_DSE_DISABLE    (0 << 3)
-#define PAD_CTL_DSE_240ohm     (1 << 3)
-#define PAD_CTL_DSE_120ohm     (2 << 3)
-#define PAD_CTL_DSE_80ohm      (3 << 3)
-#define PAD_CTL_DSE_60ohm      (4 << 3)
-#define PAD_CTL_DSE_48ohm      (5 << 3)
-#define PAD_CTL_DSE_40ohm      (6 << 3)
-#define PAD_CTL_DSE_34ohm      (7 << 3)
-#define PAD_CTL_SRE_FAST       (1 << 0)
-#define PAD_CTL_SRE_SLOW       (0 << 0)
-
-#define NO_MUX_I                0
-#define NO_PAD_I                0
-
 enum {
        MX6_PAD_SD2_DAT1__USDHC2_DAT1           = IOMUX_PAD(0x0360, 0x004C, 0, 0x0000, 0, 0),
        MX6_PAD_SD2_DAT1__ECSPI5_SS0            = IOMUX_PAD(0x0360, 0x004C, 1, 0x0834, 0, 0),
diff --git a/arch/arm/include/asm/arch-mx6/mx6sl_pins.h b/arch/arm/include/asm/arch-mx6/mx6sl_pins.h
new file mode 100644 (file)
index 0000000..3c0ede0
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef __ASM_ARCH_MX6_MX6SL_PINS_H__
+#define __ASM_ARCH_MX6_MX6SL_PINS_H__
+
+#include <asm/imx-common/iomux-v3.h>
+
+enum {
+       MX6_PAD_SD2_CLK__USDHC2_CLK                             = IOMUX_PAD(0x055C, 0x0254, 0, 0x0000, 0, 0),
+       MX6_PAD_SD2_CMD__USDHC2_CMD                             = IOMUX_PAD(0x0560, 0x0258, 0, 0x0000, 0, 0),
+       MX6_PAD_SD2_DAT0__USDHC2_DAT0                           = IOMUX_PAD(0x0564, 0x025C, 0, 0x0000, 0, 0),
+       MX6_PAD_SD2_DAT1__USDHC2_DAT1                           = IOMUX_PAD(0x0568, 0x0260, 0, 0x0000, 0, 0),
+       MX6_PAD_SD2_DAT2__USDHC2_DAT2                           = IOMUX_PAD(0x056C, 0x0264, 0, 0x0000, 0, 0),
+       MX6_PAD_SD2_DAT3__USDHC2_DAT3                           = IOMUX_PAD(0x0570, 0x0268, 0, 0x0000, 0, 0),
+       MX6_PAD_UART1_RXD__UART1_RXD                            = IOMUX_PAD(0x05A0, 0x0298, 0, 0x07FC, 0, 0),
+       MX6_PAD_UART1_TXD__UART1_TXD                            = IOMUX_PAD(0x05A4, 0x029C, 0, 0x0000, 0, 0),
+};
+#endif /* __ASM_ARCH_MX6_MX6SL_PINS_H__ */
index 319329761049a62516999fc30f0f0220a15ebca9..38e4e516ebc884b4231b3a496be3ae5a59b64cf7 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef _SYS_PROTO_H_
 #define _SYS_PROTO_H_
 
+#include <asm/imx-common/regs-common.h>
+
 #define MXC_CPU_MX51           0x51
 #define MXC_CPU_MX53           0x53
 #define MXC_CPU_MX6SL          0x60
@@ -46,4 +48,12 @@ void set_vddsoc(u32 mv);
 int fecmxc_initialize(bd_t *bis);
 u32 get_ahb_clk(void);
 u32 get_periph_clk(void);
+
+int mxs_reset_block(struct mxs_register_32 *reg);
+int mxs_wait_mask_set(struct mxs_register_32 *reg,
+                      uint32_t mask,
+                      unsigned int timeout);
+int mxs_wait_mask_clr(struct mxs_register_32 *reg,
+                      uint32_t mask,
+                      unsigned int timeout);
 #endif
index 3f7d3f0de50478a45bd11eee456723f7cec51db0..9be53f0a71845848a049cfe1e6c23f6c883f789b 100644 (file)
@@ -59,6 +59,7 @@ uint32_t mxc_get_clock(enum mxc_clock clk);
 void mxs_set_ioclk(enum mxs_ioclock io, uint32_t freq);
 void mxs_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal);
 void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq);
+void mxs_set_lcdclk(uint32_t freq);
 
 /* Compatibility with the FEC Ethernet driver */
 #define        imx_get_fecclk()        mxc_get_clock(MXC_AHB_CLK)
index 8f6749776004c8ddf5eaea9b003056fb23c7d4f4..dc21e34012a1289ac94f9f7a05bea4d9faf647a0 100644 (file)
 #ifndef __IMX_REGS_H__
 #define __IMX_REGS_H__
 
-#include <asm/arch/regs-apbh.h>
+#include <asm/imx-common/regs-apbh.h>
 #include <asm/arch/regs-base.h>
-#include <asm/arch/regs-bch.h>
+#include <asm/imx-common/regs-bch.h>
 #include <asm/arch/regs-digctl.h>
-#include <asm/arch/regs-gpmi.h>
+#include <asm/imx-common/regs-gpmi.h>
 #include <asm/arch/regs-i2c.h>
 #include <asm/arch/regs-lcdif.h>
 #include <asm/arch/regs-lradc.h>
index 42887154c4faefe862fffbaab5a843fb528161f4..d919fb239a0eadae4f15987f3613c394de2e5ebb 100644 (file)
@@ -71,7 +71,11 @@ typedef u32 iomux_cfg_t;
 #define PAD_16MA               3
 
 #define PAD_1V8                        0
+#if defined(CONFIG_MX28)
 #define PAD_3V3                        1
+#else
+#define PAD_3V3                        0
+#endif
 
 #define PAD_NOPULL             0
 #define PAD_PULLUP             1
index 62810eca419bd179c688fa083e5f4699c59f940f..c3cba337f9199ea28fef729fbf1f994e4d232cf4 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX23_REGS_CLKCTRL_H__
 #define __MX23_REGS_CLKCTRL_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_clkctrl_regs {
index 23e9adc25a28ee1cf8251b4b00ef70fe6bb67d46..1c2c82e1bd0b0f1b91f6e298e588071fefe4afe7 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_CLKCTRL_H__
 #define __MX28_REGS_CLKCTRL_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_clkctrl_regs {
index d0433254d5b8a0e21a35c1a71a80c22006c61996..d4a39668b0822f4bcddc553ab2ae10f626463ae0 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef __MX28_REGS_DIGCTL_H__
 #define __MX28_REGS_DIGCTL_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_digctl_regs {
index 067cfd394730268523a3a9894f1b9dbba93a12cb..d062b5be24bc0a9f24e1a82679f84dd027d43c29 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef __MX28_REGS_I2C_H__
 #define __MX28_REGS_I2C_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_i2c_regs {
index b90b2d437a9a06cfcc92f2f66b5c23172343836f..59ce23683df6c3755dfdbbc3dab62a3e75ed9006 100644 (file)
 #ifndef __MX28_REGS_LCDIF_H__
 #define __MX28_REGS_LCDIF_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_lcdif_regs {
        mxs_reg_32(hw_lcdif_ctrl)               /* 0x00 */
        mxs_reg_32(hw_lcdif_ctrl1)              /* 0x10 */
+#if defined(CONFIG_MX28)
        mxs_reg_32(hw_lcdif_ctrl2)              /* 0x20 */
-       mxs_reg_32(hw_lcdif_transfer_count)     /* 0x30 */
-       mxs_reg_32(hw_lcdif_cur_buf)            /* 0x40 */
-       mxs_reg_32(hw_lcdif_next_buf)           /* 0x50 */
+#endif
+       mxs_reg_32(hw_lcdif_transfer_count)     /* 0x20/0x30 */
+       mxs_reg_32(hw_lcdif_cur_buf)            /* 0x30/0x40 */
+       mxs_reg_32(hw_lcdif_next_buf)           /* 0x40/0x50 */
+
+#if defined(CONFIG_MX23)
+       uint32_t        reserved1[4];
+#endif
+
        mxs_reg_32(hw_lcdif_timing)             /* 0x60 */
        mxs_reg_32(hw_lcdif_vdctrl0)            /* 0x70 */
        mxs_reg_32(hw_lcdif_vdctrl1)            /* 0x80 */
@@ -54,13 +61,19 @@ struct mxs_lcdif_regs {
        mxs_reg_32(hw_lcdif_csc_coeffctrl4)     /* 0x150 */
        mxs_reg_32(hw_lcdif_csc_offset) /* 0x160 */
        mxs_reg_32(hw_lcdif_csc_limit)          /* 0x170 */
-       mxs_reg_32(hw_lcdif_data)               /* 0x180 */
-       mxs_reg_32(hw_lcdif_bm_error_stat)      /* 0x190 */
+
+#if defined(CONFIG_MX23)
+       uint32_t        reserved2[12];
+#endif
+       mxs_reg_32(hw_lcdif_data)               /* 0x1b0/0x180 */
+       mxs_reg_32(hw_lcdif_bm_error_stat)      /* 0x1c0/0x190 */
+#if defined(CONFIG_MX28)
        mxs_reg_32(hw_lcdif_crc_stat)           /* 0x1a0 */
-       mxs_reg_32(hw_lcdif_lcdif_stat) /* 0x1b0 */
-       mxs_reg_32(hw_lcdif_version)            /* 0x1c0 */
-       mxs_reg_32(hw_lcdif_debug0)             /* 0x1d0 */
-       mxs_reg_32(hw_lcdif_debug1)             /* 0x1e0 */
+#endif
+       mxs_reg_32(hw_lcdif_lcdif_stat)         /* 0x1d0/0x1b0 */
+       mxs_reg_32(hw_lcdif_version)            /* 0x1e0/0x1c0 */
+       mxs_reg_32(hw_lcdif_debug0)             /* 0x1f0/0x1d0 */
+       mxs_reg_32(hw_lcdif_debug1)             /* 0x200/0x1e0 */
        mxs_reg_32(hw_lcdif_debug2)             /* 0x1f0 */
 };
 #endif
@@ -191,8 +204,13 @@ struct mxs_lcdif_regs {
 #define        LCDIF_VDCTRL1_VSYNC_PERIOD_MASK                         0xffffffff
 #define        LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET                       0
 
+#if defined(CONFIG_MX23)
+#define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK                    (0xff << 24)
+#define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET                  24
+#elif defined(CONFIG_MX28)
 #define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK                    (0x3fff << 18)
 #define        LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET                  18
+#endif
 #define        LCDIF_VDCTRL2_HSYNC_PERIOD_MASK                         0x3ffff
 #define        LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET                       0
 
index 28d838242232da1cc2c32414e23dff2a4359cea3..23fd0e3ac1405bd09a7327414375b069e40ece83 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_LRADC_H__
 #define __MX28_REGS_LRADC_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_lradc_regs {
index 3269892f99dbb8d4797c627eeb5c6efa7650a5f6..5af3855b585fbb31691c91a49f0e88f11b0b64d0 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_OCOTP_H__
 #define __MX28_REGS_OCOTP_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_ocotp_regs {
index d5841709c4a3c12e4650acb7282be24260365781..191093bf1ecf59464a96b96b17c9786059600ab3 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_PINCTRL_H__
 #define __MX28_REGS_PINCTRL_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_pinctrl_regs {
index 51a981a7c6c2825bbae63fb3671f8a9194d26d32..a7430c4efddc19b1ca26165a88e1c09ecc0ebbda 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef __MX23_REGS_POWER_H__
 #define __MX23_REGS_POWER_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_power_regs {
index 257ee88e82eef99f708edb14dbb6860d7e13d7b5..4a73b1c650a40b32ed69f250f1a6e917c3da948b 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef __MX28_REGS_POWER_H__
 #define __MX28_REGS_POWER_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_power_regs {
index 6b2dd332e3040ee70e5ddb5efa2298f1a028f3dc..19265465c727be416767947c77d9623b38aafc7a 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef __MX28_REGS_RTC_H__
 #define __MX28_REGS_RTC_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_rtc_regs {
index 5920f9b4dc7bf3b2a9daf82a610dbfe59b748c6b..0b61fa9d57a96504bc39feecb59ea7919550fee3 100644 (file)
@@ -25,7 +25,7 @@
 #ifndef __MX28_REGS_SSP_H__
 #define __MX28_REGS_SSP_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 #if defined(CONFIG_MX23)
index f8537f1636a7a99122291023f846bee41458e591..df343bd6be2e82dc98ad5aac7db819e90423641c 100644 (file)
@@ -25,7 +25,7 @@
 #ifndef __MX28_REGS_TIMROT_H__
 #define __MX28_REGS_TIMROT_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_timrot_regs {
diff --git a/arch/arm/include/asm/arch-omap24xx/bits.h b/arch/arm/include/asm/arch-omap24xx/bits.h
deleted file mode 100644 (file)
index 8522335..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* bits.h
- * Copyright (c) 2004 Texas Instruments
- *
- * This package is free software;  you can redistribute it and/or
- * modify it under the terms of the license found in the file
- * named COPYING that should have accompanied this file.
- *
- * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-#ifndef __bits_h
-#define __bits_h 1
-
-#define BIT0  (1<<0)
-#define BIT1  (1<<1)
-#define BIT2  (1<<2)
-#define BIT3  (1<<3)
-#define BIT4  (1<<4)
-#define BIT5  (1<<5)
-#define BIT6  (1<<6)
-#define BIT7  (1<<7)
-#define BIT8  (1<<8)
-#define BIT9  (1<<9)
-#define BIT10 (1<<10)
-#define BIT11 (1<<11)
-#define BIT12 (1<<12)
-#define BIT13 (1<<13)
-#define BIT14 (1<<14)
-#define BIT15 (1<<15)
-#define BIT16 (1<<16)
-#define BIT17 (1<<17)
-#define BIT18 (1<<18)
-#define BIT19 (1<<19)
-#define BIT20 (1<<20)
-#define BIT21 (1<<21)
-#define BIT22 (1<<22)
-#define BIT23 (1<<23)
-#define BIT24 (1<<24)
-#define BIT25 (1<<25)
-#define BIT26 (1<<26)
-#define BIT27 (1<<27)
-#define BIT28 (1<<28)
-#define BIT29 (1<<29)
-#define BIT30 (1<<30)
-#define BIT31 (1<<31)
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/clocks.h b/arch/arm/include/asm/arch-omap24xx/clocks.h
deleted file mode 100644 (file)
index 2e92569..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@ti.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 _OMAP24XX_CLOCKS_H_
-#define _OMAP24XX_CLOCKS_H_
-
-#define COMMIT_DIVIDERS  0x1
-
-#define MODE_BYPASS_FAST 0x2
-#define APLL_LOCK        0xc
-#ifdef CONFIG_APTIX
-#define DPLL_LOCK        0x1   /* stay in bypass mode */
-#else
-#define DPLL_LOCK        0x3   /* DPLL lock */
-#endif
-
-/****************************************************************************;
-; PRCM Scheme II
-;
-; Enable clocks and DPLL for:
-;  DPLL=300,   DPLLout=600     M=1,N=50   CM_CLKSEL1_PLL[21:8]  12/2*50
-;  Core=600    (core domain)   DPLLx2     CM_CLKSEL2_PLL[1:0]
-;  MPUF=300    (mpu domain)    2          CM_CLKSEL_MPU[4:0]
-;  DSPF=200    (dsp domain)    3          CM_CLKSEL_DSP[4:0]
-;  DSPI=100                    6          CM_CLKSEL_DSP[6:5]
-;  DSP_S          bypass                      CM_CLKSEL_DSP[7]
-;  IVAF=200    (dsp domain)    3          CM_CLKSEL_DSP[12:8]
-;  IVAF=100        auto
-;  IVAI            auto
-;  IVA_MPU         auto
-;  IVA_S          bypass                  CM_CLKSEL_DSP[13]
-;  GFXF=50      (gfx domain)   12         CM_CLKSEL_FGX[2:0]
-;  SSI_SSRF=200                 3         CM_CLKSEL1_CORE[24:20]
-;  SSI_SSTF=100     auto
-;  L3=100Mhz (sdram)            6         CM_CLKSEL1_CORE[4:0]
-;  L4=100Mhz                    6
-;  C_L4_USB=50                 12         CM_CLKSEL1_CORE[6:5]
-***************************************************************************/
-#define II_DPLL_OUT_X2   0x2    /* x2 core out */
-#define II_MPU_DIV       0x2    /* mpu = core/2 */
-#define II_DSP_DIV       0x343  /* dsp & iva divider */
-#define II_GFX_DIV       0x2
-#define II_BUS_DIV       0x04601026
-#define II_DPLL_300      0x01832100
-
-/****************************************************************************;
-; PRCM Scheme III
-;
-; Enable clocks and DPLL for:
-;  DPLL=266,   DPLLout=532     M=5+1,N=133 CM_CLKSEL1_PLL[21:8]  12/6*133=266
-;  Core=532    (core domain)   DPLLx2      CM_CLKSEL2_PLL[1:0]
-;  MPUF=266    (mpu domain)    /2          CM_CLKSEL_MPU[4:0]
-;  DSPF=177.3     (dsp domain)  /3          CM_CLKSEL_DSP[4:0]
-;  DSPI=88.67                   /6          CM_CLKSEL_DSP[6:5]
-;  DSP_S         ACTIVATED                 CM_CLKSEL_DSP[7]
-;  IVAF=88.67    (dsp domain)   /3          CM_CLKSEL_DSP[12:8]
-;  IVAF=88.67        auto
-;  IVAI            auto
-;  IVA_MPU         auto
-;  IVA_S         ACTIVATED                  CM_CLKSEL_DSP[13]
-;  GFXF=66.5      (gfx domain) /8          CM_CLKSEL_FGX[2:0]:
-;  SSI_SSRF=177.3               /3          CM_CLKSEL1_CORE[24:20]
-;  SSI_SSTF=88.67     auto
-;  L3=133Mhz (sdram)            /4          CM_CLKSEL1_CORE[4:0]
-;  L4=66.5Mhz                   /8
-;  C_L4_USB=33.25               /16         CM_CLKSEL1_CORE[6:5]
-***************************************************************************/
-#define III_DPLL_OUT_X2   0x2    /* x2 core out */
-#define III_MPU_DIV       0x2    /* mpu = core/2 */
-#define III_DSP_DIV       0x23C3 /* dsp & iva divider sych enabled*/
-#define III_GFX_DIV       0x2
-#define III_BUS_DIV       0x08301044
-#define III_DPLL_266      0x01885500
-
-/* set defaults for boot up */
-#ifdef PRCM_CONFIG_II
-# define DPLL_OUT         II_DPLL_OUT_X2
-# define MPU_DIV          II_MPU_DIV
-# define DSP_DIV          II_DSP_DIV
-# define GFX_DIV          II_GFX_DIV
-# define BUS_DIV          II_BUS_DIV
-# define DPLL_VAL         II_DPLL_300
-#elif PRCM_CONFIG_III
-# define DPLL_OUT         III_DPLL_OUT_X2
-# define MPU_DIV          III_MPU_DIV
-# define DSP_DIV          III_DSP_DIV
-# define GFX_DIV          III_GFX_DIV
-# define BUS_DIV          III_BUS_DIV
-# define DPLL_VAL         III_DPLL_266
-#endif
-
-/* lock delay time out */
-#define LDELAY           12000000
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/i2c.h b/arch/arm/include/asm/arch-omap24xx/i2c.h
deleted file mode 100644 (file)
index 6f64519..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * (C) Copyright 2004
- * 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
- */
-#ifndef _OMAP24XX_I2C_H_
-#define _OMAP24XX_I2C_H_
-
-#define I2C_BASE1              0x48070000
-#define I2C_BASE2               0x48072000 /* nothing hooked up on h4 */
-
-#define I2C_DEFAULT_BASE       I2C_BASE1
-
-struct i2c {
-       unsigned short rev;     /* 0x00 */
-       unsigned short res1;
-       unsigned short ie;      /* 0x04 */
-       unsigned short res2;
-       unsigned short stat;    /* 0x08 */
-       unsigned short res3;
-       unsigned short iv;      /* 0x0C */
-       unsigned short res4;
-       unsigned short syss;    /* 0x10 */
-       unsigned short res4p1;
-       unsigned short buf;     /* 0x14 */
-       unsigned short res5;
-       unsigned short cnt;     /* 0x18 */
-       unsigned short res6;
-       unsigned short data;    /* 0x1C */
-       unsigned short res7;
-       unsigned short sysc;    /* 0x20 */
-       unsigned short res8;
-       unsigned short con;     /* 0x24 */
-       unsigned short res9;
-       unsigned short oa;      /* 0x28 */
-       unsigned short res10;
-       unsigned short sa;      /* 0x2C */
-       unsigned short res11;
-       unsigned short psc;     /* 0x30 */
-       unsigned short res12;
-       unsigned short scll;    /* 0x34 */
-       unsigned short res13;
-       unsigned short sclh;    /* 0x38 */
-       unsigned short res14;
-       unsigned short systest; /* 0x3c */
-       unsigned short res15;
-};
-
-#define I2C_BUS_MAX    2
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/mem.h b/arch/arm/include/asm/arch-omap24xx/mem.h
deleted file mode 100644 (file)
index 42e8ab2..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@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
- */
-
-#ifndef _OMAP24XX_MEM_H_
-#define _OMAP24XX_MEM_H_
-
-#define SDRC_CS0_OSET   0x0
-#define SDRC_CS1_OSET   0x30  /* mirror CS1 regs appear offset 0x30 from CS0 */
-
-#ifndef __ASSEMBLY__
-/* struct's for holding data tables for current boards, they are getting used
-   early in init when NO global access are there */
-struct sdrc_data_s {
-       u32    sdrc_sharing;
-       u32    sdrc_mdcfg_0_ddr;
-       u32    sdrc_mdcfg_0_sdr;
-       u32    sdrc_actim_ctrla_0;
-       u32    sdrc_actim_ctrlb_0;
-       u32    sdrc_rfr_ctrl;
-       u32    sdrc_mr_0_ddr;
-       u32    sdrc_mr_0_sdr;
-       u32    sdrc_dllab_ctrl;
-} /*__attribute__ ((packed))*/;
-typedef struct sdrc_data_s sdrc_data_t;
-
-typedef enum {
-       STACKED         = 0,
-       IP_DDR          = 1,
-       COMBO_DDR       = 2,
-       IP_SDR          = 3,
-} mem_t;
-
-#endif
-
-/* Slower full frequency range default timings for x32 operation*/
-#define H4_2420_SDRC_SHARING           0x00000100
-#define H4_2420_SDRC_MDCFG_0_SDR       0x00D04010 /* discrete sdr module */
-#define H4_2420_SDRC_MR_0_SDR          0x00000031
-#define H4_2420_SDRC_MDCFG_0_DDR       0x01702011 /* descrite ddr module */
-#define H4_2420_COMBO_MDCFG_0_DDR      0x00801011 /* combo module */
-#define H4_2420_SDRC_MR_0_DDR          0x00000032
-
-#define H4_2422_SDRC_SHARING           0x00004b00
-#define H4_2422_SDRC_MDCFG_0_DDR       0x00801011 /* stacked ddr on 2422 */
-#define H4_2422_SDRC_MR_0_DDR          0x00000032
-
-/* ES1 work around timings */
-#define H4_242x_SDRC_ACTIM_CTRLA_0_ES1 0x9bead909  /* 165Mhz for use with 100/133 */
-#define H4_242x_SDRC_ACTIM_CTRLB_0_ES1 0x00000020
-#define H4_242x_SDRC_RFR_CTRL_ES1          0x00002401  /* use over refresh for ES1 */
-
-/* optimized timings good for current shipping parts */
-#define H4_242X_SDRC_ACTIM_CTRLA_0_100MHz  0x5A59B485
-#define H4_242X_SDRC_ACTIM_CTRLB_0_100MHz  0x0000000e
-#define H4_242X_SDRC_ACTIM_CTRLA_0_133MHz  0x8BA6E6C8 /* temp warn 0 settings */
-#define H4_242X_SDRC_ACTIM_CTRLB_0_133MHz  0x00000010 /* temp warn 0 settings */
-#define H4_242X_SDRC_RFR_CTRL_100MHz      0x0002da01
-#define H4_242X_SDRC_RFR_CTRL_133MHz      0x0003de01
-#define H4_242x_SDRC_DLLAB_CTRL_100MHz    0x0000980E /* 72deg, allow DPLLout*1 to work (combo)*/
-#define H4_242x_SDRC_DLLAB_CTRL_133MHz    0x0000690E /* 72deg, for ES2 */
-
-#ifdef PRCM_CONFIG_II
-# define H4_2420_SDRC_ACTIM_CTRLA_0    H4_242X_SDRC_ACTIM_CTRLA_0_100MHz
-# define H4_2420_SDRC_ACTIM_CTRLB_0    H4_242X_SDRC_ACTIM_CTRLB_0_100MHz
-# define H4_2420_SDRC_RFR_CTRL         H4_242X_SDRC_RFR_CTRL_100MHz
-# define H4_2420_SDRC_DLLAB_CTRL    H4_242x_SDRC_DLLAB_CTRL_100MHz
-# define H4_2422_SDRC_ACTIM_CTRLA_0    H4_242X_SDRC_ACTIM_CTRLA_0_100MHz
-# define H4_2422_SDRC_ACTIM_CTRLB_0    H4_242X_SDRC_ACTIM_CTRLB_0_100MHz
-# define H4_2422_SDRC_RFR_CTRL         H4_242X_SDRC_RFR_CTRL_100MHz
-# define H4_2422_SDRC_DLLAB_CTRL    H4_242x_SDRC_DLLAB_CTRL_100MHz
-#elif PRCM_CONFIG_III
-# define H4_2420_SDRC_ACTIM_CTRLA_0    H4_242X_SDRC_ACTIM_CTRLA_0_133MHz
-# define H4_2420_SDRC_ACTIM_CTRLB_0    H4_242X_SDRC_ACTIM_CTRLB_0_133MHz
-# define H4_2420_SDRC_RFR_CTRL         H4_242X_SDRC_RFR_CTRL_133MHz
-# define H4_2420_SDRC_DLLAB_CTRL    H4_242x_SDRC_DLLAB_CTRL_133MHz
-# define H4_2422_SDRC_ACTIM_CTRLA_0    H4_242X_SDRC_ACTIM_CTRLA_0_100MHz
-# define H4_2422_SDRC_ACTIM_CTRLB_0    H4_242X_SDRC_ACTIM_CTRLB_0_100MHz
-# define H4_2422_SDRC_RFR_CTRL         H4_242X_SDRC_RFR_CTRL_100MHz
-# define H4_2422_SDRC_DLLAB_CTRL    H4_242x_SDRC_DLLAB_CTRL_100MHz
-#endif
-
-
-/* GPMC settings */
-#ifdef PRCM_CONFIG_II       /* L3 at 100MHz */
-# ifdef CONFIG_SYS_NAND_BOOT
-#  define H4_24XX_GPMC_CONFIG1_0   0x0
-#  define H4_24XX_GPMC_CONFIG2_0   0x00141400
-#  define H4_24XX_GPMC_CONFIG3_0   0x00141400
-#  define H4_24XX_GPMC_CONFIG4_0   0x0F010F01
-#  define H4_24XX_GPMC_CONFIG5_0   0x010C1414
-#  define H4_24XX_GPMC_CONFIG6_0   0x00000A80
-# else /* else NOR */
-#  define H4_24XX_GPMC_CONFIG1_0   0x3
-#  define H4_24XX_GPMC_CONFIG2_0   0x000f0f01
-#  define H4_24XX_GPMC_CONFIG3_0   0x00050502
-#  define H4_24XX_GPMC_CONFIG4_0   0x0C060C06
-#  define H4_24XX_GPMC_CONFIG5_0   0x01131F1F
-# endif /* endif CONFIG_SYS_NAND_BOOT */
-# define H4_24XX_GPMC_CONFIG7_0          (0x00000C40|(H4_CS0_BASE >> 24))
-# define H4_24XX_GPMC_CONFIG1_1          0x00011000
-# define H4_24XX_GPMC_CONFIG2_1          0x001F1F00
-# define H4_24XX_GPMC_CONFIG3_1          0x00080802
-# define H4_24XX_GPMC_CONFIG4_1          0x1C091C09
-# define H4_24XX_GPMC_CONFIG5_1          0x031A1F1F
-# define H4_24XX_GPMC_CONFIG6_1          0x000003C2
-# define H4_24XX_GPMC_CONFIG7_1          (0x00000F40|(H4_CS1_BASE >> 24))
-#endif /* endif PRCM_CONFIG_II */
-
-#ifdef PRCM_CONFIG_III /* L3 at 133MHz */
-# ifdef CONFIG_SYS_NAND_BOOT
-#  define H4_24XX_GPMC_CONFIG1_0   0x0
-#  define H4_24XX_GPMC_CONFIG2_0   0x00141400
-#  define H4_24XX_GPMC_CONFIG3_0   0x00141400
-#  define H4_24XX_GPMC_CONFIG4_0   0x0F010F01
-#  define H4_24XX_GPMC_CONFIG5_0   0x010C1414
-#  define H4_24XX_GPMC_CONFIG6_0   0x00000A80
-# else /* NOR boot */
-#  define H4_24XX_GPMC_CONFIG1_0   0x3
-#  define H4_24XX_GPMC_CONFIG2_0   0x00151501
-#  define H4_24XX_GPMC_CONFIG3_0   0x00060602
-#  define H4_24XX_GPMC_CONFIG4_0   0x10081008
-#  define H4_24XX_GPMC_CONFIG5_0   0x01131F1F
-#  define H4_24XX_GPMC_CONFIG6_0   0x000004c4
-# endif /* endif CONFIG_SYS_NAND_BOOT */
-# define H4_24XX_GPMC_CONFIG7_0          (0x00000C40|(H4_CS0_BASE >> 24))
-# define H4_24XX_GPMC_CONFIG1_1          0x00011000
-# define H4_24XX_GPMC_CONFIG2_1          0x001f1f01
-# define H4_24XX_GPMC_CONFIG3_1          0x00080803
-# define H4_24XX_GPMC_CONFIG4_1          0x1C091C09
-# define H4_24XX_GPMC_CONFIG5_1          0x041f1F1F
-# define H4_24XX_GPMC_CONFIG6_1          0x000004C4
-# define H4_24XX_GPMC_CONFIG7_1          (0x00000F40|(H4_CS1_BASE >> 24))
-#endif /* endif CONFIG_SYS_PRCM_III */
-
-#endif /* endif _OMAP24XX_MEM_H_ */
diff --git a/arch/arm/include/asm/arch-omap24xx/mux.h b/arch/arm/include/asm/arch-omap24xx/mux.h
deleted file mode 100644 (file)
index 4fdb9c6..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@ti.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 _OMAP2420_MUX_H_
-#define _OMAP2420_MUX_H_
-
-#ifndef __ASSEMBLY__
-typedef  unsigned char uint8;
-typedef  unsigned int uint32;
-
-void muxSetupSDRC(void);
-void muxSetupGPMC(void);
-void muxSetupUsb0(void);
-void muxSetupUsbHost(void);
-void muxSetupUart3(void);
-void muxSetupI2C1(void);
-void muxSetupUART1(void);
-void muxSetupLCD(void);
-void muxSetupCamera(void);
-void muxSetupMMCSD(void) ;
-void muxSetupTouchScreen(void) ;
-void muxSetupHDQ(void);
-#endif
-
-#define USB_OTG_CTRL                           ((volatile uint32 *)0x4805E30C)
-
-/* Pin Muxing registers used for HDQ (Smart battery) */
-#define CONTROL_PADCONF_HDQ_SIO         ((volatile unsigned char *)0x48000115)
-
-/* Pin Muxing registers used for GPMC */
-#define CONTROL_PADCONF_GPMC_D2_BYTE0  ((volatile unsigned char *)0x48000088)
-#define CONTROL_PADCONF_GPMC_D2_BYTE1  ((volatile unsigned char *)0x48000089)
-#define CONTROL_PADCONF_GPMC_D2_BYTE2  ((volatile unsigned char *)0x4800008A)
-#define CONTROL_PADCONF_GPMC_D2_BYTE3  ((volatile unsigned char *)0x4800008B)
-
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE0        ((volatile unsigned char *)0x4800008C)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE1        ((volatile unsigned char *)0x4800008D)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE2        ((volatile unsigned char *)0x4800008E)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE3        ((volatile unsigned char *)0x4800008F)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE4        (0x48000090)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE5        (0x48000091)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE6        (0x48000092)
-#define CONTROL_PADCONF_GPMC_NCS0_BYTE7        (0x48000093)
-
-/* Pin Muxing registers used for SDRC */
-#define CONTROL_PADCONF_SDRC_NCS0_BYTE0 ((volatile unsigned char *)0x480000A0)
-#define CONTROL_PADCONF_SDRC_NCS0_BYTE1 ((volatile unsigned char *)0x480000A1)
-#define CONTROL_PADCONF_SDRC_NCS0_BYTE2 ((volatile unsigned char *)0x480000A2)
-#define CONTROL_PADCONF_SDRC_NCS0_BYTE3 ((volatile unsigned char *)0x480000A3)
-
-#define CONTROL_PADCONF_SDRC_A14_BYTE0 ((volatile unsigned char *)0x48000030)
-#define CONTROL_PADCONF_SDRC_A14_BYTE1 ((volatile unsigned char *)0x48000031)
-#define CONTROL_PADCONF_SDRC_A14_BYTE2 ((volatile unsigned char *)0x48000032)
-#define CONTROL_PADCONF_SDRC_A14_BYTE3 ((volatile unsigned char *)0x48000033)
-
-/* Pin Muxing registers used for Touch Screen (SPI) */
-#define CONTROL_PADCONF_SPI1_CLK        ((volatile unsigned char *)0x480000FF)
-#define CONTROL_PADCONF_SPI1_SIMO       ((volatile unsigned char *)0x48000100)
-#define CONTROL_PADCONF_SPI1_SOMI       ((volatile unsigned char *)0x48000101)
-#define CONTROL_PADCONF_SPI1_NCS0       ((volatile unsigned char *)0x48000102)
-#define CONTROL_PADCONF_SPI1_NCS1       (0x48000103)
-
-#define CONTROL_PADCONF_MCBSP1_FSR      ((volatile unsigned char *)0x4800010B)
-
-/* Pin Muxing registers used for MMCSD */
-#define CONTROL_PADCONF_MMC_CLKI        ((volatile unsigned char *)0x480000FE)
-#define CONTROL_PADCONF_MMC_CLKO        ((volatile unsigned char *)0x480000F3)
-#define CONTROL_PADCONF_MMC_CMD         ((volatile unsigned char *)0x480000F4)
-#define CONTROL_PADCONF_MMC_DAT0        ((volatile unsigned char *)0x480000F5)
-#define CONTROL_PADCONF_MMC_DAT1        ((volatile unsigned char *)0x480000F6)
-#define CONTROL_PADCONF_MMC_DAT2        ((volatile unsigned char *)0x480000F7)
-#define CONTROL_PADCONF_MMC_DAT3        ((volatile unsigned char *)0x480000F8)
-#define CONTROL_PADCONF_MMC_DAT_DIR0    ((volatile unsigned char *)0x480000F9)
-#define CONTROL_PADCONF_MMC_DAT_DIR1    ((volatile unsigned char *)0x480000FA)
-#define CONTROL_PADCONF_MMC_DAT_DIR2    ((volatile unsigned char *)0x480000FB)
-#define CONTROL_PADCONF_MMC_DAT_DIR3    ((volatile unsigned char *)0x480000FC)
-#define CONTROL_PADCONF_MMC_CMD_DIR     ((volatile unsigned char *)0x480000FD)
-
-#define CONTROL_PADCONF_SDRC_A14        ((volatile unsigned char *)0x48000030)
-#define CONTROL_PADCONF_SDRC_A13        ((volatile unsigned char *)0x48000031)
-
-/* Pin Muxing registers used for CAMERA */
-#define CONTROL_PADCONF_SYS_NRESWARM    ((volatile unsigned char *)0x4800012B)
-
-#define CONTROL_PADCONF_CAM_XCLK        ((volatile unsigned char *)0x480000DC)
-#define CONTROL_PADCONF_CAM_LCLK        ((volatile unsigned char *)0x480000DB)
-#define CONTROL_PADCONF_CAM_VS          ((volatile unsigned char *)0x480000DA)
-#define CONTROL_PADCONF_CAM_HS          ((volatile unsigned char *)0x480000D9)
-#define CONTROL_PADCONF_CAM_D0          ((volatile unsigned char *)0x480000D8)
-#define CONTROL_PADCONF_CAM_D1          ((volatile unsigned char *)0x480000D7)
-#define CONTROL_PADCONF_CAM_D2          ((volatile unsigned char *)0x480000D6)
-#define CONTROL_PADCONF_CAM_D3          ((volatile unsigned char *)0x480000D5)
-#define CONTROL_PADCONF_CAM_D4          ((volatile unsigned char *)0x480000D4)
-#define CONTROL_PADCONF_CAM_D5          ((volatile unsigned char *)0x480000D3)
-#define CONTROL_PADCONF_CAM_D6          ((volatile unsigned char *)0x480000D2)
-#define CONTROL_PADCONF_CAM_D7          ((volatile unsigned char *)0x480000D1)
-#define CONTROL_PADCONF_CAM_D8          ((volatile unsigned char *)0x480000D0)
-#define CONTROL_PADCONF_CAM_D9          ((volatile unsigned char *)0x480000CF)
-
-/* Pin Muxing registers used for LCD */
-#define CONTROL_PADCONF_DSS_D0          ((volatile unsigned char *)0x480000B3)
-#define CONTROL_PADCONF_DSS_D1          ((volatile unsigned char *)0x480000B4)
-#define CONTROL_PADCONF_DSS_D2          ((volatile unsigned char *)0x480000B5)
-#define CONTROL_PADCONF_DSS_D3          ((volatile unsigned char *)0x480000B6)
-#define CONTROL_PADCONF_DSS_D4          ((volatile unsigned char *)0x480000B7)
-#define CONTROL_PADCONF_DSS_D5          ((volatile unsigned char *)0x480000B8)
-#define CONTROL_PADCONF_DSS_D6          ((volatile unsigned char *)0x480000B9)
-#define CONTROL_PADCONF_DSS_D7          ((volatile unsigned char *)0x480000BA)
-#define CONTROL_PADCONF_DSS_D8          ((volatile unsigned char *)0x480000BB)
-#define CONTROL_PADCONF_DSS_D9          ((volatile unsigned char *)0x480000BC)
-#define CONTROL_PADCONF_DSS_D10         ((volatile unsigned char *)0x480000BD)
-#define CONTROL_PADCONF_DSS_D11         ((volatile unsigned char *)0x480000BE)
-#define CONTROL_PADCONF_DSS_D12         ((volatile unsigned char *)0x480000BF)
-#define CONTROL_PADCONF_DSS_D13         ((volatile unsigned char *)0x480000C0)
-#define CONTROL_PADCONF_DSS_D14         ((volatile unsigned char *)0x480000C1)
-#define CONTROL_PADCONF_DSS_D15         ((volatile unsigned char *)0x480000C2)
-#define CONTROL_PADCONF_DSS_D16         ((volatile unsigned char *)0x480000C3)
-#define CONTROL_PADCONF_DSS_D17         ((volatile unsigned char *)0x480000C4)
-#define CONTROL_PADCONF_DSS_PCLK        ((volatile unsigned char *)0x480000CB)
-#define CONTROL_PADCONF_DSS_VSYNC       ((volatile unsigned char *)0x480000CC)
-#define CONTROL_PADCONF_DSS_HSYNC       ((volatile unsigned char *)0x480000CD)
-#define CONTROL_PADCONF_DSS_ACBIAS      ((volatile unsigned char *)0x480000CE)
-
-/* Pin Muxing registers used for UART1 */
-#define CONTROL_PADCONF_UART1_CTS       ((volatile unsigned char *)0x480000C5)
-#define CONTROL_PADCONF_UART1_RTS       ((volatile unsigned char *)0x480000C6)
-#define CONTROL_PADCONF_UART1_TX        ((volatile unsigned char *)0x480000C7)
-#define CONTROL_PADCONF_UART1_RX        ((volatile unsigned char *)0x480000C8)
-
-/* Pin Muxing registers used for I2C1 */
-#define CONTROL_PADCONF_I2C1_SCL        ((volatile unsigned char *)0x48000111)
-#define CONTROL_PADCONF_I2C1_SDA        ((volatile unsigned char *)0x48000112)
-
-/* Pin Muxing registres used for USB0. */
-#define CONTROL_PADCONF_USB0_PUEN              ((volatile uint8 *)0x4800011D)
-#define CONTROL_PADCONF_USB0_VP                        ((volatile uint8 *)0x4800011E)
-#define CONTROL_PADCONF_USB0_VM                        ((volatile uint8 *)0x4800011F)
-#define CONTROL_PADCONF_USB0_RCV               ((volatile uint8 *)0x48000120)
-#define CONTROL_PADCONF_USB0_TXEN              ((volatile uint8 *)0x48000121)
-#define CONTROL_PADCONF_USB0_SE0               ((volatile uint8 *)0x48000122)
-#define CONTROL_PADCONF_USB0_DAT               ((volatile uint8 *)0x48000123)
-
-/* Pin Muxing registres used for USB1. */
-#define CONTROL_PADCONF_USB1_RCV       (0x480000EB)
-#define CONTROL_PADCONF_USB1_TXEN      (0x480000EC)
-
-/* Pin Muxing registers used for UART3/IRDA */
-#define CONTROL_PADCONF_UART3_TX_IRTX  ((volatile uint8 *)0x48000118)
-#define CONTROL_PADCONF_UART3_RX_IRRX  ((volatile uint8 *)0x48000119)
-
-/* Pin Muxing registers used for GPIO */
-#define CONTROL_PADCONF_GPIO69         (0x480000ED)
-#define CONTROL_PADCONF_GPIO70         (0x480000EE)
-#define CONTROL_PADCONF_GPIO102                (0x48000116)
-#define CONTROL_PADCONF_GPIO103                (0x48000117)
-#define CONTROL_PADCONF_GPIO104                (0x48000118)
-#define CONTROL_PADCONF_GPIO105                (0x48000119)
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/omap2420.h b/arch/arm/include/asm/arch-omap24xx/omap2420.h
deleted file mode 100644 (file)
index 5724f5d..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@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
- */
-
-#ifndef _OMAP2420_SYS_H_
-#define _OMAP2420_SYS_H_
-
-#include <asm/sizes.h>
-
-/*
- * 2420 specific Section
- */
-
-/* L3 Firewall */
-#define A_REQINFOPERM0        0x68005048
-#define A_READPERM0           0x68005050
-#define A_WRITEPERM0          0x68005058
-/* #define GP_DEVICE   (BIT8|BIT9)  FIXME -- commented out to make compile -- FIXME */
-
-/* L3 Firewall */
-#define A_REQINFOPERM0        0x68005048
-#define A_READPERM0           0x68005050
-#define A_WRITEPERM0          0x68005058
-
-/* CONTROL */
-#define OMAP2420_CTRL_BASE    (0x48000000)
-#define CONTROL_STATUS        (OMAP2420_CTRL_BASE + 0x2F8)
-
-/* device type */
-#define TST_DEVICE     0x0
-#define EMU_DEVICE     0x1
-#define HS_DEVICE      0x2
-#define GP_DEVICE      0x3
-
-/* TAP information */
-#define OMAP2420_TAP_BASE     (0x48014000)
-#define TAP_IDCODE_REG        (OMAP2420_TAP_BASE+0x204)
-#define PRODUCTION_ID         (OMAP2420_TAP_BASE+0x208)
-
-/* GPMC */
-#define OMAP2420_GPMC_BASE    (0x6800A000)
-#define GPMC_SYSCONFIG        (OMAP2420_GPMC_BASE+0x10)
-#define GPMC_IRQENABLE        (OMAP2420_GPMC_BASE+0x1C)
-#define GPMC_TIMEOUT_CONTROL  (OMAP2420_GPMC_BASE+0x40)
-#define GPMC_CONFIG           (OMAP2420_GPMC_BASE+0x50)
-#define GPMC_CONFIG1_0        (OMAP2420_GPMC_BASE+0x60)
-#define GPMC_CONFIG2_0        (OMAP2420_GPMC_BASE+0x64)
-#define GPMC_CONFIG3_0        (OMAP2420_GPMC_BASE+0x68)
-#define GPMC_CONFIG4_0        (OMAP2420_GPMC_BASE+0x6C)
-#define GPMC_CONFIG5_0        (OMAP2420_GPMC_BASE+0x70)
-#define GPMC_CONFIG6_0        (OMAP2420_GPMC_BASE+0x74)
-#define GPMC_CONFIG7_0       (OMAP2420_GPMC_BASE+0x78)
-#define GPMC_CONFIG1_1        (OMAP2420_GPMC_BASE+0x90)
-#define GPMC_CONFIG2_1        (OMAP2420_GPMC_BASE+0x94)
-#define GPMC_CONFIG3_1        (OMAP2420_GPMC_BASE+0x98)
-#define GPMC_CONFIG4_1        (OMAP2420_GPMC_BASE+0x9C)
-#define GPMC_CONFIG5_1        (OMAP2420_GPMC_BASE+0xA0)
-#define GPMC_CONFIG6_1        (OMAP2420_GPMC_BASE+0xA4)
-#define GPMC_CONFIG7_1       (OMAP2420_GPMC_BASE+0xA8)
-#define GPMC_CONFIG1_2        (OMAP2420_GPMC_BASE+0xC0)
-#define GPMC_CONFIG2_2        (OMAP2420_GPMC_BASE+0xC4)
-#define GPMC_CONFIG3_2        (OMAP2420_GPMC_BASE+0xC8)
-#define GPMC_CONFIG4_2        (OMAP2420_GPMC_BASE+0xCC)
-#define GPMC_CONFIG5_2        (OMAP2420_GPMC_BASE+0xD0)
-#define GPMC_CONFIG6_2        (OMAP2420_GPMC_BASE+0xD4)
-#define GPMC_CONFIG7_2        (OMAP2420_GPMC_BASE+0xD8)
-#define GPMC_CONFIG1_3        (OMAP2420_GPMC_BASE+0xF0)
-#define GPMC_CONFIG2_3        (OMAP2420_GPMC_BASE+0xF4)
-#define GPMC_CONFIG3_3        (OMAP2420_GPMC_BASE+0xF8)
-#define GPMC_CONFIG4_3        (OMAP2420_GPMC_BASE+0xFC)
-#define GPMC_CONFIG5_3        (OMAP2420_GPMC_BASE+0x100)
-#define GPMC_CONFIG6_3        (OMAP2420_GPMC_BASE+0x104)
-#define GPMC_CONFIG7_3       (OMAP2420_GPMC_BASE+0x108)
-
-/* SMS */
-#define OMAP2420_SMS_BASE 0x68008000
-#define SMS_SYSCONFIG     (OMAP2420_SMS_BASE+0x10)
-#define SMS_CLASS_ARB0    (OMAP2420_SMS_BASE+0xD0)
-# define BURSTCOMPLETE_GROUP7    BIT31
-
-/* SDRC */
-#define OMAP2420_SDRC_BASE 0x68009000
-#define SDRC_SYSCONFIG     (OMAP2420_SDRC_BASE+0x10)
-#define SDRC_STATUS        (OMAP2420_SDRC_BASE+0x14)
-#define SDRC_CS_CFG        (OMAP2420_SDRC_BASE+0x40)
-#define SDRC_SHARING       (OMAP2420_SDRC_BASE+0x44)
-#define SDRC_DLLA_CTRL     (OMAP2420_SDRC_BASE+0x60)
-#define SDRC_DLLB_CTRL     (OMAP2420_SDRC_BASE+0x68)
-#define SDRC_POWER         (OMAP2420_SDRC_BASE+0x70)
-#define SDRC_MCFG_0        (OMAP2420_SDRC_BASE+0x80)
-#define SDRC_MR_0          (OMAP2420_SDRC_BASE+0x84)
-#define SDRC_ACTIM_CTRLA_0 (OMAP2420_SDRC_BASE+0x9C)
-#define SDRC_ACTIM_CTRLB_0 (OMAP2420_SDRC_BASE+0xA0)
-#define SDRC_ACTIM_CTRLA_1 (OMAP2420_SDRC_BASE+0xC4)
-#define SDRC_ACTIM_CTRLB_1 (OMAP2420_SDRC_BASE+0xC8)
-#define SDRC_RFR_CTRL      (OMAP2420_SDRC_BASE+0xA4)
-#define SDRC_MANUAL_0      (OMAP2420_SDRC_BASE+0xA8)
-#define OMAP2420_SDRC_CS0  0x80000000
-#define OMAP2420_SDRC_CS1  0xA0000000
-#define CMD_NOP            0x0
-#define CMD_PRECHARGE      0x1
-#define CMD_AUTOREFRESH    0x2
-#define CMD_ENTR_PWRDOWN   0x3
-#define CMD_EXIT_PWRDOWN   0x4
-#define CMD_ENTR_SRFRSH    0x5
-#define CMD_CKE_HIGH       0x6
-#define CMD_CKE_LOW        0x7
-#define SOFTRESET          BIT1
-#define SMART_IDLE         (0x2 << 3)
-#define REF_ON_IDLE        (0x1 << 6)
-
-
-/* UART */
-#define OMAP2420_UART1       0x4806A000
-#define OMAP2420_UART2       0x4806C000
-#define OMAP2420_UART3        0x4806E000
-
-/* General Purpose Timers */
-#define OMAP2420_GPT1         0x48028000
-#define OMAP2420_GPT2         0x4802A000
-#define OMAP2420_GPT3         0x48078000
-#define OMAP2420_GPT4         0x4807A000
-#define OMAP2420_GPT5         0x4807C000
-#define OMAP2420_GPT6         0x4807E000
-#define OMAP2420_GPT7         0x48080000
-#define OMAP2420_GPT8         0x48082000
-#define OMAP2420_GPT9         0x48084000
-#define OMAP2420_GPT10        0x48086000
-#define OMAP2420_GPT11        0x48088000
-#define OMAP2420_GPT12        0x4808A000
-
-/* timer regs offsets (32 bit regs) */
-#define TIDR       0x0      /* r */
-#define TIOCP_CFG  0x10     /* rw */
-#define TISTAT     0x14     /* r */
-#define TISR       0x18     /* rw */
-#define TIER       0x1C     /* rw */
-#define TWER       0x20     /* rw */
-#define TCLR       0x24     /* rw */
-#define TCRR       0x28     /* rw */
-#define TLDR       0x2C     /* rw */
-#define TTGR       0x30     /* rw */
-#define TWPS       0x34     /* r */
-#define TMAR       0x38     /* rw */
-#define TCAR1      0x3c     /* r */
-#define TSICR      0x40     /* rw */
-#define TCAR2      0x44     /* r */
-
-/* WatchDog Timers (1 secure, 3 GP) */
-#define WD1_BASE              0x48020000
-#define WD2_BASE              0x48022000
-#define WD3_BASE              0x48024000
-#define WD4_BASE              0x48026000
-#define WWPS       0x34     /* r */
-#define WSPR       0x48     /* rw */
-#define WD_UNLOCK1 0xAAAA
-#define WD_UNLOCK2 0x5555
-
-/* PRCM */
-#define OMAP2420_CM_BASE 0x48008000
-#define PRCM_CLKCFG_CTRL (OMAP2420_CM_BASE+0x080)
-#define CM_CLKSEL_MPU    (OMAP2420_CM_BASE+0x140)
-#define CM_FCLKEN1_CORE  (OMAP2420_CM_BASE+0x200)
-#define CM_FCLKEN2_CORE  (OMAP2420_CM_BASE+0x204)
-#define CM_ICLKEN1_CORE  (OMAP2420_CM_BASE+0x210)
-#define CM_ICLKEN2_CORE  (OMAP2420_CM_BASE+0x214)
-#define CM_CLKSEL1_CORE  (OMAP2420_CM_BASE+0x240)
-#define CM_CLKSEL_WKUP   (OMAP2420_CM_BASE+0x440)
-#define CM_CLKSEL2_CORE  (OMAP2420_CM_BASE+0x244)
-#define CM_CLKSEL_GFX    (OMAP2420_CM_BASE+0x340)
-#define PM_RSTCTRL_WKUP  (OMAP2420_CM_BASE+0x450)
-#define CM_CLKEN_PLL     (OMAP2420_CM_BASE+0x500)
-#define CM_IDLEST_CKGEN  (OMAP2420_CM_BASE+0x520)
-#define CM_CLKSEL1_PLL   (OMAP2420_CM_BASE+0x540)
-#define CM_CLKSEL2_PLL   (OMAP2420_CM_BASE+0x544)
-#define CM_CLKSEL_DSP    (OMAP2420_CM_BASE+0x840)
-
-/*
- * H4 specific Section
- */
-
-/*
- *  The 2420's chip selects are programmable.  The mask ROM
- *  does configure CS0 to 0x08000000 before dispatch.  So, if
- *  you want your code to live below that address, you have to
- *  be prepared to jump though hoops, to reset the base address.
- */
-#if defined(CONFIG_OMAP2420H4)
-/* GPMC */
-#ifdef CONFIG_VIRTIO_A        /* Pre version B */
-# define H4_CS0_BASE           0x08000000  /* flash (64 Meg aligned) */
-# define H4_CS1_BASE           0x04000000  /* debug board */
-# define H4_CS2_BASE           0x0A000000  /* wifi board */
-#else
-# define H4_CS0_BASE           0x08000000  /* flash (64 Meg aligned) */
-# define H4_CS1_BASE           0x04000000  /* debug board */
-# define H4_CS2_BASE           0x0C000000  /* wifi board */
-#endif
-
-/* base address for indirect vectors (internal boot mode) */
-#define SRAM_OFFSET0          0x40000000
-#define SRAM_OFFSET1          0x00200000
-#define SRAM_OFFSET2          0x0000F800
-#define SRAM_VECT_CODE       (SRAM_OFFSET0|SRAM_OFFSET1|SRAM_OFFSET2)
-
-/* FPGA on Debug board.*/
-#define ETH_CONTROL_REG       (H4_CS1_BASE+0x30b)
-#define LAN_RESET_REGISTER    (H4_CS1_BASE+0x1c)
-#endif  /* endif CONFIG_2420H4 */
-
-/* Common */
-#define LOW_LEVEL_SRAM_STACK  0x4020FFFC
-
-#define PERIFERAL_PORT_BASE   0x480FE003
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/sys_info.h b/arch/arm/include/asm/arch-omap24xx/sys_info.h
deleted file mode 100644 (file)
index 53c231a..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@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
- */
-
-#ifndef _OMAP24XX_SYS_INFO_H_
-#define _OMAP24XX_SYS_INFO_H_
-
-typedef struct  h4_system_data {
-       /* base board info */
-       u32 base_b_rev;         /* rev from base board i2c */
-       /* cpu board info */
-       u32 cpu_b_rev;          /* rev from cpu board i2c */
-       u32 cpu_b_mux;          /* mux type on daughter board */
-       u32 cpu_b_ddr_type;     /* mem type */
-       u32 cpu_b_ddr_speed;    /* ddr speed rating */
-       u32 cpu_b_switches;     /* boot ctrl switch settings */
-       /* cpu info */
-       u32 cpu_type;           /* type of cpu; 2420, 2422, 2430,...*/
-       u32 cpu_rev;            /* rev of given cpu; ES1, ES2,...*/
-} h4_sys_data;
-
-#define XDR_POP           5      /* package on package part */
-#define SDR_DISCRETE      4      /* 128M memory SDR module*/
-#define DDR_STACKED       3      /* stacked part on 2422 */
-#define DDR_COMBO         2      /* combo part on cpu daughter card (menalaeus) */
-#define DDR_DISCRETE      1      /* 2x16 parts on daughter card */
-
-#define DDR_100           100    /* type found on most mem d-boards */
-#define DDR_111           111    /* some combo parts */
-#define DDR_133           133    /* most combo, some mem d-boards */
-#define DDR_165           165    /* future parts */
-
-#define CPU_2420          0x2420
-#define CPU_2422          0x2422 /* 2420 + 64M stacked */
-#define CPU_2423          0x2423 /* 2420 + 96M stacked */
-
-#define CPU_2422_ES1      1
-#define CPU_2422_ES2      2
-#define CPU_2420_ES1      1
-#define CPU_2420_ES2      2
-#define CPU_2420_2422_ES1 1
-
-#define CPU_2420_CHIPID   0x0B5D9000
-#define CPU_24XX_ID_MASK  0x0FFFF000
-#define CPU_242X_REV_MASK 0xF0000000
-#define CPU_242X_PID_MASK 0x000F0000
-
-#define BOARD_H4_MENELAUS 1
-#define BOARD_H4_SDP      2
-
-#define GPMC_MUXED        1
-#define GPMC_NONMUXED     0
-
-#define TYPE_NAND         0x800   /* bit pos for nand in gpmc reg */
-#define TYPE_NOR          0x000
-
-#define WIDTH_8BIT        0x0000
-#define WIDTH_16BIT       0x1000  /* bit pos for 16 bit in gpmc */
-
-#define I2C_MENELAUS 0x72      /* i2c id for companion chip */
-
-#endif
diff --git a/arch/arm/include/asm/arch-omap24xx/sys_proto.h b/arch/arm/include/asm/arch-omap24xx/sys_proto.h
deleted file mode 100644 (file)
index 9d8e5b2..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@ti.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 _OMAP24XX_SYS_PROTO_H_
-#define _OMAP24XX_SYS_PROTO_H_
-
-void prcm_init(void);
-void memif_init(void);
-void sdrc_init(void);
-void do_sdrc_init(u32,u32);
-void gpmc_init(void);
-
-void ether_init(void);
-void watchdog_init(void);
-void set_muxconf_regs(void);
-void peripheral_enable(void);
-
-u32 get_cpu_type(void);
-u32 get_cpu_rev(void);
-u32 get_mem_type(void);
-u32 get_sysboot_value(void);
-u32 get_gpmc0_base(void);
-u32 is_gpmc_muxed(void);
-u32 get_gpmc0_type(void);
-u32 get_gpmc0_width(void);
-u32 wait_on_value(u32 read_bit_mask, u32 match_value, u32 read_addr, u32 bound);
-u32 get_board_type(void);
-void display_board_info(u32);
-void update_mux(u32,u32);
-u32 get_sdr_cs_size(u32 offset);
-
-u32 running_in_sdram(void);
-u32 running_in_sram(void);
-u32 running_in_flash(void);
-u32 running_from_internal_boot(void);
-u32 get_device_type(void);
-#endif
index 2b5e9aeae12f3e6e723ee086f734b71ee1c2bbf6..c57599a9384b4c661b77e650f2ea5792de75a890 100644 (file)
@@ -253,4 +253,11 @@ struct gpio {
 
 #define OMAP3_EMU_HAL_START_HAL_CRITICAL       4
 
+/* ABB settings */
+#define OMAP_ABB_SETTLING_TIME         30
+#define OMAP_ABB_CLOCK_CYCLES          8
+
+/* ABB tranxdone mask */
+#define OMAP_ABB_MPU_TXDONE_MASK       (0x1 << 26)
+
 #endif
similarity index 90%
rename from arch/arm/include/asm/arch-omap4/clocks.h
rename to arch/arm/include/asm/arch-omap4/clock.h
index ed7a1c8be7a3282dcf2e32201e41d032bff4a73a..d14d8fb8afc37619bdf1232154525348fcb5b09f 100644 (file)
  */
 #define LDELAY         1000000
 
-#define CM_CLKMODE_DPLL_CORE           0x4A004120
-#define CM_CLKMODE_DPLL_PER            0x4A008140
-#define CM_CLKMODE_DPLL_MPU            0x4A004160
-#define CM_CLKSEL_CORE                 0x4A004100
-
-/* DPLL register offsets */
-#define CM_CLKMODE_DPLL                0
-#define CM_IDLEST_DPLL         0x4
-#define CM_AUTOIDLE_DPLL       0x8
-#define CM_CLKSEL_DPLL         0xC
-#define CM_DIV_M2_DPLL         0x10
-#define CM_DIV_M3_DPLL         0x14
-#define CM_DIV_M4_DPLL         0x18
-#define CM_DIV_M5_DPLL         0x1C
-#define CM_DIV_M6_DPLL         0x20
-#define CM_DIV_M7_DPLL         0x24
-
-#define DPLL_CLKOUT_DIV_MASK   0x1F /* post-divider mask */
-
 /* CM_DLL_CTRL */
 #define CM_DLL_CTRL_OVERRIDE_SHIFT     0
 #define CM_DLL_CTRL_OVERRIDE_MASK      (1 << 0)
 #define CM_CLKSEL_DCC_EN_SHIFT                 22
 #define CM_CLKSEL_DCC_EN_MASK                  (1 << 22)
 
-#define OMAP4_DPLL_MAX_N       127
-
 /* CM_SYS_CLKSEL */
-#define CM_SYS_CLKSEL_SYS_CLKSEL_MASK  7
+#define CM_SYS_CLKSEL_SYS_CLKSEL_MASK  7
 
 /* CM_CLKSEL_CORE */
 #define CLKSEL_CORE_SHIFT      0
 #define MPU_CLKCTRL_CLKSEL_ABE_DIV_MODE_MASK   (1 << 25)
 
 /* 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_VAL_BYPASS */
 #define PRM_VC_I2C_CHANNEL_FREQ_KHZ    400
 
 #define ALTCLKSRC_MODE_ACTIVE          1
 
-/* Defines for DPLL setup */
-#define DPLL_LOCKED_FREQ_TOLERANCE_0           0
-#define DPLL_LOCKED_FREQ_TOLERANCE_500_KHZ     500
-#define DPLL_LOCKED_FREQ_TOLERANCE_1_MHZ       1000
-
 #define DPLL_NO_LOCK   0
 #define DPLL_LOCK      1
 
+/* Clock Defines */
+#define V_OSCK                 38400000        /* Clock output from T2 */
+#define V_SCLK                   V_OSCK
+
 struct omap4_scrm_regs {
        u32 revision;           /* 0x0000 */
        u32 pad00[63];
index 3a0bfbf0c612a052296756aecceb4af72ac4b956..311c6ff522ced4ad0ad9368e9bb9b1d106dd9d46 100644 (file)
@@ -115,18 +115,6 @@ struct watchdog {
 #define WD_UNLOCK1             0xAAAA
 #define WD_UNLOCK2             0x5555
 
-#define SYSCLKDIV_1            (0x1 << 6)
-#define SYSCLKDIV_2            (0x1 << 7)
-
-#define CLKSEL_GPT1            (0x1 << 0)
-
-#define EN_GPT1                        (0x1 << 0)
-#define EN_32KSYNC             (0x1 << 2)
-
-#define ST_WDT2                        (0x1 << 5)
-
-#define RESETDONE              (0x1 << 0)
-
 #define TCLR_ST                        (0x1 << 0)
 #define TCLR_AR                        (0x1 << 1)
 #define TCLR_PRE               (0x1 << 5)
index ad984da0b40514ae47af10bd50cdd7f38b763a7e..9fd00ff2aa431502eb92608fb3706047063758fe 100644 (file)
 #define DRAM_ADDR_SPACE_START  OMAP44XX_DRAM_ADDR_SPACE_START
 #define DRAM_ADDR_SPACE_END    OMAP44XX_DRAM_ADDR_SPACE_END
 
-/* CONTROL */
-#define CTRL_BASE              (OMAP44XX_L4_CORE_BASE + 0x2000)
-#define CONTROL_PADCONF_CORE   (OMAP44XX_L4_CORE_BASE + 0x100000)
-#define CONTROL_PADCONF_WKUP   (OMAP44XX_L4_CORE_BASE + 0x31E000)
-
-/* LPDDR2 IO regs */
-#define LPDDR2_IO_REGS_BASE    0x4A100638
-
 /* CONTROL_ID_CODE */
 #define CONTROL_ID_CODE                0x4A002204
 
 /* Watchdog Timer2 - MPU watchdog */
 #define WDT2_BASE              (OMAP44XX_L4_WKUP_BASE + 0x14000)
 
-/* 32KTIMER */
-#define SYNC_32KTIMER_BASE     (OMAP44XX_L4_WKUP_BASE + 0x4000)
-
 /* GPMC */
 #define OMAP44XX_GPMC_BASE     0x50000000
 
-/* SYSTEM CONTROL MODULE */
-#define SYSCTRL_GENERAL_CORE_BASE      0x4A002000
-
 /*
  * Hardware Register Details
  */
@@ -141,42 +127,15 @@ struct s32ktimer {
  */
 #define NON_SECURE_SRAM_START  0x40304000
 #define NON_SECURE_SRAM_END    0x4030E000      /* Not inclusive */
+#define SRAM_SCRATCH_SPACE_ADDR        NON_SECURE_SRAM_START
 /* base address for indirect vectors (internal boot mode) */
 #define SRAM_ROM_VECT_BASE     0x4030D000
-/* Temporary SRAM stack used while low level init is done */
-#define SRAM_SCRATCH_SPACE_ADDR                NON_SECURE_SRAM_START
-/* SRAM scratch space entries */
-#define OMAP4_SRAM_SCRATCH_OMAP4_REV   SRAM_SCRATCH_SPACE_ADDR
-#define OMAP4_SRAM_SCRATCH_EMIF_T_NUM  (SRAM_SCRATCH_SPACE_ADDR + 0xC)
-#define OMAP4_SRAM_SCRATCH_EMIF_T_DEN  (SRAM_SCRATCH_SPACE_ADDR + 0x10)
-#define OMAP_SRAM_SCRATCH_PRCM_PTR      (SRAM_SCRATCH_SPACE_ADDR + 0x14)
-#define OMAP_SRAM_SCRATCH_DPLLS_PTR     (SRAM_SCRATCH_SPACE_ADDR + 0x18)
-#define OMAP_SRAM_SCRATCH_VCORES_PTR   (SRAM_SCRATCH_SPACE_ADDR + 0x1C)
-#define OMAP4_SRAM_SCRATCH_SYS_CTRL    (SRAM_SCRATCH_SPACE_ADDR + 0x20)
-#define OMAP4_SRAM_SCRATCH_SPACE_END   (SRAM_SCRATCH_SPACE_ADDR + 0x24)
-
-/* ROM code defines */
-/* Boot device */
-#define BOOT_DEVICE_MASK       0xFF
-#define BOOT_DEVICE_OFFSET     0x8
-#define DEV_DESC_PTR_OFFSET    0x4
-#define DEV_DATA_PTR_OFFSET    0x18
-#define BOOT_MODE_OFFSET       0x8
-#define RESET_REASON_OFFSET    0x9
-#define CH_FLAGS_OFFSET                0xA
-
-#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
-#define CH_FLAGS_CHRAM         (0x1 << 1)
-#define CH_FLAGS_CHFLASH       (0x1 << 2)
-#define CH_FLAGS_CHMMCSD       (0x1 << 3)
 
-#ifndef __ASSEMBLY__
-struct omap_boot_parameters {
-       char *boot_message;
-       unsigned int mem_boot_descriptor;
-       unsigned char omap_bootdevice;
-       unsigned char reset_reason;
-       unsigned char ch_flags;
-};
-#endif
+/* ABB settings */
+#define OMAP_ABB_SETTLING_TIME         50
+#define OMAP_ABB_CLOCK_CYCLES          16
+
+/* ABB tranxdone mask */
+#define OMAP_ABB_MPU_TXDONE_MASK       (0x1 << 7)
+
 #endif
index d5f1868eeed050a858572045df02d647ffefb18f..e4134661484fbc4a9687cfffd95a104d21d3eecb 100644 (file)
 #define _SYS_PROTO_H_
 
 #include <asm/arch/omap.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/io.h>
 #include <asm/omap_common.h>
 #include <asm/arch/mux_omap4.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 struct omap_sysinfo {
        char *board_string;
 };
@@ -52,19 +54,15 @@ void cancel_out(u32 *num, u32 *den, u32 den_limit);
 void sdram_init(void);
 u32 omap_sdram_size(void);
 u32 cortex_rev(void);
+void save_omap_boot_params(void);
 void init_omap_revision(void);
 void do_io_settings(void);
-void omap_vc_init(u16 speed_khz);
+void sri2c_init(void);
+void gpi2c_init(void);
 int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data);
 u32 warm_reset(void);
 void force_emif_self_refresh(void);
-/*
- * This is used to verify if the configuration header
- * was executed by Romcode prior to control of transfer
- * to the bootloader. SPL is responsible for saving and
- * passing this to the u-boot.
- */
-extern struct omap_boot_parameters boot_params;
+void setup_warmreset_time(void);
 
 static inline u32 running_from_sdram(void)
 {
@@ -84,7 +82,7 @@ static inline u8 uboot_loaded_by_spl(void)
         * variable by both SPL and u-boot.Check out for CHSETTINGS, which is a
         * mandatory section if CH is present.
         */
-       if ((boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
+       if ((gd->arch.omap_boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
                return 0;
        else
                return running_from_sdram();
similarity index 70%
rename from arch/arm/include/asm/arch-omap5/clocks.h
rename to arch/arm/include/asm/arch-omap5/clock.h
index cfde3743330368c0368917bdd24973010255fb9e..4d2765d878f0be40215f0d4449bf66d42b819e46 100644 (file)
  */
 #define LDELAY         1000000
 
-#define CM_CLKMODE_DPLL_CORE           (OMAP54XX_L4_CORE_BASE + 0x4120)
-#define CM_CLKMODE_DPLL_PER            (OMAP54XX_L4_CORE_BASE + 0x8140)
-#define CM_CLKMODE_DPLL_MPU            (OMAP54XX_L4_CORE_BASE + 0x4160)
-#define CM_CLKSEL_CORE                 (OMAP54XX_L4_CORE_BASE + 0x4100)
-
-/* DPLL register offsets */
-#define CM_CLKMODE_DPLL                0
-#define CM_IDLEST_DPLL         0x4
-#define CM_AUTOIDLE_DPLL       0x8
-#define CM_CLKSEL_DPLL         0xC
-
-#define DPLL_CLKOUT_DIV_MASK   0x1F /* post-divider mask */
-
 /* CM_DLL_CTRL */
 #define CM_DLL_CTRL_OVERRIDE_SHIFT             0
 #define CM_DLL_CTRL_OVERRIDE_MASK              (1 << 0)
 #define CM_CLKSEL_DCC_EN_SHIFT                 22
 #define CM_CLKSEL_DCC_EN_MASK                  (1 << 22)
 
-#define OMAP4_DPLL_MAX_N       127
-
 /* CM_SYS_CLKSEL */
-#define CM_SYS_CLKSEL_SYS_CLKSEL_MASK  7
+#define CM_SYS_CLKSEL_SYS_CLKSEL_MASK  7
 
 /* CM_CLKSEL_CORE */
 #define CLKSEL_CORE_SHIFT      0
 #define CM_ABE_PLL_REF_CLKSEL_CLKSEL_SYSCLK    0
 #define CM_ABE_PLL_REF_CLKSEL_CLKSEL_32KCLK    1
 
+/* CM_CLKSEL_ABE_PLL_SYS */
+#define CM_CLKSEL_ABE_PLL_SYS_CLKSEL_SHIFT     0
+#define CM_CLKSEL_ABE_PLL_SYS_CLKSEL_MASK      1
+#define CM_ABE_PLL_SYS_CLKSEL_SYSCLK1          0
+#define CM_ABE_PLL_SYS_CLKSEL_SYSCLK2          1
+
 /* CM_BYPCLK_DPLL_IVA */
 #define CM_BYPCLK_DPLL_IVA_CLKSEL_SHIFT                0
 #define CM_BYPCLK_DPLL_IVA_CLKSEL_MASK         3
 #define OPTFCLKEN_SRCOMP_FCLK_SHIFT            8
 #define OPTFCLKEN_SRCOMP_FCLK_MASK             (1 << 8)
 
+/* PRM_RSTTIME */
+#define RSTTIME1_SHIFT                         0
+#define RSTTIME1_MASK                          (0x3ff << 0)
+
 /* 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_VAL_BYPASS */
 #define PRM_VC_I2C_CHANNEL_FREQ_KHZ    400
 #define VDD_MPU_ES2_LOW 880
 #define VDD_MM_ES2_LOW 880
 
+/* TPS659038 Voltage settings in mv for OPP_NOMINAL */
+#define VDD_MPU_DRA752         1090
+#define VDD_EVE_DRA752         1060
+#define VDD_GPU_DRA752         1060
+#define VDD_CORE_DRA752                1030
+#define VDD_IVA_DRA752         1060
+
+/* Efuse register offsets for DRA7xx platform */
+#define DRA752_EFUSE_BASE      0x4A002000
+#define DRA752_EFUSE_REGBITS   16
+/* STD_FUSE_OPP_VMIN_IVA_2 */
+#define STD_FUSE_OPP_VMIN_IVA_NOM      (DRA752_EFUSE_BASE + 0x05CC)
+/* STD_FUSE_OPP_VMIN_IVA_3 */
+#define STD_FUSE_OPP_VMIN_IVA_OD       (DRA752_EFUSE_BASE + 0x05D0)
+/* STD_FUSE_OPP_VMIN_IVA_4 */
+#define STD_FUSE_OPP_VMIN_IVA_HIGH     (DRA752_EFUSE_BASE + 0x05D4)
+/* STD_FUSE_OPP_VMIN_DSPEVE_2 */
+#define STD_FUSE_OPP_VMIN_DSPEVE_NOM   (DRA752_EFUSE_BASE + 0x05E0)
+/* STD_FUSE_OPP_VMIN_DSPEVE_3 */
+#define STD_FUSE_OPP_VMIN_DSPEVE_OD    (DRA752_EFUSE_BASE + 0x05E4)
+/* STD_FUSE_OPP_VMIN_DSPEVE_4 */
+#define STD_FUSE_OPP_VMIN_DSPEVE_HIGH  (DRA752_EFUSE_BASE + 0x05E8)
+/* STD_FUSE_OPP_VMIN_CORE_2 */
+#define STD_FUSE_OPP_VMIN_CORE_NOM     (DRA752_EFUSE_BASE + 0x05F4)
+/* STD_FUSE_OPP_VMIN_GPU_2 */
+#define STD_FUSE_OPP_VMIN_GPU_NOM      (DRA752_EFUSE_BASE + 0x1B08)
+/* STD_FUSE_OPP_VMIN_GPU_3 */
+#define STD_FUSE_OPP_VMIN_GPU_OD       (DRA752_EFUSE_BASE + 0x1B0C)
+/* STD_FUSE_OPP_VMIN_GPU_4 */
+#define STD_FUSE_OPP_VMIN_GPU_HIGH     (DRA752_EFUSE_BASE + 0x1B10)
+/* STD_FUSE_OPP_VMIN_MPU_2 */
+#define STD_FUSE_OPP_VMIN_MPU_NOM      (DRA752_EFUSE_BASE + 0x1B20)
+/* STD_FUSE_OPP_VMIN_MPU_3 */
+#define STD_FUSE_OPP_VMIN_MPU_OD       (DRA752_EFUSE_BASE + 0x1B24)
+/* STD_FUSE_OPP_VMIN_MPU_4 */
+#define STD_FUSE_OPP_VMIN_MPU_HIGH     (DRA752_EFUSE_BASE + 0x1B28)
+
 /* Standard offset is 0.5v expressed in uv */
 #define PALMAS_SMPS_BASE_VOLT_UV 500000
 
+/* TPS659038 */
+#define TPS659038_I2C_SLAVE_ADDR               0x58
+#define TPS659038_REG_ADDR_SMPS12_MPU          0x23
+#define TPS659038_REG_ADDR_SMPS45_EVE          0x2B
+#define TPS659038_REG_ADDR_SMPS6_GPU           0x2F
+#define TPS659038_REG_ADDR_SMPS7_CORE          0x33
+#define TPS659038_REG_ADDR_SMPS8_IVA           0x37
+
 /* TPS */
 #define TPS62361_I2C_SLAVE_ADDR                0x60
 #define TPS62361_REG_ADDR_SET0         0x0
 #define DPLL_NO_LOCK   0
 #define DPLL_LOCK      1
 
+/*
+ * MAX value for PRM_RSTTIME[9:0]RSTTIME1 stored is 0x3ff.
+ * 0x3ff is in the no of FUNC_32K_CLK cycles. Converting cycles
+ * into microsec and passing the value.
+ */
+#define CONFIG_DEFAULT_OMAP_RESET_TIME_MAX_USEC        31219
+
+#ifdef CONFIG_DRA7XX
+#define V_OSCK                 20000000        /* Clock output from T2 */
+#else
+#define V_OSCK                 19200000        /* Clock output from T2 */
+#endif
+
+#define V_SCLK V_OSCK
+
+/* AUXCLKx reg fields */
+#define AUXCLK_ENABLE_MASK             (1 << 8)
+#define AUXCLK_SRCSELECT_SHIFT         1
+#define AUXCLK_SRCSELECT_MASK          (3 << 1)
+#define AUXCLK_CLKDIV_SHIFT            16
+#define AUXCLK_CLKDIV_MASK             (0xF << 16)
+
+#define AUXCLK_SRCSELECT_SYS_CLK       0
+#define AUXCLK_SRCSELECT_CORE_DPLL     1
+#define AUXCLK_SRCSELECT_PER_DPLL      2
+#define AUXCLK_SRCSELECT_ALTERNATE     3
+
 #endif /* _CLOCKS_OMAP5_H_ */
index 5e62013236eb49cfcf39f8e5996ab45b1a7a67dd..4753f4624ec499d1728859a71c7c8e43c26156a2 100644 (file)
@@ -119,18 +119,6 @@ struct watchdog {
 #define WD_UNLOCK1             0xAAAA
 #define WD_UNLOCK2             0x5555
 
-#define SYSCLKDIV_1            (0x1 << 6)
-#define SYSCLKDIV_2            (0x1 << 7)
-
-#define CLKSEL_GPT1            (0x1 << 0)
-
-#define EN_GPT1                        (0x1 << 0)
-#define EN_32KSYNC             (0x1 << 2)
-
-#define ST_WDT2                        (0x1 << 5)
-
-#define RESETDONE              (0x1 << 0)
-
 #define TCLR_ST                        (0x1 << 0)
 #define TCLR_AR                        (0x1 << 1)
 #define TCLR_PRE               (0x1 << 5)
@@ -142,6 +130,8 @@ struct watchdog {
 #define I2C_BASE1              (OMAP54XX_L4_PER_BASE + 0x70000)
 #define I2C_BASE2              (OMAP54XX_L4_PER_BASE + 0x72000)
 #define I2C_BASE3              (OMAP54XX_L4_PER_BASE + 0x60000)
+#define I2C_BASE4              (OMAP54XX_L4_PER_BASE + 0x7A000)
+#define I2C_BASE5              (OMAP54XX_L4_PER_BASE + 0x7C000)
 
 /* MUSB base */
 #define MUSB_BASE              (OMAP54XX_L4_CORE_BASE + 0xAB000)
index 68be03be587808440208c437dcbba8b58a1c5dd3..ec39a5318dd85371f18aeb2be2c65eb743aa5b7a 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef _OMAP5_I2C_H_
 #define _OMAP5_I2C_H_
 
-#define I2C_BUS_MAX    3
+#define I2C_BUS_MAX    5
 #define I2C_DEFAULT_BASE       I2C_BASE1
 
 struct i2c {
index 55e9de6041e173b560c646c54838ce021f5c1757..5f2b0f9f5d0bc024edfb1e7cba0f42f1d27b2969 100644 (file)
 
 #include <asm/types.h>
 
+#define FSC    (1 << 19)
+#define SSC    (0 << 19)
+
 #define IEN    (1 << 18)
 #define IDIS   (0 << 18)
 
-#define PTU    (3 << 16)
-#define PTD    (1 << 16)
+#define PTU    (1 << 17)
+#define PTD    (0 << 17)
 #define PEN    (1 << 16)
 #define PDIS   (0 << 16)
 
index 887fcaa5ff4041dbe7dda103e9d3c35825175aff..5e6d82e51f106e5362667a7e25125d3dd89df944 100644 (file)
 #define DRAM_ADDR_SPACE_START  OMAP54XX_DRAM_ADDR_SPACE_START
 #define DRAM_ADDR_SPACE_END    OMAP54XX_DRAM_ADDR_SPACE_END
 
-/* CONTROL */
-#define CTRL_BASE              (OMAP54XX_L4_CORE_BASE + 0x2000)
-#define CONTROL_PADCONF_CORE   (CTRL_BASE + 0x0800)
-#define CONTROL_PADCONF_WKUP   (OMAP54XX_L4_WKUP_BASE + 0xc800)
-
-/* LPDDR2 IO regs. To be verified */
-#define LPDDR2_IO_REGS_BASE    0x4A100638
-
-/* CONTROL_ID_CODE */
-#define CONTROL_ID_CODE                (CTRL_BASE + 0x204)
+/* CONTROL ID CODE */
+#define CONTROL_CORE_ID_CODE   0x4A002204
+#define CONTROL_WKUP_ID_CODE   0x4AE0C204
+
+#ifdef CONFIG_DRA7XX
+#define CONTROL_ID_CODE                CONTROL_WKUP_ID_CODE
+#else
+#define CONTROL_ID_CODE                CONTROL_CORE_ID_CODE
+#endif
 
 /* To be verified */
 #define OMAP5430_CONTROL_ID_CODE_ES1_0         0x0B94202F
 #define OMAP5432_CONTROL_ID_CODE_ES2_0          0x1B99802F
 #define DRA752_CONTROL_ID_CODE_ES1_0           0x0B99002F
 
-/* STD_FUSE_PROD_ID_1 */
-#define STD_FUSE_PROD_ID_1             (CTRL_BASE + 0x218)
-#define PROD_ID_1_SILICON_TYPE_SHIFT   16
-#define PROD_ID_1_SILICON_TYPE_MASK    (3 << 16)
-
 /* UART */
 #define UART1_BASE             (OMAP54XX_L4_PER_BASE + 0x6a000)
 #define UART2_BASE             (OMAP54XX_L4_PER_BASE + 0x6c000)
 /* Watchdog Timer2 - MPU watchdog */
 #define WDT2_BASE              (OMAP54XX_L4_WKUP_BASE + 0x14000)
 
-/* 32KTIMER */
-#define SYNC_32KTIMER_BASE     (OMAP54XX_L4_WKUP_BASE + 0x4000)
-
 /* GPMC */
 #define OMAP54XX_GPMC_BASE     0x50000000
 
-/* SYSTEM CONTROL MODULE */
-#define SYSCTRL_GENERAL_CORE_BASE      0x4A002000
-
 /*
  * Hardware Register Details
  */
 /* CONTROL_EFUSE_2 */
 #define CONTROL_EFUSE_2_NMOS_PMOS_PTV_CODE_1           0x00ffc000
 
+#define SDCARD_BIAS_PWRDNZ                             (1 << 27)
 #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__
@@ -181,54 +169,18 @@ struct s32ktimer {
 #define EFUSE_4 0x45145100
 #endif /* __ASSEMBLY__ */
 
-/*
- * Non-secure SRAM Addresses
- * 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
- */
+#ifdef CONFIG_DRA7XX
+#define NON_SECURE_SRAM_START  0x40300000
+#define NON_SECURE_SRAM_END    0x40380000      /* Not inclusive */
+#else
 #define NON_SECURE_SRAM_START  0x40300000
 #define NON_SECURE_SRAM_END    0x40320000      /* Not inclusive */
+#endif
+#define SRAM_SCRATCH_SPACE_ADDR        NON_SECURE_SRAM_START
+
 /* base address for indirect vectors (internal boot mode) */
 #define SRAM_ROM_VECT_BASE     0x4031F000
 
-#define SRAM_SCRATCH_SPACE_ADDR                NON_SECURE_SRAM_START
-/*
- * SRAM scratch space entries
- */
-#define OMAP5_SRAM_SCRATCH_OMAP5_REV   SRAM_SCRATCH_SPACE_ADDR
-#define OMAP5_SRAM_SCRATCH_EMIF_T_NUM  (SRAM_SCRATCH_SPACE_ADDR + 0xC)
-#define OMAP5_SRAM_SCRATCH_EMIF_T_DEN  (SRAM_SCRATCH_SPACE_ADDR + 0x10)
-#define OMAP_SRAM_SCRATCH_PRCM_PTR      (SRAM_SCRATCH_SPACE_ADDR + 0x14)
-#define OMAP_SRAM_SCRATCH_DPLLS_PTR     (SRAM_SCRATCH_SPACE_ADDR + 0x18)
-#define OMAP_SRAM_SCRATCH_VCORES_PTR    (SRAM_SCRATCH_SPACE_ADDR + 0x1C)
-#define OMAP5_SRAM_SCRATCH_SYS_CTRL    (SRAM_SCRATCH_SPACE_ADDR + 0x20)
-#define OMAP5_SRAM_SCRATCH_SPACE_END   (SRAM_SCRATCH_SPACE_ADDR + 0x24)
-
-/* Silicon revisions */
-#define OMAP4430_SILICON_ID_INVALID    0xFFFFFFFF
-#define OMAP4430_ES1_0 0x44300100
-#define OMAP4430_ES2_0 0x44300200
-#define OMAP4430_ES2_1 0x44300210
-#define OMAP4430_ES2_2 0x44300220
-#define OMAP4430_ES2_3 0x44300230
-#define OMAP4460_ES1_0 0x44600100
-#define OMAP4460_ES1_1 0x44600110
-
-/* ROM code defines */
-/* Boot device */
-#define BOOT_DEVICE_MASK       0xFF
-#define BOOT_DEVICE_OFFSET     0x8
-#define DEV_DESC_PTR_OFFSET    0x4
-#define DEV_DATA_PTR_OFFSET    0x18
-#define BOOT_MODE_OFFSET       0x8
-#define RESET_REASON_OFFSET     0x9
-#define CH_FLAGS_OFFSET         0xA
-
-#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
-#define        CH_FLAGS_CHRAM          (0x1 << 1)
-#define CH_FLAGS_CHFLASH       (0x1 << 2)
-#define CH_FLAGS_CHMMCSD       (0x1 << 3)
-
 /* CONTROL_SRCOMP_XXX_SIDE */
 #define OVERRIDE_XS_SHIFT              30
 #define OVERRIDE_XS_MASK               (1 << 30)
@@ -243,20 +195,25 @@ struct s32ktimer {
 #define SRCODE_OVERRIDE_SEL_XS_SHIFT   0
 #define SRCODE_OVERRIDE_SEL_XS_MASK    (1 << 0)
 
+/* ABB settings */
+#define OMAP_ABB_SETTLING_TIME         50
+#define OMAP_ABB_CLOCK_CYCLES          16
+
+/* ABB tranxdone mask */
+#define OMAP_ABB_MPU_TXDONE_MASK               (0x1 << 7)
+
+/* ABB efuse masks */
+#define OMAP5_ABB_FUSE_VSET_MASK               (0x1F << 24)
+#define OMAP5_ABB_FUSE_ENABLE_MASK             (0x1 << 29)
+#define OMAP5_ABB_LDOVBBMPU_MUX_CTRL_MASK      (0x1 << 10)
+#define OMAP5_ABB_LDOVBBMPU_VSET_OUT_MASK      (0x1f << 0)
+
 #ifndef __ASSEMBLY__
 struct srcomp_params {
        s8 divide_factor;
        s8 multiply_factor;
 };
 
-struct omap_boot_parameters {
-       char *boot_message;
-       unsigned int mem_boot_descriptor;
-       unsigned char omap_bootdevice;
-       unsigned char reset_reason;
-       unsigned char ch_flags;
-};
-
 struct ctrl_ioregs {
        u32 ctrl_ddrch;
        u32 ctrl_lpddr2ch;
@@ -265,6 +222,7 @@ struct ctrl_ioregs {
        u32 ctrl_ddrio_1;
        u32 ctrl_ddrio_2;
        u32 ctrl_emif_sdram_config_ext;
+       u32 ctrl_ddr_ctrl_ext_0;
 };
 #endif /* __ASSEMBLY__ */
 #endif
index e66ab44341ddcc3a4631944367d560652dfd713f..0bb59d869b5f92dd76e743f66e1eefe13d95f801 100644 (file)
 
 #include <asm/arch/omap.h>
 #include <asm/io.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/omap_common.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
+
+DECLARE_GLOBAL_DATA_PTR;
 
 struct pad_conf_entry {
        u32 offset;
@@ -56,22 +58,17 @@ void cancel_out(u32 *num, u32 *den, u32 den_limit);
 void sdram_init(void);
 u32 omap_sdram_size(void);
 u32 cortex_rev(void);
+void save_omap_boot_params(void);
 void init_omap_revision(void);
 void do_io_settings(void);
-void omap_vc_init(u16 speed_khz);
+void sri2c_init(void);
+void gpi2c_init(void);
 int omap_vc_bypass_send_value(u8 sa, u8 reg_addr, u8 reg_data);
 u32 warm_reset(void);
 void force_emif_self_refresh(void);
 void get_ioregs(const struct ctrl_ioregs **regs);
 void srcomp_enable(void);
-
-/*
- * This is used to verify if the configuration header
- * was executed by Romcode prior to control of transfer
- * to the bootloader. SPL is responsible for saving and
- * passing this to the u-boot.
- */
-extern struct omap_boot_parameters boot_params;
+void setup_warmreset_time(void);
 
 static inline u32 running_from_sdram(void)
 {
@@ -91,7 +88,7 @@ static inline u8 uboot_loaded_by_spl(void)
         * variable by both SPL and u-boot.Check out for CHSETTINGS, which is a
         * mandatory section if CH is present.
         */
-       if ((boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
+       if ((gd->arch.omap_boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
                return 0;
        else
                return running_from_sdram();
@@ -122,4 +119,13 @@ static inline u32 omap_hw_init_context(void)
 #endif
 }
 
+static inline u32 div_round_up(u32 num, u32 den)
+{
+       return (num + den - 1)/den;
+}
+
+static inline u32 usec_to_32k(u32 usec)
+{
+       return div_round_up(32768 * usec, 1000000);
+}
 #endif
index 44b800f681638f5f3d6fd090ae55b88a31f25a7d..2397bcef0dee4d87bc809603ef91e4f4ecbdf89f 100644 (file)
 #define GPIO_FALLING_EDGE      1
 #define GPIO_RISING_EDGE       2
 #define GPIO_BOTH_EDGES                3
-extern void set_GPIO_IRQ_edge( int gpio_nr, int edge_mask );
-
-/*
- * Handy routine to set GPIO alternate functions
- */
-extern void set_GPIO_mode( int gpio_mode );
-
-/*
- * return current lclk frequency in units of 10kHz
- */
-extern unsigned int get_lclk_frequency_10khz(void);
 
 #endif
 
index 3e642e92f863936f3ee01b478a9eac2436990fa0..5fe4838d9beaefe88bc984aa8ee66ceb7c4d2602 100644 (file)
@@ -72,6 +72,7 @@ struct timerus {
 
 /* These are the available SKUs (product types) for Tegra */
 enum {
+       SKU_ID_T20_7            = 0x7,
        SKU_ID_T20              = 0x8,
        SKU_ID_T25SE            = 0x14,
        SKU_ID_AP25             = 0x17,
@@ -81,6 +82,7 @@ enum {
        SKU_ID_T33              = 0x80,
        SKU_ID_T30              = 0x81, /* Cardhu value */
        SKU_ID_T114_ENG         = 0x00, /* Dalmore value, unfused */
+       SKU_ID_T114_1           = 0x01,
 };
 
 /*
similarity index 63%
rename from arch/arm/include/asm/arch-mx25/sys_proto.h
rename to arch/arm/include/asm/arch-vf610/clock.h
index 46db341e8a330e7a9a218e7ee12e2ba4db54f624..04e418cf843b22c3ea6b74858ed4c0bd7bbbd897 100644 (file)
@@ -1,9 +1,5 @@
 /*
- * (C) Copyright 2009
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
+ * Copyright 2013 Freescale Semiconductor, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * MA 02111-1307 USA
  */
 
-#ifndef _SYS_PROTO_H_
-#define _SYS_PROTO_H_
+#ifndef __ASM_ARCH_CLOCK_H
+#define __ASM_ARCH_CLOCK_H
+
+#include <common.h>
+
+enum mxc_clock {
+       MXC_ARM_CLK = 0,
+       MXC_BUS_CLK,
+       MXC_IPG_CLK,
+       MXC_UART_CLK,
+       MXC_ESDHC_CLK,
+       MXC_FEC_CLK,
+};
+
+void enable_ocotp_clk(unsigned char enable);
+unsigned int mxc_get_clock(enum mxc_clock clk);
 
-void mx25_uart1_init_pins(void);
-#if defined CONFIG_FEC_MXC
-extern void mx25_fec_init_pins(void);
-#endif
+#define imx_get_fecclk() mxc_get_clock(MXC_FEC_CLK)
 
-#endif
+#endif /* __ASM_ARCH_CLOCK_H */
diff --git a/arch/arm/include/asm/arch-vf610/crm_regs.h b/arch/arm/include/asm/arch-vf610/crm_regs.h
new file mode 100644 (file)
index 0000000..e3f703d
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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_VF610_CCM_REGS_H__
+#define __ARCH_ARM_MACH_VF610_CCM_REGS_H__
+
+#ifndef __ASSEMBLY__
+
+/* Clock Controller Module (CCM) */
+struct ccm_reg {
+       u32 ccr;
+       u32 csr;
+       u32 ccsr;
+       u32 cacrr;
+       u32 cscmr1;
+       u32 cscdr1;
+       u32 cscdr2;
+       u32 cscdr3;
+       u32 cscmr2;
+       u32 cscdr4;
+       u32 ctor;
+       u32 clpcr;
+       u32 cisr;
+       u32 cimr;
+       u32 ccosr;
+       u32 cgpr;
+       u32 ccgr0;
+       u32 ccgr1;
+       u32 ccgr2;
+       u32 ccgr3;
+       u32 ccgr4;
+       u32 ccgr5;
+       u32 ccgr6;
+       u32 ccgr7;
+       u32 ccgr8;
+       u32 ccgr9;
+       u32 ccgr10;
+       u32 ccgr11;
+       u32 cmeor0;
+       u32 cmeor1;
+       u32 cmeor2;
+       u32 cmeor3;
+       u32 cmeor4;
+       u32 cmeor5;
+       u32 cppdsr;
+       u32 ccowr;
+       u32 ccpgr0;
+       u32 ccpgr1;
+       u32 ccpgr2;
+       u32 ccpgr3;
+};
+
+/* Analog components control digital interface (ANADIG) */
+struct anadig_reg {
+       u32 pll3_ctrl;
+       u32 resv0[3];
+       u32 pll7_ctrl;
+       u32 resv1[3];
+       u32 pll2_ctrl;
+       u32 resv2[3];
+       u32 pll2_ss;
+       u32 resv3[3];
+       u32 pll2_num;
+       u32 resv4[3];
+       u32 pll2_denom;
+       u32 resv5[3];
+       u32 pll4_ctrl;
+       u32 resv6[3];
+       u32 pll4_num;
+       u32 resv7[3];
+       u32 pll4_denom;
+       u32 pll6_ctrl;
+       u32 resv8[3];
+       u32 pll6_num;
+       u32 resv9[3];
+       u32 pll6_denom;
+       u32 resv10[3];
+       u32 pll5_ctrl;
+       u32 resv11[3];
+       u32 pll3_pfd;
+       u32 resv12[3];
+       u32 pll2_pfd;
+       u32 resv13[3];
+       u32 reg_1p1;
+       u32 resv14[3];
+       u32 reg_3p0;
+       u32 resv15[3];
+       u32 reg_2p5;
+       u32 resv16[7];
+       u32 ana_misc0;
+       u32 resv17[3];
+       u32 ana_misc1;
+       u32 resv18[63];
+       u32 anadig_digprog;
+       u32 resv19[3];
+       u32 pll1_ctrl;
+       u32 resv20[3];
+       u32 pll1_ss;
+       u32 resv21[3];
+       u32 pll1_num;
+       u32 resv22[3];
+       u32 pll1_denom;
+       u32 resv23[3];
+       u32 pll1_pdf;
+       u32 resv24[3];
+       u32 pll_lock;
+};
+#endif
+
+#define CCM_CCR_FIRC_EN                                (1 << 16)
+#define CCM_CCR_OSCNT_MASK                     0xff
+#define CCM_CCR_OSCNT(v)                       ((v) & 0xff)
+
+#define CCM_CCSR_PLL2_PFD_CLK_SEL_OFFSET       19
+#define CCM_CCSR_PLL2_PFD_CLK_SEL_MASK         (0x7 << 19)
+#define CCM_CCSR_PLL2_PFD_CLK_SEL(v)           (((v) & 0x7) << 19)
+
+#define CCM_CCSR_PLL1_PFD_CLK_SEL_OFFSET       16
+#define CCM_CCSR_PLL1_PFD_CLK_SEL_MASK         (0x7 << 16)
+#define CCM_CCSR_PLL1_PFD_CLK_SEL(v)           (((v) & 0x7) << 16)
+
+#define CCM_CCSR_PLL2_PFD4_EN                  (1 << 15)
+#define CCM_CCSR_PLL2_PFD3_EN                  (1 << 14)
+#define CCM_CCSR_PLL2_PFD2_EN                  (1 << 13)
+#define CCM_CCSR_PLL2_PFD1_EN                  (1 << 12)
+#define CCM_CCSR_PLL1_PFD4_EN                  (1 << 11)
+#define CCM_CCSR_PLL1_PFD3_EN                  (1 << 10)
+#define CCM_CCSR_PLL1_PFD2_EN                  (1 << 9)
+#define CCM_CCSR_PLL1_PFD1_EN                  (1 << 8)
+
+#define CCM_CCSR_DDRC_CLK_SEL(v)               ((v) << 6)
+#define CCM_CCSR_FAST_CLK_SEL(v)               ((v) << 5)
+
+#define CCM_CCSR_SYS_CLK_SEL_OFFSET            0
+#define CCM_CCSR_SYS_CLK_SEL_MASK              0x7
+#define CCM_CCSR_SYS_CLK_SEL(v)                        ((v) & 0x7)
+
+#define CCM_CACRR_IPG_CLK_DIV_OFFSET           11
+#define CCM_CACRR_IPG_CLK_DIV_MASK             (0x3 << 11)
+#define CCM_CACRR_IPG_CLK_DIV(v)               (((v) & 0x3) << 11)
+#define CCM_CACRR_BUS_CLK_DIV_OFFSET           3
+#define CCM_CACRR_BUS_CLK_DIV_MASK             (0x7 << 3)
+#define CCM_CACRR_BUS_CLK_DIV(v)               (((v) & 0x7) << 3)
+#define CCM_CACRR_ARM_CLK_DIV_OFFSET           0
+#define CCM_CACRR_ARM_CLK_DIV_MASK             0x7
+#define CCM_CACRR_ARM_CLK_DIV(v)               ((v) & 0x7)
+
+#define CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET       18
+#define CCM_CSCMR1_ESDHC1_CLK_SEL_MASK         (0x3 << 18)
+#define CCM_CSCMR1_ESDHC1_CLK_SEL(v)           (((v) & 0x3) << 18)
+
+#define CCM_CSCDR1_RMII_CLK_EN                 (1 << 24)
+
+#define CCM_CSCDR2_ESDHC1_EN                   (1 << 29)
+#define CCM_CSCDR2_ESDHC1_CLK_DIV_OFFSET       20
+#define CCM_CSCDR2_ESDHC1_CLK_DIV_MASK         (0xf << 20)
+#define CCM_CSCDR2_ESDHC1_CLK_DIV(v)           (((v) & 0xf) << 20)
+
+#define CCM_CSCMR2_RMII_CLK_SEL_OFFSET         4
+#define CCM_CSCMR2_RMII_CLK_SEL_MASK           (0x3 << 4)
+#define CCM_CSCMR2_RMII_CLK_SEL(v)             (((v) & 0x3) << 4)
+
+#define CCM_REG_CTRL_MASK                      0xffffffff
+#define CCM_CCGR0_UART1_CTRL_MASK              (0x3 << 16)
+#define CCM_CCGR1_PIT_CTRL_MASK                        (0x3 << 14)
+#define CCM_CCGR1_WDOGA5_CTRL_MASK             (0x3 << 28)
+#define CCM_CCGR2_IOMUXC_CTRL_MASK             (0x3 << 16)
+#define CCM_CCGR2_PORTA_CTRL_MASK              (0x3 << 18)
+#define CCM_CCGR2_PORTB_CTRL_MASK              (0x3 << 20)
+#define CCM_CCGR2_PORTC_CTRL_MASK              (0x3 << 22)
+#define CCM_CCGR2_PORTD_CTRL_MASK              (0x3 << 24)
+#define CCM_CCGR2_PORTE_CTRL_MASK              (0x3 << 26)
+#define CCM_CCGR3_ANADIG_CTRL_MASK             0x3
+#define CCM_CCGR4_WKUP_CTRL_MASK               (0x3 << 20)
+#define CCM_CCGR4_CCM_CTRL_MASK                        (0x3 << 22)
+#define CCM_CCGR4_GPC_CTRL_MASK                        (0x3 << 24)
+#define CCM_CCGR6_OCOTP_CTRL_MASK              (0x3 << 10)
+#define CCM_CCGR6_DDRMC_CTRL_MASK              (0x3 << 28)
+#define CCM_CCGR7_SDHC1_CTRL_MASK              (0x3 << 4)
+#define CCM_CCGR9_FEC0_CTRL_MASK               0x3
+#define CCM_CCGR9_FEC1_CTRL_MASK               (0x3 << 2)
+
+#define ANADIG_PLL2_CTRL_ENABLE                        (1 << 13)
+#define ANADIG_PLL2_CTRL_POWERDOWN             (1 << 12)
+#define ANADIG_PLL2_CTRL_DIV_SELECT            1
+#define ANADIG_PLL1_CTRL_ENABLE                        (1 << 13)
+#define ANADIG_PLL1_CTRL_POWERDOWN             (1 << 12)
+#define ANADIG_PLL1_CTRL_DIV_SELECT            1
+
+#define FASE_CLK_FREQ          24000000
+#define SLOW_CLK_FREQ          32000
+#define PLL1_PFD1_FREQ         500000000
+#define PLL1_PFD2_FREQ         452000000
+#define PLL1_PFD3_FREQ         396000000
+#define PLL1_PFD4_FREQ         528000000
+#define PLL1_MAIN_FREQ         528000000
+#define PLL2_PFD1_FREQ         500000000
+#define PLL2_PFD2_FREQ         396000000
+#define PLL2_PFD3_FREQ         339000000
+#define PLL2_PFD4_FREQ         413000000
+#define PLL2_MAIN_FREQ         528000000
+#define PLL3_MAIN_FREQ         480000000
+#define PLL3_PFD3_FREQ         298000000
+#define PLL5_MAIN_FREQ         500000000
+
+#define ENET_EXTERNAL_CLK      50000000
+#define AUDIO_EXTERNAL_CLK     24576000
+
+#endif /*__ARCH_ARM_MACH_VF610_CCM_REGS_H__ */
diff --git a/arch/arm/include/asm/arch-vf610/imx-regs.h b/arch/arm/include/asm/arch-vf610/imx-regs.h
new file mode 100644 (file)
index 0000000..c9df32a
--- /dev/null
@@ -0,0 +1,419 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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_ARCH_IMX_REGS_H__
+#define __ASM_ARCH_IMX_REGS_H__
+
+#define ARCH_MXC
+
+#define IRAM_BASE_ADDR         0x3F000000      /* internal ram */
+#define IRAM_SIZE              0x00080000      /* 512 KB */
+
+#define AIPS0_BASE_ADDR                0x40000000
+#define AIPS1_BASE_ADDR                0x40080000
+
+/* AIPS 0 */
+#define MSCM_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00001000)
+#define MSCM_IR_BASE_ADDR      (AIPS0_BASE_ADDR + 0x00001800)
+#define CA5SCU_BASE_ADDR       (AIPS0_BASE_ADDR + 0x00002000)
+#define CA5_INTD_BASE_ADDR     (AIPS0_BASE_ADDR + 0x00003000)
+#define CA5_L2C_BASE_ADDR      (AIPS0_BASE_ADDR + 0x00006000)
+#define NIC0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00008000)
+#define NIC1_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00009000)
+#define NIC2_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000A000)
+#define NIC3_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000B000)
+#define NIC4_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000C000)
+#define NIC5_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000D000)
+#define NIC6_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000E000)
+#define NIC7_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0000F000)
+#define AHBTZASC_BASE_ADDR     (AIPS0_BASE_ADDR + 0x00010000)
+#define TZASC_SYS0_BASE_ADDR   (AIPS0_BASE_ADDR + 0x00011000)
+#define TZASC_SYS1_BASE_ADDR   (AIPS0_BASE_ADDR + 0x00012000)
+#define TZASC_GFX_BASE_ADDR    (AIPS0_BASE_ADDR + 0x00013000)
+#define TZASC_DDR0_BASE_ADDR   (AIPS0_BASE_ADDR + 0x00014000)
+#define TZASC_DDR1_BASE_ADDR   (AIPS0_BASE_ADDR + 0x00015000)
+#define CSU_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00017000)
+#define DMA0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00018000)
+#define DMA0_TCD_BASE_ADDR     (AIPS0_BASE_ADDR + 0x00019000)
+#define SEMA4_BASE_ADDR                (AIPS0_BASE_ADDR + 0x0001D000)
+#define FB_BASE_ADDR           (AIPS0_BASE_ADDR + 0x0001E000)
+#define DMA_MUX0_BASE_ADDR     (AIPS0_BASE_ADDR + 0x00024000)
+#define UART0_BASE             (AIPS0_BASE_ADDR + 0x00027000)
+#define UART1_BASE             (AIPS0_BASE_ADDR + 0x00028000)
+#define UART2_BASE             (AIPS0_BASE_ADDR + 0x00029000)
+#define UART3_BASE             (AIPS0_BASE_ADDR + 0x0002A000)
+#define SPI0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0002C000)
+#define SPI1_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0002D000)
+#define SAI0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0002F000)
+#define SAI1_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00030000)
+#define SAI2_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00031000)
+#define SAI3_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00032000)
+#define CRC_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00033000)
+#define PDB_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00036000)
+#define PIT_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00037000)
+#define FTM0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00038000)
+#define FTM1_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00039000)
+#define ADC_BASE_ADDR          (AIPS0_BASE_ADDR + 0x0003B000)
+#define TCON0_BASE_ADDR                (AIPS0_BASE_ADDR + 0x0003D000)
+#define WDOG1_BASE_ADDR                (AIPS0_BASE_ADDR + 0x0003E000)
+#define LPTMR_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00040000)
+#define RLE_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00042000)
+#define MLB_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00043000)
+#define QSPI0_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00044000)
+#define IOMUXC_BASE_ADDR       (AIPS0_BASE_ADDR + 0x00048000)
+#define ANADIG_BASE_ADDR       (AIPS0_BASE_ADDR + 0x00050000)
+#define SCSCM_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00052000)
+#define ASRC_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00060000)
+#define SPDIF_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00061000)
+#define ESAI_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00062000)
+#define ESAI_FIFO_BASE_ADDR    (AIPS0_BASE_ADDR + 0x00063000)
+#define WDOG_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00065000)
+#define I2C0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00066000)
+#define WKUP_BASE_ADDR         (AIPS0_BASE_ADDR + 0x0006A000)
+#define CCM_BASE_ADDR          (AIPS0_BASE_ADDR + 0x0006B000)
+#define GPC_BASE_ADDR          (AIPS0_BASE_ADDR + 0x0006C000)
+#define VREG_DIG_BASE_ADDR     (AIPS0_BASE_ADDR + 0x0006D000)
+#define SRC_BASE_ADDR          (AIPS0_BASE_ADDR + 0x0006E000)
+#define CMU_BASE_ADDR          (AIPS0_BASE_ADDR + 0x0006F000)
+
+/* AIPS 1 */
+#define OCOTP_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00025000)
+#define DDR_BASE_ADDR          (AIPS1_BASE_ADDR + 0x0002E000)
+#define ESDHC0_BASE_ADDR       (AIPS1_BASE_ADDR + 0x00031000)
+#define ESDHC1_BASE_ADDR       (AIPS1_BASE_ADDR + 0x00032000)
+#define ENET_BASE_ADDR         (AIPS1_BASE_ADDR + 0x00050000)
+
+/* MUX mode and PAD ctrl are in one register */
+#define CONFIG_IOMUX_SHARE_CONF_REG
+
+#define FEC_QUIRK_ENET_MAC
+
+/* MSCM interrupt rounter */
+#define MSCM_IRSPRC_CP0_EN                             1
+#define MSCM_IRSPRC_NUM                                        112
+
+/* DDRMC */
+#define DDRMC_PHY_DQ_TIMING                            0x00002613
+#define DDRMC_PHY_DQS_TIMING                           0x00002615
+#define DDRMC_PHY_CTRL                                 0x01210080
+#define DDRMC_PHY_MASTER_CTRL                          0x0001012a
+#define DDRMC_PHY_SLAVE_CTRL                           0x00012020
+
+#define DDRMC_PHY50_DDR3_MODE                          (1 << 12)
+#define DDRMC_PHY50_EN_SW_HALF_CYCLE                   (1 << 8)
+
+#define DDRMC_CR00_DRAM_CLASS_DDR3                     (0x6 << 8)
+#define DDRMC_CR00_DRAM_CLASS_LPDDR2                   (0x5 << 8)
+#define DDRMC_CR00_START                               1
+#define DDRMC_CR02_DRAM_TINIT(v)                       ((v) & 0xffffff)
+#define DDRMC_CR10_TRST_PWRON(v)                       (v)
+#define DDRMC_CR11_CKE_INACTIVE(v)                     (v)
+#define DDRMC_CR12_WRLAT(v)                            (((v) & 0x1f) << 8)
+#define DDRMC_CR12_CASLAT_LIN(v)                       ((v) & 0x3f)
+#define DDRMC_CR13_TRC(v)                              (((v) & 0xff) << 24)
+#define DDRMC_CR13_TRRD(v)                             (((v) & 0xff) << 16)
+#define DDRMC_CR13_TCCD(v)                             (((v) & 0x1f) << 8)
+#define DDRMC_CR13_TBST_INT_INTERVAL(v)                        ((v) & 0x7)
+#define DDRMC_CR14_TFAW(v)                             (((v) & 0x3f) << 24)
+#define DDRMC_CR14_TRP(v)                              (((v) & 0x1f) << 16)
+#define DDRMC_CR14_TWTR(v)                             (((v) & 0xf) << 8)
+#define DDRMC_CR14_TRAS_MIN(v)                         ((v) & 0xff)
+#define DDRMC_CR16_TMRD(v)                             (((v) & 0x1f) << 24)
+#define DDRMC_CR16_TRTP(v)                             (((v) & 0xf) << 16)
+#define DDRMC_CR17_TRAS_MAX(v)                         (((v) & 0x1ffff) << 8)
+#define DDRMC_CR17_TMOD(v)                             ((v) & 0xff)
+#define DDRMC_CR18_TCKESR(v)                           (((v) & 0x1f) << 8)
+#define DDRMC_CR18_TCKE(v)                             ((v) & 0x7)
+#define DDRMC_CR20_AP_EN                               (1 << 24)
+#define DDRMC_CR21_TRCD_INT(v)                         (((v) & 0xff) << 16)
+#define DDRMC_CR21_TRAS_LOCKOUT                                (1 << 8)
+#define DDRMC_CR21_CCMAP_EN                            1
+#define DDRMC_CR22_TDAL(v)                             (((v) & 0x3f) << 16)
+#define DDRMC_CR23_BSTLEN(v)                           (((v) & 0x7) << 24)
+#define DDRMC_CR23_TDLL(v)                             ((v) & 0xff)
+#define DDRMC_CR24_TRP_AB(v)                           ((v) & 0x1f)
+#define DDRMC_CR25_TREF_EN                             (1 << 16)
+#define DDRMC_CR26_TREF(v)                             (((v) & 0xffff) << 16)
+#define DDRMC_CR26_TRFC(v)                             ((v) & 0x3ff)
+#define DDRMC_CR28_TREF_INT(v)                         ((v) & 0xffff)
+#define DDRMC_CR29_TPDEX(v)                            ((v) & 0xffff)
+#define DDRMC_CR30_TXPDLL(v)                           ((v) & 0xffff)
+#define DDRMC_CR31_TXSNR(v)                            (((v) & 0xffff) << 16)
+#define DDRMC_CR31_TXSR(v)                             ((v) & 0xffff)
+#define DDRMC_CR33_EN_QK_SREF                          (1 << 16)
+#define DDRMC_CR34_CKSRX(v)                            (((v) & 0xf) << 16)
+#define DDRMC_CR34_CKSRE(v)                            (((v) & 0xf) << 8)
+#define DDRMC_CR38_FREQ_CHG_EN                         (1 << 8)
+#define DDRMC_CR39_PHY_INI_COM(v)                      (((v) & 0xffff) << 16)
+#define DDRMC_CR39_PHY_INI_STA(v)                      (((v) & 0xff) << 8)
+#define DDRMC_CR39_FRQ_CH_DLLOFF(v)                    ((v) & 0x3)
+#define DDRMC_CR41_PHY_INI_STRT_INI_DIS                        1
+#define DDRMC_CR48_MR1_DA_0(v)                         (((v) & 0xffff) << 16)
+#define DDRMC_CR48_MR0_DA_0(v)                         ((v) & 0xffff)
+#define DDRMC_CR66_ZQCL(v)                             (((v) & 0xfff) << 16)
+#define DDRMC_CR66_ZQINIT(v)                           ((v) & 0xfff)
+#define DDRMC_CR67_ZQCS(v)                             ((v) & 0xfff)
+#define DDRMC_CR69_ZQ_ON_SREF_EX(v)                    (((v) & 0xf) << 8)
+#define DDRMC_CR70_REF_PER_ZQ(v)                       (v)
+#define DDRMC_CR72_ZQCS_ROTATE                         (1 << 24)
+#define DDRMC_CR73_APREBIT(v)                          (((v) & 0xf) << 24)
+#define DDRMC_CR73_COL_DIFF(v)                         (((v) & 0x7) << 16)
+#define DDRMC_CR73_ROW_DIFF(v)                         (((v) & 0x3) << 8)
+#define DDRMC_CR74_BANKSPLT_EN                         (1 << 24)
+#define DDRMC_CR74_ADDR_CMP_EN                         (1 << 16)
+#define DDRMC_CR74_CMD_AGE_CNT(v)                      (((v) & 0xff) << 8)
+#define DDRMC_CR74_AGE_CNT(v)                          ((v) & 0xff)
+#define DDRMC_CR75_RW_PG_EN                            (1 << 24)
+#define DDRMC_CR75_RW_EN                               (1 << 16)
+#define DDRMC_CR75_PRI_EN                              (1 << 8)
+#define DDRMC_CR75_PLEN                                        1
+#define DDRMC_CR76_NQENT_ACTDIS(v)                     (((v) & 0x7) << 24)
+#define DDRMC_CR76_D_RW_G_BKCN(v)                      (((v) & 0x3) << 16)
+#define DDRMC_CR76_W2R_SPLT_EN                         (1 << 8)
+#define DDRMC_CR76_CS_EN                               1
+#define DDRMC_CR77_CS_MAP                              (1 << 24)
+#define DDRMC_CR77_DI_RD_INTLEAVE                      (1 << 8)
+#define DDRMC_CR77_SWAP_EN                             1
+#define DDRMC_CR78_BUR_ON_FLY_BIT(v)                   ((v) & 0xf)
+#define DDRMC_CR79_CTLUPD_AREF                         (1 << 24)
+#define DDRMC_CR82_INT_MASK                            0x1fffffff
+#define DDRMC_CR87_ODT_WR_MAPCS0                       (1 << 24)
+#define DDRMC_CR87_ODT_RD_MAPCS0                       (1 << 16)
+#define DDRMC_CR88_TODTL_CMD(v)                                (((v) & 0x1f) << 16)
+#define DDRMC_CR89_AODT_RWSMCS(v)                      ((v) & 0xf)
+#define DDRMC_CR91_R2W_SMCSDL(v)                       (((v) & 0x7) << 16)
+#define DDRMC_CR96_WLMRD(v)                            (((v) & 0x3f) << 8)
+#define DDRMC_CR96_WLDQSEN(v)                          ((v) & 0x3f)
+#define DDRMC_CR105_RDLVL_DL_0(v)                      (((v) & 0xff) << 8)
+#define DDRMC_CR110_RDLVL_DL_1(v)                      ((v) & 0xff)
+#define DDRMC_CR114_RDLVL_GTDL_2(v)                    (((v) & 0xffff) << 8)
+#define DDRMC_CR117_AXI0_W_PRI(v)                      (((v) & 0x3) << 8)
+#define DDRMC_CR117_AXI0_R_PRI(v)                      ((v) & 0x3)
+#define DDRMC_CR118_AXI1_W_PRI(v)                      (((v) & 0x3) << 24)
+#define DDRMC_CR118_AXI1_R_PRI(v)                      (((v) & 0x3) << 16)
+#define DDRMC_CR120_AXI0_PRI1_RPRI(v)                  (((v) & 0xf) << 24)
+#define DDRMC_CR120_AXI0_PRI0_RPRI(v)                  (((v) & 0xf) << 16)
+#define DDRMC_CR121_AXI0_PRI3_RPRI(v)                  (((v) & 0xf) << 8)
+#define DDRMC_CR121_AXI0_PRI2_RPRI(v)                  ((v) & 0xf)
+#define DDRMC_CR122_AXI1_PRI1_RPRI(v)                  (((v) & 0xf) << 24)
+#define DDRMC_CR122_AXI1_PRI0_RPRI(v)                  (((v) & 0xf) << 16)
+#define DDRMC_CR122_AXI0_PRIRLX(v)                     ((v) & 0x3ff)
+#define DDRMC_CR123_AXI1_PRI3_RPRI(v)                  (((v) & 0xf) << 8)
+#define DDRMC_CR123_AXI1_PRI2_RPRI(v)                  ((v) & 0xf)
+#define DDRMC_CR124_AXI1_PRIRLX(v)                     ((v) & 0x3ff)
+#define DDRMC_CR126_PHY_RDLAT(v)                       (((v) & 0x3f) << 8)
+#define DDRMC_CR132_WRLAT_ADJ(v)                       (((v) & 0x1f) << 8)
+#define DDRMC_CR132_RDLAT_ADJ(v)                       ((v) & 0x3f)
+#define DDRMC_CR139_PHY_WRLV_RESPLAT(v)                        (((v) & 0xff) << 24)
+#define DDRMC_CR139_PHY_WRLV_LOAD(v)                   (((v) & 0xff) << 16)
+#define DDRMC_CR139_PHY_WRLV_DLL(v)                    (((v) & 0xff) << 8)
+#define DDRMC_CR139_PHY_WRLV_EN(v)                     ((v) & 0xff)
+#define DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(v)       (((v) & 0x1f) << 27)
+#define DDRMC_CR154_PAD_ZQ_MODE(v)                     (((v) & 0x3) << 21)
+#define DDRMC_CR155_AXI0_AWCACHE                       (1 << 10)
+#define DDRMC_CR155_PAD_ODT_BYTE1(v)                   ((v) & 0x7)
+#define DDRMC_CR158_TWR(v)                             ((v) & 0x3f)
+
+#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
+#include <asm/types.h>
+
+/* System Reset Controller (SRC) */
+struct src {
+       u32 scr;
+       u32 sbmr1;
+       u32 srsr;
+       u32 secr;
+       u32 gpsr;
+       u32 sicr;
+       u32 simr;
+       u32 sbmr2;
+       u32 gpr0;
+       u32 gpr1;
+       u32 gpr2;
+       u32 gpr3;
+       u32 gpr4;
+       u32 hab0;
+       u32 hab1;
+       u32 hab2;
+       u32 hab3;
+       u32 hab4;
+       u32 hab5;
+       u32 misc0;
+       u32 misc1;
+       u32 misc2;
+       u32 misc3;
+};
+
+/* Periodic Interrupt Timer (PIT) */
+struct pit_reg {
+       u32 mcr;
+       u32 recv0[55];
+       u32 ltmr64h;
+       u32 ltmr64l;
+       u32 recv1[6];
+       u32 ldval0;
+       u32 cval0;
+       u32 tctrl0;
+       u32 tflg0;
+       u32 ldval1;
+       u32 cval1;
+       u32 tctrl1;
+       u32 tflg1;
+       u32 ldval2;
+       u32 cval2;
+       u32 tctrl2;
+       u32 tflg2;
+       u32 ldval3;
+       u32 cval3;
+       u32 tctrl3;
+       u32 tflg3;
+       u32 ldval4;
+       u32 cval4;
+       u32 tctrl4;
+       u32 tflg4;
+       u32 ldval5;
+       u32 cval5;
+       u32 tctrl5;
+       u32 tflg5;
+       u32 ldval6;
+       u32 cval6;
+       u32 tctrl6;
+       u32 tflg6;
+       u32 ldval7;
+       u32 cval7;
+       u32 tctrl7;
+       u32 tflg7;
+};
+
+/* Watchdog Timer (WDOG) */
+struct wdog_regs {
+       u16 wcr;
+       u16 wsr;
+       u16 wrsr;
+       u16 wicr;
+       u16 wmcr;
+};
+
+/* LPDDR2/DDR3 SDRAM Memory Controller (DDRMC) */
+struct ddrmr_regs {
+       u32 cr[162];
+       u32 rsvd[94];
+       u32 phy[53];
+};
+
+/* On-Chip One Time Programmable Controller (OCOTP) */
+struct ocotp_regs {
+       u32 ctrl;
+       u32 ctrl_set;
+       u32 ctrl_clr;
+       u32 ctrl_tog;
+       u32 timing;
+       u32 rsvd0[3];
+       u32 data;
+       u32 rsvd1[3];
+       u32 read_ctrl;
+       u32 rsvd2[3];
+       u32 read_fuse_data;
+       u32 rsvd3[7];
+       u32 scs;
+       u32 scs_set;
+       u32 scs_clr;
+       u32 scs_tog;
+       u32 crc_addr;
+       u32 rsvd4[3];
+       u32 crc_value;
+       u32 rsvd5[3];
+       u32 version;
+       u32 rsvd6[0xdb];
+
+       struct fuse_bank {
+               u32 fuse_regs[0x20];
+       } bank[16];
+};
+
+struct fuse_bank0_regs {
+       u32 lock;
+       u32 rsvd0[3];
+       u32 uid_low;
+       u32 rsvd1[3];
+       u32 uid_high;
+       u32 rsvd2[0x17];
+};
+
+struct fuse_bank4_regs {
+       u32 sjc_resp0;
+       u32 rsvd0[3];
+       u32 sjc_resp1;
+       u32 rsvd1[3];
+       u32 mac_addr0;
+       u32 rsvd2[3];
+       u32 mac_addr1;
+       u32 rsvd3[3];
+       u32 mac_addr2;
+       u32 rsvd4[3];
+       u32 mac_addr3;
+       u32 rsvd5[3];
+       u32 gp1;
+       u32 rsvd6[3];
+       u32 gp2;
+       u32 rsvd7[3];
+};
+
+/* UART */
+struct lpuart_fsl {
+       u8 ubdh;
+       u8 ubdl;
+       u8 uc1;
+       u8 uc2;
+       u8 us1;
+       u8 us2;
+       u8 uc3;
+       u8 ud;
+       u8 uma1;
+       u8 uma2;
+       u8 uc4;
+       u8 uc5;
+       u8 ued;
+       u8 umodem;
+       u8 uir;
+       u8 reserved;
+       u8 upfifo;
+       u8 ucfifo;
+       u8 usfifo;
+       u8 utwfifo;
+       u8 utcfifo;
+       u8 urwfifo;
+       u8 urcfifo;
+       u8 rsvd[28];
+};
+
+/* MSCM Interrupt Router */
+struct mscm_ir {
+       u32 ircp0ir;
+       u32 ircp1ir;
+       u32 rsvd1[6];
+       u32 ircpgir;
+       u32 rsvd2[23];
+       u16 irsprc[112];
+       u16 rsvd3[848];
+};
+
+#endif /* __ASSEMBLER__*/
+
+#endif /* __ASM_ARCH_IMX_REGS_H__ */
diff --git a/arch/arm/include/asm/arch-vf610/iomux-vf610.h b/arch/arm/include/asm/arch-vf610/iomux-vf610.h
new file mode 100644 (file)
index 0000000..1c728fa
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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 __IOMUX_VF610_H__
+#define __IOMUX_VF610_H__
+
+#include <asm/imx-common/iomux-v3.h>
+
+/* Pad control groupings */
+#define VF610_UART_PAD_CTRL    (PAD_CTL_PUS_100K_UP | PAD_CTL_DSE_25ohm | \
+                               PAD_CTL_OBE_IBE_ENABLE)
+#define VF610_SDHC_PAD_CTRL    (PAD_CTL_PUS_100K_UP | PAD_CTL_DSE_20ohm | \
+                               PAD_CTL_OBE_IBE_ENABLE)
+#define VF610_ENET_PAD_CTRL    (PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_50ohm | \
+                               PAD_CTL_OBE_IBE_ENABLE)
+#define VF610_DDR_PAD_CTRL     PAD_CTL_DSE_25ohm
+
+enum {
+       VF610_PAD_PTA6__RMII0_CLKIN             = IOMUX_PAD(0x0000, 0x0000, 2, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTB4__UART1_TX                = IOMUX_PAD(0x0068, 0x0068, 2, 0x0380, 0, VF610_UART_PAD_CTRL),
+       VF610_PAD_PTB5__UART1_RX                = IOMUX_PAD(0x006c, 0x006c, 2, 0x037c, 0, VF610_UART_PAD_CTRL),
+       VF610_PAD_PTC1__RMII0_MDIO              = IOMUX_PAD(0x00b8, 0x00b8, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC0__RMII0_MDC               = IOMUX_PAD(0x00b4, 0x00b4, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC2__RMII0_CRS_DV            = IOMUX_PAD(0x00bc, 0x00bc, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC3__RMII0_RD1               = IOMUX_PAD(0x00c0, 0x00c0, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC4__RMII0_RD0               = IOMUX_PAD(0x00c4, 0x00c4, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC5__RMII0_RXER              = IOMUX_PAD(0x00c8, 0x00c8, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC6__RMII0_TD1               = IOMUX_PAD(0x00cc, 0x00cc, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC7__RMII0_TD0               = IOMUX_PAD(0x00D0, 0x00D0, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTC8__RMII0_TXEN              = IOMUX_PAD(0x00D4, 0x00D4, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
+       VF610_PAD_PTA24__ESDHC1_CLK             = IOMUX_PAD(0x0038, 0x0038, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_PTA25__ESDHC1_CMD             = IOMUX_PAD(0x003c, 0x003c, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_PTA26__ESDHC1_DAT0            = IOMUX_PAD(0x0040, 0x0040, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_PTA27__ESDHC1_DAT1            = IOMUX_PAD(0x0044, 0x0044, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_PTA28__ESDHC1_DAT2            = IOMUX_PAD(0x0048, 0x0048, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_PTA29__ESDHC1_DAT3            = IOMUX_PAD(0x004c, 0x004c, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
+       VF610_PAD_DDR_A15__DDR_A_15             = IOMUX_PAD(0x0220, 0x0220, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A14__DDR_A_14             = IOMUX_PAD(0x0224, 0x0224, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A13__DDR_A_13             = IOMUX_PAD(0x0228, 0x0228, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A12__DDR_A_12             = IOMUX_PAD(0x022c, 0x022c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A11__DDR_A_11             = IOMUX_PAD(0x0230, 0x0230, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A10__DDR_A_10             = IOMUX_PAD(0x0234, 0x0234, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A9__DDR_A_9               = IOMUX_PAD(0x0238, 0x0238, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A8__DDR_A_8               = IOMUX_PAD(0x023c, 0x023c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A7__DDR_A_7               = IOMUX_PAD(0x0240, 0x0240, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A6__DDR_A_6               = IOMUX_PAD(0x0244, 0x0244, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A5__DDR_A_5               = IOMUX_PAD(0x0248, 0x0248, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A4__DDR_A_4               = IOMUX_PAD(0x024c, 0x024c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A3__DDR_A_3               = IOMUX_PAD(0x0250, 0x0250, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A2__DDR_A_2               = IOMUX_PAD(0x0254, 0x0254, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_A1__DDR_A_1               = IOMUX_PAD(0x0258, 0x0258, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_BA2__DDR_BA_2             = IOMUX_PAD(0x0260, 0x0260, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_BA1__DDR_BA_1             = IOMUX_PAD(0x0264, 0x0264, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_BA0__DDR_BA_0             = IOMUX_PAD(0x0268, 0x0268, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_CAS__DDR_CAS_B            = IOMUX_PAD(0x026c, 0x026c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_CKE__DDR_CKE_0            = IOMUX_PAD(0x0270, 0x0270, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_CLK__DDR_CLK_0            = IOMUX_PAD(0x0274, 0x0274, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_CS__DDR_CS_B_0            = IOMUX_PAD(0x0278, 0x0278, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D15__DDR_D_15             = IOMUX_PAD(0x027c, 0x027c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D14__DDR_D_14             = IOMUX_PAD(0x0280, 0x0280, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D13__DDR_D_13             = IOMUX_PAD(0x0284, 0x0284, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D12__DDR_D_12             = IOMUX_PAD(0x0288, 0x0288, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D11__DDR_D_11             = IOMUX_PAD(0x028c, 0x028c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D10__DDR_D_10             = IOMUX_PAD(0x0290, 0x0290, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D9__DDR_D_9               = IOMUX_PAD(0x0294, 0x0294, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D8__DDR_D_8               = IOMUX_PAD(0x0298, 0x0298, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D7__DDR_D_7               = IOMUX_PAD(0x029c, 0x029c, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D6__DDR_D_6               = IOMUX_PAD(0x02a0, 0x02a0, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D5__DDR_D_5               = IOMUX_PAD(0x02a4, 0x02a4, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D4__DDR_D_4               = IOMUX_PAD(0x02a8, 0x02a8, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D3__DDR_D_3               = IOMUX_PAD(0x02ac, 0x02ac, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D2__DDR_D_2               = IOMUX_PAD(0x02b0, 0x02b0, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D1__DDR_D_1               = IOMUX_PAD(0x02b4, 0x02b4, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_D0__DDR_D_0               = IOMUX_PAD(0x02b8, 0x02b8, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_DQM1__DDR_DQM_1           = IOMUX_PAD(0x02bc, 0x02bc, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_DQM0__DDR_DQM_0           = IOMUX_PAD(0x02c0, 0x02c0, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_DQS1__DDR_DQS_1           = IOMUX_PAD(0x02c4, 0x02c4, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_DQS0__DDR_DQS_0           = IOMUX_PAD(0x02c8, 0x02c8, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_RAS__DDR_RAS_B            = IOMUX_PAD(0x02cc, 0x02cc, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_WE__DDR_WE_B              = IOMUX_PAD(0x02d0, 0x02d0, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_ODT1__DDR_ODT_0           = IOMUX_PAD(0x02d4, 0x02d4, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+       VF610_PAD_DDR_ODT0__DDR_ODT_1           = IOMUX_PAD(0x02d8, 0x02d8, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
+};
+
+#endif /* __IOMUX_VF610_H__ */
index d0c69da971f95c74cee43a959f761553cdd51349..8b8a91ae65ffbc9117cc7b39aa2da647513bafc2 100644 (file)
 #ifndef _ASM_ARCH_HARDWARE_H
 #define _ASM_ARCH_HARDWARE_H
 
-#define XPSS_SYS_CTRL_BASEADDR         0xF8000000
-#define XPSS_DEV_CFG_APB_BASEADDR      0xF8007000
-#define XPSS_SCU_BASEADDR              0xF8F00000
+#define ZYNQ_SYS_CTRL_BASEADDR         0xF8000000
+#define ZYNQ_DEV_CFG_APB_BASEADDR      0xF8007000
+#define ZYNQ_SCU_BASEADDR              0xF8F00000
+#define ZYNQ_SCUTIMER_BASEADDR         0xF8F00600
+#define ZYNQ_GEM_BASEADDR0             0xE000B000
+#define ZYNQ_GEM_BASEADDR1             0xE000C000
+#define ZYNQ_SDHCI_BASEADDR0           0xE0100000
+#define ZYNQ_SDHCI_BASEADDR1           0xE0101000
+#define ZYNQ_I2C_BASEADDR0             0xE0004000
+#define ZYNQ_I2C_BASEADDR1             0xE0005000
 
 /* Reflect slcr offsets */
 struct slcr_regs {
        u32 scl; /* 0x0 */
        u32 slcr_lock; /* 0x4 */
        u32 slcr_unlock; /* 0x8 */
-       u32 reserved1[125];
+       u32 reserved0[75];
+       u32 gem0_rclk_ctrl; /* 0x138 */
+       u32 gem1_rclk_ctrl; /* 0x13c */
+       u32 gem0_clk_ctrl; /* 0x140 */
+       u32 gem1_clk_ctrl; /* 0x144 */
+       u32 reserved1[46];
        u32 pss_rst_ctrl; /* 0x200 */
        u32 reserved2[15];
        u32 fpga_rst_ctrl; /* 0x240 */
@@ -41,15 +53,21 @@ struct slcr_regs {
        u32 boot_mode; /* 0x25c */
        u32 reserved4[116];
        u32 trust_zone; /* 0x430 */ /* FIXME */
-       u32 reserved5[115];
+       u32 reserved5_1[63];
+       u32 pss_idcode; /* 0x530 */
+       u32 reserved5_2[51];
        u32 ddr_urgent; /* 0x600 */
        u32 reserved6[6];
        u32 ddr_urgent_sel; /* 0x61c */
-       u32 reserved7[188];
+       u32 reserved7[56];
+       u32 mio_pin[54]; /* 0x700 - 0x7D4 */
+       u32 reserved8[74];
+       u32 lvl_shftr_en; /* 0x900 */
+       u32 reserved9[3];
        u32 ocm_cfg; /* 0x910 */
 };
 
-#define slcr_base ((struct slcr_regs *) XPSS_SYS_CTRL_BASEADDR)
+#define slcr_base ((struct slcr_regs *)ZYNQ_SYS_CTRL_BASEADDR)
 
 struct devcfg_regs {
        u32 ctrl; /* 0x0 */
@@ -72,7 +90,7 @@ struct devcfg_regs {
        u32 read_count; /* 0x8c */
 };
 
-#define devcfg_base ((struct devcfg_regs *) XPSS_DEV_CFG_APB_BASEADDR)
+#define devcfg_base ((struct devcfg_regs *)ZYNQ_DEV_CFG_APB_BASEADDR)
 
 struct scu_regs {
        u32 reserved1[16];
@@ -80,6 +98,6 @@ struct scu_regs {
        u32 filter_end; /* 0x44 */
 };
 
-#define scu_base ((struct scu_regs *) XPSS_SCU_BASEADDR)
+#define scu_base ((struct scu_regs *)ZYNQ_SCU_BASEADDR)
 
 #endif /* _ASM_ARCH_HARDWARE_H */
index e78890011a8421be7ccdaad03a831e1e4572d694..2317121ca64aeb0b800fa295a6dd05a8dfebd467 100644 (file)
 extern void zynq_slcr_lock(void);
 extern void zynq_slcr_unlock(void);
 extern void zynq_slcr_cpu_reset(void);
+extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk);
+extern void zynq_slcr_devcfg_disable(void);
+extern void zynq_slcr_devcfg_enable(void);
+extern u32 zynq_slcr_get_idcode(void);
+
+/* Driver extern functions */
+extern int zynq_sdhci_init(u32 regbase);
 
 #endif /* _SYS_PROTO_H_ */
index 5f11d7b72eae1a8b49705a876806f9357ac78130..1b94a99c54d46440f87e2907cb329e911153ef59 100644 (file)
        (0xFF << EMIF_SYS_ADDR_SHIFT))
 
 #define EMIF_EXT_PHY_CTRL_TIMING_REG   0x5
-#define EMIF_EXT_PHY_CTRL_CONST_REG    0x13
+#define EMIF_EXT_PHY_CTRL_CONST_REG    0x14
 
 /* Reg mapping structure */
 struct emif_reg_struct {
@@ -855,13 +855,10 @@ 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
+#define REG_SR_TIM             0x0
+#define REG_PD_TIM             0x0
+
 
 /* EMIF_PWR_MGMT_CTRL register */
 #define EMIF_PWR_MGMT_CTRL (\
@@ -1113,6 +1110,7 @@ struct emif_regs {
        u32 freq;
        u32 sdram_config_init;
        u32 sdram_config;
+       u32 sdram_config2;
        u32 ref_ctrl;
        u32 sdram_tim1;
        u32 sdram_tim2;
index 37ac0daa70b05c1aedfcaf6a6251117e28ab6ead..7611d0a18bd19624566130c53c87efa85ce69dbc 100644 (file)
 #ifndef        __ASM_GBL_DATA_H
 #define __ASM_GBL_DATA_H
 
+#ifdef CONFIG_OMAP
+#include <asm/omap_boot.h>
+#endif
+
 /* Architecture-specific global data */
 struct arch_global_data {
 #if defined(CONFIG_FSL_ESDHC)
@@ -51,6 +55,10 @@ struct arch_global_data {
        unsigned long tlb_addr;
        unsigned long tlb_size;
 #endif
+
+#ifdef CONFIG_OMAP
+       struct omap_boot_parameters omap_boot_params;
+#endif
 };
 
 #include <asm-generic/global_data.h>
similarity index 93%
rename from arch/arm/include/asm/arch-mxs/dma.h
rename to arch/arm/include/asm/imx-common/dma.h
index 1ac8696e64e5903423b38c4b5cdaa00e3e7cbfbd..cb74528970dcb78dcec36cb300551dcbbb8b4aa0 100644 (file)
@@ -72,6 +72,18 @@ enum {
        MXS_DMA_CHANNEL_AHB_APBH_RESERVED1,
        MXS_MAX_DMA_CHANNELS,
 };
+#elif defined(CONFIG_MX6)
+enum {
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI0 = 0,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI1,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI2,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI3,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI4,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI5,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI6,
+       MXS_DMA_CHANNEL_AHB_APBH_GPMI7,
+       MXS_MAX_DMA_CHANNELS,
+};
 #endif
 
 /*
diff --git a/arch/arm/include/asm/imx-common/imximage.cfg b/arch/arm/include/asm/imx-common/imximage.cfg
new file mode 100644 (file)
index 0000000..95daa3d
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * i.MX image header offset values
+ * Copyright (C) 2013 Marek Vasut <marex@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.
+ */
+
+/*
+ * NOTE: This file must be kept in sync with tools/imximage.h because
+ *       tools/imximage.c can not cross-include headers from arch/arm/
+ *       and vice-versa.
+ */
+
+#ifndef __ASM_IMX_COMMON_IMXIMAGE_CFG__
+#define __ASM_IMX_COMMON_IMXIMAGE_CFG__
+
+/* Standard image header offset for NAND, SATA, SD, SPI flash. */
+#define FLASH_OFFSET_STANDARD  0x400
+/* Specific image header offset for booting from OneNAND. */
+#define FLASH_OFFSET_ONENAND   0x100
+/* Specific image header offset for booting from memory-mapped NOR. */
+#define FLASH_OFFSET_NOR       0x1000
+
+#endif  /* __ASM_IMX_COMMON_IMXIMAGE_CFG__ */
index c34bb76ad453d51292bee52003974c24fa057688..ebf54cf187a9dec38df0dc3058ddaed28968f2fe 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef __MACH_IOMUX_V3_H__
 #define __MACH_IOMUX_V3_H__
 
+#include <common.h>
+
 /*
  *     build IOMUX_PAD structure
  *
@@ -84,7 +86,86 @@ typedef u64 iomux_v3_cfg_t;
        ((iomux_v3_cfg_t)(sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT)|   \
        ((iomux_v3_cfg_t)(sel_input)     << MUX_SEL_INPUT_SHIFT))
 
+#define NEW_PAD_CTRL(cfg, pad) (((cfg) & ~MUX_PAD_CTRL_MASK) | \
+                                       MUX_PAD_CTRL(pad))
+
+#define __NA_                  0x000
+#define NO_MUX_I               0
+#define NO_PAD_I               0
+
 #define NO_PAD_CTRL            (1 << 17)
+
+#ifdef CONFIG_MX6
+
+#define PAD_CTL_HYS            (1 << 16)
+
+#define PAD_CTL_PUS_100K_DOWN  (0 << 14 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_47K_UP     (1 << 14 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_100K_UP    (2 << 14 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_22K_UP     (3 << 14 | PAD_CTL_PUE)
+#define PAD_CTL_PUE            (1 << 13 | PAD_CTL_PKE)
+#define PAD_CTL_PKE            (1 << 12)
+
+#define PAD_CTL_ODE            (1 << 11)
+
+#define PAD_CTL_SPEED_LOW      (1 << 6)
+#define PAD_CTL_SPEED_MED      (2 << 6)
+#define PAD_CTL_SPEED_HIGH     (3 << 6)
+
+#define PAD_CTL_DSE_DISABLE    (0 << 3)
+#define PAD_CTL_DSE_240ohm     (1 << 3)
+#define PAD_CTL_DSE_120ohm     (2 << 3)
+#define PAD_CTL_DSE_80ohm      (3 << 3)
+#define PAD_CTL_DSE_60ohm      (4 << 3)
+#define PAD_CTL_DSE_48ohm      (5 << 3)
+#define PAD_CTL_DSE_40ohm      (6 << 3)
+#define PAD_CTL_DSE_34ohm      (7 << 3)
+
+#elif defined(CONFIG_VF610)
+
+#define PAD_MUX_MODE_SHIFT     20
+
+#define PAD_CTL_SPEED_MED      (1 << 12)
+#define PAD_CTL_SPEED_HIGH     (3 << 12)
+
+#define PAD_CTL_DSE_50ohm      (3 << 6)
+#define PAD_CTL_DSE_25ohm      (6 << 6)
+#define PAD_CTL_DSE_20ohm      (7 << 6)
+
+#define PAD_CTL_PUS_47K_UP     (1 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_100K_UP    (2 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PKE            (1 << 3)
+#define PAD_CTL_PUE            (1 << 2 | PAD_CTL_PKE)
+
+#define PAD_CTL_OBE_IBE_ENABLE (3 << 0)
+
+#else
+
+#define PAD_CTL_DVS            (1 << 13)
+#define PAD_CTL_INPUT_DDR      (1 << 9)
+#define PAD_CTL_HYS            (1 << 8)
+
+#define PAD_CTL_PKE            (1 << 7)
+#define PAD_CTL_PUE            (1 << 6 | PAD_CTL_PKE)
+#define PAD_CTL_PUS_100K_DOWN  (0 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_47K_UP     (1 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_100K_UP    (2 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_22K_UP     (3 << 4 | PAD_CTL_PUE)
+
+#define PAD_CTL_ODE            (1 << 3)
+
+#define PAD_CTL_DSE_LOW                (0 << 1)
+#define PAD_CTL_DSE_MED                (1 << 1)
+#define PAD_CTL_DSE_HIGH       (2 << 1)
+#define PAD_CTL_DSE_MAX                (3 << 1)
+
+#endif
+
+#define PAD_CTL_SRE_SLOW       (0 << 0)
+#define PAD_CTL_SRE_FAST       (1 << 0)
+
+#define IOMUX_CONFIG_SION      0x10
+
 #define GPIO_PIN_MASK          0x1f
 #define GPIO_PORT_SHIFT                5
 #define GPIO_PORT_MASK         (0x7 << GPIO_PORT_SHIFT)
@@ -95,10 +176,8 @@ typedef u64 iomux_v3_cfg_t;
 #define GPIO_PORTE             (4 << GPIO_PORT_SHIFT)
 #define GPIO_PORTF             (5 << GPIO_PORT_SHIFT)
 
-#define MUX_CONFIG_SION                (0x1 << 4)
-
-int imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad);
-int imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
+void imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad);
+void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
                                     unsigned count);
 
 #endif /* __MACH_IOMUX_V3_H__*/
similarity index 97%
rename from arch/arm/include/asm/arch-mxs/regs-apbh.h
rename to arch/arm/include/asm/imx-common/regs-apbh.h
index fcef4b80e3745f81d70416b89214427a572ef20f..bcec6e0b95aaeb92bda39bf1b55eb38615b118e9 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __REGS_APBH_H__
 #define __REGS_APBH_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 
@@ -109,7 +109,7 @@ struct mxs_apbh_regs {
        mxs_reg_32(hw_apbh_version)
 };
 
-#elif defined(CONFIG_MX28)
+#elif (defined(CONFIG_MX28) || defined(CONFIG_MX6))
 struct mxs_apbh_regs {
        mxs_reg_32(hw_apbh_ctrl0)
        mxs_reg_32(hw_apbh_ctrl1)
@@ -288,6 +288,17 @@ struct mxs_apbh_regs {
 #define        APBH_CTRL0_CLKGATE_CHANNEL_NAND7                0x0800
 #define        APBH_CTRL0_CLKGATE_CHANNEL_HSADC                0x1000
 #define        APBH_CTRL0_CLKGATE_CHANNEL_LCDIF                0x2000
+#elif defined(CONFIG_MX6)
+#define        APBH_CTRL0_CLKGATE_CHANNEL_OFFSET               0
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND0                0x0001
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND1                0x0002
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND2                0x0004
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND3                0x0008
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND4                0x0010
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND5                0x0020
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND6                0x0040
+#define        APBH_CTRL0_CLKGATE_CHANNEL_NAND7                0x0080
+#define        APBH_CTRL0_CLKGATE_CHANNEL_SSP                  0x0100
 #endif
 
 #define        APBH_CTRL1_CH15_CMDCMPLT_IRQ_EN                 (1 << 31)
@@ -393,6 +404,10 @@ struct mxs_apbh_regs {
 #define        APBH_CHANNEL_CTRL_FREEZE_CHANNEL_LCDIF          0x2000
 #endif
 
+#if defined(CONFIG_MX6)
+#define        APBH_CHANNEL_CTRL_RESET_CHANNEL_OFFSET          16
+#endif
+
 #if defined(CONFIG_MX23)
 #define        APBH_DEVSEL_CH7_MASK                            (0xf << 28)
 #define        APBH_DEVSEL_CH7_OFFSET                          28
similarity index 96%
rename from arch/arm/include/asm/arch-mxs/regs-bch.h
rename to arch/arm/include/asm/imx-common/regs-bch.h
index 40baa4d1f9d35563fbb0036bdf58883eae45f171..dbe7ac8ed692f4c0611613de94a1aec512998a3f 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_BCH_H__
 #define __MX28_REGS_BCH_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_bch_regs {
@@ -136,8 +136,13 @@ struct mxs_bch_regs {
 #define        BCH_FLASHLAYOUT0_NBLOCKS_OFFSET                 24
 #define        BCH_FLASHLAYOUT0_META_SIZE_MASK                 (0xff << 16)
 #define        BCH_FLASHLAYOUT0_META_SIZE_OFFSET               16
+#if defined(CONFIG_MX6)
+#define        BCH_FLASHLAYOUT0_ECC0_MASK                      (0x1f << 11)
+#define        BCH_FLASHLAYOUT0_ECC0_OFFSET                    11
+#else
 #define        BCH_FLASHLAYOUT0_ECC0_MASK                      (0xf << 12)
 #define        BCH_FLASHLAYOUT0_ECC0_OFFSET                    12
+#endif
 #define        BCH_FLASHLAYOUT0_ECC0_NONE                      (0x0 << 12)
 #define        BCH_FLASHLAYOUT0_ECC0_ECC2                      (0x1 << 12)
 #define        BCH_FLASHLAYOUT0_ECC0_ECC4                      (0x2 << 12)
@@ -161,8 +166,13 @@ struct mxs_bch_regs {
 
 #define        BCH_FLASHLAYOUT1_PAGE_SIZE_MASK                 (0xffff << 16)
 #define        BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET               16
+#if defined(CONFIG_MX6)
+#define        BCH_FLASHLAYOUT1_ECCN_MASK                      (0x1f << 11)
+#define        BCH_FLASHLAYOUT1_ECCN_OFFSET                    11
+#else
 #define        BCH_FLASHLAYOUT1_ECCN_MASK                      (0xf << 12)
 #define        BCH_FLASHLAYOUT1_ECCN_OFFSET                    12
+#endif
 #define        BCH_FLASHLAYOUT1_ECCN_NONE                      (0x0 << 12)
 #define        BCH_FLASHLAYOUT1_ECCN_ECC2                      (0x1 << 12)
 #define        BCH_FLASHLAYOUT1_ECCN_ECC4                      (0x2 << 12)
similarity index 99%
rename from arch/arm/include/asm/arch-mxs/regs-gpmi.h
rename to arch/arm/include/asm/imx-common/regs-gpmi.h
index 624d6185603777281f29bb18ca13ac3a8e88c988..3409b9430c981db999403c4bfb282740754dee31 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __MX28_REGS_GPMI_H__
 #define __MX28_REGS_GPMI_H__
 
-#include <asm/arch/regs-common.h>
+#include <asm/imx-common/regs-common.h>
 
 #ifndef        __ASSEMBLY__
 struct mxs_gpmi_regs {
diff --git a/arch/arm/include/asm/omap_boot.h b/arch/arm/include/asm/omap_boot.h
new file mode 100644 (file)
index 0000000..a803965
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2013
+ * 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
+ */
+
+/* ROM code defines */
+/* Boot device */
+#define BOOT_DEVICE_MASK       0xFF
+#define BOOT_DEVICE_OFFSET     0x8
+#define DEV_DESC_PTR_OFFSET    0x4
+#define DEV_DATA_PTR_OFFSET    0x18
+#define BOOT_MODE_OFFSET       0x8
+#define RESET_REASON_OFFSET    0x9
+#define CH_FLAGS_OFFSET                0xA
+
+#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
+#define CH_FLAGS_CHRAM         (0x1 << 1)
+#define CH_FLAGS_CHFLASH       (0x1 << 2)
+#define CH_FLAGS_CHMMCSD       (0x1 << 3)
+
+#ifndef __ASSEMBLY__
+struct omap_boot_parameters {
+       char *boot_message;
+       unsigned int mem_boot_descriptor;
+       unsigned char omap_bootdevice;
+       unsigned char reset_reason;
+       unsigned char ch_flags;
+       unsigned long omap_bootmode;
+};
+#endif
index 091ddb508d5673bb493e76ec255d7ce8de284413..0dbe81b59c64c1d9c0b1b0a6077b569e68e7e28f 100644 (file)
 #ifndef        _OMAP_COMMON_H_
 #define        _OMAP_COMMON_H_
 
+#ifndef __ASSEMBLY__
+
 #include <common.h>
 
-#define NUM_SYS_CLKS   8
+#define NUM_SYS_CLKS   7
 
 struct prcm_regs {
        /* cm1.ckgen */
@@ -240,6 +242,8 @@ struct prcm_regs {
        u32 cm_l3init_fsusb_clkctrl;
        u32 cm_l3init_ocp2scp1_clkctrl;
 
+       u32 prm_irqstatus_mpu_2;
+
        /* cm2.l4per */
        u32 cm_l4per_clkstctrl;
        u32 cm_l4per_dynamicdep;
@@ -299,6 +303,7 @@ struct prcm_regs {
        /* l4 wkup regs */
        u32 cm_abe_pll_ref_clksel;
        u32 cm_sys_clksel;
+       u32 cm_abe_pll_sys_clksel;
        u32 cm_wkup_clkstctrl;
        u32 cm_wkup_l4wkup_clkctrl;
        u32 cm_wkup_wdtimer1_clkctrl;
@@ -316,6 +321,7 @@ struct prcm_regs {
        u32 cm_wkupaon_io_srcomp_clkctrl;
        u32 prm_rstctrl;
        u32 prm_rstst;
+       u32 prm_rsttime;
        u32 prm_vc_val_bypass;
        u32 prm_vc_cfg_i2c_mode;
        u32 prm_vc_cfg_i2c_clk;
@@ -325,6 +331,8 @@ struct prcm_regs {
        u32 prm_sldo_mpu_ctrl;
        u32 prm_sldo_mm_setup;
        u32 prm_sldo_mm_ctrl;
+       u32 prm_abbldo_mpu_setup;
+       u32 prm_abbldo_mpu_ctrl;
 
        u32 cm_div_m4_dpll_core;
        u32 cm_div_m5_dpll_core;
@@ -343,10 +351,15 @@ struct prcm_regs {
        u32 cm_l3init_usbphy_clkctrl;
        u32 cm_l4per_mcbsp4_clkctrl;
        u32 prm_vc_cfg_channel;
+
+       /* SCRM stuff, used by some boards */
+       u32 scrm_auxclk0;
+       u32 scrm_auxclk1;
 };
 
 struct omap_sys_ctrl_regs {
        u32 control_status;
+       u32 control_std_fuse_opp_vdd_mpu_2;
        u32 control_core_mmr_lock1;
        u32 control_core_mmr_lock2;
        u32 control_core_mmr_lock3;
@@ -359,6 +372,7 @@ struct omap_sys_ctrl_regs {
        u32 control_ldosram_iva_voltage_ctrl;
        u32 control_ldosram_mpu_voltage_ctrl;
        u32 control_ldosram_core_voltage_ctrl;
+       u32 control_usbotghs_ctrl;
        u32 control_padconf_core_base;
        u32 control_paconf_global;
        u32 control_paconf_mode;
@@ -391,6 +405,7 @@ struct omap_sys_ctrl_regs {
        u32 control_ddrio_0;
        u32 control_ddrio_1;
        u32 control_ddrio_2;
+       u32 control_ddr_control_ext_0;
        u32 control_lpddr2io1_0;
        u32 control_lpddr2io1_1;
        u32 control_lpddr2io1_2;
@@ -416,6 +431,7 @@ struct omap_sys_ctrl_regs {
        u32 control_port_emif2_sdram_config;
        u32 control_emif1_sdram_config_ext;
        u32 control_emif2_sdram_config_ext;
+       u32 control_wkup_ldovbb_mpu_voltage_ctrl;
        u32 control_smart1nopmio_padconf_0;
        u32 control_smart1nopmio_padconf_1;
        u32 control_padconf_mode;
@@ -491,11 +507,25 @@ struct pmic_data {
        u32 start_code;
        unsigned gpio;
        int gpio_en;
+       u32 i2c_slave_addr;
+       void (*pmic_bus_init)(void);
+       int (*pmic_write)(u8 sa, u8 reg_addr, u8 reg_data);
+};
+
+/**
+ * struct volts_efuse_data - efuse definition for voltage
+ * @reg:       register address for efuse
+ * @reg_bits:  Number of bits in a register address, mandatory.
+ */
+struct volts_efuse_data {
+       u32 reg;
+       u8 reg_bits;
 };
 
 struct volts {
        u32 value;
        u32 addr;
+       struct volts_efuse_data efuse;
        struct pmic_data *pmic;
 };
 
@@ -503,6 +533,9 @@ struct vcores_data {
        struct volts mpu;
        struct volts core;
        struct volts mm;
+       struct volts gpu;
+       struct volts eve;
+       struct volts iva;
 };
 
 extern struct prcm_regs const **prcm;
@@ -542,9 +575,9 @@ void enable_non_essential_clocks(void);
 void scale_vcores(struct vcores_data const *);
 u32 get_offset_code(u32 volt_offset, struct pmic_data *pmic);
 void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic);
-
-/* Max value for DPLL multiplier M */
-#define OMAP_DPLL_MAX_N        127
+void abb_setup(u32 fuse, u32 ldovbb, u32 setup, u32 control,
+              u32 txdone, u32 txdone_mask, u32 opp);
+s8 abb_setup_ldovbb(u32 fuse, u32 ldovbb);
 
 /* HW Init Context */
 #define OMAP_INIT_CONTEXT_SPL                  0
@@ -552,12 +585,34 @@ void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic);
 #define OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL      2
 #define OMAP_INIT_CONTEXT_UBOOT_AFTER_CH       3
 
+/* ABB */
+#define OMAP_ABB_NOMINAL_OPP           0
+#define OMAP_ABB_FAST_OPP              1
+#define OMAP_ABB_SLOW_OPP              3
+#define OMAP_ABB_CONTROL_FAST_OPP_SEL_MASK             (0x1 << 0)
+#define OMAP_ABB_CONTROL_SLOW_OPP_SEL_MASK             (0x1 << 1)
+#define OMAP_ABB_CONTROL_OPP_CHANGE_MASK               (0x1 << 2)
+#define OMAP_ABB_CONTROL_SR2_IN_TRANSITION_MASK                (0x1 << 6)
+#define OMAP_ABB_SETUP_SR2EN_MASK                      (0x1 << 0)
+#define OMAP_ABB_SETUP_ACTIVE_FBB_SEL_MASK             (0x1 << 2)
+#define OMAP_ABB_SETUP_ACTIVE_RBB_SEL_MASK             (0x1 << 1)
+#define OMAP_ABB_SETUP_SR2_WTCNT_VALUE_MASK            (0xff << 8)
+
 static inline u32 omap_revision(void)
 {
        extern u32 *const omap_si_rev;
        return *omap_si_rev;
 }
 
+#define OMAP54xx       0x54000000
+
+static inline u8 is_omap54xx(void)
+{
+       extern u32 *const omap_si_rev;
+       return ((*omap_si_rev & 0xFF000000) == OMAP54xx);
+}
+#endif
+
 /*
  * silicon revisions.
  * Moving this to common, so that most of code can be moved to common,
@@ -583,4 +638,19 @@ static inline u32 omap_revision(void)
 
 /* DRA7XX */
 #define DRA752_ES1_0   0x07520100
+
+/*
+ * SRAM scratch space entries
+ */
+#define OMAP_SRAM_SCRATCH_OMAP_REV     SRAM_SCRATCH_SPACE_ADDR
+#define OMAP_SRAM_SCRATCH_EMIF_SIZE    (SRAM_SCRATCH_SPACE_ADDR + 0x4)
+#define OMAP_SRAM_SCRATCH_EMIF_T_NUM   (SRAM_SCRATCH_SPACE_ADDR + 0xC)
+#define OMAP_SRAM_SCRATCH_EMIF_T_DEN   (SRAM_SCRATCH_SPACE_ADDR + 0x10)
+#define OMAP_SRAM_SCRATCH_PRCM_PTR      (SRAM_SCRATCH_SPACE_ADDR + 0x14)
+#define OMAP_SRAM_SCRATCH_DPLLS_PTR     (SRAM_SCRATCH_SPACE_ADDR + 0x18)
+#define OMAP_SRAM_SCRATCH_VCORES_PTR    (SRAM_SCRATCH_SPACE_ADDR + 0x1C)
+#define OMAP_SRAM_SCRATCH_SYS_CTRL     (SRAM_SCRATCH_SPACE_ADDR + 0x20)
+#define OMAP_SRAM_SCRATCH_BOOT_PARAMS  (SRAM_SCRATCH_SPACE_ADDR + 0x24)
+#define OMAP5_SRAM_SCRATCH_SPACE_END   (SRAM_SCRATCH_SPACE_ADDR + 0x28)
+
 #endif /* _OMAP_COMMON_H_ */
index 5b2cb61dc362e82bb256bc6c72bc6ab86e76464b..8ad9f66a5d50f2066a965e1b5ab3b94d0b2a79ee 100644 (file)
@@ -39,6 +39,7 @@ GLCOBJS       += div0.o
 SOBJS-y += crt0.o
 
 ifndef CONFIG_SPL_BUILD
+SOBJS-y += relocate.o
 ifndef CONFIG_SYS_GENERIC_BOARD
 COBJS-y        += board.o
 endif
index b545fb79bc1a185972719b6c5684df6ee3f029e5..8b1c8ed4bfcc92e5f5ac62970adf9c4676a44aa7 100644 (file)
@@ -27,7 +27,7 @@
 
 void  __flush_cache(unsigned long start, unsigned long size)
 {
-#if defined(CONFIG_OMAP2420) || defined(CONFIG_ARM1136)
+#if defined(CONFIG_ARM1136)
        void arm1136_cache_flush(void);
 
        arm1136_cache_flush();
index a9657d190f35923e66523247ee1bf32622088ace..a5bffb8da6df6e62645ea7aa9d403ac7853e1c64 100644 (file)
@@ -97,13 +97,13 @@ ENTRY(_main)
  * 'here' but relocated.
  */
 
-       ldr     sp, [r8, #GD_START_ADDR_SP]     /* r8 = gd->start_addr_sp */
+       ldr     sp, [r8, #GD_START_ADDR_SP]     /* sp = gd->start_addr_sp */
        bic     sp, sp, #7      /* 8-byte alignment for ABI compliance */
        ldr     r8, [r8, #GD_BD]                /* r8 = gd->bd */
        sub     r8, r8, #GD_SIZE                /* new GD is below bd */
 
        adr     lr, here
-       ldr     r0, [r8, #GD_RELOC_OFF]         /* lr = gd->start_addr_sp */
+       ldr     r0, [r8, #GD_RELOC_OFF]         /* r0 = gd->reloc_off */
        add     lr, lr, r0
        ldr     r0, [r8, #GD_RELOCADDR]         /* r0 = gd->relocaddr */
        b       relocate_code
diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
new file mode 100644 (file)
index 0000000..4446da9
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ *  relocate - common relocation function for ARM U-Boot
+ *
+ *  Copyright (c) 2013  Albert ARIBAUD <albert.u.boot@aribaud.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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <linux/linkage.h>
+
+/*
+ * void relocate_code(addr_moni)
+ *
+ * This function relocates the monitor code.
+ *
+ * NOTE:
+ * To prevent the code below from containing references with an R_ARM_ABS32
+ * relocation record type, we never refer to linker-defined symbols directly.
+ * Instead, we declare literals which contain their relative location with
+ * respect to relocate_code, and at run time, add relocate_code back to them.
+ */
+
+ENTRY(relocate_code)
+       mov     r6, r0  /* save addr of destination */
+
+       ldr     r0, =_start             /* r0 <- SRC &_start */
+       subs    r9, r6, r0              /* r9 <- relocation offset */
+       beq     relocate_done           /* skip relocation */
+       mov     r1, r6                  /* r1 <- scratch for copy loop */
+       adr     r7, relocate_code       /* r7 <- SRC &relocate_code */
+       ldr     r3, _image_copy_end_ofs /* r3 <- __image_copy_end local ofs */
+       add     r2, r7, r3              /* r2 <- SRC &__image_copy_end */
+
+copy_loop:
+       ldmia   r0!, {r10-r11}          /* copy from source address [r0]    */
+       stmia   r1!, {r10-r11}          /* copy to   target address [r1]    */
+       cmp     r0, r2                  /* until source end address [r2]    */
+       blo     copy_loop
+
+       /*
+        * fix .rel.dyn relocations
+        */
+       ldr     r10, _dynsym_start_ofs  /* r10 <- __dynsym_start local ofs */
+       add     r10, r10, r7            /* r10 <- SRC &__dynsym_start */
+       ldr     r2, _rel_dyn_start_ofs  /* r2 <- __rel_dyn_start local ofs */
+       add     r2, r2, r7              /* r2 <- SRC &__rel_dyn_start */
+       ldr     r3, _rel_dyn_end_ofs    /* r3 <- __rel_dyn_end local ofs */
+       add     r3, r3, r7              /* r3 <- SRC &__rel_dyn_end */
+fixloop:
+       ldr     r0, [r2]                /* r0 <- SRC location to fix up */
+       add     r0, r0, r9              /* r0 <- DST location to fix up */
+       ldr     r1, [r2, #4]
+       and     r7, r1, #0xff
+       cmp     r7, #23                 /* relative fixup? */
+       beq     fixrel
+       cmp     r7, #2                  /* absolute fixup? */
+       beq     fixabs
+       /* ignore unknown type of fixup */
+       b       fixnext
+fixabs:
+       /* absolute fix: set location to (offset) symbol value */
+       mov     r1, r1, LSR #4          /* r1 <- symbol index in .dynsym */
+       add     r1, r10, r1             /* r1 <- address of symbol in table */
+       ldr     r1, [r1, #4]            /* r1 <- symbol value */
+       add     r1, r1, r9              /* r1 <- relocated sym addr */
+       b       fixnext
+fixrel:
+       /* relative fix: increase location by offset */
+       ldr     r1, [r0]
+       add     r1, r1, r9
+fixnext:
+       str     r1, [r0]
+       add     r2, r2, #8              /* each rel.dyn entry is 8 bytes */
+       cmp     r2, r3
+       blo     fixloop
+
+relocate_done:
+
+       /* ARMv4- don't know bx lr but the assembler fails to see that */
+
+#ifdef __ARM_ARCH_4__
+        mov        pc, lr
+#else
+        bx        lr
+#endif
+
+_image_copy_end_ofs:
+       .word __image_copy_end - relocate_code
+_rel_dyn_start_ofs:
+       .word __rel_dyn_start - relocate_code
+_rel_dyn_end_ofs:
+       .word __rel_dyn_end - relocate_code
+_dynsym_start_ofs:
+       .word __dynsym_start - relocate_code
+
+ENDPROC(relocate_code)
index 1665a63a8120bba59b888d871b0c8b5fb2bfa61b..4c82b503d92ffabcc6eb558a50ae5d6dba8a5f7c 100644 (file)
@@ -1,143 +1 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1995, 1999, 2001, 2002 by Ralf Baechle
- */
-#ifndef _ASM_MIPS_ERRNO_H
-#define _ASM_MIPS_ERRNO_H
-
-/*
- * These first 34 error codes are from Linux 2.6, <asm-generic/errno-base.h>
- */
-#define        EPERM            1      /* Operation not permitted */
-#define        ENOENT           2      /* No such file or directory */
-#define        ESRCH            3      /* No such process */
-#define        EINTR            4      /* Interrupted system call */
-#define        EIO              5      /* I/O error */
-#define        ENXIO            6      /* No such device or address */
-#define        E2BIG            7      /* Argument list too long */
-#define        ENOEXEC          8      /* Exec format error */
-#define        EBADF            9      /* Bad file number */
-#define        ECHILD          10      /* No child processes */
-#define        EAGAIN          11      /* Try again */
-#define        ENOMEM          12      /* Out of memory */
-#define        EACCES          13      /* Permission denied */
-#define        EFAULT          14      /* Bad address */
-#define        ENOTBLK         15      /* Block device required */
-#define        EBUSY           16      /* Device or resource busy */
-#define        EEXIST          17      /* File exists */
-#define        EXDEV           18      /* Cross-device link */
-#define        ENODEV          19      /* No such device */
-#define        ENOTDIR         20      /* Not a directory */
-#define        EISDIR          21      /* Is a directory */
-#define        EINVAL          22      /* Invalid argument */
-#define        ENFILE          23      /* File table overflow */
-#define        EMFILE          24      /* Too many open files */
-#define        ENOTTY          25      /* Not a typewriter */
-#define        ETXTBSY         26      /* Text file busy */
-#define        EFBIG           27      /* File too large */
-#define        ENOSPC          28      /* No space left on device */
-#define        ESPIPE          29      /* Illegal seek */
-#define        EROFS           30      /* Read-only file system */
-#define        EMLINK          31      /* Too many links */
-#define        EPIPE           32      /* Broken pipe */
-#define        EDOM            33      /* Math argument out of domain of func */
-#define        ERANGE          34      /* Math result not representable */
-
-/*
- * These error numbers are intended to be MIPS ABI compatible
- */
-#define        ENOMSG          35      /* No message of desired type */
-#define        EIDRM           36      /* Identifier removed */
-#define        ECHRNG          37      /* Channel number out of range */
-#define        EL2NSYNC        38      /* Level 2 not synchronized */
-#define        EL3HLT          39      /* Level 3 halted */
-#define        EL3RST          40      /* Level 3 reset */
-#define        ELNRNG          41      /* Link number out of range */
-#define        EUNATCH         42      /* Protocol driver not attached */
-#define        ENOCSI          43      /* No CSI structure available */
-#define        EL2HLT          44      /* Level 2 halted */
-#define        EDEADLK         45      /* Resource deadlock would occur */
-#define        ENOLCK          46      /* No record locks available */
-#define        EBADE           50      /* Invalid exchange */
-#define        EBADR           51      /* Invalid request descriptor */
-#define        EXFULL          52      /* Exchange full */
-#define        ENOANO          53      /* No anode */
-#define        EBADRQC         54      /* Invalid request code */
-#define        EBADSLT         55      /* Invalid slot */
-#define        EDEADLOCK       56      /* File locking deadlock error */
-#define        EBFONT          59      /* Bad font file format */
-#define        ENOSTR          60      /* Device not a stream */
-#define        ENODATA         61      /* No data available */
-#define        ETIME           62      /* Timer expired */
-#define        ENOSR           63      /* Out of streams resources */
-#define        ENONET          64      /* Machine is not on the network */
-#define        ENOPKG          65      /* Package not installed */
-#define        EREMOTE         66      /* Object is remote */
-#define        ENOLINK         67      /* Link has been severed */
-#define        EADV            68      /* Advertise error */
-#define        ESRMNT          69      /* Srmount error */
-#define        ECOMM           70      /* Communication error on send */
-#define        EPROTO          71      /* Protocol error */
-#define        EDOTDOT         73      /* RFS specific error */
-#define        EMULTIHOP       74      /* Multihop attempted */
-#define        EBADMSG         77      /* Not a data message */
-#define        ENAMETOOLONG    78      /* File name too long */
-#define        EOVERFLOW       79      /* Value too large for defined data type */
-#define        ENOTUNIQ        80      /* Name not unique on network */
-#define        EBADFD          81      /* File descriptor in bad state */
-#define        EREMCHG         82      /* Remote address changed */
-#define        ELIBACC         83      /* Can not access a needed shared library */
-#define        ELIBBAD         84      /* Accessing a corrupted shared library */
-#define        ELIBSCN         85      /* .lib section in a.out corrupted */
-#define        ELIBMAX         86      /* Attempting to link in too many shared libraries */
-#define        ELIBEXEC        87      /* Cannot exec a shared library directly */
-#define        EILSEQ          88      /* Illegal byte sequence */
-#define        ENOSYS          89      /* Function not implemented */
-#define        ELOOP           90      /* Too many symbolic links encountered */
-#define        ERESTART        91      /* Interrupted system call should be restarted */
-#define        ESTRPIPE        92      /* Streams pipe error */
-#define        ENOTEMPTY       93      /* Directory not empty */
-#define        EUSERS          94      /* Too many users */
-#define        ENOTSOCK        95      /* Socket operation on non-socket */
-#define        EDESTADDRREQ    96      /* Destination address required */
-#define        EMSGSIZE        97      /* Message too long */
-#define        EPROTOTYPE      98      /* Protocol wrong type for socket */
-#define        ENOPROTOOPT     99      /* Protocol not available */
-#define        EPROTONOSUPPORT 120     /* Protocol not supported */
-#define        ESOCKTNOSUPPORT 121     /* Socket type not supported */
-#define        EOPNOTSUPP      122     /* Operation not supported on transport endpoint */
-#define        EPFNOSUPPORT    123     /* Protocol family not supported */
-#define        EAFNOSUPPORT    124     /* Address family not supported by protocol */
-#define        EADDRINUSE      125     /* Address already in use */
-#define        EADDRNOTAVAIL   126     /* Cannot assign requested address */
-#define        ENETDOWN        127     /* Network is down */
-#define        ENETUNREACH     128     /* Network is unreachable */
-#define        ENETRESET       129     /* Network dropped connection because of reset */
-#define        ECONNABORTED    130     /* Software caused connection abort */
-#define        ECONNRESET      131     /* Connection reset by peer */
-#define        ENOBUFS         132     /* No buffer space available */
-#define        EISCONN         133     /* Transport endpoint is already connected */
-#define        ENOTCONN        134     /* Transport endpoint is not connected */
-#define        EUCLEAN         135     /* Structure needs cleaning */
-#define        ENOTNAM         137     /* Not a XENIX named type file */
-#define        ENAVAIL         138     /* No XENIX semaphores available */
-#define        EISNAM          139     /* Is a named type file */
-#define        EREMOTEIO       140     /* Remote I/O error */
-#define EINIT          141     /* Reserved */
-#define EREMDEV                142     /* Error 142 */
-#define        ESHUTDOWN       143     /* Cannot send after transport endpoint shutdown */
-#define        ETOOMANYREFS    144     /* Too many references: cannot splice */
-#define        ETIMEDOUT       145     /* Connection timed out */
-#define        ECONNREFUSED    146     /* Connection refused */
-#define        EHOSTDOWN       147     /* Host is down */
-#define        EHOSTUNREACH    148     /* No route to host */
-#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
-#define        EALREADY        149     /* Operation already in progress */
-#define        EINPROGRESS     150     /* Operation now in progress */
-#define        ESTALE          151     /* Stale NFS file handle */
-#define ECANCELED      158     /* AIO operation canceled */
-
-#endif /* _ASM_MIPS_ERRNO_H */
+#include <asm-generic/errno.h>
index 3864c804c0500b2322fe25fb0ca296f728130fee..50a882ca5a2df44036ab92d469162a5a9899e5aa 100644 (file)
@@ -184,19 +184,19 @@ extern void iounmap(void *addr);
  * 24-31 on SNI.
  * XXX more SNI hacks.
  */
-#define readb(addr) (*(volatile unsigned char *)(addr))
-#define readw(addr) __ioswab16((*(volatile unsigned short *)(addr)))
-#define readl(addr) __ioswab32((*(volatile unsigned int *)(addr)))
-#define __raw_readb readb
-#define __raw_readw readw
-#define __raw_readl readl
-
-#define writeb(b,addr) (*(volatile unsigned char *)(addr)) = (b)
-#define writew(b,addr) (*(volatile unsigned short *)(addr)) = (__ioswab16(b))
-#define writel(b,addr) (*(volatile unsigned int *)(addr)) = (__ioswab32(b))
-#define __raw_writeb writeb
-#define __raw_writew writew
-#define __raw_writel writel
+#define __raw_readb(addr) (*(volatile unsigned char *)(addr))
+#define __raw_readw(addr) (*(volatile unsigned short *)(addr))
+#define __raw_readl(addr) (*(volatile unsigned int *)(addr))
+#define readb(addr) __raw_readb((addr))
+#define readw(addr) __ioswab16(__raw_readw((addr)))
+#define readl(addr) __ioswab32(__raw_readl((addr)))
+
+#define __raw_writeb(b, addr) (*(volatile unsigned char *)(addr)) = (b)
+#define __raw_writew(b, addr) (*(volatile unsigned short *)(addr)) = (b)
+#define __raw_writel(b, addr) (*(volatile unsigned int *)(addr)) = (b)
+#define writeb(b, addr) __raw_writeb((b), (addr))
+#define writew(b, addr) __raw_writew(__ioswab16(b), (addr))
+#define writel(b, addr) __raw_writel(__ioswab32(b), (addr))
 
 #define memset_io(a,b,c)       memset((void *)(a),(b),(c))
 #define memcpy_fromio(a,b,c)   memcpy((a),(void *)(b),(c))
index b53232fd3692cb885c8af372b12d9e13157cadd9..4f4c9ecfea894c1babfc5540c9e97a81d216a31c 100644 (file)
@@ -38,7 +38,6 @@ COBJS-y += serial.o
 COBJS-y += speed.o
 COBJS-$(CONFIG_FSL_DIU_FB) += diu.o
 COBJS-$(CONFIG_CMD_IDE) += ide.o
-COBJS-$(CONFIG_IIM) += iim.o
 COBJS-$(CONFIG_PCI) += pci.o
 
 # Stub implementations of cache management functions for USB
index b308cb4be3e18a7d67d6744fb8bcae40de491c82..0e20ded4c79311948ddab7743cdc2514f386c090 100644 (file)
@@ -201,7 +201,7 @@ void cpu_init_f (volatile immap_t * im)
         */
        out_be32(&im->clk.sccr[0], SCCR1_CLOCKS_EN);
        out_be32(&im->clk.sccr[1], SCCR2_CLOCKS_EN);
-#if defined(CONFIG_IIM) || defined(CONFIG_CMD_FUSE)
+#if defined(CONFIG_FSL_IIM) || defined(CONFIG_CMD_FUSE)
        setbits_be32(&im->clk.sccr[1], CLOCK_SCCR2_IIM_EN);
 #endif
 }
diff --git a/arch/powerpc/cpu/mpc512x/iim.c b/arch/powerpc/cpu/mpc512x/iim.c
deleted file mode 100644 (file)
index abec8f6..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright 2008 Silicon Turnkey Express, Inc.
- * Martha Marx <mmarx@silicontkx.com>
- *
- * ADS5121 IIM (Fusebox) Interface
- *
- * 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 <command.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_CMD_FUSE
-
-DECLARE_GLOBAL_DATA_PTR;
-
-static char cur_bank = '1';
-
-char *iim_err_msg(u32 err)
-{
-       static char *IIM_errs[] = {
-               "Parity Error in cache",
-               "Explicit Sense Cycle Error",
-               "Write to Locked Register Error",
-               "Read Protect Error",
-               "Override Protect Error",
-               "Write Protect Error"};
-
-       int i;
-
-       if (!err)
-               return "";
-       for (i = 1; i < 8; i++)
-               if (err & (1 << i))
-                       printf("IIM - %s\n", IIM_errs[i-1]);
-       return "";
-}
-
-int in_range(int n, int min, int max, char *err, char *usg)
-{
-       if (n > max || n < min) {
-               printf(err);
-               printf("Usage:\n%s\n", usg);
-               return 0;
-       }
-       return 1;
-}
-
-int ads5121_fuse_read(int bank, int fstart, int num)
-{
-       iim512x_t *iim = &((immap_t *) CONFIG_SYS_IMMR)->iim;
-       u32 *iim_fb, dummy;
-       int f, ctr;
-
-       out_be32(&iim->err, in_be32(&iim->err));
-       if (bank == 0)
-               iim_fb = (u32 *)&(iim->fbac0);
-       else
-               iim_fb = (u32 *)&(iim->fbac1);
-/* try a read to see if Read Protect is set */
-       dummy = in_be32(&iim_fb[0]);
-       if (in_be32(&iim->err) & IIM_ERR_RPE) {
-               printf("\tRead protect fuse is set\n");
-               out_be32(&iim->err, IIM_ERR_RPE);
-               return 0;
-       }
-       printf("Reading Bank %d cache\n", bank);
-       for (f = fstart, ctr = 0; num > 0; ctr++, num--, f++) {
-               if (ctr % 4 == 0)
-                       printf("F%2d:", f);
-               printf("\t%#04x", (u8)(iim_fb[f]));
-               if (ctr % 4 == 3)
-                       printf("\n");
-       }
-       if (ctr % 4 != 0)
-               printf("\n");
-}
-
-int ads5121_fuse_override(int bank, int f, u8 val)
-{
-       iim512x_t *iim = &((immap_t *) CONFIG_SYS_IMMR)->iim;
-       u32 *iim_fb;
-       u32 iim_stat;
-       int i;
-
-       out_be32(&iim->err, in_be32(&iim->err));
-       if (bank == 0)
-               iim_fb = (u32 *)&(iim->fbac0);
-       else
-               iim_fb = (u32 *)&(iim->fbac1);
-/* try a read to see if Read Protect is set */
-       iim_stat = in_be32(&iim_fb[0]);
-       if (in_be32(&iim->err) & IIM_ERR_RPE) {
-               printf("Read protect fuse is set on bank %d;"
-                       "Override protect may also be set\n", bank);
-               printf("An attempt will be made to override\n");
-               out_be32(&iim->err, IIM_ERR_RPE);
-       }
-       if (iim_stat & IIM_FBAC_FBOP) {
-               printf("Override protect fuse is set on bank %d\n", bank);
-               return 1;
-       }
-       if (f > IIM_FMAX) /* reset the entire bank */
-               for (i = 0; i < IIM_FMAX + 1; i++)
-                       out_be32(&iim_fb[i],  0);
-       else
-               out_be32(&iim_fb[f], val);
-       return 0;
-}
-
-int ads5121_fuse_prog(cmd_tbl_t *cmdtp, int bank, char *fuseno_bitno)
-{
-       iim512x_t *iim = &((immap_t *) CONFIG_SYS_IMMR)->iim;
-       int f, i, bitno;
-       u32 stat, err;
-
-       f = simple_strtol(fuseno_bitno, NULL, 10);
-       if (f == 0 && fuseno_bitno[0] != '0')
-               f = -1;
-       if (!in_range(f, 0, IIM_FMAX,
-               "<frow> must be between 0-31\n\n", cmdtp->usage))
-               return 1;
-       bitno = -1;
-       for (i = 0; i < 6; i++) {
-               if (fuseno_bitno[i] == '_') {
-                       bitno = simple_strtol(&(fuseno_bitno[i+1]), NULL, 10);
-                       if (bitno == 0 && fuseno_bitno[i+1] != '0')
-                               bitno = -1;
-                       break;
-               }
-       }
-       if (!in_range(bitno, 0, 7, "Bit number ranges from 0-7\n"
-               "Example of <frow_bitno>: \"18_4\" sets bit 4 of row 18\n",
-               cmdtp->usage))
-               return 1;
-       out_be32(&iim->err, in_be32(&iim->err));
-       out_be32(&iim->prg_p, IIM_PRG_P_SET);
-       out_be32(&iim->ua, IIM_SET_UA(bank, f));
-       out_be32(&iim->la, IIM_SET_LA(f, bitno));
-#ifdef DEBUG
-       printf("Programming disabled with DEBUG defined \n");
-       printf(""Set up to pro
-       printf("iim.ua = %x; iim.la = %x\n", iim->ua, iim->la);
-#else
-       out_be32(&iim->fctl, IIM_FCTL_PROG_PULSE | IIM_FCTL_PROG);
-       do
-               udelay(20);
-       while ((stat = in_be32(&iim->stat)) & IIM_STAT_BUSY);
-       out_be32(&iim->prg_p, 0);
-       err = in_be32(&iim->err);
-       if (stat & IIM_STAT_PRGD) {
-               if (!(err & (IIM_ERR_WPE | IIM_ERR_WPE))) {
-                       printf("Fuse is successfully set");
-                       if (err)
-                               printf(" - however there are other errors");
-                       printf("\n");
-               }
-               iim->stat = 0;
-       }
-       if (err) {
-               iim_err_msg(err);
-               out_be32(&iim->err, in_be32(&iim->err));
-       }
-#endif
-}
-
-int ads5121_fuse_sense(int bank, int fstart, int num)
-{
-       iim512x_t *iim = &((immap_t *) CONFIG_SYS_IMMR)->iim;
-       u32 iim_fbac;
-       u32 stat, err, err_hold = 0;
-       int f, ctr;
-
-       out_be32(&iim->err, in_be32(&iim->err));
-       if (bank == 0)
-               iim_fbac = in_be32(&iim->fbac0);
-       else
-               iim_fbac = in_be32(&iim->fbac1);
-       if (iim_fbac & IIM_FBAC_FBESP) {
-               printf("\tSense Protect disallows this operation\n");
-               out_be32(&iim->err, IIM_FBAC_FBESP);
-               return 1;
-       }
-       err = in_be32(&iim->err);
-       if (err) {
-               iim_err_msg(err);
-               err_hold |= err;
-       }
-       if (err & IIM_ERR_RPE)
-               printf("\tRead protect fuse is set; "
-                       "Sense Protect may be set but will be attempted\n");
-       if (err)
-               out_be32(&iim->err, err);
-       printf("Sensing fuse(s) on Bank %d\n", bank);
-       for (f = fstart, ctr = 0; num > 0; ctr++, f++, num--) {
-               out_be32(&iim->ua, IIM_SET_UA(bank, f));
-               out_be32(&iim->la, IIM_SET_LA(f, 0));
-               out_be32(&iim->fctl,  IIM_FCTL_ESNS_N);
-               do
-                       udelay(20);
-               while ((stat = in_be32(&iim->stat)) & IIM_STAT_BUSY);
-               err = in_be32(&iim->err);
-               if (err & IIM_ERR_SNSE) {
-                       iim_err_msg(err);
-                       out_be32(&iim->err, IIM_ERR_SNSE);
-                       return 1;
-               }
-               if (stat & IIM_STAT_SNSD) {
-                       out_be32(&iim->stat, 0);
-                       if (ctr % 4 == 0)
-                               printf("F%2d:", f);
-                       printf("\t%#04x", (u8)iim->sdat);
-                       if (ctr % 4 == 3)
-                               printf("\n");
-               }
-               if (err) {
-                       err_hold |= err;
-                       out_be32(&iim->err, err);
-               }
-       }
-       if (ctr % 4 != 0)
-               printf("\n");
-       if (err_hold)
-               iim_err_msg(err_hold);
-
-       return 0;
-}
-
-int ads5121_fuse_stat(int bank)
-{
-       iim512x_t *iim = &((immap_t *) CONFIG_SYS_IMMR)->iim;
-       u32 iim_fbac;
-       u32 err;
-
-       out_be32(&iim->err, in_be32(&iim->err));
-       if (bank == 0)
-               iim_fbac = in_be32(&iim->fbac0);
-       else
-               iim_fbac = in_be32(&iim->fbac1);
-       err = in_be32(&iim->err);
-       if (err)
-               iim_err_msg(err);
-       if (err & IIM_ERR_RPE  || iim_fbac & IIM_FBAC_FBRP) {
-               if (iim_fbac == 0)
-                       printf("Since protection settings can't be read - "
-                               "try sensing fuse row 0;\n");
-               return 0;
-       }
-       if (iim_fbac & IIM_PROTECTION)
-               printf("Protection Fuses Bank %d = %#04x:\n", bank, iim_fbac);
-       else if (!(err & IIM_ERR_RPE))
-               printf("No Protection fuses are set\n");
-       if (iim_fbac & IIM_FBAC_FBWP)
-               printf("\tWrite Protect fuse is set\n");
-       if (iim_fbac & IIM_FBAC_FBOP)
-               printf("\tOverride Protect fuse is set\n");
-       if (iim_fbac & IIM_FBAC_FBESP)
-               printf("\tSense Protect Fuse is set\n");
-       out_be32(&iim->err, in_be32(&iim->err));
-
-       return 0;
-}
-
-int do_ads5121_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-       int frow, n, v, bank;
-
-       if (cur_bank == '0')
-               bank = 0;
-       else
-               bank = 1;
-
-       switch (argc) {
-       case 0:
-       case 1:
-               printf("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       case 2:
-               if (strncmp(argv[1], "stat", 4) == 0)
-                       return ads5121_fuse_stat(bank);
-               if (strncmp(argv[1], "read", 4) == 0)
-                       return ads5121_fuse_read(bank, 0, IIM_FMAX + 1);
-               if (strncmp(argv[1], "sense", 5) == 0)
-                       return ads5121_fuse_sense(bank, 0, IIM_FMAX + 1);
-               if (strncmp(argv[1], "ovride", 6) == 0)
-                       return ads5121_fuse_override(bank, IIM_FMAX + 1, 0);
-               if (strncmp(argv[1], "bank", 4) == 0) {
-                       printf("Active Fuse Bank is %c\n", cur_bank);
-                       return 0;
-               }
-               printf("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       case 3:
-               if (strncmp(argv[1], "bank", 4) == 0) {
-                       if (argv[2][0] == '0')
-                               cur_bank = '0';
-                       else if (argv[2][0] == '1')
-                               cur_bank = '1';
-                       else {
-                               printf("Usage:\n%s\n", cmdtp->usage);
-                               return 1;
-                       }
-
-                       printf("Setting Active Fuse Bank to %c\n", cur_bank);
-                       return 0;
-               }
-               if (strncmp(argv[1], "prog", 4) == 0)
-                       return ads5121_fuse_prog(cmdtp, bank, argv[2]);
-
-               frow = (int)simple_strtol(argv[2], NULL, 10);
-               if (frow == 0 && argv[2][0] != '0')
-                       frow = -1;
-               if (!in_range(frow, 0, IIM_FMAX,
-                       "<frow> must be between 0-31\n\n", cmdtp->usage))
-                       return 1;
-               if (strncmp(argv[1], "read", 4) == 0)
-                       return ads5121_fuse_read(bank, frow, 1);
-               if (strncmp(argv[1], "ovride", 6) == 0)
-                       return ads5121_fuse_override(bank, frow, 0);
-               if (strncmp(argv[1], "sense", 5) == 0)
-                       return ads5121_fuse_sense(bank, frow, 1);
-               printf("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       case 4:
-               frow = (int)simple_strtol(argv[2], NULL, 10);
-               if (frow == 0 && argv[2][0] != '0')
-                       frow = -1;
-               if (!in_range(frow, 0, IIM_FMAX,
-                       "<frow> must be between 0-31\n\n", cmdtp->usage))
-                       return 1;
-               if (strncmp(argv[1], "read", 4) == 0) {
-                       n = (int)simple_strtol(argv[3], NULL, 10);
-                       if (!in_range(frow + n, frow + 1, IIM_FMAX + 1,
-                               "<frow>+<n> must be between 1-32\n\n",
-                               cmdtp->usage))
-                               return 1;
-                       return ads5121_fuse_read(bank, frow, n);
-               }
-               if (strncmp(argv[1], "ovride", 6) == 0) {
-                       v = (int)simple_strtol(argv[3], NULL, 10);
-                       return ads5121_fuse_override(bank, frow, v);
-               }
-               if (strncmp(argv[1], "sense", 5) == 0) {
-                       n = (int)simple_strtol(argv[3], NULL, 10);
-                       if (!in_range(frow + n, frow + 1, IIM_FMAX + 1,
-                               "<frow>+<n> must be between 1-32\n\n",
-                               cmdtp->usage))
-                               return 1;
-                       return ads5121_fuse_sense(bank, frow, n);
-               }
-               printf("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       default: /* at least 5 args */
-               printf("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       }
-}
-
-U_BOOT_CMD(
-       fuse, CONFIG_SYS_MAXARGS, 0, do_ads5121_fuse,
-       "   - Read, Sense, Override or Program Fuses\n",
-       "bank <n>               - sets active Fuse Bank to 0 or 1\n"
-       "                           no args shows current active bank\n"
-       "fuse stat              - print active fuse bank's protection status\n"
-       "fuse read [<frow> [<n>]] - print <n> fuse rows starting at <frow>\n"
-       "                           no args to print entire bank's fuses\n"
-       "fuse ovride [<frow> [<v>]]- override fuses at <frow> with <v>\n"
-       "                           no <v> defaults to 0 for the row\n"
-       "                           no args resets entire bank to 0\n"
-       "                         NOTE - settings persist until hard reset\n"
-       "fuse sense [<frow>]    - senses current fuse at <frow>\n"
-       "                           no args for entire bank\n"
-       "fuse prog <frow_bit>   - program fuse at row <frow>, bit <_bit>\n"
-       "                           <frow> is 0-31, <bit> is 0-7; eg. 13_2 \n"
-       "                         WARNING - this is permanent"
-);
-#endif /* CONFIG_CMD_FUSE */
index 22cef3e9839e96101b9bba3212e7068bb6d93acc..484bd177451c3a36b1ba5c7c30152fe3c8275b0f 100644 (file)
@@ -43,7 +43,7 @@ m8260_cpm_reset(void)
        } while ((immr->im_cpm.cp_cpcr & CPM_CR_FLG) && ++count < 1000000);
 
 #ifdef CONFIG_HARD_I2C
-       *((unsigned short*)(&immr->im_dprambase[PROFF_I2C_BASE])) = 0;
+       immr->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] = 0;
 #endif
 }
 
index f8bc5a9834b861b54e25f9391ddea6d08cd8949c..22e1a23a2adcedae47df34f5a1a67f4bec8dae40 100644 (file)
@@ -106,7 +106,7 @@ int checkcpu (void)
         * in the mask.
         */
        m = immr & (IMMR_PARTNUM_MSK | IMMR_MASKNUM_MSK);
-       k = *((ushort *) & immap->im_dprambase[PROFF_REVNUM]);
+       k = immap->im_dprambase16[PROFF_REVNUM / sizeof(u16)];
 
        switch (m) {
        case 0x0000:
index b720b1fb882b1b4261939a18479a08e2b2243a2d..e2341e9c39c46cff86594d7f4e5ad15f8846d84a 100644 (file)
@@ -221,14 +221,14 @@ void i2c_init(int speed, int slaveadd)
        i2c_init_board();
 #endif
 
-       dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE]));
+       dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
        if (dpaddr == 0) {
                /* need to allocate dual port ram */
                dpaddr = m8260_cpm_dpalloc(64 +
                                        (NUM_RX_BDS * sizeof(I2C_BD)) +
                                        (NUM_TX_BDS * sizeof(I2C_BD)) +
                                        MAX_TX_SPACE, 64);
-               *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE])) =
+               immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)] =
                        dpaddr;
        }
 
@@ -305,7 +305,7 @@ void i2c_newio(i2c_state_t *state)
 
        debug("[I2C] i2c_newio\n");
 
-       dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE]));
+       dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
        iip = (iic_t *)&immap->im_dprambase[dpaddr];
        state->rx_idx = 0;
        state->tx_idx = 0;
@@ -480,7 +480,7 @@ int i2c_doio(i2c_state_t *state)
                return I2CERR_QUEUE_EMPTY;
        }
 
-       dpaddr = *((unsigned short *)(&immap->im_dprambase[PROFF_I2C_BASE]));
+       dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
        iip = (iic_t *)&immap->im_dprambase[dpaddr];
        iip->iic_rbptr = iip->iic_rbase;
        iip->iic_tbptr = iip->iic_tbase;
index feba1f63d260b3a1465e6a2f742b7db23df94a8e..9410e4c3b2bf7bf2ce57598deec529b87419b48d 100644 (file)
@@ -105,7 +105,7 @@ static int mpc8260_smc_serial_init(void)
        /* initialize pointers to SMC */
 
        sp = (smc_t *) &(im->im_smc[SMC_INDEX]);
-       *(ushort *)(&im->im_dprambase[PROFF_SMC_BASE]) = PROFF_SMC;
+       im->im_dprambase16[PROFF_SMC_BASE / sizeof(u16)] = PROFF_SMC;
        up = (smc_uart_t *)&im->im_dprambase[PROFF_SMC];
 
        /* Disable transmitter/receiver. */
@@ -331,7 +331,7 @@ kgdb_serial_init (void)
        /* initialize pointers to SMC */
 
        sp = (smc_t *) &(im->im_smc[KGDB_SMC_INDEX]);
-       *(ushort *)(&im->im_dprambase[KGDB_PROFF_SMC_BASE]) = KGDB_PROFF_SMC;
+       im->im_dprambase16[KGDB_PROFF_SMC_BASE / sizeof(u16)] = KGDB_PROFF_SMC;
        up = (smc_uart_t *)&im->im_dprambase[KGDB_PROFF_SMC];
 
        /* Disable transmitter/receiver. */
index dc98ea73f2673d64c2f36050e18282f889378306..01b492e8e48a1d8c9dfe1f929aa88dfee16fd021 100644 (file)
@@ -146,7 +146,7 @@ void spi_init_f (void)
        immr = (immap_t *)  CONFIG_SYS_IMMR;
        cp   = (cpm8260_t *) &immr->im_cpm;
 
-       *(ushort *)(&immr->im_dprambase[PROFF_SPI_BASE]) = PROFF_SPI;
+       immr->im_dprambase16[PROFF_SPI_BASE / sizeof(u16)] = PROFF_SPI;
        spi  = (spi_t *)&immr->im_dprambase[PROFF_SPI];
 
 /* 1 */
index 6e5aec26e03191d024c8da70f1b9df5ff6f49131..2318064a4786fbb31a408dba45c2ebd651f554ce 100644 (file)
@@ -88,6 +88,7 @@ COBJS-$(CONFIG_PPC_B4420)     += ddr-gen3.o
 COBJS-$(CONFIG_PPC_B4860)      += ddr-gen3.o
 COBJS-$(CONFIG_BSC9131)                += ddr-gen3.o
 COBJS-$(CONFIG_BSC9132)                += ddr-gen3.o
+COBJS-$(CONFIG_PPC_T1040)      += ddr-gen3.o
 
 COBJS-$(CONFIG_CPM2)   += ether_fcc.o
 COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
@@ -106,6 +107,7 @@ COBJS-$(CONFIG_PPC_T4240) += t4240_ids.o
 COBJS-$(CONFIG_PPC_T4160) += t4240_ids.o
 COBJS-$(CONFIG_PPC_B4420) += b4860_ids.o
 COBJS-$(CONFIG_PPC_B4860) += b4860_ids.o
+COBJS-$(CONFIG_PPC_T1040) += t1040_ids.o
 
 COBJS-$(CONFIG_QE)     += qe_io.o
 COBJS-$(CONFIG_CPM2)   += serial_scc.o
@@ -143,6 +145,7 @@ COBJS-$(CONFIG_PPC_T4160) += t4240_serdes.o
 COBJS-$(CONFIG_PPC_B4420) += b4860_serdes.o
 COBJS-$(CONFIG_PPC_B4860) += b4860_serdes.o
 COBJS-$(CONFIG_BSC9132) += bsc9132_serdes.o
+COBJS-$(CONFIG_PPC_T1040) += t1040_serdes.o
 
 COBJS-y        += cpu.o
 COBJS-y        += cpu_init.o
index 48e6a05d38d1d5b37dfcf09b045b3a96834fd868..4067f053757a66cf21e2868ffd0808d40593153f 100644 (file)
@@ -337,7 +337,7 @@ int enable_cluster_l2(void)
                        while ((in_be32(&l2cache->l2csr0)
                                & (L2CSR0_L2FI|L2CSR0_L2LFC)) != 0)
                                        ;
-                       out_be32(&l2cache->l2csr0, L2CSR0_L2E);
+                       out_be32(&l2cache->l2csr0, L2CSR0_L2E|L2CSR0_L2PE|L2CSR0_L2REP_MODE);
                }
                i++;
        } while (!(cluster & TP_CLUSTER_EOC));
index dacfdd15ea8b01c0acb42a40b27ac0a14c4fdc52..234fde48465bfcedb2eefb22ff4625f2a9a64cd3 100644 (file)
@@ -180,12 +180,5 @@ void cpu_init_early_f(void)
 
        invalidate_tlb(1);
 
-#if defined(CONFIG_SECURE_BOOT)
-       /* Disable the TLBs created by ISBC */
-       for (i = CONFIG_SYS_ISBC_START_TLB;
-            i < CONFIG_SYS_ISBC_START_TLB + CONFIG_SYS_ISBC_NUM_TLBS; i++)
-                       disable_tlb(i);
-#endif
-
        init_tlbs();
 }
index 43d4836303d4f02149ce6f9f117dbf5e395be17b..861c8e028726eb02f160a8f14f72ba19e4194865 100644 (file)
@@ -80,6 +80,8 @@ int cpu_status(int nr)
        if (nr == id) {
                table = (u32 *)&__spin_table;
                printf("table base @ 0x%p\n", table);
+       } else if (is_core_disabled(nr)) {
+               puts("Disabled\n");
        } else {
                table = (u32 *)&__spin_table + nr * NUM_BOOT_ENTRY;
                printf("Running on cpu %d\n", id);
index 467ea1045df7628e4862b968428b688a15700957..a4a21b037c6a076512134aa0809515a23f2b9c76 100644 (file)
@@ -154,16 +154,12 @@ __secondary_start_page:
        ori     r3,r3,toreset(__spin_table_addr)@l
        lwz     r3,0(r3)
 
-       /*
-        * r10 has the base address for the entry.
-        * we cannot access it yet before setting up a new TLB
-        */
        mfspr   r0,SPRN_PIR
 #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
 /*
  * PIR definition for Chassis 2
  * 0-17 Reserved (logic 0s)
- * 8-19 CHIP_ID,    2'b00      - SoC 1
+ * 18-19 CHIP_ID,    2'b00      - SoC 1
  *                  all others - reserved
  * 20-24 CLUSTER_ID 5'b00000   - CCM 1
  *                  all others - reserved
@@ -177,32 +173,33 @@ __secondary_start_page:
  *                       2'b11 - core 3
  * 29-31 THREAD_ID       3'b000 - thread 0
  *                       3'b001 - thread 1
+ *
+ * Power-on PIR increments threads by 0x01, cores within a cluster by 0x08
+ * and clusters by 0x20.
+ *
+ * We renumber PIR so that all threads in the system are consecutive.
  */
-       rlwinm  r4,r0,29,25,31
+
+       rlwinm  r8,r0,29,0x03   /* r8 = core within cluster */
+       srwi    r10,r0,5        /* r10 = cluster */
+
+       mulli   r5,r10,CONFIG_SYS_FSL_CORES_PER_CLUSTER
+       add     r5,r5,r8        /* for spin table index */
+       mulli   r4,r5,CONFIG_SYS_FSL_THREADS_PER_CORE   /* for PIR */
 #elif  defined(CONFIG_E500MC)
        rlwinm  r4,r0,27,27,31
+       mr      r5,r4
 #else
        mr      r4,r0
+       mr      r5,r4
 #endif
-       slwi    r8,r4,6 /* spin table is padded to 64 byte */
-       add     r10,r3,r8
 
-#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
-       mfspr   r0,SPRN_PIR
        /*
-        * core 0 thread 0: pir reset value 0x00, new pir 0
-        * core 0 thread 1: pir reset value 0x01, new pir 1
-        * core 1 thread 0: pir reset value 0x08, new pir 2
-        * core 1 thread 1: pir reset value 0x09, new pir 3
-        * core 2 thread 0: pir reset value 0x10, new pir 4
-        * core 2 thread 1: pir reset value 0x11, new pir 5
-        * etc.
-        *
-        * Only thread 0 of each core will be running, updating PIR doesn't
-        * need to deal with the thread bits.
+        * r10 has the base address for the entry.
+        * we cannot access it yet before setting up a new TLB
         */
-       rlwinm  r4,r0,30,24,30
-#endif
+       slwi    r8,r5,6 /* spin table is padded to 64 byte */
+       add     r10,r3,r8
 
        mtspr   SPRN_PIR,r4     /* write to PIR register */
 
index f00b1abe63f1f78d5c60b3f1300fad5919b09ada..a4d6e9cc73849fe97f73394d8844f2d0a56fd676 100644 (file)
@@ -112,23 +112,20 @@ void get_sys_info (sys_info_t * sysInfo)
 #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
        /*
         * Each cluster has up to 4 cores, sharing the same PLL selection.
-        * The cluster assignment is fixed per SoC. There is no way identify the
-        * assignment so far, presuming the "first configuration" which is to
-        * fill the lower cluster group first before moving up to next group.
-        * PLL1, PLL2, PLL3 are cluster group A, feeding core 0~3 on cluster 1
-        * and core 4~7 on cluster 2
-        * PLL4, PLL5, PLL6 are cluster group B, feeding core 8~11 on cluster 3
-        * and core 12~15 on cluster 4 if existing
+        * The cluster assignment is fixed per SoC. PLL1, PLL2, PLL3 are
+        * cluster group A, feeding cores on cluster 1 and cluster 2.
+        * PLL4, PLL5, PLL6 are cluster group B, feeding cores on cluster 3
+        * and cluster 4 if existing.
         */
        for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
-               u32 c_pll_sel = (in_be32(&clk->clkc0csr + (cpu / 4) * 8) >> 27)
+               int cluster = fsl_qoriq_core_to_cluster(cpu);
+               u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
                                & 0xf;
                u32 cplx_pll = core_cplx_PLL[c_pll_sel];
                if (cplx_pll > 3)
                        printf("Unsupported architecture configuration"
                                " in function %s\n", __func__);
-               cplx_pll += (cpu / 8) * 3;
-
+               cplx_pll += (cluster / 2) * 3;
                sysInfo->freqProcessor[cpu] =
                         freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel];
        }
@@ -240,7 +237,8 @@ void get_sys_info (sys_info_t * sysInfo)
 #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
 
        for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
-               u32 c_pll_sel = (in_be32(&clk->clkc0csr + cpu*8) >> 27) & 0xf;
+               u32 c_pll_sel = (in_be32(&clk->clkcsr[cpu].clkcncsr) >> 27)
+                               & 0xf;
                u32 cplx_pll = core_cplx_PLL[c_pll_sel];
 
                sysInfo->freqProcessor[cpu] =
index 5542d0afb24983c4b4ce44ecef6af9a551fca523..4f0480b768960e9d0913bd1ae6fba8d36e920476 100644 (file)
@@ -734,7 +734,8 @@ enable_l2_cluster_l2:
        isync
        and.    r1, r0, r4
        bne     1b
-       lis     r4, L2CSR0_L2E@h
+       lis     r4, (L2CSR0_L2E|L2CSR0_L2PE)@h
+       ori     r4, r4, (L2CSR0_L2REP_MODE)@l
        sync
        stw     r4, 0(r3)       /* enable L2 */
 delete_ccsr_l2_tlb:
@@ -1905,6 +1906,7 @@ unlock_ram_in_cache:
        slwi    r4,r4,(10 - 1 - L1_CACHE_SHIFT)
        mtctr   r4
 1:     dcbi    r0,r3
+       dcblc   r0,r3
        addi    r3,r3,CONFIG_SYS_CACHELINE_SIZE
        bdnz    1b
        sync
diff --git a/arch/powerpc/cpu/mpc85xx/t1040_ids.c b/arch/powerpc/cpu/mpc85xx/t1040_ids.c
new file mode 100644 (file)
index 0000000..ed61599
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2012 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/fsl_portals.h>
+#include <asm/fsl_liodn.h>
+
+#ifdef CONFIG_SYS_DPAA_QBMAN
+struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {
+       /* dqrr liodn, frame data liodn, liodn off, sdest */
+       SET_QP_INFO(1, 27, 1, 0),
+       SET_QP_INFO(2, 28, 1, 0),
+       SET_QP_INFO(3, 29, 1, 1),
+       SET_QP_INFO(4, 30, 1, 1),
+       SET_QP_INFO(5, 31, 1, 2),
+       SET_QP_INFO(6, 32, 1, 2),
+       SET_QP_INFO(7, 33, 1, 3),
+       SET_QP_INFO(8, 34, 1, 3),
+       SET_QP_INFO(9, 35, 1, 0),
+       SET_QP_INFO(10, 36, 1, 0),
+       SET_QP_INFO(11, 37, 1, 1),
+       SET_QP_INFO(12, 38, 1, 1),
+       SET_QP_INFO(13, 39, 1, 2),
+       SET_QP_INFO(14, 40, 1, 2),
+       SET_QP_INFO(15, 41, 1, 3),
+       SET_QP_INFO(16, 42, 1, 3),
+       SET_QP_INFO(17, 43, 1, 0),
+       SET_QP_INFO(18, 44, 1, 0),
+       SET_QP_INFO(19, 45, 1, 1),
+       SET_QP_INFO(20, 46, 1, 1),
+       SET_QP_INFO(21, 47, 1, 2),
+       SET_QP_INFO(22, 48, 1, 2),
+       SET_QP_INFO(23, 49, 1, 3),
+       SET_QP_INFO(24, 50, 1, 3),
+       SET_QP_INFO(25, 51, 1, 0),
+};
+#endif
+
+struct srio_liodn_id_table srio_liodn_tbl[] = {
+       SET_SRIO_LIODN_1(1, 307),
+       SET_SRIO_LIODN_1(2, 387),
+};
+int srio_liodn_tbl_sz = ARRAY_SIZE(srio_liodn_tbl);
+
+struct liodn_id_table liodn_tbl[] = {
+#ifdef CONFIG_SYS_DPAA_QBMAN
+       SET_QMAN_LIODN(62),
+       SET_BMAN_LIODN(63),
+#endif
+
+       SET_SDHC_LIODN(1, 552),
+
+       SET_USB_LIODN(1, "fsl-usb2-mph", 553),
+
+       SET_PCI_LIODN("fsl,qoriq-pcie-v2.2", 1, 148),
+
+       SET_DMA_LIODN(1, 147),
+       SET_DMA_LIODN(2, 227),
+
+       SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0),
+       SET_GUTS_LIODN(NULL, 200, rio2liodnr, 0),
+       SET_GUTS_LIODN(NULL, 201, rio1maintliodnr, 0),
+       SET_GUTS_LIODN(NULL, 202, rio2maintliodnr, 0),
+
+       /* SET_NEXUS_LIODN(557), -- not yet implemented */
+};
+int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
+
+#ifdef CONFIG_SYS_DPAA_FMAN
+struct liodn_id_table fman1_liodn_tbl[] = {
+       SET_FMAN_RX_1G_LIODN(1, 0, 88),
+       SET_FMAN_RX_1G_LIODN(1, 1, 89),
+       SET_FMAN_RX_1G_LIODN(1, 2, 90),
+       SET_FMAN_RX_1G_LIODN(1, 3, 91),
+       SET_FMAN_RX_1G_LIODN(1, 4, 92),
+       SET_FMAN_RX_1G_LIODN(1, 5, 93),
+       SET_FMAN_RX_10G_LIODN(1, 0, 94),
+       SET_FMAN_RX_10G_LIODN(1, 1, 95),
+};
+int fman1_liodn_tbl_sz = ARRAY_SIZE(fman1_liodn_tbl);
+#endif
+
+struct liodn_id_table sec_liodn_tbl[] = {
+       SET_SEC_JR_LIODN_ENTRY(0, 454, 458),
+       SET_SEC_JR_LIODN_ENTRY(1, 455, 459),
+       SET_SEC_JR_LIODN_ENTRY(2, 456, 460),
+       SET_SEC_JR_LIODN_ENTRY(3, 457, 461),
+       SET_SEC_RTIC_LIODN_ENTRY(a, 453),
+       SET_SEC_RTIC_LIODN_ENTRY(b, 549),
+       SET_SEC_RTIC_LIODN_ENTRY(c, 550),
+       SET_SEC_RTIC_LIODN_ENTRY(d, 551),
+       SET_SEC_DECO_LIODN_ENTRY(0, 541, 610),
+       SET_SEC_DECO_LIODN_ENTRY(1, 542, 611),
+};
+int sec_liodn_tbl_sz = ARRAY_SIZE(sec_liodn_tbl);
+
+#ifdef CONFIG_SYS_DPAA_RMAN
+struct liodn_id_table rman_liodn_tbl[] = {
+       /* Set RMan block 0-3 liodn offset */
+       SET_RMAN_LIODN(0, 678),
+       SET_RMAN_LIODN(1, 679),
+       SET_RMAN_LIODN(2, 680),
+       SET_RMAN_LIODN(3, 681),
+};
+int rman_liodn_tbl_sz = ARRAY_SIZE(rman_liodn_tbl);
+#endif
+
+struct liodn_id_table liodn_bases[] = {
+       [FSL_HW_PORTAL_SEC]  = SET_LIODN_BASE_2(462, 558),
+#ifdef CONFIG_SYS_DPAA_FMAN
+       [FSL_HW_PORTAL_FMAN1] = SET_LIODN_BASE_1(973),
+#endif
+#ifdef CONFIG_SYS_DPAA_RMAN
+       [FSL_HW_PORTAL_RMAN] = SET_LIODN_BASE_1(922),
+#endif
+};
diff --git a/arch/powerpc/cpu/mpc85xx/t1040_serdes.c b/arch/powerpc/cpu/mpc85xx/t1040_serdes.c
new file mode 100644 (file)
index 0000000..8261e03
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2012 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/fsl_serdes.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include "fsl_corenet2_serdes.h"
+
+static u8 serdes_cfg_tbl[MAX_SERDES][0xC4][SRDS_MAX_LANES] = {
+       {       /* SerDes 1 */
+       [0x69] = {PCIE1, SGMII_FM1_DTSEC3, QSGMII_SW1_A, QSGMII_SW1_B,
+               PCIE2, PCIE3, SGMII_FM1_DTSEC4, SATA1},
+       [0x66] = {PCIE1, SGMII_FM1_DTSEC3, QSGMII_SW1_A, QSGMII_SW1_B,
+               PCIE2, PCIE3, PCIE4, SATA1},
+       [0x67] = {PCIE1, SGMII_FM1_DTSEC3, QSGMII_SW1_A, QSGMII_SW1_B,
+               PCIE2, PCIE3, PCIE4, SGMII_FM1_DTSEC5},
+       [0x60] = {PCIE1, SGMII_FM1_DTSEC3, QSGMII_SW1_A, QSGMII_SW1_B,
+               PCIE2, PCIE2, PCIE2, PCIE2},
+       [0x8D] = {PCIE1, SGMII_SW1_DTSEC3, SGMII_SW1_DTSEC1, SGMII_SW1_DTSEC2,
+               PCIE2, SGMII_SW1_DTSEC6, SGMII_SW1_DTSEC4, SGMII_SW1_DTSEC5},
+       [0x89] = {PCIE1, SGMII_SW1_DTSEC3, SGMII_SW1_DTSEC1, SGMII_SW1_DTSEC2,
+               PCIE2, PCIE3, SGMII_SW1_DTSEC4, SATA1},
+       [0x86] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               PCIE2, PCIE3, PCIE4, SATA1},
+       [0x87] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               PCIE2, PCIE3, PCIE4, SGMII_FM1_DTSEC5},
+       [0xA7] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+                PCIE2, PCIE3, PCIE4, SGMII_FM1_DTSEC5},
+       [0xAA] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+                PCIE2, PCIE3, SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5},
+       [0x40] = {PCIE1, PCIE1, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               PCIE2, PCIE2, PCIE2, PCIE2},
+       [0x06] = {PCIE1, PCIE1, PCIE1, PCIE1,
+               PCIE2, PCIE3, PCIE4, SATA1},
+       [0x08] = {PCIE1, PCIE1, PCIE1, PCIE1,
+               PCIE2, PCIE3, SATA2, SATA1},
+       [0x8F] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               AURORA, NONE, SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5},
+       [0x85] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               PCIE2, PCIE2, SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5},
+       [0xA5] = {PCIE1, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
+               PCIE2, PCIE2, SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5},
+       [0x00] = {PCIE1, PCIE1, PCIE1, PCIE1,
+               PCIE2, PCIE2, PCIE2, PCIE2},
+       },
+       {
+       },
+       {
+       },
+       {
+       },
+};
+
+
+enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
+{
+       return serdes_cfg_tbl[serdes][cfg][lane];
+}
+
+int is_serdes_prtcl_valid(int serdes, u32 prtcl)
+{
+       int i;
+
+       if (prtcl > (ARRAY_SIZE(serdes_cfg_tbl[serdes])))
+               return 0;
+
+       for (i = 0; i < SRDS_MAX_LANES; i++) {
+               if (serdes_cfg_tbl[serdes][prtcl][i] != NONE)
+                       return 1;
+       }
+
+       return 0;
+}
index b6b733d77fd356b6231c958f2da326c3468c3855..dc33eb3d108fbffca80a63760c128ff78178000a 100644 (file)
@@ -78,7 +78,8 @@ static int check_CPU (long clock, uint pvr, uint immr)
        if ((pvr >> 16) != 0x0050)
                return -1;
 
-       k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]);
+       k = (immr << 16) |
+               immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];
        m = 0;
        suf = "";
 
@@ -194,7 +195,8 @@ static int check_CPU (long clock, uint pvr, uint immr)
        if ((pvr >> 16) != 0x0050)
                return -1;
 
-       k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]);
+       k = (immr << 16) |
+               immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];
        m = 0;
 
        switch (k) {
@@ -253,7 +255,8 @@ static int check_CPU (long clock, uint pvr, uint immr)
        if ((pvr >> 16) != 0x0050)
                return -1;
 
-       k = (immr << 16) | in_be16((ushort *)&immap->im_cpm.cp_dparam[0xB0]);
+       k = (immr << 16) |
+               in_be16(&immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)]);
        m = 0;
 
        switch (k) {
@@ -312,7 +315,8 @@ static int check_CPU (long clock, uint pvr, uint immr)
        if ((pvr >> 16) != 0x0050)
                return -1;
 
-       k = (immr << 16) | *((ushort *) & immap->im_cpm.cp_dparam[0xB0]);
+       k = (immr << 16) |
+               immap->im_cpm.cp_dparam16[PROFF_REVNUM / sizeof(u16)];
        m = 0;
 
        switch (k) {
index 0087cd029fe9a810d0880be2740bfe24d4842644..bc2685544e831ddfee1023da837b6b507916e8a5 100644 (file)
@@ -85,6 +85,12 @@ static struct cpu_type cpu_type_list[] = {
        CPU_TYPE_ENTRY(G4440, G4440, 0),
        CPU_TYPE_ENTRY(B4420, B4420, 0),
        CPU_TYPE_ENTRY(B4220, B4220, 0),
+       CPU_TYPE_ENTRY(T1040, T1040, 0),
+       CPU_TYPE_ENTRY(T1041, T1041, 0),
+       CPU_TYPE_ENTRY(T1042, T1042, 0),
+       CPU_TYPE_ENTRY(T1020, T1020, 0),
+       CPU_TYPE_ENTRY(T1021, T1021, 0),
+       CPU_TYPE_ENTRY(T1022, T1022, 0),
        CPU_TYPE_ENTRY(BSC9130, 9130, 1),
        CPU_TYPE_ENTRY(BSC9131, 9131, 1),
        CPU_TYPE_ENTRY(BSC9132, 9132, 2),
@@ -97,35 +103,70 @@ static struct cpu_type cpu_type_list[] = {
 };
 
 #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
+static inline u32 init_type(u32 cluster, int init_id)
+{
+       ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+       u32 idx = (cluster >> (init_id * 8)) & TP_CLUSTER_INIT_MASK;
+       u32 type = in_be32(&gur->tp_ityp[idx]);
+
+       if (type & TP_ITYP_AV)
+               return type;
+
+       return 0;
+}
+
 u32 compute_ppc_cpumask(void)
 {
-       ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+       ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        int i = 0, count = 0;
-       u32 cluster, mask = 0;
+       u32 cluster, type, mask = 0;
 
        do {
                int j;
-               cluster = in_be32(&gur->tp_cluster[i++].lower);
-               for (j = 0; j < 4; j++) {
-                       u32 idx = (cluster >> (j*8)) & TP_CLUSTER_INIT_MASK;
-                       u32 type = in_be32(&gur->tp_ityp[idx]);
-
-                       if (type & TP_ITYP_AV) {
+               cluster = in_be32(&gur->tp_cluster[i].lower);
+               for (j = 0; j < TP_INIT_PER_CLUSTER; j++) {
+                       type = init_type(cluster, j);
+                       if (type) {
                                if (TP_ITYP_TYPE(type) == TP_ITYP_TYPE_PPC)
                                        mask |= 1 << count;
+                               count++;
                        }
-                       count++;
                }
+               i++;
        } while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
 
        return mask;
 }
+
+int fsl_qoriq_core_to_cluster(unsigned int core)
+{
+       ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+       int i = 0, count = 0;
+       u32 cluster;
+
+       do {
+               int j;
+               cluster = in_be32(&gur->tp_cluster[i].lower);
+               for (j = 0; j < TP_INIT_PER_CLUSTER; j++) {
+                       if (init_type(cluster, j)) {
+                               if (count == core)
+                                       return i;
+                               count++;
+                       }
+               }
+               i++;
+       } while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
+
+       return -1;      /* cannot identify the cluster */
+}
+
 #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
 /*
  * Before chassis genenration 2, the cpumask should be hard-coded.
  * In case of cpu type unknown or cpumask unset, use 1 as fail save.
  */
 #define compute_ppc_cpumask()  1
+#define fsl_qoriq_core_to_cluster(x) x
 #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
 
 static struct cpu_type cpu_type_unknown = CPU_TYPE_ENTRY(Unknown, Unknown, 0);
index 9adde31010925ef64eb3c0560bd3fa4faa6e323c..e958e138dda6c613f747a2b806dc1d58476a83a8 100644 (file)
@@ -44,7 +44,6 @@ compute_cas_latency_ddr3(const dimm_params_t *dimm_params,
                printf("DDR clock (MCLK cycle %u ps) is faster than "
                        "the slowest DIMM(s) (tCKmin %u ps) can support.\n",
                        mclk_ps, tCKmin_X_ps);
-               return 1;
        }
        /* determine the acutal cas latency */
        caslat_actual = (tAAmin_ps + mclk_ps - 1) / mclk_ps;
@@ -60,7 +59,6 @@ compute_cas_latency_ddr3(const dimm_params_t *dimm_params,
        if (caslat_actual * mclk_ps > 20000) {
                printf("The choosen cas latency %d is too large\n",
                        caslat_actual);
-               return 1;
        }
        outpdimm->lowest_common_SPD_caslat = caslat_actual;
 
index 40679cb2b068e6f228fa8f7ecd47cfddcb952784..01129ed4f0e745aeea3bd56808abaf0b787ddbc7 100644 (file)
@@ -485,7 +485,12 @@ typedef struct comm_proc {
         * Some processors don't have all of it populated.
         */
        u_char  cp_dpmem[0x1C00];       /* BD / Data / ucode */
-       u_char  cp_dparam[0x400];       /* Parameter RAM */
+
+       /* Parameter RAM */
+       union {
+               u_char  cp_dparam[0x400];
+               u16     cp_dparam16[0x200];
+       };
 } cpm8xx_t;
 
 /* Internal memory map.
index 75719414009d6951f9c1903d901d139cfee690ea..1009a31b33954693fc2de55a5636dee22f9ea2a1 100644 (file)
 #define CONFIG_SYS_FSL_ESDHC_P1010_BROKEN_SDCLK
 #define CONFIG_SYS_FSL_PCIE_COMPAT     "fsl,qoriq-pcie-v2.2"
 
-#elif defined(CONFIG_PPC_T4240)
+#elif defined(CONFIG_PPC_T4240) || defined(CONFIG_PPC_T4160)
+#define CONFIG_E6500
 #define CONFIG_SYS_PPC64               /* 64-bit core */
 #define CONFIG_FSL_CORENET             /* Freescale CoreNet platform */
 #define CONFIG_SYS_FSL_QORIQ_CHASSIS2  /* Freescale Chassis generation 2 */
+#define CONFIG_SYS_FSL_CORES_PER_CLUSTER 4
 #define CONFIG_SYS_FSL_QMAN_V3         /* QMAN version 3 */
+#ifdef CONFIG_PPC_T4240
 #define CONFIG_MAX_CPUS                        12
-#define CONFIG_SYS_FSL_NUM_CC_PLLS     5
-#define CONFIG_SYS_FSL_NUM_LAWS                32
-#define CONFIG_SYS_FSL_SRDS_3
-#define CONFIG_SYS_FSL_SRDS_4
-#define CONFIG_SYS_FSL_SEC_COMPAT      4
-#define CONFIG_SYS_NUM_FMAN            2
 #define CONFIG_SYS_NUM_FM1_DTSEC       8
 #define CONFIG_SYS_NUM_FM1_10GEC       2
 #define CONFIG_SYS_NUM_FM2_DTSEC       8
 #define CONFIG_SYS_NUM_FM2_10GEC       2
 #define CONFIG_NUM_DDR_CONTROLLERS     3
-#define CONFIG_SYS_FSL_DDR_VER         FSL_DDR_VER_4_7
-#define CONFIG_SYS_FMAN_V3
-#define CONFIG_SYS_FM_MURAM_SIZE       0x60000
-#define CONFIG_SYS_FSL_TBCLK_DIV       16
-#define CONFIG_SYS_FSL_PCIE_COMPAT     "fsl,qoriq-pcie-v3.0"
-#define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
-#define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9
-#define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5
-#define CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE
-#define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
-#define CONFIG_SYS_FSL_ERRATUM_A004468
-#define CONFIG_SYS_FSL_ERRATUM_A_004934
-#define CONFIG_SYS_FSL_ERRATUM_A005871
-#define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
-
-#elif defined(CONFIG_PPC_T4160)
-#define CONFIG_SYS_PPC64               /* 64-bit core */
-#define CONFIG_FSL_CORENET             /* Freescale CoreNet platform */
-#define CONFIG_SYS_FSL_QORIQ_CHASSIS2  /* Freescale Chassis generation 2 */
-#define CONFIG_SYS_FSL_QMAN_V3         /* QMAN version 3 */
+#else
 #define CONFIG_MAX_CPUS                        8
+#define CONFIG_SYS_NUM_FM1_DTSEC       7
+#define CONFIG_SYS_NUM_FM1_10GEC       1
+#define CONFIG_SYS_NUM_FM2_DTSEC       7
+#define CONFIG_SYS_NUM_FM2_10GEC       1
+#define CONFIG_NUM_DDR_CONTROLLERS     2
+#endif
 #define CONFIG_SYS_FSL_NUM_CC_PLLS     5
 #define CONFIG_SYS_FSL_NUM_LAWS                32
 #define CONFIG_SYS_FSL_SRDS_3
 #define CONFIG_SYS_FSL_SRDS_4
 #define CONFIG_SYS_FSL_SEC_COMPAT      4
 #define CONFIG_SYS_NUM_FMAN            2
-#define CONFIG_SYS_NUM_FM1_DTSEC       7
-#define CONFIG_SYS_NUM_FM1_10GEC       1
-#define CONFIG_SYS_NUM_FM2_DTSEC       7
-#define CONFIG_SYS_NUM_FM2_10GEC       1
-#define CONFIG_NUM_DDR_CONTROLLERS     2
 #define CONFIG_SYS_FSL_DDR_VER         FSL_DDR_VER_4_7
 #define CONFIG_SYS_FMAN_V3
 #define CONFIG_SYS_FM_MURAM_SIZE       0x60000
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
 #define CONFIG_SYS_FSL_PCI_VER_3_X
 
-#elif defined(CONFIG_PPC_B4420)
+#elif defined(CONFIG_PPC_B4860) || defined(CONFIG_PPC_B4420)
+#define CONFIG_E6500
 #define CONFIG_SYS_PPC64               /* 64-bit core */
 #define CONFIG_FSL_CORENET             /* Freescale CoreNet platform */
 #define CONFIG_SYS_FSL_QORIQ_CHASSIS2  /* Freescale Chassis generation 2 */
 #define CONFIG_SYS_FSL_QMAN_V3         /* QMAN version 3 */
-#define CONFIG_MAX_CPUS                        2
-#define CONFIG_SYS_FSL_NUM_CC_PLLS     4
 #define CONFIG_SYS_FSL_NUM_LAWS                32
 #define CONFIG_SYS_FSL_SEC_COMPAT      4
 #define CONFIG_SYS_NUM_FMAN            1
-#define CONFIG_SYS_NUM_FM1_DTSEC       4
-#define CONFIG_NUM_DDR_CONTROLLERS     1
 #define CONFIG_SYS_FSL_DDR_VER         FSL_DDR_VER_4_7
 #define CONFIG_SYS_FMAN_V3
 #define CONFIG_SYS_FM_MURAM_SIZE       0x60000
 #define CONFIG_SYS_FSL_ERRATUM_A005871
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
 
-#elif defined(CONFIG_PPC_B4860)
-#define CONFIG_SYS_PPC64               /* 64-bit core */
+#ifdef CONFIG_PPC_B4860
+#define CONFIG_SYS_FSL_CORES_PER_CLUSTER 4
+#define CONFIG_MAX_CPUS                        4
+#define CONFIG_SYS_FSL_NUM_CC_PLLS     4
+#define CONFIG_SYS_NUM_FM1_DTSEC       6
+#define CONFIG_SYS_NUM_FM1_10GEC       2
+#define CONFIG_NUM_DDR_CONTROLLERS     2
+#define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
+#define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9
+#define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5
+#else
+#define CONFIG_MAX_CPUS                        2
+#define CONFIG_SYS_FSL_CORES_PER_CLUSTER 2
+#define CONFIG_SYS_FSL_NUM_CC_PLLS     4
+#define CONFIG_SYS_NUM_FM1_DTSEC       4
+#define CONFIG_SYS_NUM_FM1_10GEC       0
+#define CONFIG_NUM_DDR_CONTROLLERS     1
+#endif
+
+#elif defined(CONFIG_PPC_T1040)
+#define CONFIG_E5500
 #define CONFIG_FSL_CORENET             /* Freescale CoreNet platform */
 #define CONFIG_SYS_FSL_QORIQ_CHASSIS2  /* Freescale Chassis generation 2 */
+#define CONFIG_SYS_FSL_CORES_PER_CLUSTER 1
 #define CONFIG_SYS_FSL_QMAN_V3         /* QMAN version 3 */
 #define CONFIG_MAX_CPUS                        4
-#define CONFIG_SYS_FSL_NUM_CC_PLLS     4
-#define CONFIG_SYS_FSL_NUM_LAWS                32
+#define CONFIG_SYS_FSL_NUM_CC_PLLS     5
+#define CONFIG_SYS_FSL_NUM_LAWS                16
 #define CONFIG_SYS_FSL_SEC_COMPAT      4
 #define CONFIG_SYS_NUM_FMAN            1
-#define CONFIG_SYS_NUM_FM1_DTSEC       6
-#define CONFIG_SYS_NUM_FM1_10GEC       2
-#define CONFIG_NUM_DDR_CONTROLLERS     2
+#define CONFIG_SYS_NUM_FM1_DTSEC       5
+#define CONFIG_NUM_DDR_CONTROLLERS     1
 #define CONFIG_SYS_FSL_DDR_VER         FSL_DDR_VER_4_7
+#define CONFIG_SYS_FSL_IFC_BANK_COUNT  4
 #define CONFIG_SYS_FMAN_V3
-#define CONFIG_SYS_FM_MURAM_SIZE       0x60000
-#define CONFIG_SYS_FSL_TBCLK_DIV       16
+#define CONFIG_SYS_FM_MURAM_SIZE       0x28000
+#define CONFIG_SYS_FSL_TBCLK_DIV       32
 #define CONFIG_SYS_FSL_PCIE_COMPAT     "fsl,qoriq-pcie-v2.4"
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9
 #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5
 #define CONFIG_SYS_FSL_USB1_PHY_ENABLE
-#define CONFIG_SYS_FSL_ERRATUM_A_004934
-#define CONFIG_SYS_FSL_ERRATUM_A005871
+#define CONFIG_SYS_FSL_USB2_PHY_ENABLE
+#define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
 
 #else
 #error "CONFIG_SYS_CCSRBAR_DEFAULT is not defined for this platform."
 #endif
 
+#ifdef CONFIG_E6500
+#define CONFIG_SYS_FSL_THREADS_PER_CORE 2
+#else
+#define CONFIG_SYS_FSL_THREADS_PER_CORE 1
+#endif
+
 #endif /* _ASM_MPC85xx_CONFIG_H_ */
index f9cec8ea441a298abe04ed47615e453b392cd328..90b264d35e7292c505cc06a9a08e837639edeb7c 100644 (file)
@@ -70,6 +70,8 @@ enum law_trgt_if {
        LAW_TRGT_IF_DCSR = 0x1d,
        LAW_TRGT_IF_LBC = 0x1f,
        LAW_TRGT_IF_QMAN = 0x3c,
+
+       LAW_TRGT_IF_MAPLE = 0x50,
 };
 #define LAW_TRGT_IF_DDR                LAW_TRGT_IF_DDR_1
 #define LAW_TRGT_IF_IFC                LAW_TRGT_IF_LBC
index d1c1967d1d639f15fbf65fb325d8c47552b91fa8..2bc6ed1cf009dae3189d9f8abb3110cc7ae567e1 100644 (file)
 #ifndef __FSL_SECURE_BOOT_H
 #define __FSL_SECURE_BOOT_H
 
-/* Starting TLB number for the TLB entried for 3.5 G space created by ISBC */
-#if defined(CONFIG_FSL_CORENET)
-#define CONFIG_SYS_ISBC_START_TLB              3
-#else
-#define CONFIG_SYS_ISBC_START_TLB              0
-#endif
-
-/* Number fo TLB's created by ISBC */
-#define CONFIG_SYS_ISBC_NUM_TLBS               5
-
 #if defined(CONFIG_FSL_CORENET)
 #define CONFIG_SYS_PBI_FLASH_BASE              0xc0000000
 #else
index 6cd7379c8f549a86ab6fd7d623f09670d86004aa..ccb91fb062473176db4e5d24218da258c3770967 100644 (file)
@@ -80,6 +80,14 @@ enum srds_prtcl {
        XFI_FM2_MAC9,
        XFI_FM2_MAC10,
        INTERLAKEN,
+       SGMII_SW1_DTSEC1,       /* SW indicates on L2 switch */
+       SGMII_SW1_DTSEC2,
+       SGMII_SW1_DTSEC3,
+       SGMII_SW1_DTSEC4,
+       SGMII_SW1_DTSEC5,
+       SGMII_SW1_DTSEC6,
+       QSGMII_SW1_A,           /* SW indicates on L2 swtich */
+       QSGMII_SW1_B,
 };
 
 enum srds {
index d96e53646ad88cff9a00bdadad9f71d5331610a1..824821981df467ca41a06716162c2b5b83f231eb 100644 (file)
@@ -1272,4 +1272,6 @@ static inline u32 get_pata_base (void)
 #define CONFIG_SYS_MPC512x_USB_ADDR \
                        (CONFIG_SYS_IMMR + CONFIG_SYS_MPC512x_USB_OFFSET)
 
+#define IIM_BASE_ADDR  (CONFIG_SYS_IMMR + offsetof(immap_t, iim))
+
 #endif /* __IMMAP_512x__ */
index 4974ae56fcbb418acaa43bd37a0d377b9a8e2f79..c7021a7095b7e224ba60fede5c969717c7ca5e87 100644 (file)
@@ -526,13 +526,18 @@ typedef struct immap {
        /* Some references are into the unique and known dpram spaces,
         * others are from the generic base.
         */
-#define im_dprambase   im_dpram1
-       u_char          im_dpram1[16*1024];
-       char            res1[16*1024];
-       u_char          im_dpram2[4*1024];
-       char            res2[8*1024];
-       u_char          im_dpram3[4*1024];
-       char            res3[16*1024];
+       union {
+               struct {
+                       u_char          im_dpram1[16 * 1024];
+                       char            res1[16 * 1024];
+                       u_char          im_dpram2[4 * 1024];
+                       char            res2[8 * 1024];
+                       u_char          im_dpram3[4 * 1024];
+                       char            res3[16 * 1024];
+               };
+               u8      im_dprambase[64 * 1024];
+               u16     im_dprambase16[32 * 1024];
+       };
 
        sysconf8260_t   im_siu_conf;    /* SIU Configuration */
        memctl8260_t    im_memctl;      /* Memory Controller */
index 28fe1d22cb8f61e21f2f53dd54597fb85622c01e..4052037f56f92d5851c52e6f097f971a28ff31b7 100644 (file)
@@ -1844,6 +1844,11 @@ typedef struct ccsr_gur {
 #define FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT  25
 #define FSL_CORENET2_RCWSR4_SRDS2_PRTCL        0x00ff0000
 #define FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT  16
+#elif defined(CONFIG_PPC_T1040)
+#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL        0xff000000
+#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT  24
+#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL        0x00fe0000
+#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT  17
 #endif
 #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL1        0x00800000
 #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL2        0x00400000
@@ -1991,6 +1996,7 @@ typedef struct ccsr_gur {
 
 #define TP_CLUSTER_EOC         0x80000000      /* end of clusters */
 #define TP_CLUSTER_INIT_MASK   0x0000003f      /* initiator mask */
+#define TP_INIT_PER_CLUSTER    4
 
 #define FSL_CORENET_DCSR_SZ_MASK       0x00000003
 #define FSL_CORENET_DCSR_SZ_4M         0x0
@@ -2003,22 +2009,13 @@ typedef struct ccsr_gur {
 #define rmuliodnr rio1maintliodnr
 
 typedef struct ccsr_clk {
-       u32     clkc0csr;       /* 0x000 Core 0 Clock control/status */
-       u8      res1[0x1c];
-       u32     clkc1csr;       /* 0x020 Core 1 Clock control/status */
-       u8      res2[0x1c];
-       u32     clkc2csr;       /* 0x040 Core 2 Clock control/status */
-       u8      res3[0x1c];
-       u32     clkc3csr;       /* 0x060 Core 3 Clock control/status */
-       u8      res4[0x1c];
-       u32     clkc4csr;       /* 0x080 Core 4 Clock control/status */
-       u8      res5[0x1c];
-       u32     clkc5csr;       /* 0x0a0 Core 5 Clock control/status */
-       u8      res6[0x1c];
-       u32     clkc6csr;       /* 0x0c0 Core 6 Clock control/status */
-       u8      res7[0x1c];
-       u32     clkc7csr;       /* 0x0e0 Core 7 Clock control/status */
-       u8      res8[0x71c];
+       struct {
+               u32 clkcncsr;   /* core cluster n clock control status */
+               u8  res_004[0x0c];
+               u32 clkcgnhwacsr;/* clock generator n hardware accelerator */
+               u8  res_014[0x0c];
+       } clkcsr[8];
+       u8      res_100[0x700]; /* 0x100 */
        u32     pllc1gsr;       /* 0x800 Cluster PLL 1 General Status */
        u8      res10[0x1c];
        u32     pllc2gsr;       /* 0x820 Cluster PLL 2 General Status */
index 5c0c438e603a35eaa0ffd627a4bc4bff1c1ecc45..56b22d840ad466adad4f9a9d83ed5b4e6b3524c5 100644 (file)
 #define   L2CSR0_L2IO          0x00100000      /* L2 Cache Instruction Only */
 #define   L2CSR0_L2DO          0x00010000      /* L2 Cache Data Only */
 #define   L2CSR0_L2REP         0x00003000      /* L2 Line Replacement Algo */
+
+/* e6500 */
+#define   L2CSR0_L2REP_SPLRUAGE        0x00000000      /* L2REP Streaming PLRU with Aging */
+#define   L2CSR0_L2REP_FIFO    0x00001000      /* L2REP FIFO */
+#define   L2CSR0_L2REP_SPLRU   0x00002000      /* L2REP Streaming PLRU */
+#define   L2CSR0_L2REP_PLRU    0x00003000      /* L2REP PLRU */
+
+#define   L2CSR0_L2REP_MODE    L2CSR0_L2REP_SPLRUAGE
+
 #define   L2CSR0_L2FL          0x00000800      /* L2 Cache Flush */
 #define   L2CSR0_L2LFC         0x00000400      /* L2 Cache Lock Flash Clear */
 #define   L2CSR0_L2LOA         0x00000080      /* L2 Cache Lock Overflow Allocate */
 #define SVR_G4440      0x868101
 #define SVR_B4420      0x868102
 #define SVR_B4220      0x868103
+#define SVR_T1040      0x852000
+#define SVR_T1041      0x852001
+#define SVR_T1042      0x852002
+#define SVR_T1020      0x852100
+#define SVR_T1021      0x852101
+#define SVR_T1022      0x852102
 
 #define SVR_8610       0x80A000
 #define SVR_8641       0x809000
@@ -1185,6 +1200,8 @@ struct cpu_type {
 struct cpu_type *identify_cpu(u32 ver);
 int fixup_cpu(void);
 
+int fsl_qoriq_core_to_cluster(unsigned int core);
+
 #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
 #define CPU_TYPE_ENTRY(n, v, nc) \
        { .name = #n, .soc_ver = SVR_##v, .num_cores = (nc), \
index f2b428426723dc5e761546a0a6532fe4d4732494..af5338eb5fc1bcc1e858462cef68e78e712269df 100644 (file)
@@ -29,8 +29,7 @@
 #include <asm/errno.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/crm_regs.h>
-#include <asm/arch/mx35_pins.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx35.h>
 #include <i2c.h>
 #include <linux/types.h>
 #include <asm/gpio.h>
@@ -165,62 +164,68 @@ static void board_setup_sdram(void)
 
 static void setup_iomux_uart3(void)
 {
-       mxc_request_iomux(MX35_PIN_RTS2, MUX_CONFIG_ALT7);
-       mxc_request_iomux(MX35_PIN_CTS2, MUX_CONFIG_ALT7);
+       static const iomux_v3_cfg_t uart3_pads[] = {
+               MX35_PAD_RTS2__UART3_RXD_MUX,
+               MX35_PAD_CTS2__UART3_TXD_MUX,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart3_pads, ARRAY_SIZE(uart3_pads));
 }
 
+#define I2C_PAD_CTRL   (PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_ODE)
+
 static void setup_iomux_i2c(void)
 {
-       int pad;
-
-       mxc_request_iomux(MX35_PIN_I2C1_CLK, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_I2C1_DAT, MUX_CONFIG_SION);
-
-       pad = (PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE \
-                       | PAD_CTL_PUE_PUD | PAD_CTL_ODE_OpenDrain);
+       static const iomux_v3_cfg_t i2c_pads[] = {
+               NEW_PAD_CTRL(MX35_PAD_I2C1_CLK__I2C1_SCL, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_I2C1_DAT__I2C1_SDA, I2C_PAD_CTRL),
 
-       mxc_iomux_set_pad(MX35_PIN_I2C1_CLK, pad);
-       mxc_iomux_set_pad(MX35_PIN_I2C1_DAT, pad);
+               NEW_PAD_CTRL(MX35_PAD_TX3_RX2__I2C3_SCL, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_TX2_RX3__I2C3_SDA, I2C_PAD_CTRL),
+       };
 
-       mxc_request_iomux(MX35_PIN_TX3_RX2, MUX_CONFIG_ALT1);
-       mxc_request_iomux(MX35_PIN_TX2_RX3, MUX_CONFIG_ALT1);
-
-       mxc_iomux_set_pad(MX35_PIN_TX3_RX2, pad);
-       mxc_iomux_set_pad(MX35_PIN_TX2_RX3, pad);
+       imx_iomux_v3_setup_multiple_pads(i2c_pads, ARRAY_SIZE(i2c_pads));
 }
 
 
 static void setup_iomux_spi(void)
 {
-       mxc_request_iomux(MX35_PIN_CSPI1_MOSI, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_MISO, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SS0, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SS1, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SCLK, MUX_CONFIG_SION);
+       static const iomux_v3_cfg_t spi_pads[] = {
+               MX35_PAD_CSPI1_MOSI__CSPI1_MOSI,
+               MX35_PAD_CSPI1_MISO__CSPI1_MISO,
+               MX35_PAD_CSPI1_SS0__CSPI1_SS0,
+               MX35_PAD_CSPI1_SS1__CSPI1_SS1,
+               MX35_PAD_CSPI1_SCLK__CSPI1_SCLK,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
 }
 
 static void setup_iomux_fec(void)
 {
-       /* setup pins for FEC */
-       mxc_request_iomux(MX35_PIN_FEC_TX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_DV, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_COL, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_EN, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDC, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDIO, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_CRS, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA3, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA3, MUX_CONFIG_FUNC);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               MX35_PAD_FEC_TX_CLK__FEC_TX_CLK,
+               MX35_PAD_FEC_RX_CLK__FEC_RX_CLK,
+               MX35_PAD_FEC_RX_DV__FEC_RX_DV,
+               MX35_PAD_FEC_COL__FEC_COL,
+               MX35_PAD_FEC_RDATA0__FEC_RDATA_0,
+               MX35_PAD_FEC_TDATA0__FEC_TDATA_0,
+               MX35_PAD_FEC_TX_EN__FEC_TX_EN,
+               MX35_PAD_FEC_MDC__FEC_MDC,
+               MX35_PAD_FEC_MDIO__FEC_MDIO,
+               MX35_PAD_FEC_TX_ERR__FEC_TX_ERR,
+               MX35_PAD_FEC_RX_ERR__FEC_RX_ERR,
+               MX35_PAD_FEC_CRS__FEC_CRS,
+               MX35_PAD_FEC_RDATA1__FEC_RDATA_1,
+               MX35_PAD_FEC_TDATA1__FEC_TDATA_1,
+               MX35_PAD_FEC_RDATA2__FEC_RDATA_2,
+               MX35_PAD_FEC_TDATA2__FEC_TDATA_2,
+               MX35_PAD_FEC_RDATA3__FEC_RDATA_3,
+               MX35_PAD_FEC_TDATA3__FEC_TDATA_3,
+       };
 
+       /* setup pins for FEC */
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 int board_early_init_f(void)
@@ -229,7 +234,7 @@ int board_early_init_f(void)
                (struct ccm_regs *)IMX_CCM_BASE;
 
        /* setup GPIO3_1 to set HighVCore signal */
-       mxc_request_iomux(MX35_PIN_ATA_DA1, MUX_CONFIG_ALT5);
+       imx_iomux_v3_setup_pad(MX35_PAD_ATA_DA1__GPIO3_1);
        gpio_direction_output(65, 1);
 
        /* initialize PLL and clock configuration */
diff --git a/board/Seagate/goflexhome/Makefile b/board/Seagate/goflexhome/Makefile
new file mode 100644 (file)
index 0000000..9948fe2
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Copyright (C) 2013 Suriyan Ramasami <suriyan.r@gmail.com>
+#
+# Based on dockstar/Makefile originally written by
+# Copyright (C) 2010  Eric C. Cooper <ecc@cmu.edu>
+#
+# Based on sheevaplug/Makefile originally written by
+# Prafulla Wadaskar <prafulla@marvell.com>
+# (C) Copyright 2009
+# Marvell Semiconductor <www.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, 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  := goflexhome.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/Seagate/goflexhome/goflexhome.c b/board/Seagate/goflexhome/goflexhome.c
new file mode 100644 (file)
index 0000000..17c1905
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2013 Suriyan Ramasami <suriyan.r@gmail.com>
+ *
+ * Based on dockstar.c originally written by
+ * Copyright (C) 2010  Eric C. Cooper <ecc@cmu.edu>
+ *
+ * Based on sheevaplug.c originally written by
+ * Prafulla Wadaskar <prafulla@marvell.com>
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <miiphy.h>
+#include <asm/arch/kirkwood.h>
+#include <asm/arch/mpp.h>
+#include <asm/arch/cpu.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+       /* Multi-Purpose Pins Functionality configuration */
+       static const 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,
+               MPP20_GPIO,
+               MPP21_GPIO,
+               MPP22_GPIO,
+               MPP23_GPIO,
+               MPP24_GPIO,
+               MPP25_GPIO,
+               MPP26_GPIO,
+               MPP27_GPIO,
+               MPP28_GPIO,
+               MPP29_TSMP9,
+               MPP30_GPIO,
+               MPP31_GPIO,
+               MPP32_GPIO,
+               MPP33_GPIO,
+               MPP34_GPIO,
+               MPP35_GPIO,
+               MPP36_GPIO,
+               MPP37_GPIO,
+               MPP38_GPIO,
+               MPP39_GPIO,
+               MPP40_GPIO,
+               MPP41_GPIO,
+               MPP42_GPIO,
+               MPP43_GPIO,
+               MPP44_GPIO,
+               MPP45_GPIO,
+               MPP46_GPIO,
+               MPP47_GPIO,
+               MPP48_GPIO,
+               MPP49_GPIO,
+               0
+       };
+
+       /*
+        * 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(GOFLEXHOME_OE_VAL_LOW,
+                      GOFLEXHOME_OE_VAL_HIGH,
+                      GOFLEXHOME_OE_LOW, GOFLEXHOME_OE_HIGH);
+       kirkwood_mpp_conf(kwmpp_config, NULL);
+       return 0;
+}
+
+int board_init(void)
+{
+       /*
+        * arch number of board
+        */
+       gd->bd->bi_arch_number = MACH_TYPE_GOFLEXHOME;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100;
+
+       return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+/* Configure and enable MV88E1116 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);
+
+       printf("88E1116 Initialized on %s\n", name);
+}
+#endif /* CONFIG_RESET_PHY_R */
+
+#define GREEN_LED      (1 << 14)
+#define ORANGE_LED     (1 << 15)
+#define BOTH_LEDS      (GREEN_LED | ORANGE_LED)
+#define NEITHER_LED    0
+
+static void set_leds(u32 leds, u32 blinking)
+{
+       struct kwgpio_registers *r;
+       u32 oe;
+       u32 bl;
+
+       r = (struct kwgpio_registers *)KW_GPIO1_BASE;
+       oe = readl(&r->oe) | BOTH_LEDS;
+       writel(oe & ~leds, &r->oe);     /* active low */
+       bl = readl(&r->blink_en) & ~BOTH_LEDS;
+       writel(bl | blinking, &r->blink_en);
+}
+
+void show_boot_progress(int val)
+{
+       switch (val) {
+       case BOOTSTAGE_ID_RUN_OS:               /* booting Linux */
+               set_leds(BOTH_LEDS, NEITHER_LED);
+               break;
+       case BOOTSTAGE_ID_NET_ETH_START:        /* Ethernet initialization */
+               set_leds(GREEN_LED, GREEN_LED);
+               break;
+       default:
+               if (val < 0)    /* error */
+                       set_leds(ORANGE_LED, ORANGE_LED);
+               break;
+       }
+}
diff --git a/board/Seagate/goflexhome/kwbimage.cfg b/board/Seagate/goflexhome/kwbimage.cfg
new file mode 100644 (file)
index 0000000..e984d72
--- /dev/null
@@ -0,0 +1,168 @@
+#
+# Copyright (C) 2013 Suriyan Ramasami <suriyan.r@gmail.com>
+#
+# Based on dockstar/kwbimage.cfg originally written by
+# Copyright (C) 2010  Eric C. Cooper <ecc@cmu.edu>
+#
+# Based on sheevaplug/kwbimage.cfg originally written by
+# Prafulla Wadaskar <prafulla@marvell.com>
+# (C) Copyright 2009
+# Marvell Semiconductor <www.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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+# 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 0x0000000d     #  DDR Address Control
+# bit1-0:   00, Cs0width=x8
+# bit3-2:   11, Cs0size=1Gb
+# bit5-4:   00, Cs1width=nonexistent
+# bit7-6:   00, Cs1size =nonexistent
+# 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 0x07FFFFF1     # 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: 0x07, Size (i.e. 128MB)
+
+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)
+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
index 644c445693b740936d43e8d1c6e5cfec5451ab03..80a78221b1f8be7d72cabe4dc3ded88e8b492dac 100644 (file)
@@ -120,7 +120,7 @@ int board_eth_init(bd_t *bis)
 #ifdef CONFIG_NAND_DAVINCI
 static int
 davinci_std_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
-                                  uint8_t *buf, int page)
+                                  uint8_t *buf, int oob_required, int page)
 {
        struct nand_chip *this = mtd->priv;
        int i, eccsize = chip->ecc.size;
@@ -167,8 +167,9 @@ davinci_std_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
        return 0;
 }
 
-static void davinci_std_write_page_syndrome(struct mtd_info *mtd,
-                                   struct nand_chip *chip, const uint8_t *buf)
+static int davinci_std_write_page_syndrome(struct mtd_info *mtd,
+                                   struct nand_chip *chip, const uint8_t *buf,
+                                   int oob_required)
 {
        unsigned char davinci_ecc_buf[NAND_MAX_OOBSIZE];
        struct nand_chip *this = mtd->priv;
@@ -218,6 +219,7 @@ static void davinci_std_write_page_syndrome(struct mtd_info *mtd,
        i = mtd->oobsize - (oob - chip->oob_poi);
        if (i)
                chip->write_buf(mtd, oob, i);
+       return 0;
 }
 
 static int davinci_std_write_oob_syndrome(struct mtd_info *mtd,
@@ -239,7 +241,7 @@ static int davinci_std_write_oob_syndrome(struct mtd_info *mtd,
 }
 
 static int davinci_std_read_oob_syndrome(struct mtd_info *mtd,
-       struct nand_chip *chip, int page, int sndcmd)
+       struct nand_chip *chip, int page)
 {
        struct nand_chip *this = mtd->priv;
        uint8_t *buf = chip->oob_poi;
@@ -249,7 +251,7 @@ static int davinci_std_read_oob_syndrome(struct mtd_info *mtd,
 
        chip->read_buf(mtd, bufpoi, mtd->oobsize);
 
-       return 1;
+       return 0;
 }
 
 static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip)
index 87495901feeb623b5aa83eb96d2d67ef27648ef5..6719f3d446d2c6e837e0772935eaa2e9281c2bed 100644 (file)
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).o
 
-COBJS  := ca9x4_ct_vxp.o
+COBJS  := vexpress_common.o
 
 SRCS   := $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
similarity index 89%
rename from board/armltd/vexpress/ca9x4_ct_vxp.c
rename to board/armltd/vexpress/vexpress_common.c
index d5e109ec067bcb896cce9420073c47b9130246aa..2c54869e2c89a9fe0a99030387e065be0b1a764b 100644 (file)
@@ -45,8 +45,7 @@
 static ulong timestamp;
 static ulong lastdec;
 
-static struct wdt *wdt_base = (struct wdt *)WDT_BASE;
-static struct systimer *systimer_base = (struct systimer *)SYSTIMER_BASE;
+static struct systimer *systimer_base = (struct systimer *)V2M_TIMER01;
 static struct sysctrl *sysctrl_base = (struct sysctrl *)SCTL_BASE;
 
 static void flash__init(void);
@@ -166,20 +165,38 @@ static void vexpress_timer_init(void)
         */
        writel(SYSTIMER_RELOAD, &systimer_base->timer0load);
        writel(SYSTIMER_RELOAD, &systimer_base->timer0value);
-       writel(SYSTIMER_EN | SYSTIMER_32BIT | \
-              readl(&systimer_base->timer0control), \
+       writel(SYSTIMER_EN | SYSTIMER_32BIT |
+              readl(&systimer_base->timer0control),
               &systimer_base->timer0control);
 
        reset_timer_masked();
 }
 
+int v2m_cfg_write(u32 devfn, u32 data)
+{
+       /* Configuration interface broken? */
+       u32 val;
+
+       devfn |= SYS_CFG_START | SYS_CFG_WRITE;
+
+       val = readl(V2M_SYS_CFGSTAT);
+       writel(val & ~SYS_CFG_COMPLETE, V2M_SYS_CFGSTAT);
+
+       writel(data, V2M_SYS_CFGDATA);
+       writel(devfn, V2M_SYS_CFGCTRL);
+
+       do {
+               val = readl(V2M_SYS_CFGSTAT);
+       } while (val == 0);
+
+       return !!(val & SYS_CFG_ERR);
+}
+
 /* Use the ARM Watchdog System to cause reset */
 void reset_cpu(ulong addr)
 {
-       writeb(WDT_EN, &wdt_base->wdogcontrol);
-       writel(WDT_RESET_LOAD, &wdt_base->wdogload);
-       while (1)
-               ;
+       if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE_MB, 0))
+               printf("Unable to reboot\n");
 }
 
 /*
@@ -251,7 +268,7 @@ unsigned long long get_ticks(void)
        return get_timer(0);
 }
 
-ulong get_tbclk (void)
+ulong get_tbclk(void)
 {
        return (ulong)CONFIG_SYS_HZ;
 }
index 3aa394a4bb03b2bf1fd7f0c51a6a0eb6b6a7c10b..8d3fc75cd9f7a7a0934ff22ca51242b2b66c7010 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/arch/at91_pmc.h>
 #include <asm/arch/at91_rstc.h>
 #include <asm/arch/gpio.h>
+#include <atmel_mci.h>
 
 #if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
 # include <net.h>
@@ -143,6 +144,15 @@ static void at91sam9260ek_macb_hw_init(void)
 }
 #endif
 
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+int board_mmc_init(bd_t *bd)
+{
+       at91_mci_hw_init();
+
+       return atmel_mci_init((void *)ATMEL_BASE_MCI);
+}
+#endif
+
 int board_early_init_f(void)
 {
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
@@ -157,18 +167,6 @@ int board_early_init_f(void)
 
 int board_init(void)
 {
-#ifdef CONFIG_AT91SAM9G20EK_2MMC
-       /* arch number of AT91SAM9G20EK_2MMC-Board */
-       gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G20EK_2MMC;
-#else
-#ifdef CONFIG_AT91SAM9G20EK
-       /* arch number of AT91SAM9G20EK-Board */
-       gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G20EK;
-#else
-       /* arch number of AT91SAM9260EK-Board */
-       gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9260EK;
-#endif
-#endif
        /* adress of boot parameters */
        gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
 
diff --git a/board/atmel/at91sam9n12ek/Makefile b/board/atmel/at91sam9n12ek/Makefile
new file mode 100644 (file)
index 0000000..3aa67d5
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# (C) Copyright 2003-2008
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2008
+# Stelian Pop <stelian.pop@leadtechdesign.com>
+# Lead Tech Design <www.leadtechdesign.com>
+#
+# (C) Copyright 2013
+# Josh Wu <josh.wu@atmel.com>
+# Atmel corporation <www.atmel.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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS-y        += at91sam9n12ek.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS-y))
+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/atmel/at91sam9n12ek/at91sam9n12ek.c b/board/atmel/at91sam9n12ek/at91sam9n12ek.c
new file mode 100644 (file)
index 0000000..8752794
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * (C) Copyright 2013 Atmel Corporation
+ * Josh Wu <josh.wu@atmel.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/at91sam9x5_matrix.h>
+#include <asm/arch/at91sam9_smc.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/at91_rstc.h>
+#include <asm/arch/at91_pio.h>
+#include <asm/arch/clk.h>
+#include <lcd.h>
+#include <atmel_hlcdc.h>
+#include <atmel_mci.h>
+
+#ifdef CONFIG_LCD_INFO
+#include <nand.h>
+#include <version.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* ------------------------------------------------------------------------- */
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+#ifdef CONFIG_NAND_ATMEL
+static void at91sam9n12ek_nand_hw_init(void)
+{
+       struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
+       struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
+       unsigned long csa;
+
+       /* Assign CS3 to NAND/SmartMedia Interface */
+       csa = readl(&matrix->ebicsa);
+       csa |= AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA;
+       /* Configure databus */
+       csa &= ~AT91_MATRIX_NFD0_ON_D16; /* nandflash connect to D0~D15 */
+       /* Configure IO drive */
+       csa &= ~AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
+
+       writel(csa, &matrix->ebicsa);
+
+       /* Configure SMC CS3 for NAND/SmartMedia */
+       writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) |
+               AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(0),
+               &smc->cs[3].setup);
+       writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(5) |
+               AT91_SMC_PULSE_NRD(4) | AT91_SMC_PULSE_NCS_RD(6),
+               &smc->cs[3].pulse);
+       writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(7),
+               &smc->cs[3].cycle);
+       writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
+               AT91_SMC_MODE_EXNW_DISABLE |
+#ifdef CONFIG_SYS_NAND_DBW_16
+               AT91_SMC_MODE_DBW_16 |
+#else /* CONFIG_SYS_NAND_DBW_8 */
+               AT91_SMC_MODE_DBW_8 |
+#endif
+               AT91_SMC_MODE_TDF_CYCLE(1),
+               &smc->cs[3].mode);
+
+       /* Configure RDY/BSY pin */
+       at91_set_pio_input(AT91_PIO_PORTD, 5, 1);
+
+       /* Configure ENABLE pin for NandFlash */
+       at91_set_pio_output(AT91_PIO_PORTD, 4, 1);
+
+       at91_set_a_periph(AT91_PIO_PORTD, 0, 1);    /* NAND OE */
+       at91_set_a_periph(AT91_PIO_PORTD, 1, 1);    /* NAND WE */
+       at91_set_a_periph(AT91_PIO_PORTD, 2, 1);    /* ALE */
+       at91_set_a_periph(AT91_PIO_PORTD, 3, 1);    /* CLE */
+}
+#endif
+
+#ifdef CONFIG_LCD
+vidinfo_t panel_info = {
+       .vl_col = 480,
+       .vl_row = 272,
+       .vl_clk = 9000000,
+       .vl_bpix = LCD_BPP,
+       .vl_sync = 0,
+       .vl_tft = 1,
+       .vl_hsync_len = 5,
+       .vl_left_margin = 8,
+       .vl_right_margin = 43,
+       .vl_vsync_len = 10,
+       .vl_upper_margin = 4,
+       .vl_lower_margin = 12,
+       .mmio = ATMEL_BASE_LCDC,
+};
+
+void lcd_enable(void)
+{
+       at91_set_pio_output(AT91_PIO_PORTC, 25, 0);     /* power up */
+}
+
+void lcd_disable(void)
+{
+       at91_set_pio_output(AT91_PIO_PORTC, 25, 1);     /* power down */
+}
+
+#ifdef CONFIG_LCD_INFO
+void lcd_show_board_info(void)
+{
+       ulong dram_size, nand_size;
+       int i;
+       char temp[32];
+
+       lcd_printf("%s\n", U_BOOT_VERSION);
+       lcd_printf("ATMEL Corp\n");
+       lcd_printf("at91@atmel.com\n");
+       lcd_printf("%s CPU at %s MHz\n",
+               ATMEL_CPU_NAME,
+               strmhz(temp, get_cpu_clk_rate()));
+
+       dram_size = 0;
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
+               dram_size += gd->bd->bi_dram[i].size;
+       nand_size = 0;
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+               nand_size += nand_info[i].size;
+       lcd_printf("  %ld MB SDRAM, %ld MB NAND\n",
+               dram_size >> 20,
+               nand_size >> 20);
+}
+#endif /* CONFIG_LCD_INFO */
+#endif /* CONFIG_LCD */
+
+/* SPI chip select control */
+#ifdef CONFIG_ATMEL_SPI
+#include <spi.h>
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+       return bus == 0 && cs < 2;
+}
+
+void spi_cs_activate(struct spi_slave *slave)
+{
+       switch (slave->cs) {
+       case 0:
+               at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
+               break;
+       case 1:
+               at91_set_pio_output(AT91_PIO_PORTA, 7, 0);
+               break;
+       }
+}
+
+void spi_cs_deactivate(struct spi_slave *slave)
+{
+       switch (slave->cs) {
+       case 0:
+               at91_set_pio_output(AT91_PIO_PORTA, 14, 1);
+               break;
+       case 1:
+               at91_set_pio_output(AT91_PIO_PORTA, 7, 1);
+               break;
+       }
+}
+#endif /* CONFIG_ATMEL_SPI */
+
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+int board_mmc_init(bd_t *bd)
+{
+       at91_mci_hw_init();
+
+       return atmel_mci_init((void *)ATMEL_BASE_HSMCI0);
+}
+#endif
+
+int board_early_init_f(void)
+{
+       /* Enable clocks for all PIOs */
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+       writel((1 << ATMEL_ID_PIOAB) | (1 << ATMEL_ID_PIOCD), &pmc->pcer);
+
+       at91_seriald_hw_init();
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_NAND_ATMEL
+       at91sam9n12ek_nand_hw_init();
+#endif
+
+#ifdef CONFIG_ATMEL_SPI
+       at91_spi0_hw_init(1 << 0);
+#endif
+
+#ifdef CONFIG_LCD
+       at91_lcd_hw_init();
+#endif
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+                                       CONFIG_SYS_SDRAM_SIZE);
+       return 0;
+}
similarity index 77%
rename from board/ti/omap2420h4/Makefile
rename to board/atmel/sama5d3xek/Makefile
index cddd7e69850a024103a623b45d4cfcd6c44c1d1c..45d24d23d7fc963a9bb19dfe207c1f62630b3639 100644 (file)
@@ -1,7 +1,14 @@
 #
-# (C) Copyright 2000-2006
+# (C) Copyright 2003-2008
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
+# (C) Copyright 2008
+# Stelian Pop <stelian@popies.net>
+# Lead Tech Design <www.leadtechdesign.com>
+#
+# (C) Copyright 2013
+# Bo Shen <voice.shen@atmel.com>
+#
 # See file CREDITS for list of people who contributed to this
 # project.
 #
@@ -12,7 +19,7 @@
 #
 # 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
+# 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
@@ -25,11 +32,10 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).o
 
-COBJS  := omap2420h4.o mem.o sys_info.o
-SOBJS  := lowlevel_init.o
+COBJS-y += sama5d3xek.o
 
-SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS   := $(addprefix $(obj),$(COBJS))
+SRCS   := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS-y))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
 $(LIB):        $(obj).depend $(OBJS) $(SOBJS)
diff --git a/board/atmel/sama5d3xek/sama5d3xek.c b/board/atmel/sama5d3xek/sama5d3xek.c
new file mode 100644 (file)
index 0000000..541296d
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2012 - 2013 Atmel Corporation
+ * Bo Shen <voice.shen@atmel.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 <mmc.h>
+#include <asm/io.h>
+#include <asm/arch/sama5d3_smc.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/at91_rstc.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/clk.h>
+#include <lcd.h>
+#include <atmel_lcdc.h>
+#include <atmel_mci.h>
+#include <net.h>
+#include <netdev.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* ------------------------------------------------------------------------- */
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+#ifdef CONFIG_NAND_ATMEL
+void sama5d3xek_nand_hw_init(void)
+{
+       struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
+
+       at91_periph_clk_enable(ATMEL_ID_SMC);
+
+       /* Configure SMC CS3 for NAND/SmartMedia */
+       writel(AT91_SMC_SETUP_NWE(2) | AT91_SMC_SETUP_NCS_WR(1) |
+              AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(1),
+              &smc->cs[3].setup);
+       writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(5) |
+              AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(5),
+              &smc->cs[3].pulse);
+       writel(AT91_SMC_CYCLE_NWE(8) | AT91_SMC_CYCLE_NRD(8),
+              &smc->cs[3].cycle);
+       writel(AT91_SMC_TIMINGS_TCLR(3) | AT91_SMC_TIMINGS_TADL(10) |
+              AT91_SMC_TIMINGS_TAR(3)  | AT91_SMC_TIMINGS_TRR(4)   |
+              AT91_SMC_TIMINGS_TWB(5)  | AT91_SMC_TIMINGS_RBNSEL(3)|
+              AT91_SMC_TIMINGS_NFSEL(1), &smc->cs[3].timings);
+       writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
+              AT91_SMC_MODE_EXNW_DISABLE |
+#ifdef CONFIG_SYS_NAND_DBW_16
+              AT91_SMC_MODE_DBW_16 |
+#else /* CONFIG_SYS_NAND_DBW_8 */
+              AT91_SMC_MODE_DBW_8 |
+#endif
+              AT91_SMC_MODE_TDF_CYCLE(3),
+              &smc->cs[3].mode);
+}
+#endif
+
+#ifdef CONFIG_CMD_USB
+static void sama5d3xek_usb_hw_init(void)
+{
+       at91_set_pio_output(AT91_PIO_PORTD, 25, 0);
+       at91_set_pio_output(AT91_PIO_PORTD, 26, 0);
+       at91_set_pio_output(AT91_PIO_PORTD, 27, 0);
+}
+#endif
+
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+static void sama5d3xek_mci_hw_init(void)
+{
+       at91_mci_hw_init();
+
+       at91_set_pio_output(AT91_PIO_PORTB, 10, 0);     /* MCI0 Power */
+}
+#endif
+
+#ifdef CONFIG_LCD
+vidinfo_t panel_info = {
+       .vl_col = 800,
+       .vl_row = 480,
+       .vl_clk = 24000000,
+       .vl_sync = ATMEL_LCDC_INVLINE_NORMAL | ATMEL_LCDC_INVFRAME_NORMAL,
+       .vl_bpix = LCD_BPP,
+       .vl_tft = 1,
+       .vl_hsync_len = 128,
+       .vl_left_margin = 64,
+       .vl_right_margin = 64,
+       .vl_vsync_len = 2,
+       .vl_upper_margin = 22,
+       .vl_lower_margin = 21,
+       .mmio = ATMEL_BASE_LCDC,
+};
+
+void lcd_enable(void)
+{
+}
+
+void lcd_disable(void)
+{
+}
+
+static void sama5d3xek_lcd_hw_init(void)
+{
+       gd->fb_base = CONFIG_SAMA5D3_LCD_BASE;
+
+       /* The higher 8 bit of LCD is board related */
+       at91_set_c_periph(AT91_PIO_PORTC, 14, 0);       /* LCDD16 */
+       at91_set_c_periph(AT91_PIO_PORTC, 13, 0);       /* LCDD17 */
+       at91_set_c_periph(AT91_PIO_PORTC, 12, 0);       /* LCDD18 */
+       at91_set_c_periph(AT91_PIO_PORTC, 11, 0);       /* LCDD19 */
+       at91_set_c_periph(AT91_PIO_PORTC, 10, 0);       /* LCDD20 */
+       at91_set_c_periph(AT91_PIO_PORTC, 15, 0);       /* LCDD21 */
+       at91_set_c_periph(AT91_PIO_PORTE, 27, 0);       /* LCDD22 */
+       at91_set_c_periph(AT91_PIO_PORTE, 28, 0);       /* LCDD23 */
+
+       /* Configure lower 16 bit of LCD and enable clock */
+       at91_lcd_hw_init();
+}
+
+#ifdef CONFIG_LCD_INFO
+#include <nand.h>
+#include <version.h>
+
+void lcd_show_board_info(void)
+{
+       ulong dram_size, nand_size;
+       int i;
+       char temp[32];
+
+       lcd_printf("%s\n", U_BOOT_VERSION);
+       lcd_printf("(C) 2013 ATMEL Corp\n");
+       lcd_printf("at91@atmel.com\n");
+       lcd_printf("%s CPU at %s MHz\n", get_cpu_name(),
+                  strmhz(temp, get_cpu_clk_rate()));
+
+       dram_size = 0;
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
+               dram_size += gd->bd->bi_dram[i].size;
+
+       nand_size = 0;
+#ifdef CONFIG_NAND_ATMEL
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+               nand_size += nand_info[i].size;
+#endif
+       lcd_printf("%ld MB SDRAM, %ld MB NAND\n",
+                  dram_size >> 20, nand_size >> 20);
+}
+#endif /* CONFIG_LCD_INFO */
+#endif /* CONFIG_LCD */
+
+int board_early_init_f(void)
+{
+       at91_seriald_hw_init();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_NAND_ATMEL
+       sama5d3xek_nand_hw_init();
+#endif
+#ifdef CONFIG_CMD_USB
+       sama5d3xek_usb_hw_init();
+#endif
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+       sama5d3xek_mci_hw_init();
+#endif
+#ifdef CONFIG_ATMEL_SPI
+       at91_spi0_hw_init(1 << 0);
+#endif
+#ifdef CONFIG_MACB
+       if (has_emac())
+               at91_macb_hw_init();
+#endif
+#ifdef CONFIG_LCD
+       if (has_lcdc())
+               sama5d3xek_lcd_hw_init();
+#endif
+       return 0;
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+                                   CONFIG_SYS_SDRAM_SIZE);
+       return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       int rc = 0;
+
+#ifdef CONFIG_MACB
+       if (has_emac())
+               rc = macb_eth_initialize(0, (void *)ATMEL_BASE_EMAC, 0x00);
+#endif
+
+       return rc;
+}
+
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+int board_mmc_init(bd_t *bis)
+{
+       int rc = 0;
+
+       rc = atmel_mci_init((void *)ATMEL_BASE_MCI0);
+
+       return rc;
+}
+#endif
+
+/* SPI chip select control */
+#ifdef CONFIG_ATMEL_SPI
+#include <spi.h>
+
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+       return bus == 0 && cs < 4;
+}
+
+void spi_cs_activate(struct spi_slave *slave)
+{
+       switch (slave->cs) {
+       case 0:
+               at91_set_pio_output(AT91_PIO_PORTD, 13, 0);
+       case 1:
+               at91_set_pio_output(AT91_PIO_PORTD, 14, 0);
+       case 2:
+               at91_set_pio_output(AT91_PIO_PORTD, 15, 0);
+       case 3:
+               at91_set_pio_output(AT91_PIO_PORTD, 16, 0);
+       default:
+               break;
+       }
+}
+
+void spi_cs_deactivate(struct spi_slave *slave)
+{
+       switch (slave->cs) {
+       case 0:
+               at91_set_pio_output(AT91_PIO_PORTD, 13, 1);
+       case 1:
+               at91_set_pio_output(AT91_PIO_PORTD, 14, 1);
+       case 2:
+               at91_set_pio_output(AT91_PIO_PORTD, 15, 1);
+       case 3:
+               at91_set_pio_output(AT91_PIO_PORTD, 16, 1);
+       default:
+               break;
+       }
+}
+#endif /* CONFIG_ATMEL_SPI */
index e7d1f86cdb1bff1204fd0fea3e7cd5e6c5480ec9..0a3b47b5d0486bc1503694dd3ceecef629c6205e 100644 (file)
@@ -44,3 +44,14 @@ DATA 4, MX6_IOMUXC_GPR4, 0xF00000CF
 /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
 DATA 4, MX6_IOMUXC_GPR6, 0x007F007F
 DATA 4, MX6_IOMUXC_GPR7, 0x007F007F
+
+/*
+ * Setup CCM_CCOSR register as follows:
+ *
+ * cko1_en  = 1           --> CKO1 enabled
+ * cko1_div = 111  --> divide by 8
+ * cko1_sel = 1011 --> ahb_clk_root
+ *
+ * This sets CKO1 at ahb_clk_root/8 = 132/8 = 16.5 MHz
+ */
+DATA 4, CCM_CCOSR, 0x000000fb
index cc071d6d38c3ea9b9656fd800307b886f8404b6c..8f0f9b8de2e8e77fcbf477728ea063a213941dd0 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |           \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |              \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |           \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |              \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS |                            \
-       PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
+#define SPI_PAD_CTRL (PAD_CTL_HYS | 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)
+#define BUTTON_PAD_CTRL (PAD_CTL_PUS_100K_UP |                 \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define I2C_PAD_CTRL   (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm | PAD_CTL_HYS |                       \
+#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
 
-#define WEAK_PULLUP    (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm | PAD_CTL_HYS |                       \
+#define WEAK_PULLUP    (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_SRE_SLOW)
 
-#define WEAK_PULLDOWN  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
-       PAD_CTL_DSE_40ohm | PAD_CTL_HYS |                       \
-       PAD_CTL_SRE_SLOW)
+#define WEAK_PULLDOWN  (PAD_CTL_PUS_100K_DOWN |                \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_HYS | PAD_CTL_SRE_SLOW)
 
 #define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
 
@@ -342,7 +336,6 @@ iomux_v3_cfg_t const ecspi1_pads[] = {
 
 void setup_spi(void)
 {
-       gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
        imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
                                         ARRAY_SIZE(ecspi1_pads));
 }
similarity index 82%
rename from board/cm_t35/Makefile
rename to board/compulab/cm_t35/Makefile
index bde56e61f4178c76e4ac860fde3edfa445bce413..31d9bbbfe3e0342b637798cc7cb6897b554bab4a 100644 (file)
@@ -1,6 +1,8 @@
 #
-# (C) Copyright 2000, 2001, 2002
-# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+# (C) Copyright 2011 - 2013 CompuLab, Ltd. <www.compulab.co.il>
+#
+# Authors: Nikita Kiryanov <nikita@compulab.co.il>
+#         Igor Grinberg <grinberg@compulab.co.il>
 #
 # See file CREDITS for list of people who contributed to this
 # project.
@@ -17,9 +19,7 @@
 #
 # 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
-#
+# Foundation, Inc.
 
 include $(TOPDIR)/config.mk
 
@@ -42,3 +42,5 @@ $(LIB):       $(obj).depend $(OBJS)
 include $(SRCTREE)/rules.mk
 
 sinclude $(obj).depend
+
+#########################################################################
similarity index 96%
rename from board/cm_t35/cm_t35.c
rename to board/compulab/cm_t35/cm_t35.c
index 84c36bafb414d56004fa8de98682bd2995ab5c1d..b0b80e5bc90a318ee8c6cbd2e3769b3d44f05f84 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2011 CompuLab, Ltd. <www.compulab.co.il>
+ * (C) Copyright 2011 - 2013 CompuLab, Ltd. <www.compulab.co.il>
  *
  * Authors: Mike Rapoport <mike@compulab.co.il>
  *         Igor Grinberg <grinberg@compulab.co.il>
@@ -448,7 +448,7 @@ int board_mmc_getcd(struct mmc *mmc)
 {
        u8 val;
 
-       if (twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, &val, TWL4030_BASEADD_GPIO))
+       if (twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO, &val))
                return -1;
 
        return !(val & 1);
@@ -493,17 +493,17 @@ static void setup_net_chip_gmpc(void)
 static void reset_net_chip(void)
 {
        /* Set GPIO1 of TPS65930 as output */
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, 0x02,
-                               TWL4030_BASEADD_GPIO + 0x03);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x03,
+                            0x02);
        /* Send a pulse on the GPIO pin */
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, 0x02,
-                               TWL4030_BASEADD_GPIO + 0x0C);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x0C,
+                            0x02);
        udelay(1);
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, 0x02,
-                               TWL4030_BASEADD_GPIO + 0x09);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x09,
+                            0x02);
        mdelay(40);
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, 0x02,
-                               TWL4030_BASEADD_GPIO + 0x0C);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, TWL4030_BASEADD_GPIO + 0x0C,
+                            0x02);
        mdelay(1);
 }
 #else
@@ -597,13 +597,13 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
        udelay(1000);
 
        offset = TWL4030_BASEADD_GPIO + TWL4030_GPIO_GPIODATADIR1;
-       twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, &val, offset);
+       twl4030_i2c_read_u8(TWL4030_CHIP_GPIO, offset, &val);
        /* Set GPIO6 and GPIO7 of TPS65930 as output */
        val |= 0xC0;
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, val, offset);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, offset, val);
        offset = TWL4030_BASEADD_GPIO + TWL4030_GPIO_SETGPIODATAOUT1;
        /* Take both PHYs out of reset */
-       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, 0xC0, offset);
+       twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, offset, 0xC0);
        udelay(1);
 
        return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
similarity index 99%
rename from board/cm_t35/display.c
rename to board/compulab/cm_t35/display.c
index a004ea1d803206ee99f020c31b17e3b64283e6f9..adc485365ce2d30ead07a45df9e3feee8e971f8f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2012 CompuLab, Ltd. <www.compulab.co.il>
+ * (C) Copyright 2012 - 2013 CompuLab, Ltd. <www.compulab.co.il>
  *
  * Authors: Nikita Kiryanov <nikita@compulab.co.il>
  *
similarity index 95%
rename from board/cm_t35/leds.c
rename to board/compulab/cm_t35/leds.c
index 48ad598d90673552fa492ce34234f1aed4d280ac..dcae135c144204cca974b9599c4fe92e77e8800b 100644 (file)
@@ -1,6 +1,5 @@
 /*
- * (C) Copyright 2011
- * CompuLab, Ltd. <www.compulab.co.il>
+ * (C) Copyright 2011 - 2013 CompuLab, Ltd. <www.compulab.co.il>
  *
  * Author: Igor Grinberg <grinberg@compulab.co.il>
  *
diff --git a/board/congatec/cgtqmx6eval/Makefile b/board/congatec/cgtqmx6eval/Makefile
new file mode 100644 (file)
index 0000000..ac16c1f
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
+#
+# (C) Copyright 2011 Freescale Semiconductor, Inc.
+# (C) Copyright 2013 Adeneo Embedded <www.adeneo-embedded.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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := cgtqmx6eval.o
+
+SRCS   := $(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/congatec/cgtqmx6eval/README b/board/congatec/cgtqmx6eval/README
new file mode 100644 (file)
index 0000000..bbf0f75
--- /dev/null
@@ -0,0 +1,29 @@
+U-Boot for the Congatec Conga-QEVAl Evaluation Carrier board with
+qmx6 quad module.
+
+This file contains information for the port of U-Boot to the Congatec
+Conga-QEVAl Evaluation Carrier board with qmx6 quad module.
+
+1. Boot source, boot from SD card
+---------------------------------
+
+This version of u-boot works only on the SD card. By default, the
+Congatec board can boot only from the SPI-NOR.
+But, with the u-boot version provided with the board you can write boot
+registers to force the board to reboot and boot from the SD slot. If
+"bmode" command is not available from your pre-installed u-boot, these
+instruction will produce the same effect:
+
+conga-QMX6 U-Boot > mw.l 0x20d8040 0x3850
+conga-QMX6 U-Boot > mw.l 0x020d8044 0x10000000
+conga-QMX6 U-Boot > reset
+resetting ...
+
+The the board will reboot and, if you have written your SD correctly
+the board will use u-boot that live into the SD
+
+To copy the resulting u-boot.imx to the SD card:
+
+ dd if=u-boot.imx of=/dev/xxx bs=512 seek=2
+
+Note: Replace xxx with the device representing the SD card in your system.
diff --git a/board/congatec/cgtqmx6eval/cgtqmx6eval.c b/board/congatec/cgtqmx6eval/cgtqmx6eval.c
new file mode 100644 (file)
index 0000000..f70f674
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Based on mx6qsabrelite.c file
+ * Copyright (C) 2013, Adeneo Embedded <www.adeneo-embedded.com>
+ * Leo Sartre, <lsartre@adeneo-embedded.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/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/boot_mode.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |\
+       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |\
+       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+iomux_v3_cfg_t const uart2_pads[] = {
+       MX6_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const usdhc2_pads[] = {
+       MX6_PAD_SD2_CLK__USDHC2_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_CMD__USDHC2_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT0__USDHC2_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT1__USDHC2_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT2__USDHC2_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT3__USDHC2_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_GPIO_4__GPIO_1_4      | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const usdhc4_pads[] = {
+       MX6_PAD_SD4_CLK__USDHC4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_CMD__USDHC4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT4__USDHC4_DAT4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT5__USDHC4_DAT5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT6__USDHC4_DAT6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD4_DAT7__USDHC4_DAT7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_NANDF_D6__GPIO_2_6    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+};
+
+static void setup_iomux_uart(void)
+{
+       imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg usdhc_cfg[] = {
+       {USDHC2_BASE_ADDR},
+       {USDHC4_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC2_BASE_ADDR:
+               gpio_direction_input(IMX_GPIO_NR(1, 4));
+               ret = !gpio_get_value(IMX_GPIO_NR(1, 4));
+               break;
+       case USDHC4_BASE_ADDR:
+               gpio_direction_input(IMX_GPIO_NR(2, 6));
+               ret = !gpio_get_value(IMX_GPIO_NR(2, 6));
+               break;
+       default:
+               printf("Bad USDHC interface\n");
+       }
+
+       return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       s32 status = 0;
+
+       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
+
+       imx_iomux_v3_setup_multiple_pads(
+                               usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
+       imx_iomux_v3_setup_multiple_pads(
+                               usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
+
+       status = fsl_esdhc_initialize(bis, &usdhc_cfg[0]) |
+                    fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
+
+       return status;
+}
+#endif
+
+int board_early_init_f(void)
+{
+       setup_iomux_uart();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: Conga-QEVAL QMX6 Quad\n");
+
+       return 0;
+}
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+       /* 4 bit bus width */
+       {"mmc0",        MAKE_CFGVAL(0x50, 0x20, 0x00, 0x00)},
+       {"mmc1",        MAKE_CFGVAL(0x50, 0x38, 0x00, 0x00)},
+       {NULL,          0},
+};
+#endif
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_CMD_BMODE
+       add_board_boot_modes(board_boot_modes);
+#endif
+       return 0;
+}
index c45c94b4c0d6ccc231dfe6db5f74ba8e715e2ec9..a4e92541578bd70535594957ce256a1ce6439005 100644 (file)
 #include <asm/arch/hardware.h>
 #include <asm/arch/emif_defs.h>
 #include <asm/arch/emac_defs.h>
+#include <asm/arch/pinmux_defs.h>
 #include <asm/io.h>
 #include <nand.h>
 #include <asm/arch/nand_defs.h>
 #include <asm/arch/davinci_misc.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
-/* SPI0 pin muxer settings */
-static const struct pinmux_config spi0_pins[] = {
-       { pinmux(7), 1, 3 },
-       { pinmux(7), 1, 4 },
-       { pinmux(7), 1, 5 },
-       { pinmux(7), 1, 6 },
-       { pinmux(7), 1, 7 }
-};
-
-/* EMIF-A bus pins for 8-bit NAND support on CS3 */
-static const struct pinmux_config emifa_nand_pins[] = {
-       { pinmux(13), 1, 6 },
-       { pinmux(13), 1, 7 },
-       { pinmux(14), 1, 0 },
-       { pinmux(14), 1, 1 },
-       { pinmux(14), 1, 2 },
-       { pinmux(14), 1, 3 },
-       { pinmux(14), 1, 4 },
-       { pinmux(14), 1, 5 },
-       { pinmux(15), 1, 7 },
-       { pinmux(16), 1, 0 },
-       { pinmux(18), 1, 1 },
-       { pinmux(18), 1, 4 },
-       { pinmux(18), 1, 5 },
-};
-
-/* EMAC PHY interface pins */
-static const struct pinmux_config emac_pins[] = {
-       { pinmux(9), 0, 5 },
-       { pinmux(10), 2, 1 },
-       { pinmux(10), 2, 2 },
-       { pinmux(10), 2, 3 },
-       { pinmux(10), 2, 4 },
-       { pinmux(10), 2, 5 },
-       { pinmux(10), 2, 6 },
-       { pinmux(10), 2, 7 },
-       { pinmux(11), 2, 0 },
-       { pinmux(11), 2, 1 },
-};
-
-/* UART pin muxer settings */
-static const struct pinmux_config uart_pins[] = {
-       { pinmux(8), 2, 7 },
-       { pinmux(9), 2, 0 }
-};
-
-/* I2C pin muxer settings */
-static const struct pinmux_config i2c_pins[] = {
-       { pinmux(8), 2, 3 },
-       { pinmux(8), 2, 4 }
-};
-
-#ifdef CONFIG_USE_NAND
-/* NAND pin muxer settings */
-const struct pinmux_config aemif_pins[] = {
-       { pinmux(13), 1, 6 },
-       { pinmux(13), 1, 7 },
-       { pinmux(14), 1, 0 },
-       { pinmux(14), 1, 1 },
-       { pinmux(14), 1, 2 },
-       { pinmux(14), 1, 3 },
-       { pinmux(14), 1, 4 },
-       { pinmux(14), 1, 5 },
-       { pinmux(14), 1, 6 },
-       { pinmux(14), 1, 7 },
-       { pinmux(15), 1, 0 },
-       { pinmux(15), 1, 1 },
-       { pinmux(15), 1, 2 },
-       { pinmux(15), 1, 3 },
-       { pinmux(15), 1, 4 },
-       { pinmux(15), 1, 5 },
-       { pinmux(15), 1, 6 },
-       { pinmux(15), 1, 7 },
-       { pinmux(16), 1, 0 },
-       { pinmux(16), 1, 1 },
-       { pinmux(16), 1, 2 },
-       { pinmux(16), 1, 3 },
-       { pinmux(16), 1, 4 },
-       { pinmux(16), 1, 5 },
-       { pinmux(16), 1, 6 },
-       { pinmux(16), 1, 7 },
-       { pinmux(17), 1, 0 },
-       { pinmux(17), 1, 1 },
-       { pinmux(17), 1, 2 },
-       { pinmux(17), 1, 3 },
-       { pinmux(17), 1, 4 },
-       { pinmux(17), 1, 5 },
-       { pinmux(17), 1, 6 },
-       { pinmux(17), 1, 7 },
-       { pinmux(18), 1, 0 },
-       { pinmux(18), 1, 1 },
-       { pinmux(18), 1, 2 },
-       { pinmux(18), 1, 3 },
-       { pinmux(18), 1, 4 },
-       { pinmux(18), 1, 5 },
-       { pinmux(18), 1, 6 },
-       { pinmux(18), 1, 7 },
-       { pinmux(10), 1, 0 }
-};
+#ifdef CONFIG_DAVINCI_MMC
+#include <mmc.h>
+#include <asm/arch/sdmmc_defs.h>
 #endif
 
-
-/* USB0_DRVVBUS pin muxer settings */
-static const struct pinmux_config usb_pins[] = {
-       { pinmux(9), 1, 1 }
-};
+DECLARE_GLOBAL_DATA_PTR;
 
 static const struct pinmux_resource pinmuxes[] = {
 #ifdef CONFIG_SPI_FLASH
-       PINMUX_ITEM(spi0_pins),
+       PINMUX_ITEM(spi0_pins_base),
+       PINMUX_ITEM(spi0_pins_scs0),
+       PINMUX_ITEM(spi0_pins_ena),
 #endif
-       PINMUX_ITEM(uart_pins),
-       PINMUX_ITEM(i2c_pins),
+       PINMUX_ITEM(uart2_pins_txrx),
+       PINMUX_ITEM(i2c0_pins),
 #ifdef CONFIG_USB_DA8XX
        PINMUX_ITEM(usb_pins),
 #endif
 #ifdef CONFIG_USE_NAND
-       PINMUX_ITEM(emifa_nand_pins),
-       PINMUX_ITEM(aemif_pins),
+       PINMUX_ITEM(emifa_pins),
+       PINMUX_ITEM(emifa_pins_cs0),
+       PINMUX_ITEM(emifa_pins_cs2),
+       PINMUX_ITEM(emifa_pins_cs3),
 #endif
 #if defined(CONFIG_DRIVER_TI_EMAC)
-       PINMUX_ITEM(emac_pins),
+       PINMUX_ITEM(emac_pins_rmii),
+       PINMUX_ITEM(emac_pins_mdio),
+       PINMUX_ITEM(emac_pins_rmii_clk_source),
+#endif
+#ifdef CONFIG_DAVINCI_MMC
+       PINMUX_ITEM(mmc0_pins_8bit)
 #endif
 };
 
@@ -177,8 +85,31 @@ static const struct lpsc_resource lpsc[] = {
        { DAVINCI_LPSC_EMAC },  /* image download */
        { DAVINCI_LPSC_UART2 }, /* console */
        { DAVINCI_LPSC_GPIO },
+#ifdef CONFIG_DAVINCI_MMC
+       { DAVINCI_LPSC_MMC_SD },
+#endif
+
+};
+
+#ifdef CONFIG_DAVINCI_MMC
+static struct davinci_mmc mmc_sd0 = {
+       .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
+       .host_caps = MMC_MODE_8BIT,
+       .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
+       .version = MMC_CTLR_VERSION_2,
 };
 
+int board_mmc_init(bd_t *bis)
+{
+       mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
+
+       printf("%x\n", mmc_sd0.input_clk);
+
+       /* Add slot-0 to mmc subsystem */
+       return davinci_mmc_init(bis, &mmc_sd0);
+}
+#endif
+
 int board_init(void)
 {
 #ifndef CONFIG_USE_IRQ
diff --git a/board/denx/m53evk/Makefile b/board/denx/m53evk/Makefile
new file mode 100644 (file)
index 0000000..bfb040a
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# DENX M53EVK
+# Copyright (C) 2012-2013 Marek Vasut <marex@denx.de>
+#
+# 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  := m53evk.o
+
+SRCS   := $(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/denx/m53evk/imximage.cfg b/board/denx/m53evk/imximage.cfg
new file mode 100644 (file)
index 0000000..27c593a
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * DENX M53 DRAM init values
+ * Copyright (C) 2012-2013 Marek Vasut <marex@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
+ */
+#include <asm/imx-common/imximage.cfg>
+
+/* image version */
+IMAGE_VERSION  2
+
+
+/* Boot Offset 0x400, valid for both SD and NAND boot. */
+BOOT_OFFSET    FLASH_OFFSET_STANDARD
+
+/*
+ * 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
+ */
+DATA 4 0x53fa86f4 0x00000000    /* GRP_DDRMODE_CTL */
+DATA 4 0x53fa8714 0x00000000    /* GRP_DDRMODE */
+DATA 4 0x53fa86fc 0x00000000    /* GRP_DDRPKE */
+DATA 4 0x53fa8724 0x04000000    /* GRP_DDR_TYPE */
+
+DATA 4 0x53fa872c 0x00300000    /* GRP_B3DS */
+DATA 4 0x53fa8554 0x00300000    /* DRAM_DQM3 */
+DATA 4 0x53fa8558 0x00300040    /* DRAM_SDQS3 */
+
+DATA 4 0x53fa8728 0x00300000    /* GRP_B2DS */
+DATA 4 0x53fa8560 0x00300000    /* DRAM_DQM2 */
+DATA 4 0x53fa8568 0x00300040    /* DRAM_SDQS2 */
+
+DATA 4 0x53fa871c 0x00300000    /* GRP_B1DS */
+DATA 4 0x53fa8594 0x00300000    /* DRAM_DQM1 */
+DATA 4 0x53fa8590 0x00300040    /* DRAM_SDQS1 */
+
+DATA 4 0x53fa8718 0x00300000    /* GRP_B0DS */
+DATA 4 0x53fa8584 0x00300000    /* DRAM_DQM0 */
+DATA 4 0x53fa857c 0x00300040    /* DRAM_SDQS0 */
+
+DATA 4 0x53fa8578 0x00300000    /* DRAM_SDCLK_0 */
+DATA 4 0x53fa8570 0x00300000    /* DRAM_SDCLK_1 */
+
+DATA 4 0x53fa8574 0x00300000    /* DRAM_CAS */
+DATA 4 0x53fa8588 0x00300000    /* DRAM_RAS */
+DATA 4 0x53fa86f0 0x00300000    /* GRP_ADDDS */
+DATA 4 0x53fa8720 0x00300000    /* GRP_CTLDS */
+
+DATA 4 0x53fa8564 0x00300040    /* DRAM_SDODT1 */
+DATA 4 0x53fa8580 0x00300040    /* DRAM_SDODT0 */
+
+/* ESDCTL */
+DATA 4 0x63fd9088 0x32383535
+DATA 4 0x63fd9090 0x40383538
+DATA 4 0x63fd907c 0x0136014d
+DATA 4 0x63fd9080 0x01510141
+
+DATA 4 0x63fd9018 0x00011740
+DATA 4 0x63fd9000 0xc3190000
+DATA 4 0x63fd900c 0x555952e3
+DATA 4 0x63fd9010 0xb68e8b63
+DATA 4 0x63fd9014 0x01ff00db
+DATA 4 0x63fd902c 0x000026d2
+DATA 4 0x63fd9030 0x009f0e21
+DATA 4 0x63fd9008 0x12273030
+DATA 4 0x63fd9004 0x0002002d
+DATA 4 0x63fd901c 0x00008032
+DATA 4 0x63fd901c 0x00008033
+DATA 4 0x63fd901c 0x00028031
+DATA 4 0x63fd901c 0x092080b0
+DATA 4 0x63fd901c 0x04008040
+DATA 4 0x63fd901c 0x0000803a
+DATA 4 0x63fd901c 0x0000803b
+DATA 4 0x63fd901c 0x00028039
+DATA 4 0x63fd901c 0x09208138
+DATA 4 0x63fd901c 0x04008048
+DATA 4 0x63fd9020 0x00001800
+DATA 4 0x63fd9040 0x04b80003
+DATA 4 0x63fd9058 0x00022227
+DATA 4 0x63fd901c 0x00000000
diff --git a/board/denx/m53evk/m53evk.c b/board/denx/m53evk/m53evk.c
new file mode 100644 (file)
index 0000000..12917fd
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+ * DENX M53 module
+ *
+ * Copyright (C) 2012-2013 Marek Vasut <marex@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 <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux-mx53.h>
+#include <asm/arch/spl.h>
+#include <asm/errno.h>
+#include <netdev.h>
+#include <i2c.h>
+#include <mmc.h>
+#include <spl.h>
+#include <fsl_esdhc.h>
+#include <asm/gpio.h>
+#include <usb/ehci-fsl.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int dram_init(void)
+{
+       u32 size1, size2;
+
+       size1 = get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
+       size2 = get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE);
+
+       gd->ram_size = size1 + size2;
+
+       return 0;
+}
+void dram_init_banksize(void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+       gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
+       gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
+}
+
+static void setup_iomux_uart(void)
+{
+       static const iomux_v3_cfg_t uart_pads[] = {
+               MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX,
+               MX53_PAD_PATA_DMARQ__UART2_TXD_MUX,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+}
+
+#ifdef CONFIG_USB_EHCI_MX5
+int board_ehci_hcd_init(int port)
+{
+       if (port == 0) {
+               /* USB OTG PWRON */
+               imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX53_PAD_GPIO_4__GPIO1_4,
+                                       PAD_CTL_PKE | PAD_CTL_DSE_HIGH));
+               gpio_direction_output(IMX_GPIO_NR(1, 4), 0);
+
+               /* USB OTG Over Current */
+               imx_iomux_v3_setup_pad(MX53_PAD_GPIO_18__GPIO7_13);
+       } else if (port == 1) {
+               /* USB Host PWRON */
+               imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX53_PAD_GPIO_2__GPIO1_2,
+                                       PAD_CTL_PKE | PAD_CTL_DSE_HIGH));
+               gpio_direction_output(IMX_GPIO_NR(1, 2), 0);
+
+               /* USB Host Over Current */
+               imx_iomux_v3_setup_pad(MX53_PAD_GPIO_3__USBOH3_USBH1_OC);
+       }
+
+       return 0;
+}
+#endif
+
+static void setup_iomux_fec(void)
+{
+       static const iomux_v3_cfg_t fec_pads[] = {
+               /* MDIO pads */
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
+
+               /* FEC 0 pads */
+               NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
+
+               /* FEC 1 pads */
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL0__FEC_RDATA_3,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW0__FEC_TX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL1__FEC_RX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW1__FEC_COL,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL2__FEC_RDATA_2,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW2__FEC_TDATA_2, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL3__FEC_CRS,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_GPIO_19__FEC_TDATA_3, PAD_CTL_DSE_HIGH),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg esdhc_cfg = {
+       MMC_SDHC1_BASE_ADDR,
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       imx_iomux_v3_setup_pad(MX53_PAD_GPIO_1__GPIO1_1);
+       gpio_direction_input(IMX_GPIO_NR(1, 1));
+
+       return !gpio_get_value(IMX_GPIO_NR(1, 1));
+}
+
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+
+int board_mmc_init(bd_t *bis)
+{
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA13__GPIO3_13,
+
+               MX53_PAD_EIM_EB3__GPIO2_31, /* SD power */
+       };
+
+       esdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+
+       imx_iomux_v3_setup_multiple_pads(sd1_pads, ARRAY_SIZE(sd1_pads));
+
+       /* GPIO 2_31 is SD power */
+       gpio_direction_output(IMX_GPIO_NR(2, 31), 0);
+
+       return fsl_esdhc_initialize(bis, &esdhc_cfg);
+}
+#endif
+
+#define I2C_PAD_CTRL   (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
+static void setup_iomux_i2c(void)
+{
+       static const iomux_v3_cfg_t i2c_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_EIM_D16__I2C2_SDA, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_EIM_EB2__I2C2_SCL, I2C_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(i2c_pads, ARRAY_SIZE(i2c_pads));
+}
+
+static void setup_iomux_nand(void)
+{
+       static const iomux_v3_cfg_t nand_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_CLE__EMI_NANDF_CLE,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_ALE__EMI_NANDF_ALE,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B,
+                               PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0,
+                               PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__EMI_NANDF_D_0,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__EMI_NANDF_D_1,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__EMI_NANDF_D_2,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__EMI_NANDF_D_3,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA4__EMI_NANDF_D_4,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA5__EMI_NANDF_D_5,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA6__EMI_NANDF_D_6,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA7__EMI_NANDF_D_7,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_PKE),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads));
+}
+
+static void m53_set_clock(void)
+{
+       int ret;
+       const uint32_t ref_clk = MXC_HCLK;
+       const uint32_t dramclk = 400;
+       uint32_t cpuclk;
+
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX53_PAD_GPIO_10__GPIO4_0,
+                                           PAD_CTL_DSE_HIGH | PAD_CTL_PKE));
+       gpio_direction_input(IMX_GPIO_NR(4, 0));
+
+       /* GPIO10 selects modules' CPU speed, 1 = 1200MHz ; 0 = 800MHz */
+       cpuclk = gpio_get_value(IMX_GPIO_NR(4, 0)) ? 1200 : 800;
+
+       ret = mxc_set_clock(ref_clk, cpuclk, MXC_ARM_CLK);
+       if (ret)
+               printf("CPU:   Switch CPU clock to %dMHz failed\n", cpuclk);
+
+       ret = mxc_set_clock(ref_clk, dramclk, MXC_PERIPH_CLK);
+       if (ret) {
+               printf("CPU:   Switch peripheral clock to %dMHz failed\n",
+                       dramclk);
+       }
+
+       ret = mxc_set_clock(ref_clk, dramclk, MXC_DDR_CLK);
+       if (ret)
+               printf("CPU:   Switch DDR clock to %dMHz failed\n", dramclk);
+}
+
+static void m53_set_nand(void)
+{
+       u32 i;
+
+       /* NAND flash is muxed on ATA pins */
+       setbits_le32(M4IF_BASE_ADDR + 0xc, M4IF_GENP_WEIM_MM_MASK);
+
+       /* Wait for Grant/Ack sequence (see EIM_CSnGCR2:MUX16_BYP_GRANT) */
+       for (i = 0x4; i < 0x94; i += 0x18) {
+               clrbits_le32(WEIM_BASE_ADDR + i,
+                            WEIM_GCR2_MUX16_BYP_GRANT_MASK);
+       }
+
+       mxc_set_clock(0, 33, MXC_NFC_CLK);
+       enable_nfc_clk(1);
+}
+
+int board_early_init_f(void)
+{
+       setup_iomux_uart();
+       setup_iomux_fec();
+       setup_iomux_i2c();
+       setup_iomux_nand();
+
+       m53_set_clock();
+
+       mxc_set_sata_internal_clock();
+
+       /* NAND clock @ 33MHz */
+       m53_set_nand();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: DENX M53EVK\n");
+
+       return 0;
+}
+
+/*
+ * NAND SPL
+ */
+#ifdef CONFIG_SPL_BUILD
+void spl_board_init(void)
+{
+       setup_iomux_nand();
+       m53_set_clock();
+       m53_set_nand();
+}
+
+u32 spl_boot_device(void)
+{
+       return BOOT_DEVICE_NAND;
+}
+#endif
index 41d6bb6a9c95cd1a2fcda6df7c8556c09dbb6239..051fa6e4dc090aa87d850c2eb3594963325b57e3 100644 (file)
 #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/arch/iomux-mx53.h>
 #include <asm/errno.h>
 #include <netdev.h>
 #include <mmc.h>
@@ -66,109 +65,53 @@ int dram_init(void)
        return 0;
 }
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 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 const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT13__UART4_RXD_MUX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT12__UART4_TXD_MUX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 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);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL0__FEC_RDATA_3,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL2__FEC_RDATA_2,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_GPIO_19__FEC_TDATA_3, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW2__FEC_TDATA_2, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL3__FEC_CRS,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW1__FEC_COL,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL1__FEC_RX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -178,76 +121,51 @@ int board_mmc_getcd(struct mmc *mmc)
 {
        int ret;
 
-       ret = !gpio_get_value(IOMUX_TO_GPIO(MX53_PIN_GPIO_1));
+       ret = !gpio_get_value(IMX_GPIO_NR(1, 1));
 
        return ret;
 }
 
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+#define SD_CD_PAD_CTRL         (PAD_CTL_DSE_HIGH | PAD_CTL_HYS | PAD_CTL_PKE)
+
 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);
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_GPIO_1__GPIO1_1, SD_CD_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(sd1_pads, ARRAY_SIZE(sd1_pads));
+       gpio_direction_input(IMX_GPIO_NR(1, 1));
 
        esdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
        return fsl_esdhc_initialize(bis, &esdhc_cfg);
 }
 #endif
 
+#define SPI_PAD_CTRL   (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_47K_UP)
+
 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);
+       static const iomux_v3_cfg_t spi_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__ECSPI2_SCLK, SPI_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__ECSPI2_MOSI, SPI_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__ECSPI2_MISO, SPI_PAD_CTRL),
+               /* SSEL 0 */
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__GPIO5_29, SPI_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
+       gpio_direction_output(IMX_GPIO_NR(5, 29), 1);
 }
 
 int board_early_init_f(void)
index 41887c2c7a8ec7738ee29240d0a83b8d1617b821..a39c17a5677cbbe65d6c85b308c83d95cf0d06cc 100644 (file)
@@ -166,11 +166,13 @@ int configure_vsc3316_3308(void)
                ret = select_i2c_ch_pca(I2C_CH_VSC3316);
                if (!ret) {
                        ret = vsc3316_config(VSC3316_TX_ADDRESS,
-                                       vsc16_tx_sgmii_lane_ab, num_vsc16_con);
+                                       vsc16_tx_4sfp_sgmii_12_56,
+                                       num_vsc16_con);
                        if (ret)
                                return ret;
                        ret = vsc3316_config(VSC3316_RX_ADDRESS,
-                                       vsc16_rx_sgmii_lane_ab, num_vsc16_con);
+                                       vsc16_rx_4sfp_sgmii_12_56,
+                                       num_vsc16_con);
                        if (ret)
                                return ret;
                } else {
index 994dec570e2737318544c6a63b07c866bc979d9d..c2b6c44d2572e9211ad7489ade5a4fabe28ab946 100644 (file)
 static const int8_t vsc16_tx_amc[8][2] = { {15, 3}, {0, 2}, {7, 4}, {9, 10},
                                {5, 11}, {4, 5}, {2, 6}, {12, 9} };
 
-static const int8_t vsc16_tx_sfp[8][2] = { {15, 8}, {0, 0}, {7, 7}, {9, 1},
-                               {5, 15}, {4, 14}, {2, 12}, {12, 13} };
+static const int8_t vsc16_tx_sfp[8][2] = { {15, 7}, {0, 1}, {7, 8}, {9, 0},
+                               {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 
-static const int8_t vsc16_tx_sgmii_lane_ab[8][2] = { {2, 14}, {12, 15},
-               {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
+static const int8_t vsc16_tx_4sfp_sgmii_12_56[8][2] = { {15, 7}, {0, 1},
+                               {7, 8}, {9, 0}, {2, 14}, {12, 15},
+                               {-1, -1}, {-1, -1} };
+
+static const int8_t vsc16_tx_4sfp_sgmii_34[8][2] = { {15, 7}, {0, 1},
+                               {7, 8}, {9, 0}, {5, 14}, {4, 15},
+                               {-1, -1}, {-1, -1} };
 
 #ifdef CONFIG_PPC_B4420
 static const int8_t vsc16_tx_sgmii_lane_cd[8][2] = { {5, 14}, {4, 15},
                {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 #endif
+
 static const int8_t vsc16_tx_aurora[8][2] = { {2, 13}, {12, 12}, {-1, -1},
                        {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 
 static const int8_t vsc16_rx_amc[8][2] = { {3, 15}, {2, 1}, {4, 8}, {10, 9},
                                {11, 11}, {5, 10}, {6, 3}, {9, 12} };
 
-static const int8_t vsc16_rx_sfp[8][2] = { {0, 15}, {8, 1}, {1, 8}, {7, 9},
+static const int8_t vsc16_rx_sfp[8][2] = { {8, 15}, {0, 1}, {7, 8}, {1, 9},
                                {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 
-static const int8_t vsc16_rx_sgmii_lane_ab[8][2] = { {14, 3}, {15, 12},
-               {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
+static const int8_t vsc16_rx_4sfp_sgmii_12_56[8][2] = { {8, 15}, {0, 1},
+                               {7, 8}, {1, 9}, {14, 3}, {15, 12},
+                               {-1, -1}, {-1, -1} };
+
+static const int8_t vsc16_rx_4sfp_sgmii_34[8][2] = { {8, 15}, {0, 1},
+                               {7, 8}, {1, 9}, {14, 11}, {15, 10},
+                               {-1, -1}, {-1, -1} };
 
 #ifdef CONFIG_PPC_B4420
 static const int8_t vsc16_rx_sgmii_lane_cd[8][2] = { {14, 11}, {15, 10},
                {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 #endif
 
-static const int8_t vsc16_rx_aurora[8][2] = { {12, 3}, {13, 12}, {-1, -1},
+static const int8_t vsc16_rx_aurora[8][2] = { {13, 3}, {12, 12}, {-1, -1},
                        {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1} };
 
 static const int8_t vsc08_tx_amc[4][2] = { {2, 2}, {3, 3}, {7, 4}, {1, 5} };
 
-static const int8_t vsc08_tx_sfp[4][2] = { {2, 6}, {3, 7}, {7, 1}, {1, 0} };
+static const int8_t vsc08_tx_sfp[4][2] = { {2, 1}, {3, 0}, {7, 6}, {1, 7} };
 
 static const int8_t vsc08_rx_amc[4][2] = { {2, 3}, {3, 4}, {4, 7}, {5, 1} };
 
-static const int8_t vsc08_rx_sfp[4][2] = { {6, 3}, {7, 4}, {1, 7}, {0, 1} };
+static const int8_t vsc08_rx_sfp[4][2] = { {1, 3}, {0, 4}, {6, 7}, {7, 1} };
 
 #endif
index 68e2725fce9d8577b6c86f694075152f0afdff73..3bcda6d13afccf3849c73d5c466eb898d1c1cbe7 100644 (file)
@@ -275,6 +275,24 @@ int board_eth_init(bd_t *bis)
                fm_info_set_phy_address(FM1_DTSEC4,
                                CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR);
                break;
+       case 0x98:
+               /* XAUI in Slot1 and Slot2 */
+               debug("Setting phy addresses on B4860 QDS AMC2PEX-2S for FM1_10GEC1: %x\n",
+                     CONFIG_SYS_FM1_10GEC1_PHY_ADDR);
+               fm_info_set_phy_address(FM1_10GEC1,
+                                       CONFIG_SYS_FM1_10GEC1_PHY_ADDR);
+               debug("Setting phy addresses on B4860 QDS AMC2PEX-2S for FM1_10GEC2: %x\n",
+                     CONFIG_SYS_FM1_10GEC2_PHY_ADDR);
+               fm_info_set_phy_address(FM1_10GEC2,
+                                       CONFIG_SYS_FM1_10GEC2_PHY_ADDR);
+               break;
+       case 0x9E:
+               /* XAUI in Slot2 */
+               debug("Setting phy addresses on B4860 QDS AMC2PEX-2S for FM1_10GEC2: %x\n",
+                     CONFIG_SYS_FM1_10GEC2_PHY_ADDR);
+               fm_info_set_phy_address(FM1_10GEC2,
+                                       CONFIG_SYS_FM1_10GEC2_PHY_ADDR);
+               break;
        default:
                printf("Fman:  Unsupported SerDes2 Protocol 0x%02x\n",
                                serdes2_prtcl);
@@ -300,6 +318,23 @@ int board_eth_init(bd_t *bis)
                }
        }
 
+       for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) {
+               int idx = i - FM1_10GEC1;
+
+               switch (fm_info_get_enet_if(i)) {
+               case PHY_INTERFACE_MODE_XGMII:
+                       fm_info_set_mdio(i,
+                                        miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME));
+                       break;
+               default:
+                       printf("Fman1: 10GSEC%u set to unknown interface %i\n",
+                              idx + 1, fm_info_get_enet_if(i));
+                       fm_info_set_phy_address(i, 0);
+                       break;
+               }
+       }
+
+
        cpu_eth_init(bis);
 #endif
 
index 4142e014d6f2f9f39b7c354aa7d5fe8b7a367972..b26725b2fcbb088892fa3669fd6b8e7d88934b97 100644 (file)
@@ -33,8 +33,12 @@ struct law_entry law_table[] = {
        SET_LAW(CONFIG_SYS_QMAN_MEM_PHYS, LAW_SIZE_32M, LAW_TRGT_IF_QMAN),
 #endif
        SET_LAW(QIXIS_BASE_PHYS, LAW_SIZE_4K, LAW_TRGT_IF_IFC),
+#ifdef CONFIG_SYS_MAPLE_MEM_PHYS
+       SET_LAW(CONFIG_SYS_MAPLE_MEM_PHYS, LAW_SIZE_16M, LAW_TRGT_IF_MAPLE),
+#endif
 #ifdef CONFIG_SYS_DCSRBAR_PHYS
-       SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_4M, LAW_TRGT_IF_DCSR),
+       /* Limit DCSR to 32M to access NPC Trace Buffer */
+       SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_32M, LAW_TRGT_IF_DCSR),
 #endif
 #ifdef CONFIG_SYS_NAND_BASE_PHYS
        SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_IFC),
index 6d634bf690aab49611b8baa628879706e453eea8..29cc41bfaf0e14528d270ae7703ae0993e8e8e0e 100644 (file)
@@ -106,7 +106,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #ifdef CONFIG_SYS_DCSRBAR_PHYS
        SET_TLB_ENTRY(1, CONFIG_SYS_DCSRBAR, CONFIG_SYS_DCSRBAR_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 10, BOOKE_PAGESZ_4M, 1),
+                     0, 10, BOOKE_PAGESZ_32M, 1),
 #endif
 #ifdef CONFIG_SYS_NAND_BASE
        /*
index 8d914d54859ce134eaa076b5e9173482346ff49b..2cf87383d0c23e8b9b2c35d965ef8ca157b8479e 100644 (file)
@@ -78,7 +78,11 @@ struct qixis {
        u8 trig_stat;
        u8 res12[3];
        u8 trig_ctr[4];
-       u8 res13[48];
+       u8 res13[16];
+       u8 clk_freq[6]; /* Clock Measurement Registers */
+       u8 res_c6[8];
+       u8 clk_base[2]; /* Clock Frequency Base Reg */
+       u8 res_d0[16];
        u8 aux2[4];     /* Auxiliary Registers,0xE0 */
        u8 res14[10];
        u8 aux_ad;
index ef9de25bd8f69f71b350ca6f4b2d90f9e31555da..ae07073532d38897d6bad41e14d08ade80c0f455 100644 (file)
@@ -605,8 +605,8 @@ int board_eth_init(bd_t *bis)
        lane = serdes_get_first_lane(XAUI_FM1);
        if (lane >= 0) {
                debug("FM1@TGEC1 expects XAUI in slot %u\n", lane_to_slot[lane]);
-               mdio_mux[FM1_10GEC1].mask = BRDCFG1_EMI2_SEL_MASK;
-               mdio_mux[FM1_10GEC1].val = BRDCFG1_EMI2_SEL_SLOT2;
+               mdio_mux[i].mask = BRDCFG1_EMI2_SEL_MASK;
+               mdio_mux[i].val = BRDCFG1_EMI2_SEL_SLOT2;
                super_hydra_mdio_set_mux("SUPER_HYDRA_FM1_TGEC_MDIO",
                                        mdio_mux[i].mask, mdio_mux[i].val);
        }
@@ -704,8 +704,8 @@ int board_eth_init(bd_t *bis)
        lane = serdes_get_first_lane(XAUI_FM2);
        if (lane >= 0) {
                debug("FM2@TGEC1 expects XAUI in slot %u\n", lane_to_slot[lane]);
-               mdio_mux[FM2_10GEC1].mask = BRDCFG1_EMI2_SEL_MASK;
-               mdio_mux[FM2_10GEC1].val = BRDCFG1_EMI2_SEL_SLOT1;
+               mdio_mux[i].mask = BRDCFG1_EMI2_SEL_MASK;
+               mdio_mux[i].val = BRDCFG1_EMI2_SEL_SLOT1;
                super_hydra_mdio_set_mux("SUPER_HYDRA_FM2_TGEC_MDIO",
                                        mdio_mux[i].mask, mdio_mux[i].val);
        }
diff --git a/board/freescale/corenet_ds/rcw_p5040ds.cfg b/board/freescale/corenet_ds/rcw_p5040ds.cfg
new file mode 100644 (file)
index 0000000..82fa741
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Default RCW for P5040DS.
+#
+
+#PBL preamble and RCW header
+aa55aa55 010e0100
+#64 bytes RCW data
+0c580000 00000000 22121200 00000000
+089c4400 00283000 58000000 61000000
+00000000 00000000 00000000 10070000
+00000000 00000000 00000000 00000000
index d0f581582113647b06e5f7ab7f72207746613bc6..bae5c23204231ca7e5eb95ac9c2fe102d21786f0 100644 (file)
@@ -172,3 +172,14 @@ DATA 4 0x020e0010 0xF00000CF
 /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
 DATA 4 0x020e0018 0x007F007F
 DATA 4 0x020e001c 0x007F007F
+
+/*
+ * Setup CCM_CCOSR register as follows:
+ *
+ * cko1_en  = 1           --> CKO1 enabled
+ * cko1_div = 111  --> divide by 8
+ * cko1_sel = 1011 --> ahb_clk_root
+ *
+ * This sets CKO1 at ahb_clk_root/8 = 132/8 = 16.5 MHz
+ */
+DATA 4 0x020c4060 0x000000fb
index 41ba303ec446570793750fa236d6d360eae3cbf0..d25e2b37ce2d1410154a8a21a174308195b6ad7c 100644 (file)
@@ -43,6 +43,12 @@ int board_early_init_f(void)
        /* SSP0 clock at 96MHz */
        mxs_set_sspclk(MXC_SSPCLK0, 96000, 0);
 
+       /* Power on LCD */
+       gpio_direction_output(MX23_PAD_LCD_RESET__GPIO_1_18, 1);
+
+       /* Set contrast to maximum */
+       gpio_direction_output(MX23_PAD_PWM2__GPIO_1_28, 1);
+
        return 0;
 }
 
index b6f4e7eff2e47221328d2982a5a5d0d4c6b5597d..fd71f7dc1ba854756685ccf5bf2bce4481c34ab9 100644 (file)
@@ -25,8 +25,9 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
 
-#define        MUX_CONFIG_SSP1 (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP)
-#define        MUX_CONFIG_EMI  (MXS_PAD_3V3 | MXS_PAD_16MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_SSP1 (MXS_PAD_8MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_EMI  (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_LCD  (MXS_PAD_4MA | MXS_PAD_NOPULL)
 
 const iomux_cfg_t iomux_setup[] = {
        /* DUART */
@@ -96,6 +97,37 @@ const iomux_cfg_t iomux_setup[] = {
        /* Slot Power Enable */
        MX23_PAD_PWM3__GPIO_1_29 |
                (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
+       /* LCD */
+       MX23_PAD_LCD_D00__LCD_D00 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D01__LCD_D01 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D02__LCD_D02 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D03__LCD_D03 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D04__LCD_D04 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D05__LCD_D05 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D06__LCD_D06 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D07__LCD_D07 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D08__LCD_D08 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D09__LCD_D09 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D10__LCD_D10 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D11__LCD_D11 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D12__LCD_D12 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D13__LCD_D13 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D14__LCD_D14 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D15__LCD_D15 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D16__LCD_D16 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_D17__LCD_D17 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D08__LCD_D18 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D09__LCD_D19 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D10__LCD_D20 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D11__LCD_D21 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D12__LCD_D22 | MUX_CONFIG_LCD,
+       MX23_PAD_GPMI_D13__LCD_D23 | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_DOTCK__LCD_DOTCK | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_ENABLE__LCD_ENABLE | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_HSYNC__LCD_HSYNC | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_VSYNC__LCD_VSYNC | MUX_CONFIG_LCD,
+       MX23_PAD_LCD_RESET__GPIO_1_18 | MUX_CONFIG_LCD, /* LCD power */
+       MX23_PAD_PWM2__GPIO_1_28 | MUX_CONFIG_LCD, /* LCD contrast */
 };
 
 #define HW_DRAM_CTL14  (0x38 >> 2)
index d73e27e5405ba24b1522bc7e998df5a777b02a8a..5e6047f83497de6673e78f4821bd1f7d32a18f36 100644 (file)
@@ -21,8 +21,7 @@
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/imx25-pinmux.h>
-#include <asm/arch/sys_proto.h>
+#include <asm/arch/iomux-mx25.h>
 #include <asm/arch/clock.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
@@ -31,8 +30,8 @@
 #include <fsl_pmic.h>
 #include <mc34704.h>
 
-#define FEC_RESET_B            IMX_GPIO_NR(2, 3)
-#define FEC_ENABLE_B           IMX_GPIO_NR(4, 8)
+#define FEC_RESET_B            IMX_GPIO_NR(4, 8)
+#define FEC_ENABLE_B           IMX_GPIO_NR(2, 3)
 #define CARD_DETECT            IMX_GPIO_NR(2, 1)
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -43,29 +42,42 @@ struct fsl_esdhc_cfg esdhc_cfg[1] = {
 };
 #endif
 
+/*
+ * FIXME: need to revisit this
+ * The original code enabled PUE and 100-k pull-down without PKE, so the right
+ * value here is likely:
+ *     0 for no pull
+ * or:
+ *     PAD_CTL_PUS_100K_DOWN for 100-k pull-down
+ */
+#define FEC_OUT_PAD_CTRL       0
+
+#define I2C_PAD_CTRL           (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP | \
+                                PAD_CTL_ODE)
+
 static void mx25pdk_fec_init(void)
 {
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       u32 gpio_mux_mode = MX25_PIN_MUX_MODE(5);
-       u32 gpio_mux_mode0_sion = MX25_PIN_MUX_MODE(0) | MX25_PIN_MUX_SION;
-
-       /* FEC pin init is generic */
-       mx25_fec_init_pins();
-
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-       /*
-        * Set up FEC_RESET_B and FEC_ENABLE_B
-        *
-        * FEC_RESET_B: gpio2_3 is ALT 5 mode of pin D12
-        * FEC_ENABLE_B: gpio4_8 is ALT 5 mode of pin A17
-        */
-       writel(gpio_mux_mode, &muxctl->pad_d12);
-       writel(gpio_mux_mode, &muxctl->pad_a17);
-
-       writel(0x0, &padctl->pad_d12);
-       writel(0x0, &padctl->pad_a17);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               MX25_PAD_FEC_TX_CLK__FEC_TX_CLK,
+               MX25_PAD_FEC_RX_DV__FEC_RX_DV,
+               MX25_PAD_FEC_RDATA0__FEC_RDATA0,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA0__FEC_TDATA0, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_TX_EN__FEC_TX_EN, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_MDC__FEC_MDC, FEC_OUT_PAD_CTRL),
+               MX25_PAD_FEC_MDIO__FEC_MDIO,
+               MX25_PAD_FEC_RDATA1__FEC_RDATA1,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA1__FEC_TDATA1, FEC_OUT_PAD_CTRL),
+
+               NEW_PAD_CTRL(MX25_PAD_D12__GPIO_4_8, 0), /* FEC_RESET_B */
+               NEW_PAD_CTRL(MX25_PAD_A17__GPIO_2_3, 0), /* FEC_ENABLE_B */
+       };
+
+       static const iomux_v3_cfg_t i2c_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_I2C1_CLK__I2C1_CLK, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_I2C1_DAT__I2C1_DAT, I2C_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 
        /* Assert RESET and ENABLE low */
        gpio_direction_output(FEC_RESET_B, 0);
@@ -78,10 +90,7 @@ static void mx25pdk_fec_init(void)
        gpio_set_value(FEC_ENABLE_B, 1);
 
        /* Setup I2C pins so that PMIC can turn on PHY supply */
-       writel(gpio_mux_mode0_sion, &muxctl->pad_i2c1_clk);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_i2c1_dat);
-       writel(0x1E8, &padctl->pad_i2c1_clk);
-       writel(0x1E8, &padctl->pad_i2c1_dat);
+       imx_iomux_v3_setup_multiple_pads(i2c_pads, ARRAY_SIZE(i2c_pads));
 }
 
 int dram_init(void)
@@ -92,9 +101,35 @@ int dram_init(void)
        return 0;
 }
 
+/*
+ * Set up input pins with hysteresis and 100-k pull-ups
+ */
+#define UART1_IN_PAD_CTRL      (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP)
+/*
+ * FIXME: need to revisit this
+ * The original code enabled PUE and 100-k pull-down without PKE, so the right
+ * value here is likely:
+ *     0 for no pull
+ * or:
+ *     PAD_CTL_PUS_100K_DOWN for 100-k pull-down
+ */
+#define UART1_OUT_PAD_CTRL     0
+
+static void mx25pdk_uart1_init(void)
+{
+       static const iomux_v3_cfg_t uart1_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_UART1_RXD__UART1_RXD, UART1_IN_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_TXD__UART1_TXD, UART1_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_RTS__UART1_RTS, UART1_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_CTS__UART1_CTS, UART1_IN_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+}
+
 int board_early_init_f(void)
 {
-       mx25_uart1_init_pins();
+       mx25pdk_uart1_init();
 
        return 0;
 }
@@ -131,21 +166,8 @@ int board_late_init(void)
 #ifdef CONFIG_FSL_ESDHC
 int board_mmc_getcd(struct mmc *mmc)
 {
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       u32 gpio_mux_mode = MX25_PIN_MUX_MODE(5);
-
-       /*
-        * Set up the Card Detect pin.
-        *
-        * SD1_GPIO_CD: gpio2_1 is ALT 5 mode of pin A15
-        *
-        */
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-
-       writel(gpio_mux_mode, &muxctl->pad_a15);
-       writel(0x0, &padctl->pad_a15);
+       /* Set up the Card Detect pin. */
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX25_PAD_A15__GPIO_2_1, 0));
 
        gpio_direction_input(CARD_DETECT);
        return !gpio_get_value(CARD_DETECT);
@@ -153,16 +175,16 @@ int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
-       struct iomuxc_mux_ctl *muxctl;
-       u32 sdhc1_mux_mode = MX25_PIN_MUX_MODE(0) | MX25_PIN_MUX_SION;
-
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_cmd);
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_clk);
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_data0);
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_data1);
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_data2);
-       writel(sdhc1_mux_mode, &muxctl->pad_sd1_data3);
+       static const iomux_v3_cfg_t sdhc1_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_SD1_CMD__SD1_CMD, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_CLK__SD1_CLK, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA0__SD1_DATA0, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA1__SD1_DATA1, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA2__SD1_DATA2, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA3__SD1_DATA3, NO_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(sdhc1_pads, ARRAY_SIZE(sdhc1_pads));
 
        esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC1_CLK);
        return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
index ae6eda343ed8f1fdb37a2ed14578e4e994c1d9e2..beae0e66e22fec9e1123fe4795acde67fc811011 100644 (file)
@@ -30,6 +30,7 @@
 #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)
+#define        MUX_CONFIG_LCD  (MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL)
 
 const iomux_cfg_t iomux_setup[] = {
        /* DUART */
@@ -162,6 +163,38 @@ const iomux_cfg_t iomux_setup[] = {
        /* I2C */
        MX28_PAD_I2C0_SCL__I2C0_SCL,
        MX28_PAD_I2C0_SDA__I2C0_SDA,
+
+       /* LCD */
+       MX28_PAD_LCD_D00__LCD_D0 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D01__LCD_D1 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D02__LCD_D2 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D03__LCD_D3 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D04__LCD_D4 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D05__LCD_D5 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D06__LCD_D6 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D07__LCD_D7 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D08__LCD_D8 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D09__LCD_D9 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D10__LCD_D10 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D11__LCD_D11 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D12__LCD_D12 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D13__LCD_D13 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D14__LCD_D14 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D15__LCD_D15 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D16__LCD_D16 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D17__LCD_D17 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D18__LCD_D18 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D19__LCD_D19 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D20__LCD_D20 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D21__LCD_D21 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D22__LCD_D22 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_D23__LCD_D23 | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_RD_E__LCD_VSYNC | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_WR_RWN__LCD_HSYNC | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_RS__LCD_DOTCLK | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_CS__LCD_ENABLE | MUX_CONFIG_LCD,
+       MX28_PAD_LCD_RESET__GPIO_3_30 | MUX_CONFIG_LCD, /* LCD power */
+       MX28_PAD_PWM2__GPIO_3_18 | MUX_CONFIG_LCD, /* LCD contrast */
 };
 
 #define HW_DRAM_CTL29  (0x74 >> 2)
index de7231bd10bde92e982aa4e81f79c59994f74ce4..4edd9f41932e403ed06f70483e95dafc288c2e53 100644 (file)
@@ -59,6 +59,12 @@ int board_early_init_f(void)
        gpio_direction_output(MX28_PAD_AUART2_RX__GPIO_3_8, 1);
 #endif
 
+       /* Power on LCD */
+       gpio_direction_output(MX28_PAD_LCD_RESET__GPIO_3_30, 1);
+
+       /* Set contrast to maximum */
+       gpio_direction_output(MX28_PAD_PWM2__GPIO_3_18, 1);
+
        return 0;
 }
 
index 49158bd90dfaad7739e0cf6777976ad236866ce9..4f6cfeeaa34bd3552acb941adf3131d7d320d28e 100644 (file)
@@ -39,7 +39,21 @@ DECLARE_GLOBAL_DATA_PTR;
 #ifdef CONFIG_SPL_BUILD
 void board_init_f(ulong bootflag)
 {
-       relocate_code(CONFIG_SPL_TEXT_BASE);
+       /*
+        * copy ourselves from where we are running to where we were
+        * linked at. Use ulong pointers as all addresses involved
+        * are 4-byte-aligned.
+        */
+       ulong *start_ptr, *end_ptr, *link_ptr, *run_ptr, *dst;
+       asm volatile ("ldr %0, =_start" : "=r"(start_ptr));
+       asm volatile ("ldr %0, =_end" : "=r"(end_ptr));
+       asm volatile ("ldr %0, =board_init_f" : "=r"(link_ptr));
+       asm volatile ("adr %0, board_init_f" : "=r"(run_ptr));
+       for (dst = start_ptr; dst < end_ptr; dst++)
+               *dst = *(dst+(run_ptr-link_ptr));
+       /*
+        * branch to nand_boot's link-time address.
+        */
        asm volatile("ldr pc, =nand_boot");
 }
 #endif
index b7f474e5ef49a8c6a27e37e7323df0c2a8691b96..9f667d2dea58383691f2b97c4c96e4c12ed44794 100644 (file)
@@ -28,8 +28,7 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
-#include <asm/arch/mx35_pins.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx35.h>
 #include <i2c.h>
 #include <power/pmic.h>
 #include <fsl_pmic.h>
@@ -73,114 +72,88 @@ void dram_init_banksize(void)
        gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
 }
 
+#define I2C_PAD_CTRL   (PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_ODE)
+
 static void setup_iomux_i2c(void)
 {
-       int pad;
+       static const iomux_v3_cfg_t i2c1_pads[] = {
+               NEW_PAD_CTRL(MX35_PAD_I2C1_CLK__I2C1_SCL, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_I2C1_DAT__I2C1_SDA, I2C_PAD_CTRL),
+       };
 
        /* setup pins for I2C1 */
-       mxc_request_iomux(MX35_PIN_I2C1_CLK, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_I2C1_DAT, MUX_CONFIG_SION);
-
-       pad = (PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE \
-                       | PAD_CTL_PUE_PUD | PAD_CTL_ODE_OpenDrain);
-
-       mxc_iomux_set_pad(MX35_PIN_I2C1_CLK, pad);
-       mxc_iomux_set_pad(MX35_PIN_I2C1_DAT, pad);
+       imx_iomux_v3_setup_multiple_pads(i2c1_pads, ARRAY_SIZE(i2c1_pads));
 }
 
 
 static void setup_iomux_spi(void)
 {
-       mxc_request_iomux(MX35_PIN_CSPI1_MOSI, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_MISO, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SS0, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SS1, MUX_CONFIG_SION);
-       mxc_request_iomux(MX35_PIN_CSPI1_SCLK, MUX_CONFIG_SION);
+       static const iomux_v3_cfg_t spi_pads[] = {
+               MX35_PAD_CSPI1_MOSI__CSPI1_MOSI,
+               MX35_PAD_CSPI1_MISO__CSPI1_MISO,
+               MX35_PAD_CSPI1_SS0__CSPI1_SS0,
+               MX35_PAD_CSPI1_SS1__CSPI1_SS1,
+               MX35_PAD_CSPI1_SCLK__CSPI1_SCLK,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
 }
 
+#define USBOTG_IN_PAD_CTRL     (PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | \
+                                PAD_CTL_DSE_LOW | PAD_CTL_SRE_SLOW)
+#define USBOTG_OUT_PAD_CTRL    (PAD_CTL_DSE_LOW | PAD_CTL_SRE_SLOW)
+
 static void setup_iomux_usbotg(void)
 {
-       int in_pad, out_pad;
+       static const iomux_v3_cfg_t usbotg_pads[] = {
+               NEW_PAD_CTRL(MX35_PAD_USBOTG_PWR__USB_TOP_USBOTG_PWR,
+                               USBOTG_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_USBOTG_OC__USB_TOP_USBOTG_OC,
+                               USBOTG_IN_PAD_CTRL),
+       };
 
        /* Set up pins for USBOTG. */
-       mxc_request_iomux(MX35_PIN_USBOTG_PWR,
-                         MUX_CONFIG_SION | MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_USBOTG_OC,
-                         MUX_CONFIG_SION | MUX_CONFIG_FUNC);
-
-       in_pad = PAD_CTL_DRV_3_3V | PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE |
-               PAD_CTL_PUE_PUD | PAD_CTL_100K_PD | PAD_CTL_ODE_CMOS |
-               PAD_CTL_DRV_NORMAL | PAD_CTL_SRE_SLOW;
-       out_pad = PAD_CTL_DRV_3_3V | PAD_CTL_HYS_CMOS | PAD_CTL_PKE_NONE |
-               PAD_CTL_ODE_CMOS | PAD_CTL_DRV_NORMAL | PAD_CTL_SRE_SLOW;
-
-       mxc_iomux_set_pad(MX35_PIN_USBOTG_PWR, out_pad);
-       mxc_iomux_set_pad(MX35_PIN_USBOTG_OC, in_pad);
+       imx_iomux_v3_setup_multiple_pads(usbotg_pads, ARRAY_SIZE(usbotg_pads));
 }
 
+#define FEC_PAD_CTRL   (PAD_CTL_DSE_LOW | PAD_CTL_SRE_SLOW)
+
 static void setup_iomux_fec(void)
 {
-       int pad;
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX35_PAD_FEC_TX_CLK__FEC_TX_CLK, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RX_CLK__FEC_RX_CLK, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RX_DV__FEC_RX_DV, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_COL__FEC_COL, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RDATA0__FEC_RDATA_0, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TDATA0__FEC_TDATA_0, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TX_EN__FEC_TX_EN, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_MDC__FEC_MDC, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_MDIO__FEC_MDIO, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_22K_UP),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TX_ERR__FEC_TX_ERR, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RX_ERR__FEC_RX_ERR, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_CRS__FEC_CRS, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RDATA1__FEC_RDATA_1, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TDATA1__FEC_TDATA_1, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RDATA2__FEC_RDATA_2, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TDATA2__FEC_TDATA_2, FEC_PAD_CTRL),
+               NEW_PAD_CTRL(MX35_PAD_FEC_RDATA3__FEC_RDATA_3, FEC_PAD_CTRL |
+                                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN),
+               NEW_PAD_CTRL(MX35_PAD_FEC_TDATA3__FEC_TDATA_3, FEC_PAD_CTRL),
+       };
 
        /* setup pins for FEC */
-       mxc_request_iomux(MX35_PIN_FEC_TX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_DV, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_COL, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_EN, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDC, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDIO, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_CRS, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA3, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA3, MUX_CONFIG_FUNC);
-
-       pad = (PAD_CTL_DRV_3_3V | PAD_CTL_PUE_PUD | PAD_CTL_ODE_CMOS | \
-                       PAD_CTL_DRV_NORMAL | PAD_CTL_SRE_SLOW);
-
-       mxc_iomux_set_pad(MX35_PIN_FEC_TX_CLK, pad | PAD_CTL_HYS_SCHMITZ | \
-                       PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RX_CLK, pad | PAD_CTL_HYS_SCHMITZ | \
-                       PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RX_DV, pad | PAD_CTL_HYS_SCHMITZ | \
-                        PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_COL, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RDATA0, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TDATA0, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TX_EN, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_MDC, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_MDIO, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_22K_PU);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TX_ERR, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RX_ERR, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_CRS, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RDATA1, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TDATA1, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RDATA2, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TDATA2, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_RDATA3, pad | PAD_CTL_HYS_SCHMITZ | \
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PD);
-       mxc_iomux_set_pad(MX35_PIN_FEC_TDATA3, pad | PAD_CTL_HYS_CMOS | \
-                         PAD_CTL_PKE_NONE | PAD_CTL_100K_PD);
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 int board_early_init_f(void)
@@ -262,8 +235,7 @@ int board_late_init(void)
 
        if (pmic_detect()) {
                p = pmic_get("FSL_PMIC");
-               mxc_request_iomux(MX35_PIN_WATCHDOG_RST, MUX_CONFIG_SION |
-                                       MUX_CONFIG_ALT1);
+               imx_iomux_v3_setup_pad(MX35_PAD_WDOG_RST__WDOG_WDOG_B);
 
                pmic_reg_read(p, REG_SETTING_0, &pmic_val);
                pmic_reg_write(p, REG_SETTING_0,
@@ -271,10 +243,9 @@ int board_late_init(void)
                pmic_reg_read(p, REG_MODE_0, &pmic_val);
                pmic_reg_write(p, REG_MODE_0, pmic_val | VGEN3EN);
 
-               mxc_request_iomux(MX35_PIN_COMPARE, MUX_CONFIG_GPIO);
-               mxc_iomux_set_input(MUX_IN_GPIO1_IN_5, INPUT_CTL_PATH0);
+               imx_iomux_v3_setup_pad(MX35_PAD_COMPARE__GPIO1_5);
 
-               gpio_direction_output(IMX_GPIO_NR(2, 5), 1);
+               gpio_direction_output(IMX_GPIO_NR(1, 5), 1);
        }
 
        val = mc9sdz60_reg_read(MC9SDZ60_REG_GPIO_1) | 0x04;
@@ -312,13 +283,17 @@ struct fsl_esdhc_cfg esdhc_cfg = {MMC_SDHC1_BASE_ADDR};
 
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sdhc1_pads[] = {
+               MX35_PAD_SD1_CMD__ESDHC1_CMD,
+               MX35_PAD_SD1_CLK__ESDHC1_CLK,
+               MX35_PAD_SD1_DATA0__ESDHC1_DAT0,
+               MX35_PAD_SD1_DATA1__ESDHC1_DAT1,
+               MX35_PAD_SD1_DATA2__ESDHC1_DAT2,
+               MX35_PAD_SD1_DATA3__ESDHC1_DAT3,
+       };
+
        /* configure pins for SDHC1 only */
-       mxc_request_iomux(MX35_PIN_SD1_CMD, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA3, MUX_CONFIG_FUNC);
+       imx_iomux_v3_setup_multiple_pads(sdhc1_pads, ARRAY_SIZE(sdhc1_pads));
 
        esdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC1_CLK);
        return fsl_esdhc_initialize(bis, &esdhc_cfg);
index 54c16b1f9d36eb1791a781fdaf91169dbbff0bf3..369da6de5be9e517f7469f596be3d504c1626916 100644 (file)
@@ -24,8 +24,7 @@
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/mx5x_pins.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx51.h>
 #include <asm/errno.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/crm_regs.h>
@@ -64,160 +63,103 @@ u32 get_board_rev(void)
        return rev;
 }
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_DSE_HIGH)
+
 static void setup_iomux_uart(void)
 {
-       unsigned int pad = PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
-                       PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH;
-
-       mxc_request_iomux(MX51_PIN_UART1_RXD, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_UART1_RXD, pad | PAD_CTL_SRE_FAST);
-       mxc_request_iomux(MX51_PIN_UART1_TXD, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_UART1_TXD, pad | PAD_CTL_SRE_FAST);
-       mxc_request_iomux(MX51_PIN_UART1_RTS, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_UART1_RTS, pad);
-       mxc_request_iomux(MX51_PIN_UART1_CTS, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_UART1_CTS, pad);
+       static const iomux_v3_cfg_t uart_pads[] = {
+               MX51_PAD_UART1_RXD__UART1_RXD,
+               MX51_PAD_UART1_TXD__UART1_TXD,
+               NEW_PAD_CTRL(MX51_PAD_UART1_RTS__UART1_RTS, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_UART1_CTS__UART1_CTS, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 static void setup_iomux_fec(void)
 {
-       /*FEC_MDIO*/
-       mxc_request_iomux(MX51_PIN_EIM_EB2 , IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_EB2 , 0x1FD);
-
-       /*FEC_MDC*/
-       mxc_request_iomux(MX51_PIN_NANDF_CS3, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS3, 0x2004);
-
-       /* FEC RDATA[3] */
-       mxc_request_iomux(MX51_PIN_EIM_CS3, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS3, 0x180);
-
-       /* FEC RDATA[2] */
-       mxc_request_iomux(MX51_PIN_EIM_CS2, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS2, 0x180);
-
-       /* FEC RDATA[1] */
-       mxc_request_iomux(MX51_PIN_EIM_EB3, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_EB3, 0x180);
-
-       /* FEC RDATA[0] */
-       mxc_request_iomux(MX51_PIN_NANDF_D9, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D9, 0x2180);
-
-       /* FEC TDATA[3] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS6, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS6, 0x2004);
-
-       /* FEC TDATA[2] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS5, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS5, 0x2004);
-
-       /* FEC TDATA[1] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS4, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS4, 0x2004);
-
-       /* FEC TDATA[0] */
-       mxc_request_iomux(MX51_PIN_NANDF_D8, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D8, 0x2004);
-
-       /* FEC TX_EN */
-       mxc_request_iomux(MX51_PIN_NANDF_CS7, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS7, 0x2004);
-
-       /* FEC TX_ER */
-       mxc_request_iomux(MX51_PIN_NANDF_CS2, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS2, 0x2004);
-
-       /* FEC TX_CLK */
-       mxc_request_iomux(MX51_PIN_NANDF_RDY_INT, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RDY_INT, 0x2180);
-
-       /* FEC TX_COL */
-       mxc_request_iomux(MX51_PIN_NANDF_RB2, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RB2, 0x2180);
-
-       /* FEC RX_CLK */
-       mxc_request_iomux(MX51_PIN_NANDF_RB3, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RB3, 0x2180);
-
-       /* FEC RX_CRS */
-       mxc_request_iomux(MX51_PIN_EIM_CS5, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS5, 0x180);
-
-       /* FEC RX_ER */
-       mxc_request_iomux(MX51_PIN_EIM_CS4, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS4, 0x180);
-
-       /* FEC RX_DV */
-       mxc_request_iomux(MX51_PIN_NANDF_D11, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D11, 0x2180);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB2__FEC_MDIO, PAD_CTL_HYS |
+                               PAD_CTL_PUS_22K_UP | PAD_CTL_ODE |
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               MX51_PAD_NANDF_CS3__FEC_MDC,
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS3__FEC_RDATA3, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS2__FEC_RDATA2, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_CTRL_2),
+               MX51_PAD_NANDF_D9__FEC_RDATA0,
+               MX51_PAD_NANDF_CS6__FEC_TDATA3,
+               MX51_PAD_NANDF_CS5__FEC_TDATA2,
+               MX51_PAD_NANDF_CS4__FEC_TDATA1,
+               MX51_PAD_NANDF_D8__FEC_TDATA0,
+               MX51_PAD_NANDF_CS7__FEC_TX_EN,
+               MX51_PAD_NANDF_CS2__FEC_TX_ER,
+               MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__FEC_COL, MX51_PAD_CTRL_4),
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__FEC_RX_CLK, MX51_PAD_CTRL_4),
+               MX51_PAD_EIM_CS5__FEC_CRS,
+               MX51_PAD_EIM_CS4__FEC_RX_ER,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D11__FEC_RX_DV, MX51_PAD_CTRL_4),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 #ifdef CONFIG_MXC_SPI
 static void setup_iomux_spi(void)
 {
-       /* 000: Select mux mode: ALT0 mux port: MOSI of instance: ecspi1 */
-       mxc_request_iomux(MX51_PIN_CSPI1_MOSI, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_MOSI, 0x105);
-
-       /* 000: Select mux mode: ALT0 mux port: MISO of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_MISO, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_MISO, 0x105);
-
-       /* de-select SS1 of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_SS1, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SS1, 0x85);
-
-       /* 000: Select mux mode: ALT0 mux port: SS0 ecspi1 */
-       mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, 0x185);
-
-       /* 000: Select mux mode: ALT0 mux port: RDY of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_RDY, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_RDY, 0x180);
-
-       /* 000: Select mux mode: ALT0 mux port: SCLK of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_SCLK, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SCLK, 0x105);
+       static const iomux_v3_cfg_t spi_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI, PAD_CTL_HYS |
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_MISO__ECSPI1_MISO, PAD_CTL_HYS |
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_SS1__ECSPI1_SS1,
+                               MX51_GPIO_PAD_CTRL),
+               MX51_PAD_CSPI1_SS0__ECSPI1_SS0,
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_RDY__ECSPI1_RDY, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK, PAD_CTL_HYS |
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
 }
 #endif
 
 #ifdef CONFIG_USB_EHCI_MX5
-#define MX51EVK_USBH1_HUB_RST  IOMUX_TO_GPIO(MX51_PIN_GPIO1_7) /* GPIO1_7 */
-#define MX51EVK_USBH1_STP      IOMUX_TO_GPIO(MX51_PIN_USBH1_STP) /* GPIO1_27 */
-#define MX51EVK_USB_CLK_EN_B   IOMUX_TO_GPIO(MX51_PIN_EIM_D18) /* GPIO2_1 */
-#define MX51EVK_USB_PHY_RESET  IOMUX_TO_GPIO(MX51_PIN_EIM_D21) /* GPIO2_5 */
-
-#define USBH1_PAD      (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |          \
-                        PAD_CTL_100K_PU | PAD_CTL_PUE_PULL |           \
-                        PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE)
-#define GPIO_PAD       (PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE |        \
-                        PAD_CTL_SRE_FAST)
-#define NO_PAD         (1 << 16)
+#define MX51EVK_USBH1_HUB_RST  IMX_GPIO_NR(1, 7)
+#define MX51EVK_USBH1_STP      IMX_GPIO_NR(1, 27)
+#define MX51EVK_USB_CLK_EN_B   IMX_GPIO_NR(2, 2)
+#define MX51EVK_USB_PHY_RESET  IMX_GPIO_NR(2, 5)
 
 static void setup_usb_h1(void)
 {
-       setup_iomux_usb_h1();
-
-       /* GPIO_1_7 for USBH1 hub reset */
-       mxc_request_iomux(MX51_PIN_GPIO1_7, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_7, NO_PAD);
-
-       /* GPIO_2_1 */
-       mxc_request_iomux(MX51_PIN_EIM_D17, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D17, GPIO_PAD);
-
-       /* GPIO_2_5 for USB PHY reset */
-       mxc_request_iomux(MX51_PIN_EIM_D21, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D21, GPIO_PAD);
+       static const iomux_v3_cfg_t usb_h1_pads[] = {
+               MX51_PAD_USBH1_CLK__USBH1_CLK,
+               MX51_PAD_USBH1_DIR__USBH1_DIR,
+               MX51_PAD_USBH1_STP__USBH1_STP,
+               MX51_PAD_USBH1_NXT__USBH1_NXT,
+               MX51_PAD_USBH1_DATA0__USBH1_DATA0,
+               MX51_PAD_USBH1_DATA1__USBH1_DATA1,
+               MX51_PAD_USBH1_DATA2__USBH1_DATA2,
+               MX51_PAD_USBH1_DATA3__USBH1_DATA3,
+               MX51_PAD_USBH1_DATA4__USBH1_DATA4,
+               MX51_PAD_USBH1_DATA5__USBH1_DATA5,
+               MX51_PAD_USBH1_DATA6__USBH1_DATA6,
+               MX51_PAD_USBH1_DATA7__USBH1_DATA7,
+
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_7__GPIO1_7, 0), /* H1 hub reset */
+               MX51_PAD_EIM_D17__GPIO2_1,
+               MX51_PAD_EIM_D21__GPIO2_5, /* PHY reset */
+       };
+
+       imx_iomux_v3_setup_multiple_pads(usb_h1_pads, ARRAY_SIZE(usb_h1_pads));
 }
 
 int board_ehci_hcd_init(int port)
 {
        /* Set USBH1_STP to GPIO and toggle it */
-       mxc_request_iomux(MX51_PIN_USBH1_STP, IOMUX_CONFIG_GPIO);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_STP, USBH1_PAD);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_USBH1_STP__GPIO1_27,
+                                               MX51_USBH_PAD_CTRL));
 
        gpio_direction_output(MX51EVK_USBH1_STP, 0);
        gpio_direction_output(MX51EVK_USB_PHY_RESET, 0);
@@ -225,8 +167,7 @@ int board_ehci_hcd_init(int port)
        gpio_set_value(MX51EVK_USBH1_STP, 1);
 
        /* Set back USBH1_STP to be function */
-       mxc_request_iomux(MX51_PIN_USBH1_STP, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_STP, USBH1_PAD);
+       imx_iomux_v3_setup_pad(MX51_PAD_USBH1_STP__USBH1_STP);
 
        /* De-assert USB PHY RESETB */
        gpio_set_value(MX51EVK_USB_PHY_RESET, 1);
@@ -328,7 +269,8 @@ static void power_init(void)
                VVIDEOEN | VAUDIOEN  | VSDEN;
        pmic_reg_write(p, REG_MODE_1, val);
 
-       mxc_request_iomux(MX51_PIN_EIM_A20, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_EIM_A20__GPIO2_14,
+                                               NO_PAD_CTRL));
        gpio_direction_output(IMX_GPIO_NR(2, 14), 0);
 
        udelay(500);
@@ -342,9 +284,11 @@ int board_mmc_getcd(struct mmc *mmc)
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
        int ret;
 
-       mxc_request_iomux(MX51_PIN_GPIO1_0, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_0__GPIO1_0,
+                                               NO_PAD_CTRL));
        gpio_direction_input(IMX_GPIO_NR(1, 0));
-       mxc_request_iomux(MX51_PIN_GPIO1_6, IOMUX_CONFIG_ALT0);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_6__GPIO1_6,
+                                               NO_PAD_CTRL));
        gpio_direction_input(IMX_GPIO_NR(1, 6));
 
        if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
@@ -357,6 +301,40 @@ int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_SD1_CMD__SD1_CMD, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_CLK__SD1_CLK, PAD_CTL_DSE_MAX |
+                       PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA0__SD1_DATA0, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA1__SD1_DATA1, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA2__SD1_DATA2, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA3__SD1_DATA3, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_0__SD1_CD, PAD_CTL_HYS),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_1__SD1_WP, PAD_CTL_HYS),
+       };
+
+       static const iomux_v3_cfg_t sd2_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_SD2_CMD__SD2_CMD,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD2_CLK__SD2_CLK,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD2_DATA0__SD2_DATA0,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD2_DATA1__SD2_DATA1,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD2_DATA2__SD2_DATA2,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD2_DATA3__SD2_DATA3,
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_6__GPIO1_6, PAD_CTL_HYS),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_5__GPIO1_5, PAD_CTL_HYS),
+       };
+
        u32 index;
        s32 status = 0;
 
@@ -367,98 +345,12 @@ int board_mmc_init(bd_t *bis)
                        index++) {
                switch (index) {
                case 0:
-                       mxc_request_iomux(MX51_PIN_SD1_CMD,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD1_CLK,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD1_DATA0,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD1_DATA1,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD1_DATA2,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD1_DATA3,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_CMD,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_CLK,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_NONE | PAD_CTL_47K_PU |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_DATA0,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_DATA1,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_DATA2,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD1_DATA3,
-                               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-                               PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PD |
-                               PAD_CTL_PUE_PULL |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-                       mxc_request_iomux(MX51_PIN_GPIO1_0,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_iomux_set_pad(MX51_PIN_GPIO1_0,
-                               PAD_CTL_HYS_ENABLE);
-                       mxc_request_iomux(MX51_PIN_GPIO1_1,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_iomux_set_pad(MX51_PIN_GPIO1_1,
-                               PAD_CTL_HYS_ENABLE);
+                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
+                                                        ARRAY_SIZE(sd1_pads));
                        break;
                case 1:
-                       mxc_request_iomux(MX51_PIN_SD2_CMD,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD2_CLK,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_SD2_DATA0,
-                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX51_PIN_SD2_DATA1,
-                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX51_PIN_SD2_DATA2,
-                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX51_PIN_SD2_DATA3,
-                               IOMUX_CONFIG_ALT0);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_CMD,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_CLK,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_DATA0,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_DATA1,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_DATA2,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_iomux_set_pad(MX51_PIN_SD2_DATA3,
-                               PAD_CTL_DRV_MAX | PAD_CTL_22K_PU |
-                               PAD_CTL_SRE_FAST);
-                       mxc_request_iomux(MX51_PIN_SD2_CMD,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX51_PIN_GPIO1_6,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_iomux_set_pad(MX51_PIN_GPIO1_6,
-                               PAD_CTL_HYS_ENABLE);
-                       mxc_request_iomux(MX51_PIN_GPIO1_5,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_iomux_set_pad(MX51_PIN_GPIO1_5,
-                               PAD_CTL_HYS_ENABLE);
+                       imx_iomux_v3_setup_multiple_pads(sd2_pads,
+                                                        ARRAY_SIZE(sd2_pads));
                        break;
                default:
                        printf("Warning: you configured more ESDHC controller"
index 7be5c9befc377095b25c6390361419231d235528..556cb38ca66db29c7c5cc3c7514b0c88af175d6b 100644 (file)
@@ -24,7 +24,7 @@
 #include <common.h>
 #include <linux/list.h>
 #include <asm/gpio.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx51.h>
 #include <linux/fb.h>
 #include <ipu_pixfmt.h>
 
@@ -67,25 +67,25 @@ static struct fb_videomode const dvi = {
 void setup_iomux_lcd(void)
 {
        /* DI2_PIN15 */
-       mxc_request_iomux(MX51_PIN_DI_GP4, IOMUX_CONFIG_ALT4);
+       imx_iomux_v3_setup_pad(MX51_PAD_DI_GP4__DI2_PIN15);
 
-       /* Pad settings for MX51_PIN_DI2_DISP_CLK */
-       mxc_iomux_set_pad(MX51_PIN_DI2_DISP_CLK, PAD_CTL_HYS_NONE |
-                         PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-                         PAD_CTL_DRV_MAX | PAD_CTL_SRE_SLOW);
+       /* Pad settings for DI2_DISP_CLK */
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK,
+                           PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_SLOW));
 
        /* Turn on 3.3V voltage for LCD */
-       mxc_request_iomux(MX51_PIN_CSI2_D12, IOMUX_CONFIG_ALT3);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_CSI2_D12__GPIO4_9,
+                                               NO_PAD_CTRL));
        gpio_direction_output(MX51EVK_LCD_3V3, 1);
 
        /* Turn on 5V voltage for LCD */
-       mxc_request_iomux(MX51_PIN_CSI2_D13, IOMUX_CONFIG_ALT3);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_CSI2_D13__GPIO4_10,
+                                               NO_PAD_CTRL));
        gpio_direction_output(MX51EVK_LCD_5V, 1);
 
        /* Turn on GPIO backlight */
-       mxc_request_iomux(MX51_PIN_DI1_D1_CS, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_input(MX51_GPIO3_IPP_IND_G_IN_4_SELECT_INPUT,
-                                                       INPUT_CTL_PATH1);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_DI1_D1_CS__GPIO3_4,
+                                               NO_PAD_CTRL));
        gpio_direction_output(MX51EVK_LCD_BACKLIGHT, 1);
 }
 
index 8d433a3d8688b9712703652d3a7b5b8d265e1c05..e2dbf635234a447f53c6b52cb14d900c6636e2ff 100644 (file)
 #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/arch/iomux-mx53.h>
 #include <asm/errno.h>
 #include <netdev.h>
 #include <mmc.h>
@@ -61,9 +60,42 @@ void dram_init_banksize(void)
 #ifdef CONFIG_NAND_MXC
 static void setup_iomux_nand(void)
 {
+       static const iomux_v3_cfg_t nand_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_CS1__EMI_NANDF_CS_1,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0,
+                               PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_CLE__EMI_NANDF_CLE,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_ALE__EMI_NANDF_ALE,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B,
+                               PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B,
+                               PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA7__EMI_NAND_WEIM_DA_7,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+       };
+
        u32 i, reg;
-       #define M4IF_GENP_WEIM_MM_MASK          0x00000001
-       #define WEIM_GCR2_MUX16_BYP_GRANT_MASK  0x00001000
 
        reg = __raw_readl(M4IF_BASE_ADDR + 0xc);
        reg &= ~M4IF_GENP_WEIM_MM_MASK;
@@ -74,48 +106,7 @@ static void setup_iomux_nand(void)
                __raw_writel(reg, WEIM_BASE_ADDR + i);
        }
 
-       mxc_request_iomux(MX53_PIN_NANDF_CS0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_CS0, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_NANDF_CS1, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_CS1, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_NANDF_RB0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_RB0, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_PUE_PULL | PAD_CTL_100K_PU);
-       mxc_request_iomux(MX53_PIN_NANDF_CLE, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_CLE, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_ALE, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_WP_B, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_PUE_PULL | PAD_CTL_100K_PU);
-       mxc_request_iomux(MX53_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_RE_B, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_NANDF_WE_B, PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA0, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA1, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA1, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA2, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA2, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA3, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA3, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA4, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA4, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA5, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA5, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA6, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA6, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
-       mxc_request_iomux(MX53_PIN_EIM_DA7, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA7, PAD_CTL_PKE_ENABLE |
-                                       PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH);
+       imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads));
 }
 #else
 static void setup_iomux_nand(void)
@@ -123,24 +114,17 @@ static void setup_iomux_nand(void)
 }
 #endif
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 static void setup_iomux_uart(void)
 {
-       /* UART1 RXD */
-       mxc_request_iomux(MX53_PIN_ATA_DMACK, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX53_PIN_ATA_DMACK,
-                               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_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x3);
-
-       /* UART1 TXD */
-       mxc_request_iomux(MX53_PIN_ATA_DIOW, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX53_PIN_ATA_DIOW,
-                               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 const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_PATA_DMACK__UART1_RXD_MUX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DIOW__UART1_TXD_MUX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -154,9 +138,9 @@ int board_mmc_getcd(struct mmc *mmc)
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
        int ret;
 
-       mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_GPIO_1__GPIO1_1);
        gpio_direction_input(IMX_GPIO_NR(1, 1));
-       mxc_request_iomux(MX53_PIN_GPIO_4, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_GPIO_4__GPIO1_4);
        gpio_direction_input(IMX_GPIO_NR(1, 4));
 
        if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
@@ -167,8 +151,36 @@ int board_mmc_getcd(struct mmc *mmc)
        return ret;
 }
 
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_CLK_PAD_CTRL                (PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_HIGH)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_CLK_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+       };
+
+       static const iomux_v3_cfg_t sd2_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD2_CMD__ESDHC2_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD2_CLK__ESDHC2_CLK, SD_CLK_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD2_DATA0__ESDHC2_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD2_DATA1__ESDHC2_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD2_DATA2__ESDHC2_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD2_DATA3__ESDHC2_DAT3, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA12__ESDHC2_DAT4, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA13__ESDHC2_DAT5, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA14__ESDHC2_DAT6, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA15__ESDHC2_DAT7, SD_PAD_CTRL),
+       };
+
        u32 index;
        s32 status = 0;
 
@@ -178,56 +190,12 @@ int board_mmc_init(bd_t *bis)
        for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
                switch (index) {
                case 0:
-                       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_iomux_set_pad(MX53_PIN_SD1_CMD, 0x1E4);
-                       mxc_iomux_set_pad(MX53_PIN_SD1_CLK, 0xD4);
-                       mxc_iomux_set_pad(MX53_PIN_SD1_DATA0, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD1_DATA1, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD1_DATA2, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD1_DATA3, 0x1D4);
+                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
+                                                        ARRAY_SIZE(sd1_pads));
                        break;
                case 1:
-                       mxc_request_iomux(MX53_PIN_SD2_CMD,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX53_PIN_SD2_CLK,
-                               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-                       mxc_request_iomux(MX53_PIN_SD2_DATA0,
-                                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX53_PIN_SD2_DATA1,
-                                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX53_PIN_SD2_DATA2,
-                                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX53_PIN_SD2_DATA3,
-                                               IOMUX_CONFIG_ALT0);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA12,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA13,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA14,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA15,
-                                               IOMUX_CONFIG_ALT2);
-
-                       mxc_iomux_set_pad(MX53_PIN_SD2_CMD, 0x1E4);
-                       mxc_iomux_set_pad(MX53_PIN_SD2_CLK, 0xD4);
-                       mxc_iomux_set_pad(MX53_PIN_SD2_DATA0, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD2_DATA1, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD2_DATA2, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_SD2_DATA3, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_ATA_DATA12, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_ATA_DATA13, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_ATA_DATA14, 0x1D4);
-                       mxc_iomux_set_pad(MX53_PIN_ATA_DATA15, 0x1D4);
+                       imx_iomux_v3_setup_multiple_pads(sd2_pads,
+                                                        ARRAY_SIZE(sd2_pads));
                        break;
                default:
                        printf("Warning: you configured more ESDHC controller"
@@ -244,85 +212,70 @@ int board_mmc_init(bd_t *bis)
 
 static void weim_smc911x_iomux(void)
 {
+       static const iomux_v3_cfg_t weim_smc911x_pads[] = {
+               /* Data bus */
+               NEW_PAD_CTRL(MX53_PAD_EIM_D16__EMI_WEIM_D_16,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D17__EMI_WEIM_D_17,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D18__EMI_WEIM_D_18,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D19__EMI_WEIM_D_19,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D20__EMI_WEIM_D_20,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D21__EMI_WEIM_D_21,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D22__EMI_WEIM_D_22,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D23__EMI_WEIM_D_23,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D24__EMI_WEIM_D_24,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D25__EMI_WEIM_D_25,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D26__EMI_WEIM_D_26,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D27__EMI_WEIM_D_27,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D28__EMI_WEIM_D_28,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D29__EMI_WEIM_D_29,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D30__EMI_WEIM_D_30,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_D31__EMI_WEIM_D_31,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+
+               /* Address lines */
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
+                               PAD_CTL_PKE | PAD_CTL_DSE_HIGH),
+
+               /* other EIM signals for ethernet */
+               MX53_PAD_EIM_OE__EMI_WEIM_OE,
+               MX53_PAD_EIM_RW__EMI_WEIM_RW,
+               MX53_PAD_EIM_CS1__EMI_WEIM_CS_1,
+       };
+
        /* ETHERNET_INT as GPIO2_31 */
-       mxc_request_iomux(MX53_PIN_EIM_EB3, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_EB3__GPIO2_31);
        gpio_direction_input(ETHERNET_INT);
 
-       /* Data bus */
-       mxc_request_iomux(MX53_PIN_EIM_D16, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D16, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D17, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D17, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D18, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D19, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D20, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D20, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D21, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D21, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D22, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D22, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D23, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D23, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D24, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D24, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D25, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D25, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D26, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D26, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D27, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D27, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D28, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D28, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D29, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D29, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D30, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D30, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_D31, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_D31, 0xA4);
-
-       /* Address lines */
-       mxc_request_iomux(MX53_PIN_EIM_DA0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA0, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA1, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA1, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA2, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA2, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA3, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA3, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA4, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA4, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA5, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA5, 0xA4);
-
-       mxc_request_iomux(MX53_PIN_EIM_DA6, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX53_PIN_EIM_DA6, 0xA4);
-
-       /* other EIM signals for ethernet */
-       mxc_request_iomux(MX53_PIN_EIM_OE, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_EIM_RW, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_EIM_CS1, IOMUX_CONFIG_ALT0);
+       /* WEIM bus */
+       imx_iomux_v3_setup_multiple_pads(weim_smc911x_pads,
+                                               ARRAY_SIZE(weim_smc911x_pads));
 }
 
 static void weim_cs1_settings(void)
index 12735014767b9d59908d9f5bc7fab99d0436867e..727ad65c3e9a60ead70bd7e5ecbf1911f37962cf 100644 (file)
 #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/arch/iomux-mx53.h>
 #include <asm/errno.h>
 #include <asm/imx-common/boot_mode.h>
 #include <netdev.h>
@@ -49,69 +48,42 @@ int dram_init(void)
        return 0;
 }
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 static void setup_iomux_uart(void)
 {
-       /* UART1 RXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
-       mxc_iomux_set_input(MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
-
-       /* UART1 TXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       static const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
+#define I2C_PAD_CTRL   (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_HYS | PAD_CTL_ODE)
+
 static void setup_i2c(unsigned int port_number)
 {
+       static const iomux_v3_cfg_t i2c1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__I2C1_SDA, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__I2C1_SCL, I2C_PAD_CTRL),
+       };
+
+       static const iomux_v3_cfg_t i2c2_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_KEY_ROW3__I2C2_SDA, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_KEY_COL3__I2C2_SCL, I2C_PAD_CTRL),
+       };
+
        switch (port_number) {
        case 0:
-               /* 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_HYS_ENABLE |
-                               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_HYS_ENABLE |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+               imx_iomux_v3_setup_multiple_pads(i2c1_pads,
+                                                       ARRAY_SIZE(i2c1_pads));
                break;
        case 1:
-               /* i2c2 SDA */
-               mxc_request_iomux(MX53_PIN_KEY_ROW3,
-                               IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
-               mxc_iomux_set_input(MX53_I2C2_IPP_SDA_IN_SELECT_INPUT,
-                               INPUT_CTL_PATH0);
-               mxc_iomux_set_pad(MX53_PIN_KEY_ROW3,
-                               PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
-                               PAD_CTL_100K_PU | PAD_CTL_HYS_ENABLE |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
-
-               /* i2c2 SCL */
-               mxc_request_iomux(MX53_PIN_KEY_COL3,
-                               IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
-               mxc_iomux_set_input(MX53_I2C2_IPP_SCL_IN_SELECT_INPUT,
-                               INPUT_CTL_PATH0);
-               mxc_iomux_set_pad(MX53_PIN_KEY_COL3,
-                               PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH |
-                               PAD_CTL_100K_PU | PAD_CTL_HYS_ENABLE |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+               imx_iomux_v3_setup_multiple_pads(i2c2_pads,
+                                                       ARRAY_SIZE(i2c2_pads));
                break;
        default:
                printf("Warning: Wrong I2C port number\n");
@@ -160,54 +132,26 @@ void power_init(void)
 
 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 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 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 CRS */
-       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);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -221,9 +165,9 @@ int board_mmc_getcd(struct mmc *mmc)
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
        int ret;
 
-       mxc_request_iomux(MX53_PIN_EIM_DA11, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA11__GPIO3_11);
        gpio_direction_input(IMX_GPIO_NR(3, 11));
-       mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA13__GPIO3_13);
        gpio_direction_input(IMX_GPIO_NR(3, 13));
 
        if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
@@ -234,8 +178,38 @@ int board_mmc_getcd(struct mmc *mmc)
        return ret;
 }
 
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA13__GPIO3_13,
+       };
+
+       static const iomux_v3_cfg_t sd2_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
+                               SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_IORDY__ESDHC3_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA8__ESDHC3_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA9__ESDHC3_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA10__ESDHC3_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA11__ESDHC3_DAT3, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__ESDHC3_DAT4, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__ESDHC3_DAT5, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__ESDHC3_DAT6, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__ESDHC3_DAT7, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA11__GPIO3_11,
+       };
+
        u32 index;
        s32 status = 0;
 
@@ -245,109 +219,12 @@ int board_mmc_init(bd_t *bis)
        for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
                switch (index) {
                case 0:
-                       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_EIM_DA13,
-                                               IOMUX_CONFIG_ALT1);
-
-                       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);
+                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
+                                                        ARRAY_SIZE(sd1_pads));
                        break;
                case 1:
-                       mxc_request_iomux(MX53_PIN_ATA_RESET_B,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_IORDY,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA8,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA9,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA10,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA11,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA0,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA1,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA2,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA3,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_EIM_DA11,
-                                               IOMUX_CONFIG_ALT1);
-
-                       mxc_iomux_set_pad(MX53_PIN_ATA_RESET_B,
-                               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_ATA_IORDY,
-                               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_ATA_DATA8,
-                               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_ATA_DATA9,
-                               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_ATA_DATA10,
-                               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_ATA_DATA11,
-                               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_ATA_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_ATA_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_ATA_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_ATA_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);
-
+                       imx_iomux_v3_setup_multiple_pads(sd2_pads,
+                                                        ARRAY_SIZE(sd2_pads));
                        break;
                default:
                        printf("Warning: you configured more ESDHC controller"
index 8f39c383f111111f83d6935b410d2893d83aadaa..10e9d36e5199f1863852667e347ba82a4c75f9de 100644 (file)
 #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/arch/iomux-mx53.h>
 #include <asm/arch/clock.h>
 #include <asm/errno.h>
 #include <asm/imx-common/mx5_video.h>
@@ -82,86 +81,51 @@ u32 get_board_rev(void)
        return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
 }
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 static void setup_iomux_uart(void)
 {
-       /* UART1 RXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
-       mxc_iomux_set_input(MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
-
-       /* UART1 TXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       static const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 #ifdef CONFIG_USB_EHCI_MX5
 int board_ehci_hcd_init(int port)
 {
        /* 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), 1);
+       imx_iomux_v3_setup_pad(MX53_PAD_PATA_DA_2__GPIO7_8);
+       gpio_direction_output(IMX_GPIO_NR(7, 8), 1);
        return 0;
 }
 #endif
 
 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 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 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 CRS */
-       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);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -175,9 +139,9 @@ int board_mmc_getcd(struct mmc *mmc)
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
        int ret;
 
-       mxc_request_iomux(MX53_PIN_EIM_DA11, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA11__GPIO3_11);
        gpio_direction_input(IMX_GPIO_NR(3, 11));
-       mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA13__GPIO3_13);
        gpio_direction_input(IMX_GPIO_NR(3, 13));
 
        if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
@@ -188,8 +152,38 @@ int board_mmc_getcd(struct mmc *mmc)
        return ret;
 }
 
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA13__GPIO3_13,
+       };
+
+       static const iomux_v3_cfg_t sd2_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
+                               SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_IORDY__ESDHC3_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA8__ESDHC3_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA9__ESDHC3_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA10__ESDHC3_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA11__ESDHC3_DAT3, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__ESDHC3_DAT4, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__ESDHC3_DAT5, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__ESDHC3_DAT6, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__ESDHC3_DAT7, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA11__GPIO3_11,
+       };
+
        u32 index;
        s32 status = 0;
 
@@ -199,109 +193,12 @@ int board_mmc_init(bd_t *bis)
        for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
                switch (index) {
                case 0:
-                       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_EIM_DA13,
-                                               IOMUX_CONFIG_ALT1);
-
-                       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);
+                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
+                                                        ARRAY_SIZE(sd1_pads));
                        break;
                case 1:
-                       mxc_request_iomux(MX53_PIN_ATA_RESET_B,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_IORDY,
-                                               IOMUX_CONFIG_ALT2);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA8,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA9,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA10,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA11,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA0,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA1,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA2,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_ATA_DATA3,
-                                               IOMUX_CONFIG_ALT4);
-                       mxc_request_iomux(MX53_PIN_EIM_DA11,
-                                               IOMUX_CONFIG_ALT1);
-
-                       mxc_iomux_set_pad(MX53_PIN_ATA_RESET_B,
-                               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_ATA_IORDY,
-                               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_ATA_DATA8,
-                               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_ATA_DATA9,
-                               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_ATA_DATA10,
-                               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_ATA_DATA11,
-                               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_ATA_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_ATA_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_ATA_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_ATA_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);
-
+                       imx_iomux_v3_setup_multiple_pads(sd2_pads,
+                                                        ARRAY_SIZE(sd2_pads));
                        break;
                default:
                        printf("Warning: you configured more ESDHC controller"
@@ -316,28 +213,17 @@ int board_mmc_init(bd_t *bis)
 }
 #endif
 
+#define I2C_PAD_CTRL   (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 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 const iomux_v3_cfg_t i2c1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__I2C1_SDA, I2C_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__I2C1_SCL, I2C_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(i2c1_pads, ARRAY_SIZE(i2c1_pads));
 }
 
 static int power_init(void)
index a4d5a6a3650dca0561cc7a39ad6a25fa53a0ec28..c4654c9b96ee2560c54872d8e2b7b4905f9702ac 100644 (file)
@@ -24,7 +24,7 @@
 #include <common.h>
 #include <linux/list.h>
 #include <asm/gpio.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx53.h>
 #include <linux/fb.h>
 #include <ipu_pixfmt.h>
 
@@ -63,42 +63,46 @@ static struct fb_videomode const seiko_wvga = {
 
 void setup_iomux_lcd(void)
 {
-       mxc_request_iomux(MX53_PIN_DI0_DISP_CLK, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DI0_PIN15, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DI0_PIN2, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DI0_PIN3, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT0, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT1, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT2, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT3, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT4, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT5, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT6, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT7, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT8, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT9, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT10, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT11, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT12, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT13, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT14, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT15, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT16, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT17, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT18, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT19, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT20, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT21, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT22, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX53_PIN_DISP0_DAT23, IOMUX_CONFIG_ALT0);
+       static const iomux_v3_cfg_t lcd_pads[] = {
+               MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK,
+               MX53_PAD_DI0_PIN15__IPU_DI0_PIN15,
+               MX53_PAD_DI0_PIN2__IPU_DI0_PIN2,
+               MX53_PAD_DI0_PIN3__IPU_DI0_PIN3,
+               MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0,
+               MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1,
+               MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2,
+               MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3,
+               MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4,
+               MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5,
+               MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6,
+               MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7,
+               MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8,
+               MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9,
+               MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10,
+               MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11,
+               MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12,
+               MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13,
+               MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14,
+               MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15,
+               MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16,
+               MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17,
+               MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18,
+               MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19,
+               MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20,
+               MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21,
+               MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22,
+               MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
 
        /* Turn on GPIO backlight */
-       mxc_request_iomux(MX53_PIN_EIM_D24, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_D24__GPIO3_24);
        gpio_direction_output(MX53LOCO_LCD_POWER, 1);
 
        /* Turn on display contrast */
-       mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT1);
-       gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_GPIO_1), 1);
+       imx_iomux_v3_setup_pad(MX53_PAD_GPIO_1__GPIO1_1);
+       gpio_direction_output(IMX_GPIO_NR(1, 1), 1);
 }
 
 int board_video_skip(void)
index 761f727d0861637ae1506566c9dcb0934de25ae9..d04f44fb3ed7f2ec0c3936ea50a9c988f368de02 100644 (file)
 #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/arch/iomux-mx53.h>
 #include <asm/errno.h>
 #include <netdev.h>
 #include <mmc.h>
@@ -56,76 +55,41 @@ void dram_init_banksize(void)
        gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
 }
 
+#define UART_PAD_CTRL  (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                        PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
+
 static void setup_iomux_uart(void)
 {
-       /* UART1 RXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
-       mxc_iomux_set_input(MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
-
-       /* UART1 TXD */
-       mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2);
-       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_100K_PU |
-                               PAD_CTL_ODE_OPENDRAIN_ENABLE);
+       static const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 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 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 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 CRS */
-       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);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
+                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
+                               PAD_CTL_HYS | PAD_CTL_PKE),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -135,13 +99,28 @@ struct fsl_esdhc_cfg esdhc_cfg[1] = {
 
 int board_mmc_getcd(struct mmc *mmc)
 {
-       mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA13__GPIO3_13);
        gpio_direction_input(IMX_GPIO_NR(3, 13));
        return !gpio_get_value(IMX_GPIO_NR(3, 13));
 }
 
+#define SD_CMD_PAD_CTRL                (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
+                                PAD_CTL_PUS_100K_UP)
+#define SD_PAD_CTRL            (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
+                                PAD_CTL_DSE_HIGH)
+
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
+               NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
+               MX53_PAD_EIM_DA13__GPIO3_13,
+       };
+
        u32 index;
        s32 status = 0;
 
@@ -150,43 +129,8 @@ int board_mmc_init(bd_t *bis)
        for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
                switch (index) {
                case 0:
-                       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_EIM_DA13,
-                                               IOMUX_CONFIG_ALT1);
-
-                       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);
+                       imx_iomux_v3_setup_multiple_pads(sd1_pads,
+                                                        ARRAY_SIZE(sd1_pads));
                        break;
 
                default:
index ff7f5e83a0fde9a8339f267741f1b08f2282cae2..e33674665f865b0ea380a6c9b04c58b2fe96bff4 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
 int dram_init(void)
 {
index aec3286e257018479a7398c17e277cdea9979f80..2a6e3a919225df42b68174e873e6767ef855c87a 100644 (file)
 #include <asm/errno.h>
 #include <asm/gpio.h>
 #include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/mxc_i2c.h>
 #include <asm/imx-common/boot_mode.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
 #include <miiphy.h>
 #include <netdev.h>
 #include <asm/arch/sys_proto.h>
+#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
+       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
+
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
 
 int dram_init(void)
 {
@@ -77,6 +84,45 @@ iomux_v3_cfg_t const enet_pads[] = {
        MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
 };
 
+/* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
+struct i2c_pads_info i2c_pad_info1 = {
+       .scl = {
+               .i2c_mode = MX6_PAD_EIM_EB2__I2C2_SCL | PC,
+               .gpio_mode = MX6_PAD_EIM_EB2__GPIO_2_30 | PC,
+               .gp = IMX_GPIO_NR(2, 30)
+       },
+       .sda = {
+               .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | PC,
+               .gpio_mode = MX6_PAD_KEY_ROW3__GPIO_4_13 | PC,
+               .gp = IMX_GPIO_NR(4, 13)
+       }
+};
+
+/*
+ * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
+ * Compass Sensor, Accelerometer, Res Touch
+ */
+struct i2c_pads_info i2c_pad_info2 = {
+       .scl = {
+               .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
+               .gpio_mode = MX6_PAD_GPIO_3__GPIO_1_3 | PC,
+               .gp = IMX_GPIO_NR(1, 3)
+       },
+       .sda = {
+               .i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | PC,
+               .gpio_mode = MX6_PAD_EIM_D18__GPIO_3_18 | PC,
+               .gp = IMX_GPIO_NR(3, 18)
+       }
+};
+
+iomux_v3_cfg_t const i2c3_pads[] = {
+       MX6_PAD_EIM_A24__GPIO_5_4               | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const port_exp[] = {
+       MX6_PAD_SD2_DAT0__GPIO_1_15             | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
 static void setup_iomux_enet(void)
 {
        imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
@@ -179,7 +225,10 @@ static int mx6sabre_rev(void)
         * i.MX6Q ARD RevB: 0x02
         */
        struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-       int reg = readl(&ocotp->gp1);
+       struct fuse_bank *bank = &ocotp->bank[4];
+       struct fuse_bank4_regs *fuse =
+                       (struct fuse_bank4_regs *)bank->fuse_regs;
+       int reg = readl(&fuse->gp1);
        int ret;
 
        switch (reg >> 8 & 0x0F) {
@@ -214,6 +263,16 @@ int board_init(void)
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
+       /* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
+       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+       /* I2C 3 Steer */
+       gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
+       imx_iomux_v3_setup_multiple_pads(i2c3_pads, ARRAY_SIZE(i2c3_pads));
+       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
+
+       gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
+       imx_iomux_v3_setup_multiple_pads(port_exp, ARRAY_SIZE(port_exp));
+
        return 0;
 }
 
index 9f9cac82c423295c6c1baf3610106fb3f7e52b77..862bc3099d1bdec201845634de63706e0944c34b 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |           \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |              \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |           \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |              \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define SPI_PAD_CTRL (PAD_CTL_HYS |                            \
-       PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
+#define SPI_PAD_CTRL (PAD_CTL_HYS | 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)
+#define BUTTON_PAD_CTRL (PAD_CTL_PUS_100K_UP |                 \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
-#define I2C_PAD_CTRL   (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm | PAD_CTL_HYS |                       \
+#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
 
 int dram_init(void)
@@ -312,7 +308,6 @@ iomux_v3_cfg_t const ecspi1_pads[] = {
 
 void setup_spi(void)
 {
-       gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
        imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
                                         ARRAY_SIZE(ecspi1_pads));
 }
index 0d7cb9efd0233b6236be623a2486389597c44af0..25298261455ed69f4a7a79f02d005b0e1c723077 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
 int dram_init(void)
 {
@@ -166,6 +165,7 @@ int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
+       s32 status = 0;
        int i;
 
        /*
@@ -196,15 +196,15 @@ int board_mmc_init(bd_t *bis)
                        break;
                default:
                        printf("Warning: you configured more USDHC controllers"
-                               "(%d) than supported by the board\n", i + 1);
-                       return 0;
-              }
+                              "(%d) then supported by the board (%d)\n",
+                              i + 1, CONFIG_SYS_FSL_USDHC_NUM);
+                       return status;
+               }
 
-              if (fsl_esdhc_initialize(bis, &usdhc_cfg[i]))
-                       printf("Warning: failed to initialize mmc dev %d\n", i);
+               status |= fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
        }
 
-       return 0;
+       return status;
 }
 #endif
 
diff --git a/board/freescale/mx6slevk/Makefile b/board/freescale/mx6slevk/Makefile
new file mode 100644 (file)
index 0000000..43af351
--- /dev/null
@@ -0,0 +1,28 @@
+# (C) Copyright 2013 Freescale Semiconductor, Inc.
+#
+# 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.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := mx6slevk.o
+
+SRCS   := $(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/freescale/mx6slevk/imximage.cfg b/board/freescale/mx6slevk/imximage.cfg
new file mode 100644 (file)
index 0000000..df39a16
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ *
+ * 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      sd
+
+/*
+ * 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
+ */
+DATA 4 0x020c4018 0x00260324
+
+DATA 4 0x020c4068 0xffffffff
+DATA 4 0x020c406c 0xffffffff
+DATA 4 0x020c4070 0xffffffff
+DATA 4 0x020c4074 0xffffffff
+DATA 4 0x020c4078 0xffffffff
+DATA 4 0x020c407c 0xffffffff
+DATA 4 0x020c4080 0xffffffff
+
+DATA 4 0x020e0344 0x00003030
+DATA 4 0x020e0348 0x00003030
+DATA 4 0x020e034c 0x00003030
+DATA 4 0x020e0350 0x00003030
+DATA 4 0x020e030c 0x00000030
+DATA 4 0x020e0310 0x00000030
+DATA 4 0x020e0314 0x00000030
+DATA 4 0x020e0318 0x00000030
+DATA 4 0x020e0300 0x00000030
+DATA 4 0x020e031c 0x00000030
+DATA 4 0x020e0338 0x00000028
+DATA 4 0x020e0320 0x00000030
+DATA 4 0x020e032c 0x00000000
+DATA 4 0x020e033c 0x00000008
+DATA 4 0x020e0340 0x00000008
+DATA 4 0x020e05c4 0x00000030
+DATA 4 0x020e05cc 0x00000030
+DATA 4 0x020e05d4 0x00000030
+DATA 4 0x020e05d8 0x00000030
+DATA 4 0x020e05ac 0x00000030
+DATA 4 0x020e05c8 0x00000030
+DATA 4 0x020e05b0 0x00020000
+DATA 4 0x020e05b4 0x00000000
+DATA 4 0x020e05c0 0x00020000
+DATA 4 0x020e05d0 0x00080000
+
+DATA 4 0x021b001c 0x00008000
+DATA 4 0x021b085c 0x1b4700c7
+DATA 4 0x021b0800 0xa1390003
+DATA 4 0x021b0890 0x00300000
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b081c 0x33333333
+DATA 4 0x021b0820 0x33333333
+DATA 4 0x021b0824 0x33333333
+DATA 4 0x021b0828 0x33333333
+DATA 4 0x021b082c 0xf3333333
+DATA 4 0x021b0830 0xf3333333
+DATA 4 0x021b0834 0xf3333333
+DATA 4 0x021b0838 0xf3333333
+DATA 4 0x021b0848 0x4241444a
+DATA 4 0x021b0850 0x3030312b
+DATA 4 0x021b083c 0x20000000
+DATA 4 0x021b0840 0x00000000
+DATA 4 0x021b08c0 0x24911492
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b000c 0x33374133
+DATA 4 0x021b0004 0x00020024
+DATA 4 0x021b0010 0x00100A82
+DATA 4 0x021b0014 0x00000093
+DATA 4 0x021b0018 0x00001688
+DATA 4 0x021b002c 0x0f9f26d2
+DATA 4 0x021b0030 0x0000020e
+DATA 4 0x021b0038 0x00190778
+DATA 4 0x021b0008 0x00000000
+DATA 4 0x021b0040 0x0000004f
+DATA 4 0x021b0000 0xc3110000
+DATA 4 0x021b001c 0x003f8030
+DATA 4 0x021b001c 0xff0a8030
+DATA 4 0x021b001c 0x82018030
+DATA 4 0x021b001c 0x04028030
+DATA 4 0x021b001c 0x02038030
+DATA 4 0x021b001c 0xff0a8038
+DATA 4 0x021b001c 0x82018038
+DATA 4 0x021b001c 0x04028038
+DATA 4 0x021b001c 0x02038038
+DATA 4 0x021b0800 0xa1310003
+DATA 4 0x021b0020 0x00001800
+DATA 4 0x021b0818 0x00000000
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b0004 0x00025564
+DATA 4 0x021b0404 0x00011006
+DATA 4 0x021b001c 0x00000000
diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c
new file mode 100644 (file)
index 0000000..69fe8fc
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@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.
+ */
+
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/io.h>
+#include <asm/sizes.h>
+#include <common.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_22K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+static iomux_v3_cfg_t const uart1_pads[] = {
+       MX6_PAD_UART1_TXD__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_UART1_RXD__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+       MX6_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT0__USDHC2_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT1__USDHC2_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT2__USDHC2_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD2_DAT3__USDHC2_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+}
+
+static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+       {USDHC2_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       return 1;       /* Assume boot SD always present */
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       imx_iomux_v3_setup_multiple_pads(usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
+
+       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
+
+int board_early_init_f(void)
+{
+       setup_iomux_uart();
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       return 0;
+}
+
+u32 get_board_rev(void)
+{
+       return get_cpu_rev();
+}
+
+int checkboard(void)
+{
+       puts("Board: MX6SLEVK\n");
+
+       return 0;
+}
index a706a6d00ca6fd2ce6b5533442a6c8b3d38d5394..44d3e0c618bf62a98b6ed048e40e81f4ea696456 100644 (file)
@@ -227,6 +227,17 @@ int misc_init_r(void)
                                "'00' is unsupported\n");
                else
                        actual[i] = freq[i][clock];
+
+               /*
+                * PC board uses a different CPLD with PB board, this CPLD
+                * has cpld_ver_sub = 1, and pcba_ver = 5. But CPLD on PB
+                * board has cpld_ver_sub = 0, and pcba_ver = 4.
+                */
+               if ((i == 1) && (CPLD_READ(cpld_ver_sub) == 1) &&
+                   (CPLD_READ(pcba_ver) == 5)) {
+                       /* PC board bank2 frequency */
+                       actual[i] = freq[i-1][clock];
+               }
        }
 
        for (i = 0; i < NUM_SRDS_BANKS; i++) {
index b649df0f3b53f92029bad7cd2bea9aac4c5adbde..7103a0d38d477c3d293633be999b50034fb0a59e 100644 (file)
@@ -365,24 +365,40 @@ static void initialize_qsgmiiphy_fix(void)
                        qsgmiiphy_fix[FM1_DTSEC6] = 1;
                        qsgmiiphy_fix[FM1_DTSEC9] = 1;
                        qsgmiiphy_fix[FM1_DTSEC10] = 1;
+                       slot_qsgmii_phyaddr[1][0] =  SGMII_CARD_PORT1_PHY_ADDR;
+                       slot_qsgmii_phyaddr[1][1] =  SGMII_CARD_PORT2_PHY_ADDR;
+                       slot_qsgmii_phyaddr[1][2] =  SGMII_CARD_PORT3_PHY_ADDR;
+                       slot_qsgmii_phyaddr[1][3] =  SGMII_CARD_PORT4_PHY_ADDR;
                        break;
                case 2:
                        qsgmiiphy_fix[FM1_DTSEC1] = 1;
                        qsgmiiphy_fix[FM1_DTSEC2] = 1;
                        qsgmiiphy_fix[FM1_DTSEC3] = 1;
                        qsgmiiphy_fix[FM1_DTSEC4] = 1;
+                       slot_qsgmii_phyaddr[2][0] =  SGMII_CARD_PORT1_PHY_ADDR;
+                       slot_qsgmii_phyaddr[2][1] =  SGMII_CARD_PORT2_PHY_ADDR;
+                       slot_qsgmii_phyaddr[2][2] =  SGMII_CARD_PORT3_PHY_ADDR;
+                       slot_qsgmii_phyaddr[2][3] =  SGMII_CARD_PORT4_PHY_ADDR;
                        break;
                case 3:
                        qsgmiiphy_fix[FM2_DTSEC5] = 1;
                        qsgmiiphy_fix[FM2_DTSEC6] = 1;
                        qsgmiiphy_fix[FM2_DTSEC9] = 1;
                        qsgmiiphy_fix[FM2_DTSEC10] = 1;
+                       slot_qsgmii_phyaddr[3][0] =  SGMII_CARD_PORT1_PHY_ADDR;
+                       slot_qsgmii_phyaddr[3][1] =  SGMII_CARD_PORT2_PHY_ADDR;
+                       slot_qsgmii_phyaddr[3][2] =  SGMII_CARD_PORT3_PHY_ADDR;
+                       slot_qsgmii_phyaddr[3][3] =  SGMII_CARD_PORT4_PHY_ADDR;
                        break;
                case 4:
                        qsgmiiphy_fix[FM2_DTSEC1] = 1;
                        qsgmiiphy_fix[FM2_DTSEC2] = 1;
                        qsgmiiphy_fix[FM2_DTSEC3] = 1;
                        qsgmiiphy_fix[FM2_DTSEC4] = 1;
+                       slot_qsgmii_phyaddr[4][0] =  SGMII_CARD_PORT1_PHY_ADDR;
+                       slot_qsgmii_phyaddr[4][1] =  SGMII_CARD_PORT2_PHY_ADDR;
+                       slot_qsgmii_phyaddr[4][2] =  SGMII_CARD_PORT3_PHY_ADDR;
+                       slot_qsgmii_phyaddr[4][3] =  SGMII_CARD_PORT4_PHY_ADDR;
                        break;
                default:
                        break;
@@ -435,6 +451,7 @@ int board_eth_init(bd_t *bis)
        t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT7);
        t4240qds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2);
 
+       initialize_qsgmiiphy_fix();
 
        switch (srds_prtcl_s1) {
        case 1:
@@ -702,8 +719,6 @@ int board_eth_init(bd_t *bis)
        }
 #endif /* CONFIG_SYS_NUM_FMAN */
 
-       initialize_qsgmiiphy_fix();
-
        cpu_eth_init(bis);
 #endif /* CONFIG_FMAN_ENET */
 
index 6f2c5c86b4d2dc0d8d83734a33021ff1cdc0a91d..f3848f3921a0893a73f416982075ab618c30b144 100644 (file)
@@ -37,7 +37,8 @@ struct law_entry law_table[] = {
 #endif
        SET_LAW(QIXIS_BASE_PHYS, LAW_SIZE_4K, LAW_TRGT_IF_IFC),
 #ifdef CONFIG_SYS_DCSRBAR_PHYS
-       SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_4M, LAW_TRGT_IF_DCSR),
+       /* Limit DCSR to 32M to access NPC Trace Buffer */
+       SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_32M, LAW_TRGT_IF_DCSR),
 #endif
 #ifdef CONFIG_SYS_NAND_BASE_PHYS
        SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_IFC),
diff --git a/board/freescale/t4qds/t4_pbi.cfg b/board/freescale/t4qds/t4_pbi.cfg
new file mode 100644 (file)
index 0000000..c598fb5
--- /dev/null
@@ -0,0 +1,36 @@
+#PBI commands
+#Initialize CPC1
+09010000 00200400
+09138000 00000000
+091380c0 00000100
+#512KB SRAM
+09010100 00000000
+09010104 fff80009
+09010f00 08000000
+#enable CPC1
+09010000 80000000
+#Configure LAW for CPC1
+09000d00 00000000
+09000d04 fff80000
+09000d08 81000012
+#workaround for IFC bus speed
+091241c0 f03f3f3f
+091241c4 ff003f3f
+09124010 00000101
+09124130 0000000c
+#workaround for SERDES A-006031
+090ea000 064740e6
+090ea020 064740e6
+090eb000 064740e6
+090eb020 064740e6
+090ec000 064740e6
+090ec020 064740e6
+090ed000 064740e6
+090ed020 064740e6
+#Configure alternate space
+09000010 00000000
+09000014 ff000000
+09000018 81000000
+#Flush PBL data
+09138000 00000000
+091380c0 00000000
diff --git a/board/freescale/t4qds/t4_rcw.cfg b/board/freescale/t4qds/t4_rcw.cfg
new file mode 100644 (file)
index 0000000..6ac95ff
--- /dev/null
@@ -0,0 +1,7 @@
+#PBL preamble and RCW header
+aa55aa55 010e0100
+#serdes protocol  1_28_6_12
+14180019 0c101916 00000000 00000000
+04383060 30548c00 6c020000 19000000
+00000000 ee0000ee 00000000 000187fc
+00000000 00000000 00000000 00000018
index be6d1c49890b9a8b3affab61a6cd0f70d8e54af4..f0f280b253d08dbb6e043c43a20528f222cb97ce 100644 (file)
@@ -234,7 +234,7 @@ static inline int set_voltage(u8 vid)
 }
 
 
-static int adjust_vdd(void)
+static int adjust_vdd(ulong vdd_override)
 {
        int re_enable = disable_interrupts();
        ccsr_gur_t __iomem *gur =
@@ -243,6 +243,8 @@ static int adjust_vdd(void)
        u8 vid, vid_current;
        int vdd_target, vdd_current, vdd_last;
        int ret;
+       unsigned long vdd_string_override;
+       char *vdd_string;
        static const uint16_t vdd[32] = {
                0,      /* unused */
                9875,   /* 0.9875V */
@@ -292,6 +294,19 @@ static int adjust_vdd(void)
                        FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
        }
        vdd_target = vdd[vid];
+
+       /* check override variable for overriding VDD */
+       vdd_string = getenv("t4240qds_vdd_mv");
+       if (vdd_override == 0 && vdd_string &&
+           !strict_strtoul(vdd_string, 10, &vdd_string_override))
+               vdd_override = vdd_string_override;
+       if (vdd_override >= 819 && vdd_override <= 1212) {
+               vdd_target = vdd_override * 10; /* convert to 1/10 mV */
+               debug("VDD override is %lu\n", vdd_override);
+       } else if (vdd_override != 0) {
+               printf("Invalid value.\n");
+       }
+
        if (vdd_target == 0) {
                debug("VID: VID not used\n");
                ret = 0;
@@ -511,7 +526,7 @@ int board_early_init_r(void)
         * Adjust core voltage according to voltage ID
         * This function changes I2C mux to channel 2.
         */
-       if (adjust_vdd())
+       if (adjust_vdd(0))
                printf("Warning: Adjusting core voltage failed.\n");
 
        /* Configure board SERDES ports crossbar */
@@ -525,6 +540,20 @@ int board_early_init_r(void)
 unsigned long get_board_sys_clk(void)
 {
        u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
+#ifdef CONFIG_FSL_QIXIS_CLOCK_MEASUREMENT
+       /* use accurate clock measurement */
+       int freq = QIXIS_READ(clk_freq[0]) << 8 | QIXIS_READ(clk_freq[1]);
+       int base = QIXIS_READ(clk_base[0]) << 8 | QIXIS_READ(clk_base[1]);
+       u32 val;
+
+       val =  freq * base;
+       if (val) {
+               debug("SYS Clock measurement is: %d\n", val);
+               return val;
+       } else {
+               printf("Warning: SYS clock measurement is invalid, using value from brdcfg1.\n");
+       }
+#endif
 
        switch (sysclk_conf & 0x0F) {
        case QIXIS_SYSCLK_83:
@@ -548,6 +577,20 @@ unsigned long get_board_sys_clk(void)
 unsigned long get_board_ddr_clk(void)
 {
        u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
+#ifdef CONFIG_FSL_QIXIS_CLOCK_MEASUREMENT
+       /* use accurate clock measurement */
+       int freq = QIXIS_READ(clk_freq[2]) << 8 | QIXIS_READ(clk_freq[3]);
+       int base = QIXIS_READ(clk_base[0]) << 8 | QIXIS_READ(clk_base[1]);
+       u32 val;
+
+       val =  freq * base;
+       if (val) {
+               debug("DDR Clock measurement is: %d\n", val);
+               return val;
+       } else {
+               printf("Warning: DDR clock measurement is invalid, using value from brdcfg1.\n");
+       }
+#endif
 
        switch ((ddrclk_conf & 0x30) >> 4) {
        case QIXIS_DDRCLK_100:
@@ -642,6 +685,106 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 }
 
+/*
+ * This function is called by bdinfo to print detail board information.
+ * As an exmaple for future board, we organize the messages into
+ * several sections. If applicable, the message is in the format of
+ * <name>      = <value>
+ * It should aligned with normal output of bdinfo command.
+ *
+ * Voltage: Core, DDR and another configurable voltages
+ * Clock  : Critical clocks which are not printed already
+ * RCW    : RCW source if not printed already
+ * Misc   : Other important information not in above catagories
+ */
+void board_detail(void)
+{
+       int i;
+       u8 brdcfg[16], dutcfg[16], rst_ctl;
+       int vdd, rcwsrc;
+       static const char * const clk[] = {"66.67", "100", "125", "133.33"};
+
+       for (i = 0; i < 16; i++) {
+               brdcfg[i] = qixis_read(offsetof(struct qixis, brdcfg[0]) + i);
+               dutcfg[i] = qixis_read(offsetof(struct qixis, dutcfg[0]) + i);
+       }
+
+       /* Voltage secion */
+       if (!select_i2c_ch_pca9547(I2C_MUX_CH_VOL_MONITOR)) {
+               vdd = read_voltage();
+               if (vdd > 0)
+                       printf("Core voltage= %d mV\n", vdd);
+               select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
+       }
+
+       printf("XVDD        = 1.%d V\n", ((brdcfg[8] & 0xf) - 4) * 5 + 25);
+
+       /* clock section */
+       printf("SYSCLK      = %s MHz\nDDRCLK      = %s MHz\n",
+              clk[(brdcfg[11] >> 2) & 0x3], clk[brdcfg[11] & 3]);
+
+       /* RCW section */
+       rcwsrc = (dutcfg[0] << 1) + (dutcfg[1] & 1);
+       puts("RCW source  = ");
+       switch (rcwsrc) {
+       case 0x017:
+       case 0x01f:
+               puts("8-bit NOR\n");
+               break;
+       case 0x027:
+       case 0x02F:
+               puts("16-bit NOR\n");
+               break;
+       case 0x040:
+               puts("SDHC/eMMC\n");
+               break;
+       case 0x044:
+               puts("SPI 16-bit addressing\n");
+               break;
+       case 0x045:
+               puts("SPI 24-bit addressing\n");
+               break;
+       case 0x048:
+               puts("I2C normal addressing\n");
+               break;
+       case 0x049:
+               puts("I2C extended addressing\n");
+               break;
+       case 0x108:
+       case 0x109:
+       case 0x10a:
+       case 0x10b:
+               puts("8-bit NAND, 2KB\n");
+               break;
+       default:
+               if ((rcwsrc >= 0x080) && (rcwsrc <= 0x09f))
+                       puts("Hard-coded RCW\n");
+               else if ((rcwsrc >= 0x110) && (rcwsrc <= 0x11f))
+                       puts("8-bit NAND, 4KB\n");
+               else
+                       puts("unknown\n");
+               break;
+       }
+
+       /* Misc section */
+       rst_ctl = QIXIS_READ(rst_ctl);
+       puts("HRESET_REQ  = ");
+       switch (rst_ctl & 0x30) {
+       case 0x00:
+               puts("Ignored\n");
+               break;
+       case 0x10:
+               puts("Assert HRESET\n");
+               break;
+       case 0x30:
+               puts("Reset system\n");
+               break;
+       default:
+               puts("N/A\n");
+               break;
+       }
+}
+
 /*
  * Reverse engineering switch settings.
  * Some bits cannot be figured out. They will be displayed as
@@ -658,7 +801,7 @@ void qixis_dump_switch(void)
         * Any bit with 1 means that bit cannot be reverse engineered.
         * It will be displayed as _ in binary format.
         */
-       static const u8 mask[] = {0, 0, 0, 0, 0, 0x1, 0xdf, 0x3f, 0x1f};
+       static const u8 mask[] = {0, 0, 0, 0, 0, 0x1, 0xcf, 0x3f, 0x1f};
        char buf[10];
        u8 brdcfg[16], dutcfg[16];
 
@@ -689,7 +832,8 @@ void qixis_dump_switch(void)
        sw[5] = ((brdcfg[0] & 0x0f) << 4)       | \
                ((QIXIS_READ(rst_ctl) & 0x30) >> 2) | \
                ((brdcfg[0] & 0x40) >> 5);
-       sw[6] = (brdcfg[11] & 0x20);
+       sw[6] = (brdcfg[11] & 0x20)             |
+               ((brdcfg[5] & 0x02) << 3);
        sw[7] = (((~QIXIS_READ(rst_ctl)) & 0x40) << 1) | \
                ((brdcfg[5] & 0x10) << 2);
        sw[8] = ((brdcfg[12] & 0x08) << 4)      | \
@@ -701,3 +845,23 @@ void qixis_dump_switch(void)
                        i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);
        }
 }
+
+static int do_vdd_adjust(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       ulong override;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+       if (!strict_strtoul(argv[1], 10, &override))
+               adjust_vdd(override);   /* the value is checked by callee */
+       else
+               return CMD_RET_USAGE;
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       vdd_override, 2, 0, do_vdd_adjust,
+       "Override VDD",
+       "- override with the voltage specified in mV, eg. 1050"
+);
index 80eb511e1d301f409eb36c06a1a8f6da869b6a98..92c01cf95c72a18f614a52d85355abab11592079 100644 (file)
@@ -115,7 +115,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #ifdef CONFIG_SYS_DCSRBAR_PHYS
        SET_TLB_ENTRY(1, CONFIG_SYS_DCSRBAR, CONFIG_SYS_DCSRBAR_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 13, BOOKE_PAGESZ_4M, 1),
+                     0, 13, BOOKE_PAGESZ_32M, 1),
 #endif
 #ifdef CONFIG_SYS_NAND_BASE
        /*
diff --git a/board/freescale/titanium/Makefile b/board/freescale/titanium/Makefile
new file mode 100644 (file)
index 0000000..46827f8
--- /dev/null
@@ -0,0 +1,36 @@
+#
+# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
+#
+# (C) Copyright 2011 Freescale Semiconductor, Inc.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := titanium.o
+
+SRCS   := $(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/freescale/titanium/imximage.cfg b/board/freescale/titanium/imximage.cfg
new file mode 100644 (file)
index 0000000..1934343
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Projectiondesign AS
+ * Derived from ./board/freescale/mx6qsabrelite/imximage.cfg
+ *
+ * Copyright (C) 2011 Freescale Semiconductor, Inc.
+ * Jason Liu <r64343@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.
+ *
+ * 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
+ * sd, nand
+ */
+BOOT_FROM      nand
+
+/*
+ * 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
+ */
+
+#define __ASSEMBLY__
+#include <config.h>
+#include "asm/arch/mx6-ddr.h"
+#include "asm/arch/iomux.h"
+#include "asm/arch/crm_regs.h"
+
+DATA 4, MX6_IOM_DRAM_SDQS0, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS1, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS2, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS3, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS4, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS5, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS6, 0x00000030
+DATA 4, MX6_IOM_DRAM_SDQS7, 0x00000030
+
+DATA 4, MX6_IOM_DRAM_DQM0, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM1, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM2, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM3, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM4, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM5, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM6, 0x00020030
+DATA 4, MX6_IOM_DRAM_DQM7, 0x00020030
+
+DATA 4, MX6_IOM_DRAM_CAS, 0x00020030
+DATA 4, MX6_IOM_DRAM_RAS, 0x00020030
+DATA 4, MX6_IOM_DRAM_SDCLK_0, 0x00020030
+DATA 4, MX6_IOM_DRAM_SDCLK_1, 0x00020030
+
+DATA 4, MX6_IOM_DRAM_RESET, 0x00020030
+DATA 4, MX6_IOM_DRAM_SDCKE0, 0x00003000
+DATA 4, MX6_IOM_DRAM_SDCKE1, 0x00003000
+
+DATA 4, MX6_IOM_DRAM_SDBA2, 0x00000000
+
+DATA 4, MX6_IOM_DRAM_SDODT0, 0x00003030
+DATA 4, MX6_IOM_DRAM_SDODT1, 0x00003030
+
+DATA 4, MX6_IOM_GRP_B0DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B1DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B2DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B3DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B4DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B5DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B6DS, 0x00000030
+DATA 4, MX6_IOM_GRP_B7DS, 0x00000030
+DATA 4, MX6_IOM_GRP_ADDDS, 0x00000030
+
+/* (differential input) */
+DATA 4, MX6_IOM_DDRMODE_CTL, 0x00020000
+/* disable ddr pullups */
+DATA 4, MX6_IOM_GRP_DDRPKE, 0x00000000
+/* (differential input) */
+DATA 4, MX6_IOM_GRP_DDRMODE, 0x00020000
+/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
+DATA 4, MX6_IOM_GRP_CTLDS, 0x00000030
+/* 40 Ohm drive strength for cs0/1,sdba2,cke0/1,sdwe */
+DATA 4, MX6_IOM_GRP_DDR_TYPE, 0x000C0000
+
+/* Read data DQ Byte0-3 delay */
+DATA 4, MX6_MMDC_P0_MPRDDQBY0DL, 0x33333333
+DATA 4, MX6_MMDC_P0_MPRDDQBY1DL, 0x33333333
+DATA 4, MX6_MMDC_P0_MPRDDQBY2DL, 0x33333333
+DATA 4, MX6_MMDC_P0_MPRDDQBY3DL, 0x33333333
+DATA 4, MX6_MMDC_P1_MPRDDQBY0DL, 0x33333333
+DATA 4, MX6_MMDC_P1_MPRDDQBY1DL, 0x33333333
+DATA 4, MX6_MMDC_P1_MPRDDQBY2DL, 0x33333333
+DATA 4, MX6_MMDC_P1_MPRDDQBY3DL, 0x33333333
+
+/*
+ * MDMISC      mirroring       interleaved (row/bank/col)
+ */
+DATA 4, MX6_MMDC_P0_MDMISC, 0x00081740
+
+DATA 4, MX6_MMDC_P0_MDSCR, 0x00008000
+DATA 4, MX6_MMDC_P0_MDCFG0, 0x555A7975
+DATA 4, MX6_MMDC_P0_MDCFG1, 0xFF538E64
+DATA 4, MX6_MMDC_P0_MDCFG2, 0x01FF00DB
+DATA 4, MX6_MMDC_P0_MDRWD, 0x000026D2
+DATA 4, MX6_MMDC_P0_MDOR, 0x005B0E21
+DATA 4, MX6_MMDC_P0_MDOTC, 0x09444040
+DATA 4, MX6_MMDC_P0_MDPDC, 0x00025576
+DATA 4, MX6_MMDC_P0_MDASP, 0x00000017
+DATA 4, MX6_MMDC_P0_MDCTL, 0x83190000
+DATA 4, MX6_MMDC_P0_MDSCR, 0x04088032
+DATA 4, MX6_MMDC_P0_MDSCR, 0x0408803A
+DATA 4, MX6_MMDC_P0_MDSCR, 0x00008033
+DATA 4, MX6_MMDC_P0_MDSCR, 0x0000803B
+DATA 4, MX6_MMDC_P0_MDSCR, 0x00428031
+DATA 4, MX6_MMDC_P0_MDSCR, 0x00428039
+DATA 4, MX6_MMDC_P0_MDSCR, 0x09408030
+DATA 4, MX6_MMDC_P0_MDSCR, 0x09408038
+DATA 4, MX6_MMDC_P0_MDSCR, 0x04008040
+DATA 4, MX6_MMDC_P0_MDSCR, 0x04008048
+DATA 4, MX6_MMDC_P0_MPZQHWCTRL, 0xA1380003
+DATA 4, MX6_MMDC_P1_MPZQHWCTRL, 0xA1380003
+DATA 4, MX6_MMDC_P0_MDREF, 0x00005800
+DATA 4, MX6_MMDC_P0_MPODTCTRL, 0x00022227
+DATA 4, MX6_MMDC_P1_MPODTCTRL, 0x00022227
+DATA 4, MX6_MMDC_P0_MPDGCTRL0, 0x434B0350
+DATA 4, MX6_MMDC_P0_MPDGCTRL1, 0x034C0359
+DATA 4, MX6_MMDC_P1_MPDGCTRL0, 0x434B0350
+DATA 4, MX6_MMDC_P1_MPDGCTRL1, 0x03650348
+DATA 4, MX6_MMDC_P0_MPRDDLCTL, 0x4436383B
+DATA 4, MX6_MMDC_P1_MPRDDLCTL, 0x39393341
+DATA 4, MX6_MMDC_P0_MPWRDLCTL, 0x35373933
+DATA 4, MX6_MMDC_P1_MPWRDLCTL, 0x48254A36
+DATA 4, MX6_MMDC_P0_MPWLDECTRL0, 0x001F001F
+DATA 4, MX6_MMDC_P0_MPWLDECTRL1, 0x001F001F
+DATA 4, MX6_MMDC_P1_MPWLDECTRL0, 0x00440044
+DATA 4, MX6_MMDC_P1_MPWLDECTRL1, 0x00440044
+DATA 4, MX6_MMDC_P0_MPMUR0, 0x00000800
+DATA 4, MX6_MMDC_P1_MPMUR0, 0x00000800
+DATA 4, MX6_MMDC_P0_MDSCR, 0x00000000
+DATA 4, MX6_MMDC_P0_MAPSR, 0x00011006
+
+/* set the default clock gate to save power */
+DATA 4, CCM_CCGR0, 0x00C03F3F
+DATA 4, CCM_CCGR1, 0x0030FC03
+DATA 4, CCM_CCGR2, 0x0FFFC000
+DATA 4, CCM_CCGR3, 0x3FF00000
+DATA 4, CCM_CCGR4, 0xFFFFF300 /* enable NAND/GPMI/BCH clocks */
+DATA 4, CCM_CCGR5, 0x0F0000C3
+DATA 4, CCM_CCGR6, 0x000003FF
+
+/* enable AXI cache for VDOA/VPU/IPU */
+DATA 4, MX6_IOMUXC_GPR4, 0xF00000CF
+/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+DATA 4, MX6_IOMUXC_GPR6, 0x007F007F
+DATA 4, MX6_IOMUXC_GPR7, 0x007F007F
diff --git a/board/freescale/titanium/titanium.c b/board/freescale/titanium/titanium.c
new file mode 100644 (file)
index 0000000..5250522
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2013 Stefan Roese <sr@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.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6q_pins.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/mxc_i2c.h>
+#include <asm/imx-common/boot_mode.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <micrel.h>
+#include <miiphy.h>
+#include <netdev.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |      \
+                       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |      \
+                       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED          |     \
+                       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+
+#define I2C_PAD_CTRL   (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |      \
+                        PAD_CTL_DSE_40ohm | PAD_CTL_HYS |              \
+                        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+iomux_v3_cfg_t const uart1_pads[] = {
+       MX6_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const uart2_pads[] = {
+       MX6_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const uart4_pads[] = {
+       MX6_PAD_CSI0_DAT12__UART4_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_CSI0_DAT13__UART4_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
+
+struct i2c_pads_info i2c_pad_info0 = {
+       .scl = {
+               .i2c_mode  = MX6_PAD_CSI0_DAT9__I2C1_SCL | PC,
+               .gpio_mode = MX6_PAD_CSI0_DAT9__GPIO_5_27 | PC,
+               .gp = IMX_GPIO_NR(5, 27)
+       },
+       .sda = {
+                .i2c_mode = MX6_PAD_CSI0_DAT8__I2C1_SDA | PC,
+                .gpio_mode = MX6_PAD_CSI0_DAT8__GPIO_5_26 | PC,
+                .gp = IMX_GPIO_NR(5, 26)
+        }
+};
+
+struct i2c_pads_info i2c_pad_info2 = {
+       .scl = {
+               .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
+               .gpio_mode = MX6_PAD_GPIO_3__GPIO_1_3 | PC,
+               .gp = IMX_GPIO_NR(1, 3)
+       },
+       .sda = {
+                .i2c_mode = MX6_PAD_GPIO_16__I2C3_SDA | PC,
+                .gpio_mode = MX6_PAD_GPIO_16__GPIO_7_11 | PC,
+                .gp = IMX_GPIO_NR(7, 11)
+        }
+};
+
+iomux_v3_cfg_t const usdhc3_pads[] = {
+       MX6_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+};
+
+iomux_v3_cfg_t const enet_pads1[] = {
+       MX6_PAD_ENET_MDIO__ENET_MDIO            | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_ENET_MDC__ENET_MDC              | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TXC__ENET_RGMII_TXC       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TD0__ENET_RGMII_TD0       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TD1__ENET_RGMII_TD1       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TD2__ENET_RGMII_TD2       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TD3__ENET_RGMII_TD3       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_ENET_REF_CLK__ENET_TX_CLK       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       /* pin 35 - 1 (PHY_AD2) on reset */
+       MX6_PAD_RGMII_RXC__GPIO_6_30            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 32 - 1 - (MODE0) all */
+       MX6_PAD_RGMII_RD0__GPIO_6_25            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 31 - 1 - (MODE1) all */
+       MX6_PAD_RGMII_RD1__GPIO_6_27            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 28 - 1 - (MODE2) all */
+       MX6_PAD_RGMII_RD2__GPIO_6_28            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 27 - 1 - (MODE3) all */
+       MX6_PAD_RGMII_RD3__GPIO_6_29            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
+       MX6_PAD_RGMII_RX_CTL__GPIO_6_24         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       /* pin 42 PHY nRST */
+       MX6_PAD_EIM_D23__GPIO_3_23              | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const enet_pads2[] = {
+       MX6_PAD_RGMII_RXC__ENET_RGMII_RXC       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_RD0__ENET_RGMII_RD0       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_RD1__ENET_RGMII_RD1       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_RD2__ENET_RGMII_RD2       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_RD3__ENET_RGMII_RD3       | MUX_PAD_CTRL(ENET_PAD_CTRL),
+       MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL      | MUX_PAD_CTRL(ENET_PAD_CTRL),
+};
+
+iomux_v3_cfg_t nfc_pads[] = {
+       MX6_PAD_NANDF_CLE__RAWNAND_CLE          | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_ALE__RAWNAND_ALE          | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_WP_B__RAWNAND_RESETN      | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_RB0__RAWNAND_READY0       | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_CS0__RAWNAND_CE0N         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_CS1__RAWNAND_CE1N         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_CS2__RAWNAND_CE2N         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_CS3__RAWNAND_CE3N         | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_SD4_CMD__RAWNAND_RDN            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_SD4_CLK__RAWNAND_WRN            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D0__RAWNAND_D0            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D1__RAWNAND_D1            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D2__RAWNAND_D2            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D3__RAWNAND_D3            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D4__RAWNAND_D4            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D5__RAWNAND_D5            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D6__RAWNAND_D6            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_NANDF_D7__RAWNAND_D7            | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_SD4_DAT0__RAWNAND_DQS           | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_gpmi_nand(void)
+{
+       struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+
+       /* config gpmi nand iomux */
+       imx_iomux_v3_setup_multiple_pads(nfc_pads,
+                                        ARRAY_SIZE(nfc_pads));
+
+       /* config gpmi and bch clock to 100 MHz */
+       clrsetbits_le32(&mxc_ccm->cs2cdr,
+                       MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
+                       MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
+                       MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
+                       MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
+                       MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
+                       MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
+
+       /* enable gpmi and bch clock gating */
+       setbits_le32(&mxc_ccm->CCGR4,
+                    MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
+                    MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
+                    MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
+                    MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
+                    MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
+
+       /* enable apbh clock gating */
+       setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
+}
+
+static void setup_iomux_enet(void)
+{
+       gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
+       gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
+       gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
+       gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
+       gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
+       gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
+       imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
+       gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
+
+       /* Need delay 10ms according to KSZ9021 spec */
+       udelay(1000 * 10);
+       gpio_set_value(IMX_GPIO_NR(3, 23), 1);
+
+       imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
+}
+
+static void setup_iomux_uart(void)
+{
+       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+       imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
+       imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
+}
+
+#ifdef CONFIG_USB_EHCI_MX6
+int board_ehci_hcd_init(int port)
+{
+       return 0;
+}
+
+#endif
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg usdhc_cfg[1] = {
+       { USDHC3_BASE_ADDR },
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+
+       if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
+               gpio_direction_input(IMX_GPIO_NR(7, 0));
+               return !gpio_get_value(IMX_GPIO_NR(7, 0));
+       }
+
+       return 0;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       /*
+        * Only one USDHC controller on titianium
+        */
+       imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
+       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+
+       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
+#endif
+
+int board_phy_config(struct phy_device *phydev)
+{
+       /* min rx data delay */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
+       /* min tx data delay */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
+       /* max rx/tx clock delay, min rx/tx control */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
+       if (phydev->drv->config)
+               phydev->drv->config(phydev);
+
+       return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       int ret;
+
+       setup_iomux_enet();
+
+       ret = cpu_eth_init(bis);
+       if (ret)
+               printf("FEC MXC: %s:failed\n", __func__);
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       setup_iomux_uart();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
+       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
+
+       setup_gpmi_nand();
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: Titanium\n");
+
+       return 0;
+}
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+       /* NAND */
+       { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
+       /* 4 bit bus width */
+       { "mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00) },
+       { "mmc1", MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00) },
+       { NULL, 0 },
+};
+#endif
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_CMD_BMODE
+       add_board_boot_modes(board_boot_modes);
+#endif
+
+       return 0;
+}
diff --git a/board/freescale/vf610twr/Makefile b/board/freescale/vf610twr/Makefile
new file mode 100644 (file)
index 0000000..7416228
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright 2013 Freescale Semiconductor, Inc.
+#
+# 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  := $(BOARD).o
+
+SRCS   := $(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/freescale/vf610twr/imximage.cfg b/board/freescale/vf610twr/imximage.cfg
new file mode 100644 (file)
index 0000000..b00d4c1
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013 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. 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
+ */
+#include <asm/imx-common/imximage.cfg>
+
+/* image version */
+IMAGE_VERSION  2
+
+/* Boot Offset 0x400, valid for both SD and NAND boot */
+BOOT_OFFSET    FLASH_OFFSET_STANDARD
diff --git a/board/freescale/vf610twr/vf610twr.c b/board/freescale/vf610twr/vf610twr.c
new file mode 100644 (file)
index 0000000..f14df8b
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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/imx-regs.h>
+#include <asm/arch/iomux-vf610.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/clock.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <miiphy.h>
+#include <netdev.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
+                       PAD_CTL_DSE_25ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+#define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
+                       PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
+                       PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+void setup_iomux_ddr(void)
+{
+       static const iomux_v3_cfg_t ddr_pads[] = {
+               VF610_PAD_DDR_A15__DDR_A_15,
+               VF610_PAD_DDR_A15__DDR_A_15,
+               VF610_PAD_DDR_A14__DDR_A_14,
+               VF610_PAD_DDR_A13__DDR_A_13,
+               VF610_PAD_DDR_A12__DDR_A_12,
+               VF610_PAD_DDR_A11__DDR_A_11,
+               VF610_PAD_DDR_A10__DDR_A_10,
+               VF610_PAD_DDR_A9__DDR_A_9,
+               VF610_PAD_DDR_A8__DDR_A_8,
+               VF610_PAD_DDR_A7__DDR_A_7,
+               VF610_PAD_DDR_A6__DDR_A_6,
+               VF610_PAD_DDR_A5__DDR_A_5,
+               VF610_PAD_DDR_A4__DDR_A_4,
+               VF610_PAD_DDR_A3__DDR_A_3,
+               VF610_PAD_DDR_A2__DDR_A_2,
+               VF610_PAD_DDR_A1__DDR_A_1,
+               VF610_PAD_DDR_BA2__DDR_BA_2,
+               VF610_PAD_DDR_BA1__DDR_BA_1,
+               VF610_PAD_DDR_BA0__DDR_BA_0,
+               VF610_PAD_DDR_CAS__DDR_CAS_B,
+               VF610_PAD_DDR_CKE__DDR_CKE_0,
+               VF610_PAD_DDR_CLK__DDR_CLK_0,
+               VF610_PAD_DDR_CS__DDR_CS_B_0,
+               VF610_PAD_DDR_D15__DDR_D_15,
+               VF610_PAD_DDR_D14__DDR_D_14,
+               VF610_PAD_DDR_D13__DDR_D_13,
+               VF610_PAD_DDR_D12__DDR_D_12,
+               VF610_PAD_DDR_D11__DDR_D_11,
+               VF610_PAD_DDR_D10__DDR_D_10,
+               VF610_PAD_DDR_D9__DDR_D_9,
+               VF610_PAD_DDR_D8__DDR_D_8,
+               VF610_PAD_DDR_D7__DDR_D_7,
+               VF610_PAD_DDR_D6__DDR_D_6,
+               VF610_PAD_DDR_D5__DDR_D_5,
+               VF610_PAD_DDR_D4__DDR_D_4,
+               VF610_PAD_DDR_D3__DDR_D_3,
+               VF610_PAD_DDR_D2__DDR_D_2,
+               VF610_PAD_DDR_D1__DDR_D_1,
+               VF610_PAD_DDR_D0__DDR_D_0,
+               VF610_PAD_DDR_DQM1__DDR_DQM_1,
+               VF610_PAD_DDR_DQM0__DDR_DQM_0,
+               VF610_PAD_DDR_DQS1__DDR_DQS_1,
+               VF610_PAD_DDR_DQS0__DDR_DQS_0,
+               VF610_PAD_DDR_RAS__DDR_RAS_B,
+               VF610_PAD_DDR_WE__DDR_WE_B,
+               VF610_PAD_DDR_ODT1__DDR_ODT_0,
+               VF610_PAD_DDR_ODT0__DDR_ODT_1,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
+}
+
+void ddr_phy_init(void)
+{
+       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
+
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[48]);
+
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[33]);
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[49]);
+
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[50]);
+
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[51]);
+
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[52]);
+
+       writel(DDRMC_PHY50_DDR3_MODE | DDRMC_PHY50_EN_SW_HALF_CYCLE,
+               &ddrmr->phy[50]);
+}
+
+void ddr_ctrl_init(void)
+{
+       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
+
+       writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
+       writel(DDRMC_CR02_DRAM_TINIT(32), &ddrmr->cr[2]);
+       writel(DDRMC_CR10_TRST_PWRON(124), &ddrmr->cr[10]);
+
+       writel(DDRMC_CR11_CKE_INACTIVE(80000), &ddrmr->cr[11]);
+       writel(DDRMC_CR12_WRLAT(5) | DDRMC_CR12_CASLAT_LIN(12), &ddrmr->cr[12]);
+       writel(DDRMC_CR13_TRC(21) | DDRMC_CR13_TRRD(4) | DDRMC_CR13_TCCD(4) |
+               DDRMC_CR13_TBST_INT_INTERVAL(4), &ddrmr->cr[13]);
+       writel(DDRMC_CR14_TFAW(20) | DDRMC_CR14_TRP(6) | DDRMC_CR14_TWTR(4) |
+               DDRMC_CR14_TRAS_MIN(15), &ddrmr->cr[14]);
+       writel(DDRMC_CR16_TMRD(4) | DDRMC_CR16_TRTP(4), &ddrmr->cr[16]);
+       writel(DDRMC_CR17_TRAS_MAX(28080) | DDRMC_CR17_TMOD(12),
+               &ddrmr->cr[17]);
+       writel(DDRMC_CR18_TCKESR(4) | DDRMC_CR18_TCKE(3), &ddrmr->cr[18]);
+
+       writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
+       writel(DDRMC_CR21_TRCD_INT(6) | DDRMC_CR21_TRAS_LOCKOUT |
+               DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
+
+       writel(DDRMC_CR22_TDAL(11), &ddrmr->cr[22]);
+       writel(DDRMC_CR23_BSTLEN(3) | DDRMC_CR23_TDLL(512), &ddrmr->cr[23]);
+       writel(DDRMC_CR24_TRP_AB(6), &ddrmr->cr[24]);
+
+       writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
+       writel(DDRMC_CR26_TREF(3112) | DDRMC_CR26_TRFC(44), &ddrmr->cr[26]);
+       writel(DDRMC_CR28_TREF_INT(5), &ddrmr->cr[28]);
+       writel(DDRMC_CR29_TPDEX(3), &ddrmr->cr[29]);
+
+       writel(DDRMC_CR30_TXPDLL(10), &ddrmr->cr[30]);
+       writel(DDRMC_CR31_TXSNR(68) | DDRMC_CR31_TXSR(512), &ddrmr->cr[31]);
+       writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
+       writel(DDRMC_CR34_CKSRX(5) | DDRMC_CR34_CKSRE(5), &ddrmr->cr[34]);
+
+       writel(DDRMC_CR38_FREQ_CHG_EN, &ddrmr->cr[38]);
+       writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
+               DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
+
+       writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
+       writel(DDRMC_CR48_MR1_DA_0(70) | DDRMC_CR48_MR0_DA_0(1056),
+               &ddrmr->cr[48]);
+
+       writel(DDRMC_CR66_ZQCL(256) | DDRMC_CR66_ZQINIT(512), &ddrmr->cr[66]);
+       writel(DDRMC_CR67_ZQCS(64), &ddrmr->cr[67]);
+       writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
+
+       writel(DDRMC_CR70_REF_PER_ZQ(64), &ddrmr->cr[70]);
+       writel(DDRMC_CR72_ZQCS_ROTATE, &ddrmr->cr[72]);
+
+       writel(DDRMC_CR73_APREBIT(10) | DDRMC_CR73_COL_DIFF(1) |
+               DDRMC_CR73_ROW_DIFF(3), &ddrmr->cr[73]);
+       writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
+               DDRMC_CR74_CMD_AGE_CNT(255) | DDRMC_CR74_AGE_CNT(255),
+               &ddrmr->cr[74]);
+       writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
+               DDRMC_CR75_PLEN, &ddrmr->cr[75]);
+       writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
+               DDRMC_CR76_W2R_SPLT_EN | DDRMC_CR76_CS_EN, &ddrmr->cr[76]);
+       writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
+               DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
+       writel(DDRMC_CR78_BUR_ON_FLY_BIT(12), &ddrmr->cr[78]);
+       writel(DDRMC_CR79_CTLUPD_AREF, &ddrmr->cr[79]);
+
+       writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
+
+       writel(DDRMC_CR87_ODT_WR_MAPCS0 | DDRMC_CR87_ODT_RD_MAPCS0,
+               &ddrmr->cr[87]);
+       writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
+       writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
+
+       writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
+       writel(DDRMC_CR96_WLMRD(40) | DDRMC_CR96_WLDQSEN(25), &ddrmr->cr[96]);
+
+       writel(DDRMC_CR105_RDLVL_DL_0(32), &ddrmr->cr[105]);
+       writel(DDRMC_CR110_RDLVL_DL_1(32), &ddrmr->cr[110]);
+       writel(DDRMC_CR114_RDLVL_GTDL_2(8224), &ddrmr->cr[114]);
+
+       writel(DDRMC_CR117_AXI0_W_PRI(1) | DDRMC_CR117_AXI0_R_PRI(1),
+               &ddrmr->cr[117]);
+       writel(DDRMC_CR118_AXI1_W_PRI(1) | DDRMC_CR118_AXI1_R_PRI(1),
+               &ddrmr->cr[118]);
+
+       writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) | DDRMC_CR120_AXI0_PRI0_RPRI(2),
+               &ddrmr->cr[120]);
+       writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) | DDRMC_CR121_AXI0_PRI2_RPRI(2),
+               &ddrmr->cr[121]);
+       writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
+               DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
+       writel(DDRMC_CR123_AXI1_PRI3_RPRI(1) | DDRMC_CR123_AXI1_PRI2_RPRI(1),
+               &ddrmr->cr[123]);
+       writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
+
+       writel(DDRMC_CR126_PHY_RDLAT(11), &ddrmr->cr[126]);
+       writel(DDRMC_CR132_WRLAT_ADJ(5) | DDRMC_CR132_RDLAT_ADJ(6),
+               &ddrmr->cr[132]);
+       writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
+               DDRMC_CR139_PHY_WRLV_DLL(3) | DDRMC_CR139_PHY_WRLV_EN(3),
+               &ddrmr->cr[139]);
+
+       writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
+               DDRMC_CR154_PAD_ZQ_MODE(1), &ddrmr->cr[154]);
+       writel(DDRMC_CR155_AXI0_AWCACHE | DDRMC_CR155_PAD_ODT_BYTE1(2),
+               &ddrmr->cr[155]);
+       writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
+
+       ddr_phy_init();
+
+       writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
+
+       udelay(200);
+}
+
+int dram_init(void)
+{
+       setup_iomux_ddr();
+
+       ddr_ctrl_init();
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+static void setup_iomux_uart(void)
+{
+       static const iomux_v3_cfg_t uart1_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+}
+
+static void setup_iomux_enet(void)
+{
+       static const iomux_v3_cfg_t enet0_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKIN, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC1__RMII0_MDIO, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC0__RMII0_MDC, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC2__RMII0_CRS_DV, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC3__RMII0_RD1, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC4__RMII0_RD0, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC5__RMII0_RXER, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC6__RMII0_TD1, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC7__RMII0_TD0, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC8__RMII0_TXEN, ENET_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg esdhc_cfg[1] = {
+       {ESDHC1_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       /* eSDHC1 is always present */
+       return 1;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       static const iomux_v3_cfg_t esdhc1_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
+       };
+
+       esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+
+       imx_iomux_v3_setup_multiple_pads(
+               esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
+
+       return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
+}
+#endif
+
+static void clock_init(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       struct anadig_reg *anadig = (struct anadig_reg *)ANADIG_BASE_ADDR;
+
+       clrsetbits_le32(&ccm->ccgr0, CCM_REG_CTRL_MASK,
+               CCM_CCGR0_UART1_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr1, CCM_REG_CTRL_MASK,
+               CCM_CCGR1_PIT_CTRL_MASK | CCM_CCGR1_WDOGA5_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr2, CCM_REG_CTRL_MASK,
+               CCM_CCGR2_IOMUXC_CTRL_MASK | CCM_CCGR2_PORTA_CTRL_MASK |
+               CCM_CCGR2_PORTB_CTRL_MASK | CCM_CCGR2_PORTC_CTRL_MASK |
+               CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
+               CCM_CCGR3_ANADIG_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
+               CCM_CCGR4_WKUP_CTRL_MASK | CCM_CCGR4_CCM_CTRL_MASK |
+               CCM_CCGR4_GPC_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr6, CCM_REG_CTRL_MASK,
+               CCM_CCGR6_OCOTP_CTRL_MASK | CCM_CCGR6_DDRMC_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr7, CCM_REG_CTRL_MASK,
+               CCM_CCGR7_SDHC1_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr9, CCM_REG_CTRL_MASK,
+               CCM_CCGR9_FEC0_CTRL_MASK | CCM_CCGR9_FEC1_CTRL_MASK);
+
+       clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL2_CTRL_POWERDOWN,
+               ANADIG_PLL2_CTRL_ENABLE | ANADIG_PLL2_CTRL_DIV_SELECT);
+       clrsetbits_le32(&anadig->pll1_ctrl, ANADIG_PLL1_CTRL_POWERDOWN,
+               ANADIG_PLL1_CTRL_ENABLE | ANADIG_PLL1_CTRL_DIV_SELECT);
+
+       clrsetbits_le32(&ccm->ccr, CCM_CCR_OSCNT_MASK,
+               CCM_CCR_FIRC_EN | CCM_CCR_OSCNT(5));
+       clrsetbits_le32(&ccm->ccsr, CCM_REG_CTRL_MASK,
+               CCM_CCSR_PLL1_PFD_CLK_SEL(3) | CCM_CCSR_PLL2_PFD4_EN |
+               CCM_CCSR_PLL2_PFD3_EN | CCM_CCSR_PLL2_PFD2_EN |
+               CCM_CCSR_PLL2_PFD1_EN | CCM_CCSR_PLL1_PFD4_EN |
+               CCM_CCSR_PLL1_PFD3_EN | CCM_CCSR_PLL1_PFD2_EN |
+               CCM_CCSR_PLL1_PFD1_EN | CCM_CCSR_DDRC_CLK_SEL(1) |
+               CCM_CCSR_FAST_CLK_SEL(1) | CCM_CCSR_SYS_CLK_SEL(4));
+       clrsetbits_le32(&ccm->cacrr, CCM_REG_CTRL_MASK,
+               CCM_CACRR_IPG_CLK_DIV(1) | CCM_CACRR_BUS_CLK_DIV(2) |
+               CCM_CACRR_ARM_CLK_DIV(0));
+       clrsetbits_le32(&ccm->cscmr1, CCM_REG_CTRL_MASK,
+               CCM_CSCMR1_ESDHC1_CLK_SEL(3));
+       clrsetbits_le32(&ccm->cscdr1, CCM_REG_CTRL_MASK,
+               CCM_CSCDR1_RMII_CLK_EN);
+       clrsetbits_le32(&ccm->cscdr2, CCM_REG_CTRL_MASK,
+               CCM_CSCDR2_ESDHC1_EN | CCM_CSCDR2_ESDHC1_CLK_DIV(0));
+       clrsetbits_le32(&ccm->cscmr2, CCM_REG_CTRL_MASK,
+               CCM_CSCMR2_RMII_CLK_SEL(0));
+}
+
+static void mscm_init(void)
+{
+       struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_IR_BASE_ADDR;
+       int i;
+
+       for (i = 0; i < MSCM_IRSPRC_NUM; i++)
+               writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+       if (phydev->drv->config)
+               phydev->drv->config(phydev);
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       clock_init();
+       mscm_init();
+
+       setup_iomux_uart();
+       setup_iomux_enet();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: vf610twr\n");
+
+       return 0;
+}
index cf020c35cb6341ee7dea68b4d65a3c8f37df6f4c..cabad70af4bad511db88b3863e54c952a1eceafe 100644 (file)
@@ -26,8 +26,7 @@
 #include <usb.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/mx5x_pins.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx51.h>
 #include <asm/gpio.h>
 #include <usb/ehci-fsl.h>
 #include <usb/ulpi.h>
 
 #include "../../../drivers/usb/host/ehci.h"
 
-/* USB pin configuration */
-#define USB_PAD_CONFIG (PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST | \
-                       PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | \
-                       PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL)
-
 /*
  * Configure the USB H1 and USB H2 IOMUX
  */
 void setup_iomux_usb(void)
 {
-       setup_iomux_usb_h1();
-
-       if (machine_is_efikasb())
-               setup_iomux_usb_h2();
-
-       /* USB PHY reset */
-       mxc_request_iomux(MX51_PIN_EIM_D27, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D27, PAD_CTL_PKE_ENABLE |
-                       PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH);
-
-       /* USB HUB reset */
-       mxc_request_iomux(MX51_PIN_GPIO1_5, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_5, PAD_CTL_PKE_ENABLE |
-                       PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH);
-
-       /* WIFI EN (act low) */
-       mxc_request_iomux(MX51_PIN_EIM_A22, IOMUX_CONFIG_GPIO);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A22, 0);
-       /* WIFI RESET */
-       mxc_request_iomux(MX51_PIN_EIM_A16, IOMUX_CONFIG_GPIO);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A16, 0);
-       /* BT EN (act low) */
-       mxc_request_iomux(MX51_PIN_EIM_A17, IOMUX_CONFIG_GPIO);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A17, 0);
+       static const iomux_v3_cfg_t usb_h1_pads[] = {
+               MX51_PAD_USBH1_CLK__USBH1_CLK,
+               MX51_PAD_USBH1_DIR__USBH1_DIR,
+               MX51_PAD_USBH1_STP__USBH1_STP,
+               MX51_PAD_USBH1_NXT__USBH1_NXT,
+               MX51_PAD_USBH1_DATA0__USBH1_DATA0,
+               MX51_PAD_USBH1_DATA1__USBH1_DATA1,
+               MX51_PAD_USBH1_DATA2__USBH1_DATA2,
+               MX51_PAD_USBH1_DATA3__USBH1_DATA3,
+               MX51_PAD_USBH1_DATA4__USBH1_DATA4,
+               MX51_PAD_USBH1_DATA5__USBH1_DATA5,
+               MX51_PAD_USBH1_DATA6__USBH1_DATA6,
+               MX51_PAD_USBH1_DATA7__USBH1_DATA7,
+       };
+
+       static const iomux_v3_cfg_t usb_pads[] = {
+               MX51_PAD_EIM_D27__GPIO2_9, /* USB PHY reset */
+               MX51_PAD_GPIO1_5__GPIO1_5, /* USB HUB reset */
+               NEW_PAD_CTRL(MX51_PAD_EIM_A22__GPIO2_16, 0), /* WIFI /EN */
+               NEW_PAD_CTRL(MX51_PAD_EIM_A16__GPIO2_10, 0), /* WIFI RESET */
+               NEW_PAD_CTRL(MX51_PAD_EIM_A17__GPIO2_11, 0), /* BT /EN */
+       };
+
+       imx_iomux_v3_setup_multiple_pads(usb_h1_pads, ARRAY_SIZE(usb_h1_pads));
+
+       if (machine_is_efikasb()) {
+               static const iomux_v3_cfg_t usb_h2_pads[] = {
+                       MX51_PAD_EIM_A24__USBH2_CLK,
+                       MX51_PAD_EIM_A25__USBH2_DIR,
+                       MX51_PAD_EIM_A26__USBH2_STP,
+                       MX51_PAD_EIM_A27__USBH2_NXT,
+                       MX51_PAD_EIM_D16__USBH2_DATA0,
+                       MX51_PAD_EIM_D17__USBH2_DATA1,
+                       MX51_PAD_EIM_D18__USBH2_DATA2,
+                       MX51_PAD_EIM_D19__USBH2_DATA3,
+                       MX51_PAD_EIM_D20__USBH2_DATA4,
+                       MX51_PAD_EIM_D21__USBH2_DATA5,
+                       MX51_PAD_EIM_D22__USBH2_DATA6,
+                       MX51_PAD_EIM_D23__USBH2_DATA7,
+               };
+
+               imx_iomux_v3_setup_multiple_pads(usb_h2_pads,
+                                                ARRAY_SIZE(usb_h2_pads));
+       }
+
+       imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
 }
 
 /*
@@ -77,18 +93,18 @@ void setup_iomux_usb(void)
 static void efika_usb_enable_devices(void)
 {
        /* Enable Bluetooth */
-       gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A17), 0);
+       gpio_direction_output(IMX_GPIO_NR(2, 11), 0);
        udelay(10000);
-       gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A17), 1);
+       gpio_set_value(IMX_GPIO_NR(2, 11), 1);
 
        /* Enable WiFi */
-       gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A22), 1);
+       gpio_direction_output(IMX_GPIO_NR(2, 16), 1);
        udelay(10000);
 
        /* Reset the WiFi chip */
-       gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A16), 0);
+       gpio_direction_output(IMX_GPIO_NR(2, 10), 0);
        udelay(10000);
-       gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A16), 1);
+       gpio_set_value(IMX_GPIO_NR(2, 10), 1);
 }
 
 /*
@@ -97,11 +113,11 @@ static void efika_usb_enable_devices(void)
 static void efika_usb_hub_reset(void)
 {
        /* HUB reset */
-       gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 1);
+       gpio_direction_output(IMX_GPIO_NR(1, 5), 1);
        udelay(1000);
-       gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 0);
+       gpio_set_value(IMX_GPIO_NR(1, 5), 0);
        udelay(1000);
-       gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 1);
+       gpio_set_value(IMX_GPIO_NR(1, 5), 1);
 }
 
 /*
@@ -110,28 +126,26 @@ static void efika_usb_hub_reset(void)
 static void efika_usb_phy_reset(void)
 {
        /* SMSC 3317 PHY reset */
-       gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_D27), 0);
+       gpio_direction_output(IMX_GPIO_NR(2, 9), 0);
        udelay(1000);
-       gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_D27), 1);
+       gpio_set_value(IMX_GPIO_NR(2, 9), 1);
 }
 
 static void efika_ehci_init(struct usb_ehci *ehci, uint32_t stp_gpio,
-                               uint32_t alt0, uint32_t alt1)
+                               iomux_v3_cfg_t stp_pad_gpio,
+                               iomux_v3_cfg_t stp_pad_usb)
 {
        int ret;
        struct ulpi_regs *ulpi = (struct ulpi_regs *)0;
        struct ulpi_viewport ulpi_vp;
 
-       mxc_request_iomux(stp_gpio, alt0);
-       mxc_iomux_set_pad(stp_gpio, PAD_CTL_DRV_HIGH |
-                               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       gpio_direction_output(IOMUX_TO_GPIO(stp_gpio), 0);
+       imx_iomux_v3_setup_pad(stp_pad_gpio);
+       gpio_direction_output(stp_gpio, 0);
        udelay(1000);
-       gpio_set_value(IOMUX_TO_GPIO(stp_gpio), 1);
+       gpio_set_value(stp_gpio, 1);
        udelay(1000);
 
-       mxc_request_iomux(stp_gpio, alt1);
-       mxc_iomux_set_pad(stp_gpio, USB_PAD_CONFIG);
+       imx_iomux_v3_setup_pad(stp_pad_usb);
        udelay(10000);
 
        ulpi_vp.viewport_addr = (u32)&ehci->ulpi_viewpoint;
@@ -204,11 +218,13 @@ void board_ehci_hcd_postinit(struct usb_ehci *ehci, int port)
                tmp = (tmp & ~0x3) | 0x01;
                writel(tmp, OTG_BASE_ADDR + 0x80c);
        } else if (port == 1) {
-               efika_ehci_init(ehci, MX51_PIN_USBH1_STP,
-                               IOMUX_CONFIG_ALT2, IOMUX_CONFIG_ALT0);
+               efika_ehci_init(ehci, IMX_GPIO_NR(1, 27),
+                               MX51_PAD_USBH1_STP__GPIO1_27,
+                               MX51_PAD_USBH1_STP__USBH1_STP);
        } else if ((port == 2) && machine_is_efikasb()) {
-               efika_ehci_init(ehci, MX51_PIN_EIM_A26,
-                               IOMUX_CONFIG_ALT1, IOMUX_CONFIG_ALT2);
+               efika_ehci_init(ehci, IMX_GPIO_NR(2, 20),
+                               MX51_PAD_EIM_A26__GPIO2_20,
+                               MX51_PAD_EIM_A26__USBH2_STP);
        }
 
        if (port)
index 69d41db530d0ce5b9a5244adfd64dacc798dc6c2..13582a24e0f1fa5bf9e3953ee5a6dd421d48b7d7 100644 (file)
@@ -293,7 +293,7 @@ static iomux_v3_cfg_t const efikamx_sdhc1_pads[] = {
 
 static iomux_v3_cfg_t const efikamx_sdhc1_cd_pads[] = {
        MX51_PAD_GPIO1_0__SD1_CD,
-       MX51_PAD_EIM_CS2__SD1_CD,
+       NEW_PAD_CTRL(MX51_PAD_EIM_CS2__GPIO2_27, MX51_ESDHC_PAD_CTRL),
 };
 
 #define EFIKAMX_SDHC1_CD       IMX_GPIO_NR(1, 0)
index 720b06e4ce8f91c4e820af304cdd1f04faecb384..738e480a45448ab877d05952f3a76f9b60c83423 100644 (file)
@@ -32,6 +32,15 @@ int board_eth_init(bd_t *bis)
        return 0;
 }
 
+void reset_cpu(ulong ignore)
+{
+       /* Enable VLIO interface on Hamcop */
+       writeb(0x1, 0x4000);
+
+       /* Reset board (cold reset) */
+       writeb(0xff, 0x4002);
+}
+
 int board_init(void)
 {
        /* We have RAM, disable cache */
index 923461a3902382dbad6e757f441a9fc1c1a6e25e..7f0330dc038139914a92e0ba1b15fd360b903d54 100644 (file)
@@ -28,7 +28,7 @@
 #include <asm/gpio.h>
 #include <asm/omap_gpio.h>
 #include <asm/arch/dss.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include "errno.h"
 #include <i2c.h>
 #ifdef CONFIG_USB_EHCI
diff --git a/board/icpdas/lp8x4x/Makefile b/board/icpdas/lp8x4x/Makefile
new file mode 100644 (file)
index 0000000..cbe6aa9
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# ICPDAS LP-8x4x Support
+#
+# Copyright (C) 2013 Sergey Yanovich <ynvich@gmail.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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := lp8x4x.o
+
+SRCS   := $(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/icpdas/lp8x4x/lp8x4x.c b/board/icpdas/lp8x4x/lp8x4x.c
new file mode 100644 (file)
index 0000000..76f0700
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * ICP DAS LP-8x4x Support
+ *
+ * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
+ * adapted from Voipac PXA270 Support by
+ * Copyright (C) 2013 Sergey Yanovich <ynvich@gmail.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/hardware.h>
+#include <asm/arch/regs-mmc.h>
+#include <asm/arch/pxa.h>
+#include <netdev.h>
+#include <serial.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+int board_init(void)
+{
+       /* We have RAM, disable cache */
+       dcache_disable();
+       icache_disable();
+
+       /* memory and cpu-speed are setup before relocation */
+       /* so we do _nothing_ here */
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = 0xa0000100;
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       pxa2xx_dram_init();
+       gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
+       return 0;
+}
+
+void dram_init_banksize(void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+}
+
+#ifdef CONFIG_CMD_MMC
+int board_mmc_init(bd_t *bis)
+{
+       pxa_mmc_register(0);
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_CMD_USB
+int usb_board_init(void)
+{
+       writel((UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
+               ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
+               UHCHR);
+
+       writel(readl(UHCHR) | UHCHR_FSBIR, UHCHR);
+
+       while (readl(UHCHR) & UHCHR_FSBIR)
+               continue; /* required by checkpath.pl */
+
+       writel(readl(UHCHR) & ~UHCHR_SSE, UHCHR);
+       writel((UHCHIE_UPRIE | UHCHIE_RWIE), UHCHIE);
+
+       /* Clear any OTG Pin Hold */
+       if (readl(PSSR) & PSSR_OTGPH)
+               writel(readl(PSSR) | PSSR_OTGPH, PSSR);
+
+       writel(readl(UHCRHDA) & ~(0x200), UHCRHDA);
+       writel(readl(UHCRHDA) | 0x100, UHCRHDA);
+
+       /* Set port power control mask bits, only 3 ports. */
+       writel(readl(UHCRHDB) | (0x7<<17), UHCRHDB);
+
+       /* enable port 2 */
+       writel(readl(UP2OCR) | UP2OCR_HXOE | UP2OCR_HXS |
+               UP2OCR_DMPDE | UP2OCR_DPPDE, UP2OCR);
+
+       return 0;
+}
+
+void usb_board_init_fail(void)
+{
+       return;
+}
+
+void usb_board_stop(void)
+{
+       writel(readl(UHCHR) | UHCHR_FHR, UHCHR);
+       udelay(11);
+       writel(readl(UHCHR) & ~UHCHR_FHR, UHCHR);
+
+       writel(readl(UHCCOMS) | 1, UHCCOMS);
+       udelay(10);
+
+       writel(readl(CKEN) & ~CKEN10_USBHOST, CKEN);
+
+       return;
+}
+#endif
+
+#ifdef CONFIG_DRIVER_DM9000
+void lp8x4x_eth1_mac_init(void)
+{
+       u8 eth1addr[8];
+       int i;
+       u8 reg;
+
+       eth_getenv_enetaddr_by_index("eth", 1, eth1addr);
+       if (!is_valid_ether_addr(eth1addr))
+               return;
+
+       for (i = 0, reg = 0x10; i < 6; i++, reg++) {
+               writeb(reg, (u8 *)(DM9000_IO_2));
+               writeb(eth1addr[i], (u8 *)(DM9000_DATA_2));
+       }
+}
+
+int board_eth_init(bd_t *bis)
+{
+       lp8x4x_eth1_mac_init();
+       return dm9000_initialize(bis);
+}
+#endif
diff --git a/board/isee/igep0033/Makefile b/board/isee/igep0033/Makefile
new file mode 100644 (file)
index 0000000..54a4b75
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# Makefile
+#
+# Copyright (C) 2013, ISEE 2007 SL - http://www.isee.biz/
+#
+# 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 "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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+ifdef CONFIG_SPL_BUILD
+COBJS  := mux.o
+endif
+
+COBJS  += board.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))
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak $(obj).depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/isee/igep0033/board.c b/board/isee/igep0033/board.c
new file mode 100644 (file)
index 0000000..826cead
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Board functions for IGEP COM AQUILA/CYGNUS based boards
+ *
+ * Copyright (C) 2013, ISEE 2007 SL - http://www.isee.biz/
+ *
+ * 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 <errno.h>
+#include <spl.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/omap.h>
+#include <asm/arch/ddr_defs.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/mmc_host_def.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/io.h>
+#include <asm/emif.h>
+#include <asm/gpio.h>
+#include <i2c.h>
+#include <miiphy.h>
+#include <cpsw.h>
+#include "board.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
+#ifdef CONFIG_SPL_BUILD
+static struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
+#endif
+
+/* MII mode defines */
+#define RMII_MODE_ENABLE       0x4D
+
+static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
+
+/* UART Defines */
+#ifdef CONFIG_SPL_BUILD
+#define UART_RESET             (0x1 << 1)
+#define UART_CLK_RUNNING_MASK  0x1
+#define UART_SMART_IDLE_EN     (0x1 << 0x3)
+
+static void rtc32k_enable(void)
+{
+       struct rtc_regs *rtc = (struct rtc_regs *)RTC_BASE;
+
+       /*
+        * Unlock the RTC's registers.  For more details please see the
+        * RTC_SS section of the TRM.  In order to unlock we need to
+        * write these specific values (keys) in this order.
+        */
+       writel(0x83e70b13, &rtc->kick0r);
+       writel(0x95a4f1e0, &rtc->kick1r);
+
+       /* Enable the RTC 32K OSC by setting bits 3 and 6. */
+       writel((1 << 3) | (1 << 6), &rtc->osc);
+}
+
+static const struct ddr_data ddr3_data = {
+       .datardsratio0 = K4B2G1646EBIH9_RD_DQS,
+       .datawdsratio0 = K4B2G1646EBIH9_WR_DQS,
+       .datafwsratio0 = K4B2G1646EBIH9_PHY_FIFO_WE,
+       .datawrsratio0 = K4B2G1646EBIH9_PHY_WR_DATA,
+       .datadldiff0 = PHY_DLL_LOCK_DIFF,
+};
+
+static const struct cmd_control ddr3_cmd_ctrl_data = {
+       .cmd0csratio = K4B2G1646EBIH9_RATIO,
+       .cmd0dldiff = K4B2G1646EBIH9_DLL_LOCK_DIFF,
+       .cmd0iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
+
+       .cmd1csratio = K4B2G1646EBIH9_RATIO,
+       .cmd1dldiff = K4B2G1646EBIH9_DLL_LOCK_DIFF,
+       .cmd1iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
+
+       .cmd2csratio = K4B2G1646EBIH9_RATIO,
+       .cmd2dldiff = K4B2G1646EBIH9_DLL_LOCK_DIFF,
+       .cmd2iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
+};
+
+static struct emif_regs ddr3_emif_reg_data = {
+       .sdram_config = K4B2G1646EBIH9_EMIF_SDCFG,
+       .ref_ctrl = K4B2G1646EBIH9_EMIF_SDREF,
+       .sdram_tim1 = K4B2G1646EBIH9_EMIF_TIM1,
+       .sdram_tim2 = K4B2G1646EBIH9_EMIF_TIM2,
+       .sdram_tim3 = K4B2G1646EBIH9_EMIF_TIM3,
+       .zq_config = K4B2G1646EBIH9_ZQ_CFG,
+       .emif_ddr_phy_ctlr_1 = K4B2G1646EBIH9_EMIF_READ_LATENCY,
+};
+#endif
+
+/*
+ * Early system init of muxing and clocks.
+ */
+void s_init(void)
+{
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+#ifdef CONFIG_SPL_BUILD
+       save_omap_boot_params();
+#endif
+
+       /* WDT1 is already running when the bootloader gets control
+        * Disable it to avoid "random" resets
+        */
+       writel(0xAAAA, &wdtimer->wdtwspr);
+       while (readl(&wdtimer->wdtwwps) != 0x0)
+               ;
+       writel(0x5555, &wdtimer->wdtwspr);
+       while (readl(&wdtimer->wdtwwps) != 0x0)
+               ;
+
+#ifdef CONFIG_SPL_BUILD
+       /* Setup the PLLs and the clocks for the peripherals */
+       pll_init();
+
+       /* Enable RTC32K clock */
+       rtc32k_enable();
+
+       /* UART softreset */
+       u32 regval;
+
+       enable_uart0_pin_mux();
+
+       regval = readl(&uart_base->uartsyscfg);
+       regval |= UART_RESET;
+       writel(regval, &uart_base->uartsyscfg);
+       while ((readl(&uart_base->uartsyssts) &
+               UART_CLK_RUNNING_MASK) != UART_CLK_RUNNING_MASK)
+               ;
+
+       /* Disable smart idle */
+       regval = readl(&uart_base->uartsyscfg);
+       regval |= UART_SMART_IDLE_EN;
+       writel(regval, &uart_base->uartsyscfg);
+
+       gd = &gdata;
+
+       preloader_console_init();
+
+       /* Configure board pin mux */
+       enable_board_pin_mux();
+
+       config_ddr(303, K4B2G1646EBIH9_IOCTRL_VALUE, &ddr3_data,
+                  &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
+#endif
+}
+
+/*
+ * Basic board specific setup.  Pinmux has been handled already.
+ */
+int board_init(void)
+{
+       gd->bd->bi_boot_params = PHYS_DRAM_1 + 0x100;
+
+       gpmc_init();
+
+       return 0;
+}
+
+#if defined(CONFIG_DRIVER_TI_CPSW)
+static void cpsw_control(int enabled)
+{
+       /* VTP can be added here */
+
+       return;
+}
+
+static struct cpsw_slave_data cpsw_slaves[] = {
+       {
+               .slave_reg_ofs  = 0x208,
+               .sliver_reg_ofs = 0xd80,
+               .phy_id         = 0,
+               .phy_if         = PHY_INTERFACE_MODE_RMII,
+       },
+};
+
+static struct cpsw_platform_data cpsw_data = {
+       .mdio_base              = CPSW_MDIO_BASE,
+       .cpsw_base              = CPSW_BASE,
+       .mdio_div               = 0xff,
+       .channels               = 8,
+       .cpdma_reg_ofs          = 0x800,
+       .slaves                 = 1,
+       .slave_data             = cpsw_slaves,
+       .ale_reg_ofs            = 0xd00,
+       .ale_entries            = 1024,
+       .host_port_reg_ofs      = 0x108,
+       .hw_stats_reg_ofs       = 0x900,
+       .mac_control            = (1 << 5),
+       .control                = cpsw_control,
+       .host_port_num          = 0,
+       .version                = CPSW_CTRL_VERSION_2,
+};
+
+int board_eth_init(bd_t *bis)
+{
+       int rv, ret = 0;
+       uint8_t mac_addr[6];
+       uint32_t mac_hi, mac_lo;
+
+       if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
+               /* try reading mac address from efuse */
+               mac_lo = readl(&cdev->macid0l);
+               mac_hi = readl(&cdev->macid0h);
+               mac_addr[0] = mac_hi & 0xFF;
+               mac_addr[1] = (mac_hi & 0xFF00) >> 8;
+               mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
+               mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
+               mac_addr[4] = mac_lo & 0xFF;
+               mac_addr[5] = (mac_lo & 0xFF00) >> 8;
+               if (is_valid_ether_addr(mac_addr))
+                       eth_setenv_enetaddr("ethaddr", mac_addr);
+       }
+
+       writel(RMII_MODE_ENABLE, &cdev->miisel);
+
+       rv = cpsw_register(&cpsw_data);
+       if (rv < 0)
+               printf("Error %d registering CPSW switch\n", rv);
+       else
+               ret += rv;
+
+       return ret;
+}
+#endif
+
diff --git a/board/isee/igep0033/board.h b/board/isee/igep0033/board.h
new file mode 100644 (file)
index 0000000..37988e0
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * IGEP COM AQUILA/CYGNUS boards information header
+ *
+ * Copyright (C) 2013, ISEE 2007 SL - http://www.isee.biz/
+ *
+ * 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.
+ */
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * We must be able to enable uart0, for initial output. We then have a
+ * main pinmux function that can be overridden to enable all other pinmux that
+ * is required on the board.
+ */
+void enable_uart0_pin_mux(void);
+void enable_board_pin_mux(void);
+#endif
diff --git a/board/isee/igep0033/mux.c b/board/isee/igep0033/mux.c
new file mode 100644 (file)
index 0000000..16f4add
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2013, ISEE 2007 SL - http://www.isee.biz/
+ *
+ * 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 version 2.
+ *
+ * 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/arch/sys_proto.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/mux.h>
+#include <asm/io.h>
+#include <i2c.h>
+#include "board.h"
+
+static struct module_pin_mux uart0_pin_mux[] = {
+       {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)},  /* UART0_RXD */
+       {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)},              /* UART0_TXD */
+       {-1},
+};
+
+static struct module_pin_mux mmc0_pin_mux[] = {
+       {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)},  /* MMC0_DAT3 */
+       {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)},  /* MMC0_DAT2 */
+       {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)},  /* MMC0_DAT1 */
+       {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)},  /* MMC0_DAT0 */
+       {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)},   /* MMC0_CLK */
+       {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)},   /* MMC0_CMD */
+       {OFFSET(mcasp0_aclkx), (MODE(4) | RXACTIVE)},           /* MMC0_CD */
+       {-1},
+};
+
+static struct module_pin_mux nand_pin_mux[] = {
+       {OFFSET(gpmc_ad0), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD0 */
+       {OFFSET(gpmc_ad1), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD1 */
+       {OFFSET(gpmc_ad2), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD2 */
+       {OFFSET(gpmc_ad3), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD3 */
+       {OFFSET(gpmc_ad4), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD4 */
+       {OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD5 */
+       {OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD6 */
+       {OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD7 */
+       {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NAND WAIT */
+       {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN | RXACTIVE)},   /* NAND_WPN */
+       {OFFSET(gpmc_csn0), (MODE(0) | PULLUDEN)},              /* NAND_CS0 */
+       {OFFSET(gpmc_advn_ale), (MODE(0) | PULLUDEN)},  /* NAND_ADV_ALE */
+       {OFFSET(gpmc_oen_ren), (MODE(0) | PULLUDEN)},   /* NAND_OE */
+       {OFFSET(gpmc_wen), (MODE(0) | PULLUDEN)},       /* NAND_WEN */
+       {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLUDEN)},  /* NAND_BE_CLE */
+       {-1},
+};
+
+static struct module_pin_mux rmii1_pin_mux[] = {
+       {OFFSET(mii1_txen), MODE(1)},                   /* RMII1_TXEN */
+       {OFFSET(mii1_rxerr), MODE(1) | RXACTIVE},       /* RMII1_RXERR */
+       {OFFSET(mii1_crs), MODE(1) | RXACTIVE},         /* RMII1_CRS_DV */
+       {OFFSET(mii1_rxd0), MODE(1) | RXACTIVE},        /* RMII1_RXD0 */
+       {OFFSET(mii1_rxd1), MODE(1) | RXACTIVE},        /* RMII1_RXD1 */
+       {OFFSET(mii1_txd0), MODE(1)},                   /* RMII1_TXD0 */
+       {OFFSET(mii1_txd1), MODE(1)},                   /* RMII1_TXD1 */
+       {OFFSET(rmii1_refclk), MODE(0) | RXACTIVE},     /* RMII1_REF_CLK */
+       {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN},    /* MDIO_DATA */
+       {OFFSET(mdio_clk), MODE(0) | PULLUP_EN},        /* MDIO_CLK */
+       {-1},
+};
+
+void enable_uart0_pin_mux(void)
+{
+       configure_module_pin_mux(uart0_pin_mux);
+}
+
+/*
+ * Do board-specific muxes.
+ */
+void enable_board_pin_mux(void)
+{
+       /* NAND Flash */
+       configure_module_pin_mux(nand_pin_mux);
+       /* SD Card */
+       configure_module_pin_mux(mmc0_pin_mux);
+       /* Ethernet pinmux. */
+       configure_module_pin_mux(rmii1_pin_mux);
+}
+
index 85719a0204b969e411b6c8c56efa27e9c3c3007d..461e21f3fd12d2c9ecb669d8ba04a8f08c646adc 100644 (file)
 #include <common.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/imx25-pinmux.h>
+#include <asm/arch/iomux-mx25.h>
 #include <asm/gpio.h>
-#include <asm/arch/sys_proto.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_SPL_BUILD
 void board_init_f(ulong bootflag)
 {
-       relocate_code(CONFIG_SPL_TEXT_BASE);
+       /*
+        * copy ourselves from where we are running to where we were
+        * linked at. Use ulong pointers as all addresses involved
+        * are 4-byte-aligned.
+        */
+       ulong *start_ptr, *end_ptr, *link_ptr, *run_ptr, *dst;
+       asm volatile ("ldr %0, =_start" : "=r"(start_ptr));
+       asm volatile ("ldr %0, =_end" : "=r"(end_ptr));
+       asm volatile ("ldr %0, =board_init_f" : "=r"(link_ptr));
+       asm volatile ("adr %0, board_init_f" : "=r"(run_ptr));
+       for (dst = start_ptr; dst < end_ptr; dst++)
+               *dst = *(dst+(run_ptr-link_ptr));
+       /*
+        * branch to nand_boot's link-time address.
+        */
        asm volatile("ldr pc, =nand_boot");
 }
 #endif
 
 #ifdef CONFIG_FEC_MXC
+/*
+ * FIXME: need to revisit this
+ * The original code enabled PUE and 100-k pull-down without PKE, so the right
+ * value here is likely:
+ *     0 for no pull
+ * or:
+ *     PAD_CTL_PUS_100K_DOWN for 100-k pull-down
+ */
+#define FEC_OUT_PAD_CTRL       0
+
 #define GPIO_FEC_RESET_B       IMX_GPIO_NR(4, 7)
 #define GPIO_FEC_ENABLE_B      IMX_GPIO_NR(4, 9)
 
 void tx25_fec_init(void)
 {
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       u32 gpio_mux_mode = MX25_PIN_MUX_MODE(5);
-       u32 saved_rdata0_mode, saved_rdata1_mode, saved_rx_dv_mode;
+       static const iomux_v3_cfg_t fec_pads[] = {
+               MX25_PAD_FEC_TX_CLK__FEC_TX_CLK,
+               MX25_PAD_FEC_RX_DV__FEC_RX_DV,
+               MX25_PAD_FEC_RDATA0__FEC_RDATA0,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA0__FEC_TDATA0, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_TX_EN__FEC_TX_EN, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_MDC__FEC_MDC, FEC_OUT_PAD_CTRL),
+               MX25_PAD_FEC_MDIO__FEC_MDIO,
+               MX25_PAD_FEC_RDATA1__FEC_RDATA1,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA1__FEC_TDATA1, FEC_OUT_PAD_CTRL),
+
+               NEW_PAD_CTRL(MX25_PAD_D13__GPIO_4_7, 0), /* FEC_RESET_B */
+               NEW_PAD_CTRL(MX25_PAD_D11__GPIO_4_9, 0), /* FEC_ENABLE_B */
+       };
+
+       static const iomux_v3_cfg_t fec_cfg_pads[] = {
+               MX25_PAD_FEC_RDATA0__GPIO_3_10,
+               MX25_PAD_FEC_RDATA1__GPIO_3_11,
+               MX25_PAD_FEC_RX_DV__GPIO_3_12,
+       };
 
        debug("tx25_fec_init\n");
-       /*
-        * fec pin init is generic
-        */
-       mx25_fec_init_pins();
-
-       /*
-        * Set up the FEC_RESET_B and FEC_ENABLE GPIO pins.
-        *
-        * FEC_RESET_B: gpio4[7] is ALT 5 mode of pin D13
-        * FEC_ENABLE_B: gpio4[9] is ALT 5 mode of pin D11
-        */
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-
-       writel(gpio_mux_mode, &muxctl->pad_d13);
-       writel(gpio_mux_mode, &muxctl->pad_d11);
-
-       writel(0x0, &padctl->pad_d13);
-       writel(0x0, &padctl->pad_d11);
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 
        /* drop PHY power and assert reset (low) */
        gpio_direction_output(GPIO_FEC_RESET_B, 0);
@@ -99,15 +120,10 @@ void tx25_fec_init(void)
         *  RMII mode is selected by FEC_RX_DV which is GPIO 3_12 in mux mode
         */
        /*
-        * save three current mux modes and set each to gpio mode
+        * set each mux mode to gpio mode
         */
-       saved_rdata0_mode = readl(&muxctl->pad_fec_rdata0);
-       saved_rdata1_mode = readl(&muxctl->pad_fec_rdata1);
-       saved_rx_dv_mode = readl(&muxctl->pad_fec_rx_dv);
-
-       writel(gpio_mux_mode, &muxctl->pad_fec_rdata0);
-       writel(gpio_mux_mode, &muxctl->pad_fec_rdata1);
-       writel(gpio_mux_mode, &muxctl->pad_fec_rx_dv);
+       imx_iomux_v3_setup_multiple_pads(fec_cfg_pads,
+                                               ARRAY_SIZE(fec_cfg_pads));
 
        /*
         * set each to 1 and make each an output
@@ -128,19 +144,46 @@ void tx25_fec_init(void)
        /*
         * set FEC pins back
         */
-       writel(saved_rdata0_mode, &muxctl->pad_fec_rdata0);
-       writel(saved_rdata1_mode, &muxctl->pad_fec_rdata1);
-       writel(saved_rx_dv_mode, &muxctl->pad_fec_rx_dv);
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 #else
 #define tx25_fec_init()
 #endif
 
-int board_init()
-{
 #ifdef CONFIG_MXC_UART
-       mx25_uart1_init_pins();
+/*
+ * Set up input pins with hysteresis and 100-k pull-ups
+ */
+#define UART1_IN_PAD_CTRL      (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP)
+/*
+ * FIXME: need to revisit this
+ * The original code enabled PUE and 100-k pull-down without PKE, so the right
+ * value here is likely:
+ *     0 for no pull
+ * or:
+ *     PAD_CTL_PUS_100K_DOWN for 100-k pull-down
+ */
+#define UART1_OUT_PAD_CTRL     0
+
+static void tx25_uart1_init(void)
+{
+       static const iomux_v3_cfg_t uart1_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_UART1_RXD__UART1_RXD, UART1_IN_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_TXD__UART1_TXD, UART1_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_RTS__UART1_RTS, UART1_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_UART1_CTS__UART1_CTS, UART1_IN_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+}
+#else
+#define tx25_uart1_init()
 #endif
+
+int board_init()
+{
+       tx25_uart1_init();
+
        /* board id for linux */
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
        return 0;
index eda9199bbe9f499e9c49301709007fd68708cbc1..b9448873c8c263d3f5cb157aaaca80d21a01f3f0 100644 (file)
@@ -160,7 +160,7 @@ int ethernet_present(void)
 }
 #endif
 
-int initialize_unit_leds(void)
+static int initialize_unit_leds(void)
 {
        /*
         * Init the unit LEDs per default they all are
@@ -181,7 +181,7 @@ int initialize_unit_leds(void)
 }
 
 #if defined(CONFIG_BOOTCOUNT_LIMIT)
-void set_bootcount_addr(void)
+static void set_bootcount_addr(void)
 {
        uchar buf[32];
        unsigned int bootcountaddr;
index 48eb65f8968365a918adf893cd1780f3e8f16d74..42bf8b669d74c24563706598476701cde39fe5bf 100644 (file)
@@ -332,10 +332,10 @@ void *video_hw_init(void)
 static void twl4030_regulator_set_mode(u8 id, u8 mode)
 {
        u16 msg = MSG_SINGULAR(DEV_GRP_P1, id, mode);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, msg >> 8,
-                       TWL4030_PM_MASTER_PB_WORD_MSB);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, msg & 0xff,
-                       TWL4030_PM_MASTER_PB_WORD_LSB);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                            TWL4030_PM_MASTER_PB_WORD_MSB, msg >> 8);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                            TWL4030_PM_MASTER_PB_WORD_LSB, msg & 0xff);
 }
 
 static void omap3_emu_romcode_call(u32 service_id, u32 *parameters)
@@ -406,12 +406,12 @@ int misc_init_r(void)
                                TWL4030_PM_RECEIVER_DEV_GRP_P1);
 
        /* store I2C access state */
-       twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, &state,
-                       TWL4030_PM_MASTER_PB_CFG);
+       twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, TWL4030_PM_MASTER_PB_CFG,
+                           &state);
 
        /* enable I2C access to powerbus (needed for twl4030 regulator) */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 0x02,
-                       TWL4030_PM_MASTER_PB_CFG);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, TWL4030_PM_MASTER_PB_CFG,
+                            0x02);
 
        /* set VAUX3, VSIM and VMMC1 state to active - enable eMMC memory */
        twl4030_regulator_set_mode(RES_VAUX3, RES_STATE_ACTIVE);
@@ -419,8 +419,8 @@ int misc_init_r(void)
        twl4030_regulator_set_mode(RES_VMMC1, RES_STATE_ACTIVE);
 
        /* restore I2C access state */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, state,
-                       TWL4030_PM_MASTER_PB_CFG);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, TWL4030_PM_MASTER_PB_CFG,
+                            state);
 
        /* set env variable attkernaddr for relocated kernel */
        sprintf(buf, "%#x", KERNEL_ADDRESS);
@@ -475,14 +475,14 @@ void hw_watchdog_reset(void)
                return;
 
        /* read actual watchdog timeout */
-       twl4030_i2c_read_u8(TWL4030_CHIP_PM_RECEIVER, &timeout,
-                       TWL4030_PM_RECEIVER_WATCHDOG_CFG);
+       twl4030_i2c_read_u8(TWL4030_CHIP_PM_RECEIVER,
+                           TWL4030_PM_RECEIVER_WATCHDOG_CFG, &timeout);
 
        /* timeout 0 means watchdog is disabled */
        /* reset watchdog timeout to 31s (maximum) */
        if (timeout != 0)
-               twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 31,
-                               TWL4030_PM_RECEIVER_WATCHDOG_CFG);
+               twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                                    TWL4030_PM_RECEIVER_WATCHDOG_CFG, 31);
 
        /* store last watchdog reset time */
        twl_wd_time = get_timer(0);
@@ -531,8 +531,8 @@ int rx51_kp_init(void)
 {
        int ret = 0;
        u8 ctrl;
-       ret = twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD, &ctrl,
-               TWL4030_KEYPAD_KEYP_CTRL_REG);
+       ret = twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD,
+                                 TWL4030_KEYPAD_KEYP_CTRL_REG, &ctrl);
 
        if (ret)
                return ret;
@@ -541,18 +541,18 @@ int rx51_kp_init(void)
        ctrl |= TWL4030_KEYPAD_CTRL_KBD_ON;
        ctrl |= TWL4030_KEYPAD_CTRL_SOFT_NRST;
        ctrl |= TWL4030_KEYPAD_CTRL_SOFTMODEN;
-       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, ctrl,
-                               TWL4030_KEYPAD_KEYP_CTRL_REG);
+       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
+                                   TWL4030_KEYPAD_KEYP_CTRL_REG, ctrl);
        /* enable key event status */
-       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, 0xfe,
-                               TWL4030_KEYPAD_KEYP_IMR1);
+       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
+                                   TWL4030_KEYPAD_KEYP_IMR1, 0xfe);
        /* enable interrupt generation on rising and falling */
        /* this is a workaround for qemu twl4030 emulation */
-       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, 0x57,
-                               TWL4030_KEYPAD_KEYP_EDR);
+       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
+                                   TWL4030_KEYPAD_KEYP_EDR, 0x57);
        /* enable ISR clear on read */
-       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, 0x05,
-                               TWL4030_KEYPAD_KEYP_SIH_CTRL);
+       ret |= twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
+                                   TWL4030_KEYPAD_KEYP_SIH_CTRL, 0x05);
        return 0;
 }
 
@@ -615,8 +615,8 @@ int rx51_kp_tstc(void)
        for (i = 0; i < 2; i++) {
 
                /* check interrupt register for events */
-               twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD, &intr,
-                               TWL4030_KEYPAD_KEYP_ISR1+(2*i));
+               twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD,
+                                   TWL4030_KEYPAD_KEYP_ISR1 + (2 * i), &intr);
 
                /* no event */
                if (!(intr&1))
diff --git a/board/nvidia/beaver/Makefile b/board/nvidia/beaver/Makefile
new file mode 100644 (file)
index 0000000..9510f60
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms and conditions of the GNU General Public License,
+# version 2, as published by the Free Software Foundation.
+#
+# This program is distributed in the hope 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
+
+$(shell mkdir -p $(obj)../cardhu)
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  = ../cardhu/cardhu.o
+
+SRCS   := $(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
+
+#########################################################################
index a96c293c0ae7f8e12201643491d2b5faf82b654b..6ba8c86eaa9b5ab722df25612dcad5b3fccddd85 100644 (file)
@@ -29,8 +29,8 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
 
-#define        MUX_CONFIG_EMI  (MXS_PAD_3V3 | MXS_PAD_16MA | MXS_PAD_PULLUP)
-#define        MUX_CONFIG_SSP  (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_EMI  (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_PULLUP)
+#define        MUX_CONFIG_SSP  (MXS_PAD_8MA | MXS_PAD_PULLUP)
 
 const iomux_cfg_t iomux_setup[] = {
        /* DUART */
index 9ff5dd76641b15fd1a1f127f39846001673a5d59..5f0c58d8d2ce1ab47fef6b54bd9a68bd7bd55ef6 100644 (file)
@@ -114,8 +114,9 @@ int misc_init_r(void)
 
        /* Enable battery backup capacitor (3.2V, 0.5mA charge current) */
        twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+               TWL4030_PM_RECEIVER_BB_CFG,
                TWL4030_BB_CFG_BBCHEN | TWL4030_BB_CFG_BBSEL_3200MV |
-               TWL4030_BB_CFG_BBISEL_500UA, TWL4030_PM_RECEIVER_BB_CFG);
+               TWL4030_BB_CFG_BBISEL_500UA);
 
        dieid_num_r();
 
index 43d7b6e15ac87c0173618048f7febb6092266c04..93c611dfc6e65c5a4e68047cc2b3dd60df4d808e 100644 (file)
@@ -114,6 +114,15 @@ static struct emif_regs ddr3_emif_reg_data = {
  */
 void s_init(void)
 {
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+#ifdef CONFIG_SPL_BUILD
+       save_omap_boot_params();
+#endif
+
        /*
         * WDT1 is already running when the bootloader gets control
         * Disable it to avoid "random" resets
index 6b3e095ba89bcb96ae5c7b8e3708ca7b92787bd2..16d442aa625f344e9674df812f1f195625d9891f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2012 Stephen Warren
+ * (C) Copyright 2012-2013 Stephen Warren
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -15,6 +15,8 @@
  */
 
 #include <common.h>
+#include <config.h>
+#include <lcd.h>
 #include <asm/arch/mbox.h>
 #include <asm/arch/sdhci.h>
 #include <asm/global_data.h>
@@ -77,3 +79,13 @@ int board_mmc_init(void)
        return bcm2835_sdhci_init(BCM2835_SDHCI_BASE,
                                  msg_clk->get_clock_rate.body.resp.rate_hz);
 }
+
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       /*
+        * For now, we simply always add the simplefb DT node. Later, we
+        * should be more intelligent, and e.g. only do this if no enabled DT
+        * node exists for the "real" graphics driver.
+        */
+       lcd_dt_simplefb_add_node(blob);
+}
index 4f37c59d807011a73177594df805e98eaf47a90d..087d856b03694354bdd8cb4138f4a02205ad93cf 100644 (file)
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/imx25-pinmux.h>
-#include <asm/arch/sys_proto.h>
+#include <asm/arch/iomux-mx25.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 int board_init()
 {
-       struct iomuxc_mux_ctl *muxctl;
-       struct iomuxc_pad_ctl *padctl;
-       struct iomuxc_pad_input_select *inputselect;
-       u32 gpio_mux_mode0_sion = MX25_PIN_MUX_MODE(0) | MX25_PIN_MUX_SION;
-       u32 gpio_mux_mode1 = MX25_PIN_MUX_MODE(1);
-       u32 gpio_mux_mode5 = MX25_PIN_MUX_MODE(5);
-       u32 gpio_mux_mode6 = MX25_PIN_MUX_MODE(6);
-       u32 input_select1 = MX25_PAD_INPUT_SELECT_DAISY(1);
-       u32 input_select2 = MX25_PAD_INPUT_SELECT_DAISY(2);
+       static const iomux_v3_cfg_t sdhc1_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_SD1_CMD__SD1_CMD, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_CLK__SD1_CLK, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA0__SD1_DATA0, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA1__SD1_DATA1, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA2__SD1_DATA2, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_SD1_DATA3__SD1_DATA3, NO_PAD_CTRL),
+       };
+
+       static const iomux_v3_cfg_t dig_out_pads[] = {
+               MX25_PAD_CSI_D8__GPIO_1_7, /* Ouput 1 Ctrl */
+               MX25_PAD_CSI_D7__GPIO_1_6, /* Ouput 2 Ctrl */
+               NEW_PAD_CTRL(MX25_PAD_CSI_D6__GPIO_1_31, 0), /* Ouput 1 Stat */
+               NEW_PAD_CTRL(MX25_PAD_CSI_D5__GPIO_1_30, 0), /* Ouput 2 Stat */
+       };
+
+       static const iomux_v3_cfg_t led_pads[] = {
+               MX25_PAD_CSI_D9__GPIO_4_21,
+               MX25_PAD_CSI_D4__GPIO_1_29,
+       };
+
+       static const iomux_v3_cfg_t can_pads[] = {
+               NEW_PAD_CTRL(MX25_PAD_GPIO_A__CAN1_TX, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_GPIO_B__CAN1_RX, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_GPIO_C__CAN2_TX, NO_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_GPIO_D__CAN2_RX, NO_PAD_CTRL),
+       };
+
+       static const iomux_v3_cfg_t i2c3_pads[] = {
+               MX25_PAD_CSPI1_SS1__I2C3_DAT,
+               MX25_PAD_GPIO_E__I2C3_CLK,
+       };
 
        icache_enable();
 
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-       padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
-       inputselect = (struct iomuxc_pad_input_select *)IMX_IOPADINPUTSEL_BASE;
-
-       /* Setup of core volatage selection pin to run at 1.4V */
-       writel(gpio_mux_mode5, &muxctl->pad_ext_armclk); /* VCORE GPIO3[15] */
+       /* Setup of core voltage selection pin to run at 1.4V */
+       imx_iomux_v3_setup_pad(MX25_PAD_EXT_ARMCLK__GPIO_3_15); /* VCORE */
        gpio_direction_output(IMX_GPIO_NR(3, 15), 1);
 
-       /* Setup of input daisy chains for SD card pins*/
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_cmd);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_clk);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_data0);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_data1);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_data2);
-       writel(gpio_mux_mode0_sion, &muxctl->pad_sd1_data3);
+       /* Setup of SD card pins*/
+       imx_iomux_v3_setup_multiple_pads(sdhc1_pads, ARRAY_SIZE(sdhc1_pads));
 
        /* Setup of digital output for USB power and OC */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d3); /* USB Power GPIO1[28] */
+       imx_iomux_v3_setup_pad(MX25_PAD_CSI_D3__GPIO_1_28); /* USB Power */
        gpio_direction_output(IMX_GPIO_NR(1, 28), 1);
 
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d2); /* USB OC GPIO1[27] */
+       imx_iomux_v3_setup_pad(MX25_PAD_CSI_D2__GPIO_1_27); /* USB OC */
        gpio_direction_input(IMX_GPIO_NR(1, 18));
 
        /* Setup of digital output control pins */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d8); /* Ouput 1 Ctrl GPIO1[7] */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d7); /* Ouput 2 Ctrl GPIO1[6] */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d6); /* Ouput 1 Stat GPIO1[31]*/
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d5); /* Ouput 2 Stat GPIO1[30]*/
-
-       writel(0, &padctl->pad_csi_d6); /* Ouput 1 Stat pull up off */
-       writel(0, &padctl->pad_csi_d5); /* Ouput 2 Stat pull up off */
+       imx_iomux_v3_setup_multiple_pads(dig_out_pads,
+                                               ARRAY_SIZE(dig_out_pads));
 
        /* Switch both output drivers off */
        gpio_direction_output(IMX_GPIO_NR(1, 7), 0);
        gpio_direction_output(IMX_GPIO_NR(1, 6), 0);
 
-       /* Setup of key input pin GPIO2[29]*/
-       writel(gpio_mux_mode5 | MX25_PIN_MUX_SION, &muxctl->pad_kpp_row0);
-       writel(0, &padctl->pad_kpp_row0); /* Key pull up off */
+       /* Setup of key input pin */
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX25_PAD_KPP_ROW0__GPIO_2_29, 0));
        gpio_direction_input(IMX_GPIO_NR(2, 29));
 
        /* Setup of status LED outputs */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d9);    /* GPIO4[21] */
-       writel(gpio_mux_mode5, &muxctl->pad_csi_d4);    /* GPIO1[29] */
+       imx_iomux_v3_setup_multiple_pads(led_pads, ARRAY_SIZE(led_pads));
 
        /* Switch both LEDs off */
        gpio_direction_output(IMX_GPIO_NR(4, 21), 0);
        gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
 
        /* Setup of CAN1 and CAN2 signals */
-       writel(gpio_mux_mode6, &muxctl->pad_gpio_a);    /* CAN1 TX */
-       writel(gpio_mux_mode6, &muxctl->pad_gpio_b);    /* CAN1 RX */
-       writel(gpio_mux_mode6, &muxctl->pad_gpio_c);    /* CAN2 TX */
-       writel(gpio_mux_mode6, &muxctl->pad_gpio_d);    /* CAN2 RX */
-
-       /* Setup of input daisy chains for CAN signals*/
-       writel(input_select1, &inputselect->can1_ipp_ind_canrx); /* CAN1 RX */
-       writel(input_select1, &inputselect->can2_ipp_ind_canrx); /* CAN2 RX */
+       imx_iomux_v3_setup_multiple_pads(can_pads, ARRAY_SIZE(can_pads));
 
        /* Setup of I2C3 signals */
-       writel(gpio_mux_mode1, &muxctl->pad_cspi1_ss1); /* I2C3 SDA */
-       writel(gpio_mux_mode1, &muxctl->pad_gpio_e);    /* I2C3 SCL */
-
-       /* Setup of input daisy chains for I2C3 signals*/
-       writel(input_select1, &inputselect->i2c3_ipp_sda_in);   /* I2C3 SDA */
-       writel(input_select2, &inputselect->i2c3_ipp_scl_in);   /* I2C3 SCL */
+       imx_iomux_v3_setup_multiple_pads(i2c3_pads, ARRAY_SIZE(i2c3_pads));
 
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
@@ -128,25 +122,32 @@ int board_late_init(void)
        const char *e;
 
 #ifdef CONFIG_FEC_MXC
-       struct iomuxc_mux_ctl *muxctl;
-       u32 gpio_mux_mode2 = MX25_PIN_MUX_MODE(2);
-       u32 gpio_mux_mode5 = MX25_PIN_MUX_MODE(5);
-
-       /*
-        * fec pin init is generic
-        */
-       mx25_fec_init_pins();
-
-       /*
-        * Set up LAN-RESET and FEC_RX_ERR
-        *
-        * LAN-RESET:  GPIO3[16] is ALT 5 mode of pin U20
-        * FEC_RX_ERR: FEC_RX_ERR is ALT 2 mode of pin R2
-        */
-       muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
-
-       writel(gpio_mux_mode5, &muxctl->pad_upll_bypclk);
-       writel(gpio_mux_mode2, &muxctl->pad_uart2_cts);
+/*
+ * FIXME: need to revisit this
+ * The original code enabled PUE and 100-k pull-down without PKE, so the right
+ * value here is likely:
+ *     0 for no pull
+ * or:
+ *     PAD_CTL_PUS_100K_DOWN for 100-k pull-down
+ */
+#define FEC_OUT_PAD_CTRL       0
+
+       static const iomux_v3_cfg_t fec_pads[] = {
+               MX25_PAD_FEC_TX_CLK__FEC_TX_CLK,
+               MX25_PAD_FEC_RX_DV__FEC_RX_DV,
+               MX25_PAD_FEC_RDATA0__FEC_RDATA0,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA0__FEC_TDATA0, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_TX_EN__FEC_TX_EN, FEC_OUT_PAD_CTRL),
+               NEW_PAD_CTRL(MX25_PAD_FEC_MDC__FEC_MDC, FEC_OUT_PAD_CTRL),
+               MX25_PAD_FEC_MDIO__FEC_MDIO,
+               MX25_PAD_FEC_RDATA1__FEC_RDATA1,
+               NEW_PAD_CTRL(MX25_PAD_FEC_TDATA1__FEC_TDATA1, FEC_OUT_PAD_CTRL),
+
+               MX25_PAD_UPLL_BYPCLK__GPIO_3_16, /* LAN-RESET */
+               MX25_PAD_UART2_CTS__FEC_RX_ER, /* FEC_RX_ERR */
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 
        /* assert PHY reset (low) */
        gpio_direction_output(IMX_GPIO_NR(3, 16), 0);
index 8347cf9ce942c86870cfe02905dab1f74f63dd64..5c7309888837b1facfab8e717a2115ed67e9b9f3 100644 (file)
@@ -31,7 +31,7 @@
 #include <asm/omap_gpio.h>
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/dss.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <i2c.h>
 #include <spartan3.h>
 #include <asm/gpio.h>
index b371376bc72c0f6d0b5c6118057065a6cd1679e4..638cc4d68b2ad5238443c6c180f378e66278b826 100644 (file)
@@ -297,6 +297,15 @@ static struct emif_regs ddr3_evm_emif_reg_data = {
        .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY |
                                PHY_EN_DYN_PWRDN,
 };
+
+#ifdef CONFIG_SPL_OS_BOOT
+int spl_start_uboot(void)
+{
+       /* break into full u-boot on 'c' */
+       return (serial_tstc() && serial_getc() == 'c');
+}
+#endif
+
 #endif
 
 /*
@@ -304,6 +313,15 @@ static struct emif_regs ddr3_evm_emif_reg_data = {
  */
 void s_init(void)
 {
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+#ifdef CONFIG_SPL_BUILD
+       save_omap_boot_params();
+#endif
+
        /* WDT1 is already running when the bootloader gets control
         * Disable it to avoid "random" resets
         */
@@ -496,6 +514,7 @@ int board_eth_init(bd_t *bis)
                        eth_setenv_enetaddr("ethaddr", mac_addr);
        }
 
+#ifdef CONFIG_DRIVER_TI_CPSW
        if (board_is_bone() || board_is_bone_lt() || board_is_idk()) {
                writel(MII_MODE_ENABLE, &cdev->miisel);
                cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
@@ -511,6 +530,7 @@ int board_eth_init(bd_t *bis)
                printf("Error %d registering CPSW switch\n", rv);
        else
                n += rv;
+#endif
 
        /*
         *
index 3d9b6dd8fd2a25f0113721ab0f30dda98b2ff3a6..c686f40a93398c0c84231a2f6b0463d88f8259ac 100644 (file)
@@ -108,13 +108,14 @@ int board_init(void)
 /*
  * Routine: get_board_revision
  * Description: Detect if we are running on a Beagle revision Ax/Bx,
- *             C1/2/3, C4 or xM. This can be done by reading
+ *             C1/2/3, C4, xM Ax/Bx or xM Cx. This can be done by reading
  *             the level of GPIO173, GPIO172 and GPIO171. This should
  *             result in
  *             GPIO173, GPIO172, GPIO171: 1 1 1 => Ax/Bx
  *             GPIO173, GPIO172, GPIO171: 1 1 0 => C1/2/3
  *             GPIO173, GPIO172, GPIO171: 1 0 1 => C4
- *             GPIO173, GPIO172, GPIO171: 0 0 0 => xM
+ *             GPIO173, GPIO172, GPIO171: 0 1 0 => xM Cx
+ *             GPIO173, GPIO172, GPIO171: 0 0 0 => xM Ax/Bx
  */
 static int get_board_revision(void)
 {
index 7bbb5492feb1110dacfd6178170218fc794c76fa..bf7e0919665902d57e3c1195874bf06a1e5ab391 100644 (file)
@@ -27,7 +27,7 @@
  * MA 02111-1307 USA
  */
 #include <common.h>
-#include <twl6035.h>
+#include <palmas.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mmc_host_def.h>
 
index 04c95fd376ac4fbdee5a8e43b6a3c6a7909af903..338a241ce78b82ca9d1c35d90de7d3b5ae025f54 100644 (file)
 #include <asm/arch/mux_dra7xx.h>
 
 const struct pad_conf_entry core_padconf_array_essential[] = {
-       {MMC1_CLK, (PTU | IEN | M0)},   /* MMC1_CLK */
-       {MMC1_CMD, (PTU | IEN | M0)},   /* MMC1_CMD */
-       {MMC1_DAT0, (PTU | IEN | M0)},  /* MMC1_DAT0 */
-       {MMC1_DAT1, (PTU | IEN | M0)},  /* MMC1_DAT1 */
-       {MMC1_DAT2, (PTU | IEN | M0)},  /* MMC1_DAT2 */
-       {MMC1_DAT3, (PTU | IEN | M0)},  /* MMC1_DAT3 */
-       {MMC1_SDCD, (PTU | IEN | M0)},  /* MMC1_SDCD */
-       {MMC1_SDWP, (PTU | IEN | M0)},  /* MMC1_SDWP */
-       {UART1_RXD, (PTU | IEN | M0)},  /* UART1_RXD */
-       {UART1_TXD, (M0)},              /* UART1_TXD */
-       {UART1_CTSN, (PTU | IEN | M0)}, /* UART1_CTSN */
-       {UART1_RTSN, (M0)},             /* UART1_RTSN */
-       {I2C1_SDA, (PTU | IEN | M0)},   /* I2C1_SDA */
-       {I2C1_SCL, (PTU | IEN | M0)},   /* I2C1_SCL */
+       {MMC1_CLK, (IEN | PTU | PDIS | M0)},    /* MMC1_CLK */
+       {MMC1_CMD, (IEN | PTU | PDIS | M0)},    /* MMC1_CMD */
+       {MMC1_DAT0, (IEN | PTU | PDIS | M0)},   /* MMC1_DAT0 */
+       {MMC1_DAT1, (IEN | PTU | PDIS | M0)},   /* MMC1_DAT1 */
+       {MMC1_DAT2, (IEN | PTU | PDIS | M0)},   /* MMC1_DAT2 */
+       {MMC1_DAT3, (IEN | PTU | PDIS | M0)},   /* MMC1_DAT3 */
+       {MMC1_SDCD, (FSC | IEN | PTU | PDIS | M0)}, /* MMC1_SDCD */
+       {MMC1_SDWP, (FSC | IEN | PTD | PEN | M14)}, /* MMC1_SDWP */
+       {GPMC_A19, (IEN | PTU | PDIS | M1)},    /* mmc2_dat4 */
+       {GPMC_A20, (IEN | PTU | PDIS | M1)},    /* mmc2_dat5 */
+       {GPMC_A21, (IEN | PTU | PDIS | M1)},    /* mmc2_dat6 */
+       {GPMC_A22, (IEN | PTU | PDIS | M1)},    /* mmc2_dat7 */
+       {GPMC_A23, (IEN | PTU | PDIS | M1)},    /* mmc2_clk */
+       {GPMC_A24, (IEN | PTU | PDIS | M1)},    /* mmc2_dat0 */
+       {GPMC_A25, (IEN | PTU | PDIS | M1)},    /* mmc2_dat1 */
+       {GPMC_A26, (IEN | PTU | PDIS | M1)},    /* mmc2_dat2 */
+       {GPMC_A27, (IEN | PTU | PDIS | M1)},    /* mmc2_dat3 */
+       {GPMC_CS1, (IEN | PTU | PDIS | M1)},    /* mmm2_cmd */
+       {UART1_RXD, (FSC | IEN | PTU | PDIS | M0)}, /* UART1_RXD */
+       {UART1_TXD, (FSC | IEN | PTU | PDIS | M0)}, /* UART1_TXD */
+       {UART1_CTSN, (IEN | PTU | PDIS | M3)},  /* UART1_CTSN */
+       {UART1_RTSN, (IEN | PTU | PDIS | M3)},  /* UART1_RTSN */
+       {I2C1_SDA, (IEN | PTU | PDIS | M0)},    /* I2C1_SDA */
+       {I2C1_SCL, (IEN | PTU | PDIS | M0)},    /* I2C1_SCL */
 };
 #endif /* _MUX_DATA_DRA7XX_H_ */
diff --git a/board/ti/omap2420h4/config.mk b/board/ti/omap2420h4/config.mk
deleted file mode 100644 (file)
index e5dff69..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# (C) Copyright 2004
-# Texas Instruments, <www.ti.com>
-#
-# TI H4 board with OMAP2420 (ARM1136) cpu
-# see http://www.ti.com/ for more information on Texas Instruments
-#
-# H4 has 1 bank of 32MB or 64MB mDDR-SDRAM on CS0
-# H4 has 1 bank of 32MB or 00MB mDDR-SDRAM on CS1
-# Physical Address:
-# 8000'0000 (bank0)
-# A000/0000 (bank1) ES2 will be configurable
-# Linux-Kernel is expected to be at 8000'8000, entry 8000'8000
-# (mem base + reserved)
-
-# For use with external or internal boots.
-#CONFIG_SYS_TEXT_BASE = 0x80e80000
-
-# Used with full SRAM boot.
-# This is either with a GP system or a signed boot image.
-# easiest, and safest way to go if you can.
-#CONFIG_SYS_TEXT_BASE = 0x40270000
-
-
-# Handy to get symbols to debug ROM version.
-#CONFIG_SYS_TEXT_BASE = 0x0
-CONFIG_SYS_TEXT_BASE = 0x08000000
-#CONFIG_SYS_TEXT_BASE = 0x04000000
diff --git a/board/ti/omap2420h4/lowlevel_init.S b/board/ti/omap2420h4/lowlevel_init.S
deleted file mode 100644 (file)
index 731c552..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Board specific setup info
- *
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@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 <version.h>
-#include <asm/arch/omap2420.h>
-#include <asm/arch/mem.h>
-#include <asm/arch/clocks.h>
-
-_TEXT_BASE:
-       .word   CONFIG_SYS_TEXT_BASE    /* sdram load addr from config.mk */
-
-/**************************************************************************
- * cpy_clk_code: relocates clock code into SRAM where its safer to execute
- * R1 = SRAM destination address.
- *************************************************************************/
-.global cpy_clk_code
- 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) */
-       mov     r1, r1                  /* r1 <- dest address (passed in) */
-       add     r2, r2, r0              /* r2 <- source end address */
-next2:
-       ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
-       stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
-       cmp     r0, r2                  /* until source end address [r2]    */
-       bne     next2
-       mov     pc, lr                  /* back to caller */
-
-/* ****************************************************************************
- *  go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
- *              -executed from SRAM.
- *  R0 = PRCM_CLKCFG_CTRL - addr of valid reg
- *  R1 = CM_CLKEN_PLL - addr dpll ctlr reg
- *  R2 = dpll value
- *  R3 = CM_IDLEST_CKGEN - addr dpll lock wait
- ******************************************************************************/
-.global go_to_speed
- go_to_speed:
-       sub     sp, sp, #0x4 /* get some stack space */
-       str     r4, [sp]     /* save r4's value */
-
-       /* move into fast relock bypass */
-       ldr     r8, pll_ctl_add
-       mov     r4, #0x2
-       str     r4, [r8]
-       ldr     r4, pll_stat
-block:
-       ldr     r8, [r4]        /* wait for bypass to take effect */
-       and     r8, r8, #0x3
-       cmp     r8, #0x1
-       bne     block
-
-       /* set new dpll dividers _after_ in bypass */
-       ldr     r4, pll_div_add
-       ldr     r8, pll_div_val
-       str     r8, [r4]
-
-       /* now prepare GPMC (flash) for new dpll speed */
-       /* flash needs to be stable when we jump back to it */
-       ldr     r4, cfg3_0_addr
-       ldr     r8, cfg3_0_val
-       str     r8, [r4]
-       ldr     r4, cfg4_0_addr
-       ldr     r8, cfg4_0_val
-       str     r8, [r4]
-       ldr     r4, cfg1_0_addr
-       ldr     r8, [r4]
-       orr     r8, r8, #0x3     /* up gpmc divider */
-       str     r8, [r4]
-
-       /* setup to 2x loop though code.  The first loop pre-loads the
-        * icache, the 2nd commits the prcm config, and locks the dpll
-        */
-       mov     r4, #0x1000      /* spin spin spin */
-       mov     r8, #0x4         /* first pass condition & set registers */
-       cmp     r8, #0x4
-2:
-       ldrne   r8, [r3]         /* DPLL lock check */
-       and     r8, r8, #0x7
-       cmp     r8, #0x2
-       beq     4f
-3:
-       subeq   r8, r8, #0x1
-       streq   r8, [r0]         /* commit dividers (2nd time) */
-       nop
-lloop1:
-       sub     r4, r4, #0x1    /* Loop currently necessary else bad jumps */
-       nop
-       cmp     r4, #0x0
-       bne     lloop1
-       mov     r4, #0x40000
-       cmp     r8, #0x1
-       nop
-       streq   r2, [r1]        /* lock dpll (2nd time) */
-       nop
-lloop2:
-       sub     r4, r4, #0x1    /* loop currently necessary else bad jumps */
-       nop
-       cmp     r4, #0x0
-       bne     lloop2
-       mov     r4, #0x40000
-       cmp     r8, #0x1
-       nop
-       ldreq   r8, [r3]         /* get lock condition for dpll */
-       cmp     r8, #0x4         /* first time though? */
-       bne     2b
-       moveq   r8, #0x2         /* set to dpll check condition. */
-       beq     3b               /* if condition not true branch */
-4:
-       ldr     r4, [sp]
-       add     sp, sp, #0x4     /* return stack space */
-       mov     pc, lr           /* back to caller, locked */
-
-_go_to_speed: .word go_to_speed
-
-/* these constants need to be close for PIC code */
-cfg3_0_addr:
-    .word  GPMC_CONFIG3_0
-cfg3_0_val:
-    .word  H4_24XX_GPMC_CONFIG3_0
-cfg4_0_addr:
-    .word  GPMC_CONFIG4_0
-cfg4_0_val:
-    .word  H4_24XX_GPMC_CONFIG4_0
-cfg1_0_addr:
-    .word  GPMC_CONFIG1_0
-pll_ctl_add:
-    .word CM_CLKEN_PLL
-pll_stat:
-    .word CM_IDLEST_CKGEN
-pll_div_add:
-    .word CM_CLKSEL1_PLL
-pll_div_val:
-    .word DPLL_VAL     /* DPLL setting (300MHz default) */
-
-.globl lowlevel_init
-lowlevel_init:
-       ldr     sp,     SRAM_STACK
-       str     ip,     [sp]    /* stash old link register */
-       mov     ip,     lr      /* save link reg across call */
-       bl      s_init          /* go setup pll,mux,memory */
-       ldr     ip,     [sp]    /* restore save ip */
-       mov     lr,     ip      /* restore link reg */
-
-       /* map interrupt controller */
-       ldr     r0,     VAL_INTH_SETUP
-       mcr     p15, 0, r0, c15, c2, 4
-
-       /* back to arch calling code */
-       mov     pc,     lr
-
-       /* the literal pools origin */
-       .ltorg
-
-REG_CONTROL_STATUS:
-       .word CONTROL_STATUS
-VAL_INTH_SETUP:
-       .word PERIFERAL_PORT_BASE
-SRAM_STACK:
-       .word LOW_LEVEL_SRAM_STACK
diff --git a/board/ti/omap2420h4/mem.c b/board/ti/omap2420h4/mem.c
deleted file mode 100644 (file)
index ba3f12a..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@ti.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/omap2420.h>
-#include <asm/io.h>
-#include <asm/arch/bits.h>
-#include <asm/arch/mux.h>
-#include <asm/arch/mem.h>
-#include <asm/arch/clocks.h>
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/sys_info.h>
-
-/************************************************************
- * sdelay() - simple spin loop.  Will be constant time as
- *  its generally used in 12MHz bypass conditions only.  This
- *  is necessary until timers are accessible.
- *
- *  not inline to increase chances its in cache when called
- *************************************************************/
-void sdelay (unsigned long loops)
-{
-       __asm__ volatile ("1:\n" "subs %0, %1, #1\n"
-               "bne 1b":"=r" (loops):"0" (loops));
-}
-
-/*********************************************************************************
- * prcm_init() - inits clocks for PRCM as defined in clocks.h (config II default).
- *   -- called from SRAM, or Flash (using temp SRAM stack).
- *********************************************************************************/
-void prcm_init(void)
-{
-       u32 div;
-       void (*f_lock_pll) (u32, u32, u32, u32);
-       extern void *_end_vect, *_start;
-
-       f_lock_pll = (void *)((u32)&_end_vect - (u32)&_start + SRAM_VECT_CODE);
-
-       __raw_writel(0, CM_FCLKEN1_CORE);          /* stop all clocks to reduce ringing */
-       __raw_writel(0, CM_FCLKEN2_CORE);          /* may not be necessary */
-       __raw_writel(0, CM_ICLKEN1_CORE);
-       __raw_writel(0, CM_ICLKEN2_CORE);
-
-       __raw_writel(DPLL_OUT, CM_CLKSEL2_PLL); /* set DPLL out */
-       __raw_writel(MPU_DIV, CM_CLKSEL_MPU);   /* set MPU divider */
-       __raw_writel(DSP_DIV, CM_CLKSEL_DSP);   /* set dsp and iva dividers */
-       __raw_writel(GFX_DIV, CM_CLKSEL_GFX);   /* set gfx dividers */
-
-       div = BUS_DIV;
-       __raw_writel(div, CM_CLKSEL1_CORE);/* set L3/L4/USB/Display/Vlnc/SSi dividers */
-       sdelay(1000);
-
-       if(running_in_sram()){
-               /* If running fully from SRAM this is OK.  The Flash bus drops out for just a little.
-               * but then comes back.  If running from Flash this sequence kills you, thus you need
-               * to run it using CONFIG_PARTIAL_SRAM.
-               */
-               __raw_writel(MODE_BYPASS_FAST, CM_CLKEN_PLL); /* go to bypass, fast relock */
-               wait_on_value(BIT0|BIT1, BIT0, CM_IDLEST_CKGEN, LDELAY); /* wait till in bypass */
-               sdelay(1000);
-               /* set clock selection and dpll dividers. */
-               __raw_writel(DPLL_VAL, CM_CLKSEL1_PLL);  /* set pll for target rate */
-               __raw_writel(COMMIT_DIVIDERS, PRCM_CLKCFG_CTRL); /* commit dividers */
-               sdelay(10000);
-               __raw_writel(DPLL_LOCK, CM_CLKEN_PLL); /* enable dpll */
-               sdelay(10000);
-               wait_on_value(BIT0|BIT1, BIT1, CM_IDLEST_CKGEN, LDELAY);  /*wait for dpll lock */
-       }else if(running_in_flash()){
-               /* if running from flash, need to jump to small relocated code area in SRAM.
-                * This is the only safe spot to do configurations from.
-                */
-               (*f_lock_pll)(PRCM_CLKCFG_CTRL, CM_CLKEN_PLL, DPLL_LOCK, CM_IDLEST_CKGEN);
-       }
-
-       __raw_writel(DPLL_LOCK|APLL_LOCK, CM_CLKEN_PLL);   /* enable apll */
-       wait_on_value(BIT8, BIT8, CM_IDLEST_CKGEN, LDELAY);     /* wait for apll lock */
-       sdelay(1000);
-}
-
-/**************************************************************************
- * make_cs1_contiguous() - for es2 and above remap cs1 behind cs0 to allow
- *  command line mem=xyz use all memory with out discontigious support
- *  compiled in.  Could do it at the ATAG, but there really is two banks...
- * Called as part of 2nd phase DDR init.
- **************************************************************************/
-void make_cs1_contiguous(void)
-{
-       u32 size, a_add_low, a_add_high;
-
-       size = get_sdr_cs_size(SDRC_CS0_OSET);
-       size /= SZ_32M;  /* find size to offset CS1 */
-       a_add_high = (size & 3) << 8;   /* set up low field */
-       a_add_low = (size & 0x3C) >> 2; /* set up high field */
-       __raw_writel((a_add_high|a_add_low),SDRC_CS_CFG);
-
-}
-
-/********************************************************
- *  mem_ok() - test used to see if timings are correct
- *             for a part. Helps in gussing which part
- *             we are currently using.
- *******************************************************/
-u32 mem_ok(void)
-{
-       u32 val1, val2;
-       u32 pattern = 0x12345678;
-
-       __raw_writel(0x0,OMAP2420_SDRC_CS0+0x400);   /* clear pos A */
-       __raw_writel(pattern, OMAP2420_SDRC_CS0);    /* pattern to pos B */
-       __raw_writel(0x0,OMAP2420_SDRC_CS0+4);       /* remove pattern off the bus */
-       val1 = __raw_readl(OMAP2420_SDRC_CS0+0x400); /* get pos A value */
-       val2 = __raw_readl(OMAP2420_SDRC_CS0);       /* get val2 */
-
-       if ((val1 != 0) || (val2 != pattern))        /* see if pos A value changed*/
-               return(0);
-       else
-               return(1);
-}
-
-
-/********************************************************
- *  sdrc_init() - init the sdrc chip selects CS0 and CS1
- *  - early init routines, called from flash or
- *  SRAM.
- *******************************************************/
-void sdrc_init(void)
-{
-       #define EARLY_INIT 1
-       do_sdrc_init(SDRC_CS0_OSET, EARLY_INIT);  /* only init up first bank here */
-}
-
-/*************************************************************************
- * do_sdrc_init(): initialize the SDRAM for use.
- *  -called from low level code with stack only.
- *  -code sets up SDRAM timing and muxing for 2422 or 2420.
- *  -optimal settings can be placed here, or redone after i2c
- *      inspection of board info
- *
- *  This is a bit ugly, but should handle all memory moduels
- *   used with the H4. The first time though this code from s_init()
- *   we configure the first chip select.  Later on we come back and
- *   will configure the 2nd chip select if it exists.
- *
- **************************************************************************/
-void do_sdrc_init(u32 offset, u32 early)
-{
-       u32 cpu, dllen=0, rev, common=0, cs0=0, pmask=0, pass_type, mtype;
-       sdrc_data_t *sdata;      /* do not change type */
-       u32 a, b, r;
-
-       static const sdrc_data_t sdrc_2422 =
-       {
-               H4_2422_SDRC_SHARING, H4_2422_SDRC_MDCFG_0_DDR, 0 , H4_2422_SDRC_ACTIM_CTRLA_0,
-               H4_2422_SDRC_ACTIM_CTRLB_0, H4_2422_SDRC_RFR_CTRL, H4_2422_SDRC_MR_0_DDR,
-               0, H4_2422_SDRC_DLLAB_CTRL
-       };
-       static const sdrc_data_t sdrc_2420 =
-       {
-               H4_2420_SDRC_SHARING, H4_2420_SDRC_MDCFG_0_DDR, H4_2420_SDRC_MDCFG_0_SDR,
-               H4_2420_SDRC_ACTIM_CTRLA_0, H4_2420_SDRC_ACTIM_CTRLB_0,
-               H4_2420_SDRC_RFR_CTRL, H4_2420_SDRC_MR_0_DDR, H4_2420_SDRC_MR_0_SDR,
-               H4_2420_SDRC_DLLAB_CTRL
-       };
-
-       if (offset == SDRC_CS0_OSET)
-               cs0 = common = 1;  /* int regs shared between both chip select */
-
-       cpu = get_cpu_type();
-       rev = get_cpu_rev();
-
-       /* warning generated, though code generation is correct. this may bite later,
-        * but is ok for now. there is only so much C code you can do on stack only
-        * operation.
-        */
-       if (cpu == CPU_2422){
-               sdata = (sdrc_data_t *)&sdrc_2422;
-               pass_type = STACKED;
-       } else{
-               sdata = (sdrc_data_t *)&sdrc_2420;
-               pass_type = IP_DDR;
-       }
-
-       __asm__ __volatile__("": : :"memory");  /* limit compiler scope */
-
-       if (!early && (((mtype = get_mem_type()) == DDR_COMBO)||(mtype == DDR_STACKED))) {
-               if(mtype == DDR_COMBO){
-                       pmask = BIT2;/* combo part has a shared CKE signal, can't use feature */
-                       pass_type = COMBO_DDR; /* CS1 config */
-                       __raw_writel((__raw_readl(SDRC_POWER)) & ~pmask, SDRC_POWER);
-               }
-               if(rev != CPU_2420_2422_ES1)    /* for es2 and above smooth things out */
-                       make_cs1_contiguous();
-       }
-
-next_mem_type:
-       if (common) {   /* do a SDRC reset between types to clear regs*/
-               __raw_writel(SOFTRESET, SDRC_SYSCONFIG);        /* reset sdrc */
-               wait_on_value(BIT0, BIT0, SDRC_STATUS, 12000000);/* wait till reset done set */
-               __raw_writel(0, SDRC_SYSCONFIG);                /* clear soft reset */
-               __raw_writel(sdata->sdrc_sharing, SDRC_SHARING);
-#ifdef POWER_SAVE
-               __raw_writel(__raw_readl(SMS_SYSCONFIG)|SMART_IDLE, SMS_SYSCONFIG);
-               __raw_writel(sdata->sdrc_sharing|SMART_IDLE, SDRC_SHARING);
-               __raw_writel((__raw_readl(SDRC_POWER)|BIT6), SDRC_POWER);
-#endif
-       }
-
-       if ((pass_type == IP_DDR) || (pass_type == STACKED)) /* (IP ddr-CS0),(2422-CS0/CS1) */
-               __raw_writel(sdata->sdrc_mdcfg_0_ddr, SDRC_MCFG_0+offset);
-       else if (pass_type == COMBO_DDR){ /* (combo-CS0/CS1) */
-               __raw_writel(H4_2420_COMBO_MDCFG_0_DDR,SDRC_MCFG_0+offset);
-       } else if (pass_type == IP_SDR){ /* ip sdr-CS0 */
-               __raw_writel(sdata->sdrc_mdcfg_0_sdr, SDRC_MCFG_0+offset);
-       }
-
-       a = sdata->sdrc_actim_ctrla_0;
-       b = sdata->sdrc_actim_ctrlb_0;
-       r = sdata->sdrc_dllab_ctrl;
-
-       /* work around ES1 DDR issues */
-       if((pass_type != IP_SDR) && (rev == CPU_2420_2422_ES1)){
-               a = H4_242x_SDRC_ACTIM_CTRLA_0_ES1;
-               b = H4_242x_SDRC_ACTIM_CTRLB_0_ES1;
-               r = H4_242x_SDRC_RFR_CTRL_ES1;
-       }
-
-       if (cs0) {
-               __raw_writel(a, SDRC_ACTIM_CTRLA_0);
-               __raw_writel(b, SDRC_ACTIM_CTRLB_0);
-       } else {
-               __raw_writel(a, SDRC_ACTIM_CTRLA_1);
-               __raw_writel(b, SDRC_ACTIM_CTRLB_1);
-       }
-       __raw_writel(r, SDRC_RFR_CTRL+offset);
-
-       /* init sequence for mDDR/mSDR using manual commands (DDR is a bit different) */
-       __raw_writel(CMD_NOP, SDRC_MANUAL_0+offset);
-       sdelay(5000);  /* susposed to be 100us per design spec for mddr/msdr */
-       __raw_writel(CMD_PRECHARGE, SDRC_MANUAL_0+offset);
-       __raw_writel(CMD_AUTOREFRESH, SDRC_MANUAL_0+offset);
-       __raw_writel(CMD_AUTOREFRESH, SDRC_MANUAL_0+offset);
-
-       /*
-        * CSx SDRC Mode Register
-        * Burst length = (4 - DDR) (2-SDR)
-        * Serial mode
-        * CAS latency = x
-        */
-       if(pass_type == IP_SDR)
-               __raw_writel(sdata->sdrc_mr_0_sdr, SDRC_MR_0+offset);
-       else
-               __raw_writel(sdata->sdrc_mr_0_ddr, SDRC_MR_0+offset);
-
-       /* NOTE: ES1 242x _BUG_ DLL + External Bandwidth fix*/
-       if (rev == CPU_2420_2422_ES1){
-               dllen = (BIT0|BIT3); /* es1 clear both bit0 and bit3 */
-               __raw_writel((__raw_readl(SMS_CLASS_ARB0)|BURSTCOMPLETE_GROUP7)
-                       ,SMS_CLASS_ARB0);/* enable bust complete for lcd */
-       }
-       else
-               dllen = BIT0|BIT1; /* es2, clear bit0, and 1 (set phase to 72) */
-
-       /* enable & load up DLL with good value for 75MHz, and set phase to 90
-        * ES1 recommends 90 phase, ES2 recommends 72 phase.
-        */
-       if (common && (pass_type != IP_SDR)) {
-               __raw_writel(sdata->sdrc_dllab_ctrl, SDRC_DLLA_CTRL);
-               __raw_writel(sdata->sdrc_dllab_ctrl & ~(BIT2|dllen), SDRC_DLLA_CTRL);
-               __raw_writel(sdata->sdrc_dllab_ctrl, SDRC_DLLB_CTRL);
-               __raw_writel(sdata->sdrc_dllab_ctrl & ~(BIT2|dllen) , SDRC_DLLB_CTRL);
-       }
-       sdelay(90000);
-
-       if(mem_ok())
-               return; /* STACKED, other configued type */
-       ++pass_type; /* IPDDR->COMBODDR->IPSDR for CS0 */
-       goto next_mem_type;
-}
-
-/*****************************************************
- * gpmc_init(): init gpmc bus
- * Init GPMC for x16, MuxMode (SDRAM in x32).
- * This code can only be executed from SRAM or SDRAM.
- *****************************************************/
-void gpmc_init(void)
-{
-       u32 mux=0, mtype, mwidth, rev, tval;
-
-       rev  = get_cpu_rev();
-       if (rev == CPU_2420_2422_ES1)
-               tval = 1;
-       else
-               tval = 0;  /* disable bit switched meaning */
-
-       /* global settings */
-       __raw_writel(0x10, GPMC_SYSCONFIG);     /* smart idle */
-       __raw_writel(0x0, GPMC_IRQENABLE);      /* isr's sources masked */
-       __raw_writel(tval, GPMC_TIMEOUT_CONTROL);/* timeout disable */
-#ifdef CONFIG_SYS_NAND_BOOT
-       __raw_writel(0x001, GPMC_CONFIG);       /* set nWP, disable limited addr */
-#else
-       __raw_writel(0x111, GPMC_CONFIG);       /* set nWP, disable limited addr */
-#endif
-
-       /* discover bus connection from sysboot */
-       if (is_gpmc_muxed() == GPMC_MUXED)
-               mux = BIT9;
-       mtype = get_gpmc0_type();
-       mwidth = get_gpmc0_width();
-
-       /* setup cs0 */
-       __raw_writel(0x0, GPMC_CONFIG7_0);      /* disable current map */
-       sdelay(1000);
-
-#ifdef CONFIG_SYS_NAND_BOOT
-       __raw_writel(H4_24XX_GPMC_CONFIG1_0|mtype|mwidth, GPMC_CONFIG1_0);
-#else
-       __raw_writel(H4_24XX_GPMC_CONFIG1_0|mux|mtype|mwidth, GPMC_CONFIG1_0);
-#endif
-
-#ifdef PRCM_CONFIG_III
-       __raw_writel(H4_24XX_GPMC_CONFIG2_0, GPMC_CONFIG2_0);
-#endif
-       __raw_writel(H4_24XX_GPMC_CONFIG3_0, GPMC_CONFIG3_0);
-       __raw_writel(H4_24XX_GPMC_CONFIG4_0, GPMC_CONFIG4_0);
-#ifdef PRCM_CONFIG_III
-       __raw_writel(H4_24XX_GPMC_CONFIG5_0, GPMC_CONFIG5_0);
-       __raw_writel(H4_24XX_GPMC_CONFIG6_0, GPMC_CONFIG6_0);
-#endif
-       __raw_writel(H4_24XX_GPMC_CONFIG7_0, GPMC_CONFIG7_0);/* enable new mapping */
-       sdelay(2000);
-
-       /* setup cs1 */
-       __raw_writel(0, GPMC_CONFIG7_1); /* disable any mapping */
-       sdelay(1000);
-       __raw_writel(H4_24XX_GPMC_CONFIG1_1|mux, GPMC_CONFIG1_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG2_1, GPMC_CONFIG2_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG3_1, GPMC_CONFIG3_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG4_1, GPMC_CONFIG4_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG5_1, GPMC_CONFIG5_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG6_1, GPMC_CONFIG6_1);
-       __raw_writel(H4_24XX_GPMC_CONFIG7_1, GPMC_CONFIG7_1); /* enable mapping */
-       sdelay(2000);
-}
diff --git a/board/ti/omap2420h4/omap2420h4.c b/board/ti/omap2420h4/omap2420h4.c
deleted file mode 100644 (file)
index 532e989..0000000
+++ /dev/null
@@ -1,867 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@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 <netdev.h>
-#include <asm/arch/omap2420.h>
-#include <asm/io.h>
-#include <asm/arch/bits.h>
-#include <asm/arch/mux.h>
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/sys_info.h>
-#include <asm/arch/mem.h>
-#include <i2c.h>
-#include <asm/mach-types.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-void wait_for_command_complete(unsigned int wd_base);
-
-/*******************************************************
- * Routine: delay
- * Description: spinning delay to use before udelay works
- ******************************************************/
-static inline void delay (unsigned long loops)
-{
-       __asm__ volatile ("1:\n" "subs %0, %1, #1\n"
-               "bne 1b":"=r" (loops):"0" (loops));
-}
-
-/*****************************************
- * Routine: board_init
- * Description: Early hardware init.
- *****************************************/
-int board_init (void)
-{
-       gpmc_init(); /* in SRAM or SDRM, finish GPMC */
-
-       gd->bd->bi_arch_number = MACH_TYPE_OMAP_H4;             /* board id for linux */
-       gd->bd->bi_boot_params = (OMAP2420_SDRC_CS0+0x100);     /* adress of boot parameters */
-
-       return 0;
-}
-
-/**********************************************************
- * Routine: try_unlock_sram()
- * Description: If chip is GP type, unlock the SRAM for
- *  general use.
- ***********************************************************/
-void try_unlock_sram(void)
-{
-       /* if GP device unlock device SRAM for general use */
-       if (get_device_type() == GP_DEVICE) {
-               __raw_writel(0xFF, A_REQINFOPERM0);
-               __raw_writel(0xCFDE, A_READPERM0);
-               __raw_writel(0xCFDE, A_WRITEPERM0);
-       }
-}
-
-/**********************************************************
- * Routine: s_init
- * Description: Does early system init of muxing and clocks.
- * - Called path is with sram stack.
- **********************************************************/
-void s_init(void)
-{
-       int in_sdram = running_in_sdram();
-
-       watchdog_init();
-       set_muxconf_regs();
-       delay(100);
-       try_unlock_sram();
-
-       if(!in_sdram)
-               prcm_init();
-
-       peripheral_enable();
-       icache_enable();
-       if (!in_sdram)
-               sdrc_init();
-}
-
-/*******************************************************
- * Routine: misc_init_r
- * Description: Init ethernet (done here so udelay works)
- ********************************************************/
-int misc_init_r (void)
-{
-       ether_init(); /* better done here so timers are init'ed */
-       return(0);
-}
-
-/****************************************
- * Routine: watchdog_init
- * Description: Shut down watch dogs
- *****************************************/
-void watchdog_init(void)
-{
-       /* There are 4 watch dogs.  1 secure, and 3 general purpose.
-       * The ROM takes care of the secure one. Of the 3 GP ones,
-       * 1 can reset us directly, the other 2 only generate MPU interrupts.
-       */
-       __raw_writel(WD_UNLOCK1 ,WD2_BASE+WSPR);
-       wait_for_command_complete(WD2_BASE);
-       __raw_writel(WD_UNLOCK2 ,WD2_BASE+WSPR);
-
-#if MPU_WD_CLOCKED /* value 0x10 stick on aptix, BIT4 polarity seems oppsite*/
-       __raw_writel(WD_UNLOCK1 ,WD3_BASE+WSPR);
-       wait_for_command_complete(WD3_BASE);
-       __raw_writel(WD_UNLOCK2 ,WD3_BASE+WSPR);
-
-       __raw_writel(WD_UNLOCK1 ,WD4_BASE+WSPR);
-       wait_for_command_complete(WD4_BASE);
-       __raw_writel(WD_UNLOCK2 ,WD4_BASE+WSPR);
-#endif
-}
-
-/******************************************************
- * Routine: wait_for_command_complete
- * Description: Wait for posting to finish on watchdog
- ******************************************************/
-void wait_for_command_complete(unsigned int wd_base)
-{
-       int pending = 1;
-       do {
-               pending = __raw_readl(wd_base+WWPS);
-       } while (pending);
-}
-
-/*******************************************************************
- * Routine:ether_init
- * Description: take the Ethernet controller out of reset and wait
- *                for the EEPROM load to complete.
- ******************************************************************/
-void ether_init (void)
-{
-#ifdef CONFIG_LAN91C96
-       int cnt = 20;
-
-       __raw_writeb(0x3,OMAP2420_CTRL_BASE+0x10a); /*protect->gpio95 */
-
-       __raw_writew(0x0, LAN_RESET_REGISTER);
-       do {
-               __raw_writew(0x1, LAN_RESET_REGISTER);
-               udelay (100);
-               if (cnt == 0)
-                       goto h4reset_err_out;
-               --cnt;
-       } while (__raw_readw(LAN_RESET_REGISTER) != 0x1);
-
-       cnt = 20;
-
-       do {
-               __raw_writew(0x0, LAN_RESET_REGISTER);
-               udelay (100);
-               if (cnt == 0)
-                       goto h4reset_err_out;
-               --cnt;
-       } while (__raw_readw(LAN_RESET_REGISTER) != 0x0000);
-       udelay (1000);
-
-       *((volatile unsigned char *) ETH_CONTROL_REG) &= ~0x01;
-       udelay (1000);
-
-       h4reset_err_out:
-       return;
-#endif
-}
-
-/**********************************************
- * Routine: dram_init
- * Description: sets uboots idea of sdram size
- **********************************************/
-int dram_init(void)
-{
-       unsigned int size0=0,size1=0;
-       u32 mtype, btype;
-       u8 chg_on = 0x5; /* enable charge of back up battery */
-       u8 vmode_on = 0x8C;
-       #define NOT_EARLY 0
-
-       i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); /* need this a bit early */
-
-       btype = get_board_type();
-       mtype = get_mem_type();
-
-       display_board_info(btype);
-       if (btype == BOARD_H4_MENELAUS){
-               update_mux(btype,mtype); /* combo part on menelaus */
-               i2c_write(I2C_MENELAUS, 0x20, 1, &chg_on, 1); /*fix POR reset bug */
-               i2c_write(I2C_MENELAUS, 0x2, 1, &vmode_on, 1); /* VCORE change on VMODE */
-       }
-
-       if ((mtype == DDR_COMBO) || (mtype == DDR_STACKED)) {
-               do_sdrc_init(SDRC_CS1_OSET, NOT_EARLY); /* init other chip select */
-       }
-       size0 = get_sdr_cs_size(SDRC_CS0_OSET);
-       size1 = get_sdr_cs_size(SDRC_CS1_OSET);
-
-       gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, size0 + size1);
-
-       return 0;
-}
-
-void dram_init_banksize(void)
-{
-       unsigned int size0, size1;
-       u32 rev;
-
-       rev = get_cpu_rev();
-       size0 = get_sdr_cs_size(SDRC_CS0_OSET);
-       size1 = get_sdr_cs_size(SDRC_CS1_OSET);
-
-       if(rev == CPU_2420_2422_ES1) /* ES1's 128MB remap granularity isn't worth doing */
-               gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
-       else /* ES2 and above can remap at 32MB granularity */
-               gd->bd->bi_dram[1].start = PHYS_SDRAM_1+size0;
-       gd->bd->bi_dram[1].size = size1;
-
-       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
-       gd->bd->bi_dram[0].size = size0;
-}
-
-/**********************************************************
- * Routine: set_muxconf_regs
- * Description: Setting up the configuration Mux registers
- *              specific to the hardware
- *********************************************************/
-void set_muxconf_regs (void)
-{
-       muxSetupSDRC();
-       muxSetupGPMC();
-       muxSetupUsb0();
-       muxSetupUart3();
-       muxSetupI2C1();
-       muxSetupUART1();
-       muxSetupLCD();
-       muxSetupCamera();
-       muxSetupMMCSD();
-       muxSetupTouchScreen();
-       muxSetupHDQ();
-}
-
-/*****************************************************************
- * Routine: peripheral_enable
- * Description: Enable the clks & power for perifs (GPT2, UART1,...)
- ******************************************************************/
-void peripheral_enable(void)
-{
-       unsigned int v, if_clks=0, func_clks=0;
-
-       /* Enable GP2 timer.*/
-       if_clks |= BIT4;
-       func_clks |= BIT4;
-       v = __raw_readl(CM_CLKSEL2_CORE) | 0x4; /* Sys_clk input OMAP2420_GPT2 */
-       __raw_writel(v, CM_CLKSEL2_CORE);
-       __raw_writel(0x1, CM_CLKSEL_WKUP);
-
-#ifdef CONFIG_SYS_NS16550
-       /* Enable UART1 clock */
-       func_clks |= BIT21;
-       if_clks |= BIT21;
-#endif
-       v = __raw_readl(CM_ICLKEN1_CORE) | if_clks;     /* Interface clocks on */
-       __raw_writel(v,CM_ICLKEN1_CORE );
-       v = __raw_readl(CM_FCLKEN1_CORE) | func_clks; /* Functional Clocks on */
-       __raw_writel(v, CM_FCLKEN1_CORE);
-       delay(1000);
-
-#ifndef KERNEL_UPDATED
-       {
-#define V1 0xffffffff
-#define V2 0x00000007
-
-               __raw_writel(V1, CM_FCLKEN1_CORE);
-               __raw_writel(V2, CM_FCLKEN2_CORE);
-               __raw_writel(V1, CM_ICLKEN1_CORE);
-               __raw_writel(V1, CM_ICLKEN2_CORE);
-       }
-#endif
-}
-
-/****************************************
- * Routine: muxSetupUsb0   (ostboot)
- * Description: Setup usb muxing
- *****************************************/
-void muxSetupUsb0(void)
-{
-       volatile uint8   *MuxConfigReg;
-       volatile uint32  *otgCtrlReg;
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_PUEN;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_VP;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_VM;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_RCV;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_TXEN;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_SE0;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_USB0_DAT;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       /* setup for USB VBus detection */
-       otgCtrlReg = (volatile uint32 *)USB_OTG_CTRL;
-       *otgCtrlReg |= 0x00040000; /* bit 18 */
-}
-
-/****************************************
- * Routine: muxSetupUart3   (ostboot)
- * Description: Setup uart3 muxing
- *****************************************/
-void muxSetupUart3(void)
-{
-       volatile uint8 *MuxConfigReg;
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_UART3_TX_IRTX;
-       *MuxConfigReg &= (uint8)(~0x1F);
-
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_UART3_RX_IRRX;
-       *MuxConfigReg &= (uint8)(~0x1F);
-}
-
-/****************************************
- * Routine: muxSetupI2C1   (ostboot)
- * Description: Setup i2c muxing
- *****************************************/
-void muxSetupI2C1(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* I2C1 Clock pin configuration, PIN = M19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_I2C1_SCL;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* I2C1 Data pin configuration, PIN = L15 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_I2C1_SDA;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* Pull-up required on data line */
-       /* external pull-up already present. */
-       /* *MuxConfigReg |= 0x18 ;*/ /* Mode = 0, PullTypeSel=PU, PullUDEnable=Enabled */
-}
-
-/****************************************
- * Routine: muxSetupUART1  (ostboot)
- * Description: Set up uart1 muxing
- *****************************************/
-void muxSetupUART1(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* UART1_CTS pin configuration, PIN = D21 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_UART1_CTS;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* UART1_RTS pin configuration, PIN = H21 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_UART1_RTS;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* UART1_TX pin configuration, PIN = L20 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_UART1_TX;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* UART1_RX pin configuration, PIN = T21 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_UART1_RX;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-}
-
-/****************************************
- * Routine: muxSetupLCD   (ostboot)
- * Description: Setup lcd muxing
- *****************************************/
-void muxSetupLCD(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* LCD_D0 pin configuration, PIN = Y7  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D0;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D1 pin configuration, PIN = P10 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D1;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D2 pin configuration, PIN = V8  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D2;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D3 pin configuration, PIN = Y8  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D3;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D4 pin configuration, PIN = W8  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D4;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D5 pin configuration, PIN = R10 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D5;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D6 pin configuration, PIN = Y9  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D6;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D7 pin configuration, PIN = V9  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D7;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D8 pin configuration, PIN = W9  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D8;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D9 pin configuration, PIN = P11 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D9;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D10 pin configuration, PIN = V10 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D10;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D11 pin configuration, PIN = Y10 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D11;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D12 pin configuration, PIN = W10 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D12;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D13 pin configuration, PIN = R11 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D13;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D14 pin configuration, PIN = V11 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D14;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D15 pin configuration, PIN = W11 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D15;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D16 pin configuration, PIN = P12 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D16;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_D17 pin configuration, PIN = R12 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_D17;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_PCLK pin configuration,   PIN = W6   */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_PCLK;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_VSYNC pin configuration,  PIN = V7  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_VSYNC;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_HSYNC pin configuration,  PIN = Y6  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_HSYNC;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* LCD_ACBIAS pin configuration, PIN = W7 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_DSS_ACBIAS;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-}
-
-/****************************************
- * Routine: muxSetupCamera  (ostboot)
- * Description: Setup camera muxing
- *****************************************/
-void muxSetupCamera(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* CAMERA_RSTZ  pin configuration, PIN = Y16 */
-       /* CAM_RST is connected through the I2C IO expander.*/
-       /* MuxConfigReg = (volatile unsigned char *), CONTROL_PADCONF_SYS_NRESWARM*/
-       /* *MuxConfigReg = 0x00 ; / * Mode = 0, PUPD=Disabled   */
-
-       /* CAMERA_XCLK  pin configuration, PIN = U3 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_XCLK;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_LCLK  pin configuration, PIN = V5 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_LCLK;
-       *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_VSYNC pin configuration, PIN = U2 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_VS,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_HSYNC pin configuration, PIN = T3 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_HS,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT0 pin configuration, PIN = T4 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D0,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT1 pin configuration, PIN = V2 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D1,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT2 pin configuration, PIN = V3 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D2,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT3 pin configuration, PIN = U4 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D3,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT4 pin configuration, PIN = W2 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D4,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT5 pin configuration, PIN = V4 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D5,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT6 pin configuration, PIN = W3 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D6,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT7 pin configuration, PIN = Y2 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D7,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT8 pin configuration, PIN = Y4 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D8,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* CAMERA_DAT9 pin configuration, PIN = V6 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_CAM_D9,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-}
-
-/****************************************
- * Routine: muxSetupMMCSD (ostboot)
- * Description: set up MMC muxing
- *****************************************/
-void muxSetupMMCSD(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* SDMMC_CLKI pin configuration,  PIN = H15 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_CLKI,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_CLKO pin configuration,  PIN = G19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_CLKO,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_CMD pin configuration,   PIN = H18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_CMD,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-       /* External pull-ups are present. */
-       /* *MuxConfigReg |= 0x18 ; #/ PullUDEnable=Enabled, PullTypeSel=PU */
-
-       /* SDMMC_DAT0 pin configuration,  PIN = F20 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT0,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-       /* External pull-ups are present. */
-       /* *MuxConfigReg |= 0x18 ; #/ PullUDEnable=Enabled, PullTypeSel=PU */
-
-       /* SDMMC_DAT1 pin configuration,  PIN = H14 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT1,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-       /* External pull-ups are present. */
-       /* *MuxConfigReg |= 0x18 ; #/ PullUDEnable=Enabled, PullTypeSel=PU */
-
-       /* SDMMC_DAT2 pin configuration,  PIN = E19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT2,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-       /* External pull-ups are present. */
-       /* *MuxConfigReg |= 0x18 ; #/ PullUDEnable=Enabled, PullTypeSel=PU */
-
-       /* SDMMC_DAT3 pin configuration,  PIN = D19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT3,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-       /* External pull-ups are present. */
-       /* *MuxConfigReg |= 0x18 ; #/ PullUDEnable=Enabled, PullTypeSel=PU */
-
-       /* SDMMC_DDIR0 pin configuration, PIN = F19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT_DIR0,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_DDIR1 pin configuration, PIN = E20 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT_DIR1,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_DDIR2 pin configuration, PIN = F18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT_DIR2,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_DDIR3 pin configuration, PIN = E18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_DAT_DIR3,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SDMMC_CDIR pin configuration,  PIN = G18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MMC_CMD_DIR,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* MMC_CD pin configuration,      PIN = B3  ---2420IP ONLY---*/
-       /* MMC_CD for 2422IP=K1 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SDRC_A14,
-                                  *MuxConfigReg = 0x03 ; /* Mode = 3, PUPD=Disabled */
-
-       /* MMC_WP pin configuration,      PIN = B4  */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SDRC_A13,
-                                  *MuxConfigReg = 0x03 ; /* Mode = 3, PUPD=Disabled */
-}
-
-/******************************************
- * Routine: muxSetupTouchScreen (ostboot)
- * Description:  Set up touch screen muxing
- *******************************************/
-void muxSetupTouchScreen(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* SPI1_CLK pin configuration,  PIN = U18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SPI1_CLK,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SPI1_MOSI pin configuration, PIN = V20 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SPI1_SIMO,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SPI1_MISO pin configuration, PIN = T18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SPI1_SOMI,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* SPI1_nCS0 pin configuration, PIN = U19 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_SPI1_NCS0,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-
-       /* PEN_IRQ pin configuration,   PIN = P20 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_MCBSP1_FSR,
-                                  *MuxConfigReg = 0x03 ; /* Mode = 3, PUPD=Disabled */
-}
-
-/****************************************
- * Routine: muxSetupHDQ (ostboot)
- * Description: setup 1wire mux
- *****************************************/
-void muxSetupHDQ(void)
-{
-       volatile unsigned char  *MuxConfigReg;
-
-       /* HDQ_SIO pin configuration,  PIN = N18 */
-       MuxConfigReg = (volatile unsigned char *)CONTROL_PADCONF_HDQ_SIO,
-                                  *MuxConfigReg = 0x00 ; /* Mode = 0, PUPD=Disabled */
-}
-
-/***************************************************************
- * Routine: muxSetupGPMC (ostboot)
- * Description: Configures balls which cam up in protected mode
- ***************************************************************/
-void muxSetupGPMC(void)
-{
-       volatile uint8 *MuxConfigReg;
-       volatile unsigned int *MCR = (volatile unsigned int *)0x4800008C;
-
-       /* gpmc_io_dir */
-       *MCR = 0x19000000;
-
-       /* NOR FLASH CS0 */
-       /* signal - Gpmc_clk; pin - J4; offset - 0x0088; mode - 0; Byte-3       Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_GPMC_D2_BYTE3,
-                                  *MuxConfigReg = 0x00 ;
-
-       /* signal - Gpmc_iodir; pin - n2; offset - 0x008C; mode - 1; Byte-3     Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_GPMC_NCS0_BYTE3,
-                                  *MuxConfigReg = 0x01 ;
-
-       /* MPDB(Multi Port Debug Port) CS1 */
-       /* signal - gpmc_ncs1; pin - N8; offset - 0x008C; mode - 0; Byte-1      Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_GPMC_NCS0_BYTE1,
-                                  *MuxConfigReg = 0x00 ;
-
-       /* signal - Gpmc_ncs2; pin - E2; offset - 0x008C; mode - 0; Byte-2      Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_GPMC_NCS0_BYTE2,
-                                  *MuxConfigReg = 0x00 ;
-}
-
-/****************************************************************
- * Routine: muxSetupSDRC  (ostboot)
- * Description: Configures balls which come up in protected mode
- ****************************************************************/
-void muxSetupSDRC(void)
-{
-       volatile uint8 *MuxConfigReg;
-
-       /* signal - sdrc_ncs1; pin - C12; offset - 0x00A0; mode - 0; Byte-1     Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_SDRC_NCS0_BYTE1,
-                                  *MuxConfigReg = 0x00 ;
-
-       /* signal - sdrc_a12; pin - D11; offset - 0x0030; mode - 0; Byte-2      Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_SDRC_A14_BYTE2,
-                                  *MuxConfigReg = 0x00 ;
-
-       /* signal - sdrc_cke1; pin - B13; offset - 0x00A0; mode - 0; Byte-3     Pull/up - N/A */
-       MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_SDRC_NCS0_BYTE3,
-                                  *MuxConfigReg = 0x00;
-
-       if (get_cpu_type() == CPU_2422) {
-               MuxConfigReg = (volatile uint8 *)CONTROL_PADCONF_SDRC_A14_BYTE0,
-                                          *MuxConfigReg = 0x1b;
-       }
-}
-
-/*****************************************************************************
- * Routine: update_mux()
- * Description: Update balls which are different beween boards.  All should be
- *              updated to match functionaly.  However, I'm only updating ones
- *              which I'll be using for now.  When power comes into play they
- *              all need updating.
- *****************************************************************************/
-void update_mux(u32 btype,u32 mtype)
-{
-       u32 cpu, base = OMAP2420_CTRL_BASE;
-       cpu = get_cpu_type();
-
-       if (btype == BOARD_H4_MENELAUS) {
-               if (cpu == CPU_2420) {
-                       /* PIN = B3,  GPIO.0->KBR5,      mode 3,  (pun?),-DO-*/
-                       __raw_writeb(0x3, base+0x30);
-                       /* PIN = B13, GPIO.38->KBC6,     mode 3,  (pun?)-DO-*/
-                       __raw_writeb(0x3, base+0xa3);
-                       /* PIN = F1, GPIO.25->HSUSBxx    mode 3,  (for external HS USB)*/
-                       /* PIN = H1, GPIO.26->HSUSBxx    mode 3,  (for external HS USB)*/
-                       /* PIN = K1, GPMC_ncs6           mode 0,  (on board nand access)*/
-                       /* PIN = L2, GPMC_ncs67          mode 0,  (for external HS USB)*/
-                       /* PIN = M1 (HSUSBOTG) */
-                       /* PIN = P1, GPIO.35->MEN_POK    mode 3,  (menelaus powerok)-DO-*/
-                       __raw_writeb(0x3, base+0x9d);
-                       /* PIN = U32, (WLAN_CLKREQ) */
-                       /* PIN = Y11, WLAN */
-                       /* PIN = AA4, GPIO.15->KBC2,     mode 3,  -DO- */
-                       __raw_writeb(0x3, base+0xe7);
-                       /* PIN = AA8, mDOC */
-                       /* PIN = AA10, BT */
-                       /* PIN = AA13, WLAN */
-                       /* PIN = M18 GPIO.96->MMC2_WP    mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x10e);
-                       /* PIN = N19 GPIO.98->WLAN_INT   mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x110);
-                       /* PIN = J15 HHUSB */
-                       /* PIN = H19 HSUSB */
-                       /* PIN = W13, P13, R13, W16 ... */
-                       /* PIN = V12 GPIO.25->I2C_CAMEN  mode 3   -DO- */
-                       __raw_writeb(0x3, base+0xde);
-                       /* PIN = W19 sys_nirq->MENELAUS_INT mode 0 -DO- */
-                       __raw_writeb(0x0, base+0x12c);
-                       /* PIN = AA17->sys_clkreq        mode 0   -DO- */
-                       __raw_writeb(0x0, base+0x136);
-               } else if (cpu == CPU_2422) {
-                       /* PIN = B3,  GPIO.0->nc,        mode 3,  set above (pun?)*/
-                       /* PIN = B13, GPIO.cke1->nc,     mode 0,  set above, (pun?)*/
-                       /* PIN = F1, GPIO.25->HSUSBxx    mode 3,  (for external HS USB)*/
-                       /* PIN = H1, GPIO.26->HSUSBxx    mode 3,  (for external HS USB)*/
-                       /* PIN = K1, GPMC_ncs6           mode 0,  (on board nand access)*/
-                       __raw_writeb(0x0, base+0x92);
-                       /* PIN = L2, GPMC_ncs67          mode 0,  (for external HS USB)*/
-                       /* PIN = M1 (HSUSBOTG) */
-                       /* PIN = P1, GPIO.35->MEN_POK    mode 3,  (menelaus powerok)-DO-*/
-                       __raw_writeb(0x3, base+0x10c);
-                       /* PIN = U32, (WLAN_CLKREQ) */
-                       /* PIN = AA4, GPIO.15->KBC2,     mode 3,  -DO- */
-                       __raw_writeb(0x3, base+0x30);
-                       /* PIN = AA8, mDOC */
-                       /* PIN = AA10, BT */
-                       /* PIN = AA12, WLAN */
-                       /* PIN = M18 GPIO.96->MMC2_WP    mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x10e);
-                       /* PIN = N19 GPIO.98->WLAN_INT   mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x110);
-                       /* PIN = J15 HHUSB */
-                       /* PIN = H19 HSUSB */
-                       /* PIN = W13, P13, R13, W16 ... */
-                       /* PIN = V12 GPIO.25->I2C_CAMEN  mode 3   -DO- */
-                       __raw_writeb(0x3, base+0xde);
-                       /* PIN = W19 sys_nirq->MENELAUS_INT mode 0 -DO- */
-                       __raw_writeb(0x0, base+0x12c);
-                       /* PIN = AA17->sys_clkreq        mode 0   -DO- */
-                       __raw_writeb(0x0, base+0x136);
-               }
-
-       } else if (btype == BOARD_H4_SDP) {
-               if (cpu == CPU_2420) {
-                       /* PIN = B3,  GPIO.0->nc         mode 3,  set above (pun?)*/
-                       /* PIN = B13, GPIO.cke1->nc,     mode 0,  set above, (pun?)*/
-                       /* Pin = Y11 VLNQ */
-                       /* Pin = AA4 VLNQ */
-                       /* Pin = AA6 VLNQ */
-                       /* Pin = AA8 VLNQ */
-                       /* Pin = AA10 VLNQ */
-                       /* Pin = AA12 VLNQ */
-                       /* PIN = M18 GPIO.96->KBR5       mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x10e);
-                       /* PIN = N19 GPIO.98->KBC6       mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x110);
-                       /* PIN = J15 MDOC_nDMAREQ */
-                       /* PIN = H19 GPIO.100->KBC2      mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x114);
-                       /* PIN = W13, V12, P13, R13, W19, W16 ... */
-                       /* PIN = AA17 sys_clkreq->bt_clk_req  mode 0  */
-               } else if (cpu == CPU_2422) {
-                       /* PIN = B3,  GPIO.0->MMC_CD,    mode 3,  set above */
-                       /* PIN = B13, GPIO.38->wlan_int, mode 3,  (pun?)*/
-                       /* Pin = Y11 VLNQ */
-                       /* Pin = AA4 VLNQ */
-                       /* Pin = AA6 VLNQ */
-                       /* Pin = AA8 VLNQ */
-                       /* Pin = AA10 VLNQ */
-                       /* Pin = AA12 VLNQ */
-                       /* PIN = M18 GPIO.96->KBR5       mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x10e);
-                       /* PIN = N19 GPIO.98->KBC6       mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x110);
-                       /* PIN = J15 MDOC_nDMAREQ */
-                       /* PIN = H19 GPIO.100->KBC2      mode 3   -DO- */
-                       __raw_writeb(0x3, base+0x114);
-                       /* PIN = W13, V12, P13, R13, W19, W16 ... */
-                       /* PIN = AA17 sys_clkreq->bt_clk_req  mode 0 */
-               }
-       }
-}
-
-#ifdef CONFIG_CMD_NET
-int board_eth_init(bd_t *bis)
-{
-       int rc = 0;
-#ifdef CONFIG_LAN91C96
-       rc = lan91c96_initialize(0, CONFIG_LAN91C96_BASE);
-#endif
-       return rc;
-}
-#endif
diff --git a/board/ti/omap2420h4/sys_info.c b/board/ti/omap2420h4/sys_info.c
deleted file mode 100644 (file)
index b12011e..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments, <www.ti.com>
- * Richard Woodruff <r-woodruff2@ti.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/omap2420.h>
-#include <asm/io.h>
-#include <asm/arch/bits.h>
-#include <asm/arch/mem.h>  /* get mem tables */
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/sys_info.h>
-#include <i2c.h>
-
-/**************************************************************************
- * get_prod_id() - get id info from chips
- ***************************************************************************/
-static u32 get_prod_id(void)
-{
-       u32 p;
-       p = __raw_readl(PRODUCTION_ID); /* get production ID */
-       return((p & CPU_242X_PID_MASK) >> 16);
-}
-
-/**************************************************************************
- * get_cpu_type() - low level get cpu type
- * - no C globals yet.
- * - just looking to say if this is a 2422 or 2420 or ...
- * - to start with we will look at switch settings..
- * - 2422 id's same as 2420 for ES1 will rely on H4 board characteristics
- *   (mux for 2420, non-mux for 2422).
- ***************************************************************************/
-u32 get_cpu_type(void)
-{
-       u32 v;
-
-       switch(get_prod_id()){
-               case 1:;/* 2420 */
-               case 2: return(CPU_2420); break; /* 2420 pop */
-               case 4: return(CPU_2422); break;
-               case 8: return(CPU_2423); break;
-               default: break;  /* early 2420/2422's unmarked */
-       }
-
-       v = __raw_readl(TAP_IDCODE_REG);
-       v &= CPU_24XX_ID_MASK;
-       if (v == CPU_2420_CHIPID) {       /* currently 2420 and 2422 have same id */
-               if (is_gpmc_muxed() == GPMC_MUXED)        /* if mux'ed */
-                       return(CPU_2420);
-               else
-                       return(CPU_2422);
-       } else
-               return(CPU_2420); /* don't know, say 2420 */
-}
-
-/******************************************
- * get_cpu_rev(void) - extract version info
- ******************************************/
-u32 get_cpu_rev(void)
-{
-       u32 v;
-       v = __raw_readl(TAP_IDCODE_REG);
-       v = v >> 28;
-       return(v+1);  /* currently 2422 and 2420 match up */
-}
-/****************************************************
- * is_mem_sdr() - return 1 if mem type in use is SDR
- ****************************************************/
-u32 is_mem_sdr(void)
-{
-       volatile u32 *burst = (volatile u32 *)(SDRC_MR_0+SDRC_CS0_OSET);
-       if(*burst == H4_2420_SDRC_MR_0_SDR)
-               return(1);
-       return(0);
-}
-
-/***********************************************************
- * get_mem_type() - identify type of mDDR part used.
- * 2422 uses stacked DDR, 2 parts CS0/CS1.
- * 2420 may have 1 or 2, no good way to know...only init 1...
- * when eeprom data is up we can select 1 more.
- *************************************************************/
-u32 get_mem_type(void)
-{
-       u32 cpu, sdr = is_mem_sdr();
-
-       cpu = get_cpu_type();
-       if (cpu == CPU_2422 || cpu == CPU_2423)
-               return(DDR_STACKED);
-
-       if(get_prod_id() == 0x2)
-               return(XDR_POP);
-
-       if (get_board_type() == BOARD_H4_MENELAUS)
-               if(sdr)
-                       return(SDR_DISCRETE);
-               else
-                       return(DDR_COMBO);
-       else
-               if(sdr) /* SDP + SDR kit */
-                       return(SDR_DISCRETE);
-               else
-                       return(DDR_DISCRETE); /* origional SDP */
-}
-
-/***********************************************************************
- * get_cs0_size() - get size of chip select 0/1
- ************************************************************************/
-u32 get_sdr_cs_size(u32 offset)
-{
-       u32 size;
-       size = __raw_readl(SDRC_MCFG_0+offset) >> 8; /* get ram size field */
-       size &= 0x2FF;   /* remove unwanted bits */
-       size *= SZ_2M;   /* find size in MB */
-       return(size);
-}
-
-/***********************************************************************
- * get_board_type() - get board type based on current production stats.
- *  --- NOTE: 2 I2C EEPROMs will someday be populated with proper info.
- *      when they are available we can get info from there.  This should
- *      be correct of all known boards up until today.
- ************************************************************************/
-u32 get_board_type(void)
-{
-       if (i2c_probe(I2C_MENELAUS) == 0)
-               return(BOARD_H4_MENELAUS);
-       else
-               return(BOARD_H4_SDP);
-}
-
-/******************************************************************
- * get_sysboot_value() - get init word settings (dip switch on h4)
- ******************************************************************/
-inline u32 get_sysboot_value(void)
-{
-       return(0x00000FFF & __raw_readl(CONTROL_STATUS));
-}
-
-/***************************************************************************
- *  get_gpmc0_base() - Return current address hardware will be
- *     fetching from. The below effectively gives what is correct, its a bit
- *   mis-leading compared to the TRM.  For the most general case the mask
- *   needs to be also taken into account this does work in practice.
- *   - for u-boot we currently map:
- *       -- 0 to nothing,
- *       -- 4 to flash
- *       -- 8 to enent
- *       -- c to wifi
- ****************************************************************************/
-u32 get_gpmc0_base(void)
-{
-       u32 b;
-
-       b = __raw_readl(GPMC_CONFIG7_0);
-       b &= 0x1F;       /* keep base [5:0] */
-       b = b << 24; /* ret 0x0b000000 */
-       return(b);
-}
-
-/*****************************************************************
- *  is_gpmc_muxed() - tells if address/data lines are multiplexed
- *****************************************************************/
-u32 is_gpmc_muxed(void)
-{
-       u32 mux;
-       mux = get_sysboot_value();
-       if ((mux & (BIT0 | BIT1 | BIT2 | BIT3)) == (BIT0 | BIT2 | BIT3))
-               return(GPMC_MUXED); /* NAND Boot mode */
-       if (mux & BIT1)    /* if mux'ed */
-               return(GPMC_MUXED);
-       else
-               return(GPMC_NONMUXED);
-}
-
-/************************************************************************
- *  get_gpmc0_type() - read sysboot lines to see type of memory attached
- ************************************************************************/
-u32 get_gpmc0_type(void)
-{
-       u32 type;
-       type = get_sysboot_value();
-       if ((type & (BIT3|BIT2)) == (BIT3|BIT2))
-               return(TYPE_NAND);
-       else
-               return(TYPE_NOR);
-}
-
-/*******************************************************************
- * get_gpmc0_width() - See if bus is in x8 or x16 (mainly for nand)
- *******************************************************************/
-u32 get_gpmc0_width(void)
-{
-       u32 width;
-       width = get_sysboot_value();
-       if ((width & 0xF) == (BIT3|BIT2))
-               return(WIDTH_8BIT);
-       else
-               return(WIDTH_16BIT);
-}
-
-/*********************************************************************
- * wait_on_value() - common routine to allow waiting for changes in
- *   volatile regs.
- *********************************************************************/
-u32 wait_on_value(u32 read_bit_mask, u32 match_value, u32 read_addr, u32 bound)
-{
-       u32 i = 0, val;
-       do {
-               ++i;
-               val = __raw_readl(read_addr) & read_bit_mask;
-               if (val == match_value)
-                       return(1);
-               if (i==bound)
-                       return(0);
-       } while (1);
-}
-
-/*********************************************************************
- *  display_board_info() - print banner with board info.
- *********************************************************************/
-void display_board_info(u32 btype)
-{
-       static const char cpu_2420 [] = "2420";   /* cpu type */
-       static const char cpu_2422 [] = "2422";
-       static const char cpu_2423 [] = "2423";
-       static const char db_men [] = "Menelaus"; /* board type */
-       static const char db_ip [] = "IP";
-       static const char mem_sdr [] = "mSDR";    /* memory type */
-       static const char mem_ddr [] = "mDDR";
-       static const char t_tst [] = "TST";         /* security level */
-       static const char t_emu [] = "EMU";
-       static const char t_hs [] = "HS";
-       static const char t_gp [] = "GP";
-       static const char unk [] = "?";
-
-       const char *cpu_s, *db_s, *mem_s, *sec_s;
-       u32 cpu, rev, sec;
-
-       rev = get_cpu_rev();
-       cpu = get_cpu_type();
-       sec = get_device_type();
-
-       if(is_mem_sdr())
-               mem_s = mem_sdr;
-       else
-               mem_s = mem_ddr;
-
-       if(cpu == CPU_2423)
-               cpu_s = cpu_2423;
-       else if (cpu == CPU_2422)
-               cpu_s = cpu_2422;
-       else
-               cpu_s = cpu_2420;
-
-       if(btype ==  BOARD_H4_MENELAUS)
-               db_s = db_men;
-       else
-               db_s = db_ip;
-
-       switch(sec){
-               case TST_DEVICE: sec_s = t_tst; break;
-               case EMU_DEVICE: sec_s = t_emu; break;
-               case HS_DEVICE:  sec_s = t_hs; break;
-               case GP_DEVICE:  sec_s = t_gp; break;
-               default: sec_s = unk;
-       }
-
-       printf("OMAP%s-%s revision %d\n", cpu_s, sec_s, rev-1);
-       printf("TI H4 SDP Base Board + %s Daughter Board + %s \n", db_s, mem_s);
-}
-
-/*************************************************************************
- * get_board_rev() - setup to pass kernel board revision information
- *          0 = 242x IP platform (first 2xx boards)
- *          1 = 242x Menelaus platfrom.
- *************************************************************************/
-u32 get_board_rev(void)
-{
-       u32 rev = 0;
-       u32 btype = get_board_type();
-
-       if (btype == BOARD_H4_MENELAUS){
-               rev = 1;
-       }
-       return(rev);
-}
-
-/********************************************************
- *  get_base(); get upper addr of current execution
- *******************************************************/
-u32 get_base(void)
-{
-       u32  val;
-       __asm__ __volatile__("mov %0, pc \n" : "=r" (val) : : "memory");
-       val &= 0xF0000000;
-       val >>= 28;
-       return(val);
-}
-
-/********************************************************
- *  get_base2(); get 2upper addr of current execution
- *******************************************************/
-u32 get_base2(void)
-{
-       u32  val;
-       __asm__ __volatile__("mov %0, pc \n" : "=r" (val) : : "memory");
-       val &= 0xFF000000;
-       val >>= 24;
-       return(val);
-}
-
-/********************************************************
- *  running_in_flash() - tell if currently running in
- *   flash.
- *******************************************************/
-u32 running_in_flash(void)
-{
-       if (get_base() < 4)
-               return(1);  /* in flash */
-       return(0); /* running in SRAM or SDRAM */
-}
-
-/********************************************************
- *  running_in_sram() - tell if currently running in
- *   sram.
- *******************************************************/
-u32 running_in_sram(void)
-{
-       if (get_base() == 4)
-               return(1);  /* in SRAM */
-       return(0); /* running in FLASH or SDRAM */
-}
-/********************************************************
- *  running_in_sdram() - tell if currently running in
- *   flash.
- *******************************************************/
-u32 running_in_sdram(void)
-{
-       if (get_base() > 4)
-               return(1);  /* in sdram */
-       return(0); /* running in SRAM or FLASH */
-}
-
-/*************************************************************
- *  running_from_internal_boot() - am I a signed NOR image.
- *************************************************************/
-u32 running_from_internal_boot(void)
-{
-       u32 v, base;
-
-       v = get_sysboot_value() & BIT3;
-       base = get_base2();
-       /* if running at mask rom flash address and
-        * sysboot3 says this was an internal boot
-        */
-       if ((base == 0x08) && v)
-               return(1);
-       else
-               return(0);
-}
-
-/*************************************************************
- *  get_device_type(): tell if GP/HS/EMU/TST
- *************************************************************/
-u32 get_device_type(void)
-{
-       int mode;
-       mode = __raw_readl(CONTROL_STATUS) & (BIT10|BIT9|BIT8);
-       return(mode >>= 8);
-}
index 55337c09d5e8999ecc6addd7b72916a83b34bd6e..90046e896e6c29cd30c81c929084e59214eef950 100644 (file)
@@ -23,7 +23,7 @@
  * MA 02111-1307 USA
  */
 #include <common.h>
-#include <twl6035.h>
+#include <palmas.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mmc_host_def.h>
 
@@ -63,30 +63,34 @@ int board_eth_init(bd_t *bis)
  */
 int misc_init_r(void)
 {
-#ifdef CONFIG_TWL6035_POWER
-       twl6035_init_settings();
+#ifdef CONFIG_PALMAS_POWER
+       palmas_init_settings();
 #endif
        return 0;
 }
 
 void set_muxconf_regs_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_essential,
                   sizeof(core_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_essential,
                   sizeof(wkup_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 }
 
 void set_muxconf_regs_non_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_non_essential,
                   sizeof(core_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_non_essential,
                   sizeof(wkup_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 }
index cab059863d34459326bfc2bbbeaf135dc0a8d373..90ae29e7c64bc761b0a5b0a2993cf44ecf6db882 100644 (file)
@@ -24,7 +24,7 @@
 #include <common.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mmc_host_def.h>
-#include <asm/arch/clocks.h>
+#include <asm/arch/clock.h>
 #include <asm/arch/gpio.h>
 #include <asm/gpio.h>
 
@@ -82,6 +82,12 @@ int misc_init_r(void)
        if (omap_revision() == OMAP4430_ES1_0)
                return 0;
 
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       if (omap_revision() >= OMAP4460_ES1_0 ||
+               omap_revision() <= OMAP4460_ES1_1)
+               setenv("board_name", strcat(CONFIG_SYS_BOARD, "-es"));
+#endif
+
        gpio_direction_input(PANDA_ULPI_PHY_TYPE_GPIO);
        phy_type = gpio_get_value(PANDA_ULPI_PHY_TYPE_GPIO);
 
@@ -133,16 +139,18 @@ int misc_init_r(void)
 
 void set_muxconf_regs_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_essential,
                   sizeof(core_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_essential,
                   sizeof(wkup_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 
        if (omap_revision() >= OMAP4460_ES1_0)
-               do_set_mux(CONTROL_PADCONF_WKUP,
+               do_set_mux((*ctrl)->control_padconf_wkup_base,
                                 wkup_padconf_array_essential_4460,
                                 sizeof(wkup_padconf_array_essential_4460) /
                                 sizeof(struct pad_conf_entry));
@@ -150,27 +158,29 @@ void set_muxconf_regs_essential(void)
 
 void set_muxconf_regs_non_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_non_essential,
                   sizeof(core_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 
        if (omap_revision() < OMAP4460_ES1_0)
-               do_set_mux(CONTROL_PADCONF_CORE,
+               do_set_mux((*ctrl)->control_padconf_core_base,
                                core_padconf_array_non_essential_4430,
                                sizeof(core_padconf_array_non_essential_4430) /
                                sizeof(struct pad_conf_entry));
        else
-               do_set_mux(CONTROL_PADCONF_CORE,
+               do_set_mux((*ctrl)->control_padconf_core_base,
                                core_padconf_array_non_essential_4460,
                                sizeof(core_padconf_array_non_essential_4460) /
                                sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_non_essential,
                   sizeof(wkup_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 
        if (omap_revision() < OMAP4460_ES1_0)
-               do_set_mux(CONTROL_PADCONF_WKUP,
+               do_set_mux((*ctrl)->control_padconf_wkup_base,
                                wkup_padconf_array_non_essential_4430,
                                sizeof(wkup_padconf_array_non_essential_4430) /
                                sizeof(struct pad_conf_entry));
index 4c1a4f7e78625b83b8ab7f79de6865f644a331e0..5dd1ba3cb43739e3c196f899474a3692bc6ed034 100644 (file)
@@ -72,16 +72,18 @@ int misc_init_r(void)
 
 void set_muxconf_regs_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_essential,
                   sizeof(core_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_essential,
                   sizeof(wkup_padconf_array_essential) /
                   sizeof(struct pad_conf_entry));
 
        if (omap_revision() >= OMAP4460_ES1_0)
-               do_set_mux(CONTROL_PADCONF_WKUP,
+               do_set_mux((*ctrl)->control_padconf_wkup_base,
                                 wkup_padconf_array_essential_4460,
                                 sizeof(wkup_padconf_array_essential_4460) /
                                 sizeof(struct pad_conf_entry));
@@ -89,16 +91,18 @@ void set_muxconf_regs_essential(void)
 
 void set_muxconf_regs_non_essential(void)
 {
-       do_set_mux(CONTROL_PADCONF_CORE, core_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_core_base,
+                  core_padconf_array_non_essential,
                   sizeof(core_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 
-       do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_non_essential,
+       do_set_mux((*ctrl)->control_padconf_wkup_base,
+                  wkup_padconf_array_non_essential,
                   sizeof(wkup_padconf_array_non_essential) /
                   sizeof(struct pad_conf_entry));
 
        if (omap_revision() < OMAP4460_ES1_0) {
-               do_set_mux(CONTROL_PADCONF_WKUP,
+               do_set_mux((*ctrl)->control_padconf_wkup_base,
                        wkup_padconf_array_non_essential_4430,
                        sizeof(wkup_padconf_array_non_essential_4430) /
                        sizeof(struct pad_conf_entry));
index 446e36b8446ccfe03255141b764179ec5053350f..4759b167a46ab2f51d55c0b92fa41e599627c2bd 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <common.h>
+#include <cpsw.h>
 #include <errno.h>
 #include <spl.h>
 #include <asm/arch/cpu.h>
@@ -39,6 +40,8 @@ static struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
 static struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
 #endif
 
+static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
+
 /* UART Defines */
 #ifdef CONFIG_SPL_BUILD
 #define UART_RESET             (0x1 << 1)
@@ -146,11 +149,23 @@ static const struct ddr_data evm_ddr2_data = {
 void s_init(void)
 {
 #ifdef CONFIG_SPL_BUILD
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+#ifdef CONFIG_SPL_BUILD
+       save_omap_boot_params();
+#endif
+
        /* WDT1 is already running when the bootloader gets control
         * Disable it to avoid "random" resets
         */
        wdt_disable();
 
+       /* Enable timer */
+       timer_init();
+
        /* Setup the PLLs and the clocks for the peripherals */
        pll_init();
 
@@ -163,6 +178,9 @@ void s_init(void)
        /* Set MMC pins */
        enable_mmc1_pin_mux();
 
+       /* Set Ethernet pins */
+       enable_enet_pin_mux();
+
        /* Enable UART */
        uart_enable();
 
@@ -196,3 +214,69 @@ int board_mmc_init(bd_t *bis)
        return 0;
 }
 #endif
+
+#ifdef CONFIG_DRIVER_TI_CPSW
+static void cpsw_control(int enabled)
+{
+       /* VTP can be added here */
+
+       return;
+}
+
+static struct cpsw_slave_data cpsw_slaves[] = {
+       {
+               .slave_reg_ofs  = 0x50,
+               .sliver_reg_ofs = 0x700,
+               .phy_id         = 1,
+       },
+       {
+               .slave_reg_ofs  = 0x90,
+               .sliver_reg_ofs = 0x740,
+               .phy_id         = 0,
+       },
+};
+
+static struct cpsw_platform_data cpsw_data = {
+       .mdio_base              = CPSW_MDIO_BASE,
+       .cpsw_base              = CPSW_BASE,
+       .mdio_div               = 0xff,
+       .channels               = 8,
+       .cpdma_reg_ofs          = 0x100,
+       .slaves                 = 1,
+       .slave_data             = cpsw_slaves,
+       .ale_reg_ofs            = 0x600,
+       .ale_entries            = 1024,
+       .host_port_reg_ofs      = 0x28,
+       .hw_stats_reg_ofs       = 0x400,
+       .mac_control            = (1 << 5),
+       .control                = cpsw_control,
+       .host_port_num          = 0,
+       .version                = CPSW_CTRL_VERSION_1,
+};
+#endif
+
+int board_eth_init(bd_t *bis)
+{
+       uint8_t mac_addr[6];
+       uint32_t mac_hi, mac_lo;
+
+       if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
+               printf("<ethaddr> not set. Reading from E-fuse\n");
+               /* try reading mac address from efuse */
+               mac_lo = readl(&cdev->macid0l);
+               mac_hi = readl(&cdev->macid0h);
+               mac_addr[0] = mac_hi & 0xFF;
+               mac_addr[1] = (mac_hi & 0xFF00) >> 8;
+               mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
+               mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
+               mac_addr[4] = mac_lo & 0xFF;
+               mac_addr[5] = (mac_lo & 0xFF00) >> 8;
+
+               if (is_valid_ether_addr(mac_addr))
+                       eth_setenv_enetaddr("ethaddr", mac_addr);
+               else
+                       printf("Unable to read MAC address. Set <ethaddr>\n");
+       }
+
+       return cpsw_register(&cpsw_data);
+}
index 40f8710c8966a066ecf349385caf3ea61252bc90..6aebec62d4a4d078cb566d93853b27a1841df80f 100644 (file)
@@ -3,5 +3,6 @@
 
 void enable_uart0_pin_mux(void);
 void enable_mmc1_pin_mux(void);
+void enable_enet_pin_mux(void);
 
 #endif /* _EVM_H */
index 137acb4523362fb97bc26075b2cbf7d4e039cc1b..fd9f3645115814b6f94842de28c2c9c858af9a16 100644 (file)
@@ -40,6 +40,36 @@ static struct module_pin_mux mmc1_pin_mux[] = {
        {-1},
 };
 
+static struct module_pin_mux enet_pin_mux[] = {
+       {OFFSET(pincntl232), MODE(0x01)},               /* EMAC_RMREFCLK */
+       {OFFSET(pincntl233), PULLUP_EN | MODE(0x01)},   /* MDCLK */
+       {OFFSET(pincntl234), PULLUP_EN | MODE(0x01)},   /* MDIO */
+       {OFFSET(pincntl235), MODE(0x01)},               /* EMAC[0]_MTCLK */
+       {OFFSET(pincntl236), MODE(0x01)},               /* EMAC[0]_MCOL */
+       {OFFSET(pincntl237), MODE(0x01)},               /* EMAC[0]_MCRS */
+       {OFFSET(pincntl238), MODE(0x01)},               /* EMAC[0]_MRXER */
+       {OFFSET(pincntl239), MODE(0x01)},               /* EMAC[0]_MRCLK */
+       {OFFSET(pincntl240), MODE(0x01)},               /* EMAC[0]_MRXD[0] */
+       {OFFSET(pincntl241), MODE(0x01)},               /* EMAC[0]_MRXD[1] */
+       {OFFSET(pincntl242), MODE(0x01)},               /* EMAC[0]_MRXD[2] */
+       {OFFSET(pincntl243), MODE(0x01)},               /* EMAC[0]_MRXD[3] */
+       {OFFSET(pincntl244), MODE(0x01)},               /* EMAC[0]_MRXD[4] */
+       {OFFSET(pincntl245), MODE(0x01)},               /* EMAC[0]_MRXD[5] */
+       {OFFSET(pincntl246), MODE(0x01)},               /* EMAC[0]_MRXD[6] */
+       {OFFSET(pincntl247), MODE(0x01)},               /* EMAC[0]_MRXD[7] */
+       {OFFSET(pincntl248), MODE(0x01)},               /* EMAC[0]_MRXDV */
+       {OFFSET(pincntl249), MODE(0x01)},               /* EMAC[0]_GMTCLK */
+       {OFFSET(pincntl250), MODE(0x01)},               /* EMAC[0]_MTXD[0] */
+       {OFFSET(pincntl251), MODE(0x01)},               /* EMAC[0]_MTXD[1] */
+       {OFFSET(pincntl252), MODE(0x01)},               /* EMAC[0]_MTXD[2] */
+       {OFFSET(pincntl253), MODE(0x01)},               /* EMAC[0]_MTXD[3] */
+       {OFFSET(pincntl254), MODE(0x01)},               /* EMAC[0]_MTXD[4] */
+       {OFFSET(pincntl255), MODE(0x01)},               /* EMAC[0]_MTXD[5] */
+       {OFFSET(pincntl256), MODE(0x01)},               /* EMAC[0]_MTXD[6] */
+       {OFFSET(pincntl257), MODE(0x01)},               /* EMAC[0]_MTXD[7] */
+       {OFFSET(pincntl258), MODE(0x01)},               /* EMAC[0]_MTXEN */
+};
+
 void enable_uart0_pin_mux(void)
 {
        configure_module_pin_mux(uart0_pin_mux);
@@ -49,3 +79,8 @@ void enable_mmc1_pin_mux(void)
 {
        configure_module_pin_mux(mmc1_pin_mux);
 }
+
+void enable_enet_pin_mux(void)
+{
+       configure_module_pin_mux(enet_pin_mux);
+}
index a471fec23dd791d2198495a4a3a5aff4afc3f57a..9cc758a17302ad61841ea434efd11b555beb470d 100644 (file)
 #include <common.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/mx5x_pins.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx51.h>
 #include <asm/gpio.h>
 #include <asm/arch/sys_proto.h>
 #include <i2c.h>
@@ -68,85 +67,67 @@ void hw_watchdog_reset(void)
        int val;
 
        /* toggle watchdog trigger pin */
-       val = gpio_get_value(66);
+       val = gpio_get_value(IMX_GPIO_NR(3, 2));
        val = val ? 0 : 1;
-       gpio_set_value(66, val);
+       gpio_set_value(IMX_GPIO_NR(3, 2), val);
 }
 #endif
 
 static void init_drive_strength(void)
 {
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_PKEDDR, PAD_CTL_DDR_INPUT_CMOS);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_PKEADDR, PAD_CTL_PKE_ENABLE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDRAPKS, PAD_CTL_PUE_KEEPER);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDRAPUS, PAD_CTL_100K_PU);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_SR_A1, PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_A0, PAD_CTL_DRV_HIGH);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_A1, PAD_CTL_DRV_HIGH);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_RAS,
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_CAS,
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_PKEDDR, PAD_CTL_PKE_ENABLE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDRPKS, PAD_CTL_PUE_KEEPER);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_HYSDDR0, PAD_CTL_HYS_NONE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_HYSDDR1, PAD_CTL_HYS_NONE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_HYSDDR2, PAD_CTL_HYS_NONE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_HYSDDR3, PAD_CTL_HYS_NONE);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_SR_B0, PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_SR_B1, PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_SR_B2, PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDR_SR_B4, PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DDRPUS, PAD_CTL_100K_PU);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_INMODE1, PAD_CTL_DDR_INPUT_CMOS);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DRAM_B0, PAD_CTL_DRV_MEDIUM);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DRAM_B1, PAD_CTL_DRV_MEDIUM);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DRAM_B2, PAD_CTL_DRV_MEDIUM);
-       mxc_iomux_set_pad(MX51_PIN_CTL_GRP_DRAM_B4, PAD_CTL_DRV_MEDIUM);
-
-       /* Setting pad options */
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDWE,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDCKE0,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDCKE1,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDCLK,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDQS0,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDQS1,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDQS2,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_SDQS3,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_CS0,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_CS1,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_DQM0,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_DQM1,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_DQM2,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_CTL_DRAM_DQM3,
-               PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
-               PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST);
+       static const iomux_v3_cfg_t ddr_pads[] = {
+               NEW_PAD_CTRL(MX51_GRP_PKEDDR, 0),
+               NEW_PAD_CTRL(MX51_GRP_PKEADDR, PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX51_GRP_DDRAPKS, 0),
+               NEW_PAD_CTRL(MX51_GRP_DDRAPUS, PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX51_GRP_DDR_SR_A1, PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_DDR_A0, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX51_GRP_DDR_A1, PAD_CTL_DSE_HIGH),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_RAS__DRAM_RAS,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_CAS__DRAM_CAS,
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_PKEDDR, PAD_CTL_PKE),
+               NEW_PAD_CTRL(MX51_GRP_DDRPKS, 0),
+               NEW_PAD_CTRL(MX51_GRP_HYSDDR0, 0),
+               NEW_PAD_CTRL(MX51_GRP_HYSDDR1, 0),
+               NEW_PAD_CTRL(MX51_GRP_HYSDDR2, 0),
+               NEW_PAD_CTRL(MX51_GRP_HYSDDR3, 0),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B0, PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B1, PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B2, PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_SR_B4, PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_GRP_DDRPUS, PAD_CTL_PUS_100K_UP),
+               NEW_PAD_CTRL(MX51_GRP_INMODE1, 0),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_B0, PAD_CTL_DSE_MED),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_B1, PAD_CTL_DSE_MED),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_B2, PAD_CTL_DSE_MED),
+               NEW_PAD_CTRL(MX51_GRP_DRAM_B4, PAD_CTL_DSE_MED),
+
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDWE__DRAM_SDWE, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDCKE0__DRAM_SDCKE0,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDCKE1__DRAM_SDCKE1,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDCLK__DRAM_SDCLK,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS0__DRAM_SDQS0,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS1__DRAM_SDQS1,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS2__DRAM_SDQS2,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_SDQS3__DRAM_SDQS3,
+                               MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_CS0__DRAM_CS0, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_CS1__DRAM_CS1, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_DQM0__DRAM_DQM0, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_DQM1__DRAM_DQM1, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_DQM2__DRAM_DQM2, MX51_GPIO_PAD_CTRL),
+               NEW_PAD_CTRL(MX51_PAD_DRAM_DQM3__DRAM_DQM3, MX51_GPIO_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
 }
 
 int dram_init(void)
@@ -170,134 +151,102 @@ static void setup_weim(void)
 
 static void setup_uart(void)
 {
-       unsigned int pad = PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
-                        PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST;
-       /* console RX on Pin EIM_D25 */
-       mxc_request_iomux(MX51_PIN_EIM_D25, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D25, pad);
-       /* console TX on Pin EIM_D26 */
-       mxc_request_iomux(MX51_PIN_EIM_D26, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D26, pad);
+       static const iomux_v3_cfg_t uart_pads[] = {
+               MX51_PAD_EIM_D25__UART3_RXD, /* console RX */
+               MX51_PAD_EIM_D26__UART3_TXD, /* console TX */
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
 #ifdef CONFIG_MXC_SPI
 void spi_io_init(void)
 {
-       /* 000: Select mux mode: ALT0 mux port: MOSI of instance: ecspi1 */
-       mxc_request_iomux(MX51_PIN_CSPI1_MOSI, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_MOSI,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
-
-       /* 000: Select mux mode: ALT0 mux port: MISO of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_MISO, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_MISO,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
-
-       /* 000: Select mux mode: ALT0 mux port: SS0 of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
-               PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
-
-       /*
-        * SS1 will be used as GPIO because of uninterrupted
-        * long SPI transmissions (GPIO4_25)
-        */
-       mxc_request_iomux(MX51_PIN_CSPI1_SS1, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SS1,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
-               PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
-
-       /* 000: Select mux mode: ALT0 mux port: SS2 of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_DI1_PIN11, IOMUX_CONFIG_ALT7);
-       mxc_iomux_set_pad(MX51_PIN_DI1_PIN11,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
-               PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
-
-       /* 000: Select mux mode: ALT0 mux port: SCLK of instance: ecspi1. */
-       mxc_request_iomux(MX51_PIN_CSPI1_SCLK, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_SCLK,
-               PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
+       static const iomux_v3_cfg_t spi_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI, PAD_CTL_HYS |
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_MISO__ECSPI1_MISO, PAD_CTL_HYS |
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_SS0__ECSPI1_SS0, PAD_CTL_HYS |
+                       PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_SS1__ECSPI1_SS1, PAD_CTL_HYS |
+                       PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_DI1_PIN11__ECSPI1_SS2, PAD_CTL_HYS |
+                       PAD_CTL_PKE | PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK, PAD_CTL_HYS |
+                               PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(spi_pads, ARRAY_SIZE(spi_pads));
 }
 
 static void reset_peripherals(int reset)
 {
+#ifdef CONFIG_VISION2_HW_1_0
+       static const iomux_v3_cfg_t fec_cfg_pads[] = {
+               /* RXD1 */
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB3__GPIO2_23, NO_PAD_CTRL),
+               /* RXD2 */
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS2__GPIO2_27, NO_PAD_CTRL),
+               /* RXD3 */
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS3__GPIO2_28, NO_PAD_CTRL),
+               /* RXER */
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS4__GPIO2_29, NO_PAD_CTRL),
+               /* COL */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__GPIO3_10, NO_PAD_CTRL),
+               /* RCLK */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__GPIO3_11, NO_PAD_CTRL),
+               /* RXD0 */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D9__GPIO3_31, NO_PAD_CTRL),
+       };
+
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS3__FEC_RDATA3, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS2__FEC_RDATA2, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_CTRL_2),
+               MX51_PAD_NANDF_D9__FEC_RDATA0,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__FEC_RX_CLK, MX51_PAD_CTRL_4),
+               MX51_PAD_EIM_CS4__FEC_RX_ER,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__FEC_COL, MX51_PAD_CTRL_4),
+       };
+#endif
+
        if (reset) {
 
                /* reset_n is on NANDF_D15 */
-               gpio_direction_output(89, 0);
+               gpio_direction_output(IMX_GPIO_NR(3, 25), 0);
 
 #ifdef CONFIG_VISION2_HW_1_0
                /*
                 * set FEC Configuration lines
                 * set levels of FEC config lines
                 */
-               gpio_direction_output(75, 0);
-               gpio_direction_output(74, 1);
-               gpio_direction_output(95, 1);
+               gpio_direction_output(IMX_GPIO_NR(3, 11), 0);
+               gpio_direction_output(IMX_GPIO_NR(3, 10), 1);
+               gpio_direction_output(IMX_GPIO_NR(3, 31), 1);
 
                /* set direction of FEC config lines */
-               gpio_direction_output(59, 0);
-               gpio_direction_output(60, 0);
-               gpio_direction_output(61, 0);
-               gpio_direction_output(55, 1);
-
-               /* FEC_RXD1 - sel GPIO (2-23) for configuration -> 1 */
-               mxc_request_iomux(MX51_PIN_EIM_EB3, IOMUX_CONFIG_ALT1);
-               /* FEC_RXD2 - sel GPIO (2-27) for configuration -> 0 */
-               mxc_request_iomux(MX51_PIN_EIM_CS2, IOMUX_CONFIG_ALT1);
-               /* FEC_RXD3 - sel GPIO (2-28) for configuration -> 0 */
-               mxc_request_iomux(MX51_PIN_EIM_CS3, IOMUX_CONFIG_ALT1);
-               /* FEC_RXER - sel GPIO (2-29) for configuration -> 0 */
-               mxc_request_iomux(MX51_PIN_EIM_CS4, IOMUX_CONFIG_ALT1);
-               /* FEC_COL  - sel GPIO (3-10) for configuration -> 1 */
-               mxc_request_iomux(MX51_PIN_NANDF_RB2, IOMUX_CONFIG_ALT3);
-               /* FEC_RCLK - sel GPIO (3-11) for configuration -> 0 */
-               mxc_request_iomux(MX51_PIN_NANDF_RB3, IOMUX_CONFIG_ALT3);
-               /* FEC_RXD0 - sel GPIO (3-31) for configuration -> 1 */
-               mxc_request_iomux(MX51_PIN_NANDF_D9, IOMUX_CONFIG_ALT3);
+               gpio_direction_output(IMX_GPIO_NR(2, 27), 0);
+               gpio_direction_output(IMX_GPIO_NR(2, 28), 0);
+               gpio_direction_output(IMX_GPIO_NR(2, 29), 0);
+               gpio_direction_output(IMX_GPIO_NR(2, 23), 1);
+
+               imx_iomux_v3_setup_multiple_pads(fec_cfg_pads,
+                                                ARRAY_SIZE(fec_cfg_pads));
 #endif
 
-               /*
-                * activate reset_n pin
-                * Select mux mode: ALT3 mux port: NAND D15
-                */
-               mxc_request_iomux(MX51_PIN_NANDF_D15, IOMUX_CONFIG_ALT3);
-               mxc_iomux_set_pad(MX51_PIN_NANDF_D15,
-                       PAD_CTL_DRV_VOT_HIGH | PAD_CTL_DRV_MAX);
+               /* activate reset_n pin */
+               imx_iomux_v3_setup_pad(
+                               NEW_PAD_CTRL(MX51_PAD_NANDF_D15__GPIO3_25,
+                                               PAD_CTL_DSE_MAX));
        } else {
                /* set FEC Control lines */
-               gpio_direction_input(89);
+               gpio_direction_input(IMX_GPIO_NR(3, 25));
                udelay(500);
 
 #ifdef CONFIG_VISION2_HW_1_0
-               /* FEC RDATA[3] */
-               mxc_request_iomux(MX51_PIN_EIM_CS3, IOMUX_CONFIG_ALT3);
-               mxc_iomux_set_pad(MX51_PIN_EIM_CS3, 0x180);
-
-               /* FEC RDATA[2] */
-               mxc_request_iomux(MX51_PIN_EIM_CS2, IOMUX_CONFIG_ALT3);
-               mxc_iomux_set_pad(MX51_PIN_EIM_CS2, 0x180);
-
-               /* FEC RDATA[1] */
-               mxc_request_iomux(MX51_PIN_EIM_EB3, IOMUX_CONFIG_ALT3);
-               mxc_iomux_set_pad(MX51_PIN_EIM_EB3, 0x180);
-
-               /* FEC RDATA[0] */
-               mxc_request_iomux(MX51_PIN_NANDF_D9, IOMUX_CONFIG_ALT2);
-               mxc_iomux_set_pad(MX51_PIN_NANDF_D9, 0x2180);
-
-               /* FEC RX_CLK */
-               mxc_request_iomux(MX51_PIN_NANDF_RB3, IOMUX_CONFIG_ALT1);
-               mxc_iomux_set_pad(MX51_PIN_NANDF_RB3, 0x2180);
-
-               /* FEC RX_ER */
-               mxc_request_iomux(MX51_PIN_EIM_CS4, IOMUX_CONFIG_ALT3);
-               mxc_iomux_set_pad(MX51_PIN_EIM_CS4, 0x180);
-
-               /* FEC COL */
-               mxc_request_iomux(MX51_PIN_NANDF_RB2, IOMUX_CONFIG_ALT1);
-               mxc_iomux_set_pad(MX51_PIN_NANDF_RB2, 0x2180);
+               imx_iomux_v3_setup_multiple_pads(fec_pads,
+                                                       ARRAY_SIZE(fec_pads));
 #endif
        }
 }
@@ -376,155 +325,94 @@ static void power_init_mx51(void)
 
 static void setup_gpios(void)
 {
-       unsigned int i;
-
-       /* CAM_SUP_DISn, GPIO1_7 */
-       mxc_request_iomux(MX51_PIN_GPIO1_7, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_7, 0x82);
+       static const iomux_v3_cfg_t gpio_pads_1[] = {
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_7__GPIO1_7, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* CAM_SUP_DISn */
+               NEW_PAD_CTRL(MX51_PAD_DI1_PIN12__GPIO3_1, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* DAB Display EN */
+               NEW_PAD_CTRL(MX51_PAD_DI1_PIN13__GPIO3_2, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* WDOG_TRIGGER */
+       };
+
+       static const iomux_v3_cfg_t gpio_pads_2[] = {
+               NEW_PAD_CTRL(MX51_PAD_DI1_D0_CS__GPIO3_3, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* Display2 TxEN */
+               NEW_PAD_CTRL(MX51_PAD_DI1_D1_CS__GPIO3_4, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* DAB Light EN */
+               NEW_PAD_CTRL(MX51_PAD_DISPB2_SER_DIN__GPIO3_5, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* AUDIO_MUTE */
+               NEW_PAD_CTRL(MX51_PAD_DISPB2_SER_DIO__GPIO3_6, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* SPARE_OUT */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D14__GPIO3_26, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* BEEPER_EN */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D13__GPIO3_27, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* POWER_OFF */
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D10__GPIO3_30, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* FRAM_WE */
+               NEW_PAD_CTRL(MX51_PAD_CSPI1_RDY__GPIO4_26, PAD_CTL_PKE |
+                               PAD_CTL_DSE_MED), /* EXPANSION_EN */
+               MX51_PAD_GPIO1_2__PWM1_PWMO,
+       };
 
-       /* DAB Display EN, GPIO3_1 */
-       mxc_request_iomux(MX51_PIN_DI1_PIN12, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DI1_PIN12, 0x82);
+       unsigned int i;
 
-       /* WDOG_TRIGGER, GPIO3_2 */
-       mxc_request_iomux(MX51_PIN_DI1_PIN13, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DI1_PIN13, 0x82);
+       imx_iomux_v3_setup_multiple_pads(gpio_pads_1, ARRAY_SIZE(gpio_pads_1));
 
        /* Now we need to trigger the watchdog */
        WATCHDOG_RESET();
 
-       /* Display2 TxEN, GPIO3_3 */
-       mxc_request_iomux(MX51_PIN_DI1_D0_CS, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DI1_D0_CS, 0x82);
-
-       /* DAB Light EN, GPIO3_4 */
-       mxc_request_iomux(MX51_PIN_DI1_D1_CS, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DI1_D1_CS, 0x82);
-
-       /* AUDIO_MUTE, GPIO3_5 */
-       mxc_request_iomux(MX51_PIN_DISPB2_SER_DIN, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DISPB2_SER_DIN, 0x82);
-
-       /* SPARE_OUT, GPIO3_6 */
-       mxc_request_iomux(MX51_PIN_DISPB2_SER_DIO, IOMUX_CONFIG_ALT4);
-       mxc_iomux_set_pad(MX51_PIN_DISPB2_SER_DIO, 0x82);
-
-       /* BEEPER_EN, GPIO3_26 */
-       mxc_request_iomux(MX51_PIN_NANDF_D14, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D14, 0x82);
-
-       /* POWER_OFF, GPIO3_27 */
-       mxc_request_iomux(MX51_PIN_NANDF_D13, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D13, 0x82);
-
-       /* FRAM_WE, GPIO3_30 */
-       mxc_request_iomux(MX51_PIN_NANDF_D10, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D10, 0x82);
-
-       /* EXPANSION_EN, GPIO4_26 */
-       mxc_request_iomux(MX51_PIN_CSPI1_RDY, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_CSPI1_RDY, 0x82);
-
-       /* PWM Output GPIO1_2 */
-       mxc_request_iomux(MX51_PIN_GPIO1_2, IOMUX_CONFIG_ALT1);
+       imx_iomux_v3_setup_multiple_pads(gpio_pads_2, ARRAY_SIZE(gpio_pads_2));
 
        /*
         * Set GPIO1_4 to high and output; it is used to reset
         * the system on reboot
         */
-       gpio_direction_output(4, 1);
+       gpio_direction_output(IMX_GPIO_NR(1, 4), 1);
 
-       gpio_direction_output(7, 0);
-       for (i = 65; i < 71; i++)
+       gpio_direction_output(IMX_GPIO_NR(1, 7), 0);
+       for (i = IMX_GPIO_NR(3, 1); i < IMX_GPIO_NR(3, 7); i++)
                gpio_direction_output(i, 0);
 
-       gpio_direction_output(94, 0);
+       gpio_direction_output(IMX_GPIO_NR(3, 30), 0);
 
        /* Set POWER_OFF high */
-       gpio_direction_output(91, 1);
+       gpio_direction_output(IMX_GPIO_NR(3, 27), 1);
 
-       gpio_direction_output(90, 0);
+       gpio_direction_output(IMX_GPIO_NR(3, 26), 0);
 
-       gpio_direction_output(122, 0);
+       gpio_direction_output(IMX_GPIO_NR(4, 26), 0);
 
-       gpio_direction_output(121, 1);
+       gpio_direction_output(IMX_GPIO_NR(4, 25), 1);
 
        WATCHDOG_RESET();
 }
 
 static void setup_fec(void)
 {
-       /*FEC_MDIO*/
-       mxc_request_iomux(MX51_PIN_EIM_EB2, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_EB2, 0x1FD);
-
-       /*FEC_MDC*/
-       mxc_request_iomux(MX51_PIN_NANDF_CS3, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS3, 0x2004);
-
-       /* FEC RDATA[3] */
-       mxc_request_iomux(MX51_PIN_EIM_CS3, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS3, 0x180);
-
-       /* FEC RDATA[2] */
-       mxc_request_iomux(MX51_PIN_EIM_CS2, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS2, 0x180);
-
-       /* FEC RDATA[1] */
-       mxc_request_iomux(MX51_PIN_EIM_EB3, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_EB3, 0x180);
-
-       /* FEC RDATA[0] */
-       mxc_request_iomux(MX51_PIN_NANDF_D9, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D9, 0x2180);
-
-       /* FEC TDATA[3] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS6, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS6, 0x2004);
-
-       /* FEC TDATA[2] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS5, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS5, 0x2004);
-
-       /* FEC TDATA[1] */
-       mxc_request_iomux(MX51_PIN_NANDF_CS4, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS4, 0x2004);
-
-       /* FEC TDATA[0] */
-       mxc_request_iomux(MX51_PIN_NANDF_D8, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D8, 0x2004);
-
-       /* FEC TX_EN */
-       mxc_request_iomux(MX51_PIN_NANDF_CS7, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS7, 0x2004);
-
-       /* FEC TX_ER */
-       mxc_request_iomux(MX51_PIN_NANDF_CS2, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_CS2, 0x2004);
-
-       /* FEC TX_CLK */
-       mxc_request_iomux(MX51_PIN_NANDF_RDY_INT, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RDY_INT, 0x2180);
-
-       /* FEC TX_COL */
-       mxc_request_iomux(MX51_PIN_NANDF_RB2, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RB2, 0x2180);
-
-       /* FEC RX_CLK */
-       mxc_request_iomux(MX51_PIN_NANDF_RB3, IOMUX_CONFIG_ALT1);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_RB3, 0x2180);
-
-       /* FEC RX_CRS */
-       mxc_request_iomux(MX51_PIN_EIM_CS5, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS5, 0x180);
-
-       /* FEC RX_ER */
-       mxc_request_iomux(MX51_PIN_EIM_CS4, IOMUX_CONFIG_ALT3);
-       mxc_iomux_set_pad(MX51_PIN_EIM_CS4, 0x180);
-
-       /* FEC RX_DV */
-       mxc_request_iomux(MX51_PIN_NANDF_D11, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_NANDF_D11, 0x2180);
+       static const iomux_v3_cfg_t fec_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB2__FEC_MDIO, PAD_CTL_HYS |
+                               PAD_CTL_PUS_22K_UP | PAD_CTL_ODE |
+                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST),
+               MX51_PAD_NANDF_CS3__FEC_MDC,
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS3__FEC_RDATA3, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_CS2__FEC_RDATA2, MX51_PAD_CTRL_2),
+               NEW_PAD_CTRL(MX51_PAD_EIM_EB3__FEC_RDATA1, MX51_PAD_CTRL_2),
+               MX51_PAD_NANDF_D9__FEC_RDATA0,
+               MX51_PAD_NANDF_CS6__FEC_TDATA3,
+               MX51_PAD_NANDF_CS5__FEC_TDATA2,
+               MX51_PAD_NANDF_CS4__FEC_TDATA1,
+               MX51_PAD_NANDF_D8__FEC_TDATA0,
+               MX51_PAD_NANDF_CS7__FEC_TX_EN,
+               MX51_PAD_NANDF_CS2__FEC_TX_ER,
+               MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB2__FEC_COL, MX51_PAD_CTRL_4),
+               NEW_PAD_CTRL(MX51_PAD_NANDF_RB3__FEC_RX_CLK, MX51_PAD_CTRL_4),
+               MX51_PAD_EIM_CS5__FEC_CRS,
+               MX51_PAD_EIM_CS4__FEC_RX_ER,
+               NEW_PAD_CTRL(MX51_PAD_NANDF_D11__FEC_RX_DV, MX51_PAD_CTRL_4),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 struct fsl_esdhc_cfg esdhc_cfg[1] = {
@@ -536,7 +424,7 @@ int get_mmc_getcd(u8 *cd, struct mmc *mmc)
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
 
        if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
-               *cd = gpio_get_value(0);
+               *cd = gpio_get_value(IMX_GPIO_NR(1, 0));
        else
                *cd = 0;
 
@@ -546,56 +434,24 @@ int get_mmc_getcd(u8 *cd, struct mmc *mmc)
 #ifdef CONFIG_FSL_ESDHC
 int board_mmc_init(bd_t *bis)
 {
-       mxc_request_iomux(MX51_PIN_SD1_CMD,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_request_iomux(MX51_PIN_SD1_CLK,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_request_iomux(MX51_PIN_SD1_DATA0,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_request_iomux(MX51_PIN_SD1_DATA1,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_request_iomux(MX51_PIN_SD1_DATA2,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_request_iomux(MX51_PIN_SD1_DATA3,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_iomux_set_pad(MX51_PIN_SD1_CMD,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_SD1_CLK,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_NONE | PAD_CTL_47K_PU |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_SD1_DATA0,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_SD1_DATA1,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_SD1_DATA2,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_iomux_set_pad(MX51_PIN_SD1_DATA3,
-               PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH |
-               PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PD |
-               PAD_CTL_PUE_PULL |
-               PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST);
-       mxc_request_iomux(MX51_PIN_GPIO1_0,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_0,
-               PAD_CTL_HYS_ENABLE);
-       mxc_request_iomux(MX51_PIN_GPIO1_1,
-               IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_1,
-               PAD_CTL_HYS_ENABLE);
+       static const iomux_v3_cfg_t sd1_pads[] = {
+               NEW_PAD_CTRL(MX51_PAD_SD1_CMD__SD1_CMD, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_CLK__SD1_CLK, PAD_CTL_DSE_MAX |
+                       PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA0__SD1_DATA0, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA1__SD1_DATA1, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA2__SD1_DATA2, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_SD1_DATA3__SD1_DATA3, PAD_CTL_DSE_MAX |
+                       PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN | PAD_CTL_SRE_FAST),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_0__SD1_CD, PAD_CTL_HYS),
+               NEW_PAD_CTRL(MX51_PAD_GPIO1_1__SD1_WP, PAD_CTL_HYS),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(sd1_pads, ARRAY_SIZE(sd1_pads));
 
        esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
        return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
@@ -604,13 +460,18 @@ int board_mmc_init(bd_t *bis)
 
 void lcd_enable(void)
 {
+       static const iomux_v3_cfg_t lcd_pads[] = {
+               MX51_PAD_DI1_PIN2__DI1_PIN2,
+               MX51_PAD_DI1_PIN3__DI1_PIN3,
+       };
+
        int ret;
 
-       mxc_request_iomux(MX51_PIN_DI1_PIN2, IOMUX_CONFIG_ALT0);
-       mxc_request_iomux(MX51_PIN_DI1_PIN3, IOMUX_CONFIG_ALT0);
+       imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
 
-       gpio_set_value(2, 1);
-       mxc_request_iomux(MX51_PIN_GPIO1_2, IOMUX_CONFIG_ALT0);
+       gpio_set_value(IMX_GPIO_NR(1, 2), 1);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_2__GPIO1_2,
+                                               NO_PAD_CTRL));
 
        ret = ipuv3_fb_init(&nec_nl6448bc26_09c, 0, IPU_PIX_FMT_RGB666);
        if (ret)
@@ -624,9 +485,9 @@ int board_early_init_f(void)
        init_drive_strength();
 
        /* Setup debug led */
-       gpio_direction_output(6, 0);
-       mxc_request_iomux(MX51_PIN_GPIO1_6, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_GPIO1_6, PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST);
+       gpio_direction_output(IMX_GPIO_NR(1, 6), 0);
+       imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX51_PAD_GPIO1_6__GPIO1_6,
+                                       PAD_CTL_DSE_MAX | PAD_CTL_SRE_FAST));
 
        /* wait a little while to give the pll time to settle */
        sdelay(100000);
@@ -644,12 +505,12 @@ int board_early_init_f(void)
 static void backlight(int on)
 {
        if (on) {
-               gpio_set_value(65, 1);
+               gpio_set_value(IMX_GPIO_NR(3, 1), 1);
                udelay(10000);
-               gpio_set_value(68, 1);
+               gpio_set_value(IMX_GPIO_NR(3, 4), 1);
        } else {
-               gpio_set_value(65, 0);
-               gpio_set_value(68, 0);
+               gpio_set_value(IMX_GPIO_NR(3, 1), 0);
+               gpio_set_value(IMX_GPIO_NR(3, 4), 0);
        }
 }
 
index e0b0b330208ccbcd341084a9bb055b63baae5c11..ce83bbe4c5ebc87c823811e95eef424705ef39a1 100644 (file)
@@ -14,12 +14,12 @@ Building U-boot for Wandboard
 
 To build U-Boot for the Wandboard Dual Lite version:
 
-$ make wanboard_dl_config
+$ make wandboard_dl_config
 $ make
 
 To build U-Boot for the Wandboard Solo version:
 
-$ make wanboard_solo_config
+$ make wandboard_solo_config
 $ make
 
 Flashing U-boot into the SD card
index ac7b89aaec101052d4f494242911741082bbd339..5666cbf26f2e14ee59cd164870bb35f64bfc68ea 100644 (file)
  */
 
 #include <asm/arch/clock.h>
+#include <asm/arch/crm_regs.h>
 #include <asm/arch/iomux.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/mx6-pins.h>
+#include <asm/arch/mxc_hdmi.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/gpio.h>
 #include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/boot_mode.h>
 #include <asm/io.h>
 #include <asm/sizes.h>
 #include <common.h>
 #include <fsl_esdhc.h>
+#include <ipu_pixfmt.h>
 #include <mmc.h>
 #include <miiphy.h>
 #include <netdev.h>
+#include <linux/fb.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
-       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
-       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
-       PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
+#define USDHC1_CD_GPIO         IMX_GPIO_NR(1, 2)
+#define USDHC3_CD_GPIO         IMX_GPIO_NR(3, 9)
 #define ETH_PHY_RESET          IMX_GPIO_NR(3, 29)
 
 int dram_init(void)
@@ -52,6 +58,17 @@ static iomux_v3_cfg_t const uart1_pads[] = {
        MX6_PAD_CSI0_DAT11__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
+iomux_v3_cfg_t const usdhc1_pads[] = {
+       MX6_PAD_SD1_CLK__USDHC1_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD1_CMD__USDHC1_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD1_DAT0__USDHC1_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD1_DAT1__USDHC1_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD1_DAT2__USDHC1_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6_PAD_SD1_DAT3__USDHC1_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       /* Carrier MicroSD Card Detect */
+       MX6_PAD_GPIO_2__GPIO_1_2      | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
 static iomux_v3_cfg_t const usdhc3_pads[] = {
        MX6_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
        MX6_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -59,6 +76,8 @@ static iomux_v3_cfg_t const usdhc3_pads[] = {
        MX6_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
        MX6_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
        MX6_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       /* SOM MicroSD Card Detect */
+       MX6_PAD_EIM_DA9__GPIO_3_9     | MUX_PAD_CTRL(NO_PAD_CTRL),
 };
 
 static iomux_v3_cfg_t const enet_pads[] = {
@@ -96,18 +115,66 @@ static void setup_iomux_enet(void)
        gpio_set_value(ETH_PHY_RESET, 1);
 }
 
-static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
        {USDHC3_BASE_ADDR},
+       {USDHC1_BASE_ADDR},
 };
 
-int board_mmc_init(bd_t *bis)
+int board_mmc_getcd(struct mmc *mmc)
 {
-       imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-
-       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-       usdhc_cfg[0].max_bus_width = 4;
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC1_BASE_ADDR:
+               ret = !gpio_get_value(USDHC1_CD_GPIO);
+               break;
+       case USDHC3_BASE_ADDR:
+               ret = !gpio_get_value(USDHC3_CD_GPIO);
+               break;
+       }
+
+       return ret;
+}
 
-       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+int board_mmc_init(bd_t *bis)
+{
+       s32 status = 0;
+       u32 index = 0;
+
+       /*
+        * Following map is done:
+        * (U-boot device node)    (Physical Port)
+        * mmc0                    SOM MicroSD
+        * mmc1                    Carrier board MicroSD
+        */
+       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
+               switch (index) {
+               case 0:
+                       imx_iomux_v3_setup_multiple_pads(
+                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
+                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+                       usdhc_cfg[0].max_bus_width = 4;
+                       gpio_direction_input(USDHC3_CD_GPIO);
+                       break;
+               case 1:
+                       imx_iomux_v3_setup_multiple_pads(
+                               usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
+                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+                       usdhc_cfg[1].max_bus_width = 4;
+                       gpio_direction_input(USDHC1_CD_GPIO);
+                       break;
+               default:
+                       printf("Warning: you configured more USDHC controllers"
+                              "(%d) then supported by the board (%d)\n",
+                              index + 1, CONFIG_SYS_FSL_USDHC_NUM);
+                       return status;
+               }
+
+               status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
+       }
+
+       return status;
 }
 
 static int mx6_rgmii_rework(struct phy_device *phydev)
@@ -143,6 +210,88 @@ int board_phy_config(struct phy_device *phydev)
        return 0;
 }
 
+#if defined(CONFIG_VIDEO_IPUV3)
+static void enable_hdmi(void)
+{
+       struct hdmi_regs *hdmi  = (struct hdmi_regs *)HDMI_ARB_BASE_ADDR;
+       u8 reg;
+       reg = readb(&hdmi->phy_conf0);
+       reg |= HDMI_PHY_CONF0_PDZ_MASK;
+       writeb(reg, &hdmi->phy_conf0);
+
+       udelay(3000);
+       reg |= HDMI_PHY_CONF0_ENTMDS_MASK;
+       writeb(reg, &hdmi->phy_conf0);
+       udelay(3000);
+       reg |= HDMI_PHY_CONF0_GEN2_TXPWRON_MASK;
+       writeb(reg, &hdmi->phy_conf0);
+       writeb(HDMI_MC_PHYRSTZ_ASSERT, &hdmi->mc_phyrstz);
+}
+
+static struct fb_videomode const hdmi = {
+       .name           = "HDMI",
+       .refresh        = 60,
+       .xres           = 1024,
+       .yres           = 768,
+       .pixclock       = 15385,
+       .left_margin    = 220,
+       .right_margin   = 40,
+       .upper_margin   = 21,
+       .lower_margin   = 7,
+       .hsync_len      = 60,
+       .vsync_len      = 10,
+       .sync           = FB_SYNC_EXT,
+       .vmode          = FB_VMODE_NONINTERLACED
+};
+
+int board_video_skip(void)
+{
+       int ret;
+
+       ret = ipuv3_fb_init(&hdmi, 0, IPU_PIX_FMT_RGB24);
+
+       if (ret)
+               printf("HDMI cannot be configured: %d\n", ret);
+
+       enable_hdmi();
+
+       return ret;
+}
+
+static void setup_display(void)
+{
+       struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+       struct hdmi_regs *hdmi  = (struct hdmi_regs *)HDMI_ARB_BASE_ADDR;
+       int reg;
+
+       /* Turn on IPU clock */
+       reg = readl(&mxc_ccm->CCGR3);
+       reg |= MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET;
+       writel(reg, &mxc_ccm->CCGR3);
+
+       /* Turn on HDMI PHY clock */
+       reg = readl(&mxc_ccm->CCGR2);
+       reg |=  MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK
+               | MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK;
+       writel(reg, &mxc_ccm->CCGR2);
+
+       /* clear HDMI PHY reset */
+       writeb(HDMI_MC_PHYRSTZ_DEASSERT, &hdmi->mc_phyrstz);
+
+       reg = readl(&mxc_ccm->chsccdr);
+       reg &= ~(MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK
+               | MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK
+               | MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK);
+       reg |= (CHSCCDR_CLK_SEL_LDB_DI0
+               << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET)
+             | (CHSCCDR_PODF_DIVIDE_BY_3
+               << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET)
+             | (CHSCCDR_IPU_PRE_CLK_540M_PFD
+               << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
+       writel(reg, &mxc_ccm->chsccdr);
+}
+#endif /* CONFIG_VIDEO_IPUV3 */
+
 int board_eth_init(bd_t *bis)
 {
        int ret;
@@ -159,6 +308,36 @@ int board_eth_init(bd_t *bis)
 int board_early_init_f(void)
 {
        setup_iomux_uart();
+#if defined(CONFIG_VIDEO_IPUV3)
+       setup_display();
+#endif
+       return 0;
+}
+
+/*
+ * Do not overwrite the console
+ * Use always serial for U-Boot console
+ */
+int overwrite_console(void)
+{
+       return 1;
+}
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+       /* 4 bit bus width */
+       {"mmc0",          MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
+       {"mmc1",          MAKE_CFGVAL(0x40, 0x20, 0x00, 0x00)},
+       {NULL,   0},
+};
+#endif
+
+int board_late_init(void)
+{
+#ifdef CONFIG_CMD_BMODE
+       add_board_boot_modes(board_boot_modes);
+#endif
+
        return 0;
 }
 
index 7c36af080e8a53405fc0476510295f2092390473..3f2e6b52af9975897b6fd03d7a52652a62598899 100644 (file)
@@ -28,8 +28,7 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
-#include <asm/arch/mx35_pins.h>
-#include <asm/arch/iomux.h>
+#include <asm/arch/iomux-mx35.h>
 #include <i2c.h>
 #include <power/pmic.h>
 #include <fsl_pmic.h>
@@ -74,25 +73,29 @@ static void board_setup_sdram(void)
 
 static void setup_iomux_fec(void)
 {
+       static const iomux_v3_cfg_t fec_pads[] = {
+               MX35_PAD_FEC_TX_CLK__FEC_TX_CLK,
+               MX35_PAD_FEC_RX_CLK__FEC_RX_CLK,
+               MX35_PAD_FEC_RX_DV__FEC_RX_DV,
+               MX35_PAD_FEC_COL__FEC_COL,
+               MX35_PAD_FEC_RDATA0__FEC_RDATA_0,
+               MX35_PAD_FEC_TDATA0__FEC_TDATA_0,
+               MX35_PAD_FEC_TX_EN__FEC_TX_EN,
+               MX35_PAD_FEC_MDC__FEC_MDC,
+               MX35_PAD_FEC_MDIO__FEC_MDIO,
+               MX35_PAD_FEC_TX_ERR__FEC_TX_ERR,
+               MX35_PAD_FEC_RX_ERR__FEC_RX_ERR,
+               MX35_PAD_FEC_CRS__FEC_CRS,
+               MX35_PAD_FEC_RDATA1__FEC_RDATA_1,
+               MX35_PAD_FEC_TDATA1__FEC_TDATA_1,
+               MX35_PAD_FEC_RDATA2__FEC_RDATA_2,
+               MX35_PAD_FEC_TDATA2__FEC_TDATA_2,
+               MX35_PAD_FEC_RDATA3__FEC_RDATA_3,
+               MX35_PAD_FEC_TDATA3__FEC_TDATA_3,
+       };
+
        /* setup pins for FEC */
-       mxc_request_iomux(MX35_PIN_FEC_TX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_DV, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_COL, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_EN, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDC, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_MDIO, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RX_ERR, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_CRS, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_RDATA3, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_FEC_TDATA3, MUX_CONFIG_FUNC);
+       imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
 }
 
 int woodburn_init(void)
@@ -130,9 +133,9 @@ int woodburn_init(void)
        setup_iomux_fec();
 
        /* setup GPIO1_4 FEC_ENABLE signal */
-       mxc_request_iomux(MX35_PIN_SCKR, MUX_CONFIG_ALT5);
+       imx_iomux_v3_setup_pad(MX35_PAD_SCKR__GPIO1_4);
        gpio_direction_output(4, 1);
-       mxc_request_iomux(MX35_PIN_HCKT, MUX_CONFIG_ALT5);
+       imx_iomux_v3_setup_pad(MX35_PAD_HCKT__GPIO1_9);
        gpio_direction_output(9, 1);
 
        return 0;
@@ -228,22 +231,24 @@ struct fsl_esdhc_cfg esdhc_cfg = {MMC_SDHC1_BASE_ADDR};
 
 int board_mmc_init(bd_t *bis)
 {
+       static const iomux_v3_cfg_t sdhc1_pads[] = {
+               MX35_PAD_SD1_CMD__ESDHC1_CMD,
+               MX35_PAD_SD1_CLK__ESDHC1_CLK,
+               MX35_PAD_SD1_DATA0__ESDHC1_DAT0,
+               MX35_PAD_SD1_DATA1__ESDHC1_DAT1,
+               MX35_PAD_SD1_DATA2__ESDHC1_DAT2,
+               MX35_PAD_SD1_DATA3__ESDHC1_DAT3,
+       };
+
        /* configure pins for SDHC1 only */
-       mxc_request_iomux(MX35_PIN_SD1_CMD, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_CLK, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA0, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA1, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA2, MUX_CONFIG_FUNC);
-       mxc_request_iomux(MX35_PIN_SD1_DATA3, MUX_CONFIG_FUNC);
+       imx_iomux_v3_setup_multiple_pads(sdhc1_pads, ARRAY_SIZE(sdhc1_pads));
 
        /* MMC Card Detect on GPIO1_7 */
-       mxc_request_iomux(MX35_PIN_SCKT, MUX_CONFIG_ALT5);
-       mxc_iomux_set_input(MUX_IN_GPIO1_IN_7, 0x1);
+       imx_iomux_v3_setup_pad(MX35_PAD_SCKT__GPIO1_7);
        gpio_direction_input(GPIO_MMC_CD);
 
        /* MMC Write Protection on GPIO1_8 */
-       mxc_request_iomux(MX35_PIN_FST, MUX_CONFIG_ALT5);
-       mxc_iomux_set_input(MUX_IN_GPIO1_IN_8, 0x1);
+       imx_iomux_v3_setup_pad(MX35_PAD_FST__GPIO1_8);
        gpio_direction_input(GPIO_MMC_WP);
 
        esdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC1_CLK);
index 8ed75c3d383ec543ab9642b7b3d5d116e17cda13..b02c364dc9bc6fb7264344ebd818a303e3aad1df 100644 (file)
 
 #include <common.h>
 #include <netdev.h>
+#include <zynqpl.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sys_proto.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_FPGA
+Xilinx_desc fpga;
+
+/* It can be done differently */
+Xilinx_desc fpga010 = XILINX_XC7Z010_DESC(0x10);
+Xilinx_desc fpga020 = XILINX_XC7Z020_DESC(0x20);
+Xilinx_desc fpga030 = XILINX_XC7Z030_DESC(0x30);
+Xilinx_desc fpga045 = XILINX_XC7Z045_DESC(0x45);
+#endif
+
 int board_init(void)
 {
+#ifdef CONFIG_FPGA
+       u32 idcode;
+
+       idcode = zynq_slcr_get_idcode();
+
+       switch (idcode) {
+       case XILINX_ZYNQ_7010:
+               fpga = fpga010;
+               break;
+       case XILINX_ZYNQ_7020:
+               fpga = fpga020;
+               break;
+       case XILINX_ZYNQ_7030:
+               fpga = fpga030;
+               break;
+       case XILINX_ZYNQ_7045:
+               fpga = fpga045;
+               break;
+       }
+#endif
+
        icache_enable();
 
+#ifdef CONFIG_FPGA
+       fpga_init();
+       fpga_add(fpga_xilinx, &fpga);
+#endif
+
        return 0;
 }
 
@@ -38,10 +77,33 @@ int board_eth_init(bd_t *bis)
 {
        u32 ret = 0;
 
-#if defined(CONFIG_ZYNQ_GEM) && defined(CONFIG_ZYNQ_GEM_BASEADDR0)
-       ret = zynq_gem_initialize(bis, CONFIG_ZYNQ_GEM_BASEADDR0);
+#if defined(CONFIG_ZYNQ_GEM)
+# if defined(CONFIG_ZYNQ_GEM0)
+       ret |= zynq_gem_initialize(bis, ZYNQ_GEM_BASEADDR0,
+                                               CONFIG_ZYNQ_GEM_PHY_ADDR0, 0);
+# endif
+# if defined(CONFIG_ZYNQ_GEM1)
+       ret |= zynq_gem_initialize(bis, ZYNQ_GEM_BASEADDR1,
+                                               CONFIG_ZYNQ_GEM_PHY_ADDR1, 0);
+# endif
+#endif
+       return ret;
+}
 #endif
 
+#ifdef CONFIG_CMD_MMC
+int board_mmc_init(bd_t *bd)
+{
+       int ret = 0;
+
+#if defined(CONFIG_ZYNQ_SDHCI)
+# if defined(CONFIG_ZYNQ_SDHCI0)
+       ret = zynq_sdhci_init(ZYNQ_SDHCI_BASEADDR0);
+# endif
+# if defined(CONFIG_ZYNQ_SDHCI1)
+       ret |= zynq_sdhci_init(ZYNQ_SDHCI_BASEADDR1);
+# endif
+#endif
        return ret;
 }
 #endif
index 05318a110035132ee2acc37894d64982d58fc095..1e598cb7e2f17a0c01234a9f40e4d1eda349353e 100644 (file)
@@ -52,7 +52,6 @@ flea3                        arm         arm1136     -                   CarMedi
 mx35pdk                      arm         arm1136     -                   freescale      mx35
 woodburn                     arm         arm1136     -                   -              mx35
 woodburn_sd                  arm         arm1136     woodburn            -              mx35        woodburn_sd:IMX_CONFIG=board/woodburn/imximage.cfg
-omap2420h4                   arm         arm1136     -                   ti             omap24xx
 tnetv107x_evm                arm         arm1176     tnetv107xevm        ti             tnetv107x
 rpi_b                        arm         arm1176     rpi_b               raspberrypi    bcm2835
 integratorap_cm720t          arm         arm720t     integrator          armltd         -           integratorap:CM720T
@@ -94,6 +93,7 @@ at91sam9g10ek_dataflash_cs3  arm         arm926ejs   at91sam9261ek       atmel
 at91sam9g10ek_nandflash      arm         arm926ejs   at91sam9261ek       atmel          at91        at91sam9261ek:AT91SAM9G10,SYS_USE_NANDFLASH
 at91sam9g20ek_dataflash_cs0  arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9G20,SYS_USE_DATAFLASH_CS0
 at91sam9g20ek_dataflash_cs1  arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9G20,SYS_USE_DATAFLASH_CS1
+at91sam9g20ek_mmc            arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9G20,SYS_USE_MMC
 at91sam9g20ek_nandflash      arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9G20,SYS_USE_NANDFLASH
 at91sam9g20ek_2mmc_nandflash arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9G20,AT91SAM9G20EK_2MMC,SYS_USE_NANDFLASH
 at91sam9m10g45ek_nandflash   arm         arm926ejs   at91sam9m10g45ek    atmel          at91        at91sam9m10g45ek:AT91SAM9M10G45,SYS_USE_NANDFLASH
@@ -106,6 +106,9 @@ at91sam9x5ek_mmc             arm         arm926ejs   at91sam9x5ek        atmel
 at91sam9xeek_dataflash_cs0   arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9XE,SYS_USE_DATAFLASH_CS0
 at91sam9xeek_dataflash_cs1   arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9XE,SYS_USE_DATAFLASH_CS1
 at91sam9xeek_nandflash       arm         arm926ejs   at91sam9260ek       atmel          at91        at91sam9260ek:AT91SAM9XE,SYS_USE_NANDFLASH
+at91sam9n12ek_nandflash      arm         arm926ejs   at91sam9n12ek       atmel          at91        at91sam9n12ek:AT91SAM9N12,SYS_USE_NANDFLASH
+at91sam9n12ek_spiflash       arm         arm926ejs   at91sam9n12ek       atmel          at91        at91sam9n12ek:AT91SAM9N12,SYS_USE_SPIFLASH
+at91sam9n12ek_mmc            arm         arm926ejs   at91sam9n12ek       atmel          at91        at91sam9n12ek:AT91SAM9N12,SYS_USE_MMC
 snapper9260                  arm         arm926ejs   -                   bluewater      at91        snapper9260:AT91SAM9260
 snapper9g20                  arm         arm926ejs   snapper9260         bluewater      at91        snapper9260:AT91SAM9G20
 vl_ma2sc                     arm         arm926ejs   vl_ma2sc            BuS            at91
@@ -185,6 +188,7 @@ rd6281a                      arm         arm926ejs   -                   Marvell
 sheevaplug                   arm         arm926ejs   -                   Marvell        kirkwood
 ib62x0                       arm         arm926ejs   ib62x0              raidsonic      kirkwood
 dockstar                     arm         arm926ejs   -                   Seagate        kirkwood
+goflexhome                   arm         arm926ejs   -                   Seagate        kirkwood
 tk71                         arm         arm926ejs   tk71                karo           kirkwood
 devkit3250                   arm         arm926ejs   devkit3250          timll          lpc32xx
 jadecpu                      arm         arm926ejs   jadecpu             syteco         mb86r0x
@@ -234,7 +238,9 @@ versatilepb                  arm         arm926ejs   versatile           armltd
 versatileqemu                arm         arm926ejs   versatile           armltd         versatile   versatile:ARCH_VERSATILE_QEMU,ARCH_VERSATILE_PB
 integratorap_cm946es         arm         arm946es    integrator          armltd         -               integratorap:CM946ES
 integratorcp_cm946es         arm         arm946es    integrator          armltd         -               integratorcp:CM946ES
-ca9x4_ct_vxp                 arm         armv7       vexpress            armltd
+vexpress_ca15_tc2            arm         armv7       vexpress            armltd
+vexpress_ca5x2               arm         armv7       vexpress            armltd
+vexpress_ca9x4               arm         armv7       vexpress            armltd
 am335x_evm                   arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1
 am335x_evm_spiboot           arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1,SPI_BOOT
 am335x_evm_uart1             arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL2,CONS_INDEX=2
@@ -245,7 +251,11 @@ am335x_evm_uart5             arm         armv7       am335x              ti
 am335x_evm_usbspl            arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1,SPL_USBETH_SUPPORT
 ti814x_evm                   arm         armv7       ti814x              ti             am33xx
 pcm051                       arm         armv7       pcm051              phytec         am33xx      pcm051
+sama5d3xek_mmc               arm         armv7       sama5d3xek          atmel          at91        sama5d3xek:SAMA5D3,SYS_USE_MMC
+sama5d3xek_nandflash         arm         armv7       sama5d3xek          atmel          at91        sama5d3xek:SAMA5D3,SYS_USE_NANDFLASH
+sama5d3xek_spiflash          arm         armv7       sama5d3xek          atmel          at91        sama5d3xek:SAMA5D3,SYS_USE_SERIALFLASH
 highbank                     arm         armv7       highbank            -              highbank
+m53evk                       arm         armv7       m53evk              denx          mx5             m53evk:IMX_CONFIG=board/denx/m53evk/imximage.cfg
 mx51_efikamx                 arm         armv7       mx51_efikamx        genesi         mx5            mx51_efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKAMX,IMX_CONFIG=board/genesi/mx51_efikamx/imximage_mx.cfg
 mx51_efikasb                 arm         armv7       mx51_efikamx        genesi         mx5            mx51_efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKASB,IMX_CONFIG=board/genesi/mx51_efikamx/imximage_sb.cfg
 mx51evk                      arm         armv7       mx51evk             freescale      mx5            mx51evk:IMX_CONFIG=board/freescale/mx51evk/imximage.cfg
@@ -255,10 +265,14 @@ mx53loco                     arm         armv7       mx53loco            freesca
 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
+cgtqmx6qeval                            arm             armv7           cgtqmx6eval             congatec               mx6             cgtqmx6eval:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg,MX6Q
 mx6qarm2                     arm         armv7       mx6qarm2            freescale      mx6            mx6qarm2:IMX_CONFIG=board/freescale/mx6qarm2/imximage.cfg
 mx6qsabreauto                arm         armv7       mx6qsabreauto       freescale      mx6            mx6qsabreauto:IMX_CONFIG=board/freescale/mx6qsabreauto/imximage.cfg
 mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6            mx6qsabrelite:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
 mx6qsabresd                  arm         armv7       mx6qsabresd         freescale      mx6            mx6qsabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
+mx6slevk                     arm         armv7       mx6slevk            freescale      mx6            mx6slevk:IMX_CONFIG=board/freescale/mx6slevk/imximage.cfg,MX6SL
+titanium                     arm         armv7       titanium            freescale      mx6            titanium:IMX_CONFIG=board/freescale/titanium/imximage.cfg
+vf610twr                     arm         armv7       vf610twr            freescale      vf610          vf610twr:IMX_CONFIG=board/freescale/vf610twr/imximage.cfg
 eco5pk                       arm         armv7       eco5pk              8dtech         omap3
 nitrogen6dl                  arm         armv7       nitrogen6x          boundary       mx6            nitrogen6x:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6dl.cfg,MX6DL,DDR_MB=1024
 nitrogen6dl2g                arm         armv7       nitrogen6x          boundary       mx6            nitrogen6x:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6dl2g.cfg,MX6DL,DDR_MB=2048
@@ -268,15 +282,16 @@ nitrogen6s                   arm         armv7       nitrogen6x          boundar
 nitrogen6s1g                 arm         armv7       nitrogen6x          boundary       mx6            nitrogen6x:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6s1g.cfg,MX6S,DDR_MB=1024
 wandboard_dl                arm         armv7       wandboard           -              mx6 wandboard:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6dl.cfg,MX6DL,DDR_MB=1024
 wandboard_solo              arm         armv7       wandboard           -              mx6 wandboard:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6s.cfg,MX6S,DDR_MB=512
-cm_t35                       arm         armv7       cm_t35              -              omap3
 omap3_overo                  arm         armv7       overo               -              omap3
 omap3_pandora                arm         armv7       pandora             -              omap3
 dig297                       arm         armv7       dig297              comelit        omap3
+cm_t35                       arm         armv7       cm_t35              compulab       omap3
 igep0020                     arm         armv7       igep00x0            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0020,BOOT_ONENAND
 igep0020_nand                arm         armv7       igep00x0            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0020,BOOT_NAND
 igep0030                     arm         armv7       igep00x0            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0030,BOOT_ONENAND
 igep0030_nand                arm         armv7       igep00x0            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0030,BOOT_NAND
 igep0032                     arm         armv7       igep00x0            isee           omap3          igep00x0:MACH_TYPE=MACH_TYPE_IGEP0032,BOOT_ONENAND
+igep0033                     arm         armv7       igep0033            isee           am33xx
 am3517_evm                   arm         armv7       am3517evm           logicpd        omap3
 mt_ventoux                   arm         armv7       mt_ventoux          teejet         omap3
 omap3_zoom1                  arm         armv7       zoom1               logicpd        omap3
@@ -311,7 +326,7 @@ seaboard                     arm         armv7:arm720t seaboard          nvidia
 ventana                      arm         armv7:arm720t ventana           nvidia         tegra20
 whistler                     arm         armv7:arm720t whistler          nvidia         tegra20
 cardhu                       arm         armv7:arm720t cardhu            nvidia         tegra30
-beaver                       arm         armv7:arm720t cardhu            nvidia         tegra30
+beaver                       arm         armv7:arm720t beaver            nvidia         tegra30
 dalmore                      arm         armv7:arm720t dalmore           nvidia         tegra114
 colibri_t20_iris             arm         armv7:arm720t colibri_t20_iris  toradex        tegra20
 u8500_href                   arm         armv7       u8500               st-ericsson    u8500
@@ -333,6 +348,7 @@ pdnb3                        arm         ixp         pdnb3               prodriv
 scpu                         arm         ixp         pdnb3               prodrive       -           pdnb3:SCPU
 balloon3                     arm         pxa
 h2200                        arm         pxa
+lp8x4x                       arm         pxa         lp8x4x              icpdas
 lubbock                      arm         pxa
 palmld                       arm         pxa
 palmtc                       arm         pxa
@@ -880,6 +896,9 @@ P5020DS_SECURE_BOOT          powerpc     mpc85xx     corenet_ds          freesca
 P5020DS_SPIFLASH            powerpc     mpc85xx     corenet_ds          freescale      -           P5020DS:RAMBOOT_PBL,SPIFLASH,SYS_TEXT_BASE=0xFFF80000
 P5020DS_SRIO_PCIE_BOOT          powerpc     mpc85xx     corenet_ds          freescale      -           P5020DS:SRIO_PCIE_BOOT_SLAVE,SYS_TEXT_BASE=0xFFF80000
 P5040DS                      powerpc     mpc85xx     corenet_ds          freescale
+P5040DS_NAND                powerpc     mpc85xx     corenet_ds          freescale      -           P5040DS:RAMBOOT_PBL,NAND,SYS_TEXT_BASE=0xFFF80000
+P5040DS_SDCARD              powerpc     mpc85xx     corenet_ds          freescale      -           P5040DS:RAMBOOT_PBL,SDCARD,SYS_TEXT_BASE=0xFFF80000
+P5040DS_SPIFLASH            powerpc     mpc85xx     corenet_ds          freescale      -           P5040DS:RAMBOOT_PBL,SPIFLASH,SYS_TEXT_BASE=0xFFF80000
 BSC9131RDB_SPIFLASH          powerpc     mpc85xx     bsc9131rdb          freescale      -           BSC9131RDB:BSC9131RDB,SPIFLASH
 BSC9132QDS_NOR_DDRCLK100     powerpc     mpc85xx     bsc9132qds          freescale      -           BSC9132QDS:BSC9132QDS,SYS_CLK_100_DDR_100
 BSC9132QDS_NOR_DDRCLK133     powerpc     mpc85xx     bsc9132qds          freescale      -           BSC9132QDS:BSC9132QDS,SYS_CLK_100_DDR_133
index f50bf2ea908d339e45e7a4c35a3d7d39cba8348b..3ba431626336189d93c4e2823c6b79b653f4f7aa 100644 (file)
@@ -111,6 +111,7 @@ ifdef CONFIG_FPGA
 COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o
 endif
 COBJS-$(CONFIG_CMD_FS_GENERIC) += cmd_fs.o
+COBJS-$(CONFIG_CMD_FUSE) += cmd_fuse.o
 COBJS-$(CONFIG_CMD_GETTIME) += cmd_gettime.o
 COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o
 COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o
index 81edbdf8e45b5899cab64d798d4c9f510afa3809..8efdb6365577e519c62ef4b56fa41919b4ee94d1 100644 (file)
@@ -421,19 +421,18 @@ static int setup_dest_addr(void)
 #endif
        gd->ram_top += get_effective_memsize();
        gd->ram_top = board_get_usable_ram_top(gd->mon_len);
-       gd->dest_addr = gd->ram_top;
+       gd->relocaddr = gd->ram_top;
        debug("Ram top: %08lX\n", (ulong)gd->ram_top);
 #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
        /*
         * We need to make sure the location we intend to put secondary core
         * boot code is reserved and not used by any part of u-boot
         */
-       if (gd->dest_addr > determine_mp_bootpg(NULL)) {
-               gd->dest_addr = determine_mp_bootpg(NULL);
-               debug("Reserving MP boot page to %08lx\n", gd->dest_addr);
+       if (gd->relocaddr > determine_mp_bootpg(NULL)) {
+               gd->relocaddr = determine_mp_bootpg(NULL);
+               debug("Reserving MP boot page to %08lx\n", gd->relocaddr);
        }
 #endif
-       gd->dest_addr_sp = gd->dest_addr;
        return 0;
 }
 
@@ -441,9 +440,9 @@ static int setup_dest_addr(void)
 static int reserve_logbuffer(void)
 {
        /* reserve kernel log buffer */
-       gd->dest_addr -= LOGBUFF_RESERVE;
+       gd->relocaddr -= LOGBUFF_RESERVE;
        debug("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN,
-               gd->dest_addr);
+               gd->relocaddr);
        return 0;
 }
 #endif
@@ -455,9 +454,9 @@ static int reserve_pram(void)
        ulong reg;
 
        reg = getenv_ulong("pram", 10, CONFIG_PRAM);
-       gd->dest_addr -= (reg << 10);           /* size is in kB */
+       gd->relocaddr -= (reg << 10);           /* size is in kB */
        debug("Reserving %ldk for protected RAM at %08lx\n", reg,
-             gd->dest_addr);
+             gd->relocaddr);
        return 0;
 }
 #endif /* CONFIG_PRAM */
@@ -465,7 +464,7 @@ static int reserve_pram(void)
 /* Round memory pointer down to next 4 kB limit */
 static int reserve_round_4k(void)
 {
-       gd->dest_addr &= ~(4096 - 1);
+       gd->relocaddr &= ~(4096 - 1);
        return 0;
 }
 
@@ -475,12 +474,12 @@ static int reserve_mmu(void)
 {
        /* reserve TLB table */
        gd->arch.tlb_size = 4096 * 4;
-       gd->dest_addr -= gd->arch.tlb_size;
+       gd->relocaddr -= gd->arch.tlb_size;
 
        /* round down to next 64 kB limit */
-       gd->dest_addr &= ~(0x10000 - 1);
+       gd->relocaddr &= ~(0x10000 - 1);
 
-       gd->arch.tlb_addr = gd->dest_addr;
+       gd->arch.tlb_addr = gd->relocaddr;
        debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
              gd->arch.tlb_addr + gd->arch.tlb_size);
        return 0;
@@ -494,8 +493,8 @@ static int reserve_lcd(void)
        gd->fb_base = CONFIG_FB_ADDR;
 #else
        /* reserve memory for LCD display (always full pages) */
-       gd->dest_addr = lcd_setmem(gd->dest_addr);
-       gd->fb_base = gd->dest_addr;
+       gd->relocaddr = lcd_setmem(gd->relocaddr);
+       gd->fb_base = gd->relocaddr;
 #endif /* CONFIG_FB_ADDR */
        return 0;
 }
@@ -506,8 +505,8 @@ static int reserve_lcd(void)
 static int reserve_video(void)
 {
        /* reserve memory for video display (always full pages) */
-       gd->dest_addr = video_setmem(gd->dest_addr);
-       gd->fb_base = gd->dest_addr;
+       gd->relocaddr = video_setmem(gd->relocaddr);
+       gd->fb_base = gd->relocaddr;
 
        return 0;
 }
@@ -519,15 +518,18 @@ static int reserve_uboot(void)
         * reserve memory for U-Boot code, data & bss
         * round down to next 4 kB limit
         */
-       gd->dest_addr -= gd->mon_len;
-       gd->dest_addr &= ~(4096 - 1);
+       gd->relocaddr -= gd->mon_len;
+       gd->relocaddr &= ~(4096 - 1);
 #ifdef CONFIG_E500
        /* round down to next 64 kB limit so that IVPR stays aligned */
-       gd->dest_addr &= ~(65536 - 1);
+       gd->relocaddr &= ~(65536 - 1);
 #endif
 
        debug("Reserving %ldk for U-Boot at: %08lx\n", gd->mon_len >> 10,
-             gd->dest_addr);
+             gd->relocaddr);
+
+       gd->start_addr_sp = gd->relocaddr;
+
        return 0;
 }
 
@@ -535,20 +537,20 @@ static int reserve_uboot(void)
 /* reserve memory for malloc() area */
 static int reserve_malloc(void)
 {
-       gd->dest_addr_sp = gd->dest_addr - TOTAL_MALLOC_LEN;
+       gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN;
        debug("Reserving %dk for malloc() at: %08lx\n",
-                       TOTAL_MALLOC_LEN >> 10, gd->dest_addr_sp);
+                       TOTAL_MALLOC_LEN >> 10, gd->start_addr_sp);
        return 0;
 }
 
 /* (permanently) allocate a Board Info struct */
 static int reserve_board(void)
 {
-       gd->dest_addr_sp -= sizeof(bd_t);
-       gd->bd = (bd_t *)map_sysmem(gd->dest_addr_sp, sizeof(bd_t));
+       gd->start_addr_sp -= sizeof(bd_t);
+       gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t));
        memset(gd->bd, '\0', sizeof(bd_t));
        debug("Reserving %zu Bytes for Board Info at: %08lx\n",
-                       sizeof(bd_t), gd->dest_addr_sp);
+                       sizeof(bd_t), gd->start_addr_sp);
        return 0;
 }
 #endif
@@ -563,10 +565,10 @@ static int setup_machine(void)
 
 static int reserve_global_data(void)
 {
-       gd->dest_addr_sp -= sizeof(gd_t);
-       gd->new_gd = (gd_t *)map_sysmem(gd->dest_addr_sp, sizeof(gd_t));
+       gd->start_addr_sp -= sizeof(gd_t);
+       gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t));
        debug("Reserving %zu Bytes for Global Data at: %08lx\n",
-                       sizeof(gd_t), gd->dest_addr_sp);
+                       sizeof(gd_t), gd->start_addr_sp);
        return 0;
 }
 
@@ -580,10 +582,10 @@ static int reserve_fdt(void)
        if (gd->fdt_blob) {
                gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
 
-               gd->dest_addr_sp -= gd->fdt_size;
-               gd->new_fdt = map_sysmem(gd->dest_addr_sp, gd->fdt_size);
+               gd->start_addr_sp -= gd->fdt_size;
+               gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size);
                debug("Reserving %lu Bytes for FDT at: %08lx\n",
-                     gd->fdt_size, gd->dest_addr_sp);
+                     gd->fdt_size, gd->start_addr_sp);
        }
 
        return 0;
@@ -593,8 +595,8 @@ static int reserve_stacks(void)
 {
 #ifdef CONFIG_SPL_BUILD
 # ifdef CONFIG_ARM
-       gd->dest_addr_sp -= 128;        /* leave 32 words for abort-stack */
-       gd->irq_sp = gd->dest_addr_sp;
+       gd->start_addr_sp -= 128;       /* leave 32 words for abort-stack */
+       gd->irq_sp = gd->start_addr_sp;
 # endif
 #else
 # ifdef CONFIG_PPC
@@ -602,9 +604,9 @@ static int reserve_stacks(void)
 # endif
 
        /* setup stack pointer for exceptions */
-       gd->dest_addr_sp -= 16;
-       gd->dest_addr_sp &= ~0xf;
-       gd->irq_sp = gd->dest_addr_sp;
+       gd->start_addr_sp -= 16;
+       gd->start_addr_sp &= ~0xf;
+       gd->irq_sp = gd->start_addr_sp;
 
        /*
         * Handle architecture-specific things here
@@ -613,18 +615,18 @@ static int reserve_stacks(void)
         */
 # ifdef CONFIG_ARM
 #  ifdef CONFIG_USE_IRQ
-       gd->dest_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
+       gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
        debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
-               CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->dest_addr_sp);
+               CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
 
        /* 8-byte alignment for ARM ABI compliance */
-       gd->dest_addr_sp &= ~0x07;
+       gd->start_addr_sp &= ~0x07;
 #  endif
        /* leave 3 words for abort-stack, plus 1 for alignment */
-       gd->dest_addr_sp -= 16;
+       gd->start_addr_sp -= 16;
 # elif defined(CONFIG_PPC)
        /* Clear initial stack frame */
-       s = (ulong *) gd->dest_addr_sp;
+       s = (ulong *) gd->start_addr_sp;
        *s = 0; /* Terminate back chain */
        *++s = 0; /* NULL return address */
 # endif /* Architecture specific code */
@@ -635,7 +637,7 @@ static int reserve_stacks(void)
 
 static int display_new_sp(void)
 {
-       debug("New Stack Pointer is: %08lx\n", gd->dest_addr_sp);
+       debug("New Stack Pointer is: %08lx\n", gd->start_addr_sp);
 
        return 0;
 }
@@ -757,15 +759,13 @@ static int reloc_fdt(void)
 
 static int setup_reloc(void)
 {
-       gd->relocaddr = gd->dest_addr;
-       gd->start_addr_sp = gd->dest_addr_sp;
-       gd->reloc_off = gd->dest_addr - CONFIG_SYS_TEXT_BASE;
+       gd->reloc_off = gd->relocaddr - CONFIG_SYS_TEXT_BASE;
        memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
 
        debug("Relocation Offset is: %08lx\n", gd->reloc_off);
        debug("Relocating to %08lx, new gd at %08lx, sp at %08lx\n",
-             gd->dest_addr, (ulong)map_to_sysmem(gd->new_gd),
-             gd->dest_addr_sp);
+             gd->relocaddr, (ulong)map_to_sysmem(gd->new_gd),
+             gd->start_addr_sp);
 
        return 0;
 }
@@ -794,7 +794,7 @@ static int jump_to_copy(void)
 #elif defined(CONFIG_SANDBOX)
        board_init_r(gd->new_gd, 0);
 #else
-       relocate_code(gd->dest_addr_sp, gd->new_gd, gd->dest_addr);
+       relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);
 #endif
 
        return 0;
@@ -851,12 +851,6 @@ static init_fnc_t init_sequence_f[] = {
 #ifdef CONFIG_ARM
        timer_init,             /* initialize timer */
 #endif
-#ifdef CONFIG_BOARD_POSTCLK_INIT
-       board_postclk_init,
-#endif
-#ifdef CONFIG_FSL_ESDHC
-       get_clocks,
-#endif
 #ifdef CONFIG_SYS_ALLOC_DPRAM
 #if !defined(CONFIG_CPM2)
        dpram_init,
@@ -864,6 +858,9 @@ static init_fnc_t init_sequence_f[] = {
 #endif
 #if defined(CONFIG_BOARD_POSTCLK_INIT)
        board_postclk_init,
+#endif
+#ifdef CONFIG_FSL_ESDHC
+       get_clocks,
 #endif
        env_init,               /* initialize environment */
 #if defined(CONFIG_8xx_CPUCLK_DEFAULT)
index fd1fd319b6351cfce2c4dff0b6a4860259d7b3e8..f5649c95f16f5291cecee4dc5fdf70e56fb4c759 100644 (file)
@@ -137,7 +137,7 @@ static int initr_reloc_global_data(void)
 #ifdef CONFIG_SYS_SYM_OFFSETS
        monitor_flash_len = _end_ofs;
 #elif !defined(CONFIG_SANDBOX)
-       monitor_flash_len = (ulong)&__init_end - gd->dest_addr;
+       monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
 #endif
 #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
        /*
@@ -145,7 +145,7 @@ static int initr_reloc_global_data(void)
         * We need to update it to point to the same CPU entry in RAM.
         * TODO: why not just add gd->reloc_ofs?
         */
-       gd->arch.cpu += gd->dest_addr - CONFIG_SYS_MONITOR_BASE;
+       gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
 
        /*
         * If we didn't know the cpu mask & # cores, we can save them of
@@ -161,7 +161,7 @@ static int initr_reloc_global_data(void)
         * in SRAM mode and initialize that cache from SRAM mode back to being
         * a cache in cpu_init_r.
         */
-       gd->env_addr += gd->dest_addr - CONFIG_SYS_MONITOR_BASE;
+       gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
 #endif
        return 0;
 }
@@ -178,7 +178,7 @@ static int initr_trap(void)
        /*
         * Setup trap handlers
         */
-       trap_init(gd->dest_addr);
+       trap_init(gd->relocaddr);
 
        return 0;
 }
@@ -263,7 +263,7 @@ static int initr_malloc(void)
        ulong malloc_start;
 
        /* The malloc area is immediately below the monitor copy in DRAM */
-       malloc_start = gd->dest_addr - TOTAL_MALLOC_LEN;
+       malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
        mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
                        TOTAL_MALLOC_LEN);
        return 0;
@@ -276,7 +276,7 @@ __weak int power_init_board(void)
 
 static int initr_announce(void)
 {
-       debug("Now running in RAM - U-Boot at: %08lx\n", gd->dest_addr);
+       debug("Now running in RAM - U-Boot at: %08lx\n", gd->relocaddr);
        return 0;
 }
 
index 78e0bf6a3c5c34bc78d0abc519fdd6dba2926847..17dc96179bb00fd46d8ad962bc531ddc0b8cd843 100644 (file)
@@ -84,6 +84,10 @@ static void print_mhz(const char *name, unsigned long hz)
 }
 
 #if defined(CONFIG_PPC)
+void __weak board_detail(void)
+{
+       /* Please define boot_detail() for your platform */
+}
 
 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
@@ -162,6 +166,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        printf("IP addr     = %s\n", getenv("ipaddr"));
        printf("baudrate    = %6u bps\n", bd->bi_baudrate);
        print_num("relocaddr", gd->relocaddr);
+       board_detail();
        return 0;
 }
 
index dd6cafaa87c41c54142504d28b8ea7c5a7957e65..05130b69364c900d380e45fac9c5d27712ad52e7 100644 (file)
@@ -93,11 +93,6 @@ static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 static void fixup_silent_linux(void);
 #endif
 
-static image_header_t *image_get_kernel(ulong img_addr, int verify);
-#if defined(CONFIG_FIT)
-static int fit_check_kernel(const void *fit, int os_noffset, int verify);
-#endif
-
 static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                                char * const argv[], bootm_headers_t *images,
                                ulong *os_data, ulong *os_len);
@@ -306,7 +301,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 
 #if defined(CONFIG_OF_LIBFDT)
                /* find flattened device tree */
-               ret = boot_get_fdt(flag, argc, argv, &images,
+               ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
                                   &images.ft_addr, &images.ft_len);
                if (ret) {
                        puts("Could not find a valid device tree\n");
@@ -336,12 +331,15 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
        ulong image_len = os.image_len;
        __maybe_unused uint unc_len = CONFIG_SYS_BOOTM_LEN;
        int no_overlap = 0;
+       void *load_buf, *image_buf;
 #if defined(CONFIG_LZMA) || defined(CONFIG_LZO)
        int ret;
 #endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) */
 
        const char *type_name = genimg_get_type_name(os.type);
 
+       load_buf = map_sysmem(load, image_len);
+       image_buf = map_sysmem(image_start, image_len);
        switch (comp) {
        case IH_COMP_NONE:
                if (load == blob_start || load == image_start) {
@@ -349,8 +347,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                        no_overlap = 1;
                } else {
                        printf("   Loading %s ... ", type_name);
-                       memmove_wd((void *)load, (void *)image_start,
-                                       image_len, CHUNKSZ);
+                       memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);
                }
                *load_end = load + image_len;
                puts("OK\n");
@@ -358,8 +355,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
 #ifdef CONFIG_GZIP
        case IH_COMP_GZIP:
                printf("   Uncompressing %s ... ", type_name);
-               if (gunzip((void *)load, unc_len,
-                               (uchar *)image_start, &image_len) != 0) {
+               if (gunzip(load_buf, unc_len, image_buf, &image_len) != 0) {
                        puts("GUNZIP: uncompress, out-of-mem or overwrite "
                                "error - must RESET board to recover\n");
                        if (boot_progress)
@@ -378,9 +374,9 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                 * use slower decompression algorithm which requires
                 * at most 2300 KB of memory.
                 */
-               int i = BZ2_bzBuffToBuffDecompress((char *)load,
-                                       &unc_len, (char *)image_start, image_len,
-                                       CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
+               int i = BZ2_bzBuffToBuffDecompress(load_buf, &unc_len,
+                       image_buf, image_len,
+                       CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
                if (i != BZ_OK) {
                        printf("BUNZIP2: uncompress or overwrite error %d "
                                "- must RESET board to recover\n", i);
@@ -397,9 +393,8 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                SizeT lzma_len = unc_len;
                printf("   Uncompressing %s ... ", type_name);
 
-               ret = lzmaBuffToBuffDecompress(
-                       (unsigned char *)load, &lzma_len,
-                       (unsigned char *)image_start, image_len);
+               ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
+                                              image_buf, image_len);
                unc_len = lzma_len;
                if (ret != SZ_OK) {
                        printf("LZMA: uncompress or overwrite error %d "
@@ -415,9 +410,8 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
        case IH_COMP_LZO:
                printf("   Uncompressing %s ... ", type_name);
 
-               ret = lzop_decompress((const unsigned char *)image_start,
-                                         image_len, (unsigned char *)load,
-                                         &unc_len);
+               ret = lzop_decompress(image_buf, image_len, load_buf,
+                                     &unc_len);
                if (ret != LZO_E_OK) {
                        printf("LZO: uncompress or overwrite error %d "
                              "- must RESET board to recover\n", ret);
@@ -796,54 +790,6 @@ static image_header_t *image_get_kernel(ulong img_addr, int verify)
        return hdr;
 }
 
-/**
- * fit_check_kernel - verify FIT format kernel subimage
- * @fit_hdr: pointer to the FIT image header
- * os_noffset: kernel subimage node offset within FIT image
- * @verify: data CRC verification flag
- *
- * fit_check_kernel() verifies integrity of the kernel subimage and from
- * specified FIT image.
- *
- * returns:
- *     1, on success
- *     0, on failure
- */
-#if defined(CONFIG_FIT)
-static int fit_check_kernel(const void *fit, int os_noffset, int verify)
-{
-       fit_image_print(fit, os_noffset, "   ");
-
-       if (verify) {
-               puts("   Verifying Hash Integrity ... ");
-               if (!fit_image_verify(fit, os_noffset)) {
-                       puts("Bad Data Hash\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_CHECK_HASH);
-                       return 0;
-               }
-               puts("OK\n");
-       }
-       bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_ARCH);
-
-       if (!fit_image_check_target_arch(fit, os_noffset)) {
-               puts("Unsupported Architecture\n");
-               bootstage_error(BOOTSTAGE_ID_FIT_CHECK_ARCH);
-               return 0;
-       }
-
-       bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_KERNEL);
-       if (!fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL) &&
-           !fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL_NOLOAD)) {
-               puts("Not a kernel image\n");
-               bootstage_error(BOOTSTAGE_ID_FIT_CHECK_KERNEL);
-               return 0;
-       }
-
-       bootstage_mark(BOOTSTAGE_ID_FIT_CHECKED);
-       return 1;
-}
-#endif /* CONFIG_FIT */
-
 /**
  * boot_get_kernel - find kernel image
  * @os_data: pointer to a ulong variable, will hold os data start address
@@ -864,12 +810,8 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
        ulong           img_addr;
        const void *buf;
 #if defined(CONFIG_FIT)
-       const void      *fit_hdr;
        const char      *fit_uname_config = NULL;
        const char      *fit_uname_kernel = NULL;
-       const void      *data;
-       size_t          len;
-       int             cfg_noffset;
        int             os_noffset;
 #endif
 
@@ -946,84 +888,16 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                break;
 #if defined(CONFIG_FIT)
        case IMAGE_FORMAT_FIT:
-               fit_hdr = buf;
-               printf("## Booting kernel from FIT Image at %08lx ...\n",
-                               img_addr);
-
-               if (!fit_check_format(fit_hdr)) {
-                       puts("Bad FIT kernel image format!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_FORMAT);
-                       return NULL;
-               }
-               bootstage_mark(BOOTSTAGE_ID_FIT_FORMAT);
-
-               if (!fit_uname_kernel) {
-                       /*
-                        * no kernel image node unit name, try to get config
-                        * node first. If config unit node name is NULL
-                        * fit_conf_get_node() will try to find default config
-                        * node
-                        */
-                       bootstage_mark(BOOTSTAGE_ID_FIT_NO_UNIT_NAME);
-#ifdef CONFIG_FIT_BEST_MATCH
-                       if (fit_uname_config)
-                               cfg_noffset =
-                                       fit_conf_get_node(fit_hdr,
-                                                         fit_uname_config);
-                       else
-                               cfg_noffset =
-                                       fit_conf_find_compat(fit_hdr,
-                                                            gd->fdt_blob);
-#else
-                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                                       fit_uname_config);
-#endif
-                       if (cfg_noffset < 0) {
-                               bootstage_error(BOOTSTAGE_ID_FIT_NO_UNIT_NAME);
-                               return NULL;
-                       }
-                       /* save configuration uname provided in the first
-                        * bootm argument
-                        */
-                       images->fit_uname_cfg = fdt_get_name(fit_hdr,
-                                                               cfg_noffset,
-                                                               NULL);
-                       printf("   Using '%s' configuration\n",
-                               images->fit_uname_cfg);
-                       bootstage_mark(BOOTSTAGE_ID_FIT_CONFIG);
-
-                       os_noffset = fit_conf_get_kernel_node(fit_hdr,
-                                                               cfg_noffset);
-                       fit_uname_kernel = fit_get_name(fit_hdr, os_noffset,
-                                                       NULL);
-               } else {
-                       /* get kernel component image node offset */
-                       bootstage_mark(BOOTSTAGE_ID_FIT_UNIT_NAME);
-                       os_noffset = fit_image_get_node(fit_hdr,
-                                                       fit_uname_kernel);
-               }
-               if (os_noffset < 0) {
-                       bootstage_error(BOOTSTAGE_ID_FIT_CONFIG);
+               os_noffset = fit_image_load(images, FIT_KERNEL_PROP,
+                               img_addr,
+                               &fit_uname_kernel, fit_uname_config,
+                               IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
+                               BOOTSTAGE_ID_FIT_KERNEL_START,
+                               FIT_LOAD_IGNORED, os_data, os_len);
+               if (os_noffset < 0)
                        return NULL;
-               }
 
-               printf("   Trying '%s' kernel subimage\n", fit_uname_kernel);
-
-               bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_SUBIMAGE);
-               if (!fit_check_kernel(fit_hdr, os_noffset, images->verify))
-                       return NULL;
-
-               /* get kernel image data address and length */
-               if (fit_image_get_data(fit_hdr, os_noffset, &data, &len)) {
-                       puts("Could not find kernel subimage data!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO_ERR);
-                       return NULL;
-               }
-               bootstage_mark(BOOTSTAGE_ID_FIT_KERNEL_INFO);
-
-               *os_len = len;
-               *os_data = (ulong)data;
-               images->fit_hdr_os = (void *)fit_hdr;
+               images->fit_hdr_os = map_sysmem(img_addr, 0);
                images->fit_uname_os = fit_uname_kernel;
                images->fit_noffset_os = os_noffset;
                break;
@@ -1423,9 +1297,14 @@ U_BOOT_CMD(
 /* helper routines */
 /*******************************************************************/
 #if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
+
+#define CONSOLE_ARG     "console="
+#define CONSOLE_ARG_LEN (sizeof(CONSOLE_ARG) - 1)
+
 static void fixup_silent_linux(void)
 {
-       char buf[256], *start, *end;
+       char *buf;
+       const char *env_val;
        char *cmdline = getenv("bootargs");
 
        /* Only fix cmdline when requested */
@@ -1433,25 +1312,37 @@ static void fixup_silent_linux(void)
                return;
 
        debug("before silent fix-up: %s\n", cmdline);
-       if (cmdline) {
-               start = strstr(cmdline, "console=");
+       if (cmdline && (cmdline[0] != '\0')) {
+               char *start = strstr(cmdline, CONSOLE_ARG);
+
+               /* Allocate space for maximum possible new command line */
+               buf = malloc(strlen(cmdline) + 1 + CONSOLE_ARG_LEN + 1);
+               if (!buf) {
+                       debug("%s: out of memory\n", __func__);
+                       return;
+               }
+
                if (start) {
-                       end = strchr(start, ' ');
-                       strncpy(buf, cmdline, (start - cmdline + 8));
+                       char *end = strchr(start, ' ');
+                       int num_start_bytes = start - cmdline + CONSOLE_ARG_LEN;
+
+                       strncpy(buf, cmdline, num_start_bytes);
                        if (end)
-                               strcpy(buf + (start - cmdline + 8), end);
+                               strcpy(buf + num_start_bytes, end);
                        else
-                               buf[start - cmdline + 8] = '\0';
+                               buf[num_start_bytes] = '\0';
                } else {
-                       strcpy(buf, cmdline);
-                       strcat(buf, " console=");
+                       sprintf(buf, "%s %s", cmdline, CONSOLE_ARG);
                }
+               env_val = buf;
        } else {
-               strcpy(buf, "console=");
+               buf = NULL;
+               env_val = CONSOLE_ARG;
        }
 
-       setenv("bootargs", buf);
-       debug("after silent fix-up: %s\n", buf);
+       setenv("bootargs", env_val);
+       debug("after silent fix-up: %s\n", env_val);
+       free(buf);
 }
 #endif /* CONFIG_SILENT_CONSOLE */
 
@@ -1803,7 +1694,7 @@ static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc,
 
 #if defined(CONFIG_OF_LIBFDT)
        /* find flattened device tree */
-       ret = boot_get_fdt(flag, argc, argv, images,
+       ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, images,
                           &images->ft_addr, &images->ft_len);
        if (ret) {
                puts("Could not find a valid device tree\n");
index 7a3789e3ed4bc312926e81c0002fc580c8422217..618ff7c8d62ba36601db5f9b0c967b23d72d01be 100644 (file)
@@ -8,13 +8,12 @@
 
 #include <common.h>
 #include <command.h>
+#include <net.h>
 
 #if !defined(CONFIG_UPDATE_TFTP)
 #error "CONFIG_UPDATE_TFTP required"
 #endif
 
-extern int update_tftp(ulong addr);
-
 static int do_fitupd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        ulong addr = 0UL;
index 1341604c5c2a70f226d3dde63db85c5476b354b9..3cd1b13b3376cb7f9b0d58bd551a254a7037bd16 100644 (file)
  */
 #include <common.h>
 #include <command.h>
-#if defined(CONFIG_CMD_NET)
-#include <net.h>
-#endif
 #include <fpga.h>
 #include <malloc.h>
 
 /* Local functions */
-static int fpga_get_op (char *opstr);
+static int fpga_get_op(char *opstr);
 
 /* Local defines */
 #define FPGA_NONE   -1
@@ -44,102 +41,6 @@ static int fpga_get_op (char *opstr);
 #define FPGA_DUMP   3
 #define FPGA_LOADMK 4
 
-/* Convert bitstream data and load into the fpga */
-int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
-{
-#if defined(CONFIG_FPGA_XILINX)
-       unsigned int length;
-       unsigned int swapsize;
-       char buffer[80];
-       unsigned char *dataptr;
-       unsigned int i;
-       int rc;
-
-       dataptr = (unsigned char *)fpgadata;
-
-       /* skip the first bytes of the bitsteam, their meaning is unknown */
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       dataptr+=length;
-
-       /* get design name (identifier, length, string) */
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       if (*dataptr++ != 0x61) {
-               debug("%s: Design name identifier not recognized "
-                       "in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-
-       printf("  design filename = \"%s\"\n", buffer);
-
-       /* get part number (identifier, length, string) */
-       if (*dataptr++ != 0x62) {
-               printf("%s: Part number identifier not recognized "
-                       "in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  part number = \"%s\"\n", buffer);
-
-       /* get date (identifier, length, string) */
-       if (*dataptr++ != 0x63) {
-               printf("%s: Date identifier not recognized in bitstream\n",
-                      __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  date = \"%s\"\n", buffer);
-
-       /* get time (identifier, length, string) */
-       if (*dataptr++ != 0x64) {
-               printf("%s: Time identifier not recognized in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  time = \"%s\"\n", buffer);
-
-       /* get fpga data length (identifier, length) */
-       if (*dataptr++ != 0x65) {
-               printf("%s: Data length identifier not recognized in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-       swapsize = ((unsigned int) *dataptr     <<24) +
-                  ((unsigned int) *(dataptr+1) <<16) +
-                  ((unsigned int) *(dataptr+2) <<8 ) +
-                  ((unsigned int) *(dataptr+3)     ) ;
-       dataptr+=4;
-       printf("  bytes in bitstream = %d\n", swapsize);
-
-       rc = fpga_load(dev, dataptr, swapsize);
-       return rc;
-#else
-       printf("Bitstream support only for Xilinx devices\n");
-       return FPGA_FAIL;
-#endif
-}
-
 /* ------------------------------------------------------------------------- */
 /* command form:
  *   fpga <op> <device number> <data addr> <datasize>
@@ -148,81 +49,81 @@ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
  * If there is no data addr field, the fpgadata environment variable is used.
  * The info command requires no data address field.
  */
-int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
        int op, dev = FPGA_INVALID_DEVICE;
        size_t data_size = 0;
        void *fpga_data = NULL;
-       char *devstr = getenv ("fpga");
-       char *datastr = getenv ("fpgadata");
+       char *devstr = getenv("fpga");
+       char *datastr = getenv("fpgadata");
        int rc = FPGA_FAIL;
        int wrong_parms = 0;
-#if defined (CONFIG_FIT)
+#if defined(CONFIG_FIT)
        const char *fit_uname = NULL;
        ulong fit_addr;
 #endif
 
        if (devstr)
-               dev = (int) simple_strtoul (devstr, NULL, 16);
+               dev = (int) simple_strtoul(devstr, NULL, 16);
        if (datastr)
-               fpga_data = (void *) simple_strtoul (datastr, NULL, 16);
+               fpga_data = (void *)simple_strtoul(datastr, NULL, 16);
 
        switch (argc) {
        case 5:         /* fpga <op> <dev> <data> <datasize> */
-               data_size = simple_strtoul (argv[4], NULL, 16);
+               data_size = simple_strtoul(argv[4], NULL, 16);
 
        case 4:         /* fpga <op> <dev> <data> */
 #if defined(CONFIG_FIT)
-               if (fit_parse_subimage (argv[3], (ulong)fpga_data,
-                                       &fit_addr, &fit_uname)) {
+               if (fit_parse_subimage(argv[3], (ulong)fpga_data,
+                                      &fit_addr, &fit_uname)) {
                        fpga_data = (void *)fit_addr;
-                       debug("*  fpga: subimage '%s' from FIT image "
-                               "at 0x%08lx\n",
-                               fit_uname, fit_addr);
+                       debug("*  fpga: subimage '%s' from FIT image ",
+                             fit_uname);
+                       debug("at 0x%08lx\n", fit_addr);
                } else
 #endif
                {
-                       fpga_data = (void *) simple_strtoul (argv[3], NULL, 16);
+                       fpga_data = (void *)simple_strtoul(argv[3], NULL, 16);
                        debug("*  fpga: cmdline image address = 0x%08lx\n",
-                               (ulong)fpga_data);
+                             (ulong)fpga_data);
                }
-               debug("%s: fpga_data = 0x%x\n", __func__, (uint) fpga_data);
+               debug("%s: fpga_data = 0x%x\n", __func__, (uint)fpga_data);
 
        case 3:         /* fpga <op> <dev | data addr> */
-               dev = (int) simple_strtoul (argv[2], NULL, 16);
+               dev = (int)simple_strtoul(argv[2], NULL, 16);
                debug("%s: device = %d\n", __func__, dev);
                /* FIXME - this is a really weak test */
-               if ((argc == 3) && (dev > fpga_count ())) {     /* must be buffer ptr */
+               if ((argc == 3) && (dev > fpga_count())) {
+                       /* must be buffer ptr */
                        debug("%s: Assuming buffer pointer in arg 3\n",
-                               __func__);
+                             __func__);
 
 #if defined(CONFIG_FIT)
-                       if (fit_parse_subimage (argv[2], (ulong)fpga_data,
-                                               &fit_addr, &fit_uname)) {
+                       if (fit_parse_subimage(argv[2], (ulong)fpga_data,
+                                              &fit_addr, &fit_uname)) {
                                fpga_data = (void *)fit_addr;
-                               debug("*  fpga: subimage '%s' from FIT image "
-                                       "at 0x%08lx\n",
-                                       fit_uname, fit_addr);
+                               debug("*  fpga: subimage '%s' from FIT image ",
+                                     fit_uname);
+                               debug("at 0x%08lx\n", fit_addr);
                        } else
 #endif
                        {
-                               fpga_data = (void *) dev;
-                               debug("*  fpga: cmdline image address = "
-                                       "0x%08lx\n", (ulong)fpga_data);
+                               fpga_data = (void *)dev;
+                               debug("*  fpga: cmdline image addr = 0x%08lx\n",
+                                     (ulong)fpga_data);
                        }
 
                        debug("%s: fpga_data = 0x%x\n",
-                               __func__, (uint) fpga_data);
+                             __func__, (uint)fpga_data);
                        dev = FPGA_INVALID_DEVICE;      /* reset device num */
                }
 
        case 2:         /* fpga <op> */
-               op = (int) fpga_get_op (argv[1]);
+               op = (int)fpga_get_op(argv[1]);
                break;
 
        default:
-               debug("%s: Too many or too few args (%d)\n",
-                       __func__, argc);
+               debug("%s: Too many or too few args (%d)\n", __func__, argc);
                op = FPGA_NONE; /* force usage display */
                break;
        }
@@ -258,11 +159,11 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_USAGE;
 
        case FPGA_INFO:
-               rc = fpga_info (dev);
+               rc = fpga_info(dev);
                break;
 
        case FPGA_LOAD:
-               rc = fpga_load (dev, fpga_data, data_size);
+               rc = fpga_load(dev, fpga_data, data_size);
                break;
 
        case FPGA_LOADB:
@@ -270,15 +171,16 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                break;
 
        case FPGA_LOADMK:
-               switch (genimg_get_format (fpga_data)) {
+               switch (genimg_get_format(fpga_data)) {
                case IMAGE_FORMAT_LEGACY:
                        {
-                               image_header_t *hdr = (image_header_t *)fpga_data;
-                               ulong   data;
+                               image_header_t *hdr =
+                                               (image_header_t *)fpga_data;
+                               ulong data;
 
-                               data = (ulong)image_get_data (hdr);
-                               data_size = image_get_data_size (hdr);
-                               rc = fpga_load (dev, (void *)data, data_size);
+                               data = (ulong)image_get_data(hdr);
+                               data_size = image_get_data_size(hdr);
+                               rc = fpga_load(dev, (void *)data, data_size);
                        }
                        break;
 #if defined(CONFIG_FIT)
@@ -289,19 +191,21 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                                const void *fit_data;
 
                                if (fit_uname == NULL) {
-                                       puts ("No FIT subimage unit name\n");
+                                       puts("No FIT subimage unit name\n");
                                        return 1;
                                }
 
-                               if (!fit_check_format (fit_hdr)) {
-                                       puts ("Bad FIT image format\n");
+                               if (!fit_check_format(fit_hdr)) {
+                                       puts("Bad FIT image format\n");
                                        return 1;
                                }
 
                                /* get fpga component image node offset */
-                               noffset = fit_image_get_node (fit_hdr, fit_uname);
+                               noffset = fit_image_get_node(fit_hdr,
+                                                            fit_uname);
                                if (noffset < 0) {
-                                       printf ("Can't find '%s' FIT subimage\n", fit_uname);
+                                       printf("Can't find '%s' FIT subimage\n",
+                                              fit_uname);
                                        return 1;
                                }
 
@@ -312,72 +216,72 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                                }
 
                                /* get fpga subimage data address and length */
-                               if (fit_image_get_data (fit_hdr, noffset, &fit_data, &data_size)) {
-                                       puts ("Could not find fpga subimage data\n");
+                               if (fit_image_get_data(fit_hdr, noffset,
+                                                      &fit_data, &data_size)) {
+                                       puts("Fpga subimage data not found\n");
                                        return 1;
                                }
 
-                               rc = fpga_load (dev, fit_data, data_size);
+                               rc = fpga_load(dev, fit_data, data_size);
                        }
                        break;
 #endif
                default:
-                       puts ("** Unknown image type\n");
+                       puts("** Unknown image type\n");
                        rc = FPGA_FAIL;
                        break;
                }
                break;
 
        case FPGA_DUMP:
-               rc = fpga_dump (dev, fpga_data, data_size);
+               rc = fpga_dump(dev, fpga_data, data_size);
                break;
 
        default:
-               printf ("Unknown operation\n");
+               printf("Unknown operation\n");
                return CMD_RET_USAGE;
        }
-       return (rc);
+       return rc;
 }
 
 /*
  * Map op to supported operations.  We don't use a table since we
  * would just have to relocate it from flash anyway.
  */
-static int fpga_get_op (char *opstr)
+static int fpga_get_op(char *opstr)
 {
        int op = FPGA_NONE;
 
-       if (!strcmp ("info", opstr)) {
+       if (!strcmp("info", opstr))
                op = FPGA_INFO;
-       } else if (!strcmp ("loadb", opstr)) {
+       else if (!strcmp("loadb", opstr))
                op = FPGA_LOADB;
-       } else if (!strcmp ("load", opstr)) {
+       else if (!strcmp("load", opstr))
                op = FPGA_LOAD;
-       } else if (!strcmp ("loadmk", opstr)) {
+       else if (!strcmp("loadmk", opstr))
                op = FPGA_LOADMK;
-       } else if (!strcmp ("dump", opstr)) {
+       else if (!strcmp("dump", opstr))
                op = FPGA_DUMP;
-       }
 
-       if (op == FPGA_NONE) {
-               printf ("Unknown fpga operation \"%s\"\n", opstr);
-       }
+       if (op == FPGA_NONE)
+               printf("Unknown fpga operation \"%s\"\n", opstr);
+
        return op;
 }
 
-U_BOOT_CMD (fpga, 6, 1, do_fpga,
-       "loadable FPGA image support",
-       "[operation type] [device number] [image address] [image size]\n"
-       "fpga operations:\n"
-       "  dump\t[dev]\t\t\tLoad device to memory buffer\n"
-       "  info\t[dev]\t\t\tlist known device information\n"
-       "  load\t[dev] [address] [size]\tLoad device from memory buffer\n"
-       "  loadb\t[dev] [address] [size]\t"
-       "Load device from bitstream buffer (Xilinx only)\n"
-       "  loadmk [dev] [address]\tLoad device generated with mkimage"
+U_BOOT_CMD(fpga, 6, 1, do_fpga,
+          "loadable FPGA image support",
+          "[operation type] [device number] [image address] [image size]\n"
+          "fpga operations:\n"
+          "  dump\t[dev]\t\t\tLoad device to memory buffer\n"
+          "  info\t[dev]\t\t\tlist known device information\n"
+          "  load\t[dev] [address] [size]\tLoad device from memory buffer\n"
+          "  loadb\t[dev] [address] [size]\t"
+          "Load device from bitstream buffer (Xilinx only)\n"
+          "  loadmk [dev] [address]\tLoad device generated with mkimage"
 #if defined(CONFIG_FIT)
-       "\n"
-       "\tFor loadmk operating on FIT format uImage address must include\n"
-       "\tsubimage unit name in the form of addr:<subimg_uname>"
+          "\n"
+          "\tFor loadmk operating on FIT format uImage address must include\n"
+          "\tsubimage unit name in the form of addr:<subimg_uname>"
 #endif
 );
diff --git a/common/cmd_fuse.c b/common/cmd_fuse.c
new file mode 100644 (file)
index 0000000..f24c01c
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * (C) Copyright 2009-2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on the mpc512x iim code:
+ * Copyright 2008 Silicon Turnkey Express, Inc.
+ * Martha Marx <mmarx@silicontkx.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 <command.h>
+#include <fuse.h>
+#include <asm/errno.h>
+
+static int strtou32(const char *str, unsigned int base, u32 *result)
+{
+       char *ep;
+
+       *result = simple_strtoul(str, &ep, base);
+       if (ep == str || *ep != '\0')
+               return -EINVAL;
+
+       return 0;
+}
+
+static int confirm_prog(void)
+{
+       puts("Warning: Programming fuses is an irreversible operation!\n"
+                       "         This may brick your system.\n"
+                       "         Use this command only if you are sure of "
+                                       "what you are doing!\n"
+                       "\nReally perform this fuse programming? <y/N>\n");
+
+       if (getc() == 'y') {
+               int c;
+
+               putc('y');
+               c = getc();
+               putc('\n');
+               if (c == '\r')
+                       return 1;
+       }
+
+       puts("Fuse programming aborted\n");
+       return 0;
+}
+
+static int do_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+       const char *op = argc >= 2 ? argv[1] : NULL;
+       int confirmed = argc >= 3 && !strcmp(argv[2], "-y");
+       u32 bank, word, cnt, val;
+       int ret, i;
+
+       argc -= 2 + confirmed;
+       argv += 2 + confirmed;
+
+       if (argc < 2 || strtou32(argv[0], 0, &bank) ||
+                       strtou32(argv[1], 0, &word))
+               return CMD_RET_USAGE;
+
+       if (!strcmp(op, "read")) {
+               if (argc == 2)
+                       cnt = 1;
+               else if (argc != 3 || strtou32(argv[2], 0, &cnt))
+                       return CMD_RET_USAGE;
+
+               printf("Reading bank %u:\n", bank);
+               for (i = 0; i < cnt; i++, word++) {
+                       if (!(i % 4))
+                               printf("\nWord 0x%.8x:", word);
+
+                       ret = fuse_read(bank, word, &val);
+                       if (ret)
+                               goto err;
+
+                       printf(" %.8x", val);
+               }
+               putc('\n');
+       } else if (!strcmp(op, "sense")) {
+               if (argc == 2)
+                       cnt = 1;
+               else if (argc != 3 || strtou32(argv[2], 0, &cnt))
+                       return CMD_RET_USAGE;
+
+               printf("Sensing bank %u:\n", bank);
+               for (i = 0; i < cnt; i++, word++) {
+                       if (!(i % 4))
+                               printf("\nWord 0x%.8x:", word);
+
+                       ret = fuse_sense(bank, word, &val);
+                       if (ret)
+                               goto err;
+
+                       printf(" %.8x", val);
+               }
+               putc('\n');
+       } else if (!strcmp(op, "prog")) {
+               if (argc < 3)
+                       return CMD_RET_USAGE;
+
+               for (i = 2; i < argc; i++, word++) {
+                       if (strtou32(argv[i], 16, &val))
+                               return CMD_RET_USAGE;
+
+                       printf("Programming bank %u word 0x%.8x to 0x%.8x...\n",
+                                       bank, word, val);
+                       if (!confirmed && !confirm_prog())
+                               return CMD_RET_FAILURE;
+                       ret = fuse_prog(bank, word, val);
+                       if (ret)
+                               goto err;
+               }
+       } else if (!strcmp(op, "override")) {
+               if (argc < 3)
+                       return CMD_RET_USAGE;
+
+               for (i = 2; i < argc; i++, word++) {
+                       if (strtou32(argv[i], 16, &val))
+                               return CMD_RET_USAGE;
+
+                       printf("Overriding bank %u word 0x%.8x with "
+                                       "0x%.8x...\n", bank, word, val);
+                       ret = fuse_override(bank, word, val);
+                       if (ret)
+                               goto err;
+               }
+       } else {
+               return CMD_RET_USAGE;
+       }
+
+       return 0;
+
+err:
+       puts("ERROR\n");
+       return ret;
+}
+
+U_BOOT_CMD(
+       fuse, CONFIG_SYS_MAXARGS, 0, do_fuse,
+       "Fuse sub-system",
+            "read <bank> <word> [<cnt>] - read 1 or 'cnt' fuse words,\n"
+       "    starting at 'word'\n"
+       "fuse sense <bank> <word> [<cnt>] - sense 1 or 'cnt' fuse words,\n"
+       "    starting at 'word'\n"
+       "fuse prog [-y] <bank> <word> <hexval> [<hexval>...] - program 1 or\n"
+       "    several fuse words, starting at 'word' (PERMANENT)\n"
+       "fuse override <bank> <word> <hexval> [<hexval>...] - override 1 or\n"
+       "    several fuse words, starting at 'word'"
+);
index fdf9489b2e99270921240cf265c558b6afc81895..bb15795e22ef567970f7600ba25e3f7ee3d9d26b 100644 (file)
@@ -535,7 +535,7 @@ do_i2cinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        volatile iic_t *iip;
        uint dpaddr;
 
-       dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE]));
+       dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
        if (dpaddr == 0)
                iip = NULL;
        else
index 64dd76a0f5dfbb5a35b52a4cd14b1c8c80a5d5b3..6df00b15d3f1823a3df9be934efea0c79326f89a 100644 (file)
@@ -445,7 +445,7 @@ static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 
        bytes = size * count;
-       buf = map_sysmem(addr, bytes);
+       buf = map_sysmem(dest, bytes);
        src = map_sysmem(addr, bytes);
        while (count-- > 0) {
                if (size == 4)
index e9d3d3c1bf6238d20ad3abc310cbc306fab473dd..8b1e01ae8094f9a4236f6d9897a8e341121f987c 100644 (file)
@@ -62,8 +62,8 @@ static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)
        ops.oobbuf = oobbuf;
        ops.len = nand->writesize;
        ops.ooblen = nand->oobsize;
-       ops.mode = MTD_OOB_RAW;
-       i = nand->read_oob(nand, addr, &ops);
+       ops.mode = MTD_OPS_RAW;
+       i = mtd_read_oob(nand, addr, &ops);
        if (i < 0) {
                printf("Error (%d) reading page %08lx\n", i, off);
                free(datbuf);
@@ -404,13 +404,13 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
                        .oobbuf = ((u8 *)addr) + nand->writesize,
                        .len = nand->writesize,
                        .ooblen = nand->oobsize,
-                       .mode = MTD_OOB_RAW
+                       .mode = MTD_OPS_RAW
                };
 
                if (read)
-                       ret = nand->read_oob(nand, off, &ops);
+                       ret = mtd_read_oob(nand, off, &ops);
                else
-                       ret = nand->write_oob(nand, off, &ops);
+                       ret = mtd_write_oob(nand, off, &ops);
 
                if (ret) {
                        printf("%s: error at offset %llx, ret %d\n",
@@ -425,6 +425,31 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
        return ret;
 }
 
+/* Adjust a chip/partition size down for bad blocks so we don't
+ * read/write/erase past the end of a chip/partition by accident.
+ */
+static void adjust_size_for_badblocks(loff_t *size, loff_t offset, int dev)
+{
+       /* We grab the nand info object here fresh because this is usually
+        * called after arg_off_size() which can change the value of dev.
+        */
+       nand_info_t *nand = &nand_info[dev];
+       loff_t maxoffset = offset + *size;
+       int badblocks = 0;
+
+       /* count badblocks in NAND from offset to offset + size */
+       for (; offset < maxoffset; offset += nand->erasesize) {
+               if (nand_block_isbad(nand, offset))
+                       badblocks++;
+       }
+       /* adjust size if any bad blocks found */
+       if (badblocks) {
+               *size -= badblocks * nand->erasesize;
+               printf("size adjusted to 0x%llx (%d bad blocks)\n",
+                      (unsigned long long)*size, badblocks);
+       }
+}
+
 static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        int i, ret = 0;
@@ -521,6 +546,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                int scrub = !strncmp(cmd, "scrub", 5);
                int spread = 0;
                int args = 2;
+               int adjust_size = 0;
                const char *scrub_warn =
                        "Warning: "
                        "scrub option will erase all factory set bad blocks!\n"
@@ -537,8 +563,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                spread = 1;
                        } else if (!strcmp(&cmd[5], ".part")) {
                                args = 1;
+                               adjust_size = 1;
                        } else if (!strcmp(&cmd[5], ".chip")) {
                                args = 0;
+                               adjust_size = 1;
                        } else {
                                goto usage;
                        }
@@ -558,6 +586,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                 &maxsize) != 0)
                        return 1;
 
+               /* size is unspecified */
+               if (adjust_size && !scrub)
+                       adjust_size_for_badblocks(&size, off, dev);
+
                nand = &nand_info[dev];
 
                memset(&opts, 0, sizeof(opts));
@@ -642,6 +674,9 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                                &off, &size, &maxsize) != 0)
                                return 1;
 
+                       /* size is unspecified */
+                       if (argc < 5)
+                               adjust_size_for_badblocks(&size, off, dev);
                        rwsize = size;
                }
 
@@ -680,13 +715,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        mtd_oob_ops_t ops = {
                                .oobbuf = (u8 *)addr,
                                .ooblen = rwsize,
-                               .mode = MTD_OOB_RAW
+                               .mode = MTD_OPS_RAW
                        };
 
                        if (read)
-                               ret = nand->read_oob(nand, off, &ops);
+                               ret = mtd_read_oob(nand, off, &ops);
                        else
-                               ret = nand->write_oob(nand, off, &ops);
+                               ret = mtd_write_oob(nand, off, &ops);
                } else if (raw) {
                        ret = raw_access(nand, addr, off, pagecount, read);
                } else {
@@ -729,7 +764,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                while (argc > 0) {
                        addr = simple_strtoul(*argv, NULL, 16);
 
-                       if (nand->block_markbad(nand, addr)) {
+                       if (mtd_block_markbad(nand, addr)) {
                                printf("block 0x%08lx NOT marked "
                                        "as bad! ERROR %d\n",
                                        addr, ret);
index a0d25e55212a0c9633e89d62331f3ed223c694df..06cc1405675a64f6d3c6dd637e9562817527e5ac 100644 (file)
@@ -83,7 +83,7 @@ static int onenand_block_read(loff_t from, size_t len,
                ops.len = blocksize;
 
        while (blocks) {
-               ret = mtd->block_isbad(mtd, ofs);
+               ret = mtd_block_isbad(mtd, ofs);
                if (ret) {
                        printk("Bad blocks %d at 0x%x\n",
                               (u32)(ofs >> this->erase_shift), (u32)ofs);
@@ -97,7 +97,7 @@ static int onenand_block_read(loff_t from, size_t len,
                        ops.datbuf = buf;
 
                ops.retlen = 0;
-               ret = mtd->read_oob(mtd, ofs, &ops);
+               ret = mtd_read_oob(mtd, ofs, &ops);
                if (ret) {
                        printk("Read failed 0x%x, %d\n", (u32)ofs, ret);
                        ofs += blocksize;
@@ -118,7 +118,7 @@ static int onenand_write_oneblock_withoob(loff_t to, const u_char * buf,
        struct mtd_oob_ops ops = {
                .len = mtd->writesize,
                .ooblen = mtd->oobsize,
-               .mode = MTD_OOB_AUTO,
+               .mode = MTD_OPS_AUTO_OOB,
        };
        int page, ret = 0;
        for (page = 0; page < (mtd->erasesize / mtd->writesize); page ++) {
@@ -126,7 +126,7 @@ static int onenand_write_oneblock_withoob(loff_t to, const u_char * buf,
                buf += mtd->writesize;
                ops.oobbuf = (u_char *)buf;
                buf += mtd->oobsize;
-               ret = mtd->write_oob(mtd, to, &ops);
+               ret = mtd_write_oob(mtd, to, &ops);
                if (ret)
                        break;
                to += mtd->writesize;
@@ -156,7 +156,7 @@ static int onenand_block_write(loff_t to, size_t len,
        ofs = to;
 
        while (blocks) {
-               ret = mtd->block_isbad(mtd, ofs);
+               ret = mtd_block_isbad(mtd, ofs);
                if (ret) {
                        printk("Bad blocks %d at 0x%x\n",
                               (u32)(ofs >> this->erase_shift), (u32)ofs);
@@ -165,7 +165,7 @@ static int onenand_block_write(loff_t to, size_t len,
                }
 
                if (!withoob)
-                       ret = mtd->write(mtd, ofs, blocksize, &_retlen, buf);
+                       ret = mtd_write(mtd, ofs, blocksize, &_retlen, buf);
                else
                        ret = onenand_write_oneblock_withoob(ofs, buf, &_retlen);
                if (ret) {
@@ -195,7 +195,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
        int blocksize = 1 << this->erase_shift;
 
        for (ofs = start; ofs < (start + size); ofs += blocksize) {
-               ret = mtd->block_isbad(mtd, ofs);
+               ret = mtd_block_isbad(mtd, ofs);
                if (ret && !force) {
                        printf("Skip erase bad block %d at 0x%x\n",
                               (u32)(ofs >> this->erase_shift), (u32)ofs);
@@ -206,7 +206,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
                instr.len = blocksize;
                instr.priv = force;
                instr.mtd = mtd;
-               ret = mtd->erase(mtd, &instr);
+               ret = mtd_erase(mtd, &instr);
                if (ret) {
                        printf("erase failed block %d at 0x%x\n",
                               (u32)(ofs >> this->erase_shift), (u32)ofs);
@@ -261,7 +261,7 @@ static int onenand_block_test(u32 start, u32 size)
        while (blocks < end_block) {
                printf("\rTesting block %d at 0x%x", (u32)(ofs >> this->erase_shift), (u32)ofs);
 
-               ret = mtd->block_isbad(mtd, ofs);
+               ret = mtd_block_isbad(mtd, ofs);
                if (ret) {
                        printf("Skip erase bad block %d at 0x%x\n",
                               (u32)(ofs >> this->erase_shift), (u32)ofs);
@@ -270,19 +270,19 @@ static int onenand_block_test(u32 start, u32 size)
 
                instr.addr = ofs;
                instr.len = blocksize;
-               ret = mtd->erase(mtd, &instr);
+               ret = mtd_erase(mtd, &instr);
                if (ret) {
                        printk("Erase failed 0x%x, %d\n", (u32)ofs, ret);
                        goto next;
                }
 
-               ret = mtd->write(mtd, ofs, blocksize, &retlen, buf);
+               ret = mtd_write(mtd, ofs, blocksize, &retlen, buf);
                if (ret) {
                        printk("Write failed 0x%x, %d\n", (u32)ofs, ret);
                        goto next;
                }
 
-               ret = mtd->read(mtd, ofs, blocksize, &retlen, verify_buf);
+               ret = mtd_read(mtd, ofs, blocksize, &retlen, verify_buf);
                if (ret) {
                        printk("Read failed 0x%x, %d\n", (u32)ofs, ret);
                        goto next;
@@ -324,7 +324,7 @@ static int onenand_dump(struct mtd_info *mtd, ulong off, int only_oob)
        ops.len = mtd->writesize;
        ops.ooblen = mtd->oobsize;
        ops.retlen = 0;
-       i = mtd->read_oob(mtd, addr, &ops);
+       i = mtd_read_oob(mtd, addr, &ops);
        if (i < 0) {
                printf("Error (%d) reading page %08lx\n", i, off);
                free(datbuf);
@@ -373,7 +373,7 @@ static int do_onenand_bad(cmd_tbl_t * cmdtp, int flag, int argc, char * const ar
        /* Currently only one OneNAND device is supported */
        printf("\nDevice %d bad blocks:\n", 0);
        for (ofs = 0; ofs < mtd->size; ofs += mtd->erasesize) {
-               if (mtd->block_isbad(mtd, ofs))
+               if (mtd_block_isbad(mtd, ofs))
                        printf("  %08x\n", (u32)ofs);
        }
 
@@ -530,7 +530,7 @@ static int do_onenand_markbad(cmd_tbl_t * cmdtp, int flag, int argc, char * cons
        while (argc > 0) {
                addr = simple_strtoul(*argv, NULL, 16);
 
-               if (mtd->block_markbad(mtd, addr)) {
+               if (mtd_block_markbad(mtd, addr)) {
                        printf("block 0x%08lx NOT marked "
                                "as bad! ERROR %d\n",
                                addr, ret);
index faa903d2f0251cd2459daef22d6d6514124dc86c..e8bde37266adb9553e192cea11c2341b58bf2103 100644 (file)
@@ -68,7 +68,7 @@ void env_relocate_spec(void)
        /* Check OneNAND exist */
        if (mtd->writesize)
                /* Ignore read fail */
-               mtd->read(mtd, env_addr, ONENAND_MAX_ENV_SIZE,
+               mtd_read(mtd, env_addr, ONENAND_MAX_ENV_SIZE,
                                &retlen, (u_char *)buf);
        else
                mtd->writesize = MAX_ONENAND_PAGESIZE;
@@ -113,12 +113,12 @@ int saveenv(void)
 #endif
        instr.addr = env_addr;
        instr.mtd = mtd;
-       if (mtd->erase(mtd, &instr)) {
+       if (mtd_erase(mtd, &instr)) {
                printf("OneNAND: erase failed at 0x%08llx\n", env_addr);
                return 1;
        }
 
-       if (mtd->write(mtd, env_addr, ONENAND_MAX_ENV_SIZE, &retlen,
+       if (mtd_write(mtd, env_addr, ONENAND_MAX_ENV_SIZE, &retlen,
                        (u_char *)&env_new)) {
                printf("OneNAND: write failed at 0x%llx\n", instr.addr);
                return 2;
index 812acb401c176f81976fceb05e637fec024dc91c..9a6f6b7d8b16c822496c53a62df26d3850081b29 100644 (file)
@@ -387,7 +387,11 @@ static void write_cell(u8 *addr, u64 val, int size)
        }
 }
 
+#ifdef CONFIG_NR_DRAM_BANKS
+#define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS
+#else
 #define MEMORY_BANKS_MAX 4
+#endif
 int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
 {
        int err, nodeoffset;
@@ -454,7 +458,7 @@ void fdt_fixup_ethernet(void *fdt)
 {
        int node, i, j;
        char enet[16], *tmp, *end;
-       char mac[16] = "ethaddr";
+       char mac[16];
        const char *path;
        unsigned char mac_addr[6];
 
@@ -463,6 +467,7 @@ void fdt_fixup_ethernet(void *fdt)
                return;
 
        i = 0;
+       strcpy(mac, "ethaddr");
        while ((tmp = getenv(mac)) != NULL) {
                sprintf(enet, "ethernet%d", i);
                path = fdt_getprop(fdt, node, enet, NULL);
index 158c9cfbf57de7f5437038740d0489649ab87dfb..0d421d92fb66b55423b269eeca9e0d425d1f5fa2 100644 (file)
@@ -211,51 +211,11 @@ error:
        return 1;
 }
 
-#if defined(CONFIG_FIT)
-/**
- * fit_check_fdt - verify FIT format FDT subimage
- * @fit_hdr: pointer to the FIT  header
- * fdt_noffset: FDT subimage node offset within FIT image
- * @verify: data CRC verification flag
- *
- * fit_check_fdt() verifies integrity of the FDT subimage and from
- * specified FIT image.
- *
- * returns:
- *     1, on success
- *     0, on failure
- */
-static int fit_check_fdt(const void *fit, int fdt_noffset, int verify)
-{
-       fit_image_print(fit, fdt_noffset, "   ");
-
-       if (verify) {
-               puts("   Verifying Hash Integrity ... ");
-               if (!fit_image_verify(fit, fdt_noffset)) {
-                       fdt_error("Bad Data Hash");
-                       return 0;
-               }
-               puts("OK\n");
-       }
-
-       if (!fit_image_check_type(fit, fdt_noffset, IH_TYPE_FLATDT)) {
-               fdt_error("Not a FDT image");
-               return 0;
-       }
-
-       if (!fit_image_check_comp(fit, fdt_noffset, IH_COMP_NONE)) {
-               fdt_error("FDT image is compressed");
-               return 0;
-       }
-
-       return 1;
-}
-#endif
-
 /**
  * boot_get_fdt - main fdt handling routine
  * @argc: command argument count
  * @argv: command argument list
+ * @arch: architecture (IH_ARCH_...)
  * @images: pointer to the bootm images structure
  * @of_flat_tree: pointer to a char* variable, will hold fdt start address
  * @of_size: pointer to a ulong variable, will hold fdt length
@@ -273,24 +233,20 @@ static int fit_check_fdt(const void *fit, int fdt_noffset, int verify)
  *     1, if fdt image is found but corrupted
  *     of_flat_tree and of_size are set to 0 if no fdt exists
  */
-int boot_get_fdt(int flag, int argc, char * const argv[],
+int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                bootm_headers_t *images, char **of_flat_tree, ulong *of_size)
 {
        const image_header_t *fdt_hdr;
        ulong           fdt_addr;
        char            *fdt_blob = NULL;
        ulong           image_start, image_data, image_end;
-       ulong           load_start, load_end;
+       ulong           load, load_end;
        void            *buf;
 #if defined(CONFIG_FIT)
-       void            *fit_hdr;
        const char      *fit_uname_config = NULL;
        const char      *fit_uname_fdt = NULL;
        ulong           default_addr;
-       int             cfg_noffset;
        int             fdt_noffset;
-       const void      *data;
-       size_t          size;
 #endif
 
        *of_flat_tree = NULL;
@@ -333,31 +289,15 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                         * command argument
                         */
                        fdt_addr = map_to_sysmem(images->fit_hdr_os);
-                       fit_uname_config = images->fit_uname_cfg;
-                       debug("*  fdt: using config '%s' from image at 0x%08lx\n",
-                             fit_uname_config, fdt_addr);
-
-                       /*
-                        * Check whether configuration has FDT blob defined,
-                        * if not quit silently.
-                        */
-                       fit_hdr = images->fit_hdr_os;
-                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                       fit_uname_config);
-                       if (cfg_noffset < 0) {
-                               debug("*  fdt: no such config\n");
+                       fdt_noffset = fit_get_node_from_config(images,
+                                                              FIT_FDT_PROP,
+                                                              fdt_addr);
+                       if (fdt_noffset == -ENOLINK)
                                return 0;
-                       }
-
-                       fdt_noffset = fit_conf_get_fdt_node(fit_hdr,
-                                       cfg_noffset);
-                       if (fdt_noffset < 0) {
-                               debug("*  fdt: no fdt in config\n");
-                               return 0;
-                       }
+                       else if (fdt_noffset < 0)
+                               return 1;
                }
 #endif
-
                debug("## Checking for 'FDT'/'FDT Image' at %08lx\n",
                      fdt_addr);
 
@@ -387,29 +327,28 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                        image_data = (ulong)image_get_data(fdt_hdr);
                        image_end = image_get_image_end(fdt_hdr);
 
-                       load_start = image_get_load(fdt_hdr);
-                       load_end = load_start + image_get_data_size(fdt_hdr);
+                       load = image_get_load(fdt_hdr);
+                       load_end = load + image_get_data_size(fdt_hdr);
 
-                       if (load_start == image_start ||
-                           load_start == image_data) {
+                       if (load == image_start ||
+                           load == image_data) {
                                fdt_blob = (char *)image_data;
                                break;
                        }
 
-                       if ((load_start < image_end) &&
-                           (load_end > image_start)) {
+                       if ((load < image_end) && (load_end > image_start)) {
                                fdt_error("fdt overwritten");
                                goto error;
                        }
 
                        debug("   Loading FDT from 0x%08lx to 0x%08lx\n",
-                             image_data, load_start);
+                             image_data, load);
 
-                       memmove((void *)load_start,
+                       memmove((void *)load,
                                (void *)image_data,
                                image_get_data_size(fdt_hdr));
 
-                       fdt_blob = (char *)load_start;
+                       fdt_addr = load;
                        break;
                case IMAGE_FORMAT_FIT:
                        /*
@@ -420,107 +359,20 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
 #if defined(CONFIG_FIT)
                        /* check FDT blob vs FIT blob */
                        if (fit_check_format(buf)) {
-                               /*
-                                * FIT image
-                                */
-                               fit_hdr = buf;
-                               printf("## Flattened Device Tree from FIT Image at %08lx\n",
-                                      fdt_addr);
-
-                               if (!fit_uname_fdt) {
-                                       /*
-                                        * no FDT blob image node unit name,
-                                        * try to get config node first. If
-                                        * config unit node name is NULL
-                                        * fit_conf_get_node() will try to
-                                        * find default config node
-                                        */
-                                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                                       fit_uname_config);
-
-                                       if (cfg_noffset < 0) {
-                                               fdt_error("Could not find configuration node\n");
-                                               goto error;
-                                       }
-
-                                       fit_uname_config = fdt_get_name(fit_hdr,
-                                                       cfg_noffset, NULL);
-                                       printf("   Using '%s' configuration\n",
-                                              fit_uname_config);
-
-                                       fdt_noffset = fit_conf_get_fdt_node(
-                                                       fit_hdr,
-                                                       cfg_noffset);
-                                       fit_uname_fdt = fit_get_name(fit_hdr,
-                                                       fdt_noffset, NULL);
-                               } else {
-                                       /*
-                                        * get FDT component image node
-                                        * offset
-                                        */
-                                       fdt_noffset = fit_image_get_node(
-                                                               fit_hdr,
-                                                               fit_uname_fdt);
-                               }
-                               if (fdt_noffset < 0) {
-                                       fdt_error("Could not find subimage node\n");
-                                       goto error;
-                               }
-
-                               printf("   Trying '%s' FDT blob subimage\n",
-                                      fit_uname_fdt);
-
-                               if (!fit_check_fdt(fit_hdr, fdt_noffset,
-                                                  images->verify))
-                                       goto error;
-
-                               /* get ramdisk image data address and length */
-                               if (fit_image_get_data(fit_hdr, fdt_noffset,
-                                                      &data, &size)) {
-                                       fdt_error("Could not find FDT subimage data");
-                                       goto error;
-                               }
+                               ulong load, len;
 
-                               /*
-                                * verify that image data is a proper FDT
-                                * blob
-                                */
-                               if (fdt_check_header((char *)data) != 0) {
-                                       fdt_error("Subimage data is not a FTD");
-                                       goto error;
-                               }
-
-                               /*
-                                * move image data to the load address,
-                                * make sure we don't overwrite initial image
-                                */
-                               image_start = (ulong)fit_hdr;
-                               image_end = fit_get_end(fit_hdr);
-
-                               if (fit_image_get_load(fit_hdr, fdt_noffset,
-                                                      &load_start) == 0) {
-                                       load_end = load_start + size;
+                               fdt_noffset = fit_image_load(images,
+                                       FIT_FDT_PROP,
+                                       fdt_addr, &fit_uname_fdt,
+                                       fit_uname_config,
+                                       arch, IH_TYPE_FLATDT,
+                                       BOOTSTAGE_ID_FIT_FDT_START,
+                                       FIT_LOAD_OPTIONAL, &load, &len);
 
-                                       if ((load_start < image_end) &&
-                                           (load_end > image_start)) {
-                                               fdt_error("FDT overwritten");
-                                               goto error;
-                                       }
-
-                                       printf("   Loading FDT from 0x%08lx to 0x%08lx\n",
-                                              (ulong)data, load_start);
-
-                                       memmove((void *)load_start,
-                                               (void *)data, size);
-
-                                       fdt_blob = (char *)load_start;
-                               } else {
-                                       fdt_blob = (char *)data;
-                               }
-
-                               images->fit_hdr_fdt = fit_hdr;
+                               images->fit_hdr_fdt = map_sysmem(fdt_addr, 0);
                                images->fit_uname_fdt = fit_uname_fdt;
                                images->fit_noffset_fdt = fdt_noffset;
+                               fdt_addr = load;
                                break;
                        } else
 #endif
@@ -528,7 +380,6 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                                /*
                                 * FDT blob
                                 */
-                               fdt_blob = buf;
                                debug("*  fdt: raw FDT blob\n");
                                printf("## Flattened Device Tree blob at %08lx\n",
                                       (long)fdt_addr);
@@ -539,8 +390,8 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                        goto error;
                }
 
-               printf("   Booting using the fdt blob at 0x%p\n", fdt_blob);
-
+               printf("   Booting using the fdt blob at %#08lx\n", fdt_addr);
+               fdt_blob = map_sysmem(fdt_addr, 0);
        } else if (images->legacy_hdr_valid &&
                        image_check_type(&images->legacy_hdr_os_copy,
                                         IH_TYPE_MULTI)) {
index 254feecaad7cf807bf905aabfc49f806bc92f70c..7bf82d33cf7bce134b13613a445a5311e2988031 100644 (file)
@@ -31,6 +31,9 @@
 #include <time.h>
 #else
 #include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+DECLARE_GLOBAL_DATA_PTR;
 #endif /* !USE_HOSTCC*/
 
 #include <bootstage.h>
@@ -348,10 +351,13 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
 
 #ifndef USE_HOSTCC
        printf("%s  Data Start:   ", p);
-       if (ret)
+       if (ret) {
                printf("unavailable\n");
-       else
-               printf("0x%08lx\n", (ulong)data);
+       } else {
+               void *vdata = (void *)data;
+
+               printf("0x%08lx\n", (ulong)map_to_sysmem(vdata));
+       }
 #endif
 
        printf("%s  Data Size:    ", p);
@@ -1348,63 +1354,6 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
        return fit_image_get_node(fit, uname);
 }
 
-/**
- * fit_conf_get_kernel_node - get kernel image node offset that corresponds to
- * a given configuration
- * @fit: pointer to the FIT format image header
- * @noffset: configuration node offset
- *
- * fit_conf_get_kernel_node() retrives kernel image node unit name from
- * configuration FIT_KERNEL_PROP property and translates it to the node
- * offset.
- *
- * returns:
- *     image node offset when found (>=0)
- *     negative number on failure (FDT_ERR_* code)
- */
-int fit_conf_get_kernel_node(const void *fit, int noffset)
-{
-       return fit_conf_get_prop_node(fit, noffset, FIT_KERNEL_PROP);
-}
-
-/**
- * fit_conf_get_ramdisk_node - get ramdisk image node offset that corresponds to
- * a given configuration
- * @fit: pointer to the FIT format image header
- * @noffset: configuration node offset
- *
- * fit_conf_get_ramdisk_node() retrives ramdisk image node unit name from
- * configuration FIT_KERNEL_PROP property and translates it to the node
- * offset.
- *
- * returns:
- *     image node offset when found (>=0)
- *     negative number on failure (FDT_ERR_* code)
- */
-int fit_conf_get_ramdisk_node(const void *fit, int noffset)
-{
-       return fit_conf_get_prop_node(fit, noffset, FIT_RAMDISK_PROP);
-}
-
-/**
- * fit_conf_get_fdt_node - get fdt image node offset that corresponds to
- * a given configuration
- * @fit: pointer to the FIT format image header
- * @noffset: configuration node offset
- *
- * fit_conf_get_fdt_node() retrives fdt image node unit name from
- * configuration FIT_KERNEL_PROP property and translates it to the node
- * offset.
- *
- * returns:
- *     image node offset when found (>=0)
- *     negative number on failure (FDT_ERR_* code)
- */
-int fit_conf_get_fdt_node(const void *fit, int noffset)
-{
-       return fit_conf_get_prop_node(fit, noffset, FIT_FDT_PROP);
-}
-
 /**
  * fit_conf_print - prints out the FIT configuration details
  * @fit: pointer to the FIT format image header
@@ -1448,22 +1397,7 @@ void fit_conf_print(const void *fit, int noffset, const char *p)
                printf("%s  FDT:          %s\n", p, uname);
 }
 
-/**
- * fit_check_ramdisk - verify FIT format ramdisk subimage
- * @fit_hdr: pointer to the FIT ramdisk header
- * @rd_noffset: ramdisk subimage node offset within FIT image
- * @arch: requested ramdisk image architecture type
- * @verify: data CRC verification flag
- *
- * fit_check_ramdisk() verifies integrity of the ramdisk subimage and from
- * specified FIT image.
- *
- * returns:
- *     1, on success
- *     0, on failure
- */
-int fit_check_ramdisk(const void *fit, int rd_noffset, uint8_t arch,
-                       int verify)
+int fit_image_select(const void *fit, int rd_noffset, int verify)
 {
        fit_image_print(fit, rd_noffset, "   ");
 
@@ -1471,22 +1405,222 @@ int fit_check_ramdisk(const void *fit, int rd_noffset, uint8_t arch,
                puts("   Verifying Hash Integrity ... ");
                if (!fit_image_verify(fit, rd_noffset)) {
                        puts("Bad Data Hash\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_RD_HASH);
-                       return 0;
+                       return -EACCES;
                }
                puts("OK\n");
        }
 
-       bootstage_mark(BOOTSTAGE_ID_FIT_RD_CHECK_ALL);
-       if (!fit_image_check_os(fit, rd_noffset, IH_OS_LINUX) ||
-           !fit_image_check_arch(fit, rd_noffset, arch) ||
-           !fit_image_check_type(fit, rd_noffset, IH_TYPE_RAMDISK)) {
-               printf("No Linux %s Ramdisk Image\n",
-                      genimg_get_arch_name(arch));
-               bootstage_error(BOOTSTAGE_ID_FIT_RD_CHECK_ALL);
-               return 0;
+       return 0;
+}
+
+int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
+                       ulong addr)
+{
+       int cfg_noffset;
+       void *fit_hdr;
+       int noffset;
+
+       debug("*  %s: using config '%s' from image at 0x%08lx\n",
+             prop_name, images->fit_uname_cfg, addr);
+
+       /* Check whether configuration has this property defined */
+       fit_hdr = map_sysmem(addr, 0);
+       cfg_noffset = fit_conf_get_node(fit_hdr, images->fit_uname_cfg);
+       if (cfg_noffset < 0) {
+               debug("*  %s: no such config\n", prop_name);
+               return -ENOENT;
        }
 
-       bootstage_mark(BOOTSTAGE_ID_FIT_RD_CHECK_ALL_OK);
-       return 1;
+       noffset = fit_conf_get_prop_node(fit_hdr, cfg_noffset, prop_name);
+       if (noffset < 0) {
+               debug("*  %s: no '%s' in config\n", prop_name, prop_name);
+               return -ENOLINK;
+       }
+
+       return noffset;
+}
+
+int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
+                  const char **fit_unamep, const char *fit_uname_config,
+                  int arch, int image_type, int bootstage_id,
+                  enum fit_load_op load_op, ulong *datap, ulong *lenp)
+{
+       int cfg_noffset, noffset;
+       const char *fit_uname;
+       const void *fit;
+       const void *buf;
+       size_t size;
+       int type_ok, os_ok;
+       ulong load, data, len;
+       int ret;
+
+       fit = map_sysmem(addr, 0);
+       fit_uname = fit_unamep ? *fit_unamep : NULL;
+       printf("## Loading %s from FIT Image at %08lx ...\n", prop_name, addr);
+
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_FORMAT);
+       if (!fit_check_format(fit)) {
+               printf("Bad FIT %s image format!\n", prop_name);
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_FORMAT);
+               return -ENOEXEC;
+       }
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_FORMAT_OK);
+       if (fit_uname) {
+               /* get ramdisk component image node offset */
+               bootstage_mark(bootstage_id + BOOTSTAGE_SUB_UNIT_NAME);
+               noffset = fit_image_get_node(fit, fit_uname);
+       } else {
+               /*
+                * no image node unit name, try to get config
+                * node first. If config unit node name is NULL
+                * fit_conf_get_node() will try to find default config node
+                */
+               bootstage_mark(bootstage_id + BOOTSTAGE_SUB_NO_UNIT_NAME);
+               if (IMAGE_ENABLE_BEST_MATCH && !fit_uname_config) {
+                       cfg_noffset = fit_conf_find_compat(fit, gd_fdt_blob());
+               } else {
+                       cfg_noffset = fit_conf_get_node(fit,
+                                                       fit_uname_config);
+               }
+               if (cfg_noffset < 0) {
+                       puts("Could not find configuration node\n");
+                       bootstage_error(bootstage_id +
+                                       BOOTSTAGE_SUB_NO_UNIT_NAME);
+                       return -ENOENT;
+               }
+               fit_uname_config = fdt_get_name(fit, cfg_noffset, NULL);
+               printf("   Using '%s' configuration\n", fit_uname_config);
+               if (image_type == IH_TYPE_KERNEL) {
+                       /* Remember (and possibly verify) this config */
+                       images->fit_uname_cfg = fit_uname_config;
+                       if (IMAGE_ENABLE_VERIFY && images->verify) {
+                               puts("   Verifying Hash Integrity ... ");
+                               if (!fit_config_verify(fit, cfg_noffset)) {
+                                       puts("Bad Data Hash\n");
+                                       bootstage_error(bootstage_id +
+                                               BOOTSTAGE_SUB_HASH);
+                                       return -EACCES;
+                               }
+                               puts("OK\n");
+                       }
+                       bootstage_mark(BOOTSTAGE_ID_FIT_CONFIG);
+               }
+
+               noffset = fit_conf_get_prop_node(fit, cfg_noffset,
+                                                prop_name);
+               fit_uname = fit_get_name(fit, noffset, NULL);
+       }
+       if (noffset < 0) {
+               puts("Could not find subimage node\n");
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_SUBNODE);
+               return -ENOENT;
+       }
+
+       printf("   Trying '%s' %s subimage\n", fit_uname, prop_name);
+
+       ret = fit_image_select(fit, noffset, images->verify);
+       if (ret) {
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_HASH);
+               return ret;
+       }
+
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
+       if (!fit_image_check_target_arch(fit, noffset)) {
+               puts("Unsupported Architecture\n");
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
+               return -ENOEXEC;
+       }
+
+       if (image_type == IH_TYPE_FLATDT &&
+           !fit_image_check_comp(fit, noffset, IH_COMP_NONE)) {
+               puts("FDT image is compressed");
+               return -EPROTONOSUPPORT;
+       }
+
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL);
+       type_ok = fit_image_check_type(fit, noffset, image_type) ||
+               (image_type == IH_TYPE_KERNEL &&
+                       fit_image_check_type(fit, noffset,
+                                            IH_TYPE_KERNEL_NOLOAD));
+       os_ok = image_type == IH_TYPE_FLATDT ||
+               fit_image_check_os(fit, noffset, IH_OS_LINUX);
+       if (!type_ok || !os_ok) {
+               printf("No Linux %s %s Image\n", genimg_get_arch_name(arch),
+                      genimg_get_type_name(image_type));
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL);
+               return -EIO;
+       }
+
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL_OK);
+
+       /* get image data address and length */
+       if (fit_image_get_data(fit, noffset, &buf, &size)) {
+               printf("Could not find %s subimage data!\n", prop_name);
+               bootstage_error(bootstage_id + BOOTSTAGE_SUB_GET_DATA);
+               return -ENOMEDIUM;
+       }
+       len = (ulong)size;
+
+       /* verify that image data is a proper FDT blob */
+       if (image_type == IH_TYPE_FLATDT && fdt_check_header((char *)buf)) {
+               puts("Subimage data is not a FDT");
+               return -ENOEXEC;
+       }
+
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_GET_DATA_OK);
+
+       /*
+        * Work-around for eldk-4.2 which gives this warning if we try to
+        * case in the unmap_sysmem() call:
+        * warning: initialization discards qualifiers from pointer target type
+        */
+       {
+               void *vbuf = (void *)buf;
+
+               data = map_to_sysmem(vbuf);
+       }
+
+       if (load_op == FIT_LOAD_IGNORED) {
+               /* Don't load */
+       } else if (fit_image_get_load(fit, noffset, &load)) {
+               if (load_op == FIT_LOAD_REQUIRED) {
+                       printf("Can't get %s subimage load address!\n",
+                              prop_name);
+                       bootstage_error(bootstage_id + BOOTSTAGE_SUB_LOAD);
+                       return -EBADF;
+               }
+       } else {
+               ulong image_start, image_end;
+               ulong load_end;
+               void *dst;
+
+               /*
+                * move image data to the load address,
+                * make sure we don't overwrite initial image
+                */
+               image_start = addr;
+               image_end = addr + fit_get_size(fit);
+
+               load_end = load + len;
+               if (image_type != IH_TYPE_KERNEL &&
+                   load < image_end && load_end > image_start) {
+                       printf("Error: %s overwritten\n", prop_name);
+                       return -EXDEV;
+               }
+
+               printf("   Loading %s from 0x%08lx to 0x%08lx\n",
+                      prop_name, data, load);
+
+               dst = map_sysmem(load, len);
+               memmove(dst, buf, len);
+               data = load;
+       }
+       bootstage_mark(bootstage_id + BOOTSTAGE_SUB_LOAD);
+
+       *datap = data;
+       *lenp = len;
+       if (fit_unamep)
+               *fit_unamep = (char *)fit_uname;
+
+       return noffset;
 }
index e91c89e1c5d61890bc6f9eee6476b566328b0b9d..f863502ab130d0bf08ab1f8cf8e526c31484956a 100644 (file)
@@ -51,6 +51,7 @@
 
 #include <u-boot/md5.h>
 #include <sha1.h>
+#include <asm/errno.h>
 #include <asm/io.h>
 
 #ifdef CONFIG_CMD_BDI
@@ -810,14 +811,10 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
        char *end;
 #endif
 #if defined(CONFIG_FIT)
-       void            *fit_hdr;
        const char      *fit_uname_config = NULL;
        const char      *fit_uname_ramdisk = NULL;
        ulong           default_addr;
        int             rd_noffset;
-       int             cfg_noffset;
-       const void      *data;
-       size_t          size;
 #endif
 
        *rd_start = 0;
@@ -865,32 +862,16 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
 #if defined(CONFIG_FIT)
                } else {
                        /* use FIT configuration provided in first bootm
-                        * command argument
+                        * command argument. If the property is not defined,
+                        * quit silently.
                         */
                        rd_addr = map_to_sysmem(images->fit_hdr_os);
-                       fit_uname_config = images->fit_uname_cfg;
-                       debug("*  ramdisk: using config '%s' from image "
-                                       "at 0x%08lx\n",
-                                       fit_uname_config, rd_addr);
-
-                       /*
-                        * Check whether configuration has ramdisk defined,
-                        * if not, don't try to use it, quit silently.
-                        */
-                       fit_hdr = images->fit_hdr_os;
-                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                                       fit_uname_config);
-                       if (cfg_noffset < 0) {
-                               debug("*  ramdisk: no such config\n");
-                               return 1;
-                       }
-
-                       rd_noffset = fit_conf_get_ramdisk_node(fit_hdr,
-                                                               cfg_noffset);
-                       if (rd_noffset < 0) {
-                               debug("*  ramdisk: no ramdisk in config\n");
+                       rd_noffset = fit_get_node_from_config(images,
+                                       FIT_RAMDISK_PROP, rd_addr);
+                       if (rd_noffset == -ENOLINK)
                                return 0;
-                       }
+                       else if (rd_noffset < 0)
+                               return 1;
                }
 #endif
 
@@ -921,87 +902,16 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                        break;
 #if defined(CONFIG_FIT)
                case IMAGE_FORMAT_FIT:
-                       fit_hdr = buf;
-                       printf("## Loading init Ramdisk from FIT "
-                                       "Image at %08lx ...\n", rd_addr);
-
-                       bootstage_mark(BOOTSTAGE_ID_FIT_RD_FORMAT);
-                       if (!fit_check_format(fit_hdr)) {
-                               puts("Bad FIT ramdisk image format!\n");
-                               bootstage_error(
-                                       BOOTSTAGE_ID_FIT_RD_FORMAT);
+                       rd_noffset = fit_image_load(images, FIT_RAMDISK_PROP,
+                                       rd_addr, &fit_uname_ramdisk,
+                                       fit_uname_config, arch,
+                                       IH_TYPE_RAMDISK,
+                                       BOOTSTAGE_ID_FIT_RD_START,
+                                       FIT_LOAD_REQUIRED, &rd_data, &rd_len);
+                       if (rd_noffset < 0)
                                return 1;
-                       }
-                       bootstage_mark(BOOTSTAGE_ID_FIT_RD_FORMAT_OK);
-
-                       if (!fit_uname_ramdisk) {
-                               /*
-                                * no ramdisk image node unit name, try to get config
-                                * node first. If config unit node name is NULL
-                                * fit_conf_get_node() will try to find default config node
-                                */
-                               bootstage_mark(
-                                       BOOTSTAGE_ID_FIT_RD_NO_UNIT_NAME);
-                               cfg_noffset = fit_conf_get_node(fit_hdr,
-                                                       fit_uname_config);
-                               if (cfg_noffset < 0) {
-                                       puts("Could not find configuration "
-                                               "node\n");
-                                       bootstage_error(
-                                       BOOTSTAGE_ID_FIT_RD_NO_UNIT_NAME);
-                                       return 1;
-                               }
-                               fit_uname_config = fdt_get_name(fit_hdr,
-                                                       cfg_noffset, NULL);
-                               printf("   Using '%s' configuration\n",
-                                       fit_uname_config);
-
-                               rd_noffset = fit_conf_get_ramdisk_node(fit_hdr,
-                                                       cfg_noffset);
-                               fit_uname_ramdisk = fit_get_name(fit_hdr,
-                                                       rd_noffset, NULL);
-                       } else {
-                               /* get ramdisk component image node offset */
-                               bootstage_mark(
-                                       BOOTSTAGE_ID_FIT_RD_UNIT_NAME);
-                               rd_noffset = fit_image_get_node(fit_hdr,
-                                               fit_uname_ramdisk);
-                       }
-                       if (rd_noffset < 0) {
-                               puts("Could not find subimage node\n");
-                               bootstage_error(BOOTSTAGE_ID_FIT_RD_SUBNODE);
-                               return 1;
-                       }
-
-                       printf("   Trying '%s' ramdisk subimage\n",
-                               fit_uname_ramdisk);
-
-                       bootstage_mark(BOOTSTAGE_ID_FIT_RD_CHECK);
-                       if (!fit_check_ramdisk(fit_hdr, rd_noffset, arch,
-                                               images->verify))
-                               return 1;
-
-                       /* get ramdisk image data address and length */
-                       if (fit_image_get_data(fit_hdr, rd_noffset, &data,
-                                               &size)) {
-                               puts("Could not find ramdisk subimage data!\n");
-                               bootstage_error(BOOTSTAGE_ID_FIT_RD_GET_DATA);
-                               return 1;
-                       }
-                       bootstage_mark(BOOTSTAGE_ID_FIT_RD_GET_DATA_OK);
-
-                       rd_data = (ulong)data;
-                       rd_len = size;
-
-                       if (fit_image_get_load(fit_hdr, rd_noffset, &rd_load)) {
-                               puts("Can't get ramdisk subimage load "
-                                       "address!\n");
-                               bootstage_error(BOOTSTAGE_ID_FIT_RD_LOAD);
-                               return 1;
-                       }
-                       bootstage_mark(BOOTSTAGE_ID_FIT_RD_LOAD);
 
-                       images->fit_hdr_rd = fit_hdr;
+                       images->fit_hdr_rd = map_sysmem(rd_addr, 0);
                        images->fit_uname_rd = fit_uname_ramdisk;
                        images->fit_noffset_rd = rd_noffset;
                        break;
index edae835fb0be1e6eb1fccdbf373b42dfc588ee31..3a60484eea615a4f20bd78109f738de26478c88f 100644 (file)
 #include <atmel_lcdc.h>
 #endif
 
+#if defined(CONFIG_LCD_DT_SIMPLEFB)
+#include <libfdt.h>
+#endif
+
 /************************************************************************/
 /* ** FONT DATA                                                                */
 /************************************************************************/
@@ -1182,3 +1186,86 @@ int lcd_get_screen_columns(void)
 {
        return CONSOLE_COLS;
 }
+
+#if defined(CONFIG_LCD_DT_SIMPLEFB)
+static int lcd_dt_simplefb_configure_node(void *blob, int off)
+{
+       u32 stride;
+       fdt32_t cells[2];
+       int ret;
+       const char format[] =
+#if LCD_BPP == LCD_COLOR16
+               "r5g6b5";
+#else
+               "";
+#endif
+
+       if (!format[0])
+               return -1;
+
+       stride = panel_info.vl_col * 2;
+
+       cells[0] = cpu_to_fdt32(gd->fb_base);
+       cells[1] = cpu_to_fdt32(stride * panel_info.vl_row);
+       ret = fdt_setprop(blob, off, "reg", cells, sizeof(cells[0]) * 2);
+       if (ret < 0)
+               return -1;
+
+       cells[0] = cpu_to_fdt32(panel_info.vl_col);
+       ret = fdt_setprop(blob, off, "width", cells, sizeof(cells[0]));
+       if (ret < 0)
+               return -1;
+
+       cells[0] = cpu_to_fdt32(panel_info.vl_row);
+       ret = fdt_setprop(blob, off, "height", cells, sizeof(cells[0]));
+       if (ret < 0)
+               return -1;
+
+       cells[0] = cpu_to_fdt32(stride);
+       ret = fdt_setprop(blob, off, "stride", cells, sizeof(cells[0]));
+       if (ret < 0)
+               return -1;
+
+       ret = fdt_setprop(blob, off, "format", format, strlen(format) + 1);
+       if (ret < 0)
+               return -1;
+
+       ret = fdt_delprop(blob, off, "status");
+       if (ret < 0)
+               return -1;
+
+       return 0;
+}
+
+int lcd_dt_simplefb_add_node(void *blob)
+{
+       const char compat[] = "simple-framebuffer";
+       const char disabled[] = "disabled";
+       int off, ret;
+
+       off = fdt_add_subnode(blob, 0, "framebuffer");
+       if (off < 0)
+               return -1;
+
+       ret = fdt_setprop(blob, off, "status", disabled, sizeof(disabled));
+       if (ret < 0)
+               return -1;
+
+       ret = fdt_setprop(blob, off, "compatible", compat, sizeof(compat));
+       if (ret < 0)
+               return -1;
+
+       return lcd_dt_simplefb_configure_node(blob, off);
+}
+
+int lcd_dt_simplefb_enable_existing_node(void *blob)
+{
+       int off;
+
+       off = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer");
+       if (off < 0)
+               return -1;
+
+       return lcd_dt_simplefb_configure_node(blob, off);
+}
+#endif
index 953ef296b197fd7dcb8dbd692f8d437b63b7df7b..56da214b2660a2cae8bbe012c82d0339536fe880 100644 (file)
 /* #define     DEBUG   */
 
 #include <common.h>
-#include <watchdog.h>
 #include <command.h>
 #include <fdtdec.h>
-#include <malloc.h>
-#include <version.h>
-#ifdef CONFIG_MODEM_SUPPORT
-#include <malloc.h>            /* for free() prototype */
-#endif
-
-#ifdef CONFIG_SYS_HUSH_PARSER
 #include <hush.h>
-#endif
-
-#ifdef CONFIG_OF_CONTROL
-#include <fdtdec.h>
-#endif
-
+#include <malloc.h>
+#include <menu.h>
 #include <post.h>
+#include <version.h>
+#include <watchdog.h>
 #include <linux/ctype.h>
-#include <menu.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -57,13 +46,18 @@ DECLARE_GLOBAL_DATA_PTR;
 void inline __show_boot_progress (int val) {}
 void show_boot_progress (int val) __attribute__((weak, alias("__show_boot_progress")));
 
-#if defined(CONFIG_UPDATE_TFTP)
-int update_tftp (ulong addr);
-#endif /* CONFIG_UPDATE_TFTP */
-
 #define MAX_DELAY_STOP_STR 32
 
-#undef DEBUG_PARSER
+#define DEBUG_PARSER   0       /* set to 1 to debug */
+
+#define debug_parser(fmt, args...)             \
+       debug_cond(DEBUG_PARSER, fmt, ##args)
+
+#ifndef DEBUG_BOOTKEYS
+#define DEBUG_BOOTKEYS 0
+#endif
+#define debug_bootkeys(fmt, args...)           \
+       debug_cond(DEBUG_BOOTKEYS, fmt, ##args)
 
 char        console_buffer[CONFIG_SYS_CBSIZE + 1];     /* console I/O buffer   */
 
@@ -93,10 +87,7 @@ extern void mdm_init(void); /* defined in board.c */
  */
 #if defined(CONFIG_BOOTDELAY)
 # if defined(CONFIG_AUTOBOOT_KEYED)
-#ifndef CONFIG_MENU
-static inline
-#endif
-int abortboot(int bootdelay)
+static int abortboot_keyed(int bootdelay)
 {
        int abort = 0;
        uint64_t etime = endtick(bootdelay);
@@ -152,11 +143,9 @@ int abortboot(int bootdelay)
                presskey_max = presskey_max > delaykey[i].len ?
                                    presskey_max : delaykey[i].len;
 
-#  if DEBUG_BOOTKEYS
-               printf("%s key:<%s>\n",
-                      delaykey[i].retry ? "delay" : "stop",
-                      delaykey[i].str ? delaykey[i].str : "NULL");
-#  endif
+               debug_bootkeys("%s key:<%s>\n",
+                              delaykey[i].retry ? "delay" : "stop",
+                              delaykey[i].str ? delaykey[i].str : "NULL");
        }
 
        /* In order to keep up with incoming data, check timeout only
@@ -181,10 +170,9 @@ int abortboot(int bootdelay)
                            memcmp (presskey + presskey_len - delaykey[i].len,
                                    delaykey[i].str,
                                    delaykey[i].len) == 0) {
-#  if DEBUG_BOOTKEYS
-                               printf("got %skey\n",
-                                      delaykey[i].retry ? "delay" : "stop");
-#  endif
+                               debug_bootkeys("got %skey\n",
+                                              delaykey[i].retry ? "delay" :
+                                              "stop");
 
 #  ifdef CONFIG_BOOT_RETRY_TIME
                                /* don't retry auto boot */
@@ -196,10 +184,8 @@ int abortboot(int bootdelay)
                }
        } while (!abort && get_ticks() <= etime);
 
-#  if DEBUG_BOOTKEYS
        if (!abort)
-               puts("key timeout\n");
-#  endif
+               debug_bootkeys("key timeout\n");
 
 #ifdef CONFIG_SILENT_CONSOLE
        if (abort)
@@ -215,10 +201,7 @@ int abortboot(int bootdelay)
 static int menukey = 0;
 #endif
 
-#ifndef CONFIG_MENU
-static inline
-#endif
-int abortboot(int bootdelay)
+static int abortboot_normal(int bootdelay)
 {
        int abort = 0;
        unsigned long ts;
@@ -275,6 +258,15 @@ int abortboot(int bootdelay)
        return abort;
 }
 # endif        /* CONFIG_AUTOBOOT_KEYED */
+
+static int abortboot(int bootdelay)
+{
+#ifdef CONFIG_AUTOBOOT_KEYED
+       return abortboot_keyed(bootdelay);
+#else
+       return abortboot_normal(bootdelay);
+#endif
+}
 #endif /* CONFIG_BOOTDELAY */
 
 /*
@@ -342,93 +334,35 @@ static void process_fdt_options(const void *blob)
 }
 #endif /* CONFIG_OF_CONTROL */
 
-
-/****************************************************************************/
-
-void main_loop (void)
+#ifdef CONFIG_BOOTDELAY
+static void process_boot_delay(void)
 {
-#ifndef CONFIG_SYS_HUSH_PARSER
-       static char lastcommand[CONFIG_SYS_CBSIZE] = { 0, };
-       int len;
-       int rc = 1;
-       int flag;
-#endif
-#if defined(CONFIG_BOOTDELAY) && defined(CONFIG_OF_CONTROL)
+#ifdef CONFIG_OF_CONTROL
        char *env;
 #endif
-#if defined(CONFIG_BOOTDELAY)
        char *s;
        int bootdelay;
-#endif
-#ifdef CONFIG_PREBOOT
-       char *p;
-#endif
 #ifdef CONFIG_BOOTCOUNT_LIMIT
        unsigned long bootcount = 0;
        unsigned long bootlimit = 0;
-       char *bcs;
-       char bcs_set[16];
 #endif /* CONFIG_BOOTCOUNT_LIMIT */
 
-       bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");
-
 #ifdef CONFIG_BOOTCOUNT_LIMIT
        bootcount = bootcount_load();
        bootcount++;
        bootcount_store (bootcount);
-       sprintf (bcs_set, "%lu", bootcount);
-       setenv ("bootcount", bcs_set);
-       bcs = getenv ("bootlimit");
-       bootlimit = bcs ? simple_strtoul (bcs, NULL, 10) : 0;
+       setenv_ulong("bootcount", bootcount);
+       bootlimit = getenv_ulong("bootlimit", 10, 0);
 #endif /* CONFIG_BOOTCOUNT_LIMIT */
 
-#ifdef CONFIG_MODEM_SUPPORT
-       debug ("DEBUG: main_loop:   do_mdm_init=%d\n", do_mdm_init);
-       if (do_mdm_init) {
-               char *str = strdup(getenv("mdm_cmd"));
-               setenv ("preboot", str);  /* set or delete definition */
-               if (str != NULL)
-                       free (str);
-               mdm_init(); /* wait for modem connection */
-       }
-#endif  /* CONFIG_MODEM_SUPPORT */
-
-#ifdef CONFIG_VERSION_VARIABLE
-       {
-               setenv ("ver", version_string);  /* set version variable */
-       }
-#endif /* CONFIG_VERSION_VARIABLE */
-
-#ifdef CONFIG_SYS_HUSH_PARSER
-       u_boot_hush_start ();
-#endif
-
-#if defined(CONFIG_HUSH_INIT_VAR)
-       hush_init_var ();
-#endif
-
-#ifdef CONFIG_PREBOOT
-       if ((p = getenv ("preboot")) != NULL) {
-# ifdef CONFIG_AUTOBOOT_KEYED
-               int prev = disable_ctrlc(1);    /* disable Control C checking */
-# endif
-
-               run_command_list(p, -1, 0);
-
-# ifdef CONFIG_AUTOBOOT_KEYED
-               disable_ctrlc(prev);    /* restore Control C checking */
-# endif
-       }
-#endif /* CONFIG_PREBOOT */
-
-#if defined(CONFIG_UPDATE_TFTP)
-       update_tftp (0UL);
-#endif /* CONFIG_UPDATE_TFTP */
-
-#if defined(CONFIG_BOOTDELAY)
        s = getenv ("bootdelay");
        bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
 
+#ifdef CONFIG_OF_CONTROL
+       bootdelay = fdtdec_get_config_int(gd->fdt_blob, "bootdelay",
+                       bootdelay);
+#endif
+
        debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);
 
 #if defined(CONFIG_MENU_SHOW)
@@ -474,26 +408,88 @@ void main_loop (void)
        debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
 
        if (bootdelay != -1 && s && !abortboot(bootdelay)) {
-# ifdef CONFIG_AUTOBOOT_KEYED
+#ifdef CONFIG_AUTOBOOT_KEYED
                int prev = disable_ctrlc(1);    /* disable Control C checking */
-# endif
+#endif
 
                run_command_list(s, -1, 0);
 
-# ifdef CONFIG_AUTOBOOT_KEYED
+#ifdef CONFIG_AUTOBOOT_KEYED
                disable_ctrlc(prev);    /* restore Control C checking */
-# endif
+#endif
        }
 
-# ifdef CONFIG_MENUKEY
+#ifdef CONFIG_MENUKEY
        if (menukey == CONFIG_MENUKEY) {
                s = getenv("menucmd");
                if (s)
                        run_command_list(s, -1, 0);
        }
 #endif /* CONFIG_MENUKEY */
+}
 #endif /* CONFIG_BOOTDELAY */
 
+void main_loop(void)
+{
+#ifndef CONFIG_SYS_HUSH_PARSER
+       static char lastcommand[CONFIG_SYS_CBSIZE] = { 0, };
+       int len;
+       int rc = 1;
+       int flag;
+#endif
+#ifdef CONFIG_PREBOOT
+       char *p;
+#endif
+
+       bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");
+
+#ifdef CONFIG_MODEM_SUPPORT
+       debug("DEBUG: main_loop:   do_mdm_init=%d\n", do_mdm_init);
+       if (do_mdm_init) {
+               char *str = strdup(getenv("mdm_cmd"));
+               setenv("preboot", str);  /* set or delete definition */
+               if (str != NULL)
+                       free(str);
+               mdm_init(); /* wait for modem connection */
+       }
+#endif  /* CONFIG_MODEM_SUPPORT */
+
+#ifdef CONFIG_VERSION_VARIABLE
+       {
+               setenv("ver", version_string);  /* set version variable */
+       }
+#endif /* CONFIG_VERSION_VARIABLE */
+
+#ifdef CONFIG_SYS_HUSH_PARSER
+       u_boot_hush_start();
+#endif
+
+#if defined(CONFIG_HUSH_INIT_VAR)
+       hush_init_var();
+#endif
+
+#ifdef CONFIG_PREBOOT
+       p = getenv("preboot");
+       if (p != NULL) {
+# ifdef CONFIG_AUTOBOOT_KEYED
+               int prev = disable_ctrlc(1);    /* disable Control C checking */
+# endif
+
+               run_command_list(p, -1, 0);
+
+# ifdef CONFIG_AUTOBOOT_KEYED
+               disable_ctrlc(prev);    /* restore Control C checking */
+# endif
+       }
+#endif /* CONFIG_PREBOOT */
+
+#if defined(CONFIG_UPDATE_TFTP)
+       update_tftp(0UL);
+#endif /* CONFIG_UPDATE_TFTP */
+
+#ifdef CONFIG_BOOTDELAY
+       process_boot_delay();
+#endif
        /*
         * Main Loop for Monitor Command Processing
         */
@@ -1080,20 +1076,20 @@ int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
                 * Special character handling
                 */
                switch (c) {
-               case '\r':                              /* Enter                */
+               case '\r':                      /* Enter                */
                case '\n':
                        *p = '\0';
                        puts ("\r\n");
-                       return (p - p_buf);
+                       return p - p_buf;
 
-               case '\0':                              /* nul                  */
+               case '\0':                      /* nul                  */
                        continue;
 
-               case 0x03:                              /* ^C - break           */
+               case 0x03:                      /* ^C - break           */
                        p_buf[0] = '\0';        /* discard input */
-                       return (-1);
+                       return -1;
 
-               case 0x15:                              /* ^U - erase line      */
+               case 0x15:                      /* ^U - erase line      */
                        while (col > plen) {
                                puts (erase_seq);
                                --col;
@@ -1102,15 +1098,15 @@ int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
                        n = 0;
                        continue;
 
-               case 0x17:                              /* ^W - erase word      */
+               case 0x17:                      /* ^W - erase word      */
                        p=delete_char(p_buf, p, &col, &n, plen);
                        while ((n > 0) && (*p != ' ')) {
                                p=delete_char(p_buf, p, &col, &n, plen);
                        }
                        continue;
 
-               case 0x08:                              /* ^H  - backspace      */
-               case 0x7F:                              /* DEL - backspace      */
+               case 0x08:                      /* ^H  - backspace      */
+               case 0x7F:                      /* DEL - backspace      */
                        p=delete_char(p_buf, p, &col, &n, plen);
                        continue;
 
@@ -1119,7 +1115,7 @@ int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
                         * Must be a normal character then
                         */
                        if (n < CONFIG_SYS_CBSIZE-2) {
-                               if (c == '\t') {        /* expand TABs          */
+                               if (c == '\t') {        /* expand TABs */
 #ifdef CONFIG_AUTO_COMPLETE
                                        /* if auto completion triggered just continue */
                                        *p = '\0';
@@ -1134,7 +1130,7 @@ int readline_into_buffer(const char *const prompt, char *buffer, int timeout)
                                        char buf[2];
 
                                        /*
-                                        * Echo input using puts() to force am
+                                        * Echo input using puts() to force an
                                         * LCD flush if we are using an LCD
                                         */
                                        ++col;
@@ -1192,9 +1188,7 @@ int parse_line (char *line, char *argv[])
 {
        int nargs = 0;
 
-#ifdef DEBUG_PARSER
-       printf ("parse_line: \"%s\"\n", line);
-#endif
+       debug_parser("parse_line: \"%s\"\n", line);
        while (nargs < CONFIG_SYS_MAXARGS) {
 
                /* skip any white space */
@@ -1203,10 +1197,8 @@ int parse_line (char *line, char *argv[])
 
                if (*line == '\0') {    /* end of line, no more args    */
                        argv[nargs] = NULL;
-#ifdef DEBUG_PARSER
-               printf ("parse_line: nargs=%d\n", nargs);
-#endif
-                       return (nargs);
+                       debug_parser("parse_line: nargs=%d\n", nargs);
+                       return nargs;
                }
 
                argv[nargs++] = line;   /* begin of argument string     */
@@ -1217,10 +1209,8 @@ int parse_line (char *line, char *argv[])
 
                if (*line == '\0') {    /* end of line, no more args    */
                        argv[nargs] = NULL;
-#ifdef DEBUG_PARSER
-               printf ("parse_line: nargs=%d\n", nargs);
-#endif
-                       return (nargs);
+                       debug_parser("parse_line: nargs=%d\n", nargs);
+                       return nargs;
                }
 
                *line++ = '\0';         /* terminate current arg         */
@@ -1228,9 +1218,7 @@ int parse_line (char *line, char *argv[])
 
        printf ("** Too many args (max. %d) **\n", CONFIG_SYS_MAXARGS);
 
-#ifdef DEBUG_PARSER
-       printf ("parse_line: nargs=%d\n", nargs);
-#endif
+       debug_parser("parse_line: nargs=%d\n", nargs);
        return (nargs);
 }
 
@@ -1248,12 +1236,10 @@ static void process_macros (const char *input, char *output)
        /* 1 = waiting for '(' or '{' */
        /* 2 = waiting for ')' or '}' */
        /* 3 = waiting for '''  */
-#ifdef DEBUG_PARSER
        char *output_start = output;
 
-       printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen (input),
-               input);
-#endif
+       debug_parser("[PROCESS_MACROS] INPUT len %zd: \"%s\"\n", strlen(input),
+                    input);
 
        prev = '\0';            /* previous character   */
 
@@ -1341,10 +1327,8 @@ static void process_macros (const char *input, char *output)
        else
                *(output - 1) = 0;
 
-#ifdef DEBUG_PARSER
-       printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",
-               strlen (output_start), output_start);
-#endif
+       debug_parser("[PROCESS_MACROS] OUTPUT len %zd: \"%s\"\n",
+                    strlen(output_start), output_start);
 }
 
 /****************************************************************************
@@ -1375,12 +1359,12 @@ static int builtin_run_command(const char *cmd, int flag)
        int repeatable = 1;
        int rc = 0;
 
-#ifdef DEBUG_PARSER
-       printf ("[RUN_COMMAND] cmd[%p]=\"", cmd);
-       puts (cmd ? cmd : "NULL");      /* use puts - string may be loooong */
-       puts ("\"\n");
-#endif
-
+       debug_parser("[RUN_COMMAND] cmd[%p]=\"", cmd);
+       if (DEBUG_PARSER) {
+               /* use puts - string may be loooong */
+               puts(cmd ? cmd : "NULL");
+               puts("\"\n");
+       }
        clear_ctrlc();          /* forget any previous Control C */
 
        if (!cmd || !*cmd) {
@@ -1398,9 +1382,7 @@ static int builtin_run_command(const char *cmd, int flag)
         * repeatable commands
         */
 
-#ifdef DEBUG_PARSER
-       printf ("[PROCESS_SEPARATORS] %s\n", cmd);
-#endif
+       debug_parser("[PROCESS_SEPARATORS] %s\n", cmd);
        while (*str) {
 
                /*
@@ -1429,9 +1411,7 @@ static int builtin_run_command(const char *cmd, int flag)
                }
                else
                        str = sep;      /* no more commands for next pass */
-#ifdef DEBUG_PARSER
-               printf ("token: \"%s\"\n", token);
-#endif
+               debug_parser("token: \"%s\"\n", token);
 
                /* find macros in this token and replace them */
                process_macros (token, finaltoken);
index 7ce2d5f2149200b18c63d9db82d2f94e5b5da594..628c3990ffcf5dda9bb27308847f5fc32d43f3f1 100644 (file)
@@ -118,17 +118,13 @@ void spl_parse_image_header(const struct image_header *header)
 
 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 {
-       typedef void __noreturn (*image_entry_noargs_t)(u32 *);
+       typedef void __noreturn (*image_entry_noargs_t)(void);
+
        image_entry_noargs_t image_entry =
                        (image_entry_noargs_t) spl_image->entry_point;
 
        debug("image entry point: 0x%X\n", spl_image->entry_point);
-       /* Pass the saved boot_params from rom code */
-#if defined(CONFIG_VIRTIO) || defined(CONFIG_ZEBU)
-       image_entry = (image_entry_noargs_t)0x80100000;
-#endif
-       u32 boot_params_ptr_addr = (u32)&boot_params_ptr;
-       image_entry((u32 *)boot_params_ptr_addr);
+       image_entry();
 }
 
 #ifdef CONFIG_SPL_RAM_DEVICE
index 7efdcb88b73412b7602c72af2e265f068031bb06..170fa3871a120190ce947cc55d6b8f2e22a4ddcd 100644 (file)
@@ -32,7 +32,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static void mmc_load_image_raw(struct mmc *mmc)
+static int mmc_load_image_raw(struct mmc *mmc, unsigned long sector)
 {
        unsigned long err;
        u32 image_size_sectors;
@@ -42,10 +42,7 @@ static void mmc_load_image_raw(struct mmc *mmc)
                                                sizeof(struct image_header));
 
        /* read image header to find the image size & load address */
-       err = mmc->block_dev.block_read(0,
-                       CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, 1,
-                       header);
-
+       err = mmc->block_dev.block_read(0, sector, 1, header);
        if (err == 0)
                goto end;
 
@@ -56,19 +53,33 @@ static void mmc_load_image_raw(struct mmc *mmc)
                                mmc->read_bl_len;
 
        /* Read the header too to avoid extra memcpy */
-       err = mmc->block_dev.block_read(0,
-                       CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
-                       image_size_sectors, (void *)spl_image.load_addr);
+       err = mmc->block_dev.block_read(0, sector, image_size_sectors,
+                                       (void *)spl_image.load_addr);
 
 end:
-       if (err == 0) {
+       if (err == 0)
                printf("spl: mmc blk read err - %lu\n", err);
-               hang();
+
+       return (err == 0);
+}
+
+#ifdef CONFIG_SPL_OS_BOOT
+static int mmc_load_image_raw_os(struct mmc *mmc)
+{
+       if (!mmc->block_dev.block_read(0,
+                                      CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
+                                      CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS,
+                                      (void *)CONFIG_SYS_SPL_ARGS_ADDR)) {
+               printf("mmc args blk read error\n");
+               return -1;
        }
+
+       return mmc_load_image_raw(mmc, CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR);
 }
+#endif
 
 #ifdef CONFIG_SPL_FAT_SUPPORT
-static void mmc_load_image_fat(struct mmc *mmc)
+static int mmc_load_image_fat(struct mmc *mmc, const char *filename)
 {
        int err;
        struct image_header *header;
@@ -76,32 +87,41 @@ static void mmc_load_image_fat(struct mmc *mmc)
        header = (struct image_header *)(CONFIG_SYS_TEXT_BASE -
                                                sizeof(struct image_header));
 
-       err = fat_register_device(&mmc->block_dev,
-                               CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION);
-       if (err) {
-               printf("spl: fat register err - %d\n", err);
-               hang();
-       }
-
-       err = file_fat_read(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME,
-                               header, sizeof(struct image_header));
+       err = file_fat_read(filename, header, sizeof(struct image_header));
        if (err <= 0)
                goto end;
 
        spl_parse_image_header(header);
 
-       err = file_fat_read(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME,
-                               (u8 *)spl_image.load_addr, 0);
+       err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0);
 
 end:
+       if (err <= 0)
+               printf("spl: error reading image %s, err - %d\n",
+                      filename, err);
+
+       return (err <= 0);
+}
+
+#ifdef CONFIG_SPL_OS_BOOT
+static int mmc_load_image_fat_os(struct mmc *mmc)
+{
+       int err;
+
+       err = file_fat_read(CONFIG_SPL_FAT_LOAD_ARGS_NAME,
+                           (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0);
        if (err <= 0) {
                printf("spl: error reading image %s, err - %d\n",
-                       CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME, err);
-               hang();
+                      CONFIG_SPL_FAT_LOAD_ARGS_NAME, err);
+               return -1;
        }
+
+       return mmc_load_image_fat(mmc, CONFIG_SPL_FAT_LOAD_KERNEL_NAME);
 }
 #endif
 
+#endif
+
 void spl_mmc_load_image(void)
 {
        struct mmc *mmc;
@@ -121,17 +141,36 @@ void spl_mmc_load_image(void)
                printf("spl: mmc init failed: err - %d\n", err);
                hang();
        }
+
        boot_mode = spl_boot_mode();
        if (boot_mode == MMCSD_MODE_RAW) {
                debug("boot mode - RAW\n");
-               mmc_load_image_raw(mmc);
+#ifdef CONFIG_SPL_OS_BOOT
+               if (spl_start_uboot() || mmc_load_image_raw_os(mmc))
+#endif
+               err = mmc_load_image_raw(mmc,
+                                        CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
 #ifdef CONFIG_SPL_FAT_SUPPORT
        } else if (boot_mode == MMCSD_MODE_FAT) {
                debug("boot mode - FAT\n");
-               mmc_load_image_fat(mmc);
+
+               err = fat_register_device(&mmc->block_dev,
+                                         CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION);
+               if (err) {
+                       printf("spl: fat register err - %d\n", err);
+                       hang();
+               }
+
+#ifdef CONFIG_SPL_OS_BOOT
+               if (spl_start_uboot() || mmc_load_image_fat_os(mmc))
+#endif
+               err = mmc_load_image_fat(mmc, CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME);
 #endif
        } else {
                puts("spl: wrong MMC boot mode\n");
                hang();
        }
+
+       if (err)
+               hang();
 }
index 0d79ec3ea84abfc8d61988cbfc30c8ba17cec60e..774ba6387aaa3f4ed26f674b7574495bd1c2186a 100644 (file)
 #include <asm/4xx_pci.h>
 #endif
 
+#ifndef CONFIG_USB_HUB_MIN_POWER_ON_DELAY
+#define CONFIG_USB_HUB_MIN_POWER_ON_DELAY      100
+#endif
+
 #define USB_BUFSIZ     512
 
 static struct usb_hub_device hub_dev[USB_MAX_HUB];
@@ -148,8 +152,8 @@ static void usb_hub_power_on(struct usb_hub_device *hub)
                debug("port %d returns %lX\n", i + 1, dev->status);
        }
 
-       /* Wait at least 100 msec for power to become stable */
-       mdelay(max(pgood_delay, (unsigned)100));
+       /* Wait for power to become stable */
+       mdelay(max(pgood_delay, CONFIG_USB_HUB_MIN_POWER_ON_DELAY));
 }
 
 void usb_hub_reset(void)
@@ -485,7 +489,11 @@ static int usb_hub_configure(struct usb_device *dev)
                              i + 1, portstatus);
                        usb_clear_port_feature(dev, i + 1,
                                                USB_PORT_FEAT_C_ENABLE);
-
+                       /*
+                        * The following hack causes a ghost device problem
+                        * to Faraday EHCI
+                        */
+#ifndef CONFIG_USB_EHCI_FARADAY
                        /* EM interference sometimes causes bad shielded USB
                         * devices to be shutdown by the hub, this hack enables
                         * them again. Works at least with mouse driver */
@@ -497,6 +505,7 @@ static int usb_hub_configure(struct usb_device *dev)
                                      "re-enabling...\n", i + 1);
                                      usb_hub_port_connect_change(dev, i);
                        }
+#endif
                }
                if (portstatus & USB_PORT_STAT_SUSPEND) {
                        debug("port %d suspend change\n", i + 1);
index b962849920a40c5cc1aefca9f2f1c0425e114d14..3174b5e1bf4b4a7b827edf825725f6f95c24cf9e 100644 (file)
@@ -461,8 +461,13 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
        usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);
 
        debug("USB KBD: enable interrupt pipe...\n");
-       usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp,
-                               ep->bInterval);
+       if (usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp,
+                              ep->bInterval) < 0) {
+               printf("Failed to get keyboard state from device %04x:%04x\n",
+                      dev->descriptor.idVendor, dev->descriptor.idProduct);
+               /* Abort, we don't want to use that non-functional keyboard. */
+               return 0;
+       }
 
        /* Success. */
        return 1;
@@ -496,6 +501,7 @@ int drv_usb_kbd_init(void)
                if (old_dev) {
                        /* Already registered, just return ok. */
                        debug("USB KBD: is already registered.\n");
+                       usb_kbd_deregister();
                        return 1;
                }
 
index 59865897085c1750067a3c8f2712006cbe6c5abe..fb5e9f0477a59d8bf6cc4a17c7db94d9e17363f2 100644 (file)
@@ -372,7 +372,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
        u32 offset = (u32)le32_to_cpu(gpt_h->first_usable_lba);
        ulong start;
        int i, k;
-       size_t name_len;
+       size_t efiname_len, dosname_len;
 #ifdef CONFIG_PARTITION_UUIDS
        char *str_uuid;
 #endif
@@ -420,9 +420,14 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
                       sizeof(gpt_entry_attributes));
 
                /* partition name */
-               name_len = sizeof(gpt_e[i].partition_name)
+               efiname_len = sizeof(gpt_e[i].partition_name)
                        / sizeof(efi_char16_t);
-               for (k = 0; k < name_len; k++)
+               dosname_len = sizeof(partitions[i].name);
+
+               memset(gpt_e[i].partition_name, 0,
+                      sizeof(gpt_e[i].partition_name));
+
+               for (k = 0; k < min(dosname_len, efiname_len); k++)
                        gpt_e[i].partition_name[k] =
                                (efi_char16_t)(partitions[i].name[k]);
 
index b51df00da701e5469ee9c489f5c63bf7390d6037..67412136eeba1760b2d117fb1f468eb1a0168d38 100644 (file)
@@ -1,6 +1,9 @@
 Atmel AT91 Evaluation kits
 
-http://atmel.com/dyn/products/tools.asp?family_id=605#1443
+Index
+  - I. Board mapping & boot media
+  - II. NAND partition table
+  - III. watchdog support
 
 I. Board mapping & boot media
 ------------------------------------------------------------------------------
@@ -10,7 +13,7 @@ AT91SAM9260EK, AT91SAM9G20EK & AT91SAM9XEEK
 Memory map
        0x20000000 - 23FFFFFF   SDRAM (64 MB)
        0xC0000000 - Cxxxxxxx   Atmel Dataflash card (J13)
-       0xD0000000 - Dxxxxxxx   Soldered Atmel Dataflash
+       0xD0000000 - D07FFFFF   Soldered Atmel Dataflash (AT45DB642)
 
 Environment variables
 
@@ -20,7 +23,6 @@ Environment variables
                - Nand flash.
 
        You can choose your storage location at config step (here for at91sam9260ek) :
-               make at91sam9260ek_config               - use data flash (spi cs1) (default)
                make at91sam9260ek_nandflash_config     - use nand flash
                make at91sam9260ek_dataflash_cs0_config - use data flash (spi cs0)
                make at91sam9260ek_dataflash_cs1_config - use data flash (spi cs1)
@@ -32,7 +34,7 @@ AT91SAM9261EK, AT91SAM9G10EK
 
 Memory map
        0x20000000 - 23FFFFFF   SDRAM (64 MB)
-       0xC0000000 - Cxxxxxxx   Soldered Atmel Dataflash
+       0xC0000000 - C07FFFFF   Soldered Atmel Dataflash (AT45DB642)
        0xD0000000 - Dxxxxxxx   Atmel Dataflash card (J22)
 
 Environment variables
@@ -43,7 +45,6 @@ Environment variables
                - Nand flash.
 
        You can choose your storage location at config step (here for at91sam9260ek) :
-               make at91sam9261ek_config               - use data flash (spi cs0) (default)
                make at91sam9261ek_nandflash_config     - use nand flash
                make at91sam9261ek_dataflash_cs0_config - use data flash (spi cs0)
                make at91sam9261ek_dataflash_cs3_config - use data flash (spi cs3)
@@ -65,7 +66,6 @@ Environment variables
                - Nor flash (not populate by default)
 
        You can choose your storage location at config step (here for at91sam9260ek) :
-               make at91sam9263ek_config               - use data flash (spi cs0) (default)
                make at91sam9263ek_nandflash_config     - use nand flash
                make at91sam9263ek_dataflash_cs0_config - use data flash (spi cs0)
                make at91sam9263ek_norflash_config      - use nor flash
@@ -79,19 +79,15 @@ AT91SAM9M10G45EK
 ------------------------------------------------------------------------------
 
 Memory map
-       0x20000000 - 23FFFFFF   SDRAM (64 MB)
-       0xC0000000 - Cxxxxxxx   Atmel Dataflash card (J12)
+       0x70000000 - 77FFFFFF   SDRAM (128 MB)
 
 Environment variables
 
        U-Boot environment variables can be stored at different places:
-               - Dataflash on SPI chip select 0 (dataflash card)
                - Nand flash.
 
        You can choose your storage location at config step (here for at91sam9m10g45ek) :
-               make at91sam9m10g45ek_config                    - use data flash (spi cs0) (default)
                make at91sam9m10g45ek_nandflash_config          - use nand flash
-               make at91sam9m10g45ek_dataflash_cs0_config      - use data flash (spi cs0)
 
 
 ------------------------------------------------------------------------------
@@ -100,7 +96,7 @@ AT91SAM9RLEK
 
 Memory map
        0x20000000 - 23FFFFFF   SDRAM (64 MB)
-       0xC0000000 - Cxxxxxxx   Soldered Atmel Dataflash
+       0xC0000000 - C07FFFFF   Soldered Atmel Dataflash (AT45DB642)
 
 Environment variables
 
@@ -108,12 +104,66 @@ Environment variables
                - Dataflash on SPI chip select 0
                - Nand flash.
 
-       You can choose your storage location at config step (here for at91sam9260ek) :
-               make at91sam9263ek_config               - use data flash (spi cs0) (default)
-               make at91sam9263ek_nandflash_config     - use nand flash
-               make at91sam9263ek_dataflash_cs0_config - use data flash (spi cs0)
+       You can choose your storage location at config step (here for at91sam9rlek) :
+               make at91sam9rlek_nandflash_config      - use nand flash
+
+
+------------------------------------------------------------------------------
+AT91SAM9N12EK, AT91SAM9X5EK
+------------------------------------------------------------------------------
+
+Memory map
+       0x20000000 - 27FFFFFF   SDRAM (128 MB)
+
+Environment variables
+
+       U-Boot environment variables can be stored at different places:
+               - Nand flash.
+               - SD/MMC card
+               - Serialflash/Dataflash on SPI chip select 0
+
+       You can choose your storage location at config step (here for at91sam9x5ek) :
+               make at91sam9x5ek_dataflash_config      - use data flash
+               make at91sam9x5ek_mmc_config            - use sd/mmc card
+               make at91sam9x5ek_nandflash_config      - use nand flash
+               make at91sam9x5ek_spiflash_config       - use serial flash
+
+
+------------------------------------------------------------------------------
+SAMA5D3XEK
+------------------------------------------------------------------------------
+
+Memory map
+       0x20000000 - 3FFFFFFF   SDRAM (512 MB)
+
+Environment variables
+
+       U-Boot environment variables can be stored at different places:
+               - Nand flash.
+               - SD/MMC card
+               - Serialflash on SPI chip select 0
+
+       You can choose your storage location at config step (here for sama5d3xek) :
+               make sama5d3xek_mmc_config              - use SD/MMC card
+               make sama5d3xek_nandflash_config        - use nand flash
+               make sama5d3xek_serialflash_config      - use serial flash
+
+
+II. NAND partition table
+
+       All the board support boot from NAND flash will use the following NAND
+       partition table
+
+               0x00000000 - 0x0003FFFF bootstrap       (256 KiB)
+               0x00040000 - 0x000BFFFF u-boot          (512 KiB)
+               0x000C0000 - 0x000FFFFF env             (256 KiB)
+               0x00100000 - 0x0013FFFF env_redundant   (256 KiB)
+               0x00140000 - 0x0017FFFF spare           (256 KiB)
+               0x00180000 - 0x001FFFFF dtb             (512 KiB)
+               0x00200000 - 0x007FFFFF kernel          (6 MiB)
+               0x00800000 - 0xxxxxxxxx rootfs          (All left)
 
-II. Watchdog support
+III. Watchdog support
 
        For security reasons, the at91 watchdog is running at boot time and,
        if deactivated, cannot be used anymore.
index f6c5ff8e9c8ba02976d8aea3ccb4b27ad3999480..bd10a6df041185b27264b196b9a9816d4922ed5b 100644 (file)
@@ -185,7 +185,7 @@ Start Address       End Address     Description     Size
 0xF_A0C0_0000  0xF_DFFF_FFFF   Free            1012 MB
 0xF_A000_0000  0xF_A0BF_FFFF   MAPLE0/1/2      12 MB
 0xF_0040_0000  0xF_9FFF_FFFF   Free            12 GB
-0xF_0000_0000  0xF_003F_FFFF   DCSR            4 MB
+0xF_0000_0000  0xF_01FF_FFFF   DCSR            32 MB
 0xC_4000_0000  0xE_FFFF_FFFF   Free            11 GB
 0xC_3000_0000  0xC_3FFF_FFFF   sRIO-2 I/O      256 MB
 0xC_2000_0000  0xC_2FFF_FFFF   sRIO-1 I/O      256 MB
@@ -215,7 +215,7 @@ Start Address       End Address     Description     Size
 0xF_A0C0_0000  0xF_DFFF_FFFF   Free            1012 MB
 0xF_A000_0000  0xF_A0BF_FFFF   MAPLE0/1/2      12 MB
 0xF_0040_0000  0xF_9FFF_FFFF   Free            12 GB
-0xF_0000_0000  0xF_003F_FFFF   DCSR            4 MB
+0xF_0000_0000  0xF_01FF_FFFF   DCSR            32 MB
 0xC_4000_0000  0xE_FFFF_FFFF   Free            11 GB
 0xC_3000_0000  0xC_3FFF_FFFF   sRIO-2 I/O      256 MB
 0xC_2000_0000  0xC_2FFF_FFFF   sRIO-1 I/O      256 MB
diff --git a/doc/README.fsl_iim b/doc/README.fsl_iim
new file mode 100644 (file)
index 0000000..e087f5e
--- /dev/null
@@ -0,0 +1,48 @@
+Driver implementing the fuse API for Freescale's IC Identification Module (IIM)
+
+This IP can be found on the following SoCs:
+ - MPC512x,
+ - i.MX25,
+ - i.MX27,
+ - i.MX31,
+ - i.MX35,
+ - i.MX51,
+ - i.MX53.
+
+The section numbers in this file refer to the i.MX25 Reference Manual.
+
+A fuse word contains 8 fuse bit slots, as explained in 30.4.2.2.1.
+
+A bank contains 256 fuse word slots, as shown by the memory map in 30.3.1.
+
+Some fuse bit or word slots may not have the corresponding fuses actually
+implemented in the fusebox.
+
+See the README files of the SoCs using this driver in order to know the
+conventions used by U-Boot to store some specific data in the fuses, e.g. MAC
+addresses.
+
+Fuse operations:
+
+   Read
+      Read operations are implemented as read accesses to the shadow registers,
+      using "Word y of Bank x" from the register summary in 30.3.2. This is
+      explained in detail in 30.4.5.1.
+
+   Sense
+      Sense operations are implemented as explained in 30.4.5.2.
+
+   Program
+      Program operations are implemented as explained in 30.4.5.3. Following
+      this operation, the shadow registers are reloaded by the hardware (not
+      immediately, but this does not make any difference for a user reading
+      these registers).
+
+   Override
+      Override operations are implemented as write accesses to the shadow
+      registers, as explained in 30.4.5.4.
+
+Configuration:
+
+   CONFIG_FSL_IIM
+      Define this to enable the fsl_iim driver.
diff --git a/doc/README.fuse b/doc/README.fuse
new file mode 100644 (file)
index 0000000..1bc91c4
--- /dev/null
@@ -0,0 +1,67 @@
+Fuse API functions and commands
+
+The fuse API allows to control a fusebox and how it is used by the upper
+hardware layers.
+
+A fuse corresponds to a single non-volatile memory bit that can be programmed
+(i.e. blown, set to 1) only once. The programming operation is irreversible. A
+fuse that has not been programmed reads 0.
+
+Fuses can be used by SoCs to store various permanent configuration and data,
+e.g. boot configuration, security configuration, MAC addresses, etc.
+
+A fuse word is the smallest group of fuses that can be read at once from the
+fusebox control IP registers. This is limited to 32 bits with the current API.
+
+A fuse bank is the smallest group of fuse words having a common ID, as defined
+by each SoC.
+
+Upon startup, the fusebox control IP reads the fuse values and stores them to a
+volatile shadow cache.
+
+See the README files of the drivers implementing this API in order to know the
+SoC- and implementation-specific details.
+
+Functions / commands:
+
+   int fuse_read(u32 bank, u32 word, u32 *val);
+   fuse read <bank> <word> [<cnt>]
+      Read fuse words from the shadow cache.
+
+   int fuse_sense(u32 bank, u32 word, u32 *val);
+   fuse sense <bank> <word> [<cnt>]
+      Sense - i.e. read directly from the fusebox, skipping the shadow cache -
+      fuse words. This operation does not update the shadow cache.
+
+      This is useful to know the true value of fuses if an override has been
+      performed (see below).
+
+   int fuse_prog(u32 bank, u32 word, u32 val);
+   fuse prog [-y] <bank> <word> <hexval> [<hexval>...]
+      Program fuse words. This operation directly affects the fusebox and is
+      irreversible. The shadow cache is updated accordingly or not, depending on
+      each IP.
+
+      Only the bits to be programmed should be set in the input value (i.e. for
+      fuse bits that have already been programmed and hence should be left
+      unchanged by a further programming, it is preferable to clear the
+      corresponding bits in the input value in order not to perform a new
+      hardware programming operation on these fuse bits).
+
+   int fuse_override(u32 bank, u32 word, u32 val);
+   fuse override <bank> <word> <hexval> [<hexval>...]
+      Override fuse words in the shadow cache.
+
+      The fusebox is unaffected, so following this operation, the shadow cache
+      may differ from the fusebox values. Read or sense operations can then be
+      used to get the values from the shadow cache or from the fusebox.
+
+      This is useful to change the behaviors linked to some cached fuse values,
+      either because this is needed only temporarily, or because some of the
+      fuses have already been programmed or are locked (if the SoC allows to
+      override a locked fuse).
+
+Configuration:
+
+   CONFIG_CMD_FUSE
+      Define this to enable the fuse commands.
diff --git a/doc/README.imx25 b/doc/README.imx25
new file mode 100644 (file)
index 0000000..0ca21b6
--- /dev/null
@@ -0,0 +1,10 @@
+U-Boot for Freescale i.MX25
+
+This file contains information for the port of U-Boot to the Freescale i.MX25
+SoC.
+
+1. CONVENTIONS FOR FUSE ASSIGNMENTS
+-----------------------------------
+
+1.1 MAC Address: It is stored in the words 26 to 31 of fuse bank 0, using the
+    natural MAC byte order (i.e. MSB first).
diff --git a/doc/README.imx27 b/doc/README.imx27
new file mode 100644 (file)
index 0000000..6f92cb4
--- /dev/null
@@ -0,0 +1,10 @@
+U-Boot for Freescale i.MX27
+
+This file contains information for the port of U-Boot to the Freescale i.MX27
+SoC.
+
+1. CONVENTIONS FOR FUSE ASSIGNMENTS
+-----------------------------------
+
+1.1 MAC Address: It is stored in the words 4 to 9 of fuse bank 0, using the
+    reversed MAC byte order (i.e. LSB first).
index e08941e2ae3c1282b4829399023bf9ddb3e5a3da..c5312b69d3598907d803b2dae71157094389da83 100644 (file)
@@ -20,3 +20,9 @@ i.MX5x SoCs.
     This option should be enabled for boards having a SYS_ON_OFF_CTL signal
     connected to GPIO1[23] and triggering the MAIN_PWR_ON signal like in the
     reference designs.
+
+2. CONVENTIONS FOR FUSE ASSIGNMENTS
+-----------------------------------
+
+2.1 MAC Address: It is stored in the words 9 to 14 of fuse bank 1, using the
+    natural MAC byte order (i.e. MSB first).
diff --git a/doc/README.imx6 b/doc/README.imx6
new file mode 100644 (file)
index 0000000..513a06e
--- /dev/null
@@ -0,0 +1,10 @@
+U-Boot for Freescale i.MX6
+
+This file contains information for the port of U-Boot to the Freescale i.MX6
+SoC.
+
+1. CONVENTIONS FOR FUSE ASSIGNMENTS
+-----------------------------------
+
+1.1 MAC Address: It is stored in fuse bank 4, with the 32 lsbs in word 2 and the
+    16 msbs in word 3.
index 073e3fcb3c6ecc9a7dfa8af468c76f96b16bd4d5..802eb90f1de6b352dc383f69cdc234b0b64cccd9 100644 (file)
@@ -65,9 +65,27 @@ Configuration command line syntax:
                                This command need appear the fist before
                                other valid commands in configuration file.
 
+       BOOT_OFFSET             value
+
+                               This command is parallel to BOOT_FROM and
+                               is preferred over BOOT_FROM.
+
+                               value:  Offset of the image header, this
+                                       value shall be set to one of the
+                                       values found in the file:
+                                               arch/arm/include/asm/\
+                                               imx-common/imximage.cfg
+                               Example:
+                               BOOT_OFFSET FLASH_OFFSET_STANDARD
+
        BOOT_FROM               nand/spi/sd/onenand/nor/sata
+
+                               This command is parallel to BOOT_OFFSET and
+                               is to be deprecated in favor of BOOT_OFFSET.
+
                                Example:
                                BOOT_FROM spi
+
        DATA                    type address value
 
                                type: word=4, halfword=2, byte=1
diff --git a/doc/README.mxc_ocotp b/doc/README.mxc_ocotp
new file mode 100644 (file)
index 0000000..7a2863c
--- /dev/null
@@ -0,0 +1,51 @@
+Driver implementing the fuse API for Freescale's On-Chip OTP Controller (OCOTP)
+on MXC
+
+This IP can be found on the following SoCs:
+ - Vybrid VF610,
+ - i.MX6.
+
+Note that this IP is different from albeit similar to the IPs of the same name
+that can be found on the following SoCs:
+ - i.MX23,
+ - i.MX28,
+ - i.MX50.
+
+The section numbers in this file refer to the i.MX6 Reference Manual.
+
+A fuse word contains 32 fuse bit slots, as explained in 46.2.1.
+
+A bank contains 8 fuse word slots, as explained in 46.2.1 and shown by the
+memory map in 46.4.
+
+Some fuse bit or word slots may not have the corresponding fuses actually
+implemented in the fusebox.
+
+See the README files of the SoCs using this driver in order to know the
+conventions used by U-Boot to store some specific data in the fuses, e.g. MAC
+addresses.
+
+Fuse operations:
+
+   Read
+      Read operations are implemented as read accesses to the shadow registers,
+      using "Bankx Wordy" from the memory map in 46.4. This is explained in
+      detail by the first two paragraphs in 46.2.1.2.
+
+   Sense
+      Sense operations are implemented as the direct fusebox read explained by
+      the steps in 46.2.1.2.
+
+   Program
+      Program operations are implemented as explained by the steps in 46.2.1.3.
+      Following this operation, the shadow registers are not reloaded by the
+      hardware.
+
+   Override
+      Override operations are implemented as write accesses to the shadow
+      registers, as explained by the first paragraph in 46.2.1.3.
+
+Configuration:
+
+   CONFIG_MXC_OCOTP
+      Define this to enable the mxc_ocotp driver.
diff --git a/doc/README.omap-reset-time b/doc/README.omap-reset-time
new file mode 100644 (file)
index 0000000..0c974ba
--- /dev/null
@@ -0,0 +1,20 @@
+README on how reset time on OMAPs should be calculated
+
+CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC:
+Most OMAPs' provide a way to specify the time for
+which the reset should be held low while the voltages
+and Oscillator outputs stabilize.
+
+This time is mostly board and PMIC dependent. Hence the
+boards are expected to specify a pre-computed time
+using the above option, (the details on how to compute
+the value are given below) without which a default time
+as specified by CONFIG_DEFAULT_OMAP_RESET_TIME_MAX_USEC
+is used.
+
+The value for CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC
+can be computed using a summation of the below 3 parameters
+-1- Time taken by the Osciallator to stop and restart
+-2- PMIC OTP time
+-3- Voltage ramp time, which can be derived using the
+PMIC slew rate and value of voltage ramp needed.
index 9223f6e43626396ae3f11329294193714bbae2dc..a0f1fa30f881c26665f4e6cc1cd20d8cdef2dd7d 100644 (file)
@@ -96,3 +96,4 @@ R5200            ColdFire    -              48ead7a     2008-03-31  Zachary P. L
 CPCI440          powerpc     440GP          b568fd2     2007-12-27  Matthias Fuchs <matthias.fuchs@esd-electronics.com>
 PCIPPC2          powerpc     MPC740/MPC750  7c9e89b     2013-02-07  Wolfgang Denk <wd@denx.de>
 PCIPPC6        powerpc MPC740/MPC750 -   -             Wolfgang Denk <wd@denx.de>
+omap2420h4       arm         omap24xx       -           2013-06-04  Richard Woodruff <r-woodruff2@ti.com>
index 677d120a80fb0cca84f5baae6dc42946a2f6713e..a9841fb5f74c76f558141041cee35cb8c731d171 100644 (file)
@@ -86,7 +86,7 @@ The addresses in brackets are physical addresses.
 
 0x0_0000_0000 (0x0_0000_0000) - 0x0_7fff_ffff   2GB DDR (more than 2GB is initialized but not mapped under with TLB)
 0x0_8000_0000 (0xc_0000_0000) - 0x0_dfff_ffff 1.5GB PCIE memory
-0x0_f000_0000 (0xf_0000_0000) - 0x0_f03f_ffff  4MB  DCSR
+0x0_f000_0000 (0xf_0000_0000) - 0x0_f1ff_ffff  32MB DCSR (includes trace buffers)
 0x0_f400_0000 (0xf_f400_0000) - 0x0_f5ff_ffff  32MB BMan
 0x0_f600_0000 (0xf_f600_0000) - 0x0_f7ff_ffff  32MB QMan
 0x0_f800_0000 (0xf_f800_0000) - 0x0_f803_ffff 256KB PCIE IO
@@ -96,3 +96,27 @@ The addresses in brackets are physical addresses.
 0x0_ffff_f000 (0x0_7fff_fff0) - 0x0_ffff_ffff   4KB Boot page translation for secondary cores
 
 The physical address of the last (boot page translation) varies with the actual DDR size.
+
+Voltage ID and VDD override
+--------------------
+T4240 has a VID feature. U-boot reads the VID efuses and adjust the voltage
+accordingly. The voltage can also be override by command vdd_override. The
+syntax is
+
+vdd_override <voltage in mV>, eg. 1050 is for 1.050v.
+
+Upon success, the actual voltage will be read back. The value is checked
+for safety and any invalid value will not adjust the voltage.
+
+Another way to override VDD is to use environmental variable, in case of using
+command is too late for some debugging. The syntax is
+
+setenv t4240qds_vdd_mv <voltage in mV>
+saveenv
+reset
+
+The override voltage takes effect when booting.
+
+Note: voltage adjustment needs to be done step by step. Changing voltage too
+rapidly may cause current surge. The voltage stepping is done by software.
+Users can set the final voltage directly.
diff --git a/doc/README.vf610 b/doc/README.vf610
new file mode 100644 (file)
index 0000000..38cf5cf
--- /dev/null
@@ -0,0 +1,10 @@
+U-Boot for Freescale Vybrid VF610
+
+This file contains information for the port of U-Boot to the Freescale Vybrid
+VF610 SoC.
+
+1. CONVENTIONS FOR FUSE ASSIGNMENTS
+-----------------------------------
+
+1.1 MAC Address: It is stored in fuse bank 4, with the 16 msbs in word 2 and the
+    32 lsbs in word 3.
diff --git a/doc/device-tree-bindings/video/simple-framebuffer.txt b/doc/device-tree-bindings/video/simple-framebuffer.txt
new file mode 100644 (file)
index 0000000..3ea4605
--- /dev/null
@@ -0,0 +1,25 @@
+Simple Framebuffer
+
+A simple frame-buffer describes a raw memory region that may be rendered to,
+with the assumption that the display hardware has already been set up to scan
+out from that buffer.
+
+Required properties:
+- compatible: "simple-framebuffer"
+- reg: Should contain the location and size of the framebuffer memory.
+- width: The width of the framebuffer in pixels.
+- height: The height of the framebuffer in pixels.
+- stride: The number of bytes in each line of the framebuffer.
+- format: The format of the framebuffer surface. Valid values are:
+  - r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b).
+
+Example:
+
+       framebuffer {
+               compatible = "simple-framebuffer";
+               reg = <0x1d385000 (1600 * 1200 * 2)>;
+               width = <1600>;
+               height = <1200>;
+               stride = <(1600 * 2)>;
+               format = "r5g6b5";
+       };
index 0c1cd831e01df689ef1c4a7ac421b55f5a299fa4..510cb28ad5cdb7eb747ea6a3343a784bdffa97f3 100644 (file)
@@ -31,7 +31,8 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/arch/dma.h>
+#include <asm/imx-common/dma.h>
+#include <asm/imx-common/regs-apbh.h>
 
 static struct mxs_dma_chan mxs_dma_channels[MXS_MAX_DMA_CHANNELS];
 
@@ -226,7 +227,7 @@ static int mxs_dma_reset(int channel)
 #if defined(CONFIG_MX23)
        uint32_t setreg = (uint32_t)(&apbh_regs->hw_apbh_ctrl0_set);
        uint32_t offset = APBH_CTRL0_RESET_CHANNEL_OFFSET;
-#elif defined(CONFIG_MX28)
+#elif (defined(CONFIG_MX28) || defined(CONFIG_MX6))
        uint32_t setreg = (uint32_t)(&apbh_regs->hw_apbh_channel_ctrl_set);
        uint32_t offset = APBH_CHANNEL_CTRL_RESET_CHANNEL_OFFSET;
 #endif
index b48f623c180364f600d45edf5cb584d1f3c32041..0b51dcdef370c585048fd5595707f7e5c4cab732 100644 (file)
@@ -30,6 +30,7 @@ COBJS-y += fpga.o
 COBJS-$(CONFIG_FPGA_SPARTAN2) += spartan2.o
 COBJS-$(CONFIG_FPGA_SPARTAN3) += spartan3.o
 COBJS-$(CONFIG_FPGA_VIRTEX2) += virtex2.o
+COBJS-$(CONFIG_FPGA_ZYNQPL) += zynqpl.o
 COBJS-$(CONFIG_FPGA_XILINX) += xilinx.o
 COBJS-$(CONFIG_FPGA_LATTICE) += ivm_core.o lattice.o
 ifdef CONFIG_FPGA_ALTERA
index 26d244354cd60a27d1327bd017e16bea671c87c7..f70bff6ed177aea8cad8d324687ddaa397ae0277 100644 (file)
  *
  */
 
-/*
- *  Generic FPGA support
- */
+/* Generic FPGA support */
 #include <common.h>             /* core U-Boot definitions */
 #include <xilinx.h>             /* xilinx specific definitions */
 #include <altera.h>             /* altera specific definitions */
 #include <lattice.h>
 
-#if 0
-#define FPGA_DEBUG              /* define FPGA_DEBUG to get debug messages */
-#endif
-
 /* Local definitions */
 #ifndef CONFIG_MAX_FPGA_DEVICES
 #define CONFIG_MAX_FPGA_DEVICES                5
 #endif
 
-/* Enable/Disable debug console messages */
-#ifdef FPGA_DEBUG
-#define        PRINTF(fmt,args...)     printf (fmt ,##args)
-#else
-#define        PRINTF(fmt,args...)
-#endif
-
 /* Local static data */
 static int next_desc = FPGA_INVALID_DEVICE;
 static fpga_desc desc_table[CONFIG_MAX_FPGA_DEVICES];
 
-/* Local static functions */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_get_desc( int devnum );
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_validate(int devnum, const void *buf,
-                                        size_t bsize, char *fn );
-static int fpga_dev_info( int devnum );
-
-
-/* ------------------------------------------------------------------------- */
-
-/* fpga_no_sup
+/*
+ * fpga_no_sup
  * 'no support' message function
  */
-static void fpga_no_sup( char *fn, char *msg )
+static void fpga_no_sup(char *fn, char *msg)
 {
-       if ( fn && msg ) {
-               printf( "%s: No support for %s.\n", fn, msg);
-       } else if ( msg ) {
-               printf( "No support for %s.\n", msg);
-       } else {
-               printf( "No FPGA suport!\n");
-       }
+       if (fn && msg)
+               printf("%s: No support for %s.\n", fn, msg);
+       else if (msg)
+               printf("No support for %s.\n", msg);
+       else
+               printf("No FPGA suport!\n");
 }
 
 
 /* fpga_get_desc
  *     map a device number to a descriptor
  */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_get_desc( int devnum )
+static const fpga_desc *const fpga_get_desc(int devnum)
 {
-       fpga_desc *desc = (fpga_desc * )NULL;
+       fpga_desc *desc = (fpga_desc *)NULL;
 
-       if (( devnum >= 0 ) && (devnum < next_desc )) {
+       if ((devnum >= 0) && (devnum < next_desc)) {
                desc = &desc_table[devnum];
-               PRINTF( "%s: found fpga descriptor #%d @ 0x%p\n",
-                               __FUNCTION__, devnum, desc );
+               debug("%s: found fpga descriptor #%d @ 0x%p\n",
+                     __func__, devnum, desc);
        }
 
        return desc;
 }
 
-
-/* fpga_validate
+/*
+ * fpga_validate
  *     generic parameter checking code
  */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_validate(int devnum, const void *buf,
-                                        size_t bsize, char *fn )
+const fpga_desc *const fpga_validate(int devnum, const void *buf,
+                                    size_t bsize, char *fn)
 {
-       fpga_desc * desc = fpga_get_desc( devnum );
+       const fpga_desc *desc = fpga_get_desc(devnum);
 
-       if ( !desc ) {
-               printf( "%s: Invalid device number %d\n", fn, devnum );
-       }
+       if (!desc)
+               printf("%s: Invalid device number %d\n", fn, devnum);
 
-       if ( !buf ) {
-               printf( "%s: Null buffer.\n", fn );
+       if (!buf) {
+               printf("%s: Null buffer.\n", fn);
                return (fpga_desc * const)NULL;
        }
        return desc;
 }
 
-
-/* fpga_dev_info
+/*
+ * fpga_dev_info
  *     generic multiplexing code
  */
-static int fpga_dev_info( int devnum )
+static int fpga_dev_info(int devnum)
 {
-       int ret_val = FPGA_FAIL;           /* assume failure */
-       const fpga_desc * const desc = fpga_get_desc( devnum );
+       int ret_val = FPGA_FAIL; /* assume failure */
+       const fpga_desc * const desc = fpga_get_desc(devnum);
 
-       if ( desc ) {
-               PRINTF( "%s: Device Descriptor @ 0x%p\n",
-                               __FUNCTION__, desc->devdesc );
+       if (desc) {
+               debug("%s: Device Descriptor @ 0x%p\n",
+                     __func__, desc->devdesc);
 
-               switch ( desc->devtype ) {
+               switch (desc->devtype) {
                case fpga_xilinx:
 #if defined(CONFIG_FPGA_XILINX)
-                       printf( "Xilinx Device\nDescriptor @ 0x%p\n", desc );
-                       ret_val = xilinx_info( desc->devdesc );
+                       printf("Xilinx Device\nDescriptor @ 0x%p\n", desc);
+                       ret_val = xilinx_info(desc->devdesc);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+                       fpga_no_sup((char *)__func__, "Xilinx devices");
 #endif
                        break;
                case fpga_altera:
 #if defined(CONFIG_FPGA_ALTERA)
-                       printf( "Altera Device\nDescriptor @ 0x%p\n", desc );
-                       ret_val = altera_info( desc->devdesc );
+                       printf("Altera Device\nDescriptor @ 0x%p\n", desc);
+                       ret_val = altera_info(desc->devdesc);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Altera devices" );
+                       fpga_no_sup((char *)__func__, "Altera devices");
 #endif
                        break;
                case fpga_lattice:
@@ -145,171 +122,183 @@ static int fpga_dev_info( int devnum )
                        printf("Lattice Device\nDescriptor @ 0x%p\n", desc);
                        ret_val = lattice_info(desc->devdesc);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Lattice devices" );
+                       fpga_no_sup((char *)__func__, "Lattice devices");
 #endif
                        break;
                default:
-                       printf( "%s: Invalid or unsupported device type %d\n",
-                                       __FUNCTION__, desc->devtype );
+                       printf("%s: Invalid or unsupported device type %d\n",
+                              __func__, desc->devtype);
                }
        } else {
-               printf( "%s: Invalid device number %d\n",
-                       __FUNCTION__, devnum );
+               printf("%s: Invalid device number %d\n", __func__, devnum);
        }
 
        return ret_val;
 }
 
-
-/* ------------------------------------------------------------------------- */
-/* fgpa_init is usually called from misc_init_r() and MUST be called
+/*
+ * fgpa_init is usually called from misc_init_r() and MUST be called
  * before any of the other fpga functions are used.
  */
 void fpga_init(void)
 {
        next_desc = 0;
-       memset( desc_table, 0, sizeof(desc_table));
+       memset(desc_table, 0, sizeof(desc_table));
 
-       PRINTF( "%s: CONFIG_FPGA = 0x%x\n", __FUNCTION__, CONFIG_FPGA );
+       debug("%s\n", __func__);
 }
 
-/* fpga_count
+/*
+ * fpga_count
  * Basic interface function to get the current number of devices available.
  */
-int fpga_count( void )
+int fpga_count(void)
 {
        return next_desc;
 }
 
-/* fpga_add
+/*
+ * fpga_add
  *     Add the device descriptor to the device table.
  */
-int fpga_add( fpga_type devtype, void *desc )
+int fpga_add(fpga_type devtype, void *desc)
 {
        int devnum = FPGA_INVALID_DEVICE;
 
-       if ( next_desc  < 0 ) {
-               printf( "%s: FPGA support not initialized!\n", __FUNCTION__ );
-       } else if (( devtype > fpga_min_type ) && ( devtype < fpga_undefined )) {
-               if ( desc ) {
-                       if ( next_desc < CONFIG_MAX_FPGA_DEVICES ) {
+       if (next_desc < 0) {
+               printf("%s: FPGA support not initialized!\n", __func__);
+       } else if ((devtype > fpga_min_type) && (devtype < fpga_undefined)) {
+               if (desc) {
+                       if (next_desc < CONFIG_MAX_FPGA_DEVICES) {
                                devnum = next_desc;
                                desc_table[next_desc].devtype = devtype;
                                desc_table[next_desc++].devdesc = desc;
                        } else {
-                               printf( "%s: Exceeded Max FPGA device count\n", __FUNCTION__ );
+                               printf("%s: Exceeded Max FPGA device count\n",
+                                      __func__);
                        }
                } else {
-                       printf( "%s: NULL device descriptor\n", __FUNCTION__ );
+                       printf("%s: NULL device descriptor\n", __func__);
                }
        } else {
-               printf( "%s: Unsupported FPGA type %d\n", __FUNCTION__, devtype );
+               printf("%s: Unsupported FPGA type %d\n", __func__, devtype);
        }
 
        return devnum;
 }
 
 /*
- *     Generic multiplexing code
+ * Convert bitstream data and load into the fpga
+ */
+int __weak fpga_loadbitstream(int devnum, char *fpgadata, size_t size)
+{
+       printf("Bitstream support not implemented for this FPGA device\n");
+       return FPGA_FAIL;
+}
+
+/*
+ * Generic multiplexing code
  */
 int fpga_load(int devnum, const void *buf, size_t bsize)
 {
        int ret_val = FPGA_FAIL;           /* assume failure */
-       fpga_desc * desc = fpga_validate( devnum, buf, bsize, (char *)__FUNCTION__ );
+       const fpga_desc *desc = fpga_validate(devnum, buf, bsize,
+                                             (char *)__func__);
 
-       if ( desc ) {
-               switch ( desc->devtype ) {
+       if (desc) {
+               switch (desc->devtype) {
                case fpga_xilinx:
 #if defined(CONFIG_FPGA_XILINX)
-                       ret_val = xilinx_load( desc->devdesc, buf, bsize );
+                       ret_val = xilinx_load(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+                       fpga_no_sup((char *)__func__, "Xilinx devices");
 #endif
                        break;
                case fpga_altera:
 #if defined(CONFIG_FPGA_ALTERA)
-                       ret_val = altera_load( desc->devdesc, buf, bsize );
+                       ret_val = altera_load(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Altera devices" );
+                       fpga_no_sup((char *)__func__, "Altera devices");
 #endif
                        break;
                case fpga_lattice:
 #if defined(CONFIG_FPGA_LATTICE)
                        ret_val = lattice_load(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Lattice devices" );
+                       fpga_no_sup((char *)__func__, "Lattice devices");
 #endif
                        break;
                default:
-                       printf( "%s: Invalid or unsupported device type %d\n",
-                               __FUNCTION__, desc->devtype );
+                       printf("%s: Invalid or unsupported device type %d\n",
+                              __func__, desc->devtype);
                }
        }
 
        return ret_val;
 }
 
-/* fpga_dump
+/*
+ * fpga_dump
  *     generic multiplexing code
  */
 int fpga_dump(int devnum, const void *buf, size_t bsize)
 {
        int ret_val = FPGA_FAIL;           /* assume failure */
-       fpga_desc * desc = fpga_validate( devnum, buf, bsize, (char *)__FUNCTION__ );
+       const fpga_desc *desc = fpga_validate(devnum, buf, bsize,
+                                             (char *)__func__);
 
-       if ( desc ) {
-               switch ( desc->devtype ) {
+       if (desc) {
+               switch (desc->devtype) {
                case fpga_xilinx:
 #if defined(CONFIG_FPGA_XILINX)
-                       ret_val = xilinx_dump( desc->devdesc, buf, bsize );
+                       ret_val = xilinx_dump(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+                       fpga_no_sup((char *)__func__, "Xilinx devices");
 #endif
                        break;
                case fpga_altera:
 #if defined(CONFIG_FPGA_ALTERA)
-                       ret_val = altera_dump( desc->devdesc, buf, bsize );
+                       ret_val = altera_dump(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Altera devices" );
+                       fpga_no_sup((char *)__func__, "Altera devices");
 #endif
                        break;
                case fpga_lattice:
 #if defined(CONFIG_FPGA_LATTICE)
                        ret_val = lattice_dump(desc->devdesc, buf, bsize);
 #else
-                       fpga_no_sup( (char *)__FUNCTION__, "Lattice devices" );
+                       fpga_no_sup((char *)__func__, "Lattice devices");
 #endif
                        break;
                default:
-                       printf( "%s: Invalid or unsupported device type %d\n",
-                               __FUNCTION__, desc->devtype );
+                       printf("%s: Invalid or unsupported device type %d\n",
+                              __func__, desc->devtype);
                }
        }
 
        return ret_val;
 }
 
-
-/* fpga_info
+/*
+ * fpga_info
  *     front end to fpga_dev_info.  If devnum is invalid, report on all
  *     available devices.
  */
-int fpga_info( int devnum )
+int fpga_info(int devnum)
 {
-       if ( devnum == FPGA_INVALID_DEVICE ) {
-               if ( next_desc > 0 ) {
+       if (devnum == FPGA_INVALID_DEVICE) {
+               if (next_desc > 0) {
                        int dev;
 
-                       for ( dev = 0; dev < next_desc; dev++ ) {
-                               fpga_dev_info( dev );
-                       }
+                       for (dev = 0; dev < next_desc; dev++)
+                               fpga_dev_info(dev);
+
                        return FPGA_SUCCESS;
                } else {
-                       printf( "%s: No FPGA devices available.\n", __FUNCTION__ );
+                       printf("%s: No FPGA devices available.\n", __func__);
                        return FPGA_FAIL;
                }
        }
-       else return fpga_dev_info( devnum );
-}
 
-/* ------------------------------------------------------------------------- */
+       return fpga_dev_info(devnum);
+}
index 32787b2366ae74a30110b229b3cf4d3a1943c663..49e943718e2a045d93ebb78e6a72ab0db50abbf2 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * (C) Copyright 2012-2013, Xilinx, Michal Simek
+ *
  * (C) Copyright 2002
  * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
  * Keith Outwater, keith_outwater@mvis.com
  */
 
 #include <common.h>
+#include <fpga.h>
 #include <virtex2.h>
 #include <spartan2.h>
 #include <spartan3.h>
+#include <zynqpl.h>
 
 #if 0
 #define FPGA_DEBUG
@@ -48,6 +52,112 @@ static int xilinx_validate (Xilinx_desc * desc, char *fn);
 
 /* ------------------------------------------------------------------------- */
 
+int fpga_loadbitstream(int devnum, char *fpgadata, size_t size)
+{
+       unsigned int length;
+       unsigned int swapsize;
+       char buffer[80];
+       unsigned char *dataptr;
+       unsigned int i;
+       const fpga_desc *desc;
+       Xilinx_desc *xdesc;
+
+       dataptr = (unsigned char *)fpgadata;
+       /* Find out fpga_description */
+       desc = fpga_validate(devnum, dataptr, 0, (char *)__func__);
+       /* Assign xilinx device description */
+       xdesc = desc->devdesc;
+
+       /* skip the first bytes of the bitsteam, their meaning is unknown */
+       length = (*dataptr << 8) + *(dataptr + 1);
+       dataptr += 2;
+       dataptr += length;
+
+       /* get design name (identifier, length, string) */
+       length = (*dataptr << 8) + *(dataptr + 1);
+       dataptr += 2;
+       if (*dataptr++ != 0x61) {
+               debug("%s: Design name id not recognized in bitstream\n",
+                     __func__);
+               return FPGA_FAIL;
+       }
+
+       length = (*dataptr << 8) + *(dataptr + 1);
+       dataptr += 2;
+       for (i = 0; i < length; i++)
+               buffer[i] = *dataptr++;
+
+       printf("  design filename = \"%s\"\n", buffer);
+
+       /* get part number (identifier, length, string) */
+       if (*dataptr++ != 0x62) {
+               printf("%s: Part number id not recognized in bitstream\n",
+                      __func__);
+               return FPGA_FAIL;
+       }
+
+       length = (*dataptr << 8) + *(dataptr + 1);
+       dataptr += 2;
+       for (i = 0; i < length; i++)
+               buffer[i] = *dataptr++;
+
+       if (xdesc->name) {
+               i = strncmp(buffer, xdesc->name, strlen(xdesc->name));
+               if (i) {
+                       printf("%s: Wrong bitstream ID for this device\n",
+                              __func__);
+                       printf("%s: Bitstream ID %s, current device ID %d/%s\n",
+                              __func__, buffer, devnum, xdesc->name);
+                       return FPGA_FAIL;
+               }
+       } else {
+               printf("%s: Please fill correct device ID to Xilinx_desc\n",
+                      __func__);
+       }
+       printf("  part number = \"%s\"\n", buffer);
+
+       /* get date (identifier, length, string) */
+       if (*dataptr++ != 0x63) {
+               printf("%s: Date identifier not recognized in bitstream\n",
+                      __func__);
+               return FPGA_FAIL;
+       }
+
+       length = (*dataptr << 8) + *(dataptr+1);
+       dataptr += 2;
+       for (i = 0; i < length; i++)
+               buffer[i] = *dataptr++;
+       printf("  date = \"%s\"\n", buffer);
+
+       /* get time (identifier, length, string) */
+       if (*dataptr++ != 0x64) {
+               printf("%s: Time identifier not recognized in bitstream\n",
+                      __func__);
+               return FPGA_FAIL;
+       }
+
+       length = (*dataptr << 8) + *(dataptr+1);
+       dataptr += 2;
+       for (i = 0; i < length; i++)
+               buffer[i] = *dataptr++;
+       printf("  time = \"%s\"\n", buffer);
+
+       /* get fpga data length (identifier, length) */
+       if (*dataptr++ != 0x65) {
+               printf("%s: Data length id not recognized in bitstream\n",
+                      __func__);
+               return FPGA_FAIL;
+       }
+       swapsize = ((unsigned int) *dataptr << 24) +
+                  ((unsigned int) *(dataptr + 1) << 16) +
+                  ((unsigned int) *(dataptr + 2) << 8) +
+                  ((unsigned int) *(dataptr + 3));
+       dataptr += 4;
+       printf("  bytes in bitstream = %d\n", swapsize);
+
+       return fpga_load(devnum, dataptr, swapsize);
+}
+
 int xilinx_load(Xilinx_desc *desc, const void *buf, size_t bsize)
 {
        int ret_val = FPGA_FAIL;        /* assume a failure */
@@ -84,6 +194,16 @@ int xilinx_load(Xilinx_desc *desc, const void *buf, size_t bsize)
 #else
                        printf ("%s: No support for Virtex-II devices.\n",
                                        __FUNCTION__);
+#endif
+                       break;
+               case xilinx_zynq:
+#if defined(CONFIG_FPGA_ZYNQPL)
+                       PRINTF("%s: Launching the Zynq PL Loader...\n",
+                              __func__);
+                       ret_val = zynq_load(desc, buf, bsize);
+#else
+                       printf("%s: No support for Zynq devices.\n",
+                              __func__);
 #endif
                        break;
 
@@ -131,6 +251,16 @@ int xilinx_dump(Xilinx_desc *desc, const void *buf, size_t bsize)
 #else
                        printf ("%s: No support for Virtex-II devices.\n",
                                        __FUNCTION__);
+#endif
+                       break;
+               case xilinx_zynq:
+#if defined(CONFIG_FPGA_ZYNQPL)
+                       PRINTF("%s: Launching the Zynq PL Reader...\n",
+                              __func__);
+                       ret_val = zynq_dump(desc, buf, bsize);
+#else
+                       printf("%s: No support for Zynq devices.\n",
+                              __func__);
 #endif
                        break;
 
@@ -158,6 +288,9 @@ int xilinx_info (Xilinx_desc * desc)
                case Xilinx_Virtex2:
                        printf ("Virtex-II\n");
                        break;
+               case xilinx_zynq:
+                       printf("Zynq PL\n");
+                       break;
                        /* Add new family types here */
                default:
                        printf ("Unknown family type, %d\n", desc->family);
@@ -183,6 +316,9 @@ int xilinx_info (Xilinx_desc * desc)
                case master_selectmap:
                        printf ("Master SelectMap Mode\n");
                        break;
+               case devcfg:
+                       printf("Device configuration interface (Zynq)\n");
+                       break;
                        /* Add new interface types here */
                default:
                        printf ("Unsupported interface type, %d\n", desc->iface);
@@ -191,6 +327,8 @@ int xilinx_info (Xilinx_desc * desc)
                printf ("Device Size:   \t%d bytes\n"
                                "Cookie:        \t0x%x (%d)\n",
                                desc->size, desc->cookie, desc->cookie);
+               if (desc->name)
+                       printf("Device name:   \t%s\n", desc->name);
 
                if (desc->iface_fns) {
                        printf ("Device Function Table @ 0x%p\n", desc->iface_fns);
@@ -222,6 +360,14 @@ int xilinx_info (Xilinx_desc * desc)
                                                __FUNCTION__);
 #endif
                                break;
+                       case xilinx_zynq:
+#if defined(CONFIG_FPGA_ZYNQPL)
+                               zynq_info(desc);
+#else
+                               /* just in case */
+                               printf("%s: No support for Zynq devices.\n",
+                                      __func__);
+#endif
                                /* Add new family types here */
                        default:
                                /* we don't need a message here - we give one up above */
diff --git a/drivers/fpga/zynqpl.c b/drivers/fpga/zynqpl.c
new file mode 100644 (file)
index 0000000..8feccde
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ * (C) Copyright 2012-2013, Xilinx, Michal Simek
+ *
+ * (C) Copyright 2012
+ * Joe Hershberger <joe.hershberger@ni.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 <zynqpl.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sys_proto.h>
+
+#define DEVCFG_CTRL_PCFG_PROG_B                0x40000000
+#define DEVCFG_ISR_FATAL_ERROR_MASK    0x00740040
+#define DEVCFG_ISR_ERROR_FLAGS_MASK    0x00340840
+#define DEVCFG_ISR_RX_FIFO_OV          0x00040000
+#define DEVCFG_ISR_DMA_DONE            0x00002000
+#define DEVCFG_ISR_PCFG_DONE           0x00000004
+#define DEVCFG_STATUS_DMA_CMD_Q_F      0x80000000
+#define DEVCFG_STATUS_DMA_CMD_Q_E      0x40000000
+#define DEVCFG_STATUS_DMA_DONE_CNT_MASK        0x30000000
+#define DEVCFG_STATUS_PCFG_INIT                0x00000010
+#define DEVCFG_MCTRL_RFIFO_FLUSH       0x00000002
+#define DEVCFG_MCTRL_WFIFO_FLUSH       0x00000001
+
+#ifndef CONFIG_SYS_FPGA_WAIT
+#define CONFIG_SYS_FPGA_WAIT CONFIG_SYS_HZ/100 /* 10 ms */
+#endif
+
+#ifndef CONFIG_SYS_FPGA_PROG_TIME
+#define CONFIG_SYS_FPGA_PROG_TIME CONFIG_SYS_HZ        /* 1 s */
+#endif
+
+int zynq_info(Xilinx_desc *desc)
+{
+       return FPGA_SUCCESS;
+}
+
+#define DUMMY_WORD     0xffffffff
+
+/* Xilinx binary format header */
+static const u32 bin_format[] = {
+       DUMMY_WORD, /* Dummy words */
+       DUMMY_WORD,
+       DUMMY_WORD,
+       DUMMY_WORD,
+       DUMMY_WORD,
+       DUMMY_WORD,
+       DUMMY_WORD,
+       DUMMY_WORD,
+       0x000000bb, /* Sync word */
+       0x11220044, /* Sync word */
+       DUMMY_WORD,
+       DUMMY_WORD,
+       0xaa995566, /* Sync word */
+};
+
+#define SWAP_NO                1
+#define SWAP_DONE      2
+
+/*
+ * Load the whole word from unaligned buffer
+ * Keep in your mind that it is byte loading on little-endian system
+ */
+static u32 load_word(const void *buf, u32 swap)
+{
+       u32 word = 0;
+       u8 *bitc = (u8 *)buf;
+       int p;
+
+       if (swap == SWAP_NO) {
+               for (p = 0; p < 4; p++) {
+                       word <<= 8;
+                       word |= bitc[p];
+               }
+       } else {
+               for (p = 3; p >= 0; p--) {
+                       word <<= 8;
+                       word |= bitc[p];
+               }
+       }
+
+       return word;
+}
+
+static u32 check_header(const void *buf)
+{
+       u32 i, pattern;
+       int swap = SWAP_NO;
+       u32 *test = (u32 *)buf;
+
+       debug("%s: Let's check bitstream header\n", __func__);
+
+       /* Checking that passing bin is not a bitstream */
+       for (i = 0; i < ARRAY_SIZE(bin_format); i++) {
+               pattern = load_word(&test[i], swap);
+
+               /*
+                * Bitstreams in binary format are swapped
+                * compare to regular bistream.
+                * Do not swap dummy word but if swap is done assume
+                * that parsing buffer is binary format
+                */
+               if ((__swab32(pattern) != DUMMY_WORD) &&
+                   (__swab32(pattern) == bin_format[i])) {
+                       pattern = __swab32(pattern);
+                       swap = SWAP_DONE;
+                       debug("%s: data swapped - let's swap\n", __func__);
+               }
+
+               debug("%s: %d/%x: pattern %x/%x bin_format\n", __func__, i,
+                     (u32)&test[i], pattern, bin_format[i]);
+               if (pattern != bin_format[i]) {
+                       debug("%s: Bitstream is not recognized\n", __func__);
+                       return 0;
+               }
+       }
+       debug("%s: Found bitstream header at %x %s swapinng\n", __func__,
+             (u32)buf, swap == SWAP_NO ? "without" : "with");
+
+       return swap;
+}
+
+static void *check_data(u8 *buf, size_t bsize, u32 *swap)
+{
+       u32 word, p = 0; /* possition */
+
+       /* Because buf doesn't need to be aligned let's read it by chars */
+       for (p = 0; p < bsize; p++) {
+               word = load_word(&buf[p], SWAP_NO);
+               debug("%s: word %x %x/%x\n", __func__, word, p, (u32)&buf[p]);
+
+               /* Find the first bitstream dummy word */
+               if (word == DUMMY_WORD) {
+                       debug("%s: Found dummy word at position %x/%x\n",
+                             __func__, p, (u32)&buf[p]);
+                       *swap = check_header(&buf[p]);
+                       if (*swap) {
+                               /* FIXME add full bitstream checking here */
+                               return &buf[p];
+                       }
+               }
+               /* Loop can be huge - support CTRL + C */
+               if (ctrlc())
+                       return 0;
+       }
+       return 0;
+}
+
+
+int zynq_load(Xilinx_desc *desc, const void *buf, size_t bsize)
+{
+       unsigned long ts; /* Timestamp */
+       u32 partialbit = 0;
+       u32 i, control, isr_status, status, swap, diff;
+       u32 *buf_start;
+
+       /* Detect if we are going working with partial or full bitstream */
+       if (bsize != desc->size) {
+               printf("%s: Working with partial bitstream\n", __func__);
+               partialbit = 1;
+       }
+
+       buf_start = check_data((u8 *)buf, bsize, &swap);
+       if (!buf_start)
+               return FPGA_FAIL;
+
+       /* Check if data is postpone from start */
+       diff = (u32)buf_start - (u32)buf;
+       if (diff) {
+               printf("%s: Bitstream is not validated yet (diff %x)\n",
+                      __func__, diff);
+               return FPGA_FAIL;
+       }
+
+       if ((u32)buf_start & 0x3) {
+               u32 *new_buf = (u32 *)((u32)buf & ~0x3);
+
+               printf("%s: Align buffer at %x to %x(swap %d)\n", __func__,
+                      (u32)buf_start, (u32)new_buf, swap);
+
+               for (i = 0; i < (bsize/4); i++)
+                       new_buf[i] = load_word(&buf_start[i], swap);
+
+               swap = SWAP_DONE;
+               buf = new_buf;
+       } else if (swap != SWAP_DONE) {
+               /* For bitstream which are aligned */
+               u32 *new_buf = (u32 *)buf;
+
+               printf("%s: Bitstream is not swapped(%d) - swap it\n", __func__,
+                      swap);
+
+               for (i = 0; i < (bsize/4); i++)
+                       new_buf[i] = load_word(&buf_start[i], swap);
+
+               swap = SWAP_DONE;
+       }
+
+       if (!partialbit) {
+               zynq_slcr_devcfg_disable();
+
+               /* Setting PCFG_PROG_B signal to high */
+               control = readl(&devcfg_base->ctrl);
+               writel(control | DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl);
+               /* Setting PCFG_PROG_B signal to low */
+               writel(control & ~DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl);
+
+               /* Polling the PCAP_INIT status for Reset */
+               ts = get_timer(0);
+               while (readl(&devcfg_base->status) & DEVCFG_STATUS_PCFG_INIT) {
+                       if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) {
+                               printf("%s: Timeout wait for INIT to clear\n",
+                                      __func__);
+                               return FPGA_FAIL;
+                       }
+               }
+
+               /* Setting PCFG_PROG_B signal to high */
+               writel(control | DEVCFG_CTRL_PCFG_PROG_B, &devcfg_base->ctrl);
+
+               /* Polling the PCAP_INIT status for Set */
+               ts = get_timer(0);
+               while (!(readl(&devcfg_base->status) &
+                       DEVCFG_STATUS_PCFG_INIT)) {
+                       if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) {
+                               printf("%s: Timeout wait for INIT to set\n",
+                                      __func__);
+                               return FPGA_FAIL;
+                       }
+               }
+       }
+
+       isr_status = readl(&devcfg_base->int_sts);
+
+       /* Clear it all, so if Boot ROM comes back, it can proceed */
+       writel(0xFFFFFFFF, &devcfg_base->int_sts);
+
+       if (isr_status & DEVCFG_ISR_FATAL_ERROR_MASK) {
+               debug("%s: Fatal errors in PCAP 0x%X\n", __func__, isr_status);
+
+               /* If RX FIFO overflow, need to flush RX FIFO first */
+               if (isr_status & DEVCFG_ISR_RX_FIFO_OV) {
+                       writel(DEVCFG_MCTRL_RFIFO_FLUSH, &devcfg_base->mctrl);
+                       writel(0xFFFFFFFF, &devcfg_base->int_sts);
+               }
+               return FPGA_FAIL;
+       }
+
+       status = readl(&devcfg_base->status);
+
+       debug("%s: Status = 0x%08X\n", __func__, status);
+
+       if (status & DEVCFG_STATUS_DMA_CMD_Q_F) {
+               debug("%s: Error: device busy\n", __func__);
+               return FPGA_FAIL;
+       }
+
+       debug("%s: Device ready\n", __func__);
+
+       if (!(status & DEVCFG_STATUS_DMA_CMD_Q_E)) {
+               if (!(readl(&devcfg_base->int_sts) & DEVCFG_ISR_DMA_DONE)) {
+                       /* Error state, transfer cannot occur */
+                       debug("%s: ISR indicates error\n", __func__);
+                       return FPGA_FAIL;
+               } else {
+                       /* Clear out the status */
+                       writel(DEVCFG_ISR_DMA_DONE, &devcfg_base->int_sts);
+               }
+       }
+
+       if (status & DEVCFG_STATUS_DMA_DONE_CNT_MASK) {
+               /* Clear the count of completed DMA transfers */
+               writel(DEVCFG_STATUS_DMA_DONE_CNT_MASK, &devcfg_base->status);
+       }
+
+       debug("%s: Source = 0x%08X\n", __func__, (u32)buf);
+       debug("%s: Size = %zu\n", __func__, bsize);
+
+       /* Set up the transfer */
+       writel((u32)buf | 1, &devcfg_base->dma_src_addr);
+       writel(0xFFFFFFFF, &devcfg_base->dma_dst_addr);
+       writel(bsize >> 2, &devcfg_base->dma_src_len);
+       writel(0, &devcfg_base->dma_dst_len);
+
+       isr_status = readl(&devcfg_base->int_sts);
+
+       /* Polling the PCAP_INIT status for Set */
+       ts = get_timer(0);
+       while (!(isr_status & DEVCFG_ISR_DMA_DONE)) {
+               if (isr_status & DEVCFG_ISR_ERROR_FLAGS_MASK) {
+                       debug("%s: Error: isr = 0x%08X\n", __func__,
+                             isr_status);
+                       debug("%s: Write count = 0x%08X\n", __func__,
+                             readl(&devcfg_base->write_count));
+                       debug("%s: Read count = 0x%08X\n", __func__,
+                             readl(&devcfg_base->read_count));
+
+                       return FPGA_FAIL;
+               }
+               if (get_timer(ts) > CONFIG_SYS_FPGA_PROG_TIME) {
+                       printf("%s: Timeout wait for DMA to complete\n",
+                              __func__);
+                       return FPGA_FAIL;
+               }
+               isr_status = readl(&devcfg_base->int_sts);
+       }
+
+       debug("%s: DMA transfer is done\n", __func__);
+
+       /* Check FPGA configuration completion */
+       ts = get_timer(0);
+       while (!(isr_status & DEVCFG_ISR_PCFG_DONE)) {
+               if (get_timer(ts) > CONFIG_SYS_FPGA_WAIT) {
+                       printf("%s: Timeout wait for FPGA to config\n",
+                              __func__);
+                       return FPGA_FAIL;
+               }
+               isr_status = readl(&devcfg_base->int_sts);
+       }
+
+       debug("%s: FPGA config done\n", __func__);
+
+       /* Clear out the DMA status */
+       writel(DEVCFG_ISR_DMA_DONE, &devcfg_base->int_sts);
+
+       if (!partialbit)
+               zynq_slcr_devcfg_enable();
+
+       return FPGA_SUCCESS;
+}
+
+int zynq_dump(Xilinx_desc *desc, const void *buf, size_t bsize)
+{
+       return FPGA_FAIL;
+}
index 5dbdbe3672259c0d9a72bd79502fe99990f1cbde..72e85a349a7d25302553d19446ebcab58801fb5e 100644 (file)
@@ -46,6 +46,7 @@ COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
 COBJS-$(CONFIG_U8500_I2C) += u8500_i2c.o
 COBJS-$(CONFIG_SH_I2C) += sh_i2c.o
 COBJS-$(CONFIG_SH_SH7734_I2C) += sh_sh7734_i2c.o
+COBJS-$(CONFIG_ZYNQ_I2C) += zynq_i2c.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
index 54e9b1586fb8ad17baec72d1910bb6ceca511a48..ef38d7172522e517e8ccc5c99bb642eec56160e7 100644 (file)
  *
  * Adapted for OMAP2420 I2C, r-woodruff2@ti.com
  *
+ * Copyright (c) 2013 Lubomir Popov <lpopov@mm-sol.com>, MM Solutions
+ * New i2c_read, i2c_write and i2c_probe functions, tested on OMAP4
+ * (4430/60/70), OMAP5 (5430) and AM335X (3359); should work on older
+ * OMAPs and derivatives as well. The only anticipated exception would
+ * be the OMAP2420, which shall require driver modification.
+ * - Rewritten i2c_read to operate correctly with all types of chips
+ *   (old function could not read consistent data from some I2C slaves).
+ * - Optimized i2c_write.
+ * - New i2c_probe, performs write access vs read. The old probe could
+ *   hang the system under certain conditions (e.g. unconfigured pads).
+ * - The read/write/probe functions try to identify unconfigured bus.
+ * - Status functions now read irqstatus_raw as per TRM guidelines
+ *   (except for OMAP243X and OMAP34XX).
+ * - Driver now supports up to I2C5 (OMAP5).
  */
 
 #include <common.h>
@@ -31,8 +45,11 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define I2C_TIMEOUT    1000
 
+/* Absolutely safe for status update at 100 kHz I2C: */
+#define I2C_WAIT       200
+
 static int wait_for_bb(void);
-static u16 wait_for_pin(void);
+static u16 wait_for_event(void);
 static void flush_fifo(void);
 
 /*
@@ -137,10 +154,14 @@ void i2c_init(int speed, int slaveadd)
        /* own address */
        writew(slaveadd, &i2c_base->oa);
        writew(I2C_CON_EN, &i2c_base->con);
-
-       /* have to enable intrrupts or OMAP i2c module doesn't work */
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
+       /*
+        * Have to enable interrupts for OMAP2/3, these IPs don't have
+        * an 'irqstatus_raw' register and we shall have to poll 'stat'
+        */
        writew(I2C_IE_XRDY_IE | I2C_IE_RRDY_IE | I2C_IE_ARDY_IE |
-               I2C_IE_NACK_IE | I2C_IE_AL_IE, &i2c_base->ie);
+              I2C_IE_NACK_IE | I2C_IE_AL_IE, &i2c_base->ie);
+#endif
        udelay(1000);
        flush_fifo();
        writew(0xFFFF, &i2c_base->stat);
@@ -150,88 +171,6 @@ void i2c_init(int speed, int slaveadd)
                bus_initialized[current_bus] = 1;
 }
 
-static int i2c_read_byte(u8 devaddr, u16 regoffset, u8 alen, u8 *value)
-{
-       int i2c_error = 0;
-       u16 status;
-       int i = 2 - alen;
-       u8 tmpbuf[2] = {(regoffset) >> 8, regoffset & 0xff};
-       u16 w;
-
-       /* wait until bus not busy */
-       if (wait_for_bb())
-               return 1;
-
-       /* one byte only */
-       writew(alen, &i2c_base->cnt);
-       /* set slave address */
-       writew(devaddr, &i2c_base->sa);
-       /* no stop bit needed here */
-       writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT |
-             I2C_CON_TRX, &i2c_base->con);
-
-       /* send register offset */
-       while (1) {
-               status = wait_for_pin();
-               if (status == 0 || status & I2C_STAT_NACK) {
-                       i2c_error = 1;
-                       goto read_exit;
-               }
-               if (status & I2C_STAT_XRDY) {
-                       w = tmpbuf[i++];
-#if !(defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \
-       defined(CONFIG_OMAP44XX) || defined(CONFIG_AM33XX) || \
-       defined(CONFIG_OMAP54XX))
-                       w |= tmpbuf[i++] << 8;
-#endif
-                       writew(w, &i2c_base->data);
-                       writew(I2C_STAT_XRDY, &i2c_base->stat);
-               }
-               if (status & I2C_STAT_ARDY) {
-                       writew(I2C_STAT_ARDY, &i2c_base->stat);
-                       break;
-               }
-       }
-
-       /* set slave address */
-       writew(devaddr, &i2c_base->sa);
-       /* read one byte from slave */
-       writew(1, &i2c_base->cnt);
-       /* need stop bit here */
-       writew(I2C_CON_EN | I2C_CON_MST |
-               I2C_CON_STT | I2C_CON_STP,
-               &i2c_base->con);
-
-       /* receive data */
-       while (1) {
-               status = wait_for_pin();
-               if (status == 0 || status & I2C_STAT_NACK) {
-                       i2c_error = 1;
-                       goto read_exit;
-               }
-               if (status & I2C_STAT_RRDY) {
-#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \
-       defined(CONFIG_OMAP44XX) || defined(CONFIG_AM33XX) || \
-       defined(CONFIG_OMAP54XX)
-                       *value = readb(&i2c_base->data);
-#else
-                       *value = readw(&i2c_base->data);
-#endif
-                       writew(I2C_STAT_RRDY, &i2c_base->stat);
-               }
-               if (status & I2C_STAT_ARDY) {
-                       writew(I2C_STAT_ARDY, &i2c_base->stat);
-                       break;
-               }
-       }
-
-read_exit:
-       flush_fifo();
-       writew(0xFFFF, &i2c_base->stat);
-       writew(0, &i2c_base->cnt);
-       return i2c_error;
-}
-
 static void flush_fifo(void)
 {      u16 stat;
 
@@ -241,13 +180,7 @@ static void flush_fifo(void)
        while (1) {
                stat = readw(&i2c_base->stat);
                if (stat == I2C_STAT_RRDY) {
-#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \
-       defined(CONFIG_OMAP44XX) || defined(CONFIG_AM33XX) || \
-       defined(CONFIG_OMAP54XX)
                        readb(&i2c_base->data);
-#else
-                       readw(&i2c_base->data);
-#endif
                        writew(I2C_STAT_RRDY, &i2c_base->stat);
                        udelay(1000);
                } else
@@ -255,6 +188,10 @@ static void flush_fifo(void)
        }
 }
 
+/*
+ * i2c_probe: Use write access. Allows to identify addresses that are
+ *            write-only (like the config register of dual-port EEPROMs)
+ */
 int i2c_probe(uchar chip)
 {
        u16 status;
@@ -263,61 +200,81 @@ int i2c_probe(uchar chip)
        if (chip == readw(&i2c_base->oa))
                return res;
 
-       /* wait until bus not busy */
+       /* Wait until bus is free */
        if (wait_for_bb())
                return res;
 
-       /* try to read one byte */
-       writew(1, &i2c_base->cnt);
-       /* set slave address */
+       /* No data transfer, slave addr only */
+       writew(0, &i2c_base->cnt);
+       /* Set slave address */
        writew(chip, &i2c_base->sa);
-       /* stop bit needed here */
-       writew (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP, &i2c_base->con);
-
-       while (1) {
-               status = wait_for_pin();
-               if (status == 0 || status & I2C_STAT_AL) {
-                       res = 1;
-                       goto probe_exit;
-               }
-               if (status & I2C_STAT_NACK) {
-                       res = 1;
-                       writew(0xff, &i2c_base->stat);
-                       writew (readw (&i2c_base->con) | I2C_CON_STP, &i2c_base->con);
-
-                       if (wait_for_bb())
-                               res = 1;
-
-                       break;
-               }
-               if (status & I2C_STAT_ARDY) {
-                       writew(I2C_STAT_ARDY, &i2c_base->stat);
-                       break;
-               }
-               if (status & I2C_STAT_RRDY) {
-                       res = 0;
-#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \
-       defined(CONFIG_OMAP44XX) || defined(CONFIG_AM33XX) || \
-       defined(CONFIG_OMAP54XX)
-                       readb(&i2c_base->data);
-#else
-                       readw(&i2c_base->data);
-#endif
-                       writew(I2C_STAT_RRDY, &i2c_base->stat);
-               }
+       /* Stop bit needed here */
+       writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX |
+              I2C_CON_STP, &i2c_base->con);
+
+       status = wait_for_event();
+
+       if ((status & ~I2C_STAT_XRDY) == 0 || (status & I2C_STAT_AL)) {
+               /*
+                * With current high-level command implementation, notifying
+                * the user shall flood the console with 127 messages. If
+                * silent exit is desired upon unconfigured bus, remove the
+                * following 'if' section:
+                */
+               if (status == I2C_STAT_XRDY)
+                       printf("i2c_probe: pads on bus %d probably not configured (status=0x%x)\n",
+                              current_bus, status);
+
+               goto pr_exit;
        }
 
-probe_exit:
+       /* Check for ACK (!NAK) */
+       if (!(status & I2C_STAT_NACK)) {
+               res = 0;                        /* Device found */
+               udelay(I2C_WAIT);               /* Required by AM335X in SPL */
+               /* Abort transfer (force idle state) */
+               writew(I2C_CON_MST | I2C_CON_TRX, &i2c_base->con); /* Reset */
+               udelay(1000);
+               writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_TRX |
+                      I2C_CON_STP, &i2c_base->con);            /* STP */
+       }
+pr_exit:
        flush_fifo();
-       /* don't allow any more data in... we don't want it. */
-       writew(0, &i2c_base->cnt);
        writew(0xFFFF, &i2c_base->stat);
+       writew(0, &i2c_base->cnt);
        return res;
 }
 
+/*
+ * i2c_read: Function now uses a single I2C read transaction with bulk transfer
+ *           of the requested number of bytes (note that the 'i2c md' command
+ *           limits this to 16 bytes anyway). If CONFIG_I2C_REPEATED_START is
+ *           defined in the board config header, this transaction shall be with
+ *           Repeated Start (Sr) between the address and data phases; otherwise
+ *           Stop-Start (P-S) shall be used (some I2C chips do require a P-S).
+ *           The address (reg offset) may be 0, 1 or 2 bytes long.
+ *           Function now reads correctly from chips that return more than one
+ *           byte of data per addressed register (like TI temperature sensors),
+ *           or that do not need a register address at all (such as some clock
+ *           distributors).
+ */
 int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
 {
-       int i;
+       int i2c_error = 0;
+       u16 status;
+
+       if (alen < 0) {
+               puts("I2C read: addr len < 0\n");
+               return 1;
+       }
+       if (len < 0) {
+               puts("I2C read: data len < 0\n");
+               return 1;
+       }
+       if (buffer == NULL) {
+               puts("I2C read: NULL pointer passed\n");
+               return 1;
+       }
 
        if (alen > 2) {
                printf("I2C read: addr len %d not supported\n", alen);
@@ -329,24 +286,122 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
                return 1;
        }
 
-       for (i = 0; i < len; i++) {
-               if (i2c_read_byte(chip, addr + i, alen, &buffer[i])) {
-                       puts("I2C read: I/O error\n");
-                       i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
-                       return 1;
+       /* Wait until bus not busy */
+       if (wait_for_bb())
+               return 1;
+
+       /* Zero, one or two bytes reg address (offset) */
+       writew(alen, &i2c_base->cnt);
+       /* Set slave address */
+       writew(chip, &i2c_base->sa);
+
+       if (alen) {
+               /* Must write reg offset first */
+#ifdef CONFIG_I2C_REPEATED_START
+               /* No stop bit, use Repeated Start (Sr) */
+               writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT |
+                      I2C_CON_TRX, &i2c_base->con);
+#else
+               /* Stop - Start (P-S) */
+               writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP |
+                      I2C_CON_TRX, &i2c_base->con);
+#endif
+               /* Send register offset */
+               while (1) {
+                       status = wait_for_event();
+                       /* Try to identify bus that is not padconf'd for I2C */
+                       if (status == I2C_STAT_XRDY) {
+                               i2c_error = 2;
+                               printf("i2c_read (addr phase): pads on bus %d probably not configured (status=0x%x)\n",
+                                      current_bus, status);
+                               goto rd_exit;
+                       }
+                       if (status == 0 || status & I2C_STAT_NACK) {
+                               i2c_error = 1;
+                               printf("i2c_read: error waiting for addr ACK (status=0x%x)\n",
+                                      status);
+                               goto rd_exit;
+                       }
+                       if (alen) {
+                               if (status & I2C_STAT_XRDY) {
+                                       alen--;
+                                       /* Do we have to use byte access? */
+                                       writeb((addr >> (8 * alen)) & 0xff,
+                                              &i2c_base->data);
+                                       writew(I2C_STAT_XRDY, &i2c_base->stat);
+                               }
+                       }
+                       if (status & I2C_STAT_ARDY) {
+                               writew(I2C_STAT_ARDY, &i2c_base->stat);
+                               break;
+                       }
                }
        }
+       /* Set slave address */
+       writew(chip, &i2c_base->sa);
+       /* Read len bytes from slave */
+       writew(len, &i2c_base->cnt);
+       /* Need stop bit here */
+       writew(I2C_CON_EN | I2C_CON_MST |
+              I2C_CON_STT | I2C_CON_STP,
+              &i2c_base->con);
 
-       return 0;
+       /* Receive data */
+       while (1) {
+               status = wait_for_event();
+               /*
+                * Try to identify bus that is not padconf'd for I2C. This
+                * state could be left over from previous transactions if
+                * the address phase is skipped due to alen=0.
+                */
+               if (status == I2C_STAT_XRDY) {
+                       i2c_error = 2;
+                       printf("i2c_read (data phase): pads on bus %d probably not configured (status=0x%x)\n",
+                              current_bus, status);
+                       goto rd_exit;
+               }
+               if (status == 0 || status & I2C_STAT_NACK) {
+                       i2c_error = 1;
+                       goto rd_exit;
+               }
+               if (status & I2C_STAT_RRDY) {
+                       *buffer++ = readb(&i2c_base->data);
+                       writew(I2C_STAT_RRDY, &i2c_base->stat);
+               }
+               if (status & I2C_STAT_ARDY) {
+                       writew(I2C_STAT_ARDY, &i2c_base->stat);
+                       break;
+               }
+       }
+
+rd_exit:
+       flush_fifo();
+       writew(0xFFFF, &i2c_base->stat);
+       writew(0, &i2c_base->cnt);
+       return i2c_error;
 }
 
+/* i2c_write: Address (reg offset) may be 0, 1 or 2 bytes long. */
 int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
 {
        int i;
        u16 status;
        int i2c_error = 0;
-       u16 w;
-       u8 tmpbuf[2] = {addr >> 8, addr & 0xff};
+
+       if (alen < 0) {
+               puts("I2C write: addr len < 0\n");
+               return 1;
+       }
+
+       if (len < 0) {
+               puts("I2C write: data len < 0\n");
+               return 1;
+       }
+
+       if (buffer == NULL) {
+               puts("I2C write: NULL pointer passed\n");
+               return 1;
+       }
 
        if (alen > 2) {
                printf("I2C write: addr len %d not supported\n", alen);
@@ -355,92 +410,137 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
 
        if (addr + len > (1 << 16)) {
                printf("I2C write: address 0x%x + 0x%x out of range\n",
-                               addr, len);
+                      addr, len);
                return 1;
        }
 
-       /* wait until bus not busy */
+       /* Wait until bus not busy */
        if (wait_for_bb())
                return 1;
 
-       /* start address phase - will write regoffset + len bytes data */
-       /* TODO consider case when !CONFIG_OMAP243X/34XX/44XX */
+       /* Start address phase - will write regoffset + len bytes data */
        writew(alen + len, &i2c_base->cnt);
-       /* set slave address */
+       /* Set slave address */
        writew(chip, &i2c_base->sa);
-       /* stop bit needed here */
+       /* Stop bit needed here */
        writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX |
-               I2C_CON_STP, &i2c_base->con);
-
-       /* Send address and data */
-       for (i = -alen; i < len; i++) {
-               status = wait_for_pin();
-
+              I2C_CON_STP, &i2c_base->con);
+
+       while (alen) {
+               /* Must write reg offset (one or two bytes) */
+               status = wait_for_event();
+               /* Try to identify bus that is not padconf'd for I2C */
+               if (status == I2C_STAT_XRDY) {
+                       i2c_error = 2;
+                       printf("i2c_write: pads on bus %d probably not configured (status=0x%x)\n",
+                              current_bus, status);
+                       goto wr_exit;
+               }
                if (status == 0 || status & I2C_STAT_NACK) {
                        i2c_error = 1;
-                       printf("i2c error waiting for data ACK (status=0x%x)\n",
-                                       status);
-                       goto write_exit;
+                       printf("i2c_write: error waiting for addr ACK (status=0x%x)\n",
+                              status);
+                       goto wr_exit;
                }
-
                if (status & I2C_STAT_XRDY) {
-                       w = (i < 0) ? tmpbuf[2+i] : buffer[i];
-#if !(defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \
-       defined(CONFIG_OMAP44XX) || defined(CONFIG_AM33XX) || \
-       defined(CONFIG_OMAP54XX))
-                       w |= ((++i < 0) ? tmpbuf[2+i] : buffer[i]) << 8;
-#endif
-                       writew(w, &i2c_base->data);
+                       alen--;
+                       writeb((addr >> (8 * alen)) & 0xff, &i2c_base->data);
+                       writew(I2C_STAT_XRDY, &i2c_base->stat);
+               } else {
+                       i2c_error = 1;
+                       printf("i2c_write: bus not ready for addr Tx (status=0x%x)\n",
+                              status);
+                       goto wr_exit;
+               }
+       }
+       /* Address phase is over, now write data */
+       for (i = 0; i < len; i++) {
+               status = wait_for_event();
+               if (status == 0 || status & I2C_STAT_NACK) {
+                       i2c_error = 1;
+                       printf("i2c_write: error waiting for data ACK (status=0x%x)\n",
+                              status);
+                       goto wr_exit;
+               }
+               if (status & I2C_STAT_XRDY) {
+                       writeb(buffer[i], &i2c_base->data);
                        writew(I2C_STAT_XRDY, &i2c_base->stat);
                } else {
                        i2c_error = 1;
-                       printf("i2c bus not ready for Tx (i=%d)\n", i);
-                       goto write_exit;
+                       printf("i2c_write: bus not ready for data Tx (i=%d)\n",
+                              i);
+                       goto wr_exit;
                }
        }
 
-write_exit:
+wr_exit:
        flush_fifo();
        writew(0xFFFF, &i2c_base->stat);
+       writew(0, &i2c_base->cnt);
        return i2c_error;
 }
 
+/*
+ * Wait for the bus to be free by checking the Bus Busy (BB)
+ * bit to become clear
+ */
 static int wait_for_bb(void)
 {
        int timeout = I2C_TIMEOUT;
        u16 stat;
 
        writew(0xFFFF, &i2c_base->stat);        /* clear current interrupts...*/
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
        while ((stat = readw(&i2c_base->stat) & I2C_STAT_BB) && timeout--) {
+#else
+       /* Read RAW status */
+       while ((stat = readw(&i2c_base->irqstatus_raw) &
+               I2C_STAT_BB) && timeout--) {
+#endif
                writew(stat, &i2c_base->stat);
-               udelay(1000);
+               udelay(I2C_WAIT);
        }
 
        if (timeout <= 0) {
-               printf("timed out in wait_for_bb: I2C_STAT=%x\n",
-                       readw(&i2c_base->stat));
+               printf("Timed out in wait_for_bb: status=%04x\n",
+                      stat);
                return 1;
        }
        writew(0xFFFF, &i2c_base->stat);         /* clear delayed stuff*/
        return 0;
 }
 
-static u16 wait_for_pin(void)
+/*
+ * Wait for the I2C controller to complete current action
+ * and update status
+ */
+static u16 wait_for_event(void)
 {
        u16 status;
        int timeout = I2C_TIMEOUT;
 
        do {
-               udelay(1000);
+               udelay(I2C_WAIT);
+#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
                status = readw(&i2c_base->stat);
+#else
+               /* Read RAW status */
+               status = readw(&i2c_base->irqstatus_raw);
+#endif
        } while (!(status &
                   (I2C_STAT_ROVR | I2C_STAT_XUDF | I2C_STAT_XRDY |
                    I2C_STAT_RRDY | I2C_STAT_ARDY | I2C_STAT_NACK |
                    I2C_STAT_AL)) && timeout--);
 
        if (timeout <= 0) {
-               printf("timed out in wait_for_pin: I2C_STAT=%x\n",
-                       readw(&i2c_base->stat));
+               printf("Timed out in wait_for_event: status=%04x\n",
+                      status);
+               /*
+                * If status is still 0 here, probably the bus pads have
+                * not been configured for I2C, and/or pull-ups are missing.
+                */
+               printf("Check if pads/pull-ups of bus %d are properly configured\n",
+                      current_bus);
                writew(0xFFFF, &i2c_base->stat);
                status = 0;
        }
@@ -450,28 +550,36 @@ static u16 wait_for_pin(void)
 
 int i2c_set_bus_num(unsigned int bus)
 {
-       if ((bus < 0) || (bus >= I2C_BUS_MAX)) {
-               printf("Bad bus: %d\n", bus);
+       if (bus >= I2C_BUS_MAX) {
+               printf("Bad bus: %x\n", bus);
                return -1;
        }
 
-#if I2C_BUS_MAX == 4
-       if (bus == 3)
-               i2c_base = (struct i2c *)I2C_BASE4;
-       else
-       if (bus == 2)
+       switch (bus) {
+       default:
+               bus = 0;        /* Fall through */
+       case 0:
+               i2c_base = (struct i2c *)I2C_BASE1;
+               break;
+       case 1:
+               i2c_base = (struct i2c *)I2C_BASE2;
+               break;
+#if (I2C_BUS_MAX > 2)
+       case 2:
                i2c_base = (struct i2c *)I2C_BASE3;
-       else
+               break;
+#if (I2C_BUS_MAX > 3)
+       case 3:
+               i2c_base = (struct i2c *)I2C_BASE4;
+               break;
+#if (I2C_BUS_MAX > 4)
+       case 4:
+               i2c_base = (struct i2c *)I2C_BASE5;
+               break;
 #endif
-#if I2C_BUS_MAX == 3
-       if (bus == 2)
-               i2c_base = (struct i2c *)I2C_BASE3;
-       else
 #endif
-       if (bus == 1)
-               i2c_base = (struct i2c *)I2C_BASE2;
-       else
-               i2c_base = (struct i2c *)I2C_BASE1;
+#endif
+       }
 
        current_bus = bus;
 
diff --git a/drivers/i2c/zynq_i2c.c b/drivers/i2c/zynq_i2c.c
new file mode 100644 (file)
index 0000000..ec49660
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+ * Driver for the Zynq-7000 PS I2C controller
+ * IP from Cadence (ID T-CS-PE-0007-100, Version R1p10f2)
+ *
+ * Author: Joe Hershberger <joe.hershberger@ni.com>
+ * Copyright (c) 2012 Joe Hershberger.
+ *
+ * Copyright (c) 2012-2013 Xilinx, Michal Simek
+ *
+ * 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 <common.h>
+#include <asm/io.h>
+#include <i2c.h>
+#include <asm/errno.h>
+#include <asm/arch/hardware.h>
+
+/* i2c register set */
+struct zynq_i2c_registers {
+       u32 control;
+       u32 status;
+       u32 address;
+       u32 data;
+       u32 interrupt_status;
+       u32 transfer_size;
+       u32 slave_mon_pause;
+       u32 time_out;
+       u32 interrupt_mask;
+       u32 interrupt_enable;
+       u32 interrupt_disable;
+};
+
+/* Control register fields */
+#define ZYNQ_I2C_CONTROL_RW            0x00000001
+#define ZYNQ_I2C_CONTROL_MS            0x00000002
+#define ZYNQ_I2C_CONTROL_NEA           0x00000004
+#define ZYNQ_I2C_CONTROL_ACKEN         0x00000008
+#define ZYNQ_I2C_CONTROL_HOLD          0x00000010
+#define ZYNQ_I2C_CONTROL_SLVMON                0x00000020
+#define ZYNQ_I2C_CONTROL_CLR_FIFO      0x00000040
+#define ZYNQ_I2C_CONTROL_DIV_B_SHIFT   8
+#define ZYNQ_I2C_CONTROL_DIV_B_MASK    0x00003F00
+#define ZYNQ_I2C_CONTROL_DIV_A_SHIFT   14
+#define ZYNQ_I2C_CONTROL_DIV_A_MASK    0x0000C000
+
+/* Status register values */
+#define ZYNQ_I2C_STATUS_RXDV   0x00000020
+#define ZYNQ_I2C_STATUS_TXDV   0x00000040
+#define ZYNQ_I2C_STATUS_RXOVF  0x00000080
+#define ZYNQ_I2C_STATUS_BA     0x00000100
+
+/* Interrupt register fields */
+#define ZYNQ_I2C_INTERRUPT_COMP                0x00000001
+#define ZYNQ_I2C_INTERRUPT_DATA                0x00000002
+#define ZYNQ_I2C_INTERRUPT_NACK                0x00000004
+#define ZYNQ_I2C_INTERRUPT_TO          0x00000008
+#define ZYNQ_I2C_INTERRUPT_SLVRDY      0x00000010
+#define ZYNQ_I2C_INTERRUPT_RXOVF       0x00000020
+#define ZYNQ_I2C_INTERRUPT_TXOVF       0x00000040
+#define ZYNQ_I2C_INTERRUPT_RXUNF       0x00000080
+#define ZYNQ_I2C_INTERRUPT_ARBLOST     0x00000200
+
+#define ZYNQ_I2C_FIFO_DEPTH            16
+#define ZYNQ_I2C_TRANSFERT_SIZE_MAX    255 /* Controller transfer limit */
+
+#if defined(CONFIG_ZYNQ_I2C0)
+# define ZYNQ_I2C_BASE ZYNQ_I2C_BASEADDR0
+#else
+# define ZYNQ_I2C_BASE ZYNQ_I2C_BASEADDR1
+#endif
+
+static struct zynq_i2c_registers *zynq_i2c =
+       (struct zynq_i2c_registers *)ZYNQ_I2C_BASE;
+
+/* I2C init called by cmd_i2c when doing 'i2c reset'. */
+void i2c_init(int requested_speed, int slaveadd)
+{
+       /* 111MHz / ( (3 * 17) * 22 ) = ~100KHz */
+       writel((16 << ZYNQ_I2C_CONTROL_DIV_B_SHIFT) |
+               (2 << ZYNQ_I2C_CONTROL_DIV_A_SHIFT), &zynq_i2c->control);
+
+       /* Enable master mode, ack, and 7-bit addressing */
+       setbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_MS |
+               ZYNQ_I2C_CONTROL_ACKEN | ZYNQ_I2C_CONTROL_NEA);
+}
+
+#ifdef DEBUG
+static void zynq_i2c_debug_status(void)
+{
+       int int_status;
+       int status;
+       int_status = readl(&zynq_i2c->interrupt_status);
+
+       status = readl(&zynq_i2c->status);
+       if (int_status || status) {
+               debug("Status: ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_COMP)
+                       debug("COMP ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_DATA)
+                       debug("DATA ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_NACK)
+                       debug("NACK ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_TO)
+                       debug("TO ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_SLVRDY)
+                       debug("SLVRDY ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_RXOVF)
+                       debug("RXOVF ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_TXOVF)
+                       debug("TXOVF ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_RXUNF)
+                       debug("RXUNF ");
+               if (int_status & ZYNQ_I2C_INTERRUPT_ARBLOST)
+                       debug("ARBLOST ");
+               if (status & ZYNQ_I2C_STATUS_RXDV)
+                       debug("RXDV ");
+               if (status & ZYNQ_I2C_STATUS_TXDV)
+                       debug("TXDV ");
+               if (status & ZYNQ_I2C_STATUS_RXOVF)
+                       debug("RXOVF ");
+               if (status & ZYNQ_I2C_STATUS_BA)
+                       debug("BA ");
+               debug("TS%d ", readl(&zynq_i2c->transfer_size));
+               debug("\n");
+       }
+}
+#endif
+
+/* Wait for an interrupt */
+static u32 zynq_i2c_wait(u32 mask)
+{
+       int timeout, int_status;
+
+       for (timeout = 0; timeout < 100; timeout++) {
+               udelay(100);
+               int_status = readl(&zynq_i2c->interrupt_status);
+               if (int_status & mask)
+                       break;
+       }
+#ifdef DEBUG
+       zynq_i2c_debug_status();
+#endif
+       /* Clear interrupt status flags */
+       writel(int_status & mask, &zynq_i2c->interrupt_status);
+
+       return int_status & mask;
+}
+
+/*
+ * I2C probe called by cmd_i2c when doing 'i2c probe'.
+ * Begin read, nak data byte, end.
+ */
+int i2c_probe(u8 dev)
+{
+       /* Attempt to read a byte */
+       setbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_CLR_FIFO |
+               ZYNQ_I2C_CONTROL_RW);
+       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+       writel(0xFF, &zynq_i2c->interrupt_status);
+       writel(dev, &zynq_i2c->address);
+       writel(1, &zynq_i2c->transfer_size);
+
+       return (zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP |
+               ZYNQ_I2C_INTERRUPT_NACK) &
+               ZYNQ_I2C_INTERRUPT_COMP) ? 0 : -ETIMEDOUT;
+}
+
+/*
+ * I2C read called by cmd_i2c when doing 'i2c read' and by cmd_eeprom.c
+ * Begin write, send address byte(s), begin read, receive data bytes, end.
+ */
+int i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
+{
+       u32 status;
+       u32 i = 0;
+       u8 *cur_data = data;
+
+       /* Check the hardware can handle the requested bytes */
+       if ((length < 0) || (length > ZYNQ_I2C_TRANSFERT_SIZE_MAX))
+               return -EINVAL;
+
+       /* Write the register address */
+       setbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_CLR_FIFO |
+               ZYNQ_I2C_CONTROL_HOLD);
+       /*
+        * Temporarily disable restart (by clearing hold)
+        * It doesn't seem to work.
+        */
+       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_RW |
+               ZYNQ_I2C_CONTROL_HOLD);
+       writel(0xFF, &zynq_i2c->interrupt_status);
+       while (alen--)
+               writel(addr >> (8*alen), &zynq_i2c->data);
+       writel(dev, &zynq_i2c->address);
+
+       /* Wait for the address to be sent */
+       if (!zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP)) {
+               /* Release the bus */
+               clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+               return -ETIMEDOUT;
+       }
+       debug("Device acked address\n");
+
+       setbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_CLR_FIFO |
+               ZYNQ_I2C_CONTROL_RW);
+       /* Start reading data */
+       writel(dev, &zynq_i2c->address);
+       writel(length, &zynq_i2c->transfer_size);
+
+       /* Wait for data */
+       do {
+               status = zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP |
+                       ZYNQ_I2C_INTERRUPT_DATA);
+               if (!status) {
+                       /* Release the bus */
+                       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+                       return -ETIMEDOUT;
+               }
+               debug("Read %d bytes\n",
+                     length - readl(&zynq_i2c->transfer_size));
+               for (; i < length - readl(&zynq_i2c->transfer_size); i++)
+                       *(cur_data++) = readl(&zynq_i2c->data);
+       } while (readl(&zynq_i2c->transfer_size) != 0);
+       /* All done... release the bus */
+       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+
+#ifdef DEBUG
+       zynq_i2c_debug_status();
+#endif
+       return 0;
+}
+
+/*
+ * I2C write called by cmd_i2c when doing 'i2c write' and by cmd_eeprom.c
+ * Begin write, send address byte(s), send data bytes, end.
+ */
+int i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)
+{
+       u8 *cur_data = data;
+
+       /* Write the register address */
+       setbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_CLR_FIFO |
+               ZYNQ_I2C_CONTROL_HOLD);
+       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_RW);
+       writel(0xFF, &zynq_i2c->interrupt_status);
+       while (alen--)
+               writel(addr >> (8*alen), &zynq_i2c->data);
+       /* Start the tranfer */
+       writel(dev, &zynq_i2c->address);
+       if (!zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP)) {
+               /* Release the bus */
+               clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+               return -ETIMEDOUT;
+       }
+
+       debug("Device acked address\n");
+       while (length--) {
+               writel(*(cur_data++), &zynq_i2c->data);
+               if (readl(&zynq_i2c->transfer_size) == ZYNQ_I2C_FIFO_DEPTH) {
+                       if (!zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP)) {
+                               /* Release the bus */
+                               clrbits_le32(&zynq_i2c->control,
+                                            ZYNQ_I2C_CONTROL_HOLD);
+                               return -ETIMEDOUT;
+                       }
+               }
+       }
+
+       /* All done... release the bus */
+       clrbits_le32(&zynq_i2c->control, ZYNQ_I2C_CONTROL_HOLD);
+       /* Wait for the address and data to be sent */
+       if (!zynq_i2c_wait(ZYNQ_I2C_INTERRUPT_COMP))
+               return -ETIMEDOUT;
+       return 0;
+}
+
+int i2c_set_bus_num(unsigned int bus)
+{
+       /* Only support bus 0 */
+       if (bus > 0)
+               return -1;
+       return 0;
+}
+
+unsigned int i2c_get_bus_num(void)
+{
+       /* Only support bus 0 */
+       return 0;
+}
index 946a186a1ffaf2ad511cba5e0749efc53ddf8e16..c900e45d150b712ecbdbfc19257cf10a136463ab 100644 (file)
@@ -154,54 +154,42 @@ static uchar *create_keymap(struct key_matrix *config, u32 *data, int len,
        return map;
 }
 
-int key_matrix_decode_fdt(struct key_matrix *config, const void *blob,
-                         int node)
+int key_matrix_decode_fdt(struct key_matrix *config, const void *blob, int node)
 {
        const struct fdt_property *prop;
-       const char prefix[] = "linux,";
-       int plen = sizeof(prefix) - 1;
-       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, prefix, plen) ||
-                               len < plen + 6 ||
-                               strcmp(name + len - 6, "keymap"))
-                       continue;
+       int proplen;
+       uchar *plain_keycode;
 
-               len -= plen + 6;
-               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 + plen, "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);
-               }
+       prop = fdt_get_property(blob, node, "linux,keymap", &proplen);
+       /* Basic keymap is required */
+       if (!prop) {
+               debug("%s: cannot find keycode-plain map\n", __func__);
+               return -1;
        }
-       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__);
+       plain_keycode = create_keymap(config, (u32 *)prop->data,
+               proplen, KEY_FN, &config->fn_pos);
+       config->plain_keycode = plain_keycode;
+       /* Conversion error -> fail */
+       if (!config->plain_keycode)
+               return -1;
+
+       prop = fdt_get_property(blob, node, "linux,fn-keymap", &proplen);
+       /* fn keymap is optional */
+       if (!prop)
+               goto done;
+
+       config->fn_keycode = create_keymap(config, (u32 *)prop->data,
+               proplen, -1, NULL);
+       /* Conversion error -> fail */
+       if (!config->fn_keycode) {
+               free(plain_keycode);
                return -1;
        }
 
+done:
+       debug("%s: Decoded key maps %p, %p from fdt\n", __func__,
+             config->plain_keycode, config->fn_keycode);
        return 0;
 }
 
index 8cdc3b649ca34a963efe314da8731642914a684b..5d869b47ad4d4b54c5594c3b8c24ceaf793732e7 100644 (file)
@@ -28,8 +28,10 @@ LIB  := $(obj)libmisc.o
 COBJS-$(CONFIG_ALI152X) += ali512x.o
 COBJS-$(CONFIG_DS4510)  += ds4510.o
 COBJS-$(CONFIG_CBMEM_CONSOLE) += cbmem_console.o
+COBJS-$(CONFIG_FSL_IIM) += fsl_iim.o
 COBJS-$(CONFIG_GPIO_LED) += gpio_led.o
 COBJS-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o
+COBJS-$(CONFIG_MXC_OCOTP) += mxc_ocotp.o
 COBJS-$(CONFIG_NS87308) += ns87308.o
 COBJS-$(CONFIG_PDSP188x) += pdsp188x.o
 COBJS-$(CONFIG_STATUS_LED) += status_led.o
diff --git a/drivers/misc/fsl_iim.c b/drivers/misc/fsl_iim.c
new file mode 100644 (file)
index 0000000..9179fbb
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * (C) Copyright 2009-2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on the mpc512x iim code:
+ * Copyright 2008 Silicon Turnkey Express, Inc.
+ * Martha Marx <mmarx@silicontkx.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 <fuse.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#ifndef CONFIG_MPC512X
+#include <asm/arch/imx-regs.h>
+#endif
+
+/* FSL IIM-specific constants */
+#define STAT_BUSY              0x80
+#define STAT_PRGD              0x02
+#define STAT_SNSD              0x01
+
+#define STATM_PRGD_M           0x02
+#define STATM_SNSD_M           0x01
+
+#define ERR_PRGE               0x80
+#define ERR_WPE                        0x40
+#define ERR_OPE                        0x20
+#define ERR_RPE                        0x10
+#define ERR_WLRE               0x08
+#define ERR_SNSE               0x04
+#define ERR_PARITYE            0x02
+
+#define EMASK_PRGE_M           0x80
+#define EMASK_WPE_M            0x40
+#define EMASK_OPE_M            0x20
+#define EMASK_RPE_M            0x10
+#define EMASK_WLRE_M           0x08
+#define EMASK_SNSE_M           0x04
+#define EMASK_PARITYE_M                0x02
+
+#define FCTL_DPC               0x80
+#define FCTL_PRG_LENGTH_MASK   0x70
+#define FCTL_ESNS_N            0x08
+#define FCTL_ESNS_0            0x04
+#define FCTL_ESNS_1            0x02
+#define FCTL_PRG               0x01
+
+#define UA_A_BANK_MASK         0x38
+#define UA_A_ROWH_MASK         0x07
+
+#define LA_A_ROWL_MASK         0xf8
+#define LA_A_BIT_MASK          0x07
+
+#define PREV_PROD_REV_MASK     0xf8
+#define PREV_PROD_VT_MASK      0x07
+
+/* Select the correct accessors depending on endianness */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define iim_read32             in_le32
+#define iim_write32            out_le32
+#define iim_clrsetbits32       clrsetbits_le32
+#define iim_clrbits32          clrbits_le32
+#define iim_setbits32          setbits_le32
+#elif __BYTE_ORDER == __BIG_ENDIAN
+#define iim_read32             in_be32
+#define iim_write32            out_be32
+#define iim_clrsetbits32       clrsetbits_be32
+#define iim_clrbits32          clrbits_be32
+#define iim_setbits32          setbits_be32
+#else
+#error Endianess is not defined: please fix to continue
+#endif
+
+/* IIM control registers */
+struct fsl_iim {
+       u32 stat;
+       u32 statm;
+       u32 err;
+       u32 emask;
+       u32 fctl;
+       u32 ua;
+       u32 la;
+       u32 sdat;
+       u32 prev;
+       u32 srev;
+       u32 prg_p;
+       u32 scs[0x1f5];
+       struct {
+               u32 word[0x100];
+       } bank[8];
+};
+
+static int prepare_access(struct fsl_iim **regs, u32 bank, u32 word, int assert,
+                               const char *caller)
+{
+       *regs = (struct fsl_iim *)IIM_BASE_ADDR;
+
+       if (bank >= ARRAY_SIZE((*regs)->bank) ||
+                       word >= ARRAY_SIZE((*regs)->bank[0].word) ||
+                       !assert) {
+               printf("fsl_iim %s(): Invalid argument\n", caller);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static void clear_status(struct fsl_iim *regs)
+{
+       iim_setbits32(&regs->stat, 0);
+       iim_setbits32(&regs->err, 0);
+}
+
+static void finish_access(struct fsl_iim *regs, u32 *stat, u32 *err)
+{
+       *stat = iim_read32(&regs->stat);
+       *err = iim_read32(&regs->err);
+       clear_status(regs);
+}
+
+static int prepare_read(struct fsl_iim **regs, u32 bank, u32 word, u32 *val,
+                       const char *caller)
+{
+       int ret;
+
+       ret = prepare_access(regs, bank, word, val != NULL, caller);
+       if (ret)
+               return ret;
+
+       clear_status(*regs);
+
+       return 0;
+}
+
+int fuse_read(u32 bank, u32 word, u32 *val)
+{
+       struct fsl_iim *regs;
+       u32 stat, err;
+       int ret;
+
+       ret = prepare_read(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       *val = iim_read32(&regs->bank[bank].word[word]);
+       finish_access(regs, &stat, &err);
+
+       if (err & ERR_RPE) {
+               puts("fsl_iim fuse_read(): Read protect error\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static void direct_access(struct fsl_iim *regs, u32 bank, u32 word, u32 bit,
+                               u32 fctl, u32 *stat, u32 *err)
+{
+       iim_write32(&regs->ua, bank << 3 | word >> 5);
+       iim_write32(&regs->la, (word << 3 | bit) & 0xff);
+       if (fctl == FCTL_PRG)
+               iim_write32(&regs->prg_p, 0xaa);
+       iim_setbits32(&regs->fctl, fctl);
+       while (iim_read32(&regs->stat) & STAT_BUSY)
+               udelay(20);
+       finish_access(regs, stat, err);
+}
+
+int fuse_sense(u32 bank, u32 word, u32 *val)
+{
+       struct fsl_iim *regs;
+       u32 stat, err;
+       int ret;
+
+       ret = prepare_read(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       direct_access(regs, bank, word, 0, FCTL_ESNS_N, &stat, &err);
+
+       if (err & ERR_SNSE) {
+               puts("fsl_iim fuse_sense(): Explicit sense cycle error\n");
+               return -EIO;
+       }
+
+       if (!(stat & STAT_SNSD)) {
+               puts("fsl_iim fuse_sense(): Explicit sense cycle did not complete\n");
+               return -EIO;
+       }
+
+       *val = iim_read32(&regs->sdat);
+       return 0;
+}
+
+static int prog_bit(struct fsl_iim *regs, u32 bank, u32 word, u32 bit)
+{
+       u32 stat, err;
+
+       clear_status(regs);
+       direct_access(regs, bank, word, bit, FCTL_PRG, &stat, &err);
+       iim_write32(&regs->prg_p, 0x00);
+
+       if (err & ERR_PRGE) {
+               puts("fsl_iim fuse_prog(): Program error\n");
+               return -EIO;
+       }
+
+       if (err & ERR_WPE) {
+               puts("fsl_iim fuse_prog(): Write protect error\n");
+               return -EIO;
+       }
+
+       if (!(stat & STAT_PRGD)) {
+               puts("fsl_iim fuse_prog(): Program did not complete\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int prepare_write(struct fsl_iim **regs, u32 bank, u32 word, u32 val,
+                               const char *caller)
+{
+       return prepare_access(regs, bank, word, !(val & ~0xff), caller);
+}
+
+int fuse_prog(u32 bank, u32 word, u32 val)
+{
+       struct fsl_iim *regs;
+       u32 bit;
+       int ret;
+
+       ret = prepare_write(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       for (bit = 0; val; bit++, val >>= 1)
+               if (val & 0x01) {
+                       ret = prog_bit(regs, bank, word, bit);
+                       if (ret)
+                               return ret;
+               }
+
+       return 0;
+}
+
+int fuse_override(u32 bank, u32 word, u32 val)
+{
+       struct fsl_iim *regs;
+       u32 stat, err;
+       int ret;
+
+       ret = prepare_write(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       clear_status(regs);
+       iim_write32(&regs->bank[bank].word[word], val);
+       finish_access(regs, &stat, &err);
+
+       if (err & ERR_OPE) {
+               puts("fsl_iim fuse_override(): Override protect error\n");
+               return -EIO;
+       }
+
+       return 0;
+}
diff --git a/drivers/misc/mxc_ocotp.c b/drivers/misc/mxc_ocotp.c
new file mode 100644 (file)
index 0000000..0095b47
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * (C) Copyright 2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on Dirk Behme's
+ * https://github.com/dirkbehme/u-boot-imx6/blob/28b17e9/drivers/misc/imx_otp.c,
+ * which is based on Freescale's
+ * http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tree/drivers/misc/imx_otp.c?h=imx_v2009.08_1.1.0&id=9aa74e6,
+ * which is:
+ * Copyright (C) 2011 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <fuse.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+
+#define BO_CTRL_WR_UNLOCK              16
+#define BM_CTRL_WR_UNLOCK              0xffff0000
+#define BV_CTRL_WR_UNLOCK_KEY          0x3e77
+#define BM_CTRL_ERROR                  0x00000200
+#define BM_CTRL_BUSY                   0x00000100
+#define BO_CTRL_ADDR                   0
+#define BM_CTRL_ADDR                   0x0000007f
+
+#define BO_TIMING_STROBE_READ          16
+#define BM_TIMING_STROBE_READ          0x003f0000
+#define BV_TIMING_STROBE_READ_NS       37
+#define BO_TIMING_RELAX                        12
+#define BM_TIMING_RELAX                        0x0000f000
+#define BV_TIMING_RELAX_NS             17
+#define BO_TIMING_STROBE_PROG          0
+#define BM_TIMING_STROBE_PROG          0x00000fff
+#define BV_TIMING_STROBE_PROG_US       10
+
+#define BM_READ_CTRL_READ_FUSE         0x00000001
+
+#define BF(value, field)               (((value) << BO_##field) & BM_##field)
+
+#define WRITE_POSTAMBLE_US             2
+
+static void wait_busy(struct ocotp_regs *regs, unsigned int delay_us)
+{
+       while (readl(&regs->ctrl) & BM_CTRL_BUSY)
+               udelay(delay_us);
+}
+
+static void clear_error(struct ocotp_regs *regs)
+{
+       writel(BM_CTRL_ERROR, &regs->ctrl_clr);
+}
+
+static int prepare_access(struct ocotp_regs **regs, u32 bank, u32 word,
+                               int assert, const char *caller)
+{
+       *regs = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+
+       if (bank >= ARRAY_SIZE((*regs)->bank) ||
+                       word >= ARRAY_SIZE((*regs)->bank[0].fuse_regs) >> 2 ||
+                       !assert) {
+               printf("mxc_ocotp %s(): Invalid argument\n", caller);
+               return -EINVAL;
+       }
+
+       enable_ocotp_clk(1);
+
+       wait_busy(*regs, 1);
+       clear_error(*regs);
+
+       return 0;
+}
+
+static int finish_access(struct ocotp_regs *regs, const char *caller)
+{
+       u32 err;
+
+       err = !!(readl(&regs->ctrl) & BM_CTRL_ERROR);
+       clear_error(regs);
+
+       enable_ocotp_clk(0);
+
+       if (err) {
+               printf("mxc_ocotp %s(): Access protect error\n", caller);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int prepare_read(struct ocotp_regs **regs, u32 bank, u32 word, u32 *val,
+                       const char *caller)
+{
+       return prepare_access(regs, bank, word, val != NULL, caller);
+}
+
+int fuse_read(u32 bank, u32 word, u32 *val)
+{
+       struct ocotp_regs *regs;
+       int ret;
+
+       ret = prepare_read(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       *val = readl(&regs->bank[bank].fuse_regs[word << 2]);
+
+       return finish_access(regs, __func__);
+}
+
+static void set_timing(struct ocotp_regs *regs)
+{
+       u32 ipg_clk;
+       u32 relax, strobe_read, strobe_prog;
+       u32 timing;
+
+       ipg_clk = mxc_get_clock(MXC_IPG_CLK);
+
+       relax = DIV_ROUND_UP(ipg_clk * BV_TIMING_RELAX_NS, 1000000000) - 1;
+       strobe_read = DIV_ROUND_UP(ipg_clk * BV_TIMING_STROBE_READ_NS,
+                                       1000000000) + 2 * (relax + 1) - 1;
+       strobe_prog = DIV_ROUND(ipg_clk * BV_TIMING_STROBE_PROG_US, 1000000) +
+                       2 * (relax + 1) - 1;
+
+       timing = BF(strobe_read, TIMING_STROBE_READ) |
+                       BF(relax, TIMING_RELAX) |
+                       BF(strobe_prog, TIMING_STROBE_PROG);
+
+       clrsetbits_le32(&regs->timing, BM_TIMING_STROBE_READ | BM_TIMING_RELAX |
+                       BM_TIMING_STROBE_PROG, timing);
+}
+
+static void setup_direct_access(struct ocotp_regs *regs, u32 bank, u32 word,
+                               int write)
+{
+       u32 wr_unlock = write ? BV_CTRL_WR_UNLOCK_KEY : 0;
+       u32 addr = bank << 3 | word;
+
+       set_timing(regs);
+       clrsetbits_le32(&regs->ctrl, BM_CTRL_WR_UNLOCK | BM_CTRL_ADDR,
+                       BF(wr_unlock, CTRL_WR_UNLOCK) |
+                       BF(addr, CTRL_ADDR));
+}
+
+int fuse_sense(u32 bank, u32 word, u32 *val)
+{
+       struct ocotp_regs *regs;
+       int ret;
+
+       ret = prepare_read(&regs, bank, word, val, __func__);
+       if (ret)
+               return ret;
+
+       setup_direct_access(regs, bank, word, false);
+       writel(BM_READ_CTRL_READ_FUSE, &regs->read_ctrl);
+       wait_busy(regs, 1);
+       *val = readl(&regs->read_fuse_data);
+
+       return finish_access(regs, __func__);
+}
+
+static int prepare_write(struct ocotp_regs **regs, u32 bank, u32 word,
+                               const char *caller)
+{
+       return prepare_access(regs, bank, word, true, caller);
+}
+
+int fuse_prog(u32 bank, u32 word, u32 val)
+{
+       struct ocotp_regs *regs;
+       int ret;
+
+       ret = prepare_write(&regs, bank, word, __func__);
+       if (ret)
+               return ret;
+
+       setup_direct_access(regs, bank, word, true);
+       writel(val, &regs->data);
+       wait_busy(regs, BV_TIMING_STROBE_PROG_US);
+       udelay(WRITE_POSTAMBLE_US);
+
+       return finish_access(regs, __func__);
+}
+
+int fuse_override(u32 bank, u32 word, u32 val)
+{
+       struct ocotp_regs *regs;
+       int ret;
+
+       ret = prepare_write(&regs, bank, word, __func__);
+       if (ret)
+               return ret;
+
+       writel(val, &regs->bank[bank].fuse_regs[word << 2]);
+
+       return finish_access(regs, __func__);
+}
index 33cea116d2920792d7e0cce5687603ae9fc323aa..e150d8f0372b44bc133483501dd34d8a5f70ebf3 100644 (file)
@@ -42,7 +42,7 @@ void twl4030_led_init(unsigned char ledon_mask)
        if (ledon_mask & TWL4030_LED_LEDEN_LEDBON)
                ledon_mask |= TWL4030_LED_LEDEN_LEDBPWM;
 
-       twl4030_i2c_write_u8(TWL4030_CHIP_LED, ledon_mask,
-                            TWL4030_LED_LEDEN);
+       twl4030_i2c_write_u8(TWL4030_CHIP_LED, TWL4030_LED_LEDEN,
+                            ledon_mask);
 
 }
index 2b581781d6c546b28cff1f89e90ae1286f60f5f6..24648a29378a2487e0d3220085e58e81a355696b 100644 (file)
@@ -47,6 +47,7 @@ COBJS-$(CONFIG_SPEAR_SDHCI) += spear_sdhci.o
 COBJS-$(CONFIG_TEGRA_MMC) += tegra_mmc.o
 COBJS-$(CONFIG_DWMMC) += dw_mmc.o
 COBJS-$(CONFIG_EXYNOS_DWMMC) += exynos_dw_mmc.o
+COBJS-$(CONFIG_ZYNQ_SDHCI) += zynq_sdhci.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
index 70a9f91c8d97408ed5e38347487094e2ff742bf4..77ebf174f00c5a39a35f4f2b005c6750e6df30d8 100644 (file)
 
 static int initialized = 0;
 
+/* Read Atmel MCI IP version */
+static unsigned int atmel_mci_get_version(struct atmel_mci *mci)
+{
+       return readl(&mci->version) & 0x00000fff;
+}
+
 /*
  * Print command and status:
  *
@@ -205,7 +211,10 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
        /* Wait for the command to complete */
        while (!((status = readl(&mci->sr)) & MMCI_BIT(CMDRDY)));
 
-       if (status & error_flags) {
+       if ((status & error_flags) & MMCI_BIT(RTOE)) {
+               dump_cmd(cmdr, cmd->cmdarg, status, "Command Time Out");
+               return TIMEOUT;
+       } else if (status & error_flags) {
                dump_cmd(cmdr, cmd->cmdarg, status, "Command Failed");
                return COMM_ERR;
        }
@@ -297,7 +306,9 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 static void mci_set_ios(struct mmc *mmc)
 {
        atmel_mci_t *mci = (atmel_mci_t *)mmc->priv;
-       int busw = (mmc->bus_width == 4) ? 1 : 0;
+       int bus_width = mmc->bus_width;
+       unsigned int version = atmel_mci_get_version(mci);
+       int busw;
 
        /* Set the clock speed */
        mci_set_mode(mmc, mmc->clock, MMC_DEFAULT_BLKLEN);
@@ -305,9 +316,26 @@ static void mci_set_ios(struct mmc *mmc)
        /*
         * set the bus width and select slot for this interface
         * there is no capability for multiple slots on the same interface yet
-        * Bitfield SCDBUS needs to be expanded to 2 bits for 8-bit buses
         */
-       writel(MMCI_BF(SCDBUS, busw) | MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);
+       if ((version & 0xf00) >= 0x300) {
+               switch (bus_width) {
+               case 8:
+                       busw = 3;
+                       break;
+               case 4:
+                       busw = 2;
+                       break;
+               default:
+                       busw = 0;
+                       break;
+               }
+
+               writel(busw << 6 | MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);
+       } else {
+               busw = (bus_width == 4) ? 1 : 0;
+
+               writel(busw << 7 | MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);
+       }
 }
 
 /* Entered into mmc structure during driver init */
@@ -340,9 +368,12 @@ static int mci_init(struct mmc *mmc)
 int atmel_mci_init(void *regs)
 {
        struct mmc *mmc = malloc(sizeof(struct mmc));
+       struct atmel_mci *mci;
+       unsigned int version;
 
        if (!mmc)
                return -1;
+
        strcpy(mmc->name, "mci");
        mmc->priv = regs;
        mmc->send_cmd = mci_send_cmd;
@@ -353,7 +384,13 @@ int atmel_mci_init(void *regs)
 
        /* need to be able to pass these in on a board by board basis */
        mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
-       mmc->host_caps = MMC_MODE_4BIT;
+       mci = (struct atmel_mci *)mmc->priv;
+       version = atmel_mci_get_version(mci);
+       if ((version & 0xf00) >= 0x300)
+               mmc->host_caps = MMC_MODE_8BIT;
+
+       mmc->host_caps |= MMC_MODE_4BIT;
+
        /*
         * min and max frequencies determined by
         * max and min of clock divider
index a89660f130bd5509245400f7155ebf3ba6ca4d31..fdaf9c763e85d66d98957c8793789fcd3ea43553 100644 (file)
@@ -41,7 +41,7 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/arch/dma.h>
+#include <asm/imx-common/dma.h>
 #include <bouncebuf.h>
 
 struct mxsmmc_priv {
index 166744c3204ff4a8d1701fc37cae80f08f2f39f3..975b2c5ba4d74b1ae875a205341efec5bd233e82 100644 (file)
@@ -29,7 +29,7 @@
 #include <i2c.h>
 #include <twl4030.h>
 #include <twl6030.h>
-#include <twl6035.h>
+#include <palmas.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/arch/mmc_host_def.h>
@@ -107,29 +107,27 @@ static void omap4_vmmc_pbias_config(struct mmc *mmc)
 }
 #endif
 
-#if defined(CONFIG_OMAP54XX) && defined(CONFIG_TWL6035_POWER)
+#if defined(CONFIG_OMAP54XX) && defined(CONFIG_PALMAS_POWER)
 static void omap5_pbias_config(struct mmc *mmc)
 {
        u32 value = 0;
 
        value = readl((*ctrl)->control_pbias);
-       value &= ~(SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ);
-       value |= SDCARD_BIAS_HIZ_MODE;
+       value &= ~SDCARD_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+       udelay(10); /* wait 10 us */
+       value &= ~SDCARD_BIAS_PWRDNZ;
        writel(value, (*ctrl)->control_pbias);
 
-       twl6035_mmc1_poweron_ldo();
+       palmas_mmc1_poweron_ldo();
 
        value = readl((*ctrl)->control_pbias);
-       value &= ~SDCARD_BIAS_HIZ_MODE;
-       value |= SDCARD_PBIASLITE_VMODE | SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ;
+       value |= 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);
-       }
+       udelay(150); /* wait 150 us */
+       value |= SDCARD_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+       udelay(150); /* wait 150 us */
 }
 #endif
 
@@ -178,7 +176,7 @@ 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 defined(CONFIG_OMAP54XX) && defined(CONFIG_PALMAS_POWER)
        if (mmc->block_dev.dev == 0)
                omap5_pbias_config(mmc);
 #endif
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
new file mode 100644 (file)
index 0000000..9e37af4
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * (C) Copyright 2013 Inc.
+ *
+ * Xilinx Zynq SD Host Controller Interface
+ *
+ * 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; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * 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/sys_proto.h>
+
+int zynq_sdhci_init(u32 regbase)
+{
+       struct sdhci_host *host = NULL;
+
+       host = (struct sdhci_host *)malloc(sizeof(struct sdhci_host));
+       if (!host) {
+               printf("zynq_sdhci_init: sdhci_host malloc fail\n");
+               return 1;
+       }
+
+       host->name = "zynq_sdhci";
+       host->ioaddr = (void *)regbase;
+       host->quirks = SDHCI_QUIRK_NO_CD | SDHCI_QUIRK_WAIT_SEND_CMD;
+       host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
+
+       host->host_caps = MMC_MODE_HC;
+
+       add_sdhci(host, 52000000, 52000000 >> 9);
+       return 0;
+}
index 543c845ff0173c6c6540a5827e1e4305e09c84a6..99f39fc752b902352036c85c679baab6f25245bb 100644 (file)
@@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk
 
 LIB    := $(obj)libmtd.o
 
-COBJS-$(CONFIG_MTD_DEVICE) += mtdcore.o
+ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)))
+COBJS-y += mtdcore.o
+endif
 COBJS-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
 COBJS-$(CONFIG_MTD_CONCAT) += mtdconcat.o
 COBJS-$(CONFIG_HAS_DATAFLASH) += at45.o
index 22d84407dd4a6513eaed35bb029c009c86d40536..25f875202c337deafbda8f30b530325f21c5d88c 100644 (file)
@@ -38,6 +38,7 @@
 #include <asm/processor.h>
 #include <asm/io.h>
 #include <asm/byteorder.h>
+#include <asm/unaligned.h>
 #include <environment.h>
 #include <mtd/cfi_flash.h>
 #include <watchdog.h>
@@ -183,16 +184,16 @@ u64 flash_read64(void *addr)__attribute__((weak, alias("__flash_read64")));
 flash_info_t *flash_get_info(ulong base)
 {
        int i;
-       flash_info_t *info = NULL;
+       flash_info_t *info;
 
        for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
-               info = & flash_info[i];
+               info = &flash_info[i];
                if (info->size && info->start[0] <= base &&
                    base <= info->start[0] + info->size - 1)
-                       break;
+                       return info;
        }
 
-       return info;
+       return NULL;
 }
 #endif
 
@@ -1640,9 +1641,10 @@ static void cfi_reverse_geometry(struct cfi_qry *qry)
        u32 tmp;
 
        for (i = 0, j = qry->num_erase_regions - 1; i < j; i++, j--) {
-               tmp = qry->erase_region_info[i];
-               qry->erase_region_info[i] = qry->erase_region_info[j];
-               qry->erase_region_info[j] = tmp;
+               tmp = get_unaligned(&(qry->erase_region_info[i]));
+               put_unaligned(get_unaligned(&(qry->erase_region_info[j])),
+                             &(qry->erase_region_info[i]));
+               put_unaligned(tmp, &(qry->erase_region_info[j]));
        }
 }
 
@@ -2073,8 +2075,8 @@ ulong flash_get_size (phys_addr_t base, int banknum)
        info->start[0] = (ulong)map_physmem(base, info->portwidth, MAP_NOCACHE);
 
        if (flash_detect_cfi (info, &qry)) {
-               info->vendor = le16_to_cpu(qry.p_id);
-               info->ext_addr = le16_to_cpu(qry.p_adr);
+               info->vendor = le16_to_cpu(get_unaligned(&(qry.p_id)));
+               info->ext_addr = le16_to_cpu(get_unaligned(&(qry.p_adr)));
                num_erase_regions = qry.num_erase_regions;
 
                if (info->ext_addr) {
@@ -2163,7 +2165,8 @@ ulong flash_get_size (phys_addr_t base, int banknum)
                                break;
                        }
 
-                       tmp = le32_to_cpu(qry.erase_region_info[i]);
+                       tmp = le32_to_cpu(get_unaligned(
+                                               &(qry.erase_region_info[i])));
                        debug("erase region %u: 0x%08lx\n", i, tmp);
 
                        erase_region_count = (tmp & 0xffff) + 1;
index 8d74fa94128a7348de33a4051ba3ef3f13d805a6..bbb71a19e7d04c23bdd541b38c4a8fc8fd30bffc 100644 (file)
@@ -244,12 +244,12 @@ int cfi_mtd_init(void)
                mtd->size               = fi->size;
                mtd->writesize          = 1;
 
-               mtd->erase              = cfi_mtd_erase;
-               mtd->read               = cfi_mtd_read;
-               mtd->write              = cfi_mtd_write;
-               mtd->sync               = cfi_mtd_sync;
-               mtd->lock               = cfi_mtd_lock;
-               mtd->unlock             = cfi_mtd_unlock;
+               mtd->_erase             = cfi_mtd_erase;
+               mtd->_read              = cfi_mtd_read;
+               mtd->_write             = cfi_mtd_write;
+               mtd->_sync              = cfi_mtd_sync;
+               mtd->_lock              = cfi_mtd_lock;
+               mtd->_unlock            = cfi_mtd_unlock;
                mtd->priv               = fi;
 
                if (add_mtd_device(mtd))
index e6d938417ded948b498c41590fc85435db00dfec..31e4289b1601a4bb9de7cb2df4862258dc34bae8 100644 (file)
@@ -70,14 +70,14 @@ concat_read(struct mtd_info *mtd, loff_t from, size_t len,
                        /* Entire transaction goes into this subdev */
                        size = len;
 
-               err = subdev->read(subdev, from, size, &retsize, buf);
+               err = mtd_read(subdev, from, size, &retsize, buf);
 
                /* Save information about bitflips! */
                if (unlikely(err)) {
-                       if (err == -EBADMSG) {
+                       if (mtd_is_eccerr(err)) {
                                mtd->ecc_stats.failed++;
                                ret = err;
-                       } else if (err == -EUCLEAN) {
+                       } else if (mtd_is_bitflip(err)) {
                                mtd->ecc_stats.corrected++;
                                /* Do not overwrite -EBADMSG !! */
                                if (!ret)
@@ -105,9 +105,6 @@ concat_write(struct mtd_info *mtd, loff_t to, size_t len,
        int err = -EINVAL;
        int i;
 
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-
        *retlen = 0;
 
        for (i = 0; i < concat->num_subdev; i++) {
@@ -124,11 +121,7 @@ concat_write(struct mtd_info *mtd, loff_t to, size_t len,
                else
                        size = len;
 
-               if (!(subdev->flags & MTD_WRITEABLE))
-                       err = -EROFS;
-               else
-                       err = subdev->write(subdev, to, size, &retsize, buf);
-
+               err = mtd_write(subdev, to, size, &retsize, buf);
                if (err)
                        break;
 
@@ -165,16 +158,16 @@ concat_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)
                if (from + devops.len > subdev->size)
                        devops.len = subdev->size - from;
 
-               err = subdev->read_oob(subdev, from, &devops);
+               err = mtd_read_oob(subdev, from, &devops);
                ops->retlen += devops.retlen;
                ops->oobretlen += devops.oobretlen;
 
                /* Save information about bitflips! */
                if (unlikely(err)) {
-                       if (err == -EBADMSG) {
+                       if (mtd_is_eccerr(err)) {
                                mtd->ecc_stats.failed++;
                                ret = err;
-                       } else if (err == -EUCLEAN) {
+                       } else if (mtd_is_bitflip(err)) {
                                mtd->ecc_stats.corrected++;
                                /* Do not overwrite -EBADMSG !! */
                                if (!ret)
@@ -225,7 +218,7 @@ concat_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops)
                if (to + devops.len > subdev->size)
                        devops.len = subdev->size - to;
 
-               err = subdev->write_oob(subdev, to, &devops);
+               err = mtd_write_oob(subdev, to, &devops);
                ops->retlen += devops.retlen;
                if (err)
                        return err;
@@ -271,7 +264,7 @@ static int concat_dev_erase(struct mtd_info *mtd, struct erase_info *erase)
         * FIXME: Allow INTERRUPTIBLE. Which means
         * not having the wait_queue head on the stack.
         */
-       err = mtd->erase(mtd, erase);
+       err = mtd_erase(mtd, erase);
        if (!err) {
                set_current_state(TASK_UNINTERRUPTIBLE);
                add_wait_queue(&waitq, &wait);
@@ -294,15 +287,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr)
        uint64_t length, offset = 0;
        struct erase_info *erase;
 
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-
-       if (instr->addr > concat->mtd.size)
-               return -EINVAL;
-
-       if (instr->len + instr->addr > concat->mtd.size)
-               return -EINVAL;
-
        /*
         * Check for proper erase block alignment of the to-be-erased area.
         * It is easier to do this based on the super device's erase
@@ -350,8 +334,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr)
                        return -EINVAL;
        }
 
-       instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
-
        /* make a local copy of instr to avoid modifying the caller's struct */
        erase = kmalloc(sizeof (struct erase_info), GFP_KERNEL);
 
@@ -390,10 +372,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr)
                else
                        erase->len = length;
 
-               if (!(subdev->flags & MTD_WRITEABLE)) {
-                       err = -EROFS;
-                       break;
-               }
                length -= erase->len;
                if ((err = concat_dev_erase(subdev, erase))) {
                        /* sanity check: should never happen since
@@ -429,9 +407,6 @@ static int concat_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
        struct mtd_concat *concat = CONCAT(mtd);
        int i, err = -EINVAL;
 
-       if ((len + ofs) > mtd->size)
-               return -EINVAL;
-
        for (i = 0; i < concat->num_subdev; i++) {
                struct mtd_info *subdev = concat->subdev[i];
                uint64_t size;
@@ -446,7 +421,7 @@ static int concat_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
                else
                        size = len;
 
-               err = subdev->lock(subdev, ofs, size);
+               err = mtd_lock(subdev, ofs, size);
 
                if (err)
                        break;
@@ -467,9 +442,6 @@ static int concat_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
        struct mtd_concat *concat = CONCAT(mtd);
        int i, err = 0;
 
-       if ((len + ofs) > mtd->size)
-               return -EINVAL;
-
        for (i = 0; i < concat->num_subdev; i++) {
                struct mtd_info *subdev = concat->subdev[i];
                uint64_t size;
@@ -484,7 +456,7 @@ static int concat_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
                else
                        size = len;
 
-               err = subdev->unlock(subdev, ofs, size);
+               err = mtd_unlock(subdev, ofs, size);
 
                if (err)
                        break;
@@ -507,7 +479,7 @@ static void concat_sync(struct mtd_info *mtd)
 
        for (i = 0; i < concat->num_subdev; i++) {
                struct mtd_info *subdev = concat->subdev[i];
-               subdev->sync(subdev);
+               mtd_sync(subdev);
        }
 }
 
@@ -516,12 +488,9 @@ static int concat_block_isbad(struct mtd_info *mtd, loff_t ofs)
        struct mtd_concat *concat = CONCAT(mtd);
        int i, res = 0;
 
-       if (!concat->subdev[0]->block_isbad)
+       if (!mtd_can_have_bb(concat->subdev[0]))
                return res;
 
-       if (ofs > mtd->size)
-               return -EINVAL;
-
        for (i = 0; i < concat->num_subdev; i++) {
                struct mtd_info *subdev = concat->subdev[i];
 
@@ -530,7 +499,7 @@ static int concat_block_isbad(struct mtd_info *mtd, loff_t ofs)
                        continue;
                }
 
-               res = subdev->block_isbad(subdev, ofs);
+               res = mtd_block_isbad(subdev, ofs);
                break;
        }
 
@@ -542,12 +511,9 @@ static int concat_block_markbad(struct mtd_info *mtd, loff_t ofs)
        struct mtd_concat *concat = CONCAT(mtd);
        int i, err = -EINVAL;
 
-       if (!concat->subdev[0]->block_markbad)
+       if (!mtd_can_have_bb(concat->subdev[0]))
                return 0;
 
-       if (ofs > mtd->size)
-               return -EINVAL;
-
        for (i = 0; i < concat->num_subdev; i++) {
                struct mtd_info *subdev = concat->subdev[i];
 
@@ -556,7 +522,7 @@ static int concat_block_markbad(struct mtd_info *mtd, loff_t ofs)
                        continue;
                }
 
-               err = subdev->block_markbad(subdev, ofs);
+               err = mtd_block_markbad(subdev, ofs);
                if (!err)
                        mtd->ecc_stats.badblocks++;
                break;
@@ -609,14 +575,14 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],     /* subdevices to c
        concat->mtd.subpage_sft = subdev[0]->subpage_sft;
        concat->mtd.oobsize = subdev[0]->oobsize;
        concat->mtd.oobavail = subdev[0]->oobavail;
-       if (subdev[0]->read_oob)
-               concat->mtd.read_oob = concat_read_oob;
-       if (subdev[0]->write_oob)
-               concat->mtd.write_oob = concat_write_oob;
-       if (subdev[0]->block_isbad)
-               concat->mtd.block_isbad = concat_block_isbad;
-       if (subdev[0]->block_markbad)
-               concat->mtd.block_markbad = concat_block_markbad;
+       if (subdev[0]->_read_oob)
+               concat->mtd._read_oob = concat_read_oob;
+       if (subdev[0]->_write_oob)
+               concat->mtd._write_oob = concat_write_oob;
+       if (subdev[0]->_block_isbad)
+               concat->mtd._block_isbad = concat_block_isbad;
+       if (subdev[0]->_block_markbad)
+               concat->mtd._block_markbad = concat_block_markbad;
 
        concat->mtd.ecc_stats.badblocks = subdev[0]->ecc_stats.badblocks;
 
@@ -653,8 +619,8 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],       /* subdevices to c
                if (concat->mtd.writesize   !=  subdev[i]->writesize ||
                    concat->mtd.subpage_sft != subdev[i]->subpage_sft ||
                    concat->mtd.oobsize    !=  subdev[i]->oobsize ||
-                   !concat->mtd.read_oob  != !subdev[i]->read_oob ||
-                   !concat->mtd.write_oob != !subdev[i]->write_oob) {
+                   !concat->mtd._read_oob  != !subdev[i]->_read_oob ||
+                   !concat->mtd._write_oob != !subdev[i]->_write_oob) {
                        kfree(concat);
                        printk("Incompatible OOB or ECC data on \"%s\"\n",
                               subdev[i]->name);
@@ -669,12 +635,12 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],     /* subdevices to c
        concat->num_subdev = num_devs;
        concat->mtd.name = name;
 
-       concat->mtd.erase = concat_erase;
-       concat->mtd.read = concat_read;
-       concat->mtd.write = concat_write;
-       concat->mtd.sync = concat_sync;
-       concat->mtd.lock = concat_lock;
-       concat->mtd.unlock = concat_unlock;
+       concat->mtd._erase = concat_erase;
+       concat->mtd._read = concat_read;
+       concat->mtd._write = concat_write;
+       concat->mtd._sync = concat_sync;
+       concat->mtd._lock = concat_lock;
+       concat->mtd._unlock = concat_unlock;
 
        /*
         * Combine the erase block size info of the subdevices:
index 3a81adaf60d5563d805e230515f12a3ca444439e..49c08145a7fa63296cdb79dc058af7108b64a72b 100644 (file)
@@ -25,6 +25,11 @@ int add_mtd_device(struct mtd_info *mtd)
                        mtd->index = i;
                        mtd->usecount = 0;
 
+                       /* default value if not set by driver */
+                       if (mtd->bitflip_threshold == 0)
+                               mtd->bitflip_threshold = mtd->ecc_strength;
+
+
                        /* No need to get a refcount on the module containing
                           the notifier, since we hold the mtd_table_mutex */
 
@@ -186,3 +191,189 @@ void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
        }
 }
 #endif /* defined(CONFIG_CMD_MTDPARTS_SPREAD) */
+
+ /*
+ * Erase is an asynchronous operation.  Device drivers are supposed
+ * to call instr->callback() whenever the operation completes, even
+ * if it completes with a failure.
+ * Callers are supposed to pass a callback function and wait for it
+ * to be called before writing to the block.
+ */
+int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
+{
+       if (instr->addr > mtd->size || instr->len > mtd->size - instr->addr)
+               return -EINVAL;
+       if (!(mtd->flags & MTD_WRITEABLE))
+               return -EROFS;
+       instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
+       if (!instr->len) {
+               instr->state = MTD_ERASE_DONE;
+               mtd_erase_callback(instr);
+               return 0;
+       }
+       return mtd->_erase(mtd, instr);
+}
+
+int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
+            u_char *buf)
+{
+       if (from < 0 || from > mtd->size || len > mtd->size - from)
+               return -EINVAL;
+       if (!len)
+               return 0;
+       return mtd->_read(mtd, from, len, retlen, buf);
+}
+
+int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
+             const u_char *buf)
+{
+       *retlen = 0;
+       if (to < 0 || to > mtd->size || len > mtd->size - to)
+               return -EINVAL;
+       if (!mtd->_write || !(mtd->flags & MTD_WRITEABLE))
+               return -EROFS;
+       if (!len)
+               return 0;
+       return mtd->_write(mtd, to, len, retlen, buf);
+}
+
+/*
+ * In blackbox flight recorder like scenarios we want to make successful writes
+ * in interrupt context. panic_write() is only intended to be called when its
+ * known the kernel is about to panic and we need the write to succeed. Since
+ * the kernel is not going to be running for much longer, this function can
+ * break locks and delay to ensure the write succeeds (but not sleep).
+ */
+int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
+                   const u_char *buf)
+{
+       *retlen = 0;
+       if (!mtd->_panic_write)
+               return -EOPNOTSUPP;
+       if (to < 0 || to > mtd->size || len > mtd->size - to)
+               return -EINVAL;
+       if (!(mtd->flags & MTD_WRITEABLE))
+               return -EROFS;
+       if (!len)
+               return 0;
+       return mtd->_panic_write(mtd, to, len, retlen, buf);
+}
+
+int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)
+{
+       ops->retlen = ops->oobretlen = 0;
+       if (!mtd->_read_oob)
+               return -EOPNOTSUPP;
+       return mtd->_read_oob(mtd, from, ops);
+}
+
+/*
+ * Method to access the protection register area, present in some flash
+ * devices. The user data is one time programmable but the factory data is read
+ * only.
+ */
+int mtd_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
+                          size_t len)
+{
+       if (!mtd->_get_fact_prot_info)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_get_fact_prot_info(mtd, buf, len);
+}
+
+int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
+                          size_t *retlen, u_char *buf)
+{
+       *retlen = 0;
+       if (!mtd->_read_fact_prot_reg)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_read_fact_prot_reg(mtd, from, len, retlen, buf);
+}
+
+int mtd_get_user_prot_info(struct mtd_info *mtd, struct otp_info *buf,
+                          size_t len)
+{
+       if (!mtd->_get_user_prot_info)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_get_user_prot_info(mtd, buf, len);
+}
+
+int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
+                          size_t *retlen, u_char *buf)
+{
+       *retlen = 0;
+       if (!mtd->_read_user_prot_reg)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_read_user_prot_reg(mtd, from, len, retlen, buf);
+}
+
+int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
+                           size_t *retlen, u_char *buf)
+{
+       *retlen = 0;
+       if (!mtd->_write_user_prot_reg)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_write_user_prot_reg(mtd, to, len, retlen, buf);
+}
+
+int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len)
+{
+       if (!mtd->_lock_user_prot_reg)
+               return -EOPNOTSUPP;
+       if (!len)
+               return 0;
+       return mtd->_lock_user_prot_reg(mtd, from, len);
+}
+
+/* Chip-supported device locking */
+int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+{
+       if (!mtd->_lock)
+               return -EOPNOTSUPP;
+       if (ofs < 0 || ofs > mtd->size || len > mtd->size - ofs)
+               return -EINVAL;
+       if (!len)
+               return 0;
+       return mtd->_lock(mtd, ofs, len);
+}
+
+int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+{
+       if (!mtd->_unlock)
+               return -EOPNOTSUPP;
+       if (ofs < 0 || ofs > mtd->size || len > mtd->size - ofs)
+               return -EINVAL;
+       if (!len)
+               return 0;
+       return mtd->_unlock(mtd, ofs, len);
+}
+
+int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs)
+{
+       if (!mtd->_block_isbad)
+               return 0;
+       if (ofs < 0 || ofs > mtd->size)
+               return -EINVAL;
+       return mtd->_block_isbad(mtd, ofs);
+}
+
+int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs)
+{
+       if (!mtd->_block_markbad)
+               return -EOPNOTSUPP;
+       if (ofs < 0 || ofs > mtd->size)
+               return -EINVAL;
+       if (!(mtd->flags & MTD_WRITEABLE))
+               return -EROFS;
+       return mtd->_block_markbad(mtd, ofs);
+}
+
index cbfc6796c7d6a96b3c81d353c0c2a141ac80b62c..9dfe7bbc9a9244dbb7e56f328b3046d2d2c3fbe0 100644 (file)
@@ -52,17 +52,11 @@ static int part_read(struct mtd_info *mtd, loff_t from, size_t len,
        int res;
 
        stats = part->master->ecc_stats;
-
-       if (from >= mtd->size)
-               len = 0;
-       else if (from + len > mtd->size)
-               len = mtd->size - from;
-       res = part->master->read(part->master, from + part->offset,
-                                  len, retlen, buf);
+       res = mtd_read(part->master, from + part->offset, len, retlen, buf);
        if (unlikely(res)) {
-               if (res == -EUCLEAN)
+               if (mtd_is_bitflip(res))
                        mtd->ecc_stats.corrected += part->master->ecc_stats.corrected - stats.corrected;
-               if (res == -EBADMSG)
+               if (mtd_is_eccerr(res))
                        mtd->ecc_stats.failed += part->master->ecc_stats.failed - stats.failed;
        }
        return res;
@@ -78,12 +72,12 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from,
                return -EINVAL;
        if (ops->datbuf && from + ops->len > mtd->size)
                return -EINVAL;
-       res = part->master->read_oob(part->master, from + part->offset, ops);
+       res = mtd_read_oob(part->master, from + part->offset, ops);
 
        if (unlikely(res)) {
-               if (res == -EUCLEAN)
+               if (mtd_is_bitflip(res))
                        mtd->ecc_stats.corrected++;
-               if (res == -EBADMSG)
+               if (mtd_is_eccerr(res))
                        mtd->ecc_stats.failed++;
        }
        return res;
@@ -93,58 +87,35 @@ static int part_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
                size_t len, size_t *retlen, u_char *buf)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->read_user_prot_reg(part->master, from,
-                                       len, retlen, buf);
+       return mtd_read_user_prot_reg(part->master, from, len, retlen, buf);
 }
 
 static int part_get_user_prot_info(struct mtd_info *mtd,
                struct otp_info *buf, size_t len)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->get_user_prot_info(part->master, buf, len);
+       return mtd_get_user_prot_info(part->master, buf, len);
 }
 
 static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
                size_t len, size_t *retlen, u_char *buf)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->read_fact_prot_reg(part->master, from,
-                                       len, retlen, buf);
+       return mtd_read_fact_prot_reg(part->master, from, len, retlen, buf);
 }
 
 static int part_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
                size_t len)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->get_fact_prot_info(part->master, buf, len);
+       return mtd_get_fact_prot_info(part->master, buf, len);
 }
 
 static int part_write(struct mtd_info *mtd, loff_t to, size_t len,
                size_t *retlen, const u_char *buf)
 {
        struct mtd_part *part = PART(mtd);
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-       if (to >= mtd->size)
-               len = 0;
-       else if (to + len > mtd->size)
-               len = mtd->size - to;
-       return part->master->write(part->master, to + part->offset,
-                                   len, retlen, buf);
-}
-
-static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
-               size_t *retlen, const u_char *buf)
-{
-       struct mtd_part *part = PART(mtd);
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-       if (to >= mtd->size)
-               len = 0;
-       else if (to + len > mtd->size)
-               len = mtd->size - to;
-       return part->master->panic_write(part->master, to + part->offset,
-                                   len, retlen, buf);
+       return mtd_write(part->master, to + part->offset, len, retlen, buf);
 }
 
 static int part_write_oob(struct mtd_info *mtd, loff_t to,
@@ -152,41 +123,34 @@ static int part_write_oob(struct mtd_info *mtd, loff_t to,
 {
        struct mtd_part *part = PART(mtd);
 
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-
        if (to >= mtd->size)
                return -EINVAL;
        if (ops->datbuf && to + ops->len > mtd->size)
                return -EINVAL;
-       return part->master->write_oob(part->master, to + part->offset, ops);
+       return mtd_write_oob(part->master, to + part->offset, ops);
 }
 
 static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
                size_t len, size_t *retlen, u_char *buf)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->write_user_prot_reg(part->master, from,
-                                       len, retlen, buf);
+       return mtd_write_user_prot_reg(part->master, from, len, retlen, buf);
 }
 
 static int part_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
                size_t len)
 {
        struct mtd_part *part = PART(mtd);
-       return part->master->lock_user_prot_reg(part->master, from, len);
+       return mtd_lock_user_prot_reg(part->master, from, len);
 }
 
 static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
        struct mtd_part *part = PART(mtd);
        int ret;
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-       if (instr->addr >= mtd->size)
-               return -EINVAL;
+
        instr->addr += part->offset;
-       ret = part->master->erase(part->master, instr);
+       ret = mtd_erase(part->master, instr);
        if (ret) {
                if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
                        instr->fail_addr -= part->offset;
@@ -197,7 +161,7 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
 
 void mtd_erase_callback(struct erase_info *instr)
 {
-       if (instr->mtd->erase == part_erase) {
+       if (instr->mtd->_erase == part_erase) {
                struct mtd_part *part = PART(instr->mtd);
 
                if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
@@ -211,32 +175,26 @@ void mtd_erase_callback(struct erase_info *instr)
 static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 {
        struct mtd_part *part = PART(mtd);
-       if ((len + ofs) > mtd->size)
-               return -EINVAL;
-       return part->master->lock(part->master, ofs + part->offset, len);
+       return mtd_lock(part->master, ofs + part->offset, len);
 }
 
 static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 {
        struct mtd_part *part = PART(mtd);
-       if ((len + ofs) > mtd->size)
-               return -EINVAL;
-       return part->master->unlock(part->master, ofs + part->offset, len);
+       return mtd_unlock(part->master, ofs + part->offset, len);
 }
 
 static void part_sync(struct mtd_info *mtd)
 {
        struct mtd_part *part = PART(mtd);
-       part->master->sync(part->master);
+       mtd_sync(part->master);
 }
 
 static int part_block_isbad(struct mtd_info *mtd, loff_t ofs)
 {
        struct mtd_part *part = PART(mtd);
-       if (ofs >= mtd->size)
-               return -EINVAL;
        ofs += part->offset;
-       return part->master->block_isbad(part->master, ofs);
+       return mtd_block_isbad(part->master, ofs);
 }
 
 static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)
@@ -244,12 +202,8 @@ static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)
        struct mtd_part *part = PART(mtd);
        int res;
 
-       if (!(mtd->flags & MTD_WRITEABLE))
-               return -EROFS;
-       if (ofs >= mtd->size)
-               return -EINVAL;
        ofs += part->offset;
-       res = part->master->block_markbad(part->master, ofs);
+       res = mtd_block_markbad(part->master, ofs);
        if (!res)
                mtd->ecc_stats.badblocks++;
        return res;
@@ -303,39 +257,36 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
        slave->mtd.name = part->name;
        slave->mtd.owner = master->owner;
 
-       slave->mtd.read = part_read;
-       slave->mtd.write = part_write;
-
-       if (master->panic_write)
-               slave->mtd.panic_write = part_panic_write;
-
-       if (master->read_oob)
-               slave->mtd.read_oob = part_read_oob;
-       if (master->write_oob)
-               slave->mtd.write_oob = part_write_oob;
-       if (master->read_user_prot_reg)
-               slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
-       if (master->read_fact_prot_reg)
-               slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
-       if (master->write_user_prot_reg)
-               slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
-       if (master->lock_user_prot_reg)
-               slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
-       if (master->get_user_prot_info)
-               slave->mtd.get_user_prot_info = part_get_user_prot_info;
-       if (master->get_fact_prot_info)
-               slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
-       if (master->sync)
-               slave->mtd.sync = part_sync;
-       if (master->lock)
-               slave->mtd.lock = part_lock;
-       if (master->unlock)
-               slave->mtd.unlock = part_unlock;
-       if (master->block_isbad)
-               slave->mtd.block_isbad = part_block_isbad;
-       if (master->block_markbad)
-               slave->mtd.block_markbad = part_block_markbad;
-       slave->mtd.erase = part_erase;
+       slave->mtd._read = part_read;
+       slave->mtd._write = part_write;
+
+       if (master->_read_oob)
+               slave->mtd._read_oob = part_read_oob;
+       if (master->_write_oob)
+               slave->mtd._write_oob = part_write_oob;
+       if (master->_read_user_prot_reg)
+               slave->mtd._read_user_prot_reg = part_read_user_prot_reg;
+       if (master->_read_fact_prot_reg)
+               slave->mtd._read_fact_prot_reg = part_read_fact_prot_reg;
+       if (master->_write_user_prot_reg)
+               slave->mtd._write_user_prot_reg = part_write_user_prot_reg;
+       if (master->_lock_user_prot_reg)
+               slave->mtd._lock_user_prot_reg = part_lock_user_prot_reg;
+       if (master->_get_user_prot_info)
+               slave->mtd._get_user_prot_info = part_get_user_prot_info;
+       if (master->_get_fact_prot_info)
+               slave->mtd._get_fact_prot_info = part_get_fact_prot_info;
+       if (master->_sync)
+               slave->mtd._sync = part_sync;
+       if (master->_lock)
+               slave->mtd._lock = part_lock;
+       if (master->_unlock)
+               slave->mtd._unlock = part_unlock;
+       if (master->_block_isbad)
+               slave->mtd._block_isbad = part_block_isbad;
+       if (master->_block_markbad)
+               slave->mtd._block_markbad = part_block_markbad;
+       slave->mtd._erase = part_erase;
        slave->master = master;
        slave->offset = part->offset;
        slave->index = partno;
@@ -416,12 +367,11 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
        }
 
        slave->mtd.ecclayout = master->ecclayout;
-       if (master->block_isbad) {
+       if (master->_block_isbad) {
                uint64_t offs = 0;
 
                while (offs < slave->mtd.size) {
-                       if (master->block_isbad(master,
-                                               offs + slave->offset))
+                       if (mtd_block_isbad(master, offs + slave->offset))
                                slave->mtd.ecc_stats.badblocks++;
                        offs += slave->mtd.erasesize;
                }
index 35769c5ea3fbcbf00d848615b1dc3ed1b524534c..8821704911be69ab24e1e487a1f6c98903062e14 100644 (file)
@@ -34,6 +34,7 @@ NORMAL_DRIVERS=y
 endif
 
 COBJS-$(CONFIG_SPL_NAND_AM33XX_BCH) += am335x_spl_bch.o
+COBJS-$(CONFIG_SPL_NAND_DOCG4) += docg4_spl.o
 COBJS-$(CONFIG_SPL_NAND_SIMPLE) += nand_spl_simple.o
 COBJS-$(CONFIG_SPL_NAND_LOAD) += nand_spl_load.o
 COBJS-$(CONFIG_SPL_NAND_ECC) += nand_ecc.o
@@ -77,6 +78,7 @@ COBJS-$(CONFIG_NAND_SPEAR) += spr_nand.o
 COBJS-$(CONFIG_TEGRA_NAND) += tegra_nand.o
 COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o
 COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o
+COBJS-$(CONFIG_NAND_DOCG4) += docg4.o
 
 else  # minimal SPL drivers
 
index 994dd9f0952516cf760b192841b9c9f0c04ec1ea..3bfbaf8ac9fc192297b3653f6254ef74143023ee 100644 (file)
@@ -489,7 +489,7 @@ normal_check:
 }
 
 static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
-       struct nand_chip *chip, uint8_t *buf, int page)
+       struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
 {
        struct atmel_nand_host *host = chip->priv;
        int eccsize = chip->ecc.size;
@@ -529,8 +529,9 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
        return 0;
 }
 
-static void atmel_nand_pmecc_write_page(struct mtd_info *mtd,
-               struct nand_chip *chip, const uint8_t *buf)
+static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
+               struct nand_chip *chip, const uint8_t *buf,
+               int oob_required)
 {
        struct atmel_nand_host *host = chip->priv;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
@@ -557,7 +558,7 @@ static void atmel_nand_pmecc_write_page(struct mtd_info *mtd,
 
        if (!timeout) {
                printk(KERN_ERR "atmel_nand : Timeout to read PMECC status, fail to write PMECC in oob\n");
-               return;
+               goto out;
        }
 
        for (i = 0; i < host->pmecc_sector_number; i++) {
@@ -570,6 +571,8 @@ static void atmel_nand_pmecc_write_page(struct mtd_info *mtd,
                }
        }
        chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+out:
+       return 0;
 }
 
 static void atmel_pmecc_core_init(struct mtd_info *mtd)
@@ -706,6 +709,7 @@ static int atmel_pmecc_nand_init_params(struct nand_chip *nand,
 
        nand->ecc.read_page = atmel_nand_pmecc_read_page;
        nand->ecc.write_page = atmel_nand_pmecc_write_page;
+       nand->ecc.strength = cap;
 
        atmel_pmecc_core_init(mtd);
 
@@ -775,9 +779,10 @@ static int atmel_nand_calculate(struct mtd_info *mtd,
  * mtd:        mtd info structure
  * chip:       nand chip info structure
  * buf:        buffer to store read data
+ * oob_required:    caller expects OOB data read to chip->oob_poi
  */
-static int atmel_nand_read_page(struct mtd_info *mtd,
-               struct nand_chip *chip, uint8_t *buf, int page)
+static int atmel_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
+                               uint8_t *buf, int oob_required, int page)
 {
        int eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
index c7ddbb21d8ed95edd8463cbe69349df3e0d03b1a..7e755e8965aa54d6957576cbbaf224783ce949a0 100644 (file)
@@ -374,9 +374,11 @@ int board_nand_init(struct nand_chip *chip)
                if (!NAND_IS_512()) {
                        chip->ecc.bytes = 3;
                        chip->ecc.size = 256;
+                       chip->ecc.strength = 1;
                } else {
                        chip->ecc.bytes = 6;
                        chip->ecc.size = 512;
+                       chip->ecc.strength = 2;
                }
                chip->ecc.mode = NAND_ECC_HW;
                chip->ecc.calculate = bfin_nfc_calculate_ecc;
index e8506ddd9bdde79aac0acf6c9cddbda1858b2290..90f59857fd597f3021735030a06ff9c408c4a581 100644 (file)
@@ -607,12 +607,13 @@ void davinci_nand_init(struct nand_chip *nand)
 {
        nand->chip_delay  = 0;
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
-       nand->options     |= NAND_USE_FLASH_BBT;
+       nand->bbt_options         |= NAND_BBT_USE_FLASH;
 #endif
 #ifdef CONFIG_SYS_NAND_HW_ECC
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = 512;
        nand->ecc.bytes = 3;
+       nand->ecc.strength = 1;
        nand->ecc.calculate = nand_davinci_calculate_ecc;
        nand->ecc.correct  = nand_davinci_correct_data;
        nand->ecc.hwctl  = nand_davinci_enable_hwecc;
@@ -623,6 +624,7 @@ void davinci_nand_init(struct nand_chip *nand)
        nand->ecc.mode = NAND_ECC_HW_OOB_FIRST;
        nand->ecc.size = 512;
        nand->ecc.bytes = 10;
+       nand->ecc.strength = 4;
        nand->ecc.calculate = nand_davinci_4bit_calculate_ecc;
        nand->ecc.correct = nand_davinci_4bit_correct_data;
        nand->ecc.hwctl = nand_davinci_4bit_enable_hwecc;
index edf3a099ba78d7148563e7328cf81e9251c1d0b0..4cd741ebbb48d2b03840b7d0e85f3db734da5fb9 100644 (file)
@@ -134,7 +134,7 @@ static struct rs_control *rs_decoder;
 
 /*
  * The HW decoder in the DoC ASIC's provides us a error syndrome,
- * which we must convert to a standard syndrom usable by the generic
+ * which we must convert to a standard syndrome usable by the generic
  * Reed-Solomon library code.
  *
  * Fabrice Bellard figured this out in the old docecc code. I added
@@ -154,7 +154,7 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
        ds[3] = ((ecc[3] & 0xc0) >> 6) | ((ecc[0] & 0xff) << 2);
        parity = ecc[1];
 
-       /* Initialize the syndrom buffer */
+       /* Initialize the syndrome buffer */
        for (i = 0; i < NROOTS; i++)
                s[i] = ds[0];
        /*
@@ -1033,7 +1033,7 @@ static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat,
                WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf);
        else
                WriteDOC(DOC_ECC_DIS, docptr, ECCConf);
-       if (no_ecc_failures && (ret == -EBADMSG)) {
+       if (no_ecc_failures && mtd_is_eccerr(ret)) {
                printk(KERN_ERR "suppressing ECC failure\n");
                ret = 0;
        }
@@ -1073,7 +1073,7 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch
        size_t retlen;
 
        for (offs = 0; offs < mtd->size; offs += mtd->erasesize) {
-               ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf);
+               ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf);
                if (retlen != mtd->writesize)
                        continue;
                if (ret) {
@@ -1098,7 +1098,7 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch
        /* Only one mediaheader was found.  We want buf to contain a
           mediaheader on return, so we'll have to re-read the one we found. */
        offs = doc->mh0_page << this->page_shift;
-       ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf);
+       ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf);
        if (retlen != mtd->writesize) {
                /* Insanity.  Give up. */
                printk(KERN_ERR "Read DiskOnChip Media Header once, but can't reread it???\n");
@@ -1658,7 +1658,8 @@ static int __init doc_probe(unsigned long physadr)
        nand->ecc.mode          = NAND_ECC_HW_SYNDROME;
        nand->ecc.size          = 512;
        nand->ecc.bytes         = 6;
-       nand->options           = NAND_USE_FLASH_BBT;
+       nand->ecc.strength      = 2;
+       nand->bbt_options       = NAND_BBT_USE_FLASH;
 
        doc->physadr            = physadr;
        doc->virtadr            = virtadr;
diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c
new file mode 100644 (file)
index 0000000..7dd9953
--- /dev/null
@@ -0,0 +1,1028 @@
+/*
+ * drivers/mtd/nand/docg4.c
+ *
+ * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ * mtd nand driver for M-Systems DiskOnChip G4
+ *
+ * Tested on the Palm Treo 680.  The G4 is also present on Toshiba Portege, Asus
+ * P526, some HTC smartphones (Wizard, Prophet, ...), O2 XDA Zinc, maybe others.
+ * Should work on these as well.  Let me know!
+ *
+ * TODO:
+ *
+ *  Mechanism for management of password-protected areas
+ *
+ *  Hamming ecc when reading oob only
+ *
+ *  According to the M-Sys documentation, this device is also available in a
+ *  "dual-die" configuration having a 256MB capacity, but no mechanism for
+ *  detecting this variant is documented.  Currently this driver assumes 128MB
+ *  capacity.
+ *
+ *  Support for multiple cascaded devices ("floors").  Not sure which gadgets
+ *  contain multiple G4s in a cascaded configuration, if any.
+ *
+ */
+
+
+#include <common.h>
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+#include <asm/bitops.h>
+#include <asm/errno.h>
+#include <malloc.h>
+#include <nand.h>
+#include <linux/bch.h>
+#include <linux/bitrev.h>
+#include <linux/mtd/docg4.h>
+
+/*
+ * The device has a nop register which M-Sys claims is for the purpose of
+ * inserting precise delays.  But beware; at least some operations fail if the
+ * nop writes are replaced with a generic delay!
+ */
+static inline void write_nop(void __iomem *docptr)
+{
+       writew(0, docptr + DOC_NOP);
+}
+
+
+static int poll_status(void __iomem *docptr)
+{
+       /*
+        * Busy-wait for the FLASHREADY bit to be set in the FLASHCONTROL
+        * register.  Operations known to take a long time (e.g., block erase)
+        * should sleep for a while before calling this.
+        */
+
+       uint8_t flash_status;
+
+       /* hardware quirk requires reading twice initially */
+       flash_status = readb(docptr + DOC_FLASHCONTROL);
+
+       do {
+               flash_status = readb(docptr + DOC_FLASHCONTROL);
+       } while (!(flash_status & DOC_CTRL_FLASHREADY));
+
+       return 0;
+}
+
+static void write_addr(void __iomem *docptr, uint32_t docg4_addr)
+{
+       /* write the four address bytes packed in docg4_addr to the device */
+
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+}
+
+/*
+ * This is a module parameter in the linux kernel version of this driver.  It is
+ * hard-coded to 'off' for u-boot.  This driver uses oob to mark bad blocks.
+ * This can be problematic when dealing with data not intended for the mtd/nand
+ * subsystem.  For example, on boards that boot from the docg4 and use the IPL
+ * to load an spl + u-boot image, the blocks containing the image will be
+ * reported as "bad" because the oob of the first page of each block contains a
+ * magic number that the IPL looks for, which causes the badblock scan to
+ * erroneously add them to the bad block table.  To erase such a block, use
+ * u-boot's 'nand scrub'.  scrub is safe for the docg4.  The device does have a
+ * factory bad block table, but it is read-only, and is used in conjunction with
+ * oob bad block markers that are written by mtd/nand when a block is deemed to
+ * be bad.  To read data from "bad" blocks, use 'read.raw'.  Unfortunately,
+ * read.raw does not use ecc, which would still work fine on such misidentified
+ * bad blocks.  TODO: u-boot nand utilities need the ability to ignore bad
+ * blocks.
+ */
+static const int ignore_badblocks; /* remains false */
+
+struct docg4_priv {
+       int status;
+       struct {
+               unsigned int command;
+               int column;
+               int page;
+       } last_command;
+       uint8_t oob_buf[16];
+       uint8_t ecc_buf[7];
+       int oob_page;
+       struct bch_control *bch;
+};
+/*
+ * Oob bytes 0 - 6 are available to the user.
+ * Byte 7 is hamming ecc for first 7 bytes.  Bytes 8 - 14 are hw-generated ecc.
+ * Byte 15 (the last) is used by the driver as a "page written" flag.
+ */
+static struct nand_ecclayout docg4_oobinfo = {
+       .eccbytes = 9,
+       .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15},
+       .oobavail = 7,
+       .oobfree = { {0, 7} }
+};
+
+static void reset(void __iomem *docptr)
+{
+       /* full device reset */
+
+       writew(DOC_ASICMODE_RESET | DOC_ASICMODE_MDWREN, docptr + DOC_ASICMODE);
+       writew(~(DOC_ASICMODE_RESET | DOC_ASICMODE_MDWREN),
+              docptr + DOC_ASICMODECONFIRM);
+       write_nop(docptr);
+
+       writew(DOC_ASICMODE_NORMAL | DOC_ASICMODE_MDWREN,
+              docptr + DOC_ASICMODE);
+       writew(~(DOC_ASICMODE_NORMAL | DOC_ASICMODE_MDWREN),
+              docptr + DOC_ASICMODECONFIRM);
+
+       writew(DOC_ECCCONF1_ECC_ENABLE, docptr + DOC_ECCCONF1);
+
+       poll_status(docptr);
+}
+
+static void docg4_select_chip(struct mtd_info *mtd, int chip)
+{
+       /*
+        * Select among multiple cascaded chips ("floors").  Multiple floors are
+        * not yet supported, so the only valid non-negative value is 0.
+        */
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+
+       if (chip < 0)
+               return;         /* deselected */
+
+       if (chip > 0)
+               printf("multiple floors currently unsupported\n");
+
+       writew(0, docptr + DOC_DEVICESELECT);
+}
+
+static void read_hw_ecc(void __iomem *docptr, uint8_t *ecc_buf)
+{
+       /* read the 7 hw-generated ecc bytes */
+
+       int i;
+       for (i = 0; i < 7; i++) { /* hw quirk; read twice */
+               ecc_buf[i] = readb(docptr + DOC_BCH_SYNDROM(i));
+               ecc_buf[i] = readb(docptr + DOC_BCH_SYNDROM(i));
+       }
+}
+
+static int correct_data(struct mtd_info *mtd, uint8_t *buf, int page)
+{
+       /*
+        * Called after a page read when hardware reports bitflips.
+        * Up to four bitflips can be corrected.
+        */
+
+       struct nand_chip *nand = mtd->priv;
+       struct docg4_priv *doc = nand->priv;
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       int i, numerrs;
+       unsigned int errpos[4];
+       const uint8_t blank_read_hwecc[8] = {
+               0xcf, 0x72, 0xfc, 0x1b, 0xa9, 0xc7, 0xb9, 0 };
+
+       read_hw_ecc(docptr, doc->ecc_buf); /* read 7 hw-generated ecc bytes */
+
+       /* check if read error is due to a blank page */
+       if (!memcmp(doc->ecc_buf, blank_read_hwecc, 7))
+               return 0;       /* yes */
+
+       /* skip additional check of "written flag" if ignore_badblocks */
+       if (!ignore_badblocks) {
+               /*
+                * If the hw ecc bytes are not those of a blank page, there's
+                * still a chance that the page is blank, but was read with
+                * errors.  Check the "written flag" in last oob byte, which
+                * is set to zero when a page is written.  If more than half
+                * the bits are set, assume a blank page.  Unfortunately, the
+                * bit flips(s) are not reported in stats.
+                */
+
+               if (doc->oob_buf[15]) {
+                       int bit, numsetbits = 0;
+                       unsigned long written_flag = doc->oob_buf[15];
+
+                       for (bit = 0; bit < 8; bit++) {
+                               if (written_flag & 0x01)
+                                       numsetbits++;
+                               written_flag >>= 1;
+                       }
+                       if (numsetbits > 4) { /* assume blank */
+                               printf("errors in blank page at offset %08x\n",
+                                      page * DOCG4_PAGE_SIZE);
+                               return 0;
+                       }
+               }
+       }
+
+       /*
+        * The hardware ecc unit produces oob_ecc ^ calc_ecc.  The kernel's bch
+        * algorithm is used to decode this.  However the hw operates on page
+        * data in a bit order that is the reverse of that of the bch alg,
+        * requiring that the bits be reversed on the result.  Thanks to Ivan
+        * Djelic for his analysis!
+        */
+       for (i = 0; i < 7; i++)
+               doc->ecc_buf[i] = bitrev8(doc->ecc_buf[i]);
+
+       numerrs = decode_bch(doc->bch, NULL, DOCG4_USERDATA_LEN, NULL,
+                            doc->ecc_buf, NULL, errpos);
+
+       if (numerrs == -EBADMSG) {
+               printf("uncorrectable errors at offset %08x\n",
+                      page * DOCG4_PAGE_SIZE);
+               return -EBADMSG;
+       }
+
+       BUG_ON(numerrs < 0);    /* -EINVAL, or anything other than -EBADMSG */
+
+       /* undo last step in BCH alg (modulo mirroring not needed) */
+       for (i = 0; i < numerrs; i++)
+               errpos[i] = (errpos[i] & ~7)|(7-(errpos[i] & 7));
+
+       /* fix the errors */
+       for (i = 0; i < numerrs; i++) {
+               /* ignore if error within oob ecc bytes */
+               if (errpos[i] > DOCG4_USERDATA_LEN * 8)
+                       continue;
+
+               /* if error within oob area preceeding ecc bytes... */
+               if (errpos[i] > DOCG4_PAGE_SIZE * 8)
+                       __change_bit(errpos[i] - DOCG4_PAGE_SIZE * 8,
+                                    (unsigned long *)doc->oob_buf);
+
+               else    /* error in page data */
+                       __change_bit(errpos[i], (unsigned long *)buf);
+       }
+
+       printf("%d error(s) corrected at offset %08x\n",
+              numerrs, page * DOCG4_PAGE_SIZE);
+
+       return numerrs;
+}
+
+static int read_progstatus(struct docg4_priv *doc, void __iomem *docptr)
+{
+       /*
+        * This apparently checks the status of programming.  Done after an
+        * erasure, and after page data is written.  On error, the status is
+        * saved, to be later retrieved by the nand infrastructure code.
+        */
+
+       /* status is read from the I/O reg */
+       uint16_t status1 = readw(docptr + DOC_IOSPACE_DATA);
+       uint16_t status2 = readw(docptr + DOC_IOSPACE_DATA);
+       uint16_t status3 = readw(docptr + DOCG4_MYSTERY_REG);
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "docg4: %s: %02x %02x %02x\n",
+           __func__, status1, status2, status3);
+
+       if (status1 != DOCG4_PROGSTATUS_GOOD ||
+           status2 != DOCG4_PROGSTATUS_GOOD_2 ||
+           status3 != DOCG4_PROGSTATUS_GOOD_2) {
+               doc->status = NAND_STATUS_FAIL;
+               printf("read_progstatus failed: %02x, %02x, %02x\n",
+                      status1, status2, status3);
+               return -EIO;
+       }
+       return 0;
+}
+
+static int pageprog(struct mtd_info *mtd)
+{
+       /*
+        * Final step in writing a page.  Writes the contents of its
+        * internal buffer out to the flash array, or some such.
+        */
+
+       struct nand_chip *nand = mtd->priv;
+       struct docg4_priv *doc = nand->priv;
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       int retval = 0;
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "docg4: %s\n", __func__);
+
+       writew(DOCG4_SEQ_PAGEPROG, docptr + DOC_FLASHSEQUENCE);
+       writew(DOC_CMD_PROG_CYCLE2, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /* Just busy-wait; usleep_range() slows things down noticeably. */
+       poll_status(docptr);
+
+       writew(DOCG4_SEQ_FLUSH, docptr + DOC_FLASHSEQUENCE);
+       writew(DOCG4_CMD_FLUSH, docptr + DOC_FLASHCOMMAND);
+       writew(DOC_ECCCONF0_READ_MODE | 4, docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       retval = read_progstatus(doc, docptr);
+       writew(0, docptr + DOC_DATAEND);
+       write_nop(docptr);
+       poll_status(docptr);
+       write_nop(docptr);
+
+       return retval;
+}
+
+static void sequence_reset(void __iomem *docptr)
+{
+       /* common starting sequence for all operations */
+
+       writew(DOC_CTRL_UNKNOWN | DOC_CTRL_CE, docptr + DOC_FLASHCONTROL);
+       writew(DOC_SEQ_RESET, docptr + DOC_FLASHSEQUENCE);
+       writew(DOC_CMD_RESET, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+       poll_status(docptr);
+       write_nop(docptr);
+}
+
+static void read_page_prologue(void __iomem *docptr, uint32_t docg4_addr)
+{
+       /* first step in reading a page */
+
+       sequence_reset(docptr);
+
+       writew(DOCG4_SEQ_PAGE_READ, docptr + DOC_FLASHSEQUENCE);
+       writew(DOCG4_CMD_PAGE_READ, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+
+       write_addr(docptr, docg4_addr);
+
+       write_nop(docptr);
+       writew(DOCG4_CMD_READ2, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       poll_status(docptr);
+}
+
+static void write_page_prologue(void __iomem *docptr, uint32_t docg4_addr)
+{
+       /* first step in writing a page */
+
+       sequence_reset(docptr);
+       writew(DOCG4_SEQ_PAGEWRITE, docptr + DOC_FLASHSEQUENCE);
+       writew(DOCG4_CMD_PAGEWRITE, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_addr(docptr, docg4_addr);
+       write_nop(docptr);
+       write_nop(docptr);
+       poll_status(docptr);
+}
+
+static uint32_t mtd_to_docg4_address(int page, int column)
+{
+       /*
+        * Convert mtd address to format used by the device, 32 bit packed.
+        *
+        * Some notes on G4 addressing... The M-Sys documentation on this device
+        * claims that pages are 2K in length, and indeed, the format of the
+        * address used by the device reflects that.  But within each page are
+        * four 512 byte "sub-pages", each with its own oob data that is
+        * read/written immediately after the 512 bytes of page data.  This oob
+        * data contains the ecc bytes for the preceeding 512 bytes.
+        *
+        * Rather than tell the mtd nand infrastructure that page size is 2k,
+        * with four sub-pages each, we engage in a little subterfuge and tell
+        * the infrastructure code that pages are 512 bytes in size.  This is
+        * done because during the course of reverse-engineering the device, I
+        * never observed an instance where an entire 2K "page" was read or
+        * written as a unit.  Each "sub-page" is always addressed individually,
+        * its data read/written, and ecc handled before the next "sub-page" is
+        * addressed.
+        *
+        * This requires us to convert addresses passed by the mtd nand
+        * infrastructure code to those used by the device.
+        *
+        * The address that is written to the device consists of four bytes: the
+        * first two are the 2k page number, and the second is the index into
+        * the page.  The index is in terms of 16-bit half-words and includes
+        * the preceeding oob data, so e.g., the index into the second
+        * "sub-page" is 0x108, and the full device address of the start of mtd
+        * page 0x201 is 0x00800108.
+        */
+       int g4_page = page / 4;                       /* device's 2K page */
+       int g4_index = (page % 4) * 0x108 + column/2; /* offset into page */
+       return (g4_page << 16) | g4_index;            /* pack */
+}
+
+static void docg4_command(struct mtd_info *mtd, unsigned command, int column,
+                         int page_addr)
+{
+       /* handle standard nand commands */
+
+       struct nand_chip *nand = mtd->priv;
+       struct docg4_priv *doc = nand->priv;
+       uint32_t g4_addr = mtd_to_docg4_address(page_addr, column);
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s %x, page_addr=%x, column=%x\n",
+           __func__, command, page_addr, column);
+
+       /*
+        * Save the command and its arguments.  This enables emulation of
+        * standard flash devices, and also some optimizations.
+        */
+       doc->last_command.command = command;
+       doc->last_command.column = column;
+       doc->last_command.page = page_addr;
+
+       switch (command) {
+       case NAND_CMD_RESET:
+               reset(CONFIG_SYS_NAND_BASE);
+               break;
+
+       case NAND_CMD_READ0:
+               read_page_prologue(CONFIG_SYS_NAND_BASE, g4_addr);
+               break;
+
+       case NAND_CMD_STATUS:
+               /* next call to read_byte() will expect a status */
+               break;
+
+       case NAND_CMD_SEQIN:
+               write_page_prologue(CONFIG_SYS_NAND_BASE, g4_addr);
+
+               /* hack for deferred write of oob bytes */
+               if (doc->oob_page == page_addr)
+                       memcpy(nand->oob_poi, doc->oob_buf, 16);
+               break;
+
+       case NAND_CMD_PAGEPROG:
+               pageprog(mtd);
+               break;
+
+       /* we don't expect these, based on review of nand_base.c */
+       case NAND_CMD_READOOB:
+       case NAND_CMD_READID:
+       case NAND_CMD_ERASE1:
+       case NAND_CMD_ERASE2:
+               printf("docg4_command: unexpected nand command 0x%x\n",
+                      command);
+               break;
+       }
+}
+
+static void docg4_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       int i;
+       struct nand_chip *nand = mtd->priv;
+       uint16_t *p = (uint16_t *)buf;
+       len >>= 1;
+
+       for (i = 0; i < len; i++)
+               p[i] = readw(nand->IO_ADDR_R);
+}
+
+static int docg4_read_oob(struct mtd_info *mtd, struct nand_chip *nand,
+                         int page, int sndcmd)
+{
+       struct docg4_priv *doc = nand->priv;
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       uint16_t status;
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: page %x\n", __func__, page);
+
+       /*
+        * Oob bytes are read as part of a normal page read.  If the previous
+        * nand command was a read of the page whose oob is now being read, just
+        * copy the oob bytes that we saved in a local buffer and avoid a
+        * separate oob read.
+        */
+       if (doc->last_command.command == NAND_CMD_READ0 &&
+           doc->last_command.page == page) {
+               memcpy(nand->oob_poi, doc->oob_buf, 16);
+               return 0;
+       }
+
+       /*
+        * Separate read of oob data only.
+        */
+       docg4_command(mtd, NAND_CMD_READ0, nand->ecc.size, page);
+
+       writew(DOC_ECCCONF0_READ_MODE | DOCG4_OOB_SIZE, docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /* the 1st byte from the I/O reg is a status; the rest is oob data */
+       status = readw(docptr + DOC_IOSPACE_DATA);
+       if (status & DOCG4_READ_ERROR) {
+               printf("docg4_read_oob failed: status = 0x%02x\n", status);
+               return -EIO;
+       }
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: status = 0x%x\n", __func__, status);
+
+       docg4_read_buf(mtd, nand->oob_poi, 16);
+
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       writew(0, docptr + DOC_DATAEND);
+       write_nop(docptr);
+
+       return 0;
+}
+
+static int docg4_write_oob(struct mtd_info *mtd, struct nand_chip *nand,
+                          int page)
+{
+       /*
+        * Writing oob-only is not really supported, because MLC nand must write
+        * oob bytes at the same time as page data.  Nonetheless, we save the
+        * oob buffer contents here, and then write it along with the page data
+        * if the same page is subsequently written.  This allows user space
+        * utilities that write the oob data prior to the page data to work
+        * (e.g., nandwrite).  The disdvantage is that, if the intention was to
+        * write oob only, the operation is quietly ignored.  Also, oob can get
+        * corrupted if two concurrent processes are running nandwrite.
+        */
+
+       /* note that bytes 7..14 are hw generated hamming/ecc and overwritten */
+       struct docg4_priv *doc = nand->priv;
+       doc->oob_page = page;
+       memcpy(doc->oob_buf, nand->oob_poi, 16);
+       return 0;
+}
+
+static int docg4_block_neverbad(struct mtd_info *mtd, loff_t ofs, int getchip)
+{
+       /* only called when module_param ignore_badblocks is set */
+       return 0;
+}
+
+static void docg4_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
+{
+       int i;
+       struct nand_chip *nand = mtd->priv;
+       uint16_t *p = (uint16_t *)buf;
+       len >>= 1;
+
+       for (i = 0; i < len; i++)
+               writew(p[i], nand->IO_ADDR_W);
+}
+
+static void write_page(struct mtd_info *mtd, struct nand_chip *nand,
+                      const uint8_t *buf, int use_ecc)
+{
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       uint8_t ecc_buf[8];
+
+       writew(DOC_ECCCONF0_ECC_ENABLE |
+              DOC_ECCCONF0_UNKNOWN |
+              DOCG4_BCH_SIZE,
+              docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+
+       /* write the page data */
+       docg4_write_buf16(mtd, buf, DOCG4_PAGE_SIZE);
+
+       /* oob bytes 0 through 5 are written to I/O reg */
+       docg4_write_buf16(mtd, nand->oob_poi, 6);
+
+       /* oob byte 6 written to a separate reg */
+       writew(nand->oob_poi[6], docptr + DOCG4_OOB_6_7);
+
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /* write hw-generated ecc bytes to oob */
+       if (likely(use_ecc)) {
+               /* oob byte 7 is hamming code */
+               uint8_t hamming = readb(docptr + DOC_HAMMINGPARITY);
+               hamming = readb(docptr + DOC_HAMMINGPARITY); /* 2nd read */
+               writew(hamming, docptr + DOCG4_OOB_6_7);
+               write_nop(docptr);
+
+               /* read the 7 bch bytes from ecc regs */
+               read_hw_ecc(docptr, ecc_buf);
+               ecc_buf[7] = 0;         /* clear the "page written" flag */
+       }
+
+       /* write user-supplied bytes to oob */
+       else {
+               writew(nand->oob_poi[7], docptr + DOCG4_OOB_6_7);
+               write_nop(docptr);
+               memcpy(ecc_buf, &nand->oob_poi[8], 8);
+       }
+
+       docg4_write_buf16(mtd, ecc_buf, 8);
+       write_nop(docptr);
+       write_nop(docptr);
+       writew(0, docptr + DOC_DATAEND);
+       write_nop(docptr);
+}
+
+static void docg4_write_page_raw(struct mtd_info *mtd, struct nand_chip *nand,
+                                const uint8_t *buf)
+{
+       return write_page(mtd, nand, buf, 0);
+}
+
+static void docg4_write_page(struct mtd_info *mtd, struct nand_chip *nand,
+                            const uint8_t *buf)
+{
+       return write_page(mtd, nand, buf, 1);
+}
+
+static int read_page(struct mtd_info *mtd, struct nand_chip *nand,
+                    uint8_t *buf, int page, int use_ecc)
+{
+       struct docg4_priv *doc = nand->priv;
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       uint16_t status, edc_err, *buf16;
+
+       writew(DOC_ECCCONF0_READ_MODE |
+              DOC_ECCCONF0_ECC_ENABLE |
+              DOC_ECCCONF0_UNKNOWN |
+              DOCG4_BCH_SIZE,
+              docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /* the 1st byte from the I/O reg is a status; the rest is page data */
+       status = readw(docptr + DOC_IOSPACE_DATA);
+       if (status & DOCG4_READ_ERROR) {
+               printf("docg4_read_page: bad status: 0x%02x\n", status);
+               writew(0, docptr + DOC_DATAEND);
+               return -EIO;
+       }
+
+       docg4_read_buf(mtd, buf, DOCG4_PAGE_SIZE); /* read the page data */
+
+       /* first 14 oob bytes read from I/O reg */
+       docg4_read_buf(mtd, nand->oob_poi, 14);
+
+       /* last 2 read from another reg */
+       buf16 = (uint16_t *)(nand->oob_poi + 14);
+       *buf16 = readw(docptr + DOCG4_MYSTERY_REG);
+
+       /*
+        * Diskonchips read oob immediately after a page read.  Mtd
+        * infrastructure issues a separate command for reading oob after the
+        * page is read.  So we save the oob bytes in a local buffer and just
+        * copy it if the next command reads oob from the same page.
+        */
+       memcpy(doc->oob_buf, nand->oob_poi, 16);
+
+       write_nop(docptr);
+
+       if (likely(use_ecc)) {
+               /* read the register that tells us if bitflip(s) detected  */
+               edc_err = readw(docptr + DOC_ECCCONF1);
+               edc_err = readw(docptr + DOC_ECCCONF1);
+
+               /* If bitflips are reported, attempt to correct with ecc */
+               if (edc_err & DOC_ECCCONF1_BCH_SYNDROM_ERR) {
+                       int bits_corrected = correct_data(mtd, buf, page);
+                       if (bits_corrected == -EBADMSG)
+                               mtd->ecc_stats.failed++;
+                       else
+                               mtd->ecc_stats.corrected += bits_corrected;
+               }
+       }
+
+       writew(0, docptr + DOC_DATAEND);
+       return 0;
+}
+
+
+static int docg4_read_page_raw(struct mtd_info *mtd, struct nand_chip *nand,
+                              uint8_t *buf, int page)
+{
+       return read_page(mtd, nand, buf, page, 0);
+}
+
+static int docg4_read_page(struct mtd_info *mtd, struct nand_chip *nand,
+                          uint8_t *buf, int page)
+{
+       return read_page(mtd, nand, buf, page, 1);
+}
+
+static void docg4_erase_block(struct mtd_info *mtd, int page)
+{
+       struct nand_chip *nand = mtd->priv;
+       struct docg4_priv *doc = nand->priv;
+       void __iomem *docptr = CONFIG_SYS_NAND_BASE;
+       uint16_t g4_page;
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: page %04x\n", __func__, page);
+
+       sequence_reset(docptr);
+
+       writew(DOCG4_SEQ_BLOCKERASE, docptr + DOC_FLASHSEQUENCE);
+       writew(DOC_CMD_PROG_BLOCK_ADDR, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+
+       /* only 2 bytes of address are written to specify erase block */
+       g4_page = (uint16_t)(page / 4);  /* to g4's 2k page addressing */
+       writeb(g4_page & 0xff, docptr + DOC_FLASHADDRESS);
+       g4_page >>= 8;
+       writeb(g4_page & 0xff, docptr + DOC_FLASHADDRESS);
+       write_nop(docptr);
+
+       /* start the erasure */
+       writew(DOC_CMD_ERASECYCLE2, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       poll_status(docptr);
+       writew(DOCG4_SEQ_FLUSH, docptr + DOC_FLASHSEQUENCE);
+       writew(DOCG4_CMD_FLUSH, docptr + DOC_FLASHCOMMAND);
+       writew(DOC_ECCCONF0_READ_MODE | 4, docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       read_progstatus(doc, docptr);
+
+       writew(0, docptr + DOC_DATAEND);
+       write_nop(docptr);
+       poll_status(docptr);
+       write_nop(docptr);
+}
+
+static int read_factory_bbt(struct mtd_info *mtd)
+{
+       /*
+        * The device contains a read-only factory bad block table.  Read it and
+        * update the memory-based bbt accordingly.
+        */
+
+       struct nand_chip *nand = mtd->priv;
+       uint32_t g4_addr = mtd_to_docg4_address(DOCG4_FACTORY_BBT_PAGE, 0);
+       uint8_t *buf;
+       int i, block, status;
+
+       buf = kzalloc(DOCG4_PAGE_SIZE, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       read_page_prologue(CONFIG_SYS_NAND_BASE, g4_addr);
+       status = docg4_read_page(mtd, nand, buf, DOCG4_FACTORY_BBT_PAGE);
+       if (status)
+               goto exit;
+
+       /*
+        * If no memory-based bbt was created, exit.  This will happen if module
+        * parameter ignore_badblocks is set.  Then why even call this function?
+        * For an unknown reason, block erase always fails if it's the first
+        * operation after device power-up.  The above read ensures it never is.
+        * Ugly, I know.
+        */
+       if (nand->bbt == NULL)  /* no memory-based bbt */
+               goto exit;
+
+       /*
+        * Parse factory bbt and update memory-based bbt.  Factory bbt format is
+        * simple: one bit per block, block numbers increase left to right (msb
+        * to lsb).  Bit clear means bad block.
+        */
+       for (i = block = 0; block < DOCG4_NUMBLOCKS; block += 8, i++) {
+               int bitnum;
+               uint8_t mask;
+               for (bitnum = 0, mask = 0x80;
+                    bitnum < 8; bitnum++, mask >>= 1) {
+                       if (!(buf[i] & mask)) {
+                               int badblock = block + bitnum;
+                               nand->bbt[badblock / 4] |=
+                                       0x03 << ((badblock % 4) * 2);
+                               mtd->ecc_stats.badblocks++;
+                               printf("factory-marked bad block: %d\n",
+                                      badblock);
+                       }
+               }
+       }
+ exit:
+       kfree(buf);
+       return status;
+}
+
+static int docg4_block_markbad(struct mtd_info *mtd, loff_t ofs)
+{
+       /*
+        * Mark a block as bad.  Bad blocks are marked in the oob area of the
+        * first page of the block.  The default scan_bbt() in the nand
+        * infrastructure code works fine for building the memory-based bbt
+        * during initialization, as does the nand infrastructure function that
+        * checks if a block is bad by reading the bbt.  This function replaces
+        * the nand default because writes to oob-only are not supported.
+        */
+
+       int ret, i;
+       uint8_t *buf;
+       struct nand_chip *nand = mtd->priv;
+       struct nand_bbt_descr *bbtd = nand->badblock_pattern;
+       int block = (int)(ofs >> nand->bbt_erase_shift);
+       int page = (int)(ofs >> nand->page_shift);
+       uint32_t g4_addr = mtd_to_docg4_address(page, 0);
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: %08llx\n", __func__, ofs);
+
+       if (unlikely(ofs & (DOCG4_BLOCK_SIZE - 1)))
+               printf("%s: ofs %llx not start of block!\n",
+                      __func__, ofs);
+
+       /* allocate blank buffer for page data */
+       buf = kzalloc(DOCG4_PAGE_SIZE, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       /* update bbt in memory */
+       nand->bbt[block / 4] |= 0x01 << ((block & 0x03) * 2);
+
+       /* write bit-wise negation of pattern to oob buffer */
+       memset(nand->oob_poi, 0xff, mtd->oobsize);
+       for (i = 0; i < bbtd->len; i++)
+               nand->oob_poi[bbtd->offs + i] = ~bbtd->pattern[i];
+
+       /* write first page of block */
+       write_page_prologue(CONFIG_SYS_NAND_BASE, g4_addr);
+       docg4_write_page(mtd, nand, buf);
+       ret = pageprog(mtd);
+       if (!ret)
+               mtd->ecc_stats.badblocks++;
+
+       kfree(buf);
+
+       return ret;
+}
+
+static uint8_t docg4_read_byte(struct mtd_info *mtd)
+{
+       struct nand_chip *nand = mtd->priv;
+       struct docg4_priv *doc = nand->priv;
+
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s\n", __func__);
+
+       if (doc->last_command.command == NAND_CMD_STATUS) {
+               int status;
+
+               /*
+                * Previous nand command was status request, so nand
+                * infrastructure code expects to read the status here.  If an
+                * error occurred in a previous operation, report it.
+                */
+               doc->last_command.command = 0;
+
+               if (doc->status) {
+                       status = doc->status;
+                       doc->status = 0;
+               }
+
+               /* why is NAND_STATUS_WP inverse logic?? */
+               else
+                       status = NAND_STATUS_WP | NAND_STATUS_READY;
+
+               return status;
+       }
+
+       printf("unexpectd call to read_byte()\n");
+
+       return 0;
+}
+
+static int docg4_wait(struct mtd_info *mtd, struct nand_chip *nand)
+{
+       struct docg4_priv *doc = nand->priv;
+       int status = NAND_STATUS_WP;       /* inverse logic?? */
+       MTDDEBUG(MTD_DEBUG_LEVEL3, "%s...\n", __func__);
+
+       /* report any previously unreported error */
+       if (doc->status) {
+               status |= doc->status;
+               doc->status = 0;
+               return status;
+       }
+
+       status |= poll_status(CONFIG_SYS_NAND_BASE);
+       return status;
+}
+
+int docg4_nand_init(struct mtd_info *mtd, struct nand_chip *nand, int devnum)
+{
+       uint16_t id1, id2;
+       struct docg4_priv *docg4;
+       int retval;
+
+       docg4 = kzalloc(sizeof(*docg4), GFP_KERNEL);
+       if (!docg4)
+               return -1;
+
+       mtd->priv = nand;
+       nand->priv = docg4;
+
+       /* These must be initialized here because the docg4 is non-standard
+        * and doesn't produce an id that the nand code can use to look up
+        * these values (nand_scan_ident() not called).
+        */
+       mtd->size = DOCG4_CHIP_SIZE;
+       mtd->name = "Msys_Diskonchip_G4";
+       mtd->writesize = DOCG4_PAGE_SIZE;
+       mtd->erasesize = DOCG4_BLOCK_SIZE;
+       mtd->oobsize = DOCG4_OOB_SIZE;
+
+       nand->IO_ADDR_R =
+               (void __iomem *)CONFIG_SYS_NAND_BASE + DOC_IOSPACE_DATA;
+       nand->IO_ADDR_W = nand->IO_ADDR_R;
+       nand->chipsize = DOCG4_CHIP_SIZE;
+       nand->chip_shift = DOCG4_CHIP_SHIFT;
+       nand->bbt_erase_shift = DOCG4_ERASE_SHIFT;
+       nand->phys_erase_shift = DOCG4_ERASE_SHIFT;
+       nand->chip_delay = 20;
+       nand->page_shift = DOCG4_PAGE_SHIFT;
+       nand->pagemask = 0x3ffff;
+       nand->badblockpos = NAND_LARGE_BADBLOCK_POS;
+       nand->badblockbits = 8;
+       nand->ecc.layout = &docg4_oobinfo;
+       nand->ecc.mode = NAND_ECC_HW_SYNDROME;
+       nand->ecc.size = DOCG4_PAGE_SIZE;
+       nand->ecc.prepad = 8;
+       nand->ecc.bytes = 8;
+       nand->options =
+               NAND_BUSWIDTH_16 | NAND_NO_SUBPAGE_WRITE | NAND_NO_AUTOINCR;
+       nand->controller = &nand->hwcontrol;
+
+       /* methods */
+       nand->cmdfunc = docg4_command;
+       nand->waitfunc = docg4_wait;
+       nand->select_chip = docg4_select_chip;
+       nand->read_byte = docg4_read_byte;
+       nand->block_markbad = docg4_block_markbad;
+       nand->read_buf = docg4_read_buf;
+       nand->write_buf = docg4_write_buf16;
+       nand->scan_bbt = nand_default_bbt;
+       nand->erase_cmd = docg4_erase_block;
+       nand->ecc.read_page = docg4_read_page;
+       nand->ecc.write_page = docg4_write_page;
+       nand->ecc.read_page_raw = docg4_read_page_raw;
+       nand->ecc.write_page_raw = docg4_write_page_raw;
+       nand->ecc.read_oob = docg4_read_oob;
+       nand->ecc.write_oob = docg4_write_oob;
+
+       /*
+        * The way the nand infrastructure code is written, a memory-based bbt
+        * is not created if NAND_SKIP_BBTSCAN is set.  With no memory bbt,
+        * nand->block_bad() is used.  So when ignoring bad blocks, we skip the
+        * scan and define a dummy block_bad() which always returns 0.
+        */
+       if (ignore_badblocks) {
+               nand->options |= NAND_SKIP_BBTSCAN;
+               nand->block_bad = docg4_block_neverbad;
+       }
+
+       reset(CONFIG_SYS_NAND_BASE);
+
+       /* check for presence of g4 chip by reading id registers */
+       id1 = readw(CONFIG_SYS_NAND_BASE + DOC_CHIPID);
+       id1 = readw(CONFIG_SYS_NAND_BASE + DOCG4_MYSTERY_REG);
+       id2 = readw(CONFIG_SYS_NAND_BASE + DOC_CHIPID_INV);
+       id2 = readw(CONFIG_SYS_NAND_BASE + DOCG4_MYSTERY_REG);
+       if (id1 != DOCG4_IDREG1_VALUE || id2 != DOCG4_IDREG2_VALUE)
+               return -1;
+
+       /* initialize bch algorithm */
+       docg4->bch = init_bch(DOCG4_M, DOCG4_T, DOCG4_PRIMITIVE_POLY);
+       if (docg4->bch == NULL)
+               return -1;
+
+       retval = nand_scan_tail(mtd);
+       if (retval)
+               return -1;
+
+       /*
+        * Scan for bad blocks and create bbt here, then add the factory-marked
+        * bad blocks to the bbt.
+        */
+       nand->scan_bbt(mtd);
+       nand->options |= NAND_BBT_SCANNED;
+       retval = read_factory_bbt(mtd);
+       if (retval)
+               return -1;
+
+       retval = nand_register(devnum);
+       if (retval)
+               return -1;
+
+       return 0;
+}
diff --git a/drivers/mtd/nand/docg4_spl.c b/drivers/mtd/nand/docg4_spl.c
new file mode 100644 (file)
index 0000000..95e856c
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * SPL driver for Diskonchip G4 nand flash
+ *
+ * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ *
+ * This driver basically mimics the load functionality of a typical IPL (initial
+ * program loader) resident in the 2k NOR-like region of the docg4 that is
+ * mapped to the reset vector.  It allows the u-boot SPL to continue loading if
+ * the IPL loads a fixed number of flash blocks that is insufficient to contain
+ * the entire u-boot image.  In this case, a concatenated spl + u-boot image is
+ * written at the flash offset from which the IPL loads an image, and when the
+ * IPL jumps to the SPL, the SPL resumes loading where the IPL left off.  See
+ * the palmtreo680 for an example.
+ *
+ * This driver assumes that the data was written to the flash using the device's
+ * "reliable" mode, and also assumes that each 512 byte page is stored
+ * redundantly in the subsequent page.  This storage format is likely to be used
+ * by all boards that boot from the docg4.  The format compensates for the lack
+ * of ecc in the IPL.
+ *
+ * Reliable mode reduces the capacity of a block by half, and the redundant
+ * pages reduce it by half again.  As a result, the normal 256k capacity of a
+ * block is reduced to 64k for the purposes of the IPL/SPL.
+ */
+
+#include <asm/io.h>
+#include <linux/mtd/docg4.h>
+
+/* forward declarations */
+static inline void write_nop(void __iomem *docptr);
+static int poll_status(void __iomem *docptr);
+static void write_addr(void __iomem *docptr, uint32_t docg4_addr);
+static void address_sequence(unsigned int g4_page, unsigned int g4_index,
+                            void __iomem *docptr);
+static int docg4_load_block_reliable(uint32_t flash_offset, void *dest_addr);
+
+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
+{
+       void *load_addr = dst;
+       uint32_t flash_offset = offs;
+       const unsigned int block_count =
+               (size + DOCG4_BLOCK_CAPACITY_SPL - 1)
+               / DOCG4_BLOCK_CAPACITY_SPL;
+       int i;
+
+       for (i = 0; i < block_count; i++) {
+               int ret = docg4_load_block_reliable(flash_offset, load_addr);
+               if (ret)
+                       return ret;
+               load_addr += DOCG4_BLOCK_CAPACITY_SPL;
+               flash_offset += DOCG4_BLOCK_SIZE;
+       }
+       return 0;
+}
+
+static inline void write_nop(void __iomem *docptr)
+{
+       writew(0, docptr + DOC_NOP);
+}
+
+static int poll_status(void __iomem *docptr)
+{
+       /*
+        * Busy-wait for the FLASHREADY bit to be set in the FLASHCONTROL
+        * register.  Operations known to take a long time (e.g., block erase)
+        * should sleep for a while before calling this.
+        */
+
+       uint8_t flash_status;
+
+       /* hardware quirk requires reading twice initially */
+       flash_status = readb(docptr + DOC_FLASHCONTROL);
+
+       do {
+               flash_status = readb(docptr + DOC_FLASHCONTROL);
+       } while (!(flash_status & DOC_CTRL_FLASHREADY));
+
+       return 0;
+}
+
+static void write_addr(void __iomem *docptr, uint32_t docg4_addr)
+{
+       /* write the four address bytes packed in docg4_addr to the device */
+
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+       docg4_addr >>= 8;
+       writeb(docg4_addr & 0xff, docptr + DOC_FLASHADDRESS);
+}
+
+static void address_sequence(unsigned int g4_page, unsigned int g4_index,
+                            void __iomem *docptr)
+{
+       writew(DOCG4_SEQ_PAGE_READ, docptr + DOC_FLASHSEQUENCE);
+       writew(DOCG4_CMD_PAGE_READ, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_addr(docptr, ((uint32_t)g4_page << 16) | g4_index);
+       write_nop(docptr);
+}
+
+static int docg4_load_block_reliable(uint32_t flash_offset, void *dest_addr)
+{
+       void __iomem *docptr = (void *)CONFIG_SYS_NAND_BASE;
+       unsigned int g4_page = flash_offset >> 11; /* 2k page */
+       const unsigned int last_g4_page = g4_page + 0x80; /* last in block */
+       int g4_index = 0;
+       uint16_t flash_status;
+       uint16_t *buf;
+       uint16_t discard, magic_high, magic_low;
+
+       /* flash_offset must be aligned to the start of a block */
+       if (flash_offset & 0x3ffff)
+               return -1;
+
+       writew(DOC_SEQ_RESET, docptr + DOC_FLASHSEQUENCE);
+       writew(DOC_CMD_RESET, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+       poll_status(docptr);
+       write_nop(docptr);
+       writew(0x45, docptr + DOC_FLASHSEQUENCE);
+       writew(0xa3, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       writew(0x22, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+
+       /* read 1st 4 oob bytes of first subpage of block */
+       address_sequence(g4_page, 0x0100, docptr); /* index at oob */
+       write_nop(docptr);
+       flash_status = readw(docptr + DOC_FLASHCONTROL);
+       flash_status = readw(docptr + DOC_FLASHCONTROL);
+       if (flash_status & 0x06) /* sequence or protection errors */
+               return -1;
+       writew(DOCG4_CMD_READ2, docptr + DOC_FLASHCOMMAND);
+       write_nop(docptr);
+       write_nop(docptr);
+       poll_status(docptr);
+       writew(DOC_ECCCONF0_READ_MODE | 4, docptr + DOC_ECCCONF0);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /*
+        * Here we read the first four oob bytes of the first page of the block.
+        * The IPL on the palmtreo680 requires that this contain a 32 bit magic
+        * number, or the load aborts.  We'll ignore it.
+        */
+       discard = readw(docptr + 0x103c); /* hw quirk; 1st read discarded */
+       magic_low = readw(docptr + 0x103c);
+       magic_high = readw(docptr + DOCG4_MYSTERY_REG);
+       writew(0, docptr + DOC_DATAEND);
+       write_nop(docptr);
+       write_nop(docptr);
+
+       /* load contents of block to memory */
+       buf = (uint16_t *)dest_addr;
+       do {
+               int i;
+
+               address_sequence(g4_page, g4_index, docptr);
+               writew(DOCG4_CMD_READ2,
+                      docptr + DOC_FLASHCOMMAND);
+               write_nop(docptr);
+               write_nop(docptr);
+               poll_status(docptr);
+               writew(DOC_ECCCONF0_READ_MODE |
+                      DOC_ECCCONF0_ECC_ENABLE |
+                      DOCG4_BCH_SIZE,
+                      docptr + DOC_ECCCONF0);
+               write_nop(docptr);
+               write_nop(docptr);
+               write_nop(docptr);
+               write_nop(docptr);
+               write_nop(docptr);
+
+               /* read the 512 bytes of page data, 2 bytes at a time */
+               discard = readw(docptr + 0x103c);
+               for (i = 0; i < 256; i++)
+                       *buf++ = readw(docptr + 0x103c);
+
+               /* read oob, but discard it */
+               for (i = 0; i < 7; i++)
+                       discard = readw(docptr + 0x103c);
+               discard = readw(docptr + DOCG4_OOB_6_7);
+               discard = readw(docptr + DOCG4_OOB_6_7);
+
+               writew(0, docptr + DOC_DATAEND);
+               write_nop(docptr);
+               write_nop(docptr);
+
+               if (!(g4_index & 0x100)) {
+                       /* not redundant subpage read; check for ecc error */
+                       write_nop(docptr);
+                       flash_status = readw(docptr + DOC_ECCCONF1);
+                       flash_status = readw(docptr + DOC_ECCCONF1);
+                       if (flash_status & 0x80) { /* ecc error */
+                               g4_index += 0x108; /* read redundant subpage */
+                               buf -= 256;        /* back up ram ptr */
+                               continue;
+                       } else                       /* no ecc error */
+                               g4_index += 0x210; /* skip redundant subpage */
+               } else  /* redundant page was just read; skip ecc error check */
+                       g4_index += 0x108;
+
+               if (g4_index == 0x420) { /* finished with 2k page */
+                       g4_index = 0;
+                       g4_page += 2; /* odd-numbered 2k pages skipped */
+               }
+
+       } while (g4_page != last_g4_page); /* while still on same block */
+
+       return 0;
+}
index 834a8a64983f35d01abdb1383cd928fbb155b6ff..0fa776ae91947541cfde27385b5b852403512122 100644 (file)
@@ -640,9 +640,8 @@ static int fsl_elbc_wait(struct mtd_info *mtd, struct nand_chip *chip)
        return fsl_elbc_read_byte(mtd);
 }
 
-static int fsl_elbc_read_page(struct mtd_info *mtd,
-                             struct nand_chip *chip,
-                             uint8_t *buf, int page)
+static int fsl_elbc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
+                             uint8_t *buf, int oob_required, int page)
 {
        fsl_elbc_read_buf(mtd, buf, mtd->writesize);
        fsl_elbc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
@@ -656,12 +655,13 @@ static int fsl_elbc_read_page(struct mtd_info *mtd,
 /* ECC will be calculated automatically, and errors will be detected in
  * waitfunc.
  */
-static void fsl_elbc_write_page(struct mtd_info *mtd,
-                               struct nand_chip *chip,
-                               const uint8_t *buf)
+static int fsl_elbc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
+                               const uint8_t *buf, int oob_required)
 {
        fsl_elbc_write_buf(mtd, buf, mtd->writesize);
        fsl_elbc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+       return 0;
 }
 
 static struct fsl_elbc_ctrl *elbc_ctrl;
@@ -747,8 +747,8 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
        nand->bbt_md = &bbt_mirror_descr;
 
        /* set up nand options */
-       nand->options = NAND_NO_READRDY | NAND_NO_AUTOINCR |
-                       NAND_USE_FLASH_BBT | NAND_NO_SUBPAGE_WRITE;
+       nand->options = NAND_NO_SUBPAGE_WRITE;
+       nand->bbt_options = NAND_BBT_USE_FLASH;
 
        nand->controller = &elbc_ctrl->controller;
        nand->priv = priv;
@@ -756,20 +756,8 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
        nand->ecc.read_page = fsl_elbc_read_page;
        nand->ecc.write_page = fsl_elbc_write_page;
 
-#ifdef CONFIG_FSL_ELBC_FMR
-       priv->fmr = CONFIG_FSL_ELBC_FMR;
-#else
        priv->fmr = (15 << FMR_CWTO_SHIFT) | (2 << FMR_AL_SHIFT);
 
-       /*
-        * Hardware expects small page has ECCM0, large page has ECCM1
-        * when booting from NAND.  Board config can override if not
-        * booting from NAND.
-        */
-       if (or & OR_FCM_PGS)
-               priv->fmr |= FMR_ECCM;
-#endif
-
        /* If CS Base Register selects full hardware ECC then use it */
        if ((br & BR_DECC) == BR_DECC_CHK_GEN) {
                nand->ecc.mode = NAND_ECC_HW;
@@ -781,16 +769,32 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
                nand->ecc.size = 512;
                nand->ecc.bytes = 3;
                nand->ecc.steps = 1;
+               nand->ecc.strength = 1;
        } else {
                /* otherwise fall back to default software ECC */
                nand->ecc.mode = NAND_ECC_SOFT;
        }
 
+       ret = nand_scan_ident(mtd, 1, NULL);
+       if (ret)
+               return ret;
+
        /* Large-page-specific setup */
-       if (or & OR_FCM_PGS) {
+       if (mtd->writesize == 2048) {
+               setbits_be32(&elbc_ctrl->regs->bank[priv->bank].or,
+                            OR_FCM_PGS);
+               in_be32(&elbc_ctrl->regs->bank[priv->bank].or);
+
                priv->page_size = 1;
                nand->badblock_pattern = &largepage_memorybased;
 
+               /*
+                * Hardware expects small page has ECCM0, large page has
+                * ECCM1 when booting from NAND, and we follow that even
+                * when not booting from NAND.
+                */
+               priv->fmr |= FMR_ECCM;
+
                /* adjust ecc setup if needed */
                if ((br & BR_DECC) == BR_DECC_CHK_GEN) {
                        nand->ecc.steps = 4;
@@ -798,12 +802,14 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
                                           &fsl_elbc_oob_lp_eccm1 :
                                           &fsl_elbc_oob_lp_eccm0;
                }
+       } else if (mtd->writesize == 512) {
+               clrbits_be32(&elbc_ctrl->regs->bank[priv->bank].or,
+                            OR_FCM_PGS);
+               in_be32(&elbc_ctrl->regs->bank[priv->bank].or);
+       } else {
+               return -ENODEV;
        }
 
-       ret = nand_scan_ident(mtd, 1, NULL);
-       if (ret)
-               return ret;
-
        ret = nand_scan_tail(mtd);
        if (ret)
                return ret;
index b13d8a9303a9bea0410c0d9e039926366d5ab7c4..439822c5a24563cce7fa9bc1fee54436f1a30d88 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <common.h>
 #include <malloc.h>
+#include <nand.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
@@ -41,7 +42,6 @@ struct fsl_ifc_ctrl;
 
 /* mtd information per set */
 struct fsl_ifc_mtd {
-       struct mtd_info mtd;
        struct nand_chip chip;
        struct fsl_ifc_ctrl *ctrl;
 
@@ -686,9 +686,8 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
        return nand_fsr;
 }
 
-static int fsl_ifc_read_page(struct mtd_info *mtd,
-                             struct nand_chip *chip,
-                             uint8_t *buf, int page)
+static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
+                            uint8_t *buf, int oob_required, int page)
 {
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
@@ -705,12 +704,13 @@ static int fsl_ifc_read_page(struct mtd_info *mtd,
 /* ECC will be calculated automatically, and errors will be detected in
  * waitfunc.
  */
-static void fsl_ifc_write_page(struct mtd_info *mtd,
-                               struct nand_chip *chip,
-                               const uint8_t *buf)
+static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
+                              const uint8_t *buf, int oob_required)
 {
        fsl_ifc_write_buf(mtd, buf, mtd->writesize);
        fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+       return 0;
 }
 
 static void fsl_ifc_ctrl_init(void)
@@ -794,11 +794,14 @@ static void fsl_ifc_sram_init(void)
        out_be32(&ifc_ctrl->regs->csor_cs[cs].csor_ext, csor_ext);
 }
 
-int board_nand_init(struct nand_chip *nand)
+static int fsl_ifc_chip_init(int devnum, u8 *addr)
 {
+       struct mtd_info *mtd = &nand_info[devnum];
+       struct nand_chip *nand;
        struct fsl_ifc_mtd *priv;
        struct nand_ecclayout *layout;
        uint32_t cspr = 0, csor = 0, ver = 0;
+       int ret;
 
        if (!ifc_ctrl) {
                fsl_ifc_ctrl_init();
@@ -811,18 +814,18 @@ int board_nand_init(struct nand_chip *nand)
                return -ENOMEM;
 
        priv->ctrl = ifc_ctrl;
-       priv->vbase = nand->IO_ADDR_R;
+       priv->vbase = addr;
 
        /* Find which chip select it is connected to.
         */
        for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
-               phys_addr_t base_addr = virt_to_phys(nand->IO_ADDR_R);
+               phys_addr_t phys_addr = virt_to_phys(addr);
 
                cspr = in_be32(&ifc_ctrl->regs->cspr_cs[priv->bank].cspr);
                csor = in_be32(&ifc_ctrl->regs->csor_cs[priv->bank].csor);
 
                if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
-                   (cspr & CSPR_BA) == CSPR_PHYS_ADDR(base_addr)) {
+                   (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr)) {
                        ifc_ctrl->cs_nand = priv->bank << IFC_NAND_CSEL_SHIFT;
                        break;
                }
@@ -835,6 +838,9 @@ int board_nand_init(struct nand_chip *nand)
                return -ENODEV;
        }
 
+       nand = &priv->chip;
+       mtd->priv = nand;
+
        ifc_ctrl->chips[priv->bank] = priv;
 
        /* fill in nand_chip structure */
@@ -852,8 +858,8 @@ int board_nand_init(struct nand_chip *nand)
        nand->bbt_md = &bbt_mirror_descr;
 
        /* set up nand options */
-       nand->options = NAND_NO_READRDY | NAND_NO_AUTOINCR |
-                       NAND_USE_FLASH_BBT | NAND_NO_SUBPAGE_WRITE;
+       nand->options = NAND_NO_SUBPAGE_WRITE;
+       nand->bbt_options = NAND_BBT_USE_FLASH;
 
        if (cspr & CSPR_PORT_SIZE_16) {
                nand->read_byte = fsl_ifc_read_byte16;
@@ -884,11 +890,13 @@ int board_nand_init(struct nand_chip *nand)
                        bbt_mirror_descr.offs = 0;
                }
 
+               nand->ecc.strength = 4;
                priv->bufnum_mask = 15;
                break;
 
        case CSOR_NAND_PGS_2K:
                layout = &oob_2048_ecc4;
+               nand->ecc.strength = 4;
                priv->bufnum_mask = 3;
                break;
 
@@ -896,8 +904,10 @@ int board_nand_init(struct nand_chip *nand)
                if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
                    CSOR_NAND_ECC_MODE_4) {
                        layout = &oob_4096_ecc4;
+                       nand->ecc.strength = 4;
                } else {
                        layout = &oob_4096_ecc8;
+                       nand->ecc.strength = 8;
                        nand->ecc.bytes = 16;
                }
 
@@ -921,5 +931,31 @@ int board_nand_init(struct nand_chip *nand)
        if (ver == FSL_IFC_V1_1_0)
                fsl_ifc_sram_init();
 
+       ret = nand_scan_ident(mtd, 1, NULL);
+       if (ret)
+               return ret;
+
+       ret = nand_scan_tail(mtd);
+       if (ret)
+               return ret;
+
+       ret = nand_register(devnum);
+       if (ret)
+               return ret;
        return 0;
 }
+
+#ifndef CONFIG_SYS_NAND_BASE_LIST
+#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
+#endif
+
+static unsigned long base_address[CONFIG_SYS_MAX_NAND_DEVICE] =
+       CONFIG_SYS_NAND_BASE_LIST;
+
+void board_nand_init(void)
+{
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+               fsl_ifc_chip_init(i, (u8 *)base_address[i]);
+}
index 7a61d88cc573232b2530159d7725505c34fd8eb0..fab2aebc313f69e51ff20ab3f81b61cd49978c55 100644 (file)
@@ -341,6 +341,7 @@ void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)
  * @mtd:       mtd info structure
  * @chip:      nand chip info structure
  * @buf:       buffer to store read data
+ * @oob_required:      caller expects OOB data read to chip->oob_poi
  * @page:      page number to read
  *
  * This routine is needed for fsmc verison 8 as reading from NAND chip has to be
@@ -350,7 +351,7 @@ void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)
  * max of 8 bits)
  */
 static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
-                                uint8_t *buf, int page)
+                                uint8_t *buf, int oob_required, int page)
 {
        struct fsmc_eccplace *fsmc_eccpl;
        int i, j, s, stat, eccsize = chip->ecc.size;
@@ -452,6 +453,7 @@ int fsmc_nand_init(struct nand_chip *nand)
        switch (fsmc_version) {
        case FSMC_VER8:
                nand->ecc.bytes = 13;
+               nand->ecc.strength = 8;
                nand->ecc.correct = fsmc_bch8_correct_data;
                nand->ecc.read_page = fsmc_read_page_hwecc;
                if (mtd->writesize == 512)
@@ -466,6 +468,7 @@ int fsmc_nand_init(struct nand_chip *nand)
                break;
        default:
                nand->ecc.bytes = 3;
+               nand->ecc.strength = 1;
                nand->ecc.layout = &fsmc_ecc1_layout;
                nand->ecc.correct = nand_correct_data;
                break;
index 3ec34f3c9b1d71fda10160f80c62472cf5f28263..a691fbc40397d747df6acf11f8872e2da89ddedd 100644 (file)
@@ -253,6 +253,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.mode          = NAND_ECC_HW_OOB_FIRST;
        nand->ecc.size          = CONFIG_SYS_NAND_ECCSIZE;
        nand->ecc.bytes         = CONFIG_SYS_NAND_ECCBYTES;
+       nand->ecc.strength      = 4;
        nand->ecc.layout        = &qi_lb60_ecclayout_2gb;
        nand->chip_delay        = 50;
        nand->options           = NAND_USE_FLASH_BBT;
index e6b7a706619ca1eb1c7c7eab2d0a910413cba86d..e53f341dcf81a2f809cc9532f8eb7b022f8474ea 100644 (file)
@@ -621,7 +621,7 @@ int board_nand_init(struct nand_chip *chip)
        chip->write_buf = mpc5121_nfc_write_buf;
        chip->verify_buf = mpc5121_nfc_verify_buf;
        chip->select_chip = mpc5121_nfc_select_chip;
-       chip->options = NAND_NO_AUTOINCR | NAND_USE_FLASH_BBT;
+       chip->bbt_options = NAND_BBT_USE_FLASH;
        chip->ecc.mode = NAND_ECC_SOFT;
 
        /* Reset NAND Flash controller */
index eeba521942b78e76e0887e7648c8681b9019172b..ac435f205045e8a5f1d55643f7cdea20af98beac 100644 (file)
@@ -396,7 +396,7 @@ static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
 #if defined(MXC_NFC_V2_1) || defined(MXC_NFC_V3_2)
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
                                      struct nand_chip *chip,
-                                     int page, int sndcmd)
+                                     int page)
 {
        struct mxc_nand_host *host = chip->priv;
        uint8_t *buf = chip->oob_poi;
@@ -450,6 +450,7 @@ static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
 static int mxc_nand_read_page_raw_syndrome(struct mtd_info *mtd,
                                           struct nand_chip *chip,
                                           uint8_t *buf,
+                                          int oob_required,
                                           int page)
 {
        struct mxc_nand_host *host = chip->priv;
@@ -494,6 +495,7 @@ static int mxc_nand_read_page_raw_syndrome(struct mtd_info *mtd,
 static int mxc_nand_read_page_syndrome(struct mtd_info *mtd,
                                       struct nand_chip *chip,
                                       uint8_t *buf,
+                                      int oob_required,
                                       int page)
 {
        struct mxc_nand_host *host = chip->priv;
@@ -583,9 +585,10 @@ static int mxc_nand_write_oob_syndrome(struct mtd_info *mtd,
        return status & NAND_STATUS_FAIL ? -EIO : 0;
 }
 
-static void mxc_nand_write_page_raw_syndrome(struct mtd_info *mtd,
+static int mxc_nand_write_page_raw_syndrome(struct mtd_info *mtd,
                                             struct nand_chip *chip,
-                                            const uint8_t *buf)
+                                            const uint8_t *buf,
+                                            int oob_required)
 {
        struct mxc_nand_host *host = chip->priv;
        int eccsize = chip->ecc.size;
@@ -619,11 +622,13 @@ static void mxc_nand_write_page_raw_syndrome(struct mtd_info *mtd,
        size = mtd->oobsize - (oob - chip->oob_poi);
        if (size)
                chip->write_buf(mtd, oob, size);
+       return 0;
 }
 
-static void mxc_nand_write_page_syndrome(struct mtd_info *mtd,
+static int mxc_nand_write_page_syndrome(struct mtd_info *mtd,
                                         struct nand_chip *chip,
-                                        const uint8_t *buf)
+                                        const uint8_t *buf,
+                                        int oob_required)
 {
        struct mxc_nand_host *host = chip->priv;
        int i, n, eccsize = chip->ecc.size;
@@ -662,6 +667,7 @@ static void mxc_nand_write_page_syndrome(struct mtd_info *mtd,
        i = mtd->oobsize - (oob - chip->oob_poi);
        if (i)
                chip->write_buf(mtd, oob, i);
+       return 0;
 }
 
 static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
@@ -1188,7 +1194,7 @@ int board_nand_init(struct nand_chip *this)
 #endif
 
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
-       this->options |= NAND_USE_FLASH_BBT;
+       this->bbt_options |= NAND_BBT_USE_FLASH;
        this->bbt_td = &bbt_main_descr;
        this->bbt_md = &bbt_mirror_descr;
 #endif
@@ -1236,6 +1242,13 @@ int board_nand_init(struct nand_chip *this)
                this->ecc.mode = NAND_ECC_HW;
        }
 
+       if (this->ecc.mode == NAND_ECC_HW) {
+               if (is_mxc_nfc_1())
+                       this->ecc.strength = 1;
+               else
+                       this->ecc.strength = 4;
+       }
+
        host->pagesize_2k = 0;
 
        this->ecc.size = 512;
index edc589e5b7012d650fc14db4e120d3c32db36651..ba725e9f1899afcc12693741ff62be79f09fac79 100644 (file)
@@ -290,7 +290,7 @@ static int is_badblock(int pagenumber)
        return 0;
 }
 
-static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
+int nand_spl_load_image(uint32_t from, unsigned int size, void *buf)
 {
        int i;
        unsigned int page;
@@ -303,6 +303,7 @@ static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
        page = from / CONFIG_SYS_NAND_PAGE_SIZE;
        i = 0;
 
+       size = roundup(size, CONFIG_SYS_NAND_PAGE_SIZE);
        while (i < size / CONFIG_SYS_NAND_PAGE_SIZE) {
                if (nfc_read_page(page, buf) < 0)
                        return -1;
@@ -332,6 +333,7 @@ static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
        return 0;
 }
 
+#ifndef CONFIG_SPL_FRAMEWORK
 /*
  * The main entry for NAND booting. It's necessary that SDRAM is already
  * configured and available since this code loads the main U-Boot image
@@ -345,8 +347,9 @@ void nand_boot(void)
         * CONFIG_SYS_NAND_U_BOOT_OFFS and CONFIG_SYS_NAND_U_BOOT_SIZE must
         * be aligned to full pages
         */
-       if (!nand_load(CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
-                      (uchar *)CONFIG_SYS_NAND_U_BOOT_DST)) {
+       if (!nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+                       CONFIG_SYS_NAND_U_BOOT_SIZE,
+                       (uchar *)CONFIG_SYS_NAND_U_BOOT_DST)) {
                /* Copy from NAND successful, start U-boot */
                uboot = (void *)CONFIG_SYS_NAND_U_BOOT_START;
                uboot();
@@ -355,3 +358,7 @@ void nand_boot(void)
                hang();
        }
 }
+#endif
+
+void nand_init(void) {}
+void nand_deselect(void) {}
index e38e15125407bb0f2361ac04e96edae893294c7d..866cabd2765764ff29dbd84b9e2f9e58f6855ec0 100644 (file)
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
+#include <asm/imx-common/regs-bch.h>
+#include <asm/imx-common/regs-gpmi.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/arch/dma.h>
+#include <asm/imx-common/dma.h>
 
 #define        MXS_NAND_DMA_DESCRIPTOR_COUNT           4
 
 #define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE          512
+#if defined(CONFIG_MX6)
+#define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT    2
+#else
+#define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT    0
+#endif
 #define        MXS_NAND_METADATA_SIZE                  10
 
 #define        MXS_NAND_COMMAND_BUFFER_SIZE            32
@@ -546,7 +553,8 @@ static uint8_t mxs_nand_read_byte(struct mtd_info *mtd)
  * Read a page from NAND.
  */
 static int mxs_nand_ecc_read_page(struct mtd_info *mtd, struct nand_chip *nand,
-                                       uint8_t *buf, int page)
+                                       uint8_t *buf, int oob_required,
+                                       int page)
 {
        struct mxs_nand_info *nand_info = nand->priv;
        struct mxs_dma_desc *d;
@@ -691,8 +699,9 @@ rtn:
 /*
  * Write a page to NAND.
  */
-static void mxs_nand_ecc_write_page(struct mtd_info *mtd,
-                               struct nand_chip *nand, const uint8_t *buf)
+static int mxs_nand_ecc_write_page(struct mtd_info *mtd,
+                               struct nand_chip *nand, const uint8_t *buf,
+                               int oob_required)
 {
        struct mxs_nand_info *nand_info = nand->priv;
        struct mxs_dma_desc *d;
@@ -748,6 +757,7 @@ static void mxs_nand_ecc_write_page(struct mtd_info *mtd,
 
 rtn:
        mxs_nand_return_dma_descs(nand_info);
+       return 0;
 }
 
 /*
@@ -763,7 +773,7 @@ static int mxs_nand_hook_read_oob(struct mtd_info *mtd, loff_t from,
        struct mxs_nand_info *nand_info = chip->priv;
        int ret;
 
-       if (ops->mode == MTD_OOB_RAW)
+       if (ops->mode == MTD_OPS_RAW)
                nand_info->raw_oob_mode = 1;
        else
                nand_info->raw_oob_mode = 0;
@@ -788,7 +798,7 @@ static int mxs_nand_hook_write_oob(struct mtd_info *mtd, loff_t to,
        struct mxs_nand_info *nand_info = chip->priv;
        int ret;
 
-       if (ops->mode == MTD_OOB_RAW)
+       if (ops->mode == MTD_OPS_RAW)
                nand_info->raw_oob_mode = 1;
        else
                nand_info->raw_oob_mode = 0;
@@ -866,7 +876,7 @@ static int mxs_nand_hook_block_markbad(struct mtd_info *mtd, loff_t ofs)
  * what to do.
  */
 static int mxs_nand_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *nand,
-                               int page, int cmd)
+                               int page)
 {
        struct mxs_nand_info *nand_info = nand->priv;
 
@@ -980,14 +990,16 @@ static int mxs_nand_scan_bbt(struct mtd_info *mtd)
        tmp |= MXS_NAND_METADATA_SIZE << BCH_FLASHLAYOUT0_META_SIZE_OFFSET;
        tmp |= (mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize) >> 1)
                << BCH_FLASHLAYOUT0_ECC0_OFFSET;
-       tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
+       tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE
+               >> MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT;
        writel(tmp, &bch_regs->hw_bch_flash0layout0);
 
        tmp = (mtd->writesize + mtd->oobsize)
                << BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET;
        tmp |= (mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize) >> 1)
                << BCH_FLASHLAYOUT1_ECCN_OFFSET;
-       tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
+       tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE
+               >> MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT;
        writel(tmp, &bch_regs->hw_bch_flash0layout1);
 
        /* Set *all* chip selects to use layout 0 */
@@ -997,19 +1009,19 @@ static int mxs_nand_scan_bbt(struct mtd_info *mtd)
        writel(BCH_CTRL_COMPLETE_IRQ_EN, &bch_regs->hw_bch_ctrl_set);
 
        /* Hook some operations at the MTD level. */
-       if (mtd->read_oob != mxs_nand_hook_read_oob) {
-               nand_info->hooked_read_oob = mtd->read_oob;
-               mtd->read_oob = mxs_nand_hook_read_oob;
+       if (mtd->_read_oob != mxs_nand_hook_read_oob) {
+               nand_info->hooked_read_oob = mtd->_read_oob;
+               mtd->_read_oob = mxs_nand_hook_read_oob;
        }
 
-       if (mtd->write_oob != mxs_nand_hook_write_oob) {
-               nand_info->hooked_write_oob = mtd->write_oob;
-               mtd->write_oob = mxs_nand_hook_write_oob;
+       if (mtd->_write_oob != mxs_nand_hook_write_oob) {
+               nand_info->hooked_write_oob = mtd->_write_oob;
+               mtd->_write_oob = mxs_nand_hook_write_oob;
        }
 
-       if (mtd->block_markbad != mxs_nand_hook_block_markbad) {
-               nand_info->hooked_block_markbad = mtd->block_markbad;
-               mtd->block_markbad = mxs_nand_hook_block_markbad;
+       if (mtd->_block_markbad != mxs_nand_hook_block_markbad) {
+               nand_info->hooked_block_markbad = mtd->_block_markbad;
+               mtd->_block_markbad = mxs_nand_hook_block_markbad;
        }
 
        /* We use the reference implementation for bad block management. */
@@ -1163,6 +1175,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.mode          = NAND_ECC_HW;
        nand->ecc.bytes         = 9;
        nand->ecc.size          = 512;
+       nand->ecc.strength      = 8;
 
        return 0;
 
index a2d06be99fcf4f3f0882671a514b36b4afecb7a3..9e05cef4179f3ddfc10e26f7e116f32c399364e2 100644 (file)
@@ -21,7 +21,7 @@
  *  TODO:
  *     Enable cached programming for 2k page size chips
  *     Check, if mtd->ecctype should be set to MTD_ECC_HW
- *     if we have HW ecc support.
+ *     if we have HW ECC support.
  *     The AG-AND chips have nice features for speed improvement,
  *     which are not supported yet. Read / program 4 pages in one go.
  *     BBT table is not serialized, has to be fixed
@@ -134,21 +134,14 @@ static int check_offs_len(struct mtd_info *mtd,
                ret = -EINVAL;
        }
 
-       /* Do not allow past end of device */
-       if (ofs + len > mtd->size) {
-               MTDDEBUG(MTD_DEBUG_LEVEL0, "%s: Past end of device\n",
-                                       __func__);
-               ret = -EINVAL;
-       }
-
        return ret;
 }
 
 /**
  * nand_release_device - [GENERIC] release chip
- * @mtd:       MTD device structure
+ * @mtd: MTD device structure
  *
- * Deselect, release chip lock and wake up anyone waiting on the device
+ * Deselect, release chip lock and wake up anyone waiting on the device.
  */
 static void nand_release_device(struct mtd_info *mtd)
 {
@@ -160,9 +153,9 @@ static void nand_release_device(struct mtd_info *mtd)
 
 /**
  * nand_read_byte - [DEFAULT] read one byte from the chip
- * @mtd:       MTD device structure
+ * @mtd: MTD device structure
  *
- * Default read function for 8bit buswith
+ * Default read function for 8bit buswidth.
  */
 uint8_t nand_read_byte(struct mtd_info *mtd)
 {
@@ -172,10 +165,11 @@ uint8_t nand_read_byte(struct mtd_info *mtd)
 
 /**
  * nand_read_byte16 - [DEFAULT] read one byte endianess aware from the chip
- * @mtd:       MTD device structure
+ * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
+ * @mtd: MTD device structure
+ *
+ * Default read function for 16bit buswidth with endianness conversion.
  *
- * Default read function for 16bit buswith with
- * endianess conversion
  */
 static uint8_t nand_read_byte16(struct mtd_info *mtd)
 {
@@ -185,10 +179,9 @@ static uint8_t nand_read_byte16(struct mtd_info *mtd)
 
 /**
  * nand_read_word - [DEFAULT] read one word from the chip
- * @mtd:       MTD device structure
+ * @mtd: MTD device structure
  *
- * Default read function for 16bit buswith without
- * endianess conversion
+ * Default read function for 16bit buswidth without endianness conversion.
  */
 static u16 nand_read_word(struct mtd_info *mtd)
 {
@@ -198,8 +191,8 @@ static u16 nand_read_word(struct mtd_info *mtd)
 
 /**
  * nand_select_chip - [DEFAULT] control CE line
- * @mtd:       MTD device structure
- * @chipnr:    chipnumber to select, -1 for deselect
+ * @mtd: MTD device structure
+ * @chipnr: chipnumber to select, -1 for deselect
  *
  * Default select function for 1 chip devices.
  */
@@ -221,11 +214,11 @@ static void nand_select_chip(struct mtd_info *mtd, int chipnr)
 
 /**
  * nand_write_buf - [DEFAULT] write buffer to chip
- * @mtd:       MTD device structure
- * @buf:       data buffer
- * @len:       number of bytes to write
+ * @mtd: MTD device structure
+ * @buf: data buffer
+ * @len: number of bytes to write
  *
- * Default write function for 8bit buswith
+ * Default write function for 8bit buswidth.
  */
 void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 {
@@ -238,11 +231,11 @@ void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 
 /**
  * nand_read_buf - [DEFAULT] read chip data into buffer
- * @mtd:       MTD device structure
- * @buf:       buffer to store date
- * @len:       number of bytes to read
+ * @mtd: MTD device structure
+ * @buf: buffer to store date
+ * @len: number of bytes to read
  *
- * Default read function for 8bit buswith
+ * Default read function for 8bit buswidth.
  */
 void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
 {
@@ -255,11 +248,11 @@ void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
 
 /**
  * nand_verify_buf - [DEFAULT] Verify chip data against buffer
- * @mtd:       MTD device structure
- * @buf:       buffer containing the data to compare
- * @len:       number of bytes to compare
+ * @mtd: MTD device structure
+ * @buf: buffer containing the data to compare
+ * @len: number of bytes to compare
  *
- * Default verify function for 8bit buswith
+ * Default verify function for 8bit buswidth.
  */
 static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 {
@@ -274,11 +267,11 @@ static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 
 /**
  * nand_write_buf16 - [DEFAULT] write buffer to chip
- * @mtd:       MTD device structure
- * @buf:       data buffer
- * @len:       number of bytes to write
+ * @mtd: MTD device structure
+ * @buf: data buffer
+ * @len: number of bytes to write
  *
- * Default write function for 16bit buswith
+ * Default write function for 16bit buswidth.
  */
 void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
 {
@@ -294,11 +287,11 @@ void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
 
 /**
  * nand_read_buf16 - [DEFAULT] read chip data into buffer
- * @mtd:       MTD device structure
- * @buf:       buffer to store date
- * @len:       number of bytes to read
+ * @mtd: MTD device structure
+ * @buf: buffer to store date
+ * @len: number of bytes to read
  *
- * Default read function for 16bit buswith
+ * Default read function for 16bit buswidth.
  */
 void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
 {
@@ -313,11 +306,11 @@ void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
 
 /**
  * nand_verify_buf16 - [DEFAULT] Verify chip data against buffer
- * @mtd:       MTD device structure
- * @buf:       buffer containing the data to compare
- * @len:       number of bytes to compare
+ * @mtd: MTD device structure
+ * @buf: buffer containing the data to compare
+ * @len: number of bytes to compare
  *
- * Default verify function for 16bit buswith
+ * Default verify function for 16bit buswidth.
  */
 static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
 {
@@ -335,19 +328,19 @@ static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
 
 /**
  * nand_block_bad - [DEFAULT] Read bad block marker from the chip
- * @mtd:       MTD device structure
- * @ofs:       offset from device start
- * @getchip:   0, if the chip is already selected
+ * @mtd: MTD device structure
+ * @ofs: offset from device start
+ * @getchip: 0, if the chip is already selected
  *
  * Check, if the block is bad.
  */
 static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
 {
-       int page, chipnr, res = 0;
+       int page, chipnr, res = 0, i = 0;
        struct nand_chip *chip = mtd->priv;
        u16 bad;
 
-       if (chip->options & NAND_BBT_SCANLASTPAGE)
+       if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
                ofs += mtd->erasesize - mtd->writesize;
 
        page = (int)(ofs >> chip->page_shift) & chip->pagemask;
@@ -361,23 +354,29 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
                chip->select_chip(mtd, chipnr);
        }
 
-       if (chip->options & NAND_BUSWIDTH_16) {
-               chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE,
-                             page);
-               bad = cpu_to_le16(chip->read_word(mtd));
-               if (chip->badblockpos & 0x1)
-                       bad >>= 8;
-               else
-                       bad &= 0xFF;
-       } else {
-               chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
-               bad = chip->read_byte(mtd);
-       }
+       do {
+               if (chip->options & NAND_BUSWIDTH_16) {
+                       chip->cmdfunc(mtd, NAND_CMD_READOOB,
+                                       chip->badblockpos & 0xFE, page);
+                       bad = cpu_to_le16(chip->read_word(mtd));
+                       if (chip->badblockpos & 0x1)
+                               bad >>= 8;
+                       else
+                               bad &= 0xFF;
+               } else {
+                       chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos,
+                                       page);
+                       bad = chip->read_byte(mtd);
+               }
 
-       if (likely(chip->badblockbits == 8))
-               res = bad != 0xFF;
-       else
-               res = hweight8(bad) < chip->badblockbits;
+               if (likely(chip->badblockbits == 8))
+                       res = bad != 0xFF;
+               else
+                       res = hweight8(bad) < chip->badblockbits;
+               ofs += mtd->writesize;
+               page = (int)(ofs >> chip->page_shift) & chip->pagemask;
+               i++;
+       } while (!res && i < 2 && (chip->bbt_options & NAND_BBT_SCAN2NDPAGE));
 
        if (getchip)
                nand_release_device(mtd);
@@ -387,57 +386,83 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
 
 /**
  * nand_default_block_markbad - [DEFAULT] mark a block bad
- * @mtd:       MTD device structure
- * @ofs:       offset from device start
+ * @mtd: MTD device structure
+ * @ofs: offset from device start
  *
- * This is the default implementation, which can be overridden by
- * a hardware specific driver.
+ * This is the default implementation, which can be overridden by a hardware
+ * specific driver. We try operations in the following order, according to our
+ * bbt_options (NAND_BBT_NO_OOB_BBM and NAND_BBT_USE_FLASH):
+ *  (1) erase the affected block, to allow OOB marker to be written cleanly
+ *  (2) update in-memory BBT
+ *  (3) write bad block marker to OOB area of affected block
+ *  (4) update flash-based BBT
+ * Note that we retain the first error encountered in (3) or (4), finish the
+ * procedures, and dump the error in the end.
 */
 static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
 {
        struct nand_chip *chip = mtd->priv;
        uint8_t buf[2] = { 0, 0 };
-       int block, ret, i = 0;
+       int block, res, ret = 0, i = 0;
+       int write_oob = !(chip->bbt_options & NAND_BBT_NO_OOB_BBM);
 
-       if (chip->options & NAND_BBT_SCANLASTPAGE)
-               ofs += mtd->erasesize - mtd->writesize;
+       if (write_oob) {
+               struct erase_info einfo;
+
+               /* Attempt erase before marking OOB */
+               memset(&einfo, 0, sizeof(einfo));
+               einfo.mtd = mtd;
+               einfo.addr = ofs;
+               einfo.len = 1 << chip->phys_erase_shift;
+               nand_erase_nand(mtd, &einfo, 0);
+       }
 
        /* Get block number */
        block = (int)(ofs >> chip->bbt_erase_shift);
+       /* Mark block bad in memory-based BBT */
        if (chip->bbt)
                chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
 
-       /* Do we have a flash based bad block table ? */
-       if (chip->options & NAND_USE_FLASH_BBT)
-               ret = nand_update_bbt(mtd, ofs);
-       else {
+       /* Write bad block marker to OOB */
+       if (write_oob) {
+               struct mtd_oob_ops ops;
+               loff_t wr_ofs = ofs;
+
                nand_get_device(chip, mtd, FL_WRITING);
 
-               /* Write to first two pages and to byte 1 and 6 if necessary.
-                * If we write to more than one location, the first error
-                * encountered quits the procedure. We write two bytes per
-                * location, so we dont have to mess with 16 bit access.
-                */
-               do {
-                       chip->ops.len = chip->ops.ooblen = 2;
-                       chip->ops.datbuf = NULL;
-                       chip->ops.oobbuf = buf;
-                       chip->ops.ooboffs = chip->badblockpos & ~0x01;
+               ops.datbuf = NULL;
+               ops.oobbuf = buf;
+               ops.ooboffs = chip->badblockpos;
+               if (chip->options & NAND_BUSWIDTH_16) {
+                       ops.ooboffs &= ~0x01;
+                       ops.len = ops.ooblen = 2;
+               } else {
+                       ops.len = ops.ooblen = 1;
+               }
+               ops.mode = MTD_OPS_PLACE_OOB;
 
-                       ret = nand_do_write_oob(mtd, ofs, &chip->ops);
+               /* Write to first/last page(s) if necessary */
+               if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
+                       wr_ofs += mtd->erasesize - mtd->writesize;
+               do {
+                       res = nand_do_write_oob(mtd, wr_ofs, &ops);
+                       if (!ret)
+                               ret = res;
 
-                       if (!ret && (chip->options & NAND_BBT_SCANBYTE1AND6)) {
-                               chip->ops.ooboffs = NAND_SMALL_BADBLOCK_POS
-                                       & ~0x01;
-                               ret = nand_do_write_oob(mtd, ofs, &chip->ops);
-                       }
                        i++;
-                       ofs += mtd->writesize;
-               } while (!ret && (chip->options & NAND_BBT_SCAN2NDPAGE) &&
-                               i < 2);
+                       wr_ofs += mtd->writesize;
+               } while ((chip->bbt_options & NAND_BBT_SCAN2NDPAGE) && i < 2);
 
                nand_release_device(mtd);
        }
+
+       /* Update flash-based bad block table */
+       if (chip->bbt_options & NAND_BBT_USE_FLASH) {
+               res = nand_update_bbt(mtd, ofs);
+               if (!ret)
+                       ret = res;
+       }
+
        if (!ret)
                mtd->ecc_stats.badblocks++;
 
@@ -446,16 +471,16 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
 
 /**
  * nand_check_wp - [GENERIC] check if the chip is write protected
- * @mtd:       MTD device structure
- * Check, if the device is write protected
+ * @mtd: MTD device structure
  *
- * The function expects, that the device is already selected
+ * Check, if the device is write protected. The function expects, that the
+ * device is already selected.
  */
 static int nand_check_wp(struct mtd_info *mtd)
 {
        struct nand_chip *chip = mtd->priv;
 
-       /* broken xD cards report WP despite being writable */
+       /* Broken xD cards report WP despite being writable */
        if (chip->options & NAND_BROKEN_XD)
                return 0;
 
@@ -466,10 +491,10 @@ static int nand_check_wp(struct mtd_info *mtd)
 
 /**
  * nand_block_checkbad - [GENERIC] Check if a block is marked bad
- * @mtd:       MTD device structure
- * @ofs:       offset from device start
- * @getchip:   0, if the chip is already selected
- * @allowbbt:  1, if its allowed to access the bbt area
+ * @mtd: MTD device structure
+ * @ofs: offset from device start
+ * @getchip: 0, if the chip is already selected
+ * @allowbbt: 1, if its allowed to access the bbt area
  *
  * Check, if the block is bad. Either by reading the bad block table or
  * calling of the scan function.
@@ -491,10 +516,7 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
        return nand_isbad_bbt(mtd, ofs, allowbbt);
 }
 
-/*
- * Wait for the ready pin, after a command
- * The timeout is catched later.
- */
+/* Wait for the ready pin, after a command. The timeout is caught later. */
 void nand_wait_ready(struct mtd_info *mtd)
 {
        struct nand_chip *chip = mtd->priv;
@@ -503,7 +525,7 @@ void nand_wait_ready(struct mtd_info *mtd)
 
        time_start = get_timer(0);
 
-       /* wait until command is processed or timeout occures */
+       /* Wait until command is processed or timeout occurs */
        while (get_timer(time_start) < timeo) {
                if (chip->dev_ready)
                        if (chip->dev_ready(mtd))
@@ -513,13 +535,13 @@ void nand_wait_ready(struct mtd_info *mtd)
 
 /**
  * nand_command - [DEFAULT] Send command to NAND device
- * @mtd:       MTD device structure
- * @command:   the command to be sent
- * @column:    the column address for this command, -1 if none
- * @page_addr: the page address for this command, -1 if none
+ * @mtd: MTD device structure
+ * @command: the command to be sent
+ * @column: the column address for this command, -1 if none
+ * @page_addr: the page address for this command, -1 if none
  *
- * Send command to NAND device. This function is used for small page
- * devices (256/512 Bytes per page)
+ * Send command to NAND device. This function is used for small page devices
+ * (256/512 Bytes per page).
  */
 static void nand_command(struct mtd_info *mtd, unsigned int command,
                         int column, int page_addr)
@@ -528,9 +550,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
        int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
        uint32_t rst_sts_cnt = CONFIG_SYS_NAND_RESET_CNT;
 
-       /*
-        * Write out the command to the device.
-        */
+       /* Write out the command to the device */
        if (command == NAND_CMD_SEQIN) {
                int readcmd;
 
@@ -550,9 +570,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
        }
        chip->cmd_ctrl(mtd, command, ctrl);
 
-       /*
-        * Address cycle, when necessary
-        */
+       /* Address cycle, when necessary */
        ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
        /* Serially input address */
        if (column != -1) {
@@ -573,8 +591,8 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
        chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
 
        /*
-        * program and erase have their own busy handlers
-        * status and sequential in needs no delay
+        * Program and erase have their own busy handlers status and sequential
+        * in needs no delay
         */
        switch (command) {
 
@@ -608,8 +626,10 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
                        return;
                }
        }
-       /* Apply this short delay always to ensure that we do wait tWB in
-        * any case on any machine. */
+       /*
+        * Apply this short delay always to ensure that we do wait tWB in
+        * any case on any machine.
+        */
        ndelay(100);
 
        nand_wait_ready(mtd);
@@ -617,14 +637,14 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
 
 /**
  * nand_command_lp - [DEFAULT] Send command to NAND large page device
- * @mtd:       MTD device structure
- * @command:   the command to be sent
- * @column:    the column address for this command, -1 if none
- * @page_addr: the page address for this command, -1 if none
+ * @mtd: MTD device structure
+ * @command: the command to be sent
+ * @column: the column address for this command, -1 if none
+ * @page_addr: the page address for this command, -1 if none
  *
  * Send command to NAND device. This is the version for the new large page
- * devices We dont have the separate regions as we have in the small page
- * devices.  We must emulate NAND_CMD_READOOB to keep the code compatible.
+ * devices. We don't have the separate regions as we have in the small page
+ * devices. We must emulate NAND_CMD_READOOB to keep the code compatible.
  */
 static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
                            int column, int page_addr)
@@ -667,8 +687,8 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
        chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
 
        /*
-        * program and erase have their own busy handlers
-        * status, sequential in, and deplete1 need no delay
+        * Program and erase have their own busy handlers status, sequential
+        * in, and deplete1 need no delay.
         */
        switch (command) {
 
@@ -682,14 +702,12 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
        case NAND_CMD_DEPLETE1:
                return;
 
-               /*
-                * read error status commands require only a short delay
-                */
        case NAND_CMD_STATUS_ERROR:
        case NAND_CMD_STATUS_ERROR0:
        case NAND_CMD_STATUS_ERROR1:
        case NAND_CMD_STATUS_ERROR2:
        case NAND_CMD_STATUS_ERROR3:
+               /* Read error status commands require only a short delay */
                udelay(chip->chip_delay);
                return;
 
@@ -723,7 +741,7 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
        default:
                /*
                 * If we don't have access to the busy pin, we apply the given
-                * command delay
+                * command delay.
                 */
                if (!chip->dev_ready) {
                        udelay(chip->chip_delay);
@@ -731,8 +749,10 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
                }
        }
 
-       /* Apply this short delay always to ensure that we do wait tWB in
-        * any case on any machine. */
+       /*
+        * Apply this short delay always to ensure that we do wait tWB in
+        * any case on any machine.
+        */
        ndelay(100);
 
        nand_wait_ready(mtd);
@@ -740,9 +760,9 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
 
 /**
  * nand_get_device - [GENERIC] Get chip for selected access
- * @chip:      the nand chip descriptor
- * @mtd:       MTD device structure
- * @new_state: the state which is requested
+ * @chip: the nand chip descriptor
+ * @mtd: MTD device structure
+ * @new_state: the state which is requested
  *
  * Get the device and lock it for exclusive access
  */
@@ -754,13 +774,13 @@ nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
 }
 
 /**
- * nand_wait - [DEFAULT]  wait until the command is done
- * @mtd:       MTD device structure
- * @chip:      NAND chip structure
+ * nand_wait - [DEFAULT] wait until the command is done
+ * @mtd: MTD device structure
+ * @chip: NAND chip structure
  *
- * Wait for command done. This applies to erase and program only
- * Erase can take up to 400ms and program up to 20ms according to
- * general NAND and SmartMedia specs
+ * Wait for command done. This applies to erase and program only. Erase can
+ * take up to 400ms and program up to 20ms according to general NAND and
+ * SmartMedia specs.
  */
 static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
 {
@@ -804,34 +824,37 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
 }
 
 /**
- * nand_read_page_raw - [Intern] read raw page data without ecc
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_raw - [INTERN] read raw page data without ecc
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  *
- * Not for syndrome calculating ecc controllers, which use a special oob layout
+ * Not for syndrome calculating ECC controllers, which use a special oob layout.
  */
 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
-                             uint8_t *buf, int page)
+                             uint8_t *buf, int oob_required, int page)
 {
        chip->read_buf(mtd, buf, mtd->writesize);
-       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+       if (oob_required)
+               chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
        return 0;
 }
 
 /**
- * nand_read_page_raw_syndrome - [Intern] read raw page data without ecc
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_raw_syndrome - [INTERN] read raw page data without ecc
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  *
  * We need a special oob layout and handling even when OOB isn't used.
  */
 static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
-                                       struct nand_chip *chip,
-                                       uint8_t *buf, int page)
+                                      struct nand_chip *chip, uint8_t *buf,
+                                      int oob_required, int page)
 {
        int eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -864,14 +887,15 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
 }
 
 /**
- * nand_read_page_swecc - [REPLACABLE] software ecc based page read function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_swecc - [REPLACEABLE] software ECC based page read function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  */
 static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
-                               uint8_t *buf, int page)
+                               uint8_t *buf, int oob_required, int page)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -881,7 +905,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
        uint8_t *ecc_code = chip->buffers->ecccode;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
 
-       chip->ecc.read_page_raw(mtd, chip, buf, page);
+       chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
 
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
@@ -905,12 +929,12 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
 }
 
 /**
- * nand_read_subpage - [REPLACABLE] software ecc based sub-page read function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @data_offs: offset of requested data within the page
- * @readlen:   data length
- * @bufpoi:    buffer to store read data
+ * nand_read_subpage - [REPLACEABLE] software ECC based sub-page read function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @data_offs: offset of requested data within the page
+ * @readlen: data length
+ * @bufpoi: buffer to store read data
  */
 static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
                        uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi)
@@ -923,12 +947,12 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
        int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
        int index = 0;
 
-       /* Column address wihin the page aligned to ECC size (256bytes). */
+       /* Column address within the page aligned to ECC size (256bytes) */
        start_step = data_offs / chip->ecc.size;
        end_step = (data_offs + readlen - 1) / chip->ecc.size;
        num_steps = end_step - start_step + 1;
 
-       /* Data size aligned to ECC ecc.size*/
+       /* Data size aligned to ECC ecc.size */
        datafrag_len = num_steps * chip->ecc.size;
        eccfrag_len = num_steps * chip->ecc.bytes;
 
@@ -940,13 +964,14 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
        p = bufpoi + data_col_addr;
        chip->read_buf(mtd, p, datafrag_len);
 
-       /* Calculate  ECC */
+       /* Calculate ECC */
        for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)
                chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]);
 
-       /* The performance is faster if to position offsets
-          according to ecc.pos. Let make sure here that
-          there are no gaps in ecc positions */
+       /*
+        * The performance is faster if we position offsets according to
+        * ecc.pos. Let's make sure that there are no gaps in ECC positions.
+        */
        for (i = 0; i < eccfrag_len - 1; i++) {
                if (eccpos[i + start_step * chip->ecc.bytes] + 1 !=
                        eccpos[i + start_step * chip->ecc.bytes + 1]) {
@@ -958,8 +983,10 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
                chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
                chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
        } else {
-               /* send the command to read the particular ecc bytes */
-               /* take care about buswidth alignment in read_buf */
+               /*
+                * Send the command to read the particular ECC bytes take care
+                * about buswidth alignment in read_buf.
+                */
                index = start_step * chip->ecc.bytes;
 
                aligned_pos = eccpos[index] & ~(busw - 1);
@@ -992,16 +1019,17 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
 }
 
 /**
- * nand_read_page_hwecc - [REPLACABLE] hardware ecc based page read function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_hwecc - [REPLACEABLE] hardware ECC based page read function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  *
- * Not for syndrome calculating ecc controllers which need a special oob layout
+ * Not for syndrome calculating ECC controllers which need a special oob layout.
  */
 static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
-                               uint8_t *buf, int page)
+                               uint8_t *buf, int oob_required, int page)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1037,21 +1065,21 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
 }
 
 /**
- * nand_read_page_hwecc_oob_first - [REPLACABLE] hw ecc, read oob first
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_hwecc_oob_first - [REPLACEABLE] hw ecc, read oob first
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  *
- * Hardware ECC for large page chips, require OOB to be read first.
- * For this ECC mode, the write_page method is re-used from ECC_HW.
- * These methods read/write ECC from the OOB area, unlike the
- * ECC_HW_SYNDROME support with multiple ECC steps, follows the
- * "infix ECC" scheme and reads/writes ECC from the data area, by
- * overwriting the NAND manufacturer bad block markings.
+ * Hardware ECC for large page chips, require OOB to be read first. For this
+ * ECC mode, the write_page method is re-used from ECC_HW. These methods
+ * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with
+ * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from
+ * the data area, by overwriting the NAND manufacturer bad block markings.
  */
 static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
-       struct nand_chip *chip, uint8_t *buf, int page)
+       struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1086,17 +1114,18 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
 }
 
 /**
- * nand_read_page_syndrome - [REPLACABLE] hardware ecc syndrom based page read
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       buffer to store read data
- * @page:      page number to read
+ * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: buffer to store read data
+ * @oob_required: caller requires OOB data read to chip->oob_poi
+ * @page: page number to read
  *
- * The hw generator calculates the error syndrome automatically. Therefor
- * we need a special oob layout and handling.
+ * The hw generator calculates the error syndrome automatically. Therefore we
+ * need a special oob layout and handling.
  */
 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
-                                  uint8_t *buf, int page)
+                                  uint8_t *buf, int oob_required, int page)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1141,29 +1170,29 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 }
 
 /**
- * nand_transfer_oob - [Internal] Transfer oob to client buffer
- * @chip:      nand chip structure
- * @oob:       oob destination address
- * @ops:       oob ops structure
- * @len:       size of oob to transfer
+ * nand_transfer_oob - [INTERN] Transfer oob to client buffer
+ * @chip: nand chip structure
+ * @oob: oob destination address
+ * @ops: oob ops structure
+ * @len: size of oob to transfer
  */
 static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
                                  struct mtd_oob_ops *ops, size_t len)
 {
        switch (ops->mode) {
 
-       case MTD_OOB_PLACE:
-       case MTD_OOB_RAW:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_RAW:
                memcpy(oob, chip->oob_poi + ops->ooboffs, len);
                return oob + len;
 
-       case MTD_OOB_AUTO: {
+       case MTD_OPS_AUTO_OOB: {
                struct nand_oobfree *free = chip->ecc.layout->oobfree;
                uint32_t boffs = 0, roffs = ops->ooboffs;
                size_t bytes = 0;
 
                for (; free->length && len; free++, len -= bytes) {
-                       /* Read request not from offset 0 ? */
+                       /* Read request not from offset 0? */
                        if (unlikely(roffs)) {
                                if (roffs >= free->length) {
                                        roffs -= free->length;
@@ -1189,26 +1218,23 @@ static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
 }
 
 /**
- * nand_do_read_ops - [Internal] Read data with ECC
- *
- * @mtd:       MTD device structure
- * @from:      offset to read from
- * @ops:       oob ops structure
+ * nand_do_read_ops - [INTERN] Read data with ECC
+ * @mtd: MTD device structure
+ * @from: offset to read from
+ * @ops: oob ops structure
  *
  * Internal function. Called with chip held.
  */
 static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                            struct mtd_oob_ops *ops)
 {
-       int chipnr, page, realpage, col, bytes, aligned;
+       int chipnr, page, realpage, col, bytes, aligned, oob_required;
        struct nand_chip *chip = mtd->priv;
        struct mtd_ecc_stats stats;
-       int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
-       int sndcmd = 1;
        int ret = 0;
        uint32_t readlen = ops->len;
        uint32_t oobreadlen = ops->ooblen;
-       uint32_t max_oobsize = ops->mode == MTD_OOB_AUTO ?
+       uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?
                mtd->oobavail : mtd->oobsize;
 
        uint8_t *bufpoi, *oob, *buf;
@@ -1225,6 +1251,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 
        buf = ops->datbuf;
        oob = ops->oobbuf;
+       oob_required = oob ? 1 : 0;
 
        while (1) {
                WATCHDOG_RESET();
@@ -1232,41 +1259,46 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                bytes = min(mtd->writesize - col, readlen);
                aligned = (bytes == mtd->writesize);
 
-               /* Is the current page in the buffer ? */
+               /* Is the current page in the buffer? */
                if (realpage != chip->pagebuf || oob) {
                        bufpoi = aligned ? buf : chip->buffers->databuf;
 
-                       if (likely(sndcmd)) {
-                               chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
-                               sndcmd = 0;
-                       }
+                       chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
 
                        /* Now read the page into the buffer */
-                       if (unlikely(ops->mode == MTD_OOB_RAW))
-                               ret = chip->ecc.read_page_raw(mtd, chip,
-                                                             bufpoi, page);
+                       if (unlikely(ops->mode == MTD_OPS_RAW))
+                               ret = chip->ecc.read_page_raw(mtd, chip, bufpoi,
+                                                             oob_required,
+                                                             page);
                        else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) &&
                            !oob)
                                ret = chip->ecc.read_subpage(mtd, chip,
                                                        col, bytes, bufpoi);
                        else
                                ret = chip->ecc.read_page(mtd, chip, bufpoi,
-                                                         page);
-                       if (ret < 0)
+                                                         oob_required, page);
+                       if (ret < 0) {
+                               if (!aligned)
+                                       /* Invalidate page cache */
+                                       chip->pagebuf = -1;
                                break;
+                       }
 
                        /* Transfer not aligned data */
                        if (!aligned) {
                                if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
-                                   !(mtd->ecc_stats.failed - stats.failed))
+                                   !(mtd->ecc_stats.failed - stats.failed) &&
+                                   (ops->mode != MTD_OPS_RAW))
                                        chip->pagebuf = realpage;
+                               else
+                                       /* Invalidate page cache */
+                                       chip->pagebuf = -1;
                                memcpy(buf, chip->buffers->databuf + col, bytes);
                        }
 
                        buf += bytes;
 
                        if (unlikely(oob)) {
-
                                int toread = min(oobreadlen, max_oobsize);
 
                                if (toread) {
@@ -1275,20 +1307,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                                        oobreadlen -= toread;
                                }
                        }
-
-                       if (!(chip->options & NAND_NO_READRDY)) {
-                               /*
-                                * Apply delay or wait for ready/busy pin. Do
-                                * this before the AUTOINCR check, so no
-                                * problems arise if a chip which does auto
-                                * increment is marked as NOAUTOINCR by the
-                                * board driver.
-                                */
-                               if (!chip->dev_ready)
-                                       udelay(chip->chip_delay);
-                               else
-                                       nand_wait_ready(mtd);
-                       }
                } else {
                        memcpy(buf, chip->buffers->databuf + col, bytes);
                        buf += bytes;
@@ -1299,7 +1317,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                if (!readlen)
                        break;
 
-               /* For subsequent reads align to page boundary. */
+               /* For subsequent reads align to page boundary */
                col = 0;
                /* Increment page address */
                realpage++;
@@ -1311,12 +1329,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                        chip->select_chip(mtd, -1);
                        chip->select_chip(mtd, chipnr);
                }
-
-               /* Check, if the chip supports auto page increment
-                * or if we have hit a block boundary.
-                */
-               if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
-                       sndcmd = 1;
        }
 
        ops->retlen = ops->len - (size_t) readlen;
@@ -1334,69 +1346,55 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 
 /**
  * nand_read - [MTD Interface] MTD compatibility function for nand_do_read_ecc
- * @mtd:       MTD device structure
- * @from:      offset to read from
- * @len:       number of bytes to read
- * @retlen:    pointer to variable to store the number of read bytes
- * @buf:       the databuffer to put data
+ * @mtd: MTD device structure
+ * @from: offset to read from
+ * @len: number of bytes to read
+ * @retlen: pointer to variable to store the number of read bytes
+ * @buf: the databuffer to put data
  *
- * Get hold of the chip and call nand_do_read
+ * Get hold of the chip and call nand_do_read.
  */
 static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
                     size_t *retlen, uint8_t *buf)
 {
        struct nand_chip *chip = mtd->priv;
+       struct mtd_oob_ops ops;
        int ret;
 
-       /* Do not allow reads past end of device */
-       if ((from + len) > mtd->size)
-               return -EINVAL;
-       if (!len)
-               return 0;
-
        nand_get_device(chip, mtd, FL_READING);
-
-       chip->ops.len = len;
-       chip->ops.datbuf = buf;
-       chip->ops.oobbuf = NULL;
-
-       ret = nand_do_read_ops(mtd, from, &chip->ops);
-
-       *retlen = chip->ops.retlen;
-
+       ops.len = len;
+       ops.datbuf = buf;
+       ops.oobbuf = NULL;
+       ops.mode = MTD_OPS_PLACE_OOB;
+       ret = nand_do_read_ops(mtd, from, &ops);
+       *retlen = ops.retlen;
        nand_release_device(mtd);
-
        return ret;
 }
 
 /**
- * nand_read_oob_std - [REPLACABLE] the most common OOB data read function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @page:      page number to read
- * @sndcmd:    flag whether to issue read command or not
+ * nand_read_oob_std - [REPLACEABLE] the most common OOB data read function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @page: page number to read
  */
 static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
-                            int page, int sndcmd)
+                            int page)
 {
-       if (sndcmd) {
-               chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
-               sndcmd = 0;
-       }
+       chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
        chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
-       return sndcmd;
+       return 0;
 }
 
 /**
- * nand_read_oob_syndrome - [REPLACABLE] OOB data read function for HW ECC
+ * nand_read_oob_syndrome - [REPLACEABLE] OOB data read function for HW ECC
  *                         with syndromes
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @page:      page number to read
- * @sndcmd:    flag whether to issue read command or not
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @page: page number to read
  */
 static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
-                                 int page, int sndcmd)
+                                 int page)
 {
        uint8_t *buf = chip->oob_poi;
        int length = mtd->oobsize;
@@ -1423,14 +1421,14 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
        if (length > 0)
                chip->read_buf(mtd, bufpoi, length);
 
-       return 1;
+       return 0;
 }
 
 /**
- * nand_write_oob_std - [REPLACABLE] the most common OOB data write function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @page:      page number to write
+ * nand_write_oob_std - [REPLACEABLE] the most common OOB data write function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @page: page number to write
  */
 static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
                              int page)
@@ -1450,11 +1448,11 @@ static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
 }
 
 /**
- * nand_write_oob_syndrome - [REPLACABLE] OOB data write function for HW ECC
- *                          with syndrome - only for large page flash !
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @page:      page number to write
+ * nand_write_oob_syndrome - [REPLACEABLE] OOB data write function for HW ECC
+ *                          with syndrome - only for large page flash
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @page: page number to write
  */
 static int nand_write_oob_syndrome(struct mtd_info *mtd,
                                   struct nand_chip *chip, int page)
@@ -1509,27 +1507,30 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
 }
 
 /**
- * nand_do_read_oob - [Intern] NAND read out-of-band
- * @mtd:       MTD device structure
- * @from:      offset to read from
- * @ops:       oob operations description structure
+ * nand_do_read_oob - [INTERN] NAND read out-of-band
+ * @mtd: MTD device structure
+ * @from: offset to read from
+ * @ops: oob operations description structure
  *
- * NAND read out-of-band data from the spare area
+ * NAND read out-of-band data from the spare area.
  */
 static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
                            struct mtd_oob_ops *ops)
 {
-       int page, realpage, chipnr, sndcmd = 1;
+       int page, realpage, chipnr;
        struct nand_chip *chip = mtd->priv;
-       int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
+       struct mtd_ecc_stats stats;
        int readlen = ops->ooblen;
        int len;
        uint8_t *buf = ops->oobbuf;
+       int ret = 0;
 
        MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: from = 0x%08Lx, len = %i\n",
                        __func__, (unsigned long long)from, readlen);
 
-       if (ops->mode == MTD_OOB_AUTO)
+       stats = mtd->ecc_stats;
+
+       if (ops->mode == MTD_OPS_AUTO_OOB)
                len = chip->ecc.layout->oobavail;
        else
                len = mtd->oobsize;
@@ -1558,24 +1559,17 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
 
        while (1) {
                WATCHDOG_RESET();
-               sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd);
+               if (ops->mode == MTD_OPS_RAW)
+                       ret = chip->ecc.read_oob_raw(mtd, chip, page);
+               else
+                       ret = chip->ecc.read_oob(mtd, chip, page);
+
+               if (ret < 0)
+                       break;
 
                len = min(len, readlen);
                buf = nand_transfer_oob(chip, buf, ops, len);
 
-               if (!(chip->options & NAND_NO_READRDY)) {
-                       /*
-                        * Apply delay or wait for ready/busy pin. Do this
-                        * before the AUTOINCR check, so no problems arise if a
-                        * chip which does auto increment is marked as
-                        * NOAUTOINCR by the board driver.
-                        */
-                       if (!chip->dev_ready)
-                               udelay(chip->chip_delay);
-                       else
-                               nand_wait_ready(mtd);
-               }
-
                readlen -= len;
                if (!readlen)
                        break;
@@ -1590,25 +1584,26 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
                        chip->select_chip(mtd, -1);
                        chip->select_chip(mtd, chipnr);
                }
-
-               /* Check, if the chip supports auto page increment
-                * or if we have hit a block boundary.
-                */
-               if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
-                       sndcmd = 1;
        }
 
-       ops->oobretlen = ops->ooblen;
-       return 0;
+       ops->oobretlen = ops->ooblen - readlen;
+
+       if (ret < 0)
+               return ret;
+
+       if (mtd->ecc_stats.failed - stats.failed)
+               return -EBADMSG;
+
+       return  mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
 }
 
 /**
  * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band
- * @mtd:       MTD device structure
- * @from:      offset to read from
- * @ops:       oob operation description structure
+ * @mtd: MTD device structure
+ * @from: offset to read from
+ * @ops: oob operation description structure
  *
- * NAND read data and/or out-of-band data
+ * NAND read data and/or out-of-band data.
  */
 static int nand_read_oob(struct mtd_info *mtd, loff_t from,
                         struct mtd_oob_ops *ops)
@@ -1628,9 +1623,9 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from,
        nand_get_device(chip, mtd, FL_READING);
 
        switch (ops->mode) {
-       case MTD_OOB_PLACE:
-       case MTD_OOB_AUTO:
-       case MTD_OOB_RAW:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_AUTO_OOB:
+       case MTD_OPS_RAW:
                break;
 
        default:
@@ -1649,31 +1644,36 @@ out:
 
 
 /**
- * nand_write_page_raw - [Intern] raw page write function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       data buffer
+ * nand_write_page_raw - [INTERN] raw page write function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: data buffer
+ * @oob_required: must write chip->oob_poi to OOB
  *
- * Not for syndrome calculating ecc controllers, which use a special oob layout
+ * Not for syndrome calculating ECC controllers, which use a special oob layout.
  */
-static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
-                               const uint8_t *buf)
+static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
+                               const uint8_t *buf, int oob_required)
 {
        chip->write_buf(mtd, buf, mtd->writesize);
-       chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+       if (oob_required)
+               chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+       return 0;
 }
 
 /**
- * nand_write_page_raw_syndrome - [Intern] raw page write function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       data buffer
+ * nand_write_page_raw_syndrome - [INTERN] raw page write function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: data buffer
+ * @oob_required: must write chip->oob_poi to OOB
  *
  * We need a special oob layout and handling even when ECC isn't checked.
  */
-static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
+static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
                                        struct nand_chip *chip,
-                                       const uint8_t *buf)
+                                       const uint8_t *buf, int oob_required)
 {
        int eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1701,15 +1701,18 @@ static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
        size = mtd->oobsize - (oob - chip->oob_poi);
        if (size)
                chip->write_buf(mtd, oob, size);
+
+       return 0;
 }
 /**
- * nand_write_page_swecc - [REPLACABLE] software ecc based page write function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       data buffer
+ * nand_write_page_swecc - [REPLACEABLE] software ECC based page write function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: data buffer
+ * @oob_required: must write chip->oob_poi to OOB
  */
-static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
-                                 const uint8_t *buf)
+static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
+                                 const uint8_t *buf, int oob_required)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1718,24 +1721,25 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
        const uint8_t *p = buf;
        uint32_t *eccpos = chip->ecc.layout->eccpos;
 
-       /* Software ecc calculation */
+       /* Software ECC calculation */
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
 
        for (i = 0; i < chip->ecc.total; i++)
                chip->oob_poi[eccpos[i]] = ecc_calc[i];
 
-       chip->ecc.write_page_raw(mtd, chip, buf);
+       return chip->ecc.write_page_raw(mtd, chip, buf, 1);
 }
 
 /**
- * nand_write_page_hwecc - [REPLACABLE] hardware ecc based page write function
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       data buffer
+ * nand_write_page_hwecc - [REPLACEABLE] hardware ECC based page write function
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: data buffer
+ * @oob_required: must write chip->oob_poi to OOB
  */
-static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
-                                 const uint8_t *buf)
+static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
+                                 const uint8_t *buf, int oob_required)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1754,19 +1758,23 @@ static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
                chip->oob_poi[eccpos[i]] = ecc_calc[i];
 
        chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+       return 0;
 }
 
 /**
- * nand_write_page_syndrome - [REPLACABLE] hardware ecc syndrom based page write
- * @mtd:       mtd info structure
- * @chip:      nand chip info structure
- * @buf:       data buffer
+ * nand_write_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page write
+ * @mtd: mtd info structure
+ * @chip: nand chip info structure
+ * @buf: data buffer
+ * @oob_required: must write chip->oob_poi to OOB
  *
- * The hw generator calculates the error syndrome automatically. Therefor
- * we need a special oob layout and handling.
+ * The hw generator calculates the error syndrome automatically. Therefore we
+ * need a special oob layout and handling.
  */
-static void nand_write_page_syndrome(struct mtd_info *mtd,
-                                   struct nand_chip *chip, const uint8_t *buf)
+static int nand_write_page_syndrome(struct mtd_info *mtd,
+                                   struct nand_chip *chip,
+                                   const uint8_t *buf, int oob_required)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -1798,32 +1806,39 @@ static void nand_write_page_syndrome(struct mtd_info *mtd,
        i = mtd->oobsize - (oob - chip->oob_poi);
        if (i)
                chip->write_buf(mtd, oob, i);
+
+       return 0;
 }
 
 /**
  * nand_write_page - [REPLACEABLE] write one page
- * @mtd:       MTD device structure
- * @chip:      NAND chip descriptor
- * @buf:       the data to write
- * @page:      page number to write
- * @cached:    cached programming
- * @raw:       use _raw version of write_page
+ * @mtd: MTD device structure
+ * @chip: NAND chip descriptor
+ * @buf: the data to write
+ * @oob_required: must write chip->oob_poi to OOB
+ * @page: page number to write
+ * @cached: cached programming
+ * @raw: use _raw version of write_page
  */
 static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-                          const uint8_t *buf, int page, int cached, int raw)
+                          const uint8_t *buf, int oob_required, int page,
+                          int cached, int raw)
 {
        int status;
 
        chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
 
        if (unlikely(raw))
-               chip->ecc.write_page_raw(mtd, chip, buf);
+               status = chip->ecc.write_page_raw(mtd, chip, buf, oob_required);
        else
-               chip->ecc.write_page(mtd, chip, buf);
+               status = chip->ecc.write_page(mtd, chip, buf, oob_required);
+
+       if (status < 0)
+               return status;
 
        /*
-        * Cached progamming disabled for now, Not sure if its worth the
-        * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s)
+        * Cached progamming disabled for now. Not sure if it's worth the
+        * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s).
         */
        cached = 0;
 
@@ -1833,7 +1848,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
                status = chip->waitfunc(mtd, chip);
                /*
                 * See if operation failed and additional status checks are
-                * available
+                * available.
                 */
                if ((status & NAND_STATUS_FAIL) && (chip->errstat))
                        status = chip->errstat(mtd, chip, FL_WRITING, status,
@@ -1852,34 +1867,45 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 
        if (chip->verify_buf(mtd, buf, mtd->writesize))
                return -EIO;
+
+       /* Make sure the next page prog is preceded by a status read */
+       chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
 #endif
        return 0;
 }
 
 /**
- * nand_fill_oob - [Internal] Transfer client buffer to oob
- * @chip:      nand chip structure
- * @oob:       oob data buffer
- * @len:       oob data write length
- * @ops:       oob ops structure
+ * nand_fill_oob - [INTERN] Transfer client buffer to oob
+ * @mtd: MTD device structure
+ * @oob: oob data buffer
+ * @len: oob data write length
+ * @ops: oob ops structure
  */
-static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len,
-                                               struct mtd_oob_ops *ops)
+static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
+                             struct mtd_oob_ops *ops)
 {
+       struct nand_chip *chip = mtd->priv;
+
+       /*
+        * Initialise to all 0xFF, to avoid the possibility of left over OOB
+        * data from a previous OOB read.
+        */
+       memset(chip->oob_poi, 0xff, mtd->oobsize);
+
        switch (ops->mode) {
 
-       case MTD_OOB_PLACE:
-       case MTD_OOB_RAW:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_RAW:
                memcpy(chip->oob_poi + ops->ooboffs, oob, len);
                return oob + len;
 
-       case MTD_OOB_AUTO: {
+       case MTD_OPS_AUTO_OOB: {
                struct nand_oobfree *free = chip->ecc.layout->oobfree;
                uint32_t boffs = 0, woffs = ops->ooboffs;
                size_t bytes = 0;
 
                for (; free->length && len; free++, len -= bytes) {
-                       /* Write request not from offset 0 ? */
+                       /* Write request not from offset 0? */
                        if (unlikely(woffs)) {
                                if (woffs >= free->length) {
                                        woffs -= free->length;
@@ -1907,12 +1933,12 @@ static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len,
 #define NOTALIGNED(x)  ((x & (chip->subpagesize - 1)) != 0)
 
 /**
- * nand_do_write_ops - [Internal] NAND write with ECC
- * @mtd:       MTD device structure
- * @to:                offset to write to
- * @ops:       oob operations description structure
+ * nand_do_write_ops - [INTERN] NAND write with ECC
+ * @mtd: MTD device structure
+ * @to: offset to write to
+ * @ops: oob operations description structure
  *
- * NAND write with ECC
+ * NAND write with ECC.
  */
 static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
                             struct mtd_oob_ops *ops)
@@ -1922,12 +1948,13 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
        uint32_t writelen = ops->len;
 
        uint32_t oobwritelen = ops->ooblen;
-       uint32_t oobmaxlen = ops->mode == MTD_OOB_AUTO ?
+       uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?
                                mtd->oobavail : mtd->oobsize;
 
        uint8_t *oob = ops->oobbuf;
        uint8_t *buf = ops->datbuf;
        int ret, subpage;
+       int oob_required = oob ? 1 : 0;
 
        ops->retlen = 0;
        if (!writelen)
@@ -1957,10 +1984,6 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
            (chip->pagebuf << chip->page_shift) < (to + ops->len))
                chip->pagebuf = -1;
 
-       /* If we're not given explicit OOB data, let it be 0xFF */
-       if (likely(!oob))
-               memset(chip->oob_poi, 0xff, mtd->oobsize);
-
        /* Don't allow multipage oob writes with offset */
        if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen))
                return -EINVAL;
@@ -1972,8 +1995,8 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
                int cached = writelen > bytes && page != blockmask;
                uint8_t *wbuf = buf;
 
-               /* Partial page write ? */
-               if (unlikely(column || writelen < (mtd->writesize - 1))) {
+               /* Partial page write? */
+               if (unlikely(column || writelen < mtd->writesize)) {
                        cached = 0;
                        bytes = min_t(int, bytes - column, (int) writelen);
                        chip->pagebuf = -1;
@@ -1984,12 +2007,15 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
 
                if (unlikely(oob)) {
                        size_t len = min(oobwritelen, oobmaxlen);
-                       oob = nand_fill_oob(chip, oob, len, ops);
+                       oob = nand_fill_oob(mtd, oob, len, ops);
                        oobwritelen -= len;
+               } else {
+                       /* We still need to erase leftover OOB data */
+                       memset(chip->oob_poi, 0xff, mtd->oobsize);
                }
 
-               ret = chip->write_page(mtd, chip, wbuf, page, cached,
-                                      (ops->mode == MTD_OOB_RAW));
+               ret = chip->write_page(mtd, chip, wbuf, oob_required, page,
+                                      cached, (ops->mode == MTD_OPS_RAW));
                if (ret)
                        break;
 
@@ -2018,48 +2044,39 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
 
 /**
  * nand_write - [MTD Interface] NAND write with ECC
- * @mtd:       MTD device structure
- * @to:                offset to write to
- * @len:       number of bytes to write
- * @retlen:    pointer to variable to store the number of written bytes
- * @buf:       the data to write
+ * @mtd: MTD device structure
+ * @to: offset to write to
+ * @len: number of bytes to write
+ * @retlen: pointer to variable to store the number of written bytes
+ * @buf: the data to write
  *
- * NAND write with ECC
+ * NAND write with ECC.
  */
 static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
                          size_t *retlen, const uint8_t *buf)
 {
        struct nand_chip *chip = mtd->priv;
+       struct mtd_oob_ops ops;
        int ret;
 
-       /* Do not allow writes past end of device */
-       if ((to + len) > mtd->size)
-               return -EINVAL;
-       if (!len)
-               return 0;
-
        nand_get_device(chip, mtd, FL_WRITING);
-
-       chip->ops.len = len;
-       chip->ops.datbuf = (uint8_t *)buf;
-       chip->ops.oobbuf = NULL;
-
-       ret = nand_do_write_ops(mtd, to, &chip->ops);
-
-       *retlen = chip->ops.retlen;
-
+       ops.len = len;
+       ops.datbuf = (uint8_t *)buf;
+       ops.oobbuf = NULL;
+       ops.mode = MTD_OPS_PLACE_OOB;
+       ret = nand_do_write_ops(mtd, to, &ops);
+       *retlen = ops.retlen;
        nand_release_device(mtd);
-
        return ret;
 }
 
 /**
  * nand_do_write_oob - [MTD Interface] NAND write out-of-band
- * @mtd:       MTD device structure
- * @to:                offset to write to
- * @ops:       oob operation description structure
+ * @mtd: MTD device structure
+ * @to: offset to write to
+ * @ops: oob operation description structure
  *
- * NAND write out-of-band
+ * NAND write out-of-band.
  */
 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
                             struct mtd_oob_ops *ops)
@@ -2070,7 +2087,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
        MTDDEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n",
                         __func__, (unsigned int)to, (int)ops->ooblen);
 
-       if (ops->mode == MTD_OOB_AUTO)
+       if (ops->mode == MTD_OPS_AUTO_OOB)
                len = chip->ecc.layout->oobavail;
        else
                len = mtd->oobsize;
@@ -2120,10 +2137,12 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
        if (page == chip->pagebuf)
                chip->pagebuf = -1;
 
-       memset(chip->oob_poi, 0xff, mtd->oobsize);
-       nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops);
-       status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
-       memset(chip->oob_poi, 0xff, mtd->oobsize);
+       nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops);
+
+       if (ops->mode == MTD_OPS_RAW)
+               status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask);
+       else
+               status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
 
        if (status)
                return status;
@@ -2135,9 +2154,9 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
 
 /**
  * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band
- * @mtd:       MTD device structure
- * @to:                offset to write to
- * @ops:       oob operation description structure
+ * @mtd: MTD device structure
+ * @to: offset to write to
+ * @ops: oob operation description structure
  */
 static int nand_write_oob(struct mtd_info *mtd, loff_t to,
                          struct mtd_oob_ops *ops)
@@ -2157,9 +2176,9 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,
        nand_get_device(chip, mtd, FL_WRITING);
 
        switch (ops->mode) {
-       case MTD_OOB_PLACE:
-       case MTD_OOB_AUTO:
-       case MTD_OOB_RAW:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_AUTO_OOB:
+       case MTD_OPS_RAW:
                break;
 
        default:
@@ -2177,11 +2196,11 @@ out:
 }
 
 /**
- * single_erease_cmd - [GENERIC] NAND standard block erase command function
- * @mtd:       MTD device structure
- * @page:      the page address of the block which will be erased
+ * single_erase_cmd - [GENERIC] NAND standard block erase command function
+ * @mtd: MTD device structure
+ * @page: the page address of the block which will be erased
  *
- * Standard erase command for NAND chips
+ * Standard erase command for NAND chips.
  */
 static void single_erase_cmd(struct mtd_info *mtd, int page)
 {
@@ -2192,12 +2211,11 @@ static void single_erase_cmd(struct mtd_info *mtd, int page)
 }
 
 /**
- * multi_erease_cmd - [GENERIC] AND specific block erase command function
- * @mtd:       MTD device structure
- * @page:      the page address of the block which will be erased
+ * multi_erase_cmd - [GENERIC] AND specific block erase command function
+ * @mtd: MTD device structure
+ * @page: the page address of the block which will be erased
  *
- * AND multi block erase command function
- * Erase 4 consecutive blocks
+ * AND multi block erase command function. Erase 4 consecutive blocks.
  */
 static void multi_erase_cmd(struct mtd_info *mtd, int page)
 {
@@ -2212,10 +2230,10 @@ static void multi_erase_cmd(struct mtd_info *mtd, int page)
 
 /**
  * nand_erase - [MTD Interface] erase block(s)
- * @mtd:       MTD device structure
- * @instr:     erase instruction
+ * @mtd: MTD device structure
+ * @instr: erase instruction
  *
- * Erase one ore more blocks
+ * Erase one ore more blocks.
  */
 static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
@@ -2224,12 +2242,12 @@ static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
 
 #define BBT_PAGE_MASK  0xffffff3f
 /**
- * nand_erase_nand - [Internal] erase block(s)
- * @mtd:       MTD device structure
- * @instr:     erase instruction
- * @allowbbt:  allow erasing the bbt area
+ * nand_erase_nand - [INTERN] erase block(s)
+ * @mtd: MTD device structure
+ * @instr: erase instruction
+ * @allowbbt: allow erasing the bbt area
  *
- * Erase one ore more blocks
+ * Erase one ore more blocks.
  */
 int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
                    int allowbbt)
@@ -2247,8 +2265,6 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
        if (check_offs_len(mtd, instr->addr, instr->len))
                return -EINVAL;
 
-       instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
-
        /* Grab the lock and see if the device is available */
        nand_get_device(chip, mtd, FL_ERASING);
 
@@ -2274,7 +2290,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
         * If BBT requires refresh, set the BBT page mask to see if the BBT
         * should be rewritten. Otherwise the mask is set to 0xffffffff which
         * can not be matched. This is also done when the bbt is actually
-        * erased to avoid recusrsive updates
+        * erased to avoid recursive updates.
         */
        if (chip->options & BBT_AUTO_REFRESH && !allowbbt)
                bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
@@ -2286,20 +2302,18 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
 
        while (len) {
                WATCHDOG_RESET();
-               /*
-                * heck if we have a bad block, we do not erase bad blocks !
-                */
+               /* Check if we have a bad block, we do not erase bad blocks! */
                if (!instr->scrub && nand_block_checkbad(mtd, ((loff_t) page) <<
                                        chip->page_shift, 0, allowbbt)) {
-                       printk(KERN_WARNING "%s: attempt to erase a bad block "
-                                       "at page 0x%08x\n", __func__, page);
+                       pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
+                                  __func__, page);
                        instr->state = MTD_ERASE_FAILED;
                        goto erase_exit;
                }
 
                /*
                 * Invalidate the page cache, if we erase the block which
-                * contains the current cached page
+                * contains the current cached page.
                 */
                if (page <= chip->pagebuf && chip->pagebuf <
                    (page + pages_per_block))
@@ -2329,7 +2343,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
 
                /*
                 * If BBT requires refresh, set the BBT rewrite flag to the
-                * page being erased
+                * page being erased.
                 */
                if (bbt_masked_page != 0xffffffff &&
                    (page & BBT_PAGE_MASK) == bbt_masked_page)
@@ -2348,7 +2362,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
 
                        /*
                         * If BBT requires refresh and BBT-PERCHIP, set the BBT
-                        * page mask to see if this BBT should be rewritten
+                        * page mask to see if this BBT should be rewritten.
                         */
                        if (bbt_masked_page != 0xffffffff &&
                            (chip->bbt_td->options & NAND_BBT_PERCHIP))
@@ -2371,7 +2385,7 @@ erase_exit:
 
        /*
         * If BBT requires refresh and erase was successful, rewrite any
-        * selected bad block tables
+        * selected bad block tables.
         */
        if (bbt_masked_page == 0xffffffff || ret)
                return ret;
@@ -2379,7 +2393,7 @@ erase_exit:
        for (chipnr = 0; chipnr < chip->numchips; chipnr++) {
                if (!rewrite_bbt[chipnr])
                        continue;
-               /* update the BBT for chip */
+               /* Update the BBT for chip */
                MTDDEBUG(MTD_DEBUG_LEVEL0, "%s: nand_update_bbt "
                        "(%d:0x%0llx 0x%0x)\n", __func__, chipnr,
                        rewrite_bbt[chipnr], chip->bbt_td->pages[chipnr]);
@@ -2392,9 +2406,9 @@ erase_exit:
 
 /**
  * nand_sync - [MTD Interface] sync
- * @mtd:       MTD device structure
+ * @mtd: MTD device structure
  *
- * Sync is actually a wait for chip ready function
+ * Sync is actually a wait for chip ready function.
  */
 static void nand_sync(struct mtd_info *mtd)
 {
@@ -2410,22 +2424,18 @@ static void nand_sync(struct mtd_info *mtd)
 
 /**
  * nand_block_isbad - [MTD Interface] Check if block at offset is bad
- * @mtd:       MTD device structure
- * @offs:      offset relative to mtd start
+ * @mtd: MTD device structure
+ * @offs: offset relative to mtd start
  */
 static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
 {
-       /* Check for invalid offset */
-       if (offs > mtd->size)
-               return -EINVAL;
-
        return nand_block_checkbad(mtd, offs, 1, 0);
 }
 
 /**
  * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad
- * @mtd:       MTD device structure
- * @ofs:       offset relative to mtd start
+ * @mtd: MTD device structure
+ * @ofs: offset relative to mtd start
  */
 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 {
@@ -2434,7 +2444,7 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 
        ret = nand_block_isbad(mtd, ofs);
        if (ret) {
-               /* If it was bad already, return success and do nothing. */
+               /* If it was bad already, return success and do nothing */
                if (ret > 0)
                        return 0;
                return ret;
@@ -2443,9 +2453,51 @@ static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
        return chip->block_markbad(mtd, ofs);
 }
 
-/*
- * Set default functions
+ /**
+ * nand_onfi_set_features- [REPLACEABLE] set features for ONFI nand
+ * @mtd: MTD device structure
+ * @chip: nand chip info structure
+ * @addr: feature address.
+ * @subfeature_param: the subfeature parameters, a four bytes array.
  */
+static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
+                       int addr, uint8_t *subfeature_param)
+{
+       int status;
+
+       if (!chip->onfi_version)
+               return -EINVAL;
+
+       chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
+       chip->write_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
+       status = chip->waitfunc(mtd, chip);
+       if (status & NAND_STATUS_FAIL)
+               return -EIO;
+       return 0;
+}
+
+/**
+ * nand_onfi_get_features- [REPLACEABLE] get features for ONFI nand
+ * @mtd: MTD device structure
+ * @chip: nand chip info structure
+ * @addr: feature address.
+ * @subfeature_param: the subfeature parameters, a four bytes array.
+ */
+static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
+                       int addr, uint8_t *subfeature_param)
+{
+       if (!chip->onfi_version)
+               return -EINVAL;
+
+       /* clear the sub feature parameters */
+       memset(subfeature_param, 0, ONFI_SUBFEATURE_PARAM_LEN);
+
+       chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
+       chip->read_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
+       return 0;
+}
+
+/* Set default functions */
 static void nand_set_defaults(struct nand_chip *chip, int busw)
 {
        /* check for proper chip_delay setup, set 20us if not */
@@ -2483,23 +2535,21 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)
 }
 
 #ifdef CONFIG_SYS_NAND_ONFI_DETECTION
-/*
- * sanitize ONFI strings so we can safely print them
- */
+/* Sanitize ONFI strings so we can safely print them */
 static void sanitize_string(char *s, size_t len)
 {
        ssize_t i;
 
-       /* null terminate */
+       /* Null terminate */
        s[len - 1] = 0;
 
-       /* remove non printable chars */
+       /* Remove non printable chars */
        for (i = 0; i < len - 1; i++) {
                if (s[i] < ' ' || s[i] > 127)
                        s[i] = '?';
        }
 
-       /* remove trailing spaces */
+       /* Remove trailing spaces */
        strim(s);
 }
 
@@ -2516,7 +2566,7 @@ static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)
 }
 
 /*
- * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise
+ * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
  */
 static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
                                        int *busw)
@@ -2525,20 +2575,18 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
        int i;
        int val;
 
-       /* try ONFI for unknow chip or LP */
+       /* Try ONFI for unknown chip or LP */
        chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1);
        if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' ||
                chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')
                return 0;
 
-       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)) {
-                       MTDDEBUG(MTD_DEBUG_LEVEL0,
-                                "ONFI param page %d valid\n", i);
+                       pr_info("ONFI param page %d valid\n", i);
                        break;
                }
        }
@@ -2546,7 +2594,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
        if (i == 3)
                return 0;
 
-       /* check version */
+       /* Check version */
        val = le16_to_cpu(p->revision);
        if (val & (1 << 5))
                chip->onfi_version = 23;
@@ -2562,8 +2610,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
                chip->onfi_version = 0;
 
        if (!chip->onfi_version) {
-               printk(KERN_INFO "%s: unsupported ONFI version: %d\n",
-                                                               __func__, val);
+               pr_info("%s: unsupported ONFI version: %d\n", __func__, val);
                return 0;
        }
 
@@ -2580,8 +2627,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
        if (le16_to_cpu(p->features) & 1)
                *busw = NAND_BUSWIDTH_16;
 
-       chip->options |= NAND_NO_READRDY | NAND_NO_AUTOINCR;
-
+       pr_info("ONFI flash detected\n");
        return 1;
 }
 #else
@@ -2594,7 +2640,248 @@ static inline int nand_flash_detect_onfi(struct mtd_info *mtd,
 #endif
 
 /*
- * Get the flash and manufacturer id and lookup if the type is supported
+ * nand_id_has_period - Check if an ID string has a given wraparound period
+ * @id_data: the ID string
+ * @arrlen: the length of the @id_data array
+ * @period: the period of repitition
+ *
+ * Check if an ID string is repeated within a given sequence of bytes at
+ * specific repetition interval period (e.g., {0x20,0x01,0x7F,0x20} has a
+ * period of 2). This is a helper function for nand_id_len(). Returns non-zero
+ * if the repetition has a period of @period; otherwise, returns zero.
+ */
+static int nand_id_has_period(u8 *id_data, int arrlen, int period)
+{
+       int i, j;
+       for (i = 0; i < period; i++)
+               for (j = i + period; j < arrlen; j += period)
+                       if (id_data[i] != id_data[j])
+                               return 0;
+       return 1;
+}
+
+/*
+ * nand_id_len - Get the length of an ID string returned by CMD_READID
+ * @id_data: the ID string
+ * @arrlen: the length of the @id_data array
+
+ * Returns the length of the ID string, according to known wraparound/trailing
+ * zero patterns. If no pattern exists, returns the length of the array.
+ */
+static int nand_id_len(u8 *id_data, int arrlen)
+{
+       int last_nonzero, period;
+
+       /* Find last non-zero byte */
+       for (last_nonzero = arrlen - 1; last_nonzero >= 0; last_nonzero--)
+               if (id_data[last_nonzero])
+                       break;
+
+       /* All zeros */
+       if (last_nonzero < 0)
+               return 0;
+
+       /* Calculate wraparound period */
+       for (period = 1; period < arrlen; period++)
+               if (nand_id_has_period(id_data, arrlen, period))
+                       break;
+
+       /* There's a repeated pattern */
+       if (period < arrlen)
+               return period;
+
+       /* There are trailing zeros */
+       if (last_nonzero < arrlen - 1)
+               return last_nonzero + 1;
+
+       /* No pattern detected */
+       return arrlen;
+}
+
+/*
+ * Many new NAND share similar device ID codes, which represent the size of the
+ * chip. The rest of the parameters must be decoded according to generic or
+ * manufacturer-specific "extended ID" decoding patterns.
+ */
+static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
+                               u8 id_data[8], int *busw)
+{
+       int extid, id_len;
+       /* The 3rd id byte holds MLC / multichip data */
+       chip->cellinfo = id_data[2];
+       /* The 4th id byte is the important one */
+       extid = id_data[3];
+
+       id_len = nand_id_len(id_data, 8);
+
+       /*
+        * Field definitions are in the following datasheets:
+        * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
+        * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44)
+        * Hynix MLC   (6 byte ID): Hynix H27UBG8T2B (p.22)
+        *
+        * Check for ID length, non-zero 6th byte, cell type, and Hynix/Samsung
+        * ID to decide what to do.
+        */
+       if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG &&
+                       (chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
+                       id_data[5] != 0x00) {
+               /* Calc pagesize */
+               mtd->writesize = 2048 << (extid & 0x03);
+               extid >>= 2;
+               /* Calc oobsize */
+               switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
+               case 1:
+                       mtd->oobsize = 128;
+                       break;
+               case 2:
+                       mtd->oobsize = 218;
+                       break;
+               case 3:
+                       mtd->oobsize = 400;
+                       break;
+               case 4:
+                       mtd->oobsize = 436;
+                       break;
+               case 5:
+                       mtd->oobsize = 512;
+                       break;
+               case 6:
+               default: /* Other cases are "reserved" (unknown) */
+                       mtd->oobsize = 640;
+                       break;
+               }
+               extid >>= 2;
+               /* Calc blocksize */
+               mtd->erasesize = (128 * 1024) <<
+                       (((extid >> 1) & 0x04) | (extid & 0x03));
+               *busw = 0;
+       } else if (id_len == 6 && id_data[0] == NAND_MFR_HYNIX &&
+                       (chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
+               unsigned int tmp;
+
+               /* Calc pagesize */
+               mtd->writesize = 2048 << (extid & 0x03);
+               extid >>= 2;
+               /* Calc oobsize */
+               switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
+               case 0:
+                       mtd->oobsize = 128;
+                       break;
+               case 1:
+                       mtd->oobsize = 224;
+                       break;
+               case 2:
+                       mtd->oobsize = 448;
+                       break;
+               case 3:
+                       mtd->oobsize = 64;
+                       break;
+               case 4:
+                       mtd->oobsize = 32;
+                       break;
+               case 5:
+                       mtd->oobsize = 16;
+                       break;
+               default:
+                       mtd->oobsize = 640;
+                       break;
+               }
+               extid >>= 2;
+               /* Calc blocksize */
+               tmp = ((extid >> 1) & 0x04) | (extid & 0x03);
+               if (tmp < 0x03)
+                       mtd->erasesize = (128 * 1024) << tmp;
+               else if (tmp == 0x03)
+                       mtd->erasesize = 768 * 1024;
+               else
+                       mtd->erasesize = (64 * 1024) << tmp;
+               *busw = 0;
+       } else {
+               /* Calc pagesize */
+               mtd->writesize = 1024 << (extid & 0x03);
+               extid >>= 2;
+               /* Calc oobsize */
+               mtd->oobsize = (8 << (extid & 0x01)) *
+                       (mtd->writesize >> 9);
+               extid >>= 2;
+               /* Calc blocksize. Blocksize is multiples of 64KiB */
+               mtd->erasesize = (64 * 1024) << (extid & 0x03);
+               extid >>= 2;
+               /* Get buswidth information */
+               *busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;
+       }
+}
+
+ /*
+ * Old devices have chip data hardcoded in the device ID table. nand_decode_id
+ * decodes a matching ID table entry and assigns the MTD size parameters for
+ * the chip.
+ */
+static void nand_decode_id(struct mtd_info *mtd, struct nand_chip *chip,
+                               const struct nand_flash_dev *type, u8 id_data[8],
+                               int *busw)
+{
+       int maf_id = id_data[0];
+
+       mtd->erasesize = type->erasesize;
+       mtd->writesize = type->pagesize;
+       mtd->oobsize = mtd->writesize / 32;
+       *busw = type->options & NAND_BUSWIDTH_16;
+
+       /*
+        * Check for Spansion/AMD ID + repeating 5th, 6th byte since
+        * some Spansion chips have erasesize that conflicts with size
+        * listed in nand_ids table.
+        * Data sheet (5 byte ID): Spansion S30ML-P ORNAND (p.39)
+        */
+       if (maf_id == NAND_MFR_AMD && id_data[4] != 0x00 && id_data[5] == 0x00
+                       && id_data[6] == 0x00 && id_data[7] == 0x00
+                       && mtd->writesize == 512) {
+               mtd->erasesize = 128 * 1024;
+               mtd->erasesize <<= ((id_data[3] & 0x03) << 1);
+       }
+}
+
+ /*
+ * Set the bad block marker/indicator (BBM/BBI) patterns according to some
+ * heuristic patterns using various detected parameters (e.g., manufacturer,
+ * page size, cell-type information).
+ */
+static void nand_decode_bbm_options(struct mtd_info *mtd,
+                                   struct nand_chip *chip, u8 id_data[8])
+{
+       int maf_id = id_data[0];
+
+       /* Set the bad block position */
+       if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16))
+               chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
+       else
+               chip->badblockpos = NAND_SMALL_BADBLOCK_POS;
+
+       /*
+        * Bad block marker is stored in the last page of each block on Samsung
+        * and Hynix MLC devices; stored in first two pages of each block on
+        * Micron devices with 2KiB pages and on SLC Samsung, Hynix, Toshiba,
+        * AMD/Spansion, and Macronix.  All others scan only the first page.
+        */
+       if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
+                       (maf_id == NAND_MFR_SAMSUNG ||
+                        maf_id == NAND_MFR_HYNIX))
+               chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
+       else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
+                               (maf_id == NAND_MFR_SAMSUNG ||
+                                maf_id == NAND_MFR_HYNIX ||
+                                maf_id == NAND_MFR_TOSHIBA ||
+                                maf_id == NAND_MFR_AMD ||
+                                maf_id == NAND_MFR_MACRONIX)) ||
+                       (mtd->writesize == 2048 &&
+                        maf_id == NAND_MFR_MICRON))
+               chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
+}
+
+/*
+ * Get the flash and manufacturer id and lookup if the type is supported.
  */
 static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
                                                  struct nand_chip *chip,
@@ -2605,14 +2892,13 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
        const char *name;
        int i, maf_idx;
        u8 id_data[8];
-       int ret;
 
        /* Select the device */
        chip->select_chip(mtd, 0);
 
        /*
         * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
-        * after power-up
+        * after power-up.
         */
        chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
 
@@ -2623,7 +2909,8 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
        *maf_id = chip->read_byte(mtd);
        *dev_id = chip->read_byte(mtd);
 
-       /* Try again to make sure, as some systems the bus-hold or other
+       /*
+        * Try again to make sure, as some systems the bus-hold or other
         * interface concerns can cause random data which looks like a
         * possibly credible NAND flash to appear. If the two results do
         * not match, ignore the device completely.
@@ -2631,13 +2918,14 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 
        chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 
-       for (i = 0; i < 2; i++)
+       /* Read entire ID string */
+       for (i = 0; i < 8; i++)
                id_data[i] = chip->read_byte(mtd);
 
        if (id_data[0] != *maf_id || id_data[1] != *dev_id) {
-               printk(KERN_INFO "%s: second ID read did not match "
-                      "%02x,%02x against %02x,%02x\n", __func__,
-                      *maf_id, *dev_id, id_data[0], id_data[1]);
+               pr_info("%s: second ID read did not match "
+                       "%02x,%02x against %02x,%02x\n", __func__,
+                       *maf_id, *dev_id, id_data[0], id_data[1]);
                return ERR_PTR(-ENODEV);
        }
 
@@ -2651,18 +2939,10 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
        chip->onfi_version = 0;
        if (!type->name || !type->pagesize) {
                /* Check is chip is ONFI compliant */
-               ret = nand_flash_detect_onfi(mtd, chip, &busw);
-               if (ret)
+               if (nand_flash_detect_onfi(mtd, chip, &busw))
                        goto ident_done;
        }
 
-       chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
-
-       /* Read entire ID string */
-
-       for (i = 0; i < 8; i++)
-               id_data[i] = chip->read_byte(mtd);
-
        if (!type->name)
                return ERR_PTR(-ENODEV);
 
@@ -2672,101 +2952,25 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
        chip->chipsize = (uint64_t)type->chipsize << 20;
 
        if (!type->pagesize && chip->init_size) {
-               /* set the pagesize, oobsize, erasesize by the driver*/
+               /* Set the pagesize, oobsize, erasesize by the driver */
                busw = chip->init_size(mtd, chip, id_data);
        } else if (!type->pagesize) {
-               int extid;
-               /* The 3rd id byte holds MLC / multichip data */
-               chip->cellinfo = id_data[2];
-               /* The 4th id byte is the important one */
-               extid = id_data[3];
-
-               /*
-                * Field definitions are in the following datasheets:
-                * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
-                * New style   (6 byte ID): Samsung K9GBG08U0M (p.40)
-                *
-                * Check for wraparound + Samsung ID + nonzero 6th byte
-                * to decide what to do.
-                */
-               if (id_data[0] == id_data[6] && id_data[1] == id_data[7] &&
-                               id_data[0] == NAND_MFR_SAMSUNG &&
-                               (chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
-                               id_data[5] != 0x00) {
-                       /* Calc pagesize */
-                       mtd->writesize = 2048 << (extid & 0x03);
-                       extid >>= 2;
-                       /* Calc oobsize */
-                       switch (extid & 0x03) {
-                       case 1:
-                               mtd->oobsize = 128;
-                               break;
-                       case 2:
-                               mtd->oobsize = 218;
-                               break;
-                       case 3:
-                               mtd->oobsize = 400;
-                               break;
-                       default:
-                               mtd->oobsize = 436;
-                               break;
-                       }
-                       extid >>= 2;
-                       /* Calc blocksize */
-                       mtd->erasesize = (128 * 1024) <<
-                               (((extid >> 1) & 0x04) | (extid & 0x03));
-                       busw = 0;
-               } else {
-                       /* Calc pagesize */
-                       mtd->writesize = 1024 << (extid & 0x03);
-                       extid >>= 2;
-                       /* Calc oobsize */
-                       mtd->oobsize = (8 << (extid & 0x01)) *
-                               (mtd->writesize >> 9);
-                       extid >>= 2;
-                       /* Calc blocksize. Blocksize is multiples of 64KiB */
-                       mtd->erasesize = (64 * 1024) << (extid & 0x03);
-                       extid >>= 2;
-                       /* Get buswidth information */
-                       busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;
-               }
+               /* Decode parameters from extended ID */
+               nand_decode_ext_id(mtd, chip, id_data, &busw);
        } else {
-               /*
-                * Old devices have chip data hardcoded in the device id table
-                */
-               mtd->erasesize = type->erasesize;
-               mtd->writesize = type->pagesize;
-               mtd->oobsize = mtd->writesize / 32;
-               busw = type->options & NAND_BUSWIDTH_16;
-
-               /*
-                * Check for Spansion/AMD ID + repeating 5th, 6th byte since
-                * some Spansion chips have erasesize that conflicts with size
-                * listed in nand_ids table
-                * Data sheet (5 byte ID): Spansion S30ML-P ORNAND (p.39)
-                */
-               if (*maf_id == NAND_MFR_AMD && id_data[4] != 0x00 &&
-                               id_data[5] == 0x00 && id_data[6] == 0x00 &&
-                               id_data[7] == 0x00 && mtd->writesize == 512) {
-                       mtd->erasesize = 128 * 1024;
-                       mtd->erasesize <<= ((id_data[3] & 0x03) << 1);
-               }
+               nand_decode_id(mtd, chip, type, id_data, &busw);
        }
        /* Get chip options, preserve non chip based options */
        chip->options |= type->options;
 
-       /* Check if chip is a not a samsung device. Do not clear the
-        * options for chips which are not having an extended id.
+       /*
+        * Check if chip is not a Samsung device. Do not clear the
+        * options for chips which do not have an extended id.
         */
        if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
                chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
 ident_done:
 
-       /*
-        * Set chip as a default. Board drivers can override it, if necessary
-        */
-       chip->options |= NAND_NO_AUTOINCR;
-
        /* Try to identify manufacturer */
        for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) {
                if (nand_manuf_ids[maf_idx].id == *maf_id)
@@ -2775,21 +2979,23 @@ ident_done:
 
        /*
         * Check, if buswidth is correct. Hardware drivers should set
-        * chip correct !
+        * chip correct!
         */
        if (busw != (chip->options & NAND_BUSWIDTH_16)) {
-               printk(KERN_INFO "NAND device: Manufacturer ID:"
-                      " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
-                      *dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
-               printk(KERN_WARNING "NAND bus width %d instead %d bit\n",
-                      (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
-                      busw ? 16 : 8);
+               pr_info("NAND device: Manufacturer ID:"
+                       " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
+                       *dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
+               pr_warn("NAND bus width %d instead %d bit\n",
+                          (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
+                          busw ? 16 : 8);
                return ERR_PTR(-EINVAL);
        }
 
+       nand_decode_bbm_options(mtd, chip, id_data);
+
        /* Calculate the address shift from the page size */
        chip->page_shift = ffs(mtd->writesize) - 1;
-       /* Convert chipsize to number of pages per chip -1. */
+       /* Convert chipsize to number of pages per chip -1 */
        chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;
 
        chip->bbt_erase_shift = chip->phys_erase_shift =
@@ -2803,73 +3009,38 @@ ident_done:
 
        chip->badblockbits = 8;
 
-       /* Set the bad block position */
-       if (mtd->writesize > 512 || (busw & NAND_BUSWIDTH_16))
-               chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
-       else
-               chip->badblockpos = NAND_SMALL_BADBLOCK_POS;
-
-       /*
-        * Bad block marker is stored in the last page of each block
-        * on Samsung and Hynix MLC devices; stored in first two pages
-        * of each block on Micron devices with 2KiB pages and on
-        * SLC Samsung, Hynix, Toshiba and AMD/Spansion. All others scan
-        * only the first page.
-        */
-       if ((chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
-                       (*maf_id == NAND_MFR_SAMSUNG ||
-                        *maf_id == NAND_MFR_HYNIX))
-               chip->options |= NAND_BBT_SCANLASTPAGE;
-       else if ((!(chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
-                               (*maf_id == NAND_MFR_SAMSUNG ||
-                                *maf_id == NAND_MFR_HYNIX ||
-                                *maf_id == NAND_MFR_TOSHIBA ||
-                                *maf_id == NAND_MFR_AMD)) ||
-                       (mtd->writesize == 2048 &&
-                        *maf_id == NAND_MFR_MICRON))
-               chip->options |= NAND_BBT_SCAN2NDPAGE;
-
-       /*
-        * Numonyx/ST 2K pages, x8 bus use BOTH byte 1 and 6
-        */
-       if (!(busw & NAND_BUSWIDTH_16) &&
-                       *maf_id == NAND_MFR_STMICRO &&
-                       mtd->writesize == 2048) {
-               chip->options |= NAND_BBT_SCANBYTE1AND6;
-               chip->badblockpos = 0;
-       }
-
        /* Check for AND chips with 4 page planes */
        if (chip->options & NAND_4PAGE_ARRAY)
                chip->erase_cmd = multi_erase_cmd;
        else
                chip->erase_cmd = single_erase_cmd;
 
-       /* Do not replace user supplied command function ! */
+       /* Do not replace user supplied command function! */
        if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
                chip->cmdfunc = nand_command_lp;
 
-       /* TODO onfi flash name */
        name = type->name;
 #ifdef CONFIG_SYS_NAND_ONFI_DETECTION
        if (chip->onfi_version)
                name = chip->onfi_params.model;
 #endif
-       MTDDEBUG(MTD_DEBUG_LEVEL0, "NAND device: Manufacturer ID:"
-                " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, *dev_id,
-                nand_manuf_ids[maf_idx].name, name);
+       pr_info("NAND device: Manufacturer ID: 0x%02x, Chip ID: 0x%02x (%s %s),"
+               " page size: %d, OOB size: %d\n",
+               *maf_id, *dev_id, nand_manuf_ids[maf_idx].name,
+               name,
+               mtd->writesize, mtd->oobsize);
 
        return type;
 }
 
 /**
  * nand_scan_ident - [NAND Interface] Scan for the NAND device
- * @mtd:            MTD device structure
- * @maxchips:       Number of chips to scan for
- * @table:          Alternative NAND ID table
+ * @mtd: MTD device structure
+ * @maxchips: number of chips to scan for
+ * @table: alternative NAND ID table
  *
- * This is the first phase of the normal nand_scan() function. It
- * reads the flash ID and sets up MTD fields accordingly.
+ * This is the first phase of the normal nand_scan() function. It reads the
+ * flash ID and sets up MTD fields accordingly.
  *
  * The mtd->owner field must be set to the module of the caller.
  */
@@ -2891,7 +3062,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 
        if (IS_ERR(type)) {
 #ifndef CONFIG_SYS_NAND_QUIET_TEST
-               printk(KERN_WARNING "No NAND device found!!!\n");
+               pr_warn("No NAND device found\n");
 #endif
                chip->select_chip(mtd, -1);
                return PTR_ERR(type);
@@ -2911,7 +3082,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
        }
 #ifdef DEBUG
        if (i > 1)
-               printk(KERN_INFO "%d NAND chips detected\n", i);
+               pr_info("%d NAND chips detected\n", i);
 #endif
 
        /* Store the number of chips and calc total size for mtd */
@@ -2924,17 +3095,21 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 
 /**
  * nand_scan_tail - [NAND Interface] Scan for the NAND device
- * @mtd:           MTD device structure
+ * @mtd: MTD device structure
  *
- * This is the second phase of the normal nand_scan() function. It
- * fills out all the uninitialized function pointers with the defaults
- * and scans for a bad block table if appropriate.
+ * This is the second phase of the normal nand_scan() function. It fills out
+ * all the uninitialized function pointers with the defaults and scans for a
+ * bad block table if appropriate.
  */
 int nand_scan_tail(struct mtd_info *mtd)
 {
        int i;
        struct nand_chip *chip = mtd->priv;
 
+       /* New bad blocks should be marked in OOB, flash-based BBT, or both */
+       BUG_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
+                       !(chip->bbt_options & NAND_BBT_USE_FLASH));
+
        if (!(chip->options & NAND_OWN_BUFFERS))
                chip->buffers = memalign(ARCH_DMA_MINALIGN,
                                         sizeof(*chip->buffers));
@@ -2945,7 +3120,7 @@ int nand_scan_tail(struct mtd_info *mtd)
        chip->oob_poi = chip->buffers->databuf + mtd->writesize;
 
        /*
-        * If no default placement scheme is given, select an appropriate one
+        * If no default placement scheme is given, select an appropriate one.
         */
        if (!chip->ecc.layout && (chip->ecc.mode != NAND_ECC_SOFT_BCH)) {
                switch (mtd->oobsize) {
@@ -2962,16 +3137,22 @@ int nand_scan_tail(struct mtd_info *mtd)
                        chip->ecc.layout = &nand_oob_128;
                        break;
                default:
-                       printk(KERN_WARNING "No oob scheme defined for "
-                              "oobsize %d\n", mtd->oobsize);
+                       pr_warn("No oob scheme defined for oobsize %d\n",
+                                  mtd->oobsize);
                }
        }
 
        if (!chip->write_page)
                chip->write_page = nand_write_page;
 
+       /* set for ONFI nand */
+       if (!chip->onfi_set_features)
+               chip->onfi_set_features = nand_onfi_set_features;
+       if (!chip->onfi_get_features)
+               chip->onfi_get_features = nand_onfi_get_features;
+
        /*
-        * check ECC mode, default to software if 3byte/512byte hardware ECC is
+        * Check ECC mode, default to software if 3byte/512byte hardware ECC is
         * selected and we have 256 byte pagesize fallback to software ECC
         */
 
@@ -2980,15 +3161,15 @@ int nand_scan_tail(struct mtd_info *mtd)
                /* Similar to NAND_ECC_HW, but a separate read_page handle */
                if (!chip->ecc.calculate || !chip->ecc.correct ||
                     !chip->ecc.hwctl) {
-                       printk(KERN_WARNING "No ECC functions supplied; "
-                              "Hardware ECC not possible\n");
+                       pr_warn("No ECC functions supplied; "
+                                  "hardware ECC not possible\n");
                        BUG();
                }
                if (!chip->ecc.read_page)
                        chip->ecc.read_page = nand_read_page_hwecc_oob_first;
 
        case NAND_ECC_HW:
-               /* Use standard hwecc read page function ? */
+               /* Use standard hwecc read page function? */
                if (!chip->ecc.read_page)
                        chip->ecc.read_page = nand_read_page_hwecc;
                if (!chip->ecc.write_page)
@@ -3009,11 +3190,11 @@ int nand_scan_tail(struct mtd_info *mtd)
                     chip->ecc.read_page == nand_read_page_hwecc ||
                     !chip->ecc.write_page ||
                     chip->ecc.write_page == nand_write_page_hwecc)) {
-                       printk(KERN_WARNING "No ECC functions supplied; "
-                              "Hardware ECC not possible\n");
+                       pr_warn("No ECC functions supplied; "
+                                  "hardware ECC not possible\n");
                        BUG();
                }
-               /* Use standard syndrome read/write page function ? */
+               /* Use standard syndrome read/write page function? */
                if (!chip->ecc.read_page)
                        chip->ecc.read_page = nand_read_page_syndrome;
                if (!chip->ecc.write_page)
@@ -3027,11 +3208,16 @@ int nand_scan_tail(struct mtd_info *mtd)
                if (!chip->ecc.write_oob)
                        chip->ecc.write_oob = nand_write_oob_syndrome;
 
-               if (mtd->writesize >= chip->ecc.size)
+               if (mtd->writesize >= chip->ecc.size) {
+                       if (!chip->ecc.strength) {
+                               pr_warn("Driver must set ecc.strength when using hardware ECC\n");
+                               BUG();
+                       }
                        break;
-               printk(KERN_WARNING "%d byte HW ECC not possible on "
-                      "%d byte page size, fallback to SW ECC\n",
-                      chip->ecc.size, mtd->writesize);
+               }
+               pr_warn("%d byte HW ECC not possible on "
+                          "%d byte page size, fallback to SW ECC\n",
+                          chip->ecc.size, mtd->writesize);
                chip->ecc.mode = NAND_ECC_SOFT;
 
        case NAND_ECC_SOFT:
@@ -3047,11 +3233,12 @@ int nand_scan_tail(struct mtd_info *mtd)
                if (!chip->ecc.size)
                        chip->ecc.size = 256;
                chip->ecc.bytes = 3;
+               chip->ecc.strength = 1;
                break;
 
        case NAND_ECC_SOFT_BCH:
                if (!mtd_nand_has_bch()) {
-                       printk(KERN_WARNING "CONFIG_MTD_ECC_BCH not enabled\n");
+                       pr_warn("CONFIG_MTD_ECC_BCH not enabled\n");
                        return -EINVAL;
                }
                chip->ecc.calculate = nand_bch_calculate_ecc;
@@ -3066,8 +3253,8 @@ int nand_scan_tail(struct mtd_info *mtd)
                /*
                 * Board driver should supply ecc.size and ecc.bytes values to
                 * select how many bits are correctable; see nand_bch_init()
-                * for details.
-                * Otherwise, default to 4 bits for large page devices
+                * for details. Otherwise, default to 4 bits for large page
+                * devices.
                 */
                if (!chip->ecc.size && (mtd->oobsize >= 64)) {
                        chip->ecc.size = 512;
@@ -3078,13 +3265,14 @@ int nand_scan_tail(struct mtd_info *mtd)
                                               chip->ecc.bytes,
                                               &chip->ecc.layout);
                if (!chip->ecc.priv)
-                       printk(KERN_WARNING "BCH ECC initialization failed!\n");
-
+                       pr_warn("BCH ECC initialization failed!\n");
+               chip->ecc.strength =
+                       chip->ecc.bytes * 8 / fls(8 * chip->ecc.size);
                break;
 
        case NAND_ECC_NONE:
-               printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. "
-                      "This is not recommended !!\n");
+               pr_warn("NAND_ECC_NONE selected by board driver. "
+                       "This is not recommended !!\n");
                chip->ecc.read_page = nand_read_page_raw;
                chip->ecc.write_page = nand_write_page_raw;
                chip->ecc.read_oob = nand_read_oob_std;
@@ -3096,14 +3284,19 @@ int nand_scan_tail(struct mtd_info *mtd)
                break;
 
        default:
-               printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n",
-                      chip->ecc.mode);
+               pr_warn("Invalid NAND_ECC_MODE %d\n", chip->ecc.mode);
                BUG();
        }
 
+       /* For many systems, the standard OOB write also works for raw */
+       if (!chip->ecc.read_oob_raw)
+               chip->ecc.read_oob_raw = chip->ecc.read_oob;
+       if (!chip->ecc.write_oob_raw)
+               chip->ecc.write_oob_raw = chip->ecc.write_oob;
+
        /*
         * The number of bytes available for a client to place data into
-        * the out of band area
+        * the out of band area.
         */
        chip->ecc.layout->oobavail = 0;
        for (i = 0; chip->ecc.layout->oobfree[i].length
@@ -3114,19 +3307,16 @@ int nand_scan_tail(struct mtd_info *mtd)
 
        /*
         * Set the number of read / write steps for one page depending on ECC
-        * mode
+        * mode.
         */
        chip->ecc.steps = mtd->writesize / chip->ecc.size;
        if (chip->ecc.steps * chip->ecc.size != mtd->writesize) {
-               printk(KERN_WARNING "Invalid ecc parameters\n");
+               pr_warn("Invalid ECC parameters\n");
                BUG();
        }
        chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
 
-       /*
-        * Allow subpage writes up to ecc.steps. Not possible for MLC
-        * FLASH.
-        */
+       /* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
        if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
            !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
                switch (chip->ecc.steps) {
@@ -3159,21 +3349,29 @@ int nand_scan_tail(struct mtd_info *mtd)
        mtd->type = MTD_NANDFLASH;
        mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
                                                MTD_CAP_NANDFLASH;
-       mtd->erase = nand_erase;
-       mtd->point = NULL;
-       mtd->unpoint = NULL;
-       mtd->read = nand_read;
-       mtd->write = nand_write;
-       mtd->read_oob = nand_read_oob;
-       mtd->write_oob = nand_write_oob;
-       mtd->sync = nand_sync;
-       mtd->lock = NULL;
-       mtd->unlock = NULL;
-       mtd->block_isbad = nand_block_isbad;
-       mtd->block_markbad = nand_block_markbad;
-
-       /* propagate ecc.layout to mtd_info */
+       mtd->_erase = nand_erase;
+       mtd->_point = NULL;
+       mtd->_unpoint = NULL;
+       mtd->_read = nand_read;
+       mtd->_write = nand_write;
+       mtd->_read_oob = nand_read_oob;
+       mtd->_write_oob = nand_write_oob;
+       mtd->_sync = nand_sync;
+       mtd->_lock = NULL;
+       mtd->_unlock = NULL;
+       mtd->_block_isbad = nand_block_isbad;
+       mtd->_block_markbad = nand_block_markbad;
+
+       /* propagate ecc info to mtd_info */
        mtd->ecclayout = chip->ecc.layout;
+       mtd->ecc_strength = chip->ecc.strength;
+       /*
+        * Initialize bitflip_threshold to its default prior scan_bbt() call.
+        * scan_bbt() might invoke mtd_read(), thus bitflip_threshold must be
+        * properly set.
+        */
+       if (!mtd->bitflip_threshold)
+               mtd->bitflip_threshold = mtd->ecc_strength;
 
        /* Check, if we should skip the bad block table scan */
        if (chip->options & NAND_SKIP_BBTSCAN)
@@ -3184,15 +3382,13 @@ int nand_scan_tail(struct mtd_info *mtd)
 
 /**
  * nand_scan - [NAND Interface] Scan for the NAND device
- * @mtd:       MTD device structure
- * @maxchips:  Number of chips to scan for
- *
- * This fills out all the uninitialized function pointers
- * with the defaults.
- * The flash ID is read and the mtd/chip structures are
- * filled with the appropriate values.
- * The mtd->owner field must be set to the module of the caller
+ * @mtd: MTD device structure
+ * @maxchips: number of chips to scan for
  *
+ * This fills out all the uninitialized function pointers with the defaults.
+ * The flash ID is read and the mtd/chip structures are filled with the
+ * appropriate values. The mtd->owner field must be set to the module of the
+ * caller.
  */
 int nand_scan(struct mtd_info *mtd, int maxchips)
 {
@@ -3206,8 +3402,8 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
 
 /**
  * nand_release - [NAND Interface] Free resources held by the NAND device
- * @mtd:       MTD device structure
-*/
+ * @mtd: MTD device structure
+ */
 void nand_release(struct mtd_info *mtd)
 {
        struct nand_chip *chip = mtd->priv;
index 74a7061b055efe51defdb2a0f2271364d34029bc..8ef58451d522131ba3b9bec3c116531c94217681 100644 (file)
@@ -4,7 +4,7 @@
  *  Overview:
  *   Bad block table support for the NAND driver
  *
- *  Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
+ *  Copyright Â© 2004 Thomas Gleixner (tglx@linutronix.de)
  *
  * 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
@@ -14,7 +14,7 @@
  *
  * When nand_scan_bbt is called, then it tries to find the bad block table
  * depending on the options in the BBT descriptor(s). If no flash based BBT
- * (NAND_USE_FLASH_BBT) is specified then the device is scanned for factory
+ * (NAND_BBT_USE_FLASH) is specified then the device is scanned for factory
  * marked good / bad blocks. This information is used to create a memory BBT.
  * Once a new bad block is discovered then the "factory" information is updated
  * on the device.
@@ -22,7 +22,7 @@
  * BBT on flash. If a BBT is found then the contents are read and the memory
  * based BBT is created. If a mirrored BBT is selected then the mirror is
  * searched too and the versions are compared. If the mirror has a greater
- * version number than the mirror BBT is used to build the memory based BBT.
+ * version number, then the mirror BBT is used to build the memory based BBT.
  * If the tables are not versioned, then we "or" the bad block information.
  * If one of the BBTs is out of date or does not exist it is (re)created.
  * If no BBT exists at all then the device is scanned for factory marked
@@ -36,9 +36,9 @@
  * The table is marked in the OOB area with an ident pattern and a version
  * number which indicates which of both tables is more up to date. If the NAND
  * controller needs the complete OOB area for the ECC information then the
- * option NAND_USE_FLASH_BBT_NO_OOB should be used: it moves the ident pattern
- * and the version byte into the data area and the OOB area will remain
- * untouched.
+ * option NAND_BBT_NO_OOB should be used (along with NAND_BBT_USE_FLASH, of
+ * course): it moves the ident pattern and the version byte into the data area
+ * and the OOB area will remain untouched.
  *
  * The table uses 2 bits per block
  * 11b:                block is good
 #include <malloc.h>
 #include <linux/compat.h>
 #include <linux/mtd/mtd.h>
+#include <linux/mtd/bbm.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/bitops.h>
+#include <linux/string.h>
 
 #include <asm/errno.h>
 
 static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
 {
-       int ret;
-
-       ret = memcmp(buf, td->pattern, td->len);
-       if (!ret)
-               return ret;
-       return -1;
+       if (memcmp(buf, td->pattern, td->len))
+               return -1;
+       return 0;
 }
 
 /**
  * check_pattern - [GENERIC] check if a pattern is in the buffer
- * @buf:       the buffer to search
- * @len:       the length of buffer to search
- * @paglen:    the pagelength
- * @td:                search pattern descriptor
- *
- * Check for a pattern at the given place. Used to search bad block
- * tables and good / bad block identifiers.
- * If the SCAN_EMPTY option is set then check, if all bytes except the
- * pattern area contain 0xff
+ * @buf: the buffer to search
+ * @len: the length of buffer to search
+ * @paglen: the pagelength
+ * @td: search pattern descriptor
  *
-*/
+ * Check for a pattern at the given place. Used to search bad block tables and
+ * good / bad block identifiers. If the SCAN_EMPTY option is set then check, if
+ * all bytes except the pattern area contain 0xff.
+ */
 static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
 {
-       int i, end = 0;
+       int end = 0;
        uint8_t *p = buf;
 
        if (td->options & NAND_BBT_NO_OOB)
                return check_pattern_no_oob(buf, td);
 
        end = paglen + td->offs;
-       if (td->options & NAND_BBT_SCANEMPTY) {
-               for (i = 0; i < end; i++) {
-                       if (p[i] != 0xff)
-                               return -1;
-               }
-       }
+       if (td->options & NAND_BBT_SCANEMPTY)
+               if (memchr_inv(p, 0xff, end))
+                       return -1;
        p += end;
 
        /* Compare the pattern */
-       for (i = 0; i < td->len; i++) {
-               if (p[i] != td->pattern[i])
-                       return -1;
-       }
-
-       /* Check both positions 1 and 6 for pattern? */
-       if (td->options & NAND_BBT_SCANBYTE1AND6) {
-               if (td->options & NAND_BBT_SCANEMPTY) {
-                       p += td->len;
-                       end += NAND_SMALL_BADBLOCK_POS - td->offs;
-                       /* Check region between positions 1 and 6 */
-                       for (i = 0; i < NAND_SMALL_BADBLOCK_POS - td->offs - td->len;
-                                       i++) {
-                               if (*p++ != 0xff)
-                                       return -1;
-                       }
-               }
-               else {
-                       p += NAND_SMALL_BADBLOCK_POS - td->offs;
-               }
-               /* Compare the pattern */
-               for (i = 0; i < td->len; i++) {
-                       if (p[i] != td->pattern[i])
-                               return -1;
-               }
-       }
+       if (memcmp(p, td->pattern, td->len))
+               return -1;
 
        if (td->options & NAND_BBT_SCANEMPTY) {
                p += td->len;
                end += td->len;
-               for (i = end; i < len; i++) {
-                       if (*p++ != 0xff)
-                               return -1;
-               }
+               if (memchr_inv(p, 0xff, len - end))
+                       return -1;
        }
        return 0;
 }
 
 /**
  * check_short_pattern - [GENERIC] check if a pattern is in the buffer
- * @buf:       the buffer to search
- * @td:                search pattern descriptor
+ * @buf: the buffer to search
+ * @td:        search pattern descriptor
  *
- * Check for a pattern at the given place. Used to search bad block
- * tables and good / bad block identifiers. Same as check_pattern, but
- * no optional empty check
- *
-*/
+ * Check for a pattern at the given place. Used to search bad block tables and
+ * good / bad block identifiers. Same as check_pattern, but no optional empty
+ * check.
+ */
 static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
 {
-       int i;
-       uint8_t *p = buf;
-
        /* Compare the pattern */
-       for (i = 0; i < td->len; i++) {
-               if (p[td->offs + i] != td->pattern[i])
-                       return -1;
-       }
-       /* Need to check location 1 AND 6? */
-       if (td->options & NAND_BBT_SCANBYTE1AND6) {
-               for (i = 0; i < td->len; i++) {
-                       if (p[NAND_SMALL_BADBLOCK_POS + i] != td->pattern[i])
-                               return -1;
-               }
-       }
+       if (memcmp(buf + td->offs, td->pattern, td->len))
+               return -1;
        return 0;
 }
 
 /**
  * add_marker_len - compute the length of the marker in data area
- * @td:                BBT descriptor used for computation
+ * @td: BBT descriptor used for computation
  *
- * The length will be 0 if the markeris located in OOB area.
+ * The length will be 0 if the marker is located in OOB area.
  */
 static u32 add_marker_len(struct nand_bbt_descr *td)
 {
@@ -199,34 +154,33 @@ static u32 add_marker_len(struct nand_bbt_descr *td)
 
 /**
  * read_bbt - [GENERIC] Read the bad block table starting from page
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @page:      the starting page
- * @num:       the number of bbt descriptors to read
- * @td:                the bbt describtion table
- * @offs:      offset in the memory table
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @page: the starting page
+ * @num: the number of bbt descriptors to read
+ * @td: the bbt describtion table
+ * @offs: offset in the memory table
  *
  * Read the bad block table starting from page.
- *
  */
 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
                struct nand_bbt_descr *td, int offs)
 {
-       int res, i, j, act = 0;
+       int res, ret = 0, i, j, act = 0;
        struct nand_chip *this = mtd->priv;
        size_t retlen, len, totlen;
        loff_t from;
        int bits = td->options & NAND_BBT_NRBITS_MSK;
-       uint8_t msk = (uint8_t) ((1 << bits) - 1);
+       uint8_t msk = (uint8_t)((1 << bits) - 1);
        u32 marker_len;
        int reserved_block_code = td->reserved_block_code;
 
        totlen = (num * bits) >> 3;
        marker_len = add_marker_len(td);
-       from = ((loff_t) page) << this->page_shift;
+       from = ((loff_t)page) << this->page_shift;
 
        while (totlen) {
-               len = min(totlen, (size_t) (1 << this->bbt_erase_shift));
+               len = min(totlen, (size_t)(1 << this->bbt_erase_shift));
                if (marker_len) {
                        /*
                         * In case the BBT marker is not in the OOB area it
@@ -236,13 +190,20 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
                        from += marker_len;
                        marker_len = 0;
                }
-               res = mtd->read(mtd, from, len, &retlen, buf);
+               res = mtd_read(mtd, from, len, &retlen, buf);
                if (res < 0) {
-                       if (retlen != len) {
-                               printk(KERN_INFO "nand_bbt: Error reading bad block table\n");
+                       if (mtd_is_eccerr(res)) {
+                               pr_info("nand_bbt: ECC error in BBT at "
+                                       "0x%012llx\n", from & ~mtd->writesize);
+                               return res;
+                       } else if (mtd_is_bitflip(res)) {
+                               pr_info("nand_bbt: corrected error in BBT at "
+                                       "0x%012llx\n", from & ~mtd->writesize);
+                               ret = res;
+                       } else {
+                               pr_info("nand_bbt: error reading BBT\n");
                                return res;
                        }
-                       printk(KERN_WARNING "nand_bbt: ECC error while reading bad block table\n");
                }
 
                /* Analyse data */
@@ -253,17 +214,16 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
                                if (tmp == msk)
                                        continue;
                                if (reserved_block_code && (tmp == reserved_block_code)) {
-                                       printk(KERN_DEBUG "nand_read_bbt: Reserved block at 0x%012llx\n",
-                                              (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
+                                       pr_info("nand_read_bbt: reserved block at 0x%012llx\n",
+                                                (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
                                        this->bbt[offs + (act >> 3)] |= 0x2 << (act & 0x06);
                                        mtd->ecc_stats.bbtblocks++;
                                        continue;
                                }
-                               MTDDEBUG(MTD_DEBUG_LEVEL0, "nand_read_bbt: " \
-                                       "Bad block at 0x%012llx\n",
+                               pr_info("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 ? */
+                               /* Factory marked bad or worn out? */
                                if (tmp == 0)
                                        this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06);
                                else
@@ -274,20 +234,20 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
                totlen -= len;
                from += len;
        }
-       return 0;
+       return ret;
 }
 
 /**
  * read_abs_bbt - [GENERIC] Read the bad block table starting at a given page
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @td:                descriptor for the bad block table
- * @chip:      read the table for a specific chip, -1 read all chips.
- *             Applies only if NAND_BBT_PERCHIP option is set
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @td: descriptor for the bad block table
+ * @chip: read the table for a specific chip, -1 read all chips; applies only if
+ *        NAND_BBT_PERCHIP option is set
  *
- * Read the bad block table for all chips starting at a given page
- * We assume that the bbt bits are in consecutive order.
-*/
+ * Read the bad block table for all chips starting at a given page. We assume
+ * that the bbt bits are in consecutive order.
+ */
 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
 {
        struct nand_chip *this = mtd->priv;
@@ -313,10 +273,8 @@ static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
        return 0;
 }
 
-/*
- * BBT marker is in the first page, no OOB.
- */
-static int scan_read_raw_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
+/* BBT marker is in the first page, no OOB */
+static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
                         struct nand_bbt_descr *td)
 {
        size_t retlen;
@@ -326,70 +284,73 @@ static int scan_read_raw_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
        if (td->options & NAND_BBT_VERSION)
                len++;
 
-       return mtd->read(mtd, offs, len, &retlen, buf);
+       return mtd_read(mtd, offs, len, &retlen, buf);
 }
 
-/*
- * Scan read raw data from flash
+/**
+ * scan_read_oob - [GENERIC] Scan data+OOB region to buffer
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @offs: offset at which to scan
+ * @len: length of data region to read
+ *
+ * Scan read data from data+OOB. May traverse multiple pages, interleaving
+ * page,OOB,page,OOB,... in buf. Completes transfer and returns the "strongest"
+ * ECC condition (error or bitflip). May quit on the first (non-ECC) error.
  */
-static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
+static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
                         size_t len)
 {
        struct mtd_oob_ops ops;
-       int res;
+       int res, ret = 0;
 
-       ops.mode = MTD_OOB_RAW;
+       ops.mode = MTD_OPS_PLACE_OOB;
        ops.ooboffs = 0;
        ops.ooblen = mtd->oobsize;
 
-
        while (len > 0) {
-               if (len <= mtd->writesize) {
-                       ops.oobbuf = buf + len;
-                       ops.datbuf = buf;
-                       ops.len = len;
-                       return mtd->read_oob(mtd, offs, &ops);
-               } else {
-                       ops.oobbuf = buf + mtd->writesize;
-                       ops.datbuf = buf;
-                       ops.len = mtd->writesize;
-                       res = mtd->read_oob(mtd, offs, &ops);
+               ops.datbuf = buf;
+               ops.len = min(len, (size_t)mtd->writesize);
+               ops.oobbuf = buf + ops.len;
 
-                       if (res)
+               res = mtd_read_oob(mtd, offs, &ops);
+               if (res) {
+                       if (!mtd_is_bitflip_or_eccerr(res))
                                return res;
+                       else if (mtd_is_eccerr(res) || !ret)
+                               ret = res;
                }
 
                buf += mtd->oobsize + mtd->writesize;
                len -= mtd->writesize;
+               offs += mtd->writesize;
        }
-       return 0;
+       return ret;
 }
 
-static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
+static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
                         size_t len, struct nand_bbt_descr *td)
 {
        if (td->options & NAND_BBT_NO_OOB)
-               return scan_read_raw_data(mtd, buf, offs, td);
+               return scan_read_data(mtd, buf, offs, td);
        else
-               return scan_read_raw_oob(mtd, buf, offs, len);
+               return scan_read_oob(mtd, buf, offs, len);
 }
 
-/*
- * Scan write data with oob to flash
- */
+/* Scan write data with oob to flash */
 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
                          uint8_t *buf, uint8_t *oob)
 {
        struct mtd_oob_ops ops;
 
-       ops.mode = MTD_OOB_PLACE;
+       ops.mode = MTD_OPS_PLACE_OOB;
        ops.ooboffs = 0;
        ops.ooblen = mtd->oobsize;
        ops.datbuf = buf;
        ops.oobbuf = oob;
        ops.len = len;
 
-       return mtd->write_oob(mtd, offs, &ops);
+       return mtd_write_oob(mtd, offs, &ops);
 }
 
 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
@@ -403,65 +364,60 @@ static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
 
 /**
  * read_abs_bbts - [GENERIC] Read the bad block table(s) for all chips starting at a given page
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @td:                descriptor for the bad block table
- * @md:                descriptor for the bad block table mirror
- *
- * Read the bad block table(s) for all chips starting at a given page
- * We assume that the bbt bits are in consecutive order.
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @td: descriptor for the bad block table
+ * @md:        descriptor for the bad block table mirror
  *
-*/
-static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
-                        struct nand_bbt_descr *td, struct nand_bbt_descr *md)
+ * Read the bad block table(s) for all chips starting at a given page. We
+ * assume that the bbt bits are in consecutive order.
+ */
+static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
+                         struct nand_bbt_descr *td, struct nand_bbt_descr *md)
 {
        struct nand_chip *this = mtd->priv;
 
        /* Read the primary version, if available */
        if (td->options & NAND_BBT_VERSION) {
-               scan_read_raw(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
+               scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
                              mtd->writesize, td);
                td->version[0] = buf[bbt_get_ver_offs(mtd, td)];
-               printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n",
-                      td->pages[0], td->version[0]);
+               pr_info("Bad block table at page %d, version 0x%02X\n",
+                        td->pages[0], td->version[0]);
        }
 
        /* Read the mirror version, if available */
        if (md && (md->options & NAND_BBT_VERSION)) {
-               scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
-                             mtd->writesize, td);
+               scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
+                             mtd->writesize, md);
                md->version[0] = buf[bbt_get_ver_offs(mtd, md)];
-               printk(KERN_DEBUG "Bad block table at page %d, version 0x%02X\n",
-                      md->pages[0], md->version[0]);
+               pr_info("Bad block table at page %d, version 0x%02X\n",
+                        md->pages[0], md->version[0]);
        }
-       return 1;
 }
 
-/*
- * Scan a given block full
- */
+/* Scan a given block full */
 static int scan_block_full(struct mtd_info *mtd, struct nand_bbt_descr *bd,
                           loff_t offs, uint8_t *buf, size_t readlen,
-                          int scanlen, int len)
+                          int scanlen, int numpages)
 {
        int ret, j;
 
-       ret = scan_read_raw_oob(mtd, buf, offs, readlen);
-       if (ret)
+       ret = scan_read_oob(mtd, buf, offs, readlen);
+       /* Ignore ECC errors when checking for BBM */
+       if (ret && !mtd_is_bitflip_or_eccerr(ret))
                return ret;
 
-       for (j = 0; j < len; j++, buf += scanlen) {
+       for (j = 0; j < numpages; j++, buf += scanlen) {
                if (check_pattern(buf, scanlen, mtd->writesize, bd))
                        return 1;
        }
        return 0;
 }
 
-/*
- * Scan a given block partially
- */
+/* Scan a given block partially */
 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
-                          loff_t offs, uint8_t *buf, int len)
+                          loff_t offs, uint8_t *buf, int numpages)
 {
        struct mtd_oob_ops ops;
        int j, ret;
@@ -470,16 +426,16 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
        ops.oobbuf = buf;
        ops.ooboffs = 0;
        ops.datbuf = NULL;
-       ops.mode = MTD_OOB_PLACE;
+       ops.mode = MTD_OPS_PLACE_OOB;
 
-       for (j = 0; j < len; j++) {
+       for (j = 0; j < numpages; j++) {
                /*
-                * Read the full oob until read_oob is fixed to
-                * handle single byte reads for 16 bit
-                * buswidth
+                * Read the full oob until read_oob is fixed to handle single
+                * byte reads for 16 bit buswidth.
                 */
-               ret = mtd->read_oob(mtd, offs, &ops);
-               if (ret)
+               ret = mtd_read_oob(mtd, offs, &ops);
+               /* Ignore ECC errors when checking for BBM */
+               if (ret && !mtd_is_bitflip_or_eccerr(ret))
                        return ret;
 
                if (check_short_pattern(buf, bd))
@@ -492,32 +448,32 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
 
 /**
  * create_bbt - [GENERIC] Create a bad block table by scanning the device
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @bd:                descriptor for the good/bad block search pattern
- * @chip:      create the table for a specific chip, -1 read all chips.
- *             Applies only if NAND_BBT_PERCHIP option is set
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @bd: descriptor for the good/bad block search pattern
+ * @chip: create the table for a specific chip, -1 read all chips; applies only
+ *        if NAND_BBT_PERCHIP option is set
  *
- * Create a bad block table by scanning the device
- * for the given good/bad block identify pattern
+ * Create a bad block table by scanning the device for the given good/bad block
+ * identify pattern.
  */
 static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
        struct nand_bbt_descr *bd, int chip)
 {
        struct nand_chip *this = mtd->priv;
-       int i, numblocks, len, scanlen;
+       int i, numblocks, numpages, scanlen;
        int startblock;
        loff_t from;
        size_t readlen;
 
-       MTDDEBUG(MTD_DEBUG_LEVEL0, "Scanning device for bad blocks\n");
+       pr_info("Scanning device for bad blocks\n");
 
        if (bd->options & NAND_BBT_SCANALLPAGES)
-               len = 1 << (this->bbt_erase_shift - this->page_shift);
+               numpages = 1 << (this->bbt_erase_shift - this->page_shift);
        else if (bd->options & NAND_BBT_SCAN2NDPAGE)
-               len = 2;
+               numpages = 2;
        else
-               len = 1;
+               numpages = 1;
 
        if (!(bd->options & NAND_BBT_SCANEMPTY)) {
                /* We need only read few bytes from the OOB area */
@@ -526,18 +482,20 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
        } else {
                /* Full page content should be read */
                scanlen = mtd->writesize + mtd->oobsize;
-               readlen = len * mtd->writesize;
+               readlen = numpages * mtd->writesize;
        }
 
        if (chip == -1) {
-               /* Note that numblocks is 2 * (real numblocks) here, see i+=2
-                * below as it makes shifting and masking less painful */
+               /*
+                * Note that numblocks is 2 * (real numblocks) here, see i+=2
+                * below as it makes shifting and masking less painful
+                */
                numblocks = mtd->size >> (this->bbt_erase_shift - 1);
                startblock = 0;
                from = 0;
        } else {
                if (chip >= this->numchips) {
-                       printk(KERN_WARNING "create_bbt(): chipnr (%d) > available chips (%d)\n",
+                       pr_warn("create_bbt(): chipnr (%d) > available chips (%d)\n",
                               chip + 1, this->numchips);
                        return -EINVAL;
                }
@@ -547,8 +505,8 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
                from = (loff_t)startblock << (this->bbt_erase_shift - 1);
        }
 
-       if (this->options & NAND_BBT_SCANLASTPAGE)
-               from += mtd->erasesize - (mtd->writesize * len);
+       if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
+               from += mtd->erasesize - (mtd->writesize * numpages);
 
        for (i = startblock; i < numblocks;) {
                int ret;
@@ -557,17 +515,16 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
 
                if (bd->options & NAND_BBT_SCANALLPAGES)
                        ret = scan_block_full(mtd, bd, from, buf, readlen,
-                                             scanlen, len);
+                                             scanlen, numpages);
                else
-                       ret = scan_block_fast(mtd, bd, from, buf, len);
+                       ret = scan_block_fast(mtd, bd, from, buf, numpages);
 
                if (ret < 0)
                        return ret;
 
                if (ret) {
                        this->bbt[i >> 3] |= 0x03 << (i & 0x6);
-                       MTDDEBUG(MTD_DEBUG_LEVEL0,
-                                 "Bad eraseblock %d at 0x%012llx\n",
+                       pr_warn("Bad eraseblock %d at 0x%012llx\n",
                                  i >> 1, (unsigned long long)from);
                        mtd->ecc_stats.badblocks++;
                }
@@ -580,20 +537,18 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
 
 /**
  * search_bbt - [GENERIC] scan the device for a specific bad block table
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @td:                descriptor for the bad block table
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @td: descriptor for the bad block table
  *
- * Read the bad block table by searching for a given ident pattern.
- * Search is preformed either from the beginning up or from the end of
- * the device downwards. The search starts always at the start of a
- * block.
- * If the option NAND_BBT_PERCHIP is given, each chip is searched
- * for a bbt, which contains the bad block information of this chip.
- * This is necessary to provide support for certain DOC devices.
+ * Read the bad block table by searching for a given ident pattern. Search is
+ * preformed either from the beginning up or from the end of the device
+ * downwards. The search starts always at the start of a block. If the option
+ * NAND_BBT_PERCHIP is given, each chip is searched for a bbt, which contains
+ * the bad block information of this chip. This is necessary to provide support
+ * for certain DOC devices.
  *
- * The bbt ident pattern resides in the oob area of the first page
- * in a block.
+ * The bbt ident pattern resides in the oob area of the first page in a block.
  */
 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
 {
@@ -604,7 +559,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
        int bbtblocks;
        int blocktopage = this->bbt_erase_shift - this->page_shift;
 
-       /* Search direction top -> down ? */
+       /* Search direction top -> down? */
        if (td->options & NAND_BBT_LASTBLOCK) {
                startblock = (mtd->size >> this->bbt_erase_shift) - 1;
                dir = -1;
@@ -613,7 +568,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
                dir = 1;
        }
 
-       /* Do we have a bbt per chip ? */
+       /* Do we have a bbt per chip? */
        if (td->options & NAND_BBT_PERCHIP) {
                chips = this->numchips;
                bbtblocks = this->chipsize >> this->bbt_erase_shift;
@@ -634,7 +589,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
                        loff_t offs = (loff_t)actblock << this->bbt_erase_shift;
 
                        /* Read first page */
-                       scan_read_raw(mtd, buf, offs, mtd->writesize, td);
+                       scan_read(mtd, buf, offs, mtd->writesize, td);
                        if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
                                td->pages[i] = actblock << blocktopage;
                                if (td->options & NAND_BBT_VERSION) {
@@ -649,10 +604,9 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
        /* Check, if we found a bbt for each requested chip */
        for (i = 0; i < chips; i++) {
                if (td->pages[i] == -1)
-                       printk(KERN_WARNING "Bad block table not found for chip %d\n", i);
+                       pr_warn("Bad block table not found for chip %d\n", i);
                else
-                       MTDDEBUG(MTD_DEBUG_LEVEL0, "Bad block table found " \
-                               "at page %d, version 0x%02X\n", td->pages[i],
+                       pr_info("Bad block table found at page %d, version 0x%02X\n", td->pages[i],
                                td->version[i]);
        }
        return 0;
@@ -660,14 +614,16 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
 
 /**
  * search_read_bbts - [GENERIC] scan the device for bad block table(s)
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @td:                descriptor for the bad block table
- * @md:                descriptor for the bad block table mirror
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @td: descriptor for the bad block table
+ * @md: descriptor for the bad block table mirror
  *
- * Search and read the bad block table(s)
-*/
-static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md)
+ * Search and read the bad block table(s).
+ */
+static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf,
+                            struct nand_bbt_descr *td,
+                            struct nand_bbt_descr *md)
 {
        /* Search the primary table */
        search_bbt(mtd, buf, td);
@@ -675,23 +631,18 @@ static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt
        /* Search the mirror table */
        if (md)
                search_bbt(mtd, buf, md);
-
-       /* Force result check */
-       return 1;
 }
 
 /**
  * write_bbt - [GENERIC] (Re)write the bad block table
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @td: descriptor for the bad block table
+ * @md: descriptor for the bad block table mirror
+ * @chipsel: selector for a specific chip, -1 for all
  *
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @td:                descriptor for the bad block table
- * @md:                descriptor for the bad block table mirror
- * @chipsel:   selector for a specific chip, -1 for all
- *
- * (Re)write the bad block table
- *
-*/
+ * (Re)write the bad block table.
+ */
 static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                     struct nand_bbt_descr *td, struct nand_bbt_descr *md,
                     int chipsel)
@@ -710,14 +661,14 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
        ops.ooblen = mtd->oobsize;
        ops.ooboffs = 0;
        ops.datbuf = NULL;
-       ops.mode = MTD_OOB_PLACE;
+       ops.mode = MTD_OPS_PLACE_OOB;
 
        if (!rcode)
                rcode = 0xff;
-       /* Write bad block table per chip rather than per device ? */
+       /* Write bad block table per chip rather than per device? */
        if (td->options & NAND_BBT_PERCHIP) {
                numblocks = (int)(this->chipsize >> this->bbt_erase_shift);
-               /* Full device write or specific chip ? */
+               /* Full device write or specific chip? */
                if (chipsel == -1) {
                        nrchips = this->numchips;
                } else {
@@ -731,8 +682,8 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
 
        /* Loop through the chips */
        for (; chip < nrchips; chip++) {
-
-               /* There was already a version of the table, reuse the page
+               /*
+                * There was already a version of the table, reuse the page
                 * This applies for absolute placement too, as we have the
                 * page nr. in td->pages.
                 */
@@ -741,8 +692,10 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                        goto write;
                }
 
-               /* Automatic placement of the bad block table */
-               /* Search direction top -> down ? */
+               /*
+                * Automatic placement of the bad block table. Search direction
+                * top -> down?
+                */
                if (td->options & NAND_BBT_LASTBLOCK) {
                        startblock = numblocks * (chip + 1) - 1;
                        dir = -1;
@@ -766,7 +719,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                        if (!md || md->pages[chip] != page)
                                goto write;
                }
-               printk(KERN_ERR "No space left to write bad block table\n");
+               pr_err("No space left to write bad block table\n");
                return -ENOSPC;
        write:
 
@@ -791,29 +744,27 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
 
                bbtoffs = chip * (numblocks >> 2);
 
-               to = ((loff_t) page) << this->page_shift;
+               to = ((loff_t)page) << this->page_shift;
 
-               /* Must we save the block contents ? */
+               /* Must we save the block contents? */
                if (td->options & NAND_BBT_SAVECONTENT) {
                        /* Make it block aligned */
-                       to &= ~((loff_t) ((1 << this->bbt_erase_shift) - 1));
+                       to &= ~((loff_t)((1 << this->bbt_erase_shift) - 1));
                        len = 1 << this->bbt_erase_shift;
-                       res = mtd->read(mtd, to, len, &retlen, buf);
+                       res = mtd_read(mtd, to, len, &retlen, buf);
                        if (res < 0) {
                                if (retlen != len) {
-                                       printk(KERN_INFO "nand_bbt: Error "
-                                              "reading block for writing "
-                                              "the bad block table\n");
+                                       pr_info("nand_bbt: error reading block "
+                                               "for writing the bad block table\n");
                                        return res;
                                }
-                               printk(KERN_WARNING "nand_bbt: ECC error "
-                                      "while reading block for writing "
-                                      "bad block table\n");
+                               pr_warn("nand_bbt: ECC error while reading "
+                                       "block for writing bad block table\n");
                        }
                        /* Read oob data */
                        ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
                        ops.oobbuf = &buf[len];
-                       res = mtd->read_oob(mtd, to + mtd->writesize, &ops);
+                       res = mtd_read_oob(mtd, to + mtd->writesize, &ops);
                        if (res < 0 || ops.oobretlen != ops.ooblen)
                                goto outerr;
 
@@ -821,19 +772,19 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                        pageoffs = page - (int)(to >> this->page_shift);
                        offs = pageoffs << this->page_shift;
                        /* Preset the bbt area with 0xff */
-                       memset(&buf[offs], 0xff, (size_t) (numblocks >> sft));
+                       memset(&buf[offs], 0xff, (size_t)(numblocks >> sft));
                        ooboffs = len + (pageoffs * mtd->oobsize);
 
                } else if (td->options & NAND_BBT_NO_OOB) {
                        ooboffs = 0;
                        offs = td->len;
-                       /* the version byte */
+                       /* The version byte */
                        if (td->options & NAND_BBT_VERSION)
                                offs++;
                        /* Calc length */
-                       len = (size_t) (numblocks >> sft);
+                       len = (size_t)(numblocks >> sft);
                        len += offs;
-                       /* Make it page aligned ! */
+                       /* Make it page aligned! */
                        len = ALIGN(len, mtd->writesize);
                        /* Preset the buffer with 0xff */
                        memset(buf, 0xff, len);
@@ -841,8 +792,8 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                        memcpy(buf, td->pattern, td->len);
                } else {
                        /* Calc length */
-                       len = (size_t) (numblocks >> sft);
-                       /* Make it page aligned ! */
+                       len = (size_t)(numblocks >> sft);
+                       /* Make it page aligned! */
                        len = ALIGN(len, mtd->writesize);
                        /* Preset the buffer with 0xff */
                        memset(buf, 0xff, len +
@@ -856,13 +807,13 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                if (td->options & NAND_BBT_VERSION)
                        buf[ooboffs + td->veroffs] = td->version[chip];
 
-               /* walk through the memory table */
+               /* Walk through the memory table */
                for (i = 0; i < numblocks;) {
                        uint8_t dat;
                        dat = this->bbt[bbtoffs + (i >> 2)];
                        for (j = 0; j < 4; j++, i++) {
                                int sftcnt = (i << (3 - sft)) & sftmsk;
-                               /* Do not store the reserved bbt blocks ! */
+                               /* Do not store the reserved bbt blocks! */
                                buf[offs + (i >> sft)] &=
                                        ~(msk[dat & 0x03] << sftcnt);
                                dat >>= 2;
@@ -883,8 +834,8 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
                if (res < 0)
                        goto outerr;
 
-               printk(KERN_DEBUG "Bad block table written to 0x%012llx, version "
-                      "0x%02X\n", (unsigned long long)to, td->version[chip]);
+               pr_info("Bad block table written to 0x%012llx, version 0x%02X\n",
+                        (unsigned long long)to, td->version[chip]);
 
                /* Mark it as used */
                td->pages[chip] = page;
@@ -892,19 +843,18 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
        return 0;
 
  outerr:
-       printk(KERN_WARNING
-              "nand_bbt: Error while writing bad block table %d\n", res);
+       pr_warn("nand_bbt: error while writing bad block table %d\n", res);
        return res;
 }
 
 /**
  * nand_memory_bbt - [GENERIC] create a memory based bad block table
- * @mtd:       MTD device structure
- * @bd:                descriptor for the good/bad block search pattern
+ * @mtd: MTD device structure
+ * @bd: descriptor for the good/bad block search pattern
  *
- * The function creates a memory based bbt by scanning the device
- * for manufacturer / software marked good / bad blocks
-*/
+ * The function creates a memory based bbt by scanning the device for
+ * manufacturer / software marked good / bad blocks.
+ */
 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 {
        struct nand_chip *this = mtd->priv;
@@ -915,25 +865,24 @@ static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *b
 
 /**
  * check_create - [GENERIC] create and write bbt(s) if necessary
- * @mtd:       MTD device structure
- * @buf:       temporary buffer
- * @bd:                descriptor for the good/bad block search pattern
+ * @mtd: MTD device structure
+ * @buf: temporary buffer
+ * @bd: descriptor for the good/bad block search pattern
  *
- * The function checks the results of the previous call to read_bbt
- * and creates / updates the bbt(s) if necessary
- * Creation is necessary if no bbt was found for the chip/device
- * Update is necessary if one of the tables is missing or the
- * version nr. of one table is less than the other
-*/
+ * The function checks the results of the previous call to read_bbt and creates
+ * / updates the bbt(s) if necessary. Creation is necessary if no bbt was found
+ * for the chip/device. Update is necessary if one of the tables is missing or
+ * the version nr. of one table is less than the other.
+ */
 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
 {
-       int i, chips, writeops, chipsel, res;
+       int i, chips, writeops, create, chipsel, res, res2;
        struct nand_chip *this = mtd->priv;
        struct nand_bbt_descr *td = this->bbt_td;
        struct nand_bbt_descr *md = this->bbt_md;
        struct nand_bbt_descr *rd, *rd2;
 
-       /* Do we have a bbt per chip ? */
+       /* Do we have a bbt per chip? */
        if (td->options & NAND_BBT_PERCHIP)
                chips = this->numchips;
        else
@@ -941,86 +890,98 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
 
        for (i = 0; i < chips; i++) {
                writeops = 0;
+               create = 0;
                rd = NULL;
                rd2 = NULL;
-               /* Per chip or per device ? */
+               res = res2 = 0;
+               /* Per chip or per device? */
                chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1;
-               /* Mirrored table available ? */
+               /* Mirrored table available? */
                if (md) {
                        if (td->pages[i] == -1 && md->pages[i] == -1) {
+                               create = 1;
                                writeops = 0x03;
-                               goto create;
-                       }
-
-                       if (td->pages[i] == -1) {
+                       } else if (td->pages[i] == -1) {
                                rd = md;
-                               td->version[i] = md->version[i];
-                               writeops = 1;
-                               goto writecheck;
-                       }
-
-                       if (md->pages[i] == -1) {
+                               writeops = 0x01;
+                       } else if (md->pages[i] == -1) {
                                rd = td;
-                               md->version[i] = td->version[i];
-                               writeops = 2;
-                               goto writecheck;
-                       }
-
-                       if (td->version[i] == md->version[i]) {
+                               writeops = 0x02;
+                       } else if (td->version[i] == md->version[i]) {
                                rd = td;
                                if (!(td->options & NAND_BBT_VERSION))
                                        rd2 = md;
-                               goto writecheck;
-                       }
-
-                       if (((int8_t) (td->version[i] - md->version[i])) > 0) {
+                       } else if (((int8_t)(td->version[i] - md->version[i])) > 0) {
                                rd = td;
-                               md->version[i] = td->version[i];
-                               writeops = 2;
+                               writeops = 0x02;
                        } else {
                                rd = md;
-                               td->version[i] = md->version[i];
-                               writeops = 1;
+                               writeops = 0x01;
                        }
-
-                       goto writecheck;
-
                } else {
                        if (td->pages[i] == -1) {
+                               create = 1;
                                writeops = 0x01;
-                               goto create;
+                       } else {
+                               rd = td;
                        }
-                       rd = td;
-                       goto writecheck;
                }
-       create:
-               /* Create the bad block table by scanning the device ? */
-               if (!(td->options & NAND_BBT_CREATE))
-                       continue;
 
-               /* Create the table in memory by scanning the chip(s) */
-               if (!(this->options & NAND_CREATE_EMPTY_BBT))
-                       create_bbt(mtd, buf, bd, chipsel);
-
-               td->version[i] = 1;
-               if (md)
-                       md->version[i] = 1;
-       writecheck:
-               /* read back first ? */
-               if (rd)
-                       read_abs_bbt(mtd, buf, rd, chipsel);
-               /* If they weren't versioned, read both. */
-               if (rd2)
-                       read_abs_bbt(mtd, buf, rd2, chipsel);
-
-               /* Write the bad block table to the device ? */
+               if (create) {
+                       /* Create the bad block table by scanning the device? */
+                       if (!(td->options & NAND_BBT_CREATE))
+                               continue;
+
+                       /* Create the table in memory by scanning the chip(s) */
+                       if (!(this->bbt_options & NAND_BBT_CREATE_EMPTY))
+                               create_bbt(mtd, buf, bd, chipsel);
+
+                       td->version[i] = 1;
+                       if (md)
+                               md->version[i] = 1;
+               }
+
+               /* Read back first? */
+               if (rd) {
+                       res = read_abs_bbt(mtd, buf, rd, chipsel);
+                       if (mtd_is_eccerr(res)) {
+                               /* Mark table as invalid */
+                               rd->pages[i] = -1;
+                               rd->version[i] = 0;
+                               i--;
+                               continue;
+                       }
+               }
+               /* If they weren't versioned, read both */
+               if (rd2) {
+                       res2 = read_abs_bbt(mtd, buf, rd2, chipsel);
+                       if (mtd_is_eccerr(res2)) {
+                               /* Mark table as invalid */
+                               rd2->pages[i] = -1;
+                               rd2->version[i] = 0;
+                               i--;
+                               continue;
+                       }
+               }
+
+               /* Scrub the flash table(s)? */
+               if (mtd_is_bitflip(res) || mtd_is_bitflip(res2))
+                       writeops = 0x03;
+
+               /* Update version numbers before writing */
+               if (md) {
+                       td->version[i] = max(td->version[i], md->version[i]);
+                       md->version[i] = td->version[i];
+               }
+
+               /* Write the bad block table to the device? */
                if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
                        res = write_bbt(mtd, buf, td, md, chipsel);
                        if (res < 0)
                                return res;
                }
 
-               /* Write the mirror bad block table to the device ? */
+               /* Write the mirror bad block table to the device? */
                if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
                        res = write_bbt(mtd, buf, md, td, chipsel);
                        if (res < 0)
@@ -1032,20 +993,19 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
 
 /**
  * mark_bbt_regions - [GENERIC] mark the bad block table regions
- * @mtd:       MTD device structure
- * @td:                bad block table descriptor
+ * @mtd: MTD device structure
+ * @td: bad block table descriptor
  *
- * The bad block table regions are marked as "bad" to prevent
- * accidental erasures / writes. The regions are identified by
- * the mark 0x02.
-*/
+ * The bad block table regions are marked as "bad" to prevent accidental
+ * erasures / writes. The regions are identified by the mark 0x02.
+ */
 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
 {
        struct nand_chip *this = mtd->priv;
        int i, j, chips, block, nrblocks, update;
        uint8_t oldval, newval;
 
-       /* Do we have a bbt per chip ? */
+       /* Do we have a bbt per chip? */
        if (td->options & NAND_BBT_PERCHIP) {
                chips = this->numchips;
                nrblocks = (int)(this->chipsize >> this->bbt_erase_shift);
@@ -1082,9 +1042,11 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
                                update = 1;
                        block += 2;
                }
-               /* If we want reserved blocks to be recorded to flash, and some
-                  new ones have been marked, then we need to update the stored
-                  bbts.  This should only happen once. */
+               /*
+                * If we want reserved blocks to be recorded to flash, and some
+                * new ones have been marked, then we need to update the stored
+                * bbts.  This should only happen once.
+                */
                if (update && td->reserved_block_code)
                        nand_update_bbt(mtd, (loff_t)(block - 2) << (this->bbt_erase_shift - 1));
        }
@@ -1092,8 +1054,8 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
 
 /**
  * verify_bbt_descr - verify the bad block description
- * @mtd:       MTD device structure
- * @bd:                the table to verify
+ * @mtd: MTD device structure
+ * @bd: the table to verify
  *
  * This functions performs a few sanity checks on the bad block description
  * table.
@@ -1111,16 +1073,16 @@ static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        pattern_len = bd->len;
        bits = bd->options & NAND_BBT_NRBITS_MSK;
 
-       BUG_ON((this->options & NAND_USE_FLASH_BBT_NO_OOB) &&
-                       !(this->options & NAND_USE_FLASH_BBT));
+       BUG_ON((this->bbt_options & NAND_BBT_NO_OOB) &&
+                       !(this->bbt_options & NAND_BBT_USE_FLASH));
        BUG_ON(!bits);
 
        if (bd->options & NAND_BBT_VERSION)
                pattern_len++;
 
        if (bd->options & NAND_BBT_NO_OOB) {
-               BUG_ON(!(this->options & NAND_USE_FLASH_BBT));
-               BUG_ON(!(this->options & NAND_USE_FLASH_BBT_NO_OOB));
+               BUG_ON(!(this->bbt_options & NAND_BBT_USE_FLASH));
+               BUG_ON(!(this->bbt_options & NAND_BBT_NO_OOB));
                BUG_ON(bd->offs);
                if (bd->options & NAND_BBT_VERSION)
                        BUG_ON(bd->veroffs != bd->len);
@@ -1140,18 +1102,16 @@ static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 
 /**
  * nand_scan_bbt - [NAND Interface] scan, find, read and maybe create bad block table(s)
- * @mtd:       MTD device structure
- * @bd:                descriptor for the good/bad block search pattern
- *
- * The function checks, if a bad block table(s) is/are already
- * available. If not it scans the device for manufacturer
- * marked good / bad blocks and writes the bad block table(s) to
- * the selected place.
+ * @mtd: MTD device structure
+ * @bd: descriptor for the good/bad block search pattern
  *
- * The bad block table memory is allocated here. It must be freed
- * by calling the nand_free_bbt function.
+ * The function checks, if a bad block table(s) is/are already available. If
+ * not it scans the device for manufacturer marked good / bad blocks and writes
+ * the bad block table(s) to the selected place.
  *
-*/
+ * The bad block table memory is allocated here. It must be freed by calling
+ * the nand_free_bbt function.
+ */
 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 {
        struct nand_chip *this = mtd->priv;
@@ -1161,19 +1121,21 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        struct nand_bbt_descr *md = this->bbt_md;
 
        len = mtd->size >> (this->bbt_erase_shift + 2);
-       /* Allocate memory (2bit per block) and clear the memory bad block table */
+       /*
+        * Allocate memory (2bit per block) and clear the memory bad block
+        * table.
+        */
        this->bbt = kzalloc(len, GFP_KERNEL);
-       if (!this->bbt) {
-               printk(KERN_ERR "nand_scan_bbt: Out of memory\n");
+       if (!this->bbt)
                return -ENOMEM;
-       }
 
-       /* If no primary table decriptor is given, scan the device
-        * to build a memory based bad block table
+       /*
+        * If no primary table decriptor is given, scan the device to build a
+        * memory based bad block table.
         */
        if (!td) {
                if ((res = nand_memory_bbt(mtd, bd))) {
-                       printk(KERN_ERR "nand_bbt: Can't scan flash and build the RAM-based BBT\n");
+                       pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
                        kfree(this->bbt);
                        this->bbt = NULL;
                }
@@ -1187,22 +1149,20 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        len += (len >> this->page_shift) * mtd->oobsize;
        buf = vmalloc(len);
        if (!buf) {
-               printk(KERN_ERR "nand_bbt: Out of memory\n");
                kfree(this->bbt);
                this->bbt = NULL;
                return -ENOMEM;
        }
 
-       /* Is the bbt at a given page ? */
+       /* Is the bbt at a given page? */
        if (td->options & NAND_BBT_ABSPAGE) {
-               res = read_abs_bbts(mtd, buf, td, md);
+               read_abs_bbts(mtd, buf, td, md);
        } else {
                /* Search the bad block table using a pattern in oob */
-               res = search_read_bbts(mtd, buf, td, md);
+               search_read_bbts(mtd, buf, td, md);
        }
 
-       if (res)
-               res = check_create(mtd, buf, bd);
+       res = check_create(mtd, buf, bd);
 
        /* Prevent the bbt regions from erasing / writing */
        mark_bbt_region(mtd, td);
@@ -1215,15 +1175,15 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 
 /**
  * nand_update_bbt - [NAND Interface] update bad block table(s)
- * @mtd:       MTD device structure
- * @offs:      the offset of the newly marked block
+ * @mtd: MTD device structure
+ * @offs: the offset of the newly marked block
  *
- * The function updates the bad block table(s)
-*/
+ * The function updates the bad block table(s).
+ */
 int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
 {
        struct nand_chip *this = mtd->priv;
-       int len, res = 0, writeops = 0;
+       int len, res = 0;
        int chip, chipsel;
        uint8_t *buf;
        struct nand_bbt_descr *td = this->bbt_td;
@@ -1236,14 +1196,10 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
        len = (1 << this->bbt_erase_shift);
        len += (len >> this->page_shift) * mtd->oobsize;
        buf = kmalloc(len, GFP_KERNEL);
-       if (!buf) {
-               printk(KERN_ERR "nand_update_bbt: Out of memory\n");
+       if (!buf)
                return -ENOMEM;
-       }
 
-       writeops = md != NULL ? 0x03 : 0x01;
-
-       /* Do we have a bbt per chip ? */
+       /* Do we have a bbt per chip? */
        if (td->options & NAND_BBT_PERCHIP) {
                chip = (int)(offs >> this->chip_shift);
                chipsel = chip;
@@ -1256,14 +1212,14 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
        if (md)
                md->version[chip]++;
 
-       /* Write the bad block table to the device ? */
-       if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
+       /* Write the bad block table to the device? */
+       if (td->options & NAND_BBT_WRITE) {
                res = write_bbt(mtd, buf, td, md, chipsel);
                if (res < 0)
                        goto out;
        }
-       /* Write the mirror bad block table to the device ? */
-       if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
+       /* Write the mirror bad block table to the device? */
+       if (md && (md->options & NAND_BBT_WRITE)) {
                res = write_bbt(mtd, buf, md, td, chipsel);
        }
 
@@ -1272,8 +1228,10 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
        return res;
 }
 
-/* Define some generic bad / good block scan pattern which are used
- * while scanning a device for factory marked good / bad blocks. */
+/*
+ * Define some generic bad / good block scan pattern which are used
+ * while scanning a device for factory marked good / bad blocks.
+ */
 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
 
 static uint8_t scan_agand_pattern[] = { 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7 };
@@ -1285,8 +1243,7 @@ static struct nand_bbt_descr agand_flashbased = {
        .pattern = scan_agand_pattern
 };
 
-/* Generic flash bbt decriptors
-*/
+/* Generic flash bbt descriptors */
 static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
 static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
 
@@ -1296,7 +1253,7 @@ static struct nand_bbt_descr bbt_main_descr = {
        .offs = 8,
        .len = 4,
        .veroffs = 12,
-       .maxblocks = 4,
+       .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = bbt_pattern
 };
 
@@ -1306,55 +1263,51 @@ static struct nand_bbt_descr bbt_mirror_descr = {
        .offs = 8,
        .len = 4,
        .veroffs = 12,
-       .maxblocks = 4,
+       .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = mirror_pattern
 };
 
-static struct nand_bbt_descr bbt_main_no_bbt_descr = {
+static struct nand_bbt_descr bbt_main_no_oob_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
                | NAND_BBT_NO_OOB,
        .len = 4,
        .veroffs = 4,
-       .maxblocks = 4,
+       .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = bbt_pattern
 };
 
-static struct nand_bbt_descr bbt_mirror_no_bbt_descr = {
+static struct nand_bbt_descr bbt_mirror_no_oob_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
                | NAND_BBT_NO_OOB,
        .len = 4,
        .veroffs = 4,
-       .maxblocks = 4,
+       .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = mirror_pattern
 };
 
-#define BBT_SCAN_OPTIONS (NAND_BBT_SCANLASTPAGE | NAND_BBT_SCAN2NDPAGE | \
-               NAND_BBT_SCANBYTE1AND6)
+#define BADBLOCK_SCAN_MASK (~NAND_BBT_NO_OOB)
 /**
- * nand_create_default_bbt_descr - [Internal] Creates a BBT descriptor structure
- * @this:      NAND chip to create descriptor for
+ * nand_create_badblock_pattern - [INTERN] Creates a BBT descriptor structure
+ * @this: NAND chip to create descriptor for
  *
  * This function allocates and initializes a nand_bbt_descr for BBM detection
- * based on the properties of "this". The new descriptor is stored in
+ * based on the properties of @this. The new descriptor is stored in
  * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when
  * passed to this function.
- *
  */
-static int nand_create_default_bbt_descr(struct nand_chip *this)
+static int nand_create_badblock_pattern(struct nand_chip *this)
 {
        struct nand_bbt_descr *bd;
        if (this->badblock_pattern) {
-               printk(KERN_WARNING "BBT descr already allocated; not replacing.\n");
+               pr_warn("Bad block pattern already allocated; not replacing\n");
                return -EINVAL;
        }
        bd = kzalloc(sizeof(*bd), GFP_KERNEL);
-       if (!bd) {
-               printk(KERN_ERR "nand_create_default_bbt_descr: Out of memory\n");
+       if (!bd)
                return -ENOMEM;
-       }
-       bd->options = this->options & BBT_SCAN_OPTIONS;
+       bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
        bd->offs = this->badblockpos;
        bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
        bd->pattern = scan_ff_pattern;
@@ -1365,22 +1318,20 @@ static int nand_create_default_bbt_descr(struct nand_chip *this)
 
 /**
  * nand_default_bbt - [NAND Interface] Select a default bad block table for the device
- * @mtd:       MTD device structure
- *
- * This function selects the default bad block table
- * support for the device and calls the nand_scan_bbt function
+ * @mtd: MTD device structure
  *
-*/
+ * This function selects the default bad block table support for the device and
+ * calls the nand_scan_bbt function.
+ */
 int nand_default_bbt(struct mtd_info *mtd)
 {
        struct nand_chip *this = mtd->priv;
 
-       /* Default for AG-AND. We must use a flash based
-        * bad block table as the devices have factory marked
-        * _good_ blocks. Erasing those blocks leads to loss
-        * of the good / bad information, so we _must_ store
-        * this information in a good / bad table during
-        * startup
+       /*
+        * Default for AG-AND. We must use a flash based bad block table as the
+        * devices have factory marked _good_ blocks. Erasing those blocks
+        * leads to loss of the good / bad information, so we _must_ store this
+        * information in a good / bad table during startup.
         */
        if (this->options & NAND_IS_AND) {
                /* Use the default pattern descriptors */
@@ -1388,17 +1339,17 @@ int nand_default_bbt(struct mtd_info *mtd)
                        this->bbt_td = &bbt_main_descr;
                        this->bbt_md = &bbt_mirror_descr;
                }
-               this->options |= NAND_USE_FLASH_BBT;
+               this->bbt_options |= NAND_BBT_USE_FLASH;
                return nand_scan_bbt(mtd, &agand_flashbased);
        }
 
-       /* Is a flash based bad block table requested ? */
-       if (this->options & NAND_USE_FLASH_BBT) {
+       /* Is a flash based bad block table requested? */
+       if (this->bbt_options & NAND_BBT_USE_FLASH) {
                /* Use the default pattern descriptors */
                if (!this->bbt_td) {
-                       if (this->options & NAND_USE_FLASH_BBT_NO_OOB) {
-                               this->bbt_td = &bbt_main_no_bbt_descr;
-                               this->bbt_md = &bbt_mirror_no_bbt_descr;
+                       if (this->bbt_options & NAND_BBT_NO_OOB) {
+                               this->bbt_td = &bbt_main_no_oob_descr;
+                               this->bbt_md = &bbt_mirror_no_oob_descr;
                        } else {
                                this->bbt_td = &bbt_main_descr;
                                this->bbt_md = &bbt_mirror_descr;
@@ -1410,18 +1361,17 @@ int nand_default_bbt(struct mtd_info *mtd)
        }
 
        if (!this->badblock_pattern)
-               nand_create_default_bbt_descr(this);
+               nand_create_badblock_pattern(this);
 
        return nand_scan_bbt(mtd, this->badblock_pattern);
 }
 
 /**
  * nand_isbad_bbt - [NAND Interface] Check if a block is bad
- * @mtd:       MTD device structure
- * @offs:      offset in the device
- * @allowbbt:  allow access to bad block table region
- *
-*/
+ * @mtd: MTD device structure
+ * @offs: offset in the device
+ * @allowbbt: allow access to bad block table region
+ */
 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
 {
        struct nand_chip *this = mtd->priv;
index 39535497f8dfede06d6ca0e7ee009178fc7b8569..f856778b5e1a3209dbd962c7fc88aececb32b9bc 100644 (file)
@@ -71,14 +71,15 @@ const struct nand_flash_dev nand_flash_ids[] = {
         * These are the new chips with large page size. The pagesize and the
         * erasesize is determined from the extended id bytes
         */
-#define LP_OPTIONS (NAND_SAMSUNG_LP_OPTIONS | NAND_NO_READRDY | NAND_NO_AUTOINCR)
+#define LP_OPTIONS NAND_SAMSUNG_LP_OPTIONS
 #define LP_OPTIONS16 (LP_OPTIONS | NAND_BUSWIDTH_16)
 
-       /*512 Megabit */
+       /* 512 Megabit */
        {"NAND 64MiB 1,8V 8-bit",       0xA2, 0,  64, 0, LP_OPTIONS},
        {"NAND 64MiB 1,8V 8-bit",       0xA0, 0,  64, 0, LP_OPTIONS},
        {"NAND 64MiB 3,3V 8-bit",       0xF2, 0,  64, 0, LP_OPTIONS},
        {"NAND 64MiB 3,3V 8-bit",       0xD0, 0,  64, 0, LP_OPTIONS},
+       {"NAND 64MiB 3,3V 8-bit",       0xF0, 0,  64, 0, LP_OPTIONS},
        {"NAND 64MiB 1,8V 16-bit",      0xB2, 0,  64, 0, LP_OPTIONS16},
        {"NAND 64MiB 1,8V 16-bit",      0xB0, 0,  64, 0, LP_OPTIONS16},
        {"NAND 64MiB 3,3V 16-bit",      0xC2, 0,  64, 0, LP_OPTIONS16},
@@ -157,9 +158,7 @@ const struct nand_flash_dev nand_flash_ids[] = {
         * writes possible, but not implemented now
         */
        {"AND 128MiB 3,3V 8-bit",       0x01, 2048, 128, 0x4000,
-        NAND_IS_AND | NAND_NO_AUTOINCR |NAND_NO_READRDY | NAND_4PAGE_ARRAY |
-        BBT_AUTO_REFRESH
-       },
+        NAND_IS_AND | NAND_4PAGE_ARRAY | BBT_AUTO_REFRESH},
 
        {NULL,}
 };
@@ -176,6 +175,9 @@ const struct nand_manufacturers nand_manuf_ids[] = {
        {NAND_MFR_STMICRO, "ST Micro"},
        {NAND_MFR_HYNIX, "Hynix"},
        {NAND_MFR_MICRON, "Micron"},
-       {NAND_MFR_AMD, "AMD"},
+       {NAND_MFR_AMD, "AMD/Spansion"},
+       {NAND_MFR_MACRONIX, "Macronix"},
+       {NAND_MFR_EON, "Eon"},
        {0x0, "Unknown"}
 };
+
index 4727f9c9892517df97b5951e88f11b384177ba01..d81972ca27baa9f851af9aa872da262386f31d2c 100644 (file)
@@ -121,7 +121,7 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
                WATCHDOG_RESET();
 
                if (!opts->scrub && bbtest) {
-                       int ret = meminfo->block_isbad(meminfo, erase.addr);
+                       int ret = mtd_block_isbad(meminfo, erase.addr);
                        if (ret > 0) {
                                if (!opts->quiet)
                                        printf("\rSkipping bad block at  "
@@ -144,7 +144,7 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
 
                erased_length++;
 
-               result = meminfo->erase(meminfo, &erase);
+               result = mtd_erase(meminfo, &erase);
                if (result != 0) {
                        printf("\n%s: MTD Erase failure: %d\n",
                               mtd_device, result);
@@ -153,15 +153,16 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
 
                /* format for JFFS2 ? */
                if (opts->jffs2 && chip->ecc.layout->oobavail >= 8) {
-                       chip->ops.ooblen = 8;
-                       chip->ops.datbuf = NULL;
-                       chip->ops.oobbuf = (uint8_t *)&cleanmarker;
-                       chip->ops.ooboffs = 0;
-                       chip->ops.mode = MTD_OOB_AUTO;
+                       struct mtd_oob_ops ops;
+                       ops.ooblen = 8;
+                       ops.datbuf = NULL;
+                       ops.oobbuf = (uint8_t *)&cleanmarker;
+                       ops.ooboffs = 0;
+                       ops.mode = MTD_OPS_AUTO_OOB;
 
-                       result = meminfo->write_oob(meminfo,
+                       result = mtd_write_oob(meminfo,
                                                    erase.addr,
-                                                   &chip->ops);
+                                                   &ops);
                        if (result != 0) {
                                printf("\n%s: MTD writeoob failure: %d\n",
                                       mtd_device, result);
@@ -458,7 +459,8 @@ static int check_skip_len(nand_info_t *nand, loff_t offset, size_t length,
 static size_t drop_ffs(const nand_info_t *nand, const u_char *buf,
                        const size_t *len)
 {
-       size_t i, l = *len;
+       size_t l = *len;
+       ssize_t i;
 
        for (i = l - 1; i >= 0; i--)
                if (buf[i] != 0xFF)
@@ -604,7 +606,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
 
                        ops.len = pagesize;
                        ops.ooblen = nand->oobsize;
-                       ops.mode = MTD_OOB_AUTO;
+                       ops.mode = MTD_OPS_AUTO_OOB;
                        ops.ooboffs = 0;
 
                        pages = write_size / pagesize_oob;
@@ -614,7 +616,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                                ops.datbuf = p_buffer;
                                ops.oobbuf = ops.datbuf + pagesize;
 
-                               rval = nand->write_oob(nand, offset, &ops);
+                               rval = mtd_write_oob(nand, offset, &ops);
                                if (rval != 0)
                                        break;
 
index 213d2c945a9a878d8bcd15ec5f16c219d240ba3d..94b90332d622acb518d3006857ca6e9ecba99dd7 100644 (file)
@@ -216,6 +216,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = 256;
        nand->ecc.bytes = 3;
+       nand->ecc.strength = 1;
        nand->select_chip = ndfc_select_chip;
 
 #ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
index b76f4cbb5e6d43ab4217ddbdc15e6b735c7893f4..dc8e5137397d6035a024433b9a9c9e76e2d60737 100644 (file)
@@ -212,6 +212,7 @@ int board_nand_init(struct nand_chip *chip)
        chip->ecc.mode = NAND_ECC_HW;
        chip->ecc.bytes = 3;
        chip->ecc.size = 512;
+       chip->ecc.strength = 1;
        chip->ecc.layout = &nomadik_ecc_layout;
        chip->ecc.calculate = nomadik_ecc_calculate;
        chip->ecc.hwctl = nomadik_ecc_hwctl;
index bc1bcad3bad6d66576167dfb26add5651f959c7c..5d088227ea7024423bbabce0d078adc3f6fe6088 100644 (file)
@@ -590,11 +590,12 @@ static int omap_correct_data_bch(struct mtd_info *mtd, uint8_t *dat,
  * @mtd:       mtd info structure
  * @chip:      nand chip info structure
  * @buf:       buffer to store read data
+ * @oob_required: caller expects OOB data read to chip->oob_poi
  * @page:      page number to read
  *
  */
 static int omap_read_page_bch(struct mtd_info *mtd, struct nand_chip *chip,
-                               uint8_t *buf, int page)
+                               uint8_t *buf, int oob_required, int page)
 {
        int i, eccsize = chip->ecc.size;
        int eccbytes = chip->ecc.bytes;
@@ -804,6 +805,7 @@ void omap_nand_switch_ecc(uint32_t hardware, uint32_t eccstrength)
        nand->ecc.hwctl = NULL;
        nand->ecc.correct = NULL;
        nand->ecc.calculate = NULL;
+       nand->ecc.strength = eccstrength;
 
        /* Setup the ecc configurations again */
        if (hardware) {
@@ -901,7 +903,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->IO_ADDR_W = (void __iomem *)&gpmc_cfg->cs[cs].nand_cmd;
 
        nand->cmd_ctrl = omap_nand_hwcontrol;
-       nand->options = NAND_NO_PADDING | NAND_CACHEPRG | NAND_NO_AUTOINCR;
+       nand->options = NAND_NO_PADDING | NAND_CACHEPRG;
        /* If we are 16 bit dev, our gpmc config tells us that */
        if ((readl(&gpmc_cfg->cs[cs].config1) & 0x3000) == 0x1000)
                nand->options |= NAND_BUSWIDTH_16;
@@ -934,6 +936,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.layout = &hw_bch8_nand_oob;
        nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
        nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
+       nand->ecc.strength = 8;
        nand->ecc.hwctl = omap_enable_ecc_bch;
        nand->ecc.correct = omap_correct_data_bch;
        nand->ecc.calculate = omap_calculate_ecc_bch;
@@ -952,6 +955,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.hwctl = omap_enable_hwecc;
        nand->ecc.correct = omap_correct_data;
        nand->ecc.calculate = omap_calculate_ecc;
+       nand->ecc.strength = 1;
        omap_hwecc_init(nand);
 #endif
 #endif
index e1a459b009a283d0b287d2131b77753f88725831..43d8213e04a10b7c4add28d1d951fc013cf75ac2 100644 (file)
@@ -173,6 +173,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
        nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
+       nand->ecc.strength = 1;
 #else
        nand->ecc.mode = NAND_ECC_SOFT;
 #endif
index 4d94cc6f562819c98b0ca3801f31d5a39cdd6cb1..6afbec61ee2c506904e11421b1ce9176ed9a168f 100644 (file)
@@ -707,7 +707,7 @@ static int nand_rw_page(struct mtd_info *mtd, struct nand_chip *chip,
  *             -EIO when command timeout
  */
 static int nand_read_page_hwecc(struct mtd_info *mtd,
-       struct nand_chip *chip, uint8_t *buf, int page)
+       struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
 {
        return nand_rw_page(mtd, chip, buf, page, 1, 0);
 }
@@ -719,8 +719,8 @@ static int nand_read_page_hwecc(struct mtd_info *mtd,
  * @param chip nand chip info structure
  * @param buf  data buffer
  */
-static void nand_write_page_hwecc(struct mtd_info *mtd,
-       struct nand_chip *chip, const uint8_t *buf)
+static int nand_write_page_hwecc(struct mtd_info *mtd,
+       struct nand_chip *chip, const uint8_t *buf, int oob_required)
 {
        int page;
        struct nand_drv *info;
@@ -731,6 +731,7 @@ static void nand_write_page_hwecc(struct mtd_info *mtd,
                (readl(&info->reg->addr_reg2) << 16);
 
        nand_rw_page(mtd, chip, (uint8_t *)buf, page, 1, 1);
+       return 0;
 }
 
 
@@ -746,7 +747,7 @@ static void nand_write_page_hwecc(struct mtd_info *mtd,
  *             -EIO when command timeout
  */
 static int nand_read_page_raw(struct mtd_info *mtd,
-       struct nand_chip *chip, uint8_t *buf, int page)
+       struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
 {
        return nand_rw_page(mtd, chip, buf, page, 0, 0);
 }
@@ -758,8 +759,8 @@ static int nand_read_page_raw(struct mtd_info *mtd,
  * @param chip nand chip info structure
  * @param buf  data buffer
  */
-static void nand_write_page_raw(struct mtd_info *mtd,
-               struct nand_chip *chip, const uint8_t *buf)
+static int nand_write_page_raw(struct mtd_info *mtd,
+               struct nand_chip *chip, const uint8_t *buf, int oob_required)
 {
        int page;
        struct nand_drv *info;
@@ -769,6 +770,7 @@ static void nand_write_page_raw(struct mtd_info *mtd,
                (readl(&info->reg->addr_reg2) << 16);
 
        nand_rw_page(mtd, chip, (uint8_t *)buf, page, 0, 1);
+       return 0;
 }
 
 /**
@@ -873,19 +875,13 @@ static int nand_rw_oob(struct mtd_info *mtd, struct nand_chip *chip,
  * @param mtd          mtd info structure
  * @param chip         nand chip info structure
  * @param page         page number to read
- * @param sndcmd       flag whether to issue read command or not
- * @return     1 - issue read command next time
- *             0 - not to issue
  */
 static int nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
-       int page, int sndcmd)
+       int page)
 {
-       if (sndcmd) {
-               chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
-               sndcmd = 0;
-       }
+       chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
        nand_rw_oob(mtd, chip, page, 0, 0);
-       return sndcmd;
+       return 0;
 }
 
 /**
@@ -1018,6 +1014,7 @@ int tegra_nand_init(struct nand_chip *nand, int devnum)
        nand->ecc.write_page_raw = nand_write_page_raw;
        nand->ecc.read_oob = nand_read_oob;
        nand->ecc.write_oob = nand_write_oob;
+       nand->ecc.strength = 1;
        nand->select_chip = nand_select_chip;
        nand->dev_ready  = nand_dev_ready;
        nand->priv = &nand_ctrl;
index 7e74be75f8195aaeeb4895db4bca6e0bf47b5403..622b8698083a067f60aaa3efd35d337213ecb09d 100644 (file)
@@ -224,7 +224,7 @@ enum {
 #define BCH_DEC_STATUS_MAX_CORR_CNT_MASK       (0x1f << 8)
 #define BCH_DEC_STATUS_PAGE_NUMBER_MASK                0xFF
 
-#define LP_OPTIONS (NAND_NO_READRDY | NAND_NO_AUTOINCR)
+#define LP_OPTIONS     0
 
 struct nand_ctlr {
        u32     command;        /* offset 00h */
index 858e322743b5f6e08677a0488d204024b5cd3e7a..ddfe7e7c756dbff2cb385d88e5bbc27b0a496369 100644 (file)
@@ -743,7 +743,7 @@ static void onenand_release_device(struct mtd_info *mtd)
 }
 
 /**
- * onenand_transfer_auto_oob - [Internal] oob auto-placement transfer
+ * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
  * @param mtd          MTD device structure
  * @param buf          destination address
  * @param column       oob offset to read from
@@ -807,7 +807,7 @@ static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
                return status;
 
        /* check if we failed due to uncorrectable error */
-       if (status != -EBADMSG && status != ONENAND_BBT_READ_ECC_ERROR)
+       if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
                return status;
 
        /* check if address lies in MLC region */
@@ -847,7 +847,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
 
        MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_read_ops_nolock: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len);
 
-       if (ops->mode == MTD_OOB_AUTO)
+       if (ops->mode == MTD_OPS_AUTO_OOB)
                oobsize = this->ecclayout->oobavail;
        else
                oobsize = mtd->oobsize;
@@ -914,7 +914,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
                        thisooblen = oobsize - oobcolumn;
                        thisooblen = min_t(int, thisooblen, ooblen - oobread);
 
-                       if (ops->mode == MTD_OOB_AUTO)
+                       if (ops->mode == MTD_OPS_AUTO_OOB)
                                onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
                        else
                                this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
@@ -929,7 +929,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
                        if (unlikely(ret))
                                ret = onenand_recover_lsb(mtd, from, ret);
                        onenand_update_bufferram(mtd, from, !ret);
-                       if (ret == -EBADMSG)
+                       if (mtd_is_eccerr(ret))
                                ret = 0;
                }
 
@@ -950,7 +950,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
                        /* Now wait for load */
                        ret = this->wait(mtd, FL_READING);
                        onenand_update_bufferram(mtd, from, !ret);
-                       if (ret == -EBADMSG)
+                       if (mtd_is_eccerr(ret))
                                ret = 0;
                }
        }
@@ -987,7 +987,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
        struct mtd_ecc_stats stats;
        int read = 0, thislen, column, oobsize;
        size_t len = ops->ooblen;
-       mtd_oob_mode_t mode = ops->mode;
+       unsigned int mode = ops->mode;
        u_char *buf = ops->oobbuf;
        int ret = 0, readcmd;
 
@@ -998,7 +998,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
        /* Initialize return length value */
        ops->oobretlen = 0;
 
-       if (mode == MTD_OOB_AUTO)
+       if (mode == MTD_OPS_AUTO_OOB)
                oobsize = this->ecclayout->oobavail;
        else
                oobsize = mtd->oobsize;
@@ -1041,7 +1041,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
                        break;
                }
 
-               if (mode == MTD_OOB_AUTO)
+               if (mode == MTD_OPS_AUTO_OOB)
                        onenand_transfer_auto_oob(mtd, buf, column, thislen);
                else
                        this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen);
@@ -1115,10 +1115,10 @@ int onenand_read_oob(struct mtd_info *mtd, loff_t from,
        int ret;
 
        switch (ops->mode) {
-       case MTD_OOB_PLACE:
-       case MTD_OOB_AUTO:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_AUTO_OOB:
                break;
-       case MTD_OOB_RAW:
+       case MTD_OPS_RAW:
                /* Not implemented yet */
        default:
                return -EINVAL;
@@ -1337,7 +1337,7 @@ static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr,
 #define NOTALIGNED(x)  ((x & (this->subpagesize - 1)) != 0)
 
 /**
- * onenand_fill_auto_oob - [Internal] oob auto-placement transfer
+ * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
  * @param mtd           MTD device structure
  * @param oob_buf       oob buffer
  * @param buf           source address
@@ -1404,19 +1404,13 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
        ops->retlen = 0;
        ops->oobretlen = 0;
 
-       /* Do not allow writes past end of device */
-       if (unlikely((to + len) > mtd->size)) {
-               printk(KERN_ERR "onenand_write_ops_nolock: Attempt write to past end of device\n");
-               return -EINVAL;
-       }
-
        /* Reject writes, which are not page aligned */
        if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
                printk(KERN_ERR "onenand_write_ops_nolock: Attempt to write not page aligned data\n");
                return -EINVAL;
        }
 
-       if (ops->mode == MTD_OOB_AUTO)
+       if (ops->mode == MTD_OPS_AUTO_OOB)
                oobsize = this->ecclayout->oobavail;
        else
                oobsize = mtd->oobsize;
@@ -1450,7 +1444,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
                        /* We send data to spare ram with oobsize
                         *                          * to prevent byte access */
                        memset(oobbuf, 0xff, mtd->oobsize);
-                       if (ops->mode == MTD_OOB_AUTO)
+                       if (ops->mode == MTD_OPS_AUTO_OOB)
                                onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
                        else
                                memcpy(oobbuf + oobcolumn, oob, thisooblen);
@@ -1502,7 +1496,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
 }
 
 /**
- * onenand_write_oob_nolock - [Internal] OneNAND write out-of-band
+ * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
  * @param mtd           MTD device structure
  * @param to            offset to write to
  * @param len           number of bytes to write
@@ -1521,7 +1515,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
        u_char *oobbuf;
        size_t len = ops->ooblen;
        const u_char *buf = ops->oobbuf;
-       mtd_oob_mode_t mode = ops->mode;
+       unsigned int mode = ops->mode;
 
        to += ops->ooboffs;
 
@@ -1530,7 +1524,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
        /* Initialize retlen, in case of early exit */
        ops->oobretlen = 0;
 
-       if (mode == MTD_OOB_AUTO)
+       if (mode == MTD_OPS_AUTO_OOB)
                oobsize = this->ecclayout->oobavail;
        else
                oobsize = mtd->oobsize;
@@ -1571,7 +1565,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
                /* We send data to spare ram with oobsize
                 * to prevent byte access */
                memset(oobbuf, 0xff, mtd->oobsize);
-               if (mode == MTD_OOB_AUTO)
+               if (mode == MTD_OPS_AUTO_OOB)
                        onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
                else
                        memcpy(oobbuf + column, buf, thislen);
@@ -1661,10 +1655,10 @@ int onenand_write_oob(struct mtd_info *mtd, loff_t to,
        int ret;
 
        switch (ops->mode) {
-       case MTD_OOB_PLACE:
-       case MTD_OOB_AUTO:
+       case MTD_OPS_PLACE_OOB:
+       case MTD_OPS_AUTO_OOB:
                break;
-       case MTD_OOB_RAW:
+       case MTD_OPS_RAW:
                /* Not implemented yet */
        default:
                return -EINVAL;
@@ -1720,13 +1714,6 @@ int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
        MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_erase: start = 0x%08x, len = %i\n",
                        (unsigned int) addr, len);
 
-       /* Do not allow erase past end of device */
-       if (unlikely((len + addr) > mtd->size)) {
-               MTDDEBUG(MTD_DEBUG_LEVEL0, "onenand_erase:"
-                                       "Erase past end of device\n");
-               return -EINVAL;
-       }
-
        if (FLEXONENAND(this)) {
                /* Find the eraseregion of this address */
                i = flexonenand_region(mtd, addr);
@@ -1762,8 +1749,6 @@ int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
                return -EINVAL;
        }
 
-       instr->fail_addr = 0xffffffff;
-
        /* Grab the lock and see if the device is available */
        onenand_get_device(mtd, FL_ERASING);
 
@@ -1889,7 +1874,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
        struct bbm_info *bbm = this->bbm;
        u_char buf[2] = {0, 0};
        struct mtd_oob_ops ops = {
-               .mode = MTD_OOB_PLACE,
+               .mode = MTD_OPS_PLACE_OOB,
                .ooblen = 2,
                .oobbuf = buf,
                .ooboffs = 0,
@@ -1915,7 +1900,6 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
  */
 int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 {
-       struct onenand_chip *this = mtd->priv;
        int ret;
 
        ret = onenand_block_isbad(mtd, ofs);
@@ -1926,7 +1910,7 @@ int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
                return ret;
        }
 
-       ret = this->block_markbad(mtd, ofs);
+       ret = mtd_block_markbad(mtd, ofs);
        return ret;
 }
 
@@ -2386,7 +2370,7 @@ static int flexonenand_check_blocks_erased(struct mtd_info *mtd,
        int i, ret;
        int block;
        struct mtd_oob_ops ops = {
-               .mode = MTD_OOB_PLACE,
+               .mode = MTD_OPS_PLACE_OOB,
                .ooboffs = 0,
                .ooblen = mtd->oobsize,
                .datbuf = NULL,
@@ -2645,14 +2629,14 @@ int onenand_probe(struct mtd_info *mtd)
                mtd->size = this->chipsize;
 
        mtd->flags = MTD_CAP_NANDFLASH;
-       mtd->erase = onenand_erase;
-       mtd->read = onenand_read;
-       mtd->write = onenand_write;
-       mtd->read_oob = onenand_read_oob;
-       mtd->write_oob = onenand_write_oob;
-       mtd->sync = onenand_sync;
-       mtd->block_isbad = onenand_block_isbad;
-       mtd->block_markbad = onenand_block_markbad;
+       mtd->_erase = onenand_erase;
+       mtd->_read = onenand_read;
+       mtd->_write = onenand_write;
+       mtd->_read_oob = onenand_read_oob;
+       mtd->_write_oob = onenand_write_oob;
+       mtd->_sync = onenand_sync;
+       mtd->_block_isbad = onenand_block_isbad;
+       mtd->_block_markbad = onenand_block_markbad;
 
        return 0;
 }
index 9d5da54708ec9ed9db9c83eff0b9939adb6d90bd..0267c2c5c90a8b7f8b0bba69422638e625c22c0c 100644 (file)
@@ -87,7 +87,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t * buf,
        startblock = 0;
        from = 0;
 
-       ops.mode = MTD_OOB_PLACE;
+       ops.mode = MTD_OPS_PLACE_OOB;
        ops.ooblen = readlen;
        ops.oobbuf = buf;
        ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0;
@@ -200,10 +200,8 @@ int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        len = this->chipsize >> (this->erase_shift + 2);
        /* Allocate memory (2bit per block) */
        bbm->bbt = malloc(len);
-       if (!bbm->bbt) {
-               printk(KERN_ERR "onenand_scan_bbt: Out of memory\n");
+       if (!bbm->bbt)
                return -ENOMEM;
-       }
        /* Clear the memory bad block table */
        memset(bbm->bbt, 0x00, len);
 
index 2218e2f027ffd98b3220189c455a59ee4cbd6a15..b3ef90f136367e954aaf08a2477f9c17810fd620 100644 (file)
@@ -101,7 +101,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {
                .idcode2 = 0x4d01,
                .pages_per_sector = 256,
                .nr_sectors = 256,
-               .name = "S25FL129P_64K",
+               .name = "S25FL129P_64K/S25FL128S",
        },
        {
                .idcode1 = 0x0219,
index a708162e43a826846584cf1440a0d783bbd4a53a..25888220df287e99a673a6a95c97de5af76c8b4b 100644 (file)
@@ -539,7 +539,7 @@ static int io_init(struct ubi_device *ubi)
        ubi->peb_count  = mtd_div_by_eb(ubi->mtd->size, ubi->mtd);
        ubi->flash_size = ubi->mtd->size;
 
-       if (ubi->mtd->block_isbad && ubi->mtd->block_markbad)
+       if (mtd_can_have_bb(ubi->mtd))
                ubi->bad_allowed = 1;
 
        ubi->min_io_size = ubi->mtd->writesize;
index d523c94b129df74a30ae32744847540320c83362..d2d3c9c5805d1b21fb5a3c79b183968572ee22e5 100644 (file)
@@ -460,7 +460,7 @@ retry:
                if (err == UBI_IO_BITFLIPS) {
                        scrub = 1;
                        err = 0;
-               } else if (err == -EBADMSG) {
+               } else if (mtd_is_eccerr(err)) {
                        if (vol->vol_type == UBI_DYNAMIC_VOLUME)
                                goto out_unlock;
                        scrub = 1;
index 8423894000bcc41597c47c80992bbe7134164fec..05de9aeb6eea6c25b7001a5b6c783383edf1ca7f 100644 (file)
@@ -154,7 +154,7 @@ int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
 
        addr = (loff_t)pnum * ubi->peb_size + offset;
 retry:
-       err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf);
+       err = mtd_read(ubi->mtd, addr, len, &read, buf);
        if (err) {
                if (err == -EUCLEAN) {
                        /*
@@ -268,7 +268,7 @@ int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
        }
 
        addr = (loff_t)pnum * ubi->peb_size + offset;
-       err = ubi->mtd->write(ubi->mtd, addr, len, &written, buf);
+       err = mtd_write(ubi->mtd, addr, len, &written, buf);
        if (err) {
                ubi_err("error %d while writing %d bytes to PEB %d:%d, written"
                        " %zd bytes", err, len, pnum, offset, written);
@@ -318,7 +318,7 @@ retry:
        ei.callback = erase_callback;
        ei.priv     = (unsigned long)&wq;
 
-       err = ubi->mtd->erase(ubi->mtd, &ei);
+       err = mtd_erase(ubi->mtd, &ei);
        if (err) {
                if (retries++ < UBI_IO_RETRIES) {
                        dbg_io("error %d while erasing PEB %d, retry",
@@ -516,7 +516,7 @@ int ubi_io_is_bad(const struct ubi_device *ubi, int pnum)
        if (ubi->bad_allowed) {
                int ret;
 
-               ret = mtd->block_isbad(mtd, (loff_t)pnum * ubi->peb_size);
+               ret = mtd_block_isbad(mtd, (loff_t)pnum * ubi->peb_size);
                if (ret < 0)
                        ubi_err("error %d while checking if PEB %d is bad",
                                ret, pnum);
@@ -551,7 +551,7 @@ int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum)
        if (!ubi->bad_allowed)
                return 0;
 
-       err = mtd->block_markbad(mtd, (loff_t)pnum * ubi->peb_size);
+       err = mtd_block_markbad(mtd, (loff_t)pnum * ubi->peb_size);
        if (err)
                ubi_err("cannot mark PEB %d bad, error %d", pnum, err);
        return err;
@@ -1242,7 +1242,7 @@ static int paranoid_check_all_ff(struct ubi_device *ubi, int pnum, int offset,
        loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
 
        mutex_lock(&ubi->dbg_buf_mutex);
-       err = ubi->mtd->read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf);
+       err = mtd_read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf);
        if (err && err != -EUCLEAN) {
                ubi_err("error %d while reading %d bytes from PEB %d:%d, "
                        "read %zd bytes", err, len, pnum, offset, read);
index 423d479152f367fdb25d7fec024fe23421d1dd53..e553188797cd8a41a924cf05484b32fd060e734a 100644 (file)
@@ -349,7 +349,7 @@ int ubi_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,
                return 0;
 
        err = ubi_eba_read_leb(ubi, vol, lnum, buf, offset, len, check);
-       if (err && err == -EBADMSG && vol->vol_type == UBI_STATIC_VOLUME) {
+       if (err && mtd_is_eccerr(err) && vol->vol_type == UBI_STATIC_VOLUME) {
                ubi_warn("mark volume %d as corrupted", vol_id);
                vol->corrupted = 1;
        }
index a6410bfb6bce4f82211cbdd8ee54401dadedbc77..e8660d997037e995bd5cfa9a4f14b4d3b6f4b5d3 100644 (file)
@@ -82,7 +82,7 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)
 
                err = ubi_eba_read_leb(ubi, vol, i, buf, 0, size, 1);
                if (err) {
-                       if (err == -EBADMSG)
+                       if (mtd_is_eccerr(err))
                                err = 1;
                        break;
                }
index f679f06494b6c79f355976826695693aead1efd0..29d23200104a26e0a4ea552750e0890e6e2fe03d 100644 (file)
@@ -388,7 +388,7 @@ static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
 
                err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0,
                                       ubi->vtbl_size);
-               if (err == UBI_IO_BITFLIPS || err == -EBADMSG)
+               if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err))
                        /*
                         * Scrub the PEB later. Note, -EBADMSG indicates an
                         * uncorrectable ECC error, but we have our own CRC and
index 7a36850198f40020ebc33765084f36f734e68b08..379b679d2e47ba41bd229771aff20e801ec1a030 100644 (file)
@@ -109,7 +109,13 @@ struct cpsw_slave_regs {
        u32     flow_thresh;
        u32     port_vlan;
        u32     tx_pri_map;
+#ifdef CONFIG_AM33XX
        u32     gap_thresh;
+#elif defined(CONFIG_TI814X)
+       u32     ts_ctl;
+       u32     ts_seq_ltype;
+       u32     ts_vlan;
+#endif
        u32     sa_lo;
        u32     sa_hi;
 };
index 4dbcdca4a03741f5e3bfa3c334bb2fbcbbe8b7ea..da95e285b70db65f1f6bb709414ca5ff5ec2f8b0 100644 (file)
@@ -516,9 +516,7 @@ static int fec_open(struct eth_device *edev)
 #ifdef FEC_QUIRK_ENET_MAC
        {
                u32 ecr = readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_SPEED;
-               u32 rcr = (readl(&fec->eth->r_cntrl) &
-                               ~(FEC_RCNTRL_RMII | FEC_RCNTRL_RMII_10T)) |
-                               FEC_RCNTRL_RGMII | FEC_RCNTRL_MII_MODE;
+               u32 rcr = readl(&fec->eth->r_cntrl) & ~FEC_RCNTRL_RMII_10T;
                if (speed == _1000BASET)
                        ecr |= FEC_ECNTRL_SPEED;
                else if (speed != _100BASET)
index 8cde7afc1df0e2b5a9f1a112eb8d7f556f43e4af..3b5defefa62e1c9b7614d7c733f06325ba8920cc 100644 (file)
@@ -55,8 +55,10 @@ phy_interface_t fman_port_enet_if(enum fm_port port)
        if (is_device_disabled(port))
                return PHY_INTERFACE_MODE_NONE;
 
-       if ((port == FM1_10GEC1 || port == FM1_10GEC2)
-                       && (is_serdes_configured(XAUI_FM1)))
+       /*B4860 has two 10Gig Mac*/
+       if ((port == FM1_10GEC1 || port == FM1_10GEC2)  &&
+           ((is_serdes_configured(XAUI_FM1_MAC9))      ||
+           (is_serdes_configured(XAUI_FM1_MAC10))))
                return PHY_INTERFACE_MODE_XGMII;
 
        /* Fix me need to handle RGMII here first */
index 5e90d7098db5b51ca09c303636c6fcab42d3593b..af5f4b848ceefb14d535b5c79084bbfaf49ec89c 100644 (file)
@@ -34,6 +34,7 @@ COBJS-$(CONFIG_PHYLIB_10G) += generic_10g.o
 COBJS-$(CONFIG_PHY_ATHEROS) += atheros.o
 COBJS-$(CONFIG_PHY_BROADCOM) += broadcom.o
 COBJS-$(CONFIG_PHY_DAVICOM) += davicom.o
+COBJS-$(CONFIG_PHY_ET1011C) += et1011c.o
 COBJS-$(CONFIG_PHY_LXT) += lxt.o
 COBJS-$(CONFIG_PHY_MARVELL) += marvell.o
 COBJS-$(CONFIG_PHY_MICREL) += micrel.o
diff --git a/drivers/net/phy/et1011c.c b/drivers/net/phy/et1011c.c
new file mode 100644 (file)
index 0000000..5e22399
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * ET1011C PHY driver
+ *
+ * Derived from Linux kernel driver by Chaithrika U S
+ * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.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.
+ *
+ */
+#include <config.h>
+#include <phy.h>
+
+#define ET1011C_CONFIG_REG             (0x16)
+#define ET1011C_TX_FIFO_MASK           (0x3 << 12)
+#define ET1011C_TX_FIFO_DEPTH_8                (0x0 << 12)
+#define ET1011C_TX_FIFO_DEPTH_16       (0x1 << 12)
+#define ET1011C_INTERFACE_MASK         (0x7 << 0)
+#define ET1011C_GMII_INTERFACE         (0x2 << 0)
+#define ET1011C_SYS_CLK_EN             (0x1 << 4)
+#define ET1011C_TX_CLK_EN              (0x1 << 5)
+
+#define ET1011C_STATUS_REG             (0x1A)
+#define ET1011C_DUPLEX_STATUS          (0x1 << 7)
+#define ET1011C_SPEED_MASK             (0x3 << 8)
+#define ET1011C_SPEED_1000             (0x2 << 8)
+#define ET1011C_SPEED_100              (0x1 << 8)
+#define ET1011C_SPEED_10               (0x0 << 8)
+
+static int et1011c_config(struct phy_device *phydev)
+{
+       int ctl = 0;
+       ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
+       if (ctl < 0)
+               return ctl;
+       ctl &= ~(BMCR_FULLDPLX | BMCR_SPEED100 | BMCR_SPEED1000 |
+                BMCR_ANENABLE);
+       /* First clear the PHY */
+       phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, ctl | BMCR_RESET);
+
+       return genphy_config_aneg(phydev);
+}
+
+static int et1011c_parse_status(struct phy_device *phydev)
+{
+       int mii_reg;
+       int speed;
+
+       mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, ET1011C_STATUS_REG);
+
+       if (mii_reg & ET1011C_DUPLEX_STATUS)
+               phydev->duplex = DUPLEX_FULL;
+       else
+               phydev->duplex = DUPLEX_HALF;
+
+       speed = mii_reg & ET1011C_SPEED_MASK;
+       switch (speed) {
+       case ET1011C_SPEED_1000:
+               phydev->speed = SPEED_1000;
+               mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, ET1011C_CONFIG_REG);
+               mii_reg &= ~ET1011C_TX_FIFO_MASK;
+               phy_write(phydev, MDIO_DEVAD_NONE, ET1011C_CONFIG_REG,
+                         mii_reg |
+                         ET1011C_GMII_INTERFACE |
+                         ET1011C_SYS_CLK_EN |
+#ifdef CONFIG_PHY_ET1011C_TX_CLK_FIX
+                         ET1011C_TX_CLK_EN |
+#endif
+                         ET1011C_TX_FIFO_DEPTH_16);
+               break;
+       case ET1011C_SPEED_100:
+               phydev->speed = SPEED_100;
+               break;
+       case ET1011C_SPEED_10:
+               phydev->speed = SPEED_10;
+               break;
+       }
+
+       return 0;
+}
+
+static int et1011c_startup(struct phy_device *phydev)
+{
+       genphy_update_link(phydev);
+       et1011c_parse_status(phydev);
+       return 0;
+}
+
+static struct phy_driver et1011c_driver = {
+       .name           = "ET1011C",
+       .uid            = 0x0282f014,
+       .mask           = 0xfffffff0,
+       .features       = PHY_GBIT_FEATURES,
+       .config         = &et1011c_config,
+       .startup        = &et1011c_startup,
+};
+
+int phy_et1011c_init(void)
+{
+       phy_register(&et1011c_driver);
+
+       return 0;
+}
index 4b271989acbbaf5dbc8c4333e705f29ab0f9d642..46801c791903efcd36167d267a70be0b1ec978c8 100644 (file)
@@ -465,6 +465,16 @@ static struct phy_driver M88E1149S_driver = {
        .shutdown = &genphy_shutdown,
 };
 
+static struct phy_driver M88E1518_driver = {
+       .name = "Marvell 88E1518",
+       .uid = 0x1410dd1,
+       .mask = 0xffffff0,
+       .features = PHY_GBIT_FEATURES,
+       .config = &m88e1111s_config,
+       .startup = &m88e1011s_startup,
+       .shutdown = &genphy_shutdown,
+};
+
 int phy_marvell_init(void)
 {
        phy_register(&M88E1149S_driver);
@@ -474,6 +484,7 @@ int phy_marvell_init(void)
        phy_register(&M88E1118R_driver);
        phy_register(&M88E1111S_driver);
        phy_register(&M88E1011S_driver);
+       phy_register(&M88E1518_driver);
 
        return 0;
 }
index d0ed7666ed98cbeccee364b38dc31f77cd6ce0d5..f8c54814777882e83d17e8ad22b69abcd047f42f 100644 (file)
@@ -430,6 +430,9 @@ int phy_init(void)
 #ifdef CONFIG_PHY_DAVICOM
        phy_davicom_init();
 #endif
+#ifdef CONFIG_PHY_ET1011C
+       phy_et1011c_init();
+#endif
 #ifdef CONFIG_PHY_LXT
        phy_lxt_init();
 #endif
index 78447b711f5e51a8fca4f072d4622618ace28d41..84ce7362f064f71ccff6793d403c40993dbb97c5 100644 (file)
@@ -34,9 +34,21 @@ int tn2020_config(struct phy_device *phydev)
                unsigned short restart_an = (MDIO_AN_CTRL1_RESTART |
                                                MDIO_AN_CTRL1_ENABLE |
                                                MDIO_AN_CTRL1_XNP);
+               u8 phy_hwversion;
 
-               phy_write(phydev, 30, 93, 2);
-               phy_write(phydev, MDIO_MMD_AN, MDIO_CTRL1, restart_an);
+               /*
+                * bit 15:12 of register 30.32 indicates PHY hardware
+                * version. It can be used to distinguish TN80xx from
+                * TN2020. TN2020 needs write 0x2 to 30.93, but TN80xx
+                * needs 0x1.
+                */
+               phy_hwversion = (phy_read(phydev, 30, 32) >> 12) & 0xf;
+               if (phy_hwversion <= 3) {
+                       phy_write(phydev, 30, 93, 2);
+                       phy_write(phydev, MDIO_MMD_AN, MDIO_CTRL1, restart_an);
+               } else {
+                       phy_write(phydev, 30, 93, 1);
+               }
        }
 
        return 0;
index 3596065694902a63455c2f8d80f9030d4d878347..eac9b6f4584466e56d1b9646fb7ff9bae88e53ed 100644 (file)
@@ -33,6 +33,8 @@
 #include <phy.h>
 #include <miiphy.h>
 #include <watchdog.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sys_proto.h>
 
 #if !defined(CONFIG_PHYLIB)
 # error XILINX_GEM_ETHERNET requires PHYLIB
 #define ZYNQ_GEM_NWCTRL_MDEN_MASK      0x00000010 /* Enable MDIO port */
 #define ZYNQ_GEM_NWCTRL_STARTTX_MASK   0x00000200 /* Start tx (tx_go) */
 
-#define ZYNQ_GEM_NWCFG_SPEED           0x00000001 /* 100 Mbps operation */
-#define ZYNQ_GEM_NWCFG_FDEN            0x00000002 /* Full Duplex mode */
-#define ZYNQ_GEM_NWCFG_FSREM           0x00020000 /* FCS removal */
+#define ZYNQ_GEM_NWCFG_SPEED100                0x000000001 /* 100 Mbps operation */
+#define ZYNQ_GEM_NWCFG_SPEED1000       0x000000400 /* 1Gbps operation */
+#define ZYNQ_GEM_NWCFG_FDEN            0x000000002 /* Full Duplex mode */
+#define ZYNQ_GEM_NWCFG_FSREM           0x000020000 /* FCS removal */
 #define ZYNQ_GEM_NWCFG_MDCCLKDIV       0x000080000 /* Div pclk by 32, 80MHz */
+#define ZYNQ_GEM_NWCFG_MDCCLKDIV2      0x0000c0000 /* Div pclk by 48, 120MHz */
 
-#define ZYNQ_GEM_NWCFG_INIT            (ZYNQ_GEM_NWCFG_SPEED | \
-                                       ZYNQ_GEM_NWCFG_FDEN | \
+#define ZYNQ_GEM_NWCFG_INIT            (ZYNQ_GEM_NWCFG_FDEN | \
                                        ZYNQ_GEM_NWCFG_FSREM | \
                                        ZYNQ_GEM_NWCFG_MDCCLKDIV)
 
                                        ZYNQ_GEM_DMACR_TXSIZE | \
                                        ZYNQ_GEM_DMACR_RXBUF)
 
+/* Use MII register 1 (MII status register) to detect PHY */
+#define PHY_DETECT_REG  1
+
+/* Mask used to verify certain PHY features (or register contents)
+ * in the register above:
+ *  0x1000: 10Mbps full duplex support
+ *  0x0800: 10Mbps half duplex support
+ *  0x0008: Auto-negotiation support
+ */
+#define PHY_DETECT_MASK 0x1808
+
 /* Device registers */
 struct zynq_gem_regs {
        u32 nwctrl; /* Network Control reg */
@@ -134,6 +148,8 @@ struct zynq_gem_priv {
        u32 rxbd_current;
        u32 rx_first_buf;
        int phyaddr;
+       u32 emio;
+       int init;
        struct phy_device *phydev;
        struct mii_dev *bus;
 };
@@ -196,6 +212,44 @@ static u32 phywrite(struct eth_device *dev, u32 phy_addr, u32 regnum, u16 data)
                                ZYNQ_GEM_PHYMNTNC_OP_W_MASK, &data);
 }
 
+static void phy_detection(struct eth_device *dev)
+{
+       int i;
+       u16 phyreg;
+       struct zynq_gem_priv *priv = dev->priv;
+
+       if (priv->phyaddr != -1) {
+               phyread(dev, priv->phyaddr, PHY_DETECT_REG, &phyreg);
+               if ((phyreg != 0xFFFF) &&
+                   ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
+                       /* Found a valid PHY address */
+                       debug("Default phy address %d is valid\n",
+                             priv->phyaddr);
+                       return;
+               } else {
+                       debug("PHY address is not setup correctly %d\n",
+                             priv->phyaddr);
+                       priv->phyaddr = -1;
+               }
+       }
+
+       debug("detecting phy address\n");
+       if (priv->phyaddr == -1) {
+               /* detect the PHY address */
+               for (i = 31; i >= 0; i--) {
+                       phyread(dev, i, PHY_DETECT_REG, &phyreg);
+                       if ((phyreg != 0xFFFF) &&
+                           ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
+                               /* Found a valid PHY address */
+                               priv->phyaddr = i;
+                               debug("Found valid phy address, %d\n", i);
+                               return;
+                       }
+               }
+       }
+       printf("PHY is not detected\n");
+}
+
 static int zynq_gem_setup_mac(struct eth_device *dev)
 {
        u32 i, macaddrlow, macaddrhigh;
@@ -226,7 +280,7 @@ static int zynq_gem_setup_mac(struct eth_device *dev)
 
 static int zynq_gem_init(struct eth_device *dev, bd_t * bis)
 {
-       u32 i;
+       u32 i, rclk, clk = 0;
        struct phy_device *phydev;
        const u32 stat_size = (sizeof(struct zynq_gem_regs) -
                                offsetof(struct zynq_gem_regs, stat)) / 4;
@@ -239,59 +293,92 @@ static int zynq_gem_init(struct eth_device *dev, bd_t * bis)
                        SUPPORTED_1000baseT_Half |
                        SUPPORTED_1000baseT_Full;
 
-       /* Disable all interrupts */
-       writel(0xFFFFFFFF, &regs->idr);
-
-       /* Disable the receiver & transmitter */
-       writel(0, &regs->nwctrl);
-       writel(0, &regs->txsr);
-       writel(0, &regs->rxsr);
-       writel(0, &regs->phymntnc);
-
-       /* Clear the Hash registers for the mac address pointed by AddressPtr */
-       writel(0x0, &regs->hashl);
-       /* Write bits [63:32] in TOP */
-       writel(0x0, &regs->hashh);
+       if (!priv->init) {
+               /* Disable all interrupts */
+               writel(0xFFFFFFFF, &regs->idr);
+
+               /* Disable the receiver & transmitter */
+               writel(0, &regs->nwctrl);
+               writel(0, &regs->txsr);
+               writel(0, &regs->rxsr);
+               writel(0, &regs->phymntnc);
+
+               /* Clear the Hash registers for the mac address
+                * pointed by AddressPtr
+                */
+               writel(0x0, &regs->hashl);
+               /* Write bits [63:32] in TOP */
+               writel(0x0, &regs->hashh);
+
+               /* Clear all counters */
+               for (i = 0; i <= stat_size; i++)
+                       readl(&regs->stat[i]);
+
+               /* Setup RxBD space */
+               memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd));
+               /* Create the RxBD ring */
+               memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers));
+
+               for (i = 0; i < RX_BUF; i++) {
+                       priv->rx_bd[i].status = 0xF0000000;
+                       priv->rx_bd[i].addr =
+                                       (u32)((char *)&(priv->rxbuffers) +
+                                                       (i * PKTSIZE_ALIGN));
+               }
+               /* WRAP bit to last BD */
+               priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK;
+               /* Write RxBDs to IP */
+               writel((u32)&(priv->rx_bd), &regs->rxqbase);
 
-       /* Clear all counters */
-       for (i = 0; i <= stat_size; i++)
-               readl(&regs->stat[i]);
+               /* Setup for DMA Configuration register */
+               writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr);
 
-       /* Setup RxBD space */
-       memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd));
-       /* Create the RxBD ring */
-       memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers));
+               /* Setup for Network Control register, MDIO, Rx and Tx enable */
+               setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK);
 
-       for (i = 0; i < RX_BUF; i++) {
-               priv->rx_bd[i].status = 0xF0000000;
-               priv->rx_bd[i].addr = (u32)((char *) &(priv->rxbuffers) +
-                                                       (i * PKTSIZE_ALIGN));
+               priv->init++;
        }
-       /* WRAP bit to last BD */
-       priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK;
-       /* Write RxBDs to IP */
-       writel((u32) &(priv->rx_bd), &regs->rxqbase);
 
-       /* MAC Setup */
-       /* Setup Network Configuration register */
-       writel(ZYNQ_GEM_NWCFG_INIT, &regs->nwcfg);
-
-       /* Setup for DMA Configuration register */
-       writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr);
-
-       /* Setup for Network Control register, MDIO, Rx and Tx enable */
-       setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK |
-                       ZYNQ_GEM_NWCTRL_RXEN_MASK | ZYNQ_GEM_NWCTRL_TXEN_MASK);
+       phy_detection(dev);
 
        /* interface - look at tsec */
        phydev = phy_connect(priv->bus, priv->phyaddr, dev, 0);
 
-       phydev->supported &= supported;
+       phydev->supported = supported | ADVERTISED_Pause |
+                           ADVERTISED_Asym_Pause;
        phydev->advertising = phydev->supported;
        priv->phydev = phydev;
        phy_config(phydev);
        phy_startup(phydev);
 
+       switch (phydev->speed) {
+       case SPEED_1000:
+               writel(ZYNQ_GEM_NWCFG_INIT | ZYNQ_GEM_NWCFG_SPEED1000,
+                      &regs->nwcfg);
+               rclk = (0 << 4) | (1 << 0);
+               clk = (1 << 20) | (8 << 8) | (0 << 4) | (1 << 0);
+               break;
+       case SPEED_100:
+               clrsetbits_le32(&regs->nwcfg, ZYNQ_GEM_NWCFG_SPEED1000,
+                               ZYNQ_GEM_NWCFG_INIT | ZYNQ_GEM_NWCFG_SPEED100);
+               rclk = 1 << 0;
+               clk = (5 << 20) | (8 << 8) | (0 << 4) | (1 << 0);
+               break;
+       case SPEED_10:
+               rclk = 1 << 0;
+               /* FIXME untested */
+               clk = (5 << 20) | (8 << 8) | (0 << 4) | (1 << 0);
+               break;
+       }
+
+       /* Change the rclk and clk only not using EMIO interface */
+       if (!priv->emio)
+               zynq_slcr_gem_clk_setup(dev->iobase !=
+                                       ZYNQ_GEM_BASEADDR0, rclk, clk);
+
+       setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_RXEN_MASK |
+                                       ZYNQ_GEM_NWCTRL_TXEN_MASK);
+
        return 0;
 }
 
@@ -307,11 +394,10 @@ static int zynq_gem_send(struct eth_device *dev, void *ptr, int len)
        writel((u32)&(priv->tx_bd), &regs->txqbase);
 
        /* Setup Tx BD */
-       memset((void *) &(priv->tx_bd), 0, sizeof(struct emac_bd));
+       memset((void *)&(priv->tx_bd), 0, sizeof(struct emac_bd));
 
        priv->tx_bd.addr = (u32)ptr;
-       priv->tx_bd.status = len | ZYNQ_GEM_TXBUF_LAST_MASK |
-                                               ZYNQ_GEM_TXBUF_WRAP_MASK;
+       priv->tx_bd.status = len | ZYNQ_GEM_TXBUF_LAST_MASK;
 
        /* Start transmit */
        setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_STARTTX_MASK);
@@ -364,19 +450,17 @@ static int zynq_gem_recv(struct eth_device *dev)
 
                if ((++priv->rxbd_current) >= RX_BUF)
                        priv->rxbd_current = 0;
-
-               return frame_len;
        }
 
-       return 0;
+       return frame_len;
 }
 
 static void zynq_gem_halt(struct eth_device *dev)
 {
        struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase;
 
-       /* Disable the receiver & transmitter */
-       writel(0, &regs->nwctrl);
+       clrsetbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_RXEN_MASK |
+                                               ZYNQ_GEM_NWCTRL_TXEN_MASK, 0);
 }
 
 static int zynq_gem_miiphyread(const char *devname, uchar addr,
@@ -399,7 +483,7 @@ static int zynq_gem_miiphy_write(const char *devname, uchar addr,
        return phywrite(dev, addr, reg, val);
 }
 
-int zynq_gem_initialize(bd_t *bis, int base_addr)
+int zynq_gem_initialize(bd_t *bis, int base_addr, int phy_addr, u32 emio)
 {
        struct eth_device *dev;
        struct zynq_gem_priv *priv;
@@ -415,11 +499,8 @@ int zynq_gem_initialize(bd_t *bis, int base_addr)
        }
        priv = dev->priv;
 
-#ifdef CONFIG_PHY_ADDR
-       priv->phyaddr = CONFIG_PHY_ADDR;
-#else
-       priv->phyaddr = -1;
-#endif
+       priv->phyaddr = phy_addr;
+       priv->emio = emio;
 
        sprintf(dev->name, "Gem.%x", base_addr);
 
index 1ae35d360bab7250854658ca77efbdec68fca86e..14999447b17d9a8515ecb766c971fc024f33a8c3 100644 (file)
@@ -26,7 +26,8 @@ include $(TOPDIR)/config.mk
 LIB    := $(obj)libpci.o
 
 COBJS-$(CONFIG_FSL_PCI_INIT) += fsl_pci_init.o
-COBJS-$(CONFIG_PCI) += pci.o pci_auto.o pci_indirect.o
+COBJS-$(CONFIG_PCI) += pci.o pci_auto.o
+COBJS-$(CONFIG_PCI_INDIRECT_BRIDGE) += pci_indirect.o
 COBJS-$(CONFIG_FTPCI100) += pci_ftpci100.o
 COBJS-$(CONFIG_IXP_PCI) += pci_ixp.o
 COBJS-$(CONFIG_SH4_PCI) += pci_sh4.o
index 1dac16a9f7da05fc25b19df326f04fe82bb4cd68..a9c42370f999f2e8000425003bc75910e4adfb3d 100644 (file)
@@ -30,7 +30,7 @@ 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-$(CONFIG_PALMAS_POWER)   += palmas.o
 
 COBJS-$(CONFIG_POWER) += power_core.o
 COBJS-$(CONFIG_DIALOG_POWER) += power_dialog.o
diff --git a/drivers/power/palmas.c b/drivers/power/palmas.c
new file mode 100644 (file)
index 0000000..2d275a7
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * (C) Copyright 2012-2013
+ * 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 <palmas.h>
+
+void palmas_init_settings(void)
+{
+#ifdef CONFIG_PALMAS_SMPS7_FPWM
+       int err;
+       /*
+        * Set SMPS7 (1.8 V I/O supply on platforms with TWL6035/37) to
+        * forced PWM mode. This reduces noise (but affects efficiency).
+        */
+       u8 val = SMPS_MODE_SLP_FPWM | SMPS_MODE_ACT_FPWM;
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS7_CTRL, val);
+       if (err)
+               printf("palmas: could not force PWM for SMPS7: err = %d\n",
+                      err);
+#endif
+}
+
+int palmas_mmc1_poweron_ldo(void)
+{
+       u8 val = 0;
+
+#if defined(CONFIG_DRA7XX)
+       /*
+        * Currently valid for the dra7xx_evm board:
+        * Set TPS659038 LDO1 to 3.0 V
+        */
+       val = LDO_VOLT_3V0;
+       if (palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_VOLTAGE, val)) {
+               printf("tps65903x: could not set LDO1 voltage.\n");
+               return 1;
+       }
+       /* TURN ON LDO1 */
+       val = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+       if (palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_CTRL, val)) {
+               printf("tps65903x: could not turn on LDO1.\n");
+               return 1;
+       }
+       return 0;
+#else
+       /*
+        * We assume that this is a OMAP543X + TWL603X board:
+        * Set TWL6035/37 LDO9 to 3.0 V
+        */
+       val = LDO_VOLT_3V0;
+       return twl603x_mmc1_set_ldo9(val);
+#endif
+}
+
+/*
+ * On some OMAP5 + TWL603X hardware the SD card socket and LDO9_IN are
+ * powered by an external 3.3 V regulator, while the output of LDO9
+ * supplies VDDS_SDCARD for the OMAP5 interface only. This implies that
+ * LDO9 could be set to 'bypass' mode when required (e.g. for 3.3 V cards).
+ */
+int twl603x_mmc1_set_ldo9(u8 vsel)
+{
+       u8 cval = 0, vval = 0;  /* Off by default */
+       int err;
+
+       if (vsel) {
+               /* Turn on */
+               if (vsel > LDO_VOLT_3V3) {
+                       /* Put LDO9 in bypass */
+                       cval = LDO9_BYP_EN | RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+                       vval = LDO_VOLT_3V3;
+               } else {
+                       cval = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+                       vval = vsel & 0x3f;
+               }
+       }
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, LDO9_VOLTAGE, vval);
+       if (err) {
+               printf("twl603x: could not set LDO9 %s: err = %d\n",
+                      vsel > LDO_VOLT_3V3 ? "bypass" : "voltage", err);
+               return err;
+       }
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, LDO9_CTRL, cval);
+       if (err)
+               printf("twl603x: could not turn %s LDO9: err = %d\n",
+                      cval ? "on" : "off", err);
+       return err;
+}
+
+#ifdef CONFIG_PALMAS_AUDPWR
+/*
+ * Turn audio codec power and 32 kHz clock on/off. Use for
+ * testing OMAP543X + TWL603X + TWL604X boards only.
+ */
+int twl603x_audio_power(u8 on)
+{
+       u8 cval = 0, vval = 0, c32k = 0;
+       int err;
+
+       if (on) {
+               vval = SMPS_VOLT_2V1;
+               cval = SMPS_MODE_SLP_AUTO | SMPS_MODE_ACT_AUTO;
+               c32k = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+       }
+       /* Set SMPS9 to 2.1 V (for TWL604x), or to 0 (off) */
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS9_VOLTAGE, vval);
+       if (err) {
+               printf("twl603x: could not set SMPS9 voltage: err = %d\n",
+                      err);
+               return err;
+       }
+       /* Turn on or off SMPS9 */
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS9_CTRL, cval);
+       if (err) {
+               printf("twl603x: could not turn SMPS9 %s: err = %d\n",
+                      cval ? "on" : "off", err);
+               return err;
+       }
+       /* Output 32 kHz clock on or off */
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, CLK32KGAUDIO_CTRL, c32k);
+       if (err)
+               printf("twl603x: could not turn CLK32KGAUDIO %s: err = %d\n",
+                      c32k ? "on" : "off", err);
+       return err;
+}
+#endif
+
+/*
+ * Enable/disable back-up battery (or super cap) charging on TWL6035/37.
+ * Please use defined BB_xxx values.
+ */
+int twl603x_enable_bb_charge(u8 bb_fields)
+{
+       u8 val = bb_fields & 0x0f;
+       int err;
+
+       val |= (VRTC_EN_SLP | VRTC_EN_OFF | VRTC_PWEN);
+       err = palmas_i2c_write_u8(TWL603X_CHIP_P1, BB_VRTC_CTRL, val);
+       if (err)
+               printf("twl603x: could not set BB_VRTC_CTRL to 0x%02x: err = %d\n",
+                      val, err);
+       return err;
+}
index e7d5f132b2bccb037de256ec005260ddc026c2e5..6610f787d0c7795a656619b28718944b84202fd1 100644 (file)
 void twl4030_power_reset_init(void)
 {
        u8 val = 0;
-       if (twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, &val,
-                               TWL4030_PM_MASTER_P1_SW_EVENTS)) {
+       if (twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
+                               TWL4030_PM_MASTER_P1_SW_EVENTS, &val)) {
                printf("Error:TWL4030: failed to read the power register\n");
                printf("Could not initialize hardware reset\n");
        } else {
                val |= TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON;
-               if (twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, val,
-                                        TWL4030_PM_MASTER_P1_SW_EVENTS)) {
+               if (twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                                        TWL4030_PM_MASTER_P1_SW_EVENTS, val)) {
                        printf("Error:TWL4030: failed to write the power register\n");
                        printf("Could not initialize hardware reset\n");
                }
@@ -68,8 +68,8 @@ void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val,
        int ret;
 
        /* Select the Voltage */
-       ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, vsel_val,
-                               vsel_reg);
+       ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, vsel_reg,
+                                  vsel_val);
        if (ret != 0) {
                printf("Could not write vsel to reg %02x (%d)\n",
                        vsel_reg, ret);
@@ -77,8 +77,8 @@ void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val,
        }
 
        /* Select the Device Group (enable the supply if dev_grp_sel != 0) */
-       ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, dev_grp_sel,
-                               dev_grp);
+       ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, dev_grp,
+                                  dev_grp_sel);
        if (ret != 0)
                printf("Could not write grp_sel to reg %02x (%d)\n",
                        dev_grp, ret);
index c5a0038cadc2814710a4683a9b279bc37802cbd8..d421e6005bae177ee27b8a30cb32f98e3afdda43 100644 (file)
 
 #include <twl6030.h>
 
-/* Functions to read and write from TWL6030 */
-static inline int twl6030_i2c_write_u8(u8 chip_no, u8 val, u8 reg)
-{
-       return i2c_write(chip_no, reg, 1, &val, 1);
-}
-
-static inline int twl6030_i2c_read_u8(u8 chip_no, u8 *val, u8 reg)
-{
-       return i2c_read(chip_no, reg, 1, val, 1);
-}
-
 static int twl6030_gpadc_read_channel(u8 channel_no)
 {
        u8 lsb = 0;
        u8 msb = 0;
        int ret = 0;
 
-       ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC, &lsb,
-                               GPCH0_LSB + channel_no * 2);
+       ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC,
+                                 GPCH0_LSB + channel_no * 2, &lsb);
        if (ret)
                return ret;
 
-       ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC, &msb,
-                               GPCH0_MSB + channel_no * 2);
+       ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC,
+                                 GPCH0_MSB + channel_no * 2, &msb);
        if (ret)
                return ret;
 
@@ -60,7 +49,7 @@ static int twl6030_gpadc_sw2_trigger(void)
        u8 val;
        int ret = 0;
 
-       ret = twl6030_i2c_write_u8(TWL6030_CHIP_ADC, CTRL_P2_SP2, CTRL_P2);
+       ret = twl6030_i2c_write_u8(TWL6030_CHIP_ADC, CTRL_P2, CTRL_P2_SP2);
        if (ret)
                return ret;
 
@@ -68,7 +57,7 @@ static int twl6030_gpadc_sw2_trigger(void)
        val =  CTRL_P2_BUSY;
 
        while (!((val & CTRL_P2_EOCP2) && (!(val & CTRL_P2_BUSY)))) {
-               ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC, &val, CTRL_P2);
+               ret = twl6030_i2c_read_u8(TWL6030_CHIP_ADC, CTRL_P2, &val);
                if (ret)
                        return ret;
                udelay(1000);
@@ -79,29 +68,29 @@ static int twl6030_gpadc_sw2_trigger(void)
 
 void twl6030_stop_usb_charging(void)
 {
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, 0, CONTROLLER_CTRL1);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CONTROLLER_CTRL1, 0);
 
        return;
 }
 
 void twl6030_start_usb_charging(void)
 {
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CHARGERUSB_VICHRG_1500,
-                                                       CHARGERUSB_VICHRG);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CHARGERUSB_CIN_LIMIT_NONE,
-                                                       CHARGERUSB_CINLIMIT);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, MBAT_TEMP,
-                                                       CONTROLLER_INT_MASK);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, MASK_MCHARGERUSB_THMREG,
-                                                       CHARGERUSB_INT_MASK);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CHARGERUSB_VOREG_4P0,
-                                                       CHARGERUSB_VOREG);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CHARGERUSB_CTRL2_VITERM_400,
-                                                       CHARGERUSB_CTRL2);
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, TERM, CHARGERUSB_CTRL1);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CHARGERUSB_VICHRG, CHARGERUSB_VICHRG_1500);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CHARGERUSB_CINLIMIT, CHARGERUSB_CIN_LIMIT_NONE);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CONTROLLER_INT_MASK, MBAT_TEMP);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CHARGERUSB_INT_MASK, MASK_MCHARGERUSB_THMREG);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CHARGERUSB_VOREG, CHARGERUSB_VOREG_4P0);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CHARGERUSB_CTRL2, CHARGERUSB_CTRL2_VITERM_400);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CHARGERUSB_CTRL1, TERM);
        /* Enable USB charging */
-       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, CONTROLLER_CTRL1_EN_CHARGER,
-                                                       CONTROLLER_CTRL1);
+       twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER,
+                            CONTROLLER_CTRL1, CONTROLLER_CTRL1_EN_CHARGER);
        return;
 }
 
@@ -111,8 +100,8 @@ int twl6030_get_battery_current(void)
        u8 msb = 0;
        u8 lsb = 0;
 
-       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, &msb, FG_REG_11);
-       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, &lsb, FG_REG_10);
+       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, FG_REG_11, &msb);
+       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, FG_REG_10, &lsb);
        battery_current = ((msb << 8) | lsb);
 
        /* convert 10 bit signed number to 16 bit signed number */
@@ -156,10 +145,10 @@ void twl6030_init_battery_charging(void)
        int ret = 0;
 
        /* Enable VBAT measurement */
-       twl6030_i2c_write_u8(TWL6030_CHIP_PM, VBAT_MEAS, MISC1);
+       twl6030_i2c_write_u8(TWL6030_CHIP_PM, MISC1, VBAT_MEAS);
 
        /* Enable GPADC module */
-       ret = twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, FGS | GPADCS, TOGGLE1);
+       ret = twl6030_i2c_write_u8(TWL6030_CHIP_CHARGER, TOGGLE1, FGS | GPADCS);
        if (ret) {
                printf("Failed to enable GPADC\n");
                return;
@@ -173,7 +162,7 @@ void twl6030_init_battery_charging(void)
                printf("Main battery voltage too low!\n");
 
        /* Check for the presence of USB charger */
-       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, &stat1, CONTROLLER_STAT1);
+       twl6030_i2c_read_u8(TWL6030_CHIP_CHARGER, CONTROLLER_STAT1, &stat1);
 
        /* check for battery presence indirectly via Fuel gauge */
        if ((stat1 & VBUS_DET) && (battery_volt < 3300))
@@ -185,8 +174,8 @@ void twl6030_init_battery_charging(void)
 void twl6030_power_mmc_init()
 {
        /* set voltage to 3.0 and turnon for APP */
-       twl6030_i2c_write_u8(TWL6030_CHIP_PM, 0x15, VMMC_CFG_VOLTATE);
-       twl6030_i2c_write_u8(TWL6030_CHIP_PM, 0x21, VMMC_CFG_STATE);
+       twl6030_i2c_write_u8(TWL6030_CHIP_PM, VMMC_CFG_VOLTATE, 0x15);
+       twl6030_i2c_write_u8(TWL6030_CHIP_PM, VMMC_CFG_STATE, 0x21);
 }
 
 void twl6030_usb_device_settings()
@@ -194,12 +183,12 @@ void twl6030_usb_device_settings()
        u8 data = 0;
 
        /* Select APP Group and set state to ON */
-       twl6030_i2c_write_u8(TWL6030_CHIP_PM, 0x21, VUSB_CFG_STATE);
+       twl6030_i2c_write_u8(TWL6030_CHIP_PM, VUSB_CFG_STATE, 0x21);
 
-       twl6030_i2c_read_u8(TWL6030_CHIP_PM, &data, MISC2);
+       twl6030_i2c_read_u8(TWL6030_CHIP_PM, MISC2, &data);
        data |= 0x10;
 
        /* Select the input supply for VBUS regulator */
-       twl6030_i2c_write_u8(TWL6030_CHIP_PM, data, MISC2);
+       twl6030_i2c_write_u8(TWL6030_CHIP_PM, MISC2, data);
 }
 #endif
diff --git a/drivers/power/twl6035.c b/drivers/power/twl6035.c
deleted file mode 100644 (file)
index d3de698..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * (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;
-}
-
-int twl6035_mmc1_poweron_ldo(void)
-{
-       u8 val = 0;
-
-       /* set LDO9 TWL6035 to 3V */
-       val = 0x2b; /* (3 -.9)*28 +1 */
-
-       if (palmas_write_u8(0x48, LDO9_VOLTAGE, val)) {
-               printf("twl6035: could not set LDO9 voltage.\n");
-               return 1;
-       }
-
-       /* TURN ON LDO9 */
-       val = LDO_ON | LDO_MODE_SLEEP | LDO_MODE_ACTIVE;
-
-       if (palmas_write_u8(0x48, LDO9_CTRL, val)) {
-               printf("twl6035: could not turn on LDO9.\n");
-               return 1;
-       }
-
-       return 0;
-}
index 442b7ea0df445b9c56c22c7ee9260dbc19b7059c..0f954a5f33af42b758561b7cc2a93bf8f15d0e9c 100644 (file)
@@ -53,6 +53,7 @@ COBJS-$(CONFIG_SANDBOX_SERIAL) += sandbox.o
 COBJS-$(CONFIG_SCIF_CONSOLE) += serial_sh.o
 COBJS-$(CONFIG_ZYNQ_SERIAL) += serial_zynq.o
 COBJS-$(CONFIG_BFIN_SERIAL) += serial_bfin.o
+COBJS-$(CONFIG_FSL_LPUART) += serial_lpuart.o
 
 ifndef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_USB_TTY) += usbtty.o
index 7f013ab33c511d41e2bcbdd47d2372b778d52f43..d77c25fa9b3c0afd2f38a62f780ffc3d5668162e 100644 (file)
@@ -74,13 +74,8 @@ void NS16550_init(NS16550_t com_port, int baud_divisor)
        defined(CONFIG_AM33XX) || defined(CONFIG_SOC_DA8XX) || \
        defined(CONFIG_TI814X)
 
-#if defined(CONFIG_APTIX)
-       /* /13 mode so Aptix 6MHz can hit 115200 */
-       serial_out(3, &com_port->mdr1);
-#else
        /* /16 is proper to hit 115200 with 48MHz */
        serial_out(0, &com_port->mdr1);
-#endif
 #endif /* CONFIG_OMAP */
 }
 
diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c
new file mode 100644 (file)
index 0000000..51d5666
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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 <watchdog.h>
+#include <asm/io.h>
+#include <serial.h>
+#include <linux/compiler.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/clock.h>
+
+#define US1_TDRE        (1 << 7)
+#define US1_RDRF        (1 << 5)
+#define UC2_TE          (1 << 3)
+#define UC2_RE          (1 << 2)
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct lpuart_fsl *base = (struct lpuart_fsl *)LPUART_BASE;
+
+static void lpuart_serial_setbrg(void)
+{
+       u32 clk = mxc_get_clock(MXC_UART_CLK);
+       u16 sbr;
+
+       if (!gd->baudrate)
+               gd->baudrate = CONFIG_BAUDRATE;
+
+       sbr = (u16)(clk / (16 * gd->baudrate));
+       /* place adjustment later - n/32 BRFA */
+
+       __raw_writeb(sbr >> 8, &base->ubdh);
+       __raw_writeb(sbr & 0xff, &base->ubdl);
+}
+
+static int lpuart_serial_getc(void)
+{
+       u8 status;
+
+       while (!(__raw_readb(&base->us1) & US1_RDRF))
+               WATCHDOG_RESET();
+
+       status = __raw_readb(&base->us1);
+       status |= US1_RDRF;
+       __raw_writeb(status, &base->us1);
+
+       return __raw_readb(&base->ud);
+}
+
+static void lpuart_serial_putc(const char c)
+{
+       if (c == '\n')
+               serial_putc('\r');
+
+       while (!(__raw_readb(&base->us1) & US1_TDRE))
+               WATCHDOG_RESET();
+
+       __raw_writeb(c, &base->ud);
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+static int lpuart_serial_tstc(void)
+{
+       if (__raw_readb(&base->urcfifo) == 0)
+               return 0;
+
+       return 1;
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ */
+static int lpuart_serial_init(void)
+{
+       u8 ctrl;
+
+       ctrl = __raw_readb(&base->uc2);
+       ctrl &= ~UC2_RE;
+       ctrl &= ~UC2_TE;
+       __raw_writeb(ctrl, &base->uc2);
+
+       __raw_writeb(0, &base->umodem);
+       __raw_writeb(0, &base->uc1);
+
+       /* provide data bits, parity, stop bit, etc */
+
+       serial_setbrg();
+
+       __raw_writeb(UC2_RE | UC2_TE, &base->uc2);
+
+       return 0;
+}
+
+static struct serial_device lpuart_serial_drv = {
+       .name = "lpuart_serial",
+       .start = lpuart_serial_init,
+       .stop = NULL,
+       .setbrg = lpuart_serial_setbrg,
+       .putc = lpuart_serial_putc,
+       .puts = default_serial_puts,
+       .getc = lpuart_serial_getc,
+       .tstc = lpuart_serial_tstc,
+};
+
+void lpuart_serial_initialize(void)
+{
+       serial_register(&lpuart_serial_drv);
+}
+
+__weak struct serial_device *default_serial_console(void)
+{
+       return &lpuart_serial_drv;
+}
index b92eef4db95cd972e6c12575eaebd61c25961e76..3c07da35976a2d185b38cfceb725bd75ddc3941d 100644 (file)
@@ -151,12 +151,7 @@ static int calc_divisor (NS16550_t port)
        }
 #endif
 
-#ifdef CONFIG_APTIX
-#define MODE_X_DIV 13
-#else
 #define MODE_X_DIV 16
-#endif
-
        /* Compute divisor value. Normally, we should simply return:
         *   CONFIG_SYS_NS16550_CLK) / MODE_X_DIV / gd->baudrate
         * but we need to round that value by adding 0.5.
index f4b1bad22e85f787212194ff265908139946254e..52594e352b55b0a795996ff7331f85ff65c2e590 100644 (file)
 
 #include "atmel_spi.h"
 
+static int spi_has_wdrbt(struct atmel_spi_slave *slave)
+{
+       unsigned int ver;
+
+       ver = spi_readl(slave, VERSION);
+
+       return (ATMEL_SPI_VERSION_REV(ver) >= 0x210);
+}
+
 void spi_init()
 {
 
@@ -90,10 +99,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 
        as->regs = regs;
        as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS
-#if defined(CONFIG_AT91SAM9X5) || defined(CONFIG_AT91SAM9M10G45)
-                       | ATMEL_SPI_MR_WDRBT
-#endif
                        | ATMEL_SPI_MR_PCS(~(1 << cs) & 0xf);
+       if (spi_has_wdrbt(as))
+               as->mr |= ATMEL_SPI_MR_WDRBT;
+
        spi_writel(as, CSR(cs), csrx);
 
        return &as->slave;
index 057de9adee6e44bb60154adc543d3b19a6f9aaa3..d2409454f9f9af025678142cd0ab5274546d26e8 100644 (file)
@@ -64,7 +64,7 @@
 #define ATMEL_SPI_CSRx_DLYBCT(x)       ((x) << 24)
 
 /* Bits in VERSION */
-#define ATMEL_SPI_VERSION_REV(x)       ((x) << 0)
+#define ATMEL_SPI_VERSION_REV(x)       ((x) & 0xfff)
 #define ATMEL_SPI_VERSION_MFN(x)       ((x) << 16)
 
 /* Constants for CSRx:BITS */
index aa999f9a945583a740e75af2e831b56d7406dab4..db98a136e6565f4019d7fe5ec23ac2e3ca91a3d9 100644 (file)
@@ -31,7 +31,7 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/arch/dma.h>
+#include <asm/imx-common/dma.h>
 
 #define        MXS_SPI_MAX_TIMEOUT     1000000
 #define        MXS_SPI_PORT_OFFSET     0x2000
index e8c159c0f3fee868c68c42a34e35799e87ce7c25..913dd9c8620199e7a9fa6b3464258022446c7f41 100644 (file)
@@ -25,9 +25,10 @@ LIB := $(obj)libtpm.o
 
 $(shell mkdir -p $(obj)slb9635_i2c)
 
-COBJS-$(CONFIG_GENERIC_LPC_TPM) = generic_lpc_tpm.o
-COBJS-$(CONFIG_INFINEON_TPM_I2C) += tis_i2c.o slb9635_i2c/tpm.o
-COBJS-$(CONFIG_INFINEON_TPM_I2C) += slb9635_i2c/tpm_tis_i2c.o
+# TODO: Merge tpm_tis_lpc.c with tpm.c
+COBJS-$(CONFIG_TPM_TIS_I2C) += tpm.o
+COBJS-$(CONFIG_TPM_TIS_I2C) += tpm_tis_i2c.o
+COBJS-$(CONFIG_TPM_TIS_LPC) += tpm_tis_lpc.o
 
 COBJS  := $(COBJS-y)
 SRCS   := $(COBJS:.o=.c)
diff --git a/drivers/tpm/slb9635_i2c/compatibility.h b/drivers/tpm/slb9635_i2c/compatibility.h
deleted file mode 100644 (file)
index 62dc9fa..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 Infineon Technologies
- *
- * Authors:
- * Peter Huewe <huewe.external@infineon.com>
- *
- * Version: 2.1.1
- *
- * 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 _COMPATIBILITY_H_
-#define _COMPATIBILITY_H_
-
-/* all includes from U-Boot */
-#include <linux/types.h>
-#include <linux/unaligned/be_byteshift.h>
-#include <asm-generic/errno.h>
-#include <compiler.h>
-#include <common.h>
-
-/* extended error numbers from linux (see errno.h) */
-#define        ECANCELED       125     /* Operation Canceled */
-
-#define msleep(t) udelay((t)*1000)
-
-/* Timer frequency. Corresponds to msec timer resolution*/
-#define HZ             1000
-
-#define dev_dbg(dev, format, arg...) debug(format, ##arg)
-#define dev_err(dev, format, arg...) printf(format, ##arg)
-#define dev_info(dev, format, arg...) debug(format, ##arg)
-#define dbg_printf debug
-
-#endif
index e818fbaf541808953c60c62e7b348b7f002b055e..22554e1456b345fa5511131616dec7469d86caa3 100644 (file)
@@ -67,6 +67,10 @@ static int tpm_decode_config(struct tpm *dev)
        int i2c_bus;
 
        node = fdtdec_next_compatible(blob, 0, COMPAT_INFINEON_SLB9635_TPM);
+       if (node < 0) {
+               node = fdtdec_next_compatible(blob, 0,
+                                             COMPAT_INFINEON_SLB9645_TPM);
+       }
        if (node < 0) {
                debug("%s: Node not found\n", __func__);
                return -1;
similarity index 63%
rename from drivers/tpm/slb9635_i2c/tpm.c
rename to drivers/tpm/tpm.c
index 496c48e8cf9bed01843fcce41868e32df2dd5f6f..b6573341956d6d0d4ffc76239b1bf71da550a8f9 100644 (file)
  * MA 02111-1307 USA
  */
 
-#include <malloc.h>
-#include "tpm.h"
+#include <config.h>
+#include <common.h>
+#include <compiler.h>
+#include <fdtdec.h>
+#include <i2c.h>
+#include <tpm.h>
+#include <asm-generic/errno.h>
+#include <linux/types.h>
+#include <linux/unaligned/be_byteshift.h>
 
-/* global structure for tpm chip data */
-struct tpm_chip g_chip;
+#include "tpm_private.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* TPM configuration */
+struct tpm {
+       int i2c_bus;
+       int slave_addr;
+       char inited;
+       int old_bus;
+} tpm;
+
+/* Global structure for tpm chip data */
+static struct tpm_chip g_chip;
 
 enum tpm_duration {
        TPM_SHORT = 0,
@@ -45,9 +64,18 @@ enum tpm_duration {
        TPM_UNDEFINED,
 };
 
-#define TPM_MAX_ORDINAL 243
-#define TPM_MAX_PROTECTED_ORDINAL 12
-#define TPM_PROTECTED_ORDINAL_MASK 0xFF
+/* Extended error numbers from linux (see errno.h) */
+#define ECANCELED      125     /* Operation Canceled */
+
+/* Timer frequency. Corresponds to msec timer resolution*/
+#define HZ             1000
+
+#define TPM_MAX_ORDINAL                        243
+#define TPM_MAX_PROTECTED_ORDINAL      12
+#define TPM_PROTECTED_ORDINAL_MASK     0xFF
+
+#define TPM_CMD_COUNT_BYTE     2
+#define TPM_CMD_ORDINAL_BYTE   6
 
 /*
  * Array with one entry per ordinal defining the maximum amount
@@ -318,34 +346,31 @@ static const u8 tpm_ordinal_duration[TPM_MAX_ORDINAL] = {
        TPM_MEDIUM,
 };
 
-/*
- * Returns max number of milliseconds to wait
- */
-unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
+/* Returns max number of milliseconds to wait */
+static unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
+               u32 ordinal)
 {
        int duration_idx = TPM_UNDEFINED;
        int duration = 0;
 
-       if (ordinal < TPM_MAX_ORDINAL)
+       if (ordinal < TPM_MAX_ORDINAL) {
                duration_idx = tpm_ordinal_duration[ordinal];
-       else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) <
-                TPM_MAX_PROTECTED_ORDINAL)
-               duration_idx =
-                   tpm_protected_ordinal_duration[ordinal &
-                                                  TPM_PROTECTED_ORDINAL_MASK];
+       else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) <
+                       TPM_MAX_PROTECTED_ORDINAL) {
+               duration_idx = tpm_protected_ordinal_duration[
+                               ordinal & TPM_PROTECTED_ORDINAL_MASK];
+       }
 
        if (duration_idx != TPM_UNDEFINED)
                duration = chip->vendor.duration[duration_idx];
+
        if (duration <= 0)
-               return 2 * 60 * HZ; /*two minutes timeout*/
+               return 2 * 60 * HZ; /* Two minutes timeout */
        else
                return duration;
 }
 
-#define TPM_CMD_COUNT_BYTE 2
-#define TPM_CMD_ORDINAL_BYTE 6
-
-ssize_t tpm_transmit(const unsigned char *buf, size_t bufsiz)
+static ssize_t tpm_transmit(const unsigned char *buf, size_t bufsiz)
 {
        ssize_t rc;
        u32 count, ordinal;
@@ -358,18 +383,17 @@ ssize_t tpm_transmit(const unsigned char *buf, size_t bufsiz)
        ordinal = get_unaligned_be32(buf + TPM_CMD_ORDINAL_BYTE);
 
        if (count == 0) {
-               dev_err(chip->dev, "no data\n");
+               error("no data\n");
                return -ENODATA;
        }
        if (count > bufsiz) {
-               dev_err(chip->dev,
-                       "invalid count value %x %zx\n", count, bufsiz);
+               error("invalid count value %x %zx\n", count, bufsiz);
                return -E2BIG;
        }
 
        rc = chip->vendor.send(chip, (u8 *)buf, count);
        if (rc < 0) {
-               dev_err(chip->dev, "tpm_transmit: tpm_send: error %zd\n", rc);
+               error("tpm_transmit: tpm_send: error %zd\n", rc);
                goto out;
        }
 
@@ -379,47 +403,126 @@ ssize_t tpm_transmit(const unsigned char *buf, size_t bufsiz)
        start = get_timer(0);
        stop = tpm_calc_ordinal_duration(chip, ordinal);
        do {
-               dbg_printf("waiting for status...\n");
+               debug("waiting for status...\n");
                u8 status = chip->vendor.status(chip);
                if ((status & chip->vendor.req_complete_mask) ==
                    chip->vendor.req_complete_val) {
-                       dbg_printf("...got it;\n");
+                       debug("...got it;\n");
                        goto out_recv;
                }
 
                if ((status == chip->vendor.req_canceled)) {
-                       dev_err(chip->dev, "Operation Canceled\n");
+                       error("Operation Canceled\n");
                        rc = -ECANCELED;
                        goto out;
                }
-               msleep(TPM_TIMEOUT);
+               udelay(TPM_TIMEOUT * 1000);
        } while (get_timer(start) < stop);
 
        chip->vendor.cancel(chip);
-       dev_err(chip->dev, "Operation Timed out\n");
+       error("Operation Timed out\n");
        rc = -ETIME;
        goto out;
 
 out_recv:
-
-       dbg_printf("out_recv: reading response...\n");
+       debug("out_recv: reading response...\n");
        rc = chip->vendor.recv(chip, (u8 *)buf, TPM_BUFSIZE);
        if (rc < 0)
-               dev_err(chip->dev, "tpm_transmit: tpm_recv: error %zd\n", rc);
+               error("tpm_transmit: tpm_recv: error %zd\n", rc);
+
 out:
        return rc;
 }
 
-#define TPM_ERROR_SIZE 10
+static int tpm_open(uint32_t dev_addr)
+{
+       int rc;
+       if (g_chip.is_open)
+               return -EBUSY;
+       rc = tpm_vendor_init(dev_addr);
+       if (rc < 0)
+               g_chip.is_open = 0;
+       return rc;
+}
 
-enum tpm_capabilities {
-       TPM_CAP_PROP = cpu_to_be32(5),
-};
+static void tpm_close(void)
+{
+       if (g_chip.is_open) {
+               tpm_vendor_cleanup(&g_chip);
+               g_chip.is_open = 0;
+       }
+}
 
-enum tpm_sub_capabilities {
-       TPM_CAP_PROP_TIS_TIMEOUT = cpu_to_be32(0x115),
-       TPM_CAP_PROP_TIS_DURATION = cpu_to_be32(0x120),
-};
+static int tpm_select(void)
+{
+       int ret;
+
+       tpm.old_bus = i2c_get_bus_num();
+       if (tpm.old_bus != tpm.i2c_bus) {
+               ret = i2c_set_bus_num(tpm.i2c_bus);
+               if (ret) {
+                       debug("%s: Fail to set i2c bus %d\n", __func__,
+                             tpm.i2c_bus);
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+static int tpm_deselect(void)
+{
+       int ret;
+
+       if (tpm.old_bus != i2c_get_bus_num()) {
+               ret = i2c_set_bus_num(tpm.old_bus);
+               if (ret) {
+                       debug("%s: Fail to restore i2c bus %d\n",
+                             __func__, tpm.old_bus);
+                       return -1;
+               }
+       }
+       tpm.old_bus = -1;
+       return 0;
+}
+
+/**
+ * Decode TPM configuration.
+ *
+ * @param dev  Returns a configuration of TPM device
+ * @return 0 if ok, -1 on error
+ */
+static int tpm_decode_config(struct tpm *dev)
+{
+#ifdef CONFIG_OF_CONTROL
+       const void *blob = gd->fdt_blob;
+       int node, parent;
+       int i2c_bus;
+
+       node = fdtdec_next_compatible(blob, 0, COMPAT_INFINEON_SLB9635_TPM);
+       if (node < 0) {
+               node = fdtdec_next_compatible(blob, 0,
+                               COMPAT_INFINEON_SLB9645_TPM);
+       }
+       if (node < 0) {
+               debug("%s: Node not found\n", __func__);
+               return -1;
+       }
+       parent = fdt_parent_offset(blob, node);
+       if (parent < 0) {
+               debug("%s: Cannot find node parent\n", __func__);
+               return -1;
+       }
+       i2c_bus = i2c_get_bus_num_fdt(parent);
+       if (i2c_bus < 0)
+               return -1;
+       dev->i2c_bus = i2c_bus;
+       dev->slave_addr = fdtdec_get_addr(blob, node, "reg");
+#else
+       dev->i2c_bus = CONFIG_TPM_TIS_I2C_BUS_NUMBER;
+       dev->slave_addr = CONFIG_TPM_TIS_I2C_SLAVE_ADDRESS;
+#endif
+       return 0;
+}
 
 struct tpm_chip *tpm_register_hardware(const struct tpm_vendor_specific *entry)
 {
@@ -433,21 +536,94 @@ struct tpm_chip *tpm_register_hardware(const struct tpm_vendor_specific *entry)
        return chip;
 }
 
-int tpm_open(uint32_t dev_addr)
+int tis_init(void)
+{
+       if (tpm.inited)
+               return 0;
+
+       if (tpm_decode_config(&tpm))
+               return -1;
+
+       if (tpm_select())
+               return -1;
+
+       /*
+        * Probe TPM twice; the first probing might fail because TPM is asleep,
+        * and the probing can wake up TPM.
+        */
+       if (i2c_probe(tpm.slave_addr) && i2c_probe(tpm.slave_addr)) {
+               debug("%s: fail to probe i2c addr 0x%x\n", __func__,
+                     tpm.slave_addr);
+               return -1;
+       }
+
+       tpm_deselect();
+
+       tpm.inited = 1;
+
+       return 0;
+}
+
+int tis_open(void)
 {
        int rc;
-       if (g_chip.is_open)
-               return -EBUSY;
-       rc = tpm_vendor_init(dev_addr);
-       if (rc < 0)
-               g_chip.is_open = 0;
+
+       if (!tpm.inited)
+               return -1;
+
+       if (tpm_select())
+               return -1;
+
+       rc = tpm_open(tpm.slave_addr);
+
+       tpm_deselect();
+
        return rc;
 }
 
-void tpm_close(void)
+int tis_close(void)
 {
-       if (g_chip.is_open) {
-               tpm_vendor_cleanup(&g_chip);
-               g_chip.is_open = 0;
+       if (!tpm.inited)
+               return -1;
+
+       if (tpm_select())
+               return -1;
+
+       tpm_close();
+
+       tpm_deselect();
+
+       return 0;
+}
+
+int tis_sendrecv(const uint8_t *sendbuf, size_t sbuf_size,
+               uint8_t *recvbuf, size_t *rbuf_len)
+{
+       int len;
+       uint8_t buf[4096];
+
+       if (!tpm.inited)
+               return -1;
+
+       if (sizeof(buf) < sbuf_size)
+               return -1;
+
+       memcpy(buf, sendbuf, sbuf_size);
+
+       if (tpm_select())
+               return -1;
+
+       len = tpm_transmit(buf, sbuf_size);
+
+       tpm_deselect();
+
+       if (len < 10) {
+               *rbuf_len = 0;
+               return -1;
        }
+
+       memcpy(recvbuf, buf, len);
+       *rbuf_len = len;
+
+       return 0;
 }
similarity index 71%
rename from drivers/tpm/slb9635_i2c/tpm.h
rename to drivers/tpm/tpm_private.h
index 9ddee865df605cd6444a730201a89c61068cc160..888a074d35ab78a55e6667cf8e131372ed267038 100644 (file)
  * MA 02111-1307 USA
  */
 
-#ifndef _TPM_H_
-#define _TPM_H_
+#ifndef _TPM_PRIVATE_H_
+#define _TPM_PRIVATE_H_
 
 #include <linux/compiler.h>
-
-#include "compatibility.h"
+#include <linux/types.h>
 
 enum tpm_timeout {
        TPM_TIMEOUT = 5,        /* msecs */
@@ -47,13 +46,9 @@ enum tpm_timeout {
 /* Size of external transmit buffer (used in tpm_transmit)*/
 #define TPM_BUFSIZE 4096
 
-/* Index of fields in TPM command buffer */
-#define TPM_CMD_SIZE_BYTE 2
-#define TPM_CMD_ORDINAL_BYTE 6
-
 /* Index of Count field in TPM response buffer */
-#define TPM_RSP_SIZE_BYTE 2
-#define TPM_RSP_RC_BYTE 6
+#define TPM_RSP_SIZE_BYTE      2
+#define TPM_RSP_RC_BYTE                6
 
 struct tpm_chip;
 
@@ -65,10 +60,10 @@ struct tpm_vendor_specific {
        int (*recv) (struct tpm_chip *, u8 *, size_t);
        int (*send) (struct tpm_chip *, u8 *, size_t);
        void (*cancel) (struct tpm_chip *);
-        u8(*status) (struct tpm_chip *);
+       u8(*status) (struct tpm_chip *);
        int locality;
-       unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* msec */
-       unsigned long duration[3];      /* msec */
+       unsigned long timeout_a, timeout_b, timeout_c, timeout_d;  /* msec */
+       unsigned long duration[3];  /* msec */
 };
 
 struct tpm_chip {
@@ -132,30 +127,11 @@ struct tpm_cmd_t {
        union tpm_cmd_params params;
 } __packed;
 
+struct tpm_chip *tpm_register_hardware(const struct tpm_vendor_specific *);
 
-/* ---------- Interface for TPM vendor ------------ */
-
-extern struct tpm_chip *tpm_register_hardware(
-       const struct tpm_vendor_specific *);
+int tpm_vendor_init(uint32_t dev_addr);
 
-extern int tpm_vendor_init(uint32_t dev_addr);
+void tpm_vendor_cleanup(struct tpm_chip *chip);
 
-extern void tpm_vendor_cleanup(struct tpm_chip *chip);
-
-/* ---------- Interface for TDDL ------------------- */
-
-/*
- * if dev_addr != 0 - redefines TPM device address
- * Returns < 0 on error, 0 on success.
- */
-extern int tpm_open(uint32_t dev_addr);
-
-extern void tpm_close(void);
-
-/*
- * Transmit bufsiz bytes out of buf to TPM and get results back in buf, too.
- * Returns < 0 on error, 0 on success.
- */
-extern ssize_t tpm_transmit(const unsigned char *buf, size_t bufsiz);
 
 #endif
similarity index 59%
rename from drivers/tpm/slb9635_i2c/tpm_tis_i2c.c
rename to drivers/tpm/tpm_tis_i2c.c
index 82a41bf5b272ce2b3f99791c0174a977089f304a..2dd8501f92d127125dec36d09f9af25a2ecac87b 100644 (file)
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <compiler.h>
 #include <i2c.h>
+#include <tpm.h>
+#include <asm-generic/errno.h>
 #include <linux/types.h>
+#include <linux/unaligned/be_byteshift.h>
 
-#include "compatibility.h"
-#include "tpm.h"
+#include "tpm_private.h"
+
+DECLARE_GLOBAL_DATA_PTR;
 
-/* max. buffer size supported by our tpm */
-#ifdef TPM_BUFSIZE
-#undef TPM_BUFSIZE
-#endif
-#define TPM_BUFSIZE 1260
 /* Address of the TPM on the I2C bus */
-#define TPM_I2C_ADDR 0x20
-/* max. number of iterations after i2c NAK */
-#define MAX_COUNT 3
+#define TPM_I2C_ADDR           0x20
+
+/* Max buffer size supported by our tpm */
+#define TPM_DEV_BUFSIZE                1260
 
-#define SLEEP_DURATION 60 /*in usec*/
+/* Max number of iterations after i2c NAK */
+#define MAX_COUNT              3
 
-/* max. number of iterations after i2c NAK for 'long' commands
- * we need this especially for sending TPM_READY, since the cleanup after the
+/*
+ * Max number of iterations after i2c NAK for 'long' commands
+ *
+ * We need this especially for sending TPM_READY, since the cleanup after the
  * transtion to the ready state may take some time, but it is unpredictable
  * how long it will take.
  */
-#define MAX_COUNT_LONG 50
+#define MAX_COUNT_LONG         50
+
+#define SLEEP_DURATION         60      /* in usec */
+#define SLEEP_DURATION_LONG    210     /* in usec */
 
-#define SLEEP_DURATION_LONG 210 /* in usec */
+#define TPM_HEADER_SIZE                10
+
+/*
+ * Expected value for DIDVID register
+ *
+ * The only device the system knows about at this moment is Infineon slb9635.
+ */
+#define TPM_TIS_I2C_DID_VID    0x000b15d1L
+
+enum tis_access {
+       TPM_ACCESS_VALID                = 0x80,
+       TPM_ACCESS_ACTIVE_LOCALITY      = 0x20,
+       TPM_ACCESS_REQUEST_PENDING      = 0x04,
+       TPM_ACCESS_REQUEST_USE          = 0x02,
+};
+
+enum tis_status {
+       TPM_STS_VALID                   = 0x80,
+       TPM_STS_COMMAND_READY           = 0x40,
+       TPM_STS_GO                      = 0x20,
+       TPM_STS_DATA_AVAIL              = 0x10,
+       TPM_STS_DATA_EXPECT             = 0x08,
+};
+
+enum tis_defaults {
+       TIS_SHORT_TIMEOUT               = 750,  /* ms */
+       TIS_LONG_TIMEOUT                = 2000, /* ms */
+};
 
 /* expected value for DIDVID register */
-#define TPM_TIS_I2C_DID_VID 0x000b15d1L
+#define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
+#define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
+
+enum i2c_chip_type {
+       SLB9635,
+       SLB9645,
+       UNKNOWN,
+};
+
+static const char * const chip_name[] = {
+       [SLB9635] = "slb9635tt",
+       [SLB9645] = "slb9645tt",
+       [UNKNOWN] = "unknown/fallback to slb9635",
+};
+
+#define        TPM_ACCESS(l)                   (0x0000 | ((l) << 4))
+#define        TPM_STS(l)                      (0x0001 | ((l) << 4))
+#define        TPM_DATA_FIFO(l)                (0x0005 | ((l) << 4))
+#define        TPM_DID_VID(l)                  (0x0006 | ((l) << 4))
 
 /* Structure to store I2C TPM specific stuff */
-struct tpm_inf_dev {
+struct tpm_dev {
        uint addr;
-       u8 buf[TPM_BUFSIZE + sizeof(u8)];       /* max. buffer size + addr */
+       u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)];  /* Max buffer size + addr */
+       enum i2c_chip_type chip_type;
 };
 
-static struct tpm_inf_dev tpm_dev = {
+static struct tpm_dev tpm_dev = {
        .addr = TPM_I2C_ADDR
 };
 
+static struct tpm_dev tpm_dev;
+
 /*
  * iic_tpm_read() - read from TPM register
  * @addr: register address to read from
@@ -91,34 +147,52 @@ static struct tpm_inf_dev tpm_dev = {
  *
  * Return -EIO on error, 0 on success.
  */
-int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
+static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
 {
        int rc;
        int count;
-       uint myaddr = addr;
-       /* we have to use uint here, uchar hangs the board */
-
-       for (count = 0; count < MAX_COUNT; count++) {
-               rc = i2c_write(tpm_dev.addr, 0, 0, (uchar *)&myaddr, 1);
-               if (rc == 0)
-                       break; /*success, break to skip sleep*/
-
-               udelay(SLEEP_DURATION);
-       }
-
-       if (rc)
-               return -rc;
-
-       /* After the TPM has successfully received the register address it needs
-        * some time, thus we're sleeping here again, before retrieving the data
-        */
-       for (count = 0; count < MAX_COUNT; count++) {
-               udelay(SLEEP_DURATION);
-               rc = i2c_read(tpm_dev.addr, 0, 0, buffer, len);
-               if (rc == 0)
-                       break; /*success, break to skip sleep*/
+       uint32_t addrbuf = addr;
+
+       if ((tpm_dev.chip_type == SLB9635) || (tpm_dev.chip_type == UNKNOWN)) {
+               /* slb9635 protocol should work in both cases */
+               for (count = 0; count < MAX_COUNT; count++) {
+                       rc = i2c_write(tpm_dev.addr, 0, 0,
+                                      (uchar *)&addrbuf, 1);
+                       if (rc == 0)
+                               break;  /* Success, break to skip sleep */
+                       udelay(SLEEP_DURATION);
+               }
+               if (rc)
+                       return -rc;
+
+               /* After the TPM has successfully received the register address
+                * it needs some time, thus we're sleeping here again, before
+                * retrieving the data
+                */
+               for (count = 0; count < MAX_COUNT; count++) {
+                       udelay(SLEEP_DURATION);
+                       rc = i2c_read(tpm_dev.addr, 0, 0, buffer, len);
+                       if (rc == 0)
+                               break;  /* success, break to skip sleep */
+               }
+       } else {
+               /*
+                * Use a combined read for newer chips.
+                * Unfortunately the smbus functions are not suitable due to
+                * the 32 byte limit of the smbus.
+                * Retries should usually not be needed, but are kept just to
+                * be safe on the safe side.
+                */
+               for (count = 0; count < MAX_COUNT; count++) {
+                       rc = i2c_read(tpm_dev.addr, addr, 1, buffer, len);
+                       if (rc == 0)
+                               break;  /* break here to skip sleep */
+                       udelay(SLEEP_DURATION);
+               }
        }
 
+       /* Take care of 'guard time' */
+       udelay(SLEEP_DURATION);
        if (rc)
                return -rc;
 
@@ -126,24 +200,24 @@ int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
 }
 
 static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
-                               unsigned int sleep_time,
-                               u8 max_count)
+               unsigned int sleep_time, u8 max_count)
 {
        int rc = 0;
        int count;
 
-       /* prepare send buffer */
+       /* Prepare send buffer */
        tpm_dev.buf[0] = addr;
        memcpy(&(tpm_dev.buf[1]), buffer, len);
 
        for (count = 0; count < max_count; count++) {
                rc = i2c_write(tpm_dev.addr, 0, 0, tpm_dev.buf, len + 1);
                if (rc == 0)
-                       break; /*success, break to skip sleep*/
-
+                       break;  /* Success, break to skip sleep */
                udelay(sleep_time);
        }
 
+       /* take care of 'guard time' */
+       udelay(SLEEP_DURATION);
        if (rc)
                return -rc;
 
@@ -175,42 +249,16 @@ static int iic_tpm_write(u8 addr, u8 *buffer, size_t len)
 /*
  * This function is needed especially for the cleanup situation after
  * sending TPM_READY
- * */
+ */
 static int iic_tpm_write_long(u8 addr, u8 *buffer, size_t len)
 {
        return iic_tpm_write_generic(addr, buffer, len, SLEEP_DURATION_LONG,
                        MAX_COUNT_LONG);
 }
 
-#define TPM_HEADER_SIZE 10
-
-enum tis_access {
-       TPM_ACCESS_VALID = 0x80,
-       TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
-       TPM_ACCESS_REQUEST_PENDING = 0x04,
-       TPM_ACCESS_REQUEST_USE = 0x02,
-};
-
-enum tis_status {
-       TPM_STS_VALID = 0x80,
-       TPM_STS_COMMAND_READY = 0x40,
-       TPM_STS_GO = 0x20,
-       TPM_STS_DATA_AVAIL = 0x10,
-       TPM_STS_DATA_EXPECT = 0x08,
-};
-
-enum tis_defaults {
-       TIS_SHORT_TIMEOUT = 750,        /* ms */
-       TIS_LONG_TIMEOUT = 2000,        /* 2 sec */
-};
-
-#define        TPM_ACCESS(l)                   (0x0000 | ((l) << 4))
-#define        TPM_STS(l)                      (0x0001 | ((l) << 4))
-#define        TPM_DATA_FIFO(l)                (0x0005 | ((l) << 4))
-#define        TPM_DID_VID(l)                  (0x0006 | ((l) << 4))
-
 static int check_locality(struct tpm_chip *chip, int loc)
 {
+       const u8 mask = TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID;
        u8 buf;
        int rc;
 
@@ -218,8 +266,7 @@ static int check_locality(struct tpm_chip *chip, int loc)
        if (rc < 0)
                return rc;
 
-       if ((buf & (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
-               (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) {
+       if ((buf & mask) == mask) {
                chip->vendor.locality = loc;
                return loc;
        }
@@ -229,12 +276,13 @@ static int check_locality(struct tpm_chip *chip, int loc)
 
 static void release_locality(struct tpm_chip *chip, int loc, int force)
 {
+       const u8 mask = TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID;
        u8 buf;
+
        if (iic_tpm_read(TPM_ACCESS(loc), &buf, 1) < 0)
                return;
 
-       if (force || (buf & (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) ==
-                       (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) {
+       if (force || (buf & mask) == mask) {
                buf = TPM_ACCESS_ACTIVE_LOCALITY;
                iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
        }
@@ -246,17 +294,17 @@ static int request_locality(struct tpm_chip *chip, int loc)
        u8 buf = TPM_ACCESS_REQUEST_USE;
 
        if (check_locality(chip, loc) >= 0)
-               return loc; /* we already have the locality */
+               return loc;  /* We already have the locality */
 
        iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
 
-       /* wait for burstcount */
+       /* Wait for burstcount */
        start = get_timer(0);
        stop = chip->vendor.timeout_a;
        do {
                if (check_locality(chip, loc) >= 0)
                        return loc;
-               msleep(TPM_TIMEOUT);
+               udelay(TPM_TIMEOUT * 1000);
        } while (get_timer(start) < stop);
 
        return -1;
@@ -264,8 +312,9 @@ static int request_locality(struct tpm_chip *chip, int loc)
 
 static u8 tpm_tis_i2c_status(struct tpm_chip *chip)
 {
-       /* NOTE: since i2c read may fail, return 0 in this case --> time-out */
+       /* NOTE: Since i2c read may fail, return 0 in this case --> time-out */
        u8 buf;
+
        if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
                return 0;
        else
@@ -274,8 +323,9 @@ static u8 tpm_tis_i2c_status(struct tpm_chip *chip)
 
 static void tpm_tis_i2c_ready(struct tpm_chip *chip)
 {
-       /* this causes the current command to be aborted */
+       /* This causes the current command to be aborted */
        u8 buf = TPM_STS_COMMAND_READY;
+
        iic_tpm_write_long(TPM_STS(chip->vendor.locality), &buf, 1);
 }
 
@@ -283,34 +333,34 @@ static ssize_t get_burstcount(struct tpm_chip *chip)
 {
        unsigned long start, stop;
        ssize_t burstcnt;
-       u8 buf[3];
+       u8 addr, buf[3];
 
-       /* wait for burstcount */
-       /* which timeout value, spec has 2 answers (c & d) */
+       /* Wait for burstcount */
+       /* XXX: Which timeout value? Spec has 2 answers (c & d) */
        start = get_timer(0);
        stop = chip->vendor.timeout_d;
        do {
                /* Note: STS is little endian */
-               if (iic_tpm_read(TPM_STS(chip->vendor.locality) + 1, buf, 3)
-                               < 0)
+               addr = TPM_STS(chip->vendor.locality) + 1;
+               if (iic_tpm_read(addr, buf, 3) < 0)
                        burstcnt = 0;
                else
                        burstcnt = (buf[2] << 16) + (buf[1] << 8) + buf[0];
 
                if (burstcnt)
                        return burstcnt;
-               msleep(TPM_TIMEOUT);
+               udelay(TPM_TIMEOUT * 1000);
        } while (get_timer(start) < stop);
 
        return -EBUSY;
 }
 
 static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
-                       int *status)
+               int *status)
 {
        unsigned long start, stop;
 
-       /* check current status */
+       /* Check current status */
        *status = tpm_tis_i2c_status(chip);
        if ((*status & mask) == mask)
                return 0;
@@ -318,11 +368,10 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
        start = get_timer(0);
        stop = timeout;
        do {
-               msleep(TPM_TIMEOUT);
+               udelay(TPM_TIMEOUT * 1000);
                *status = tpm_tis_i2c_status(chip);
                if ((*status & mask) == mask)
                        return 0;
-
        } while (get_timer(start) < stop);
 
        return -ETIME;
@@ -337,17 +386,16 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
        while (size < count) {
                burstcnt = get_burstcount(chip);
 
-               /* burstcount < 0 = tpm is busy */
+               /* burstcount < 0 -> tpm is busy */
                if (burstcnt < 0)
                        return burstcnt;
 
-               /* limit received data to max. left */
+               /* Limit received data to max left */
                if (burstcnt > (count - size))
                        burstcnt = count - size;
 
                rc = iic_tpm_read(TPM_DATA_FIFO(chip->vendor.locality),
-                                 &(buf[size]),
-                                 burstcnt);
+                               &(buf[size]), burstcnt);
                if (rc == 0)
                        size += burstcnt;
        }
@@ -365,10 +413,10 @@ static int tpm_tis_i2c_recv(struct tpm_chip *chip, u8 *buf, size_t count)
                goto out;
        }
 
-       /* read first 10 bytes, including tag, paramsize, and result */
+       /* Read first 10 bytes, including tag, paramsize, and result */
        size = recv_data(chip, buf, TPM_HEADER_SIZE);
        if (size < TPM_HEADER_SIZE) {
-               dev_err(chip->dev, "Unable to read header\n");
+               error("Unable to read header\n");
                goto out;
        }
 
@@ -379,23 +427,24 @@ static int tpm_tis_i2c_recv(struct tpm_chip *chip, u8 *buf, size_t count)
        }
 
        size += recv_data(chip, &buf[TPM_HEADER_SIZE],
-                               expected - TPM_HEADER_SIZE);
+                       expected - TPM_HEADER_SIZE);
        if (size < expected) {
-               dev_err(chip->dev, "Unable to read remainder of result\n");
+               error("Unable to read remainder of result\n");
                size = -ETIME;
                goto out;
        }
 
        wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, &status);
-       if (status & TPM_STS_DATA_AVAIL) {      /* retry? */
-               dev_err(chip->dev, "Error left over data\n");
+       if (status & TPM_STS_DATA_AVAIL) {  /* Retry? */
+               error("Error left over data\n");
                size = -EIO;
                goto out;
        }
 
 out:
        tpm_tis_i2c_ready(chip);
-       /* The TPM needs some time to clean up here,
+       /*
+        * The TPM needs some time to clean up here,
         * so we sleep rather than keeping the bus busy
         */
        udelay(2000);
@@ -409,10 +458,11 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
        int rc, status;
        ssize_t burstcnt;
        size_t count = 0;
+       int retry = 0;
        u8 sts = TPM_STS_GO;
 
-       if (len > TPM_BUFSIZE)
-               return -E2BIG; /* command is too long for our tpm, sorry */
+       if (len > TPM_DEV_BUFSIZE)
+               return -E2BIG;  /* Command is too long for our tpm, sorry */
 
        if (request_locality(chip, 0) < 0)
                return -EBUSY;
@@ -420,44 +470,45 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
        status = tpm_tis_i2c_status(chip);
        if ((status & TPM_STS_COMMAND_READY) == 0) {
                tpm_tis_i2c_ready(chip);
-               if (wait_for_stat
-                   (chip, TPM_STS_COMMAND_READY,
-                    chip->vendor.timeout_b, &status) < 0) {
+               if (wait_for_stat(chip, TPM_STS_COMMAND_READY,
+                                 chip->vendor.timeout_b, &status) < 0) {
                        rc = -ETIME;
                        goto out_err;
                }
        }
 
-       while (count < len - 1) {
-               burstcnt = get_burstcount(chip);
+       burstcnt = get_burstcount(chip);
 
-               /* burstcount < 0 = tpm is busy */
-               if (burstcnt < 0)
-                       return burstcnt;
+       /* burstcount < 0 -> tpm is busy */
+       if (burstcnt < 0)
+               return burstcnt;
 
-               if (burstcnt > (len-1-count))
-                       burstcnt = len-1-count;
+       while (count < len - 1) {
+               if (burstcnt > len - 1 - count)
+                       burstcnt = len - 1 - count;
 
-#ifdef CONFIG_TPM_I2C_BURST_LIMITATION
-               if (burstcnt > CONFIG_TPM_I2C_BURST_LIMITATION)
-                       burstcnt = CONFIG_TPM_I2C_BURST_LIMITATION;
-#endif /* CONFIG_TPM_I2C_BURST_LIMITATION */
+#ifdef CONFIG_TPM_TIS_I2C_BURST_LIMITATION
+               if (retry && burstcnt > CONFIG_TPM_TIS_I2C_BURST_LIMITATION)
+                       burstcnt = CONFIG_TPM_TIS_I2C_BURST_LIMITATION;
+#endif /* CONFIG_TPM_TIS_I2C_BURST_LIMITATION */
 
                rc = iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality),
-                                  &(buf[count]), burstcnt);
+                               &(buf[count]), burstcnt);
                if (rc == 0)
                        count += burstcnt;
-
-               wait_for_stat(chip, TPM_STS_VALID,
-                             chip->vendor.timeout_c, &status);
-
-               if ((status & TPM_STS_DATA_EXPECT) == 0) {
-                       rc = -EIO;
-                       goto out_err;
+               else {
+                       retry++;
+                       wait_for_stat(chip, TPM_STS_VALID,
+                                     chip->vendor.timeout_c, &status);
+
+                       if ((status & TPM_STS_DATA_EXPECT) == 0) {
+                               rc = -EIO;
+                               goto out_err;
+                       }
                }
        }
 
-       /* write last byte */
+       /* Write last byte */
        iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality), &(buf[count]), 1);
        wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, &status);
        if ((status & TPM_STS_DATA_EXPECT) != 0) {
@@ -465,13 +516,15 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
                goto out_err;
        }
 
-       /* go and do it */
+       /* Go and do it */
        iic_tpm_write(TPM_STS(chip->vendor.locality), &sts, 1);
 
        return len;
+
 out_err:
        tpm_tis_i2c_ready(chip);
-       /* The TPM needs some time to clean up here,
+       /*
+        * The TPM needs some time to clean up here,
         * so we sleep rather than keeping the bus busy
         */
        udelay(2000);
@@ -490,12 +543,26 @@ static struct tpm_vendor_specific tpm_tis_i2c = {
        .req_canceled = TPM_STS_COMMAND_READY,
 };
 
-/* initialisation of i2c tpm */
 
+static enum i2c_chip_type tpm_vendor_chip_type(void)
+{
+#ifdef CONFIG_OF_CONTROL
+       const void *blob = gd->fdt_blob;
+
+       if (fdtdec_next_compatible(blob, 0, COMPAT_INFINEON_SLB9645_TPM) >= 0)
+               return SLB9645;
+
+       if (fdtdec_next_compatible(blob, 0, COMPAT_INFINEON_SLB9635_TPM) >= 0)
+               return SLB9635;
+#endif
+       return UNKNOWN;
+}
 
+/* Initialisation of i2c tpm */
 int tpm_vendor_init(uint32_t dev_addr)
 {
        u32 vendor;
+       u32 expected_did_vid;
        uint old_addr;
        int rc = 0;
        struct tpm_chip *chip;
@@ -504,6 +571,8 @@ int tpm_vendor_init(uint32_t dev_addr)
        if (dev_addr != 0)
                tpm_dev.addr = dev_addr;
 
+       tpm_dev.chip_type = tpm_vendor_chip_type();
+
        chip = tpm_register_hardware(&tpm_tis_i2c);
        if (chip < 0) {
                rc = -ENODEV;
@@ -519,26 +588,33 @@ int tpm_vendor_init(uint32_t dev_addr)
        chip->vendor.timeout_c = TIS_SHORT_TIMEOUT;
        chip->vendor.timeout_d = TIS_SHORT_TIMEOUT;
 
-       if (request_locality(chip, 0) != 0) {
+       if (request_locality(chip, 0) < 0) {
                rc = -ENODEV;
                goto out_err;
        }
 
-       /* read four bytes from DID_VID register */
+       /* Read four bytes from DID_VID register */
        if (iic_tpm_read(TPM_DID_VID(0), (uchar *)&vendor, 4) < 0) {
                rc = -EIO;
                goto out_release;
        }
 
-       /* create DID_VID register value, after swapping to little-endian */
-       vendor = be32_to_cpu(vendor);
+       if (tpm_dev.chip_type == SLB9635) {
+               vendor = be32_to_cpu(vendor);
+               expected_did_vid = TPM_TIS_I2C_DID_VID_9635;
+       } else {
+               /* device id and byte order has changed for newer i2c tpms */
+               expected_did_vid = TPM_TIS_I2C_DID_VID_9645;
+       }
 
-       if (vendor != TPM_TIS_I2C_DID_VID) {
+       if (tpm_dev.chip_type != UNKNOWN && vendor != expected_did_vid) {
+               error("Vendor id did not match! ID was %08x\n", vendor);
                rc = -ENODEV;
                goto out_release;
        }
 
-       dev_info(dev, "1.2 TPM (device-id 0x%X)\n", vendor >> 16);
+       debug("1.2 TPM (chip type %s device-id 0x%X)\n",
+             chip_name[tpm_dev.chip_type], vendor >> 16);
 
        /*
         * A timeout query to TPM can be placed here.
index 75ec8f78815b39810a68b3448193bc0bc7f19494..76624b92564b7dca9b6de50b9f90977bee70c84f 100644 (file)
@@ -407,46 +407,40 @@ static int asix_basic_reset(struct ueth_data *dev)
        rx_ctl = asix_read_rx_ctl(dev);
        debug("RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl);
 
-       return 0;
-}
-
-/*
- * Asix callbacks
- */
-static int asix_init(struct eth_device *eth, bd_t *bd)
-{
-       struct ueth_data        *dev = (struct ueth_data *)eth->priv;
-       int timeout = 0;
-#define TIMEOUT_RESOLUTION 50  /* ms */
-       int link_detected;
-
-       debug("** %s()\n", __func__);
-
        dev->phy_id = asix_get_phy_addr(dev);
        if (dev->phy_id < 0)
                debug("Failed to read phy id\n");
 
-       if (asix_sw_reset(dev, AX_SWRESET_PRL) < 0)
-               goto out_err;
-
-       if (asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL) < 0)
-               goto out_err;
-
        asix_mdio_write(dev, dev->phy_id, MII_BMCR, BMCR_RESET);
        asix_mdio_write(dev, dev->phy_id, MII_ADVERTISE,
                        ADVERTISE_ALL | ADVERTISE_CSMA);
        mii_nway_restart(dev);
 
        if (asix_write_medium_mode(dev, AX88772_MEDIUM_DEFAULT) < 0)
-               goto out_err;
+               return -1;
 
        if (asix_write_cmd(dev, AX_CMD_WRITE_IPG0,
                                AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,
                                AX88772_IPG2_DEFAULT, 0, NULL) < 0) {
                debug("Write IPG,IPG1,IPG2 failed\n");
-               goto out_err;
+               return -1;
        }
 
+       return 0;
+}
+
+/*
+ * Asix callbacks
+ */
+static int asix_init(struct eth_device *eth, bd_t *bd)
+{
+       struct ueth_data        *dev = (struct ueth_data *)eth->priv;
+       int timeout = 0;
+#define TIMEOUT_RESOLUTION 50  /* ms */
+       int link_detected;
+
+       debug("** %s()\n", __func__);
+
        if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) < 0)
                goto out_err;
 
index e545b6be6b33030bd42cf27d9a8a2cdde8027bb1..432cf178cf4a056cd9decd44da0defc93e844fc2 100644 (file)
@@ -35,6 +35,7 @@ endif
 # new USB gadget layer dependencies
 ifdef CONFIG_USB_GADGET
 COBJS-$(CONFIG_USB_GADGET_S3C_UDC_OTG) += s3c_udc_otg.o
+COBJS-$(CONFIG_USB_GADGET_FOTG210) += fotg210.o
 COBJS-$(CONFIG_USBDOWNLOAD_GADGET) += g_dnl.o
 COBJS-$(CONFIG_DFU_FUNCTION) += f_dfu.o
 endif
index 2c5600ed5210c9da2e2450132d11d1c65a41578e..f30778a163b2950b2681a5ea9b610a7d74d10fb3 100644 (file)
@@ -1098,4 +1098,5 @@ void usb_composite_unregister(struct usb_composite_driver *driver)
        if (composite != driver)
                return;
        usb_gadget_unregister_driver(&composite_driver);
+       composite = NULL;
 }
index c28866f7d3c2e5dbcae7766d4d9b0958113c2ec2..45bc132aef6729827594dcf1a373c7e49510114f 100644 (file)
@@ -2261,7 +2261,8 @@ reset:
        if (rc)
                goto reset;
        fsg->bulk_out_enabled = 1;
-       common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize);
+       common->bulk_out_maxpacket =
+                               le16_to_cpu(get_unaligned(&d->wMaxPacketSize));
        clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags);
 
        /* Allocate the requests */
diff --git a/drivers/usb/gadget/fotg210.c b/drivers/usb/gadget/fotg210.c
new file mode 100644 (file)
index 0000000..d003331
--- /dev/null
@@ -0,0 +1,948 @@
+/*
+ * Faraday USB 2.0 OTG Controller
+ *
+ * (C) Copyright 2010 Faraday Technology
+ * Dante Su <dantesu@faraday-tech.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ */
+
+#include <common.h>
+#include <command.h>
+#include <config.h>
+#include <net.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+
+#include <usb/fotg210.h>
+
+#define CFG_NUM_ENDPOINTS              4
+#define CFG_EP0_MAX_PACKET_SIZE        64
+#define CFG_EPX_MAX_PACKET_SIZE        512
+
+#define CFG_CMD_TIMEOUT (CONFIG_SYS_HZ >> 2) /* 250 ms */
+
+struct fotg210_chip;
+
+struct fotg210_ep {
+       struct usb_ep ep;
+
+       uint maxpacket;
+       uint id;
+       uint stopped;
+
+       struct list_head                      queue;
+       struct fotg210_chip                  *chip;
+       const struct usb_endpoint_descriptor *desc;
+};
+
+struct fotg210_request {
+       struct usb_request req;
+       struct list_head   queue;
+       struct fotg210_ep *ep;
+};
+
+struct fotg210_chip {
+       struct usb_gadget         gadget;
+       struct usb_gadget_driver *driver;
+       struct fotg210_regs      *regs;
+       uint8_t                   irq;
+       uint16_t                  addr;
+       int                       pullup;
+       enum usb_device_state     state;
+       struct fotg210_ep         ep[1 + CFG_NUM_ENDPOINTS];
+};
+
+static struct usb_endpoint_descriptor ep0_desc = {
+       .bLength = sizeof(struct usb_endpoint_descriptor),
+       .bDescriptorType = USB_DT_ENDPOINT,
+       .bEndpointAddress = USB_DIR_IN,
+       .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
+};
+
+static inline int fifo_to_ep(struct fotg210_chip *chip, int id, int in)
+{
+       return (id < 0) ? 0 : ((id & 0x03) + 1);
+}
+
+static inline int ep_to_fifo(struct fotg210_chip *chip, int id)
+{
+       return (id <= 0) ? -1 : ((id - 1) & 0x03);
+}
+
+static inline int ep_reset(struct fotg210_chip *chip, uint8_t ep_addr)
+{
+       int ep = ep_addr & USB_ENDPOINT_NUMBER_MASK;
+       struct fotg210_regs *regs = chip->regs;
+
+       if (ep_addr & USB_DIR_IN) {
+               /* reset endpoint */
+               setbits_le32(&regs->iep[ep - 1], IEP_RESET);
+               mdelay(1);
+               clrbits_le32(&regs->iep[ep - 1], IEP_RESET);
+               /* clear endpoint stall */
+               clrbits_le32(&regs->iep[ep - 1], IEP_STALL);
+       } else {
+               /* reset endpoint */
+               setbits_le32(&regs->oep[ep - 1], OEP_RESET);
+               mdelay(1);
+               clrbits_le32(&regs->oep[ep - 1], OEP_RESET);
+               /* clear endpoint stall */
+               clrbits_le32(&regs->oep[ep - 1], OEP_STALL);
+       }
+
+       return 0;
+}
+
+static int fotg210_reset(struct fotg210_chip *chip)
+{
+       struct fotg210_regs *regs = chip->regs;
+       uint32_t i;
+
+       chip->state = USB_STATE_POWERED;
+
+       /* chip enable */
+       writel(DEVCTRL_EN, &regs->dev_ctrl);
+
+       /* device address reset */
+       chip->addr = 0;
+       writel(0, &regs->dev_addr);
+
+       /* set idle counter to 7ms */
+       writel(7, &regs->idle);
+
+       /* disable all interrupts */
+       writel(IMR_MASK, &regs->imr);
+       writel(GIMR_MASK, &regs->gimr);
+       writel(GIMR0_MASK, &regs->gimr0);
+       writel(GIMR1_MASK, &regs->gimr1);
+       writel(GIMR2_MASK, &regs->gimr2);
+
+       /* clear interrupts */
+       writel(ISR_MASK, &regs->isr);
+       writel(0, &regs->gisr);
+       writel(0, &regs->gisr0);
+       writel(0, &regs->gisr1);
+       writel(0, &regs->gisr2);
+
+       /* chip reset */
+       setbits_le32(&regs->dev_ctrl, DEVCTRL_RESET);
+       mdelay(10);
+       if (readl(&regs->dev_ctrl) & DEVCTRL_RESET) {
+               printf("fotg210: chip reset failed\n");
+               return -1;
+       }
+
+       /* CX FIFO reset */
+       setbits_le32(&regs->cxfifo, CXFIFO_CXFIFOCLR);
+       mdelay(10);
+       if (readl(&regs->cxfifo) & CXFIFO_CXFIFOCLR) {
+               printf("fotg210: ep0 fifo reset failed\n");
+               return -1;
+       }
+
+       /* create static ep-fifo map (EP1 <-> FIFO0, EP2 <-> FIFO1 ...) */
+       writel(EPMAP14_DEFAULT, &regs->epmap14);
+       writel(EPMAP58_DEFAULT, &regs->epmap58);
+       writel(FIFOMAP_DEFAULT, &regs->fifomap);
+       writel(0, &regs->fifocfg);
+       for (i = 0; i < 8; ++i) {
+               writel(CFG_EPX_MAX_PACKET_SIZE, &regs->iep[i]);
+               writel(CFG_EPX_MAX_PACKET_SIZE, &regs->oep[i]);
+       }
+
+       /* FIFO reset */
+       for (i = 0; i < 4; ++i) {
+               writel(FIFOCSR_RESET, &regs->fifocsr[i]);
+               mdelay(10);
+               if (readl(&regs->fifocsr[i]) & FIFOCSR_RESET) {
+                       printf("fotg210: fifo%d reset failed\n", i);
+                       return -1;
+               }
+       }
+
+       /* enable only device interrupt and triggered at level-high */
+       writel(IMR_IRQLH | IMR_HOST | IMR_OTG, &regs->imr);
+       writel(ISR_MASK, &regs->isr);
+       /* disable EP0 IN/OUT interrupt */
+       writel(GIMR0_CXOUT | GIMR0_CXIN, &regs->gimr0);
+       /* disable EPX IN+SPK+OUT interrupts */
+       writel(GIMR1_MASK, &regs->gimr1);
+       /* disable wakeup+idle+dma+zlp interrupts */
+       writel(GIMR2_WAKEUP | GIMR2_IDLE | GIMR2_DMAERR | GIMR2_DMAFIN
+               | GIMR2_ZLPRX | GIMR2_ZLPTX, &regs->gimr2);
+       /* enable all group interrupt */
+       writel(0, &regs->gimr);
+
+       /* suspend delay = 3 ms */
+       writel(3, &regs->idle);
+
+       /* turn-on device interrupts */
+       setbits_le32(&regs->dev_ctrl, DEVCTRL_GIRQ_EN);
+
+       return 0;
+}
+
+static inline int fotg210_cxwait(struct fotg210_chip *chip, uint32_t mask)
+{
+       struct fotg210_regs *regs = chip->regs;
+       int ret = -1;
+       ulong ts;
+
+       for (ts = get_timer(0); get_timer(ts) < CFG_CMD_TIMEOUT; ) {
+               if ((readl(&regs->cxfifo) & mask) != mask)
+                       continue;
+               ret = 0;
+               break;
+       }
+
+       if (ret)
+               printf("fotg210: cx/ep0 timeout\n");
+
+       return ret;
+}
+
+static int fotg210_dma(struct fotg210_ep *ep, struct fotg210_request *req)
+{
+       struct fotg210_chip *chip = ep->chip;
+       struct fotg210_regs *regs = chip->regs;
+       uint32_t tmp, ts;
+       uint8_t *buf  = req->req.buf + req->req.actual;
+       uint32_t len  = req->req.length - req->req.actual;
+       int fifo = ep_to_fifo(chip, ep->id);
+       int ret = -EBUSY;
+
+       /* 1. init dma buffer */
+       if (len > ep->maxpacket)
+               len = ep->maxpacket;
+
+       /* 2. wait for dma ready (hardware) */
+       for (ts = get_timer(0); get_timer(ts) < CFG_CMD_TIMEOUT; ) {
+               if (!(readl(&regs->dma_ctrl) & DMACTRL_START)) {
+                       ret = 0;
+                       break;
+               }
+       }
+       if (ret) {
+               printf("fotg210: dma busy\n");
+               req->req.status = ret;
+               return ret;
+       }
+
+       /* 3. DMA target setup */
+       if (ep->desc->bEndpointAddress & USB_DIR_IN)
+               flush_dcache_range((ulong)buf, (ulong)buf + len);
+       else
+               invalidate_dcache_range((ulong)buf, (ulong)buf + len);
+
+       writel(virt_to_phys(buf), &regs->dma_addr);
+
+       if (ep->desc->bEndpointAddress & USB_DIR_IN) {
+               if (ep->id == 0) {
+                       /* Wait until cx/ep0 fifo empty */
+                       fotg210_cxwait(chip, CXFIFO_CXFIFOE);
+                       writel(DMAFIFO_CX, &regs->dma_fifo);
+               } else {
+                       /* Wait until epx fifo empty */
+                       fotg210_cxwait(chip, CXFIFO_FIFOE(fifo));
+                       writel(DMAFIFO_FIFO(fifo), &regs->dma_fifo);
+               }
+               writel(DMACTRL_LEN(len) | DMACTRL_MEM2FIFO, &regs->dma_ctrl);
+       } else {
+               uint32_t blen;
+
+               if (ep->id == 0) {
+                       writel(DMAFIFO_CX, &regs->dma_fifo);
+                       do {
+                               blen = CXFIFO_BYTES(readl(&regs->cxfifo));
+                       } while (blen < len);
+               } else {
+                       writel(DMAFIFO_FIFO(fifo), &regs->dma_fifo);
+                       blen = FIFOCSR_BYTES(readl(&regs->fifocsr[fifo]));
+               }
+               len  = (len < blen) ? len : blen;
+               writel(DMACTRL_LEN(len) | DMACTRL_FIFO2MEM, &regs->dma_ctrl);
+       }
+
+       /* 4. DMA start */
+       setbits_le32(&regs->dma_ctrl, DMACTRL_START);
+
+       /* 5. DMA wait */
+       ret = -EBUSY;
+       for (ts = get_timer(0); get_timer(ts) < CFG_CMD_TIMEOUT; ) {
+               tmp = readl(&regs->gisr2);
+               /* DMA complete */
+               if (tmp & GISR2_DMAFIN) {
+                       ret = 0;
+                       break;
+               }
+               /* DMA error */
+               if (tmp & GISR2_DMAERR) {
+                       printf("fotg210: dma error\n");
+                       break;
+               }
+               /* resume, suspend, reset */
+               if (tmp & (GISR2_RESUME | GISR2_SUSPEND | GISR2_RESET)) {
+                       printf("fotg210: dma reset by host\n");
+                       break;
+               }
+       }
+
+       /* 7. DMA target reset */
+       if (ret)
+               writel(DMACTRL_ABORT | DMACTRL_CLRFF, &regs->dma_ctrl);
+
+       writel(0, &regs->gisr2);
+       writel(0, &regs->dma_fifo);
+
+       req->req.status = ret;
+       if (!ret)
+               req->req.actual += len;
+       else
+               printf("fotg210: ep%d dma error(code=%d)\n", ep->id, ret);
+
+       return len;
+}
+
+/*
+ * result of setup packet
+ */
+#define CX_IDLE                0
+#define CX_FINISH      1
+#define CX_STALL       2
+
+static void fotg210_setup(struct fotg210_chip *chip)
+{
+       int id, ret = CX_IDLE;
+       uint32_t tmp[2];
+       struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)tmp;
+       struct fotg210_regs *regs = chip->regs;
+
+       /*
+        * If this is the first Cx 8 byte command,
+        * we can now query USB mode (high/full speed; USB 2.0/USB 1.0)
+        */
+       if (chip->state == USB_STATE_POWERED) {
+               chip->state = USB_STATE_DEFAULT;
+               if (readl(&regs->otgcsr) & OTGCSR_DEV_B) {
+                       /* Mini-B */
+                       if (readl(&regs->dev_ctrl) & DEVCTRL_HS) {
+                               puts("fotg210: HS\n");
+                               chip->gadget.speed = USB_SPEED_HIGH;
+                               /* SOF mask timer = 1100 ticks */
+                               writel(SOFMTR_TMR(1100), &regs->sof_mtr);
+                       } else {
+                               puts("fotg210: FS\n");
+                               chip->gadget.speed = USB_SPEED_FULL;
+                               /* SOF mask timer = 10000 ticks */
+                               writel(SOFMTR_TMR(10000), &regs->sof_mtr);
+                       }
+               } else {
+                       printf("fotg210: mini-A?\n");
+               }
+       }
+
+       /* switch data port to ep0 */
+       writel(DMAFIFO_CX, &regs->dma_fifo);
+       /* fetch 8 bytes setup packet */
+       tmp[0] = readl(&regs->ep0_data);
+       tmp[1] = readl(&regs->ep0_data);
+       /* release data port */
+       writel(0, &regs->dma_fifo);
+
+       if (req->bRequestType & USB_DIR_IN)
+               ep0_desc.bEndpointAddress = USB_DIR_IN;
+       else
+               ep0_desc.bEndpointAddress = USB_DIR_OUT;
+
+       ret = CX_IDLE;
+
+       if ((req->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
+               switch (req->bRequest) {
+               case USB_REQ_SET_CONFIGURATION:
+                       debug("fotg210: set_cfg(%d)\n", req->wValue & 0x00FF);
+                       if (!(req->wValue & 0x00FF)) {
+                               chip->state = USB_STATE_ADDRESS;
+                               writel(chip->addr, &regs->dev_addr);
+                       } else {
+                               chip->state = USB_STATE_CONFIGURED;
+                               writel(chip->addr | DEVADDR_CONF,
+                                       &regs->dev_addr);
+                       }
+                       ret = CX_IDLE;
+                       break;
+
+               case USB_REQ_SET_ADDRESS:
+                       debug("fotg210: set_addr(0x%04X)\n", req->wValue);
+                       chip->state = USB_STATE_ADDRESS;
+                       chip->addr  = req->wValue & DEVADDR_ADDR_MASK;
+                       ret = CX_FINISH;
+                       writel(chip->addr, &regs->dev_addr);
+                       break;
+
+               case USB_REQ_CLEAR_FEATURE:
+                       debug("fotg210: clr_feature(%d, %d)\n",
+                               req->bRequestType & 0x03, req->wValue);
+                       switch (req->wValue) {
+                       case 0:    /* [Endpoint] halt */
+                               ep_reset(chip, req->wIndex);
+                               ret = CX_FINISH;
+                               break;
+                       case 1:    /* [Device] remote wake-up */
+                       case 2:    /* [Device] test mode */
+                       default:
+                               ret = CX_STALL;
+                               break;
+                       }
+                       break;
+
+               case USB_REQ_SET_FEATURE:
+                       debug("fotg210: set_feature(%d, %d)\n",
+                               req->wValue, req->wIndex & 0xf);
+                       switch (req->wValue) {
+                       case 0:    /* Endpoint Halt */
+                               id = req->wIndex & 0xf;
+                               setbits_le32(&regs->iep[id - 1], IEP_STALL);
+                               setbits_le32(&regs->oep[id - 1], OEP_STALL);
+                               ret = CX_FINISH;
+                               break;
+                       case 1:    /* Remote Wakeup */
+                       case 2:    /* Test Mode */
+                       default:
+                               ret = CX_STALL;
+                               break;
+                       }
+                       break;
+
+               case USB_REQ_GET_STATUS:
+                       debug("fotg210: get_status\n");
+                       ret = CX_STALL;
+                       break;
+
+               case USB_REQ_SET_DESCRIPTOR:
+                       debug("fotg210: set_descriptor\n");
+                       ret = CX_STALL;
+                       break;
+
+               case USB_REQ_SYNCH_FRAME:
+                       debug("fotg210: sync frame\n");
+                       ret = CX_STALL;
+                       break;
+               }
+       } /* if ((req->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) */
+
+       if (ret == CX_IDLE && chip->driver->setup) {
+               if (chip->driver->setup(&chip->gadget, req) < 0)
+                       ret = CX_STALL;
+               else
+                       ret = CX_FINISH;
+       }
+
+       switch (ret) {
+       case CX_FINISH:
+               setbits_le32(&regs->cxfifo, CXFIFO_CXFIN);
+               break;
+
+       case CX_STALL:
+               setbits_le32(&regs->cxfifo, CXFIFO_CXSTALL | CXFIFO_CXFIN);
+               printf("fotg210: cx_stall!\n");
+               break;
+
+       case CX_IDLE:
+               debug("fotg210: cx_idle?\n");
+       default:
+               break;
+       }
+}
+
+/*
+ * fifo - FIFO id
+ * zlp  - zero length packet
+ */
+static void fotg210_recv(struct fotg210_chip *chip, int ep_id)
+{
+       struct fotg210_regs *regs = chip->regs;
+       struct fotg210_ep *ep = chip->ep + ep_id;
+       struct fotg210_request *req;
+       int len;
+
+       if (ep->stopped || (ep->desc->bEndpointAddress & USB_DIR_IN)) {
+               printf("fotg210: ep%d recv, invalid!\n", ep->id);
+               return;
+       }
+
+       if (list_empty(&ep->queue)) {
+               printf("fotg210: ep%d recv, drop!\n", ep->id);
+               return;
+       }
+
+       req = list_first_entry(&ep->queue, struct fotg210_request, queue);
+       len = fotg210_dma(ep, req);
+       if (len < ep->ep.maxpacket || req->req.length <= req->req.actual) {
+               list_del_init(&req->queue);
+               if (req->req.complete)
+                       req->req.complete(&ep->ep, &req->req);
+       }
+
+       if (ep->id > 0 && list_empty(&ep->queue)) {
+               setbits_le32(&regs->gimr1,
+                       GIMR1_FIFO_RX(ep_to_fifo(chip, ep->id)));
+       }
+}
+
+/*
+ * USB Gadget Layer
+ */
+static int fotg210_ep_enable(
+       struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
+{
+       struct fotg210_ep *ep = container_of(_ep, struct fotg210_ep, ep);
+       struct fotg210_chip *chip = ep->chip;
+       struct fotg210_regs *regs = chip->regs;
+       int id = ep_to_fifo(chip, ep->id);
+       int in = (desc->bEndpointAddress & USB_DIR_IN) ? 1 : 0;
+
+       if (!_ep || !desc
+               || desc->bDescriptorType != USB_DT_ENDPOINT
+               || le16_to_cpu(desc->wMaxPacketSize) == 0) {
+               printf("fotg210: bad ep or descriptor\n");
+               return -EINVAL;
+       }
+
+       ep->desc = desc;
+       ep->stopped = 0;
+
+       if (in)
+               setbits_le32(&regs->fifomap, FIFOMAP(id, FIFOMAP_IN));
+
+       switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
+       case USB_ENDPOINT_XFER_CONTROL:
+               return -EINVAL;
+
+       case USB_ENDPOINT_XFER_ISOC:
+               setbits_le32(&regs->fifocfg,
+                       FIFOCFG(id, FIFOCFG_EN | FIFOCFG_ISOC));
+               break;
+
+       case USB_ENDPOINT_XFER_BULK:
+               setbits_le32(&regs->fifocfg,
+                       FIFOCFG(id, FIFOCFG_EN | FIFOCFG_BULK));
+               break;
+
+       case USB_ENDPOINT_XFER_INT:
+               setbits_le32(&regs->fifocfg,
+                       FIFOCFG(id, FIFOCFG_EN | FIFOCFG_INTR));
+               break;
+       }
+
+       return 0;
+}
+
+static int fotg210_ep_disable(struct usb_ep *_ep)
+{
+       struct fotg210_ep *ep = container_of(_ep, struct fotg210_ep, ep);
+       struct fotg210_chip *chip = ep->chip;
+       struct fotg210_regs *regs = chip->regs;
+       int id = ep_to_fifo(chip, ep->id);
+
+       ep->desc = NULL;
+       ep->stopped = 1;
+
+       clrbits_le32(&regs->fifocfg, FIFOCFG(id, FIFOCFG_CFG_MASK));
+       clrbits_le32(&regs->fifomap, FIFOMAP(id, FIFOMAP_DIR_MASK));
+
+       return 0;
+}
+
+static struct usb_request *fotg210_ep_alloc_request(
+       struct usb_ep *_ep, gfp_t gfp_flags)
+{
+       struct fotg210_request *req = malloc(sizeof(*req));
+
+       if (req) {
+               memset(req, 0, sizeof(*req));
+               INIT_LIST_HEAD(&req->queue);
+       }
+       return &req->req;
+}
+
+static void fotg210_ep_free_request(
+       struct usb_ep *_ep, struct usb_request *_req)
+{
+       struct fotg210_request *req;
+
+       req = container_of(_req, struct fotg210_request, req);
+       free(req);
+}
+
+static int fotg210_ep_queue(
+       struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
+{
+       struct fotg210_ep *ep = container_of(_ep, struct fotg210_ep, ep);
+       struct fotg210_chip *chip = ep->chip;
+       struct fotg210_regs *regs = chip->regs;
+       struct fotg210_request *req;
+
+       req = container_of(_req, struct fotg210_request, req);
+       if (!_req || !_req->complete || !_req->buf
+               || !list_empty(&req->queue)) {
+               printf("fotg210: invalid request to ep%d\n", ep->id);
+               return -EINVAL;
+       }
+
+       if (!chip || chip->state == USB_STATE_SUSPENDED) {
+               printf("fotg210: request while chip suspended\n");
+               return -EINVAL;
+       }
+
+       req->req.actual = 0;
+       req->req.status = -EINPROGRESS;
+
+       if (req->req.length == 0) {
+               req->req.status = 0;
+               if (req->req.complete)
+                       req->req.complete(&ep->ep, &req->req);
+               return 0;
+       }
+
+       if (ep->id == 0) {
+               do {
+                       int len = fotg210_dma(ep, req);
+                       if (len < ep->ep.maxpacket)
+                               break;
+                       if (ep->desc->bEndpointAddress & USB_DIR_IN)
+                               udelay(100);
+               } while (req->req.length > req->req.actual);
+       } else {
+               if (ep->desc->bEndpointAddress & USB_DIR_IN) {
+                       do {
+                               int len = fotg210_dma(ep, req);
+                               if (len < ep->ep.maxpacket)
+                                       break;
+                       } while (req->req.length > req->req.actual);
+               } else {
+                       list_add_tail(&req->queue, &ep->queue);
+                       clrbits_le32(&regs->gimr1,
+                               GIMR1_FIFO_RX(ep_to_fifo(chip, ep->id)));
+               }
+       }
+
+       if (ep->id == 0 || (ep->desc->bEndpointAddress & USB_DIR_IN)) {
+               if (req->req.complete)
+                       req->req.complete(&ep->ep, &req->req);
+       }
+
+       return 0;
+}
+
+static int fotg210_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
+{
+       struct fotg210_ep *ep = container_of(_ep, struct fotg210_ep, ep);
+       struct fotg210_request *req;
+
+       /* make sure it's actually queued on this endpoint */
+       list_for_each_entry(req, &ep->queue, queue) {
+               if (&req->req == _req)
+                       break;
+       }
+       if (&req->req != _req)
+               return -EINVAL;
+
+       /* remove the request */
+       list_del_init(&req->queue);
+
+       /* update status & invoke complete callback */
+       if (req->req.status == -EINPROGRESS) {
+               req->req.status = -ECONNRESET;
+               if (req->req.complete)
+                       req->req.complete(_ep, &req->req);
+       }
+
+       return 0;
+}
+
+static int fotg210_ep_halt(struct usb_ep *_ep, int halt)
+{
+       struct fotg210_ep *ep = container_of(_ep, struct fotg210_ep, ep);
+       struct fotg210_chip *chip = ep->chip;
+       struct fotg210_regs *regs = chip->regs;
+       int ret = -1;
+
+       debug("fotg210: ep%d halt=%d\n", ep->id, halt);
+
+       /* Endpoint STALL */
+       if (ep->id > 0 && ep->id <= CFG_NUM_ENDPOINTS) {
+               if (halt) {
+                       /* wait until all ep fifo empty */
+                       fotg210_cxwait(chip, 0xf00);
+                       /* stall */
+                       if (ep->desc->bEndpointAddress & USB_DIR_IN) {
+                               setbits_le32(&regs->iep[ep->id - 1],
+                                       IEP_STALL);
+                       } else {
+                               setbits_le32(&regs->oep[ep->id - 1],
+                                       OEP_STALL);
+                       }
+               } else {
+                       if (ep->desc->bEndpointAddress & USB_DIR_IN) {
+                               clrbits_le32(&regs->iep[ep->id - 1],
+                                       IEP_STALL);
+                       } else {
+                               clrbits_le32(&regs->oep[ep->id - 1],
+                                       OEP_STALL);
+                       }
+               }
+               ret = 0;
+       }
+
+       return ret;
+}
+
+/*
+ * activate/deactivate link with host.
+ */
+static void pullup(struct fotg210_chip *chip, int is_on)
+{
+       struct fotg210_regs *regs = chip->regs;
+
+       if (is_on) {
+               if (!chip->pullup) {
+                       chip->state = USB_STATE_POWERED;
+                       chip->pullup = 1;
+                       /* enable the chip */
+                       setbits_le32(&regs->dev_ctrl, DEVCTRL_EN);
+                       /* clear unplug bit (BIT0) */
+                       clrbits_le32(&regs->phy_tmsr, PHYTMSR_UNPLUG);
+               }
+       } else {
+               chip->state = USB_STATE_NOTATTACHED;
+               chip->pullup = 0;
+               chip->addr = 0;
+               writel(chip->addr, &regs->dev_addr);
+               /* set unplug bit (BIT0) */
+               setbits_le32(&regs->phy_tmsr, PHYTMSR_UNPLUG);
+               /* disable the chip */
+               clrbits_le32(&regs->dev_ctrl, DEVCTRL_EN);
+       }
+}
+
+static int fotg210_pullup(struct usb_gadget *_gadget, int is_on)
+{
+       struct fotg210_chip *chip;
+
+       chip = container_of(_gadget, struct fotg210_chip, gadget);
+
+       debug("fotg210: pullup=%d\n", is_on);
+
+       pullup(chip, is_on);
+
+       return 0;
+}
+
+static int fotg210_get_frame(struct usb_gadget *_gadget)
+{
+       struct fotg210_chip *chip;
+       struct fotg210_regs *regs;
+
+       chip = container_of(_gadget, struct fotg210_chip, gadget);
+       regs = chip->regs;
+
+       return SOFFNR_FNR(readl(&regs->sof_fnr));
+}
+
+static struct usb_gadget_ops fotg210_gadget_ops = {
+       .get_frame = fotg210_get_frame,
+       .pullup = fotg210_pullup,
+};
+
+static struct usb_ep_ops fotg210_ep_ops = {
+       .enable         = fotg210_ep_enable,
+       .disable        = fotg210_ep_disable,
+       .queue          = fotg210_ep_queue,
+       .dequeue        = fotg210_ep_dequeue,
+       .set_halt       = fotg210_ep_halt,
+       .alloc_request  = fotg210_ep_alloc_request,
+       .free_request   = fotg210_ep_free_request,
+};
+
+static struct fotg210_chip controller = {
+       .regs = (void __iomem *)CONFIG_FOTG210_BASE,
+       .gadget = {
+               .name = "fotg210_udc",
+               .ops = &fotg210_gadget_ops,
+               .ep0 = &controller.ep[0].ep,
+               .speed = USB_SPEED_UNKNOWN,
+               .is_dualspeed = 1,
+               .is_otg = 0,
+               .is_a_peripheral = 0,
+               .b_hnp_enable = 0,
+               .a_hnp_support = 0,
+               .a_alt_hnp_support = 0,
+       },
+       .ep[0] = {
+               .id = 0,
+               .ep = {
+                       .name  = "ep0",
+                       .ops   = &fotg210_ep_ops,
+               },
+               .desc      = &ep0_desc,
+               .chip      = &controller,
+               .maxpacket = CFG_EP0_MAX_PACKET_SIZE,
+       },
+       .ep[1] = {
+               .id = 1,
+               .ep = {
+                       .name  = "ep1",
+                       .ops   = &fotg210_ep_ops,
+               },
+               .chip      = &controller,
+               .maxpacket = CFG_EPX_MAX_PACKET_SIZE,
+       },
+       .ep[2] = {
+               .id = 2,
+               .ep = {
+                       .name  = "ep2",
+                       .ops   = &fotg210_ep_ops,
+               },
+               .chip      = &controller,
+               .maxpacket = CFG_EPX_MAX_PACKET_SIZE,
+       },
+       .ep[3] = {
+               .id = 3,
+               .ep = {
+                       .name  = "ep3",
+                       .ops   = &fotg210_ep_ops,
+               },
+               .chip      = &controller,
+               .maxpacket = CFG_EPX_MAX_PACKET_SIZE,
+       },
+       .ep[4] = {
+               .id = 4,
+               .ep = {
+                       .name  = "ep4",
+                       .ops   = &fotg210_ep_ops,
+               },
+               .chip      = &controller,
+               .maxpacket = CFG_EPX_MAX_PACKET_SIZE,
+       },
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+       struct fotg210_chip *chip = &controller;
+       struct fotg210_regs *regs = chip->regs;
+       uint32_t id, st, isr, gisr;
+
+       isr  = readl(&regs->isr) & (~readl(&regs->imr));
+       gisr = readl(&regs->gisr) & (~readl(&regs->gimr));
+       if (!(isr & ISR_DEV) || !gisr)
+               return 0;
+
+       writel(ISR_DEV, &regs->isr);
+
+       /* CX interrupts */
+       if (gisr & GISR_GRP0) {
+               st = readl(&regs->gisr0);
+               writel(0, &regs->gisr0);
+
+               if (st & GISR0_CXERR)
+                       printf("fotg210: cmd error\n");
+
+               if (st & GISR0_CXABORT)
+                       printf("fotg210: cmd abort\n");
+
+               if (st & GISR0_CXSETUP)    /* setup */
+                       fotg210_setup(chip);
+               else if (st & GISR0_CXEND) /* command finish */
+                       setbits_le32(&regs->cxfifo, CXFIFO_CXFIN);
+       }
+
+       /* FIFO interrupts */
+       if (gisr & GISR_GRP1) {
+               st = readl(&regs->gisr1);
+               for (id = 0; id < 4; ++id) {
+                       if (st & GISR1_RX_FIFO(id))
+                               fotg210_recv(chip, fifo_to_ep(chip, id, 0));
+               }
+       }
+
+       /* Device Status Interrupts */
+       if (gisr & GISR_GRP2) {
+               st = readl(&regs->gisr2);
+               writel(0, &regs->gisr2);
+
+               if (st & GISR2_RESET)
+                       printf("fotg210: reset by host\n");
+               else if (st & GISR2_SUSPEND)
+                       printf("fotg210: suspend/removed\n");
+               else if (st & GISR2_RESUME)
+                       printf("fotg210: resume\n");
+
+               /* Errors */
+               if (st & GISR2_ISOCERR)
+                       printf("fotg210: iso error\n");
+               if (st & GISR2_ISOCABT)
+                       printf("fotg210: iso abort\n");
+               if (st & GISR2_DMAERR)
+                       printf("fotg210: dma error\n");
+       }
+
+       return 0;
+}
+
+int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+{
+       int i, ret = 0;
+       struct fotg210_chip *chip = &controller;
+
+       if (!driver    || !driver->bind || !driver->setup) {
+               puts("fotg210: bad parameter.\n");
+               return -EINVAL;
+       }
+
+       INIT_LIST_HEAD(&chip->gadget.ep_list);
+       for (i = 0; i < CFG_NUM_ENDPOINTS + 1; ++i) {
+               struct fotg210_ep *ep = chip->ep + i;
+
+               ep->ep.maxpacket = ep->maxpacket;
+               INIT_LIST_HEAD(&ep->queue);
+
+               if (ep->id == 0) {
+                       ep->stopped = 0;
+               } else {
+                       ep->stopped = 1;
+                       list_add_tail(&ep->ep.ep_list, &chip->gadget.ep_list);
+               }
+       }
+
+       if (fotg210_reset(chip)) {
+               puts("fotg210: reset failed.\n");
+               return -EINVAL;
+       }
+
+       ret = driver->bind(&chip->gadget);
+       if (ret) {
+               debug("fotg210: driver->bind() returned %d\n", ret);
+               return ret;
+       }
+       chip->driver = driver;
+
+       return ret;
+}
+
+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+{
+       struct fotg210_chip *chip = &controller;
+
+       driver->unbind(&chip->gadget);
+       chip->driver = NULL;
+
+       pullup(chip, 0);
+
+       return 0;
+}
index e5701422fa3de2e4cb48244fa65b4e63441356d1..f038747e63e0d5175bb58ee495b7e419140d8c98 100644 (file)
 #define gadget_is_mv(g)        0
 #endif
 
+#ifdef CONFIG_USB_GADGET_FOTG210
+#define gadget_is_fotg210(g)        (!strcmp("fotg210_udc", (g)->name))
+#else
+#define gadget_is_fotg210(g)        0
+#endif
+
 /*
  * CONFIG_USB_GADGET_SX2
  * CONFIG_USB_GADGET_AU1X00
@@ -215,5 +221,7 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget)
                return 0x20;
        else if (gadget_is_mv(gadget))
                return 0x21;
+       else if (gadget_is_fotg210(gadget))
+               return 0x22;
        return -ENOENT;
 }
index 9ce98f07684af8873e221babb904d66f03160a72..085503dbe8a15f96fa6a492ab7843d7d781c816b 100644 (file)
@@ -314,7 +314,8 @@ static int pxa25x_ep_enable(struct usb_ep *_ep,
        if (!_ep || !desc || ep->desc || _ep->name == ep0name
                        || desc->bDescriptorType != USB_DT_ENDPOINT
                        || ep->bEndpointAddress != desc->bEndpointAddress
-                       || ep->fifo_size < le16_to_cpu(desc->wMaxPacketSize)) {
+                       || ep->fifo_size <
+                          le16_to_cpu(get_unaligned(&desc->wMaxPacketSize))) {
                printf("%s, bad ep or descriptor\n", __func__);
                return -EINVAL;
        }
@@ -329,9 +330,9 @@ static int pxa25x_ep_enable(struct usb_ep *_ep,
 
        /* hardware _could_ do smaller, but driver doesn't */
        if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK
-                               && le16_to_cpu(desc->wMaxPacketSize)
+                       && le16_to_cpu(get_unaligned(&desc->wMaxPacketSize))
                                                != BULK_FIFO_SIZE)
-                       || !desc->wMaxPacketSize) {
+                       || !get_unaligned(&desc->wMaxPacketSize)) {
                printf("%s, bad %s maxpacket\n", __func__, _ep->name);
                return -ERANGE;
        }
@@ -345,7 +346,7 @@ static int pxa25x_ep_enable(struct usb_ep *_ep,
        ep->desc = desc;
        ep->stopped = 0;
        ep->pio_irqs = 0;
-       ep->ep.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
+       ep->ep.maxpacket = le16_to_cpu(get_unaligned(&desc->wMaxPacketSize));
 
        /* flush fifo (mostly for OUT buffers) */
        pxa25x_ep_fifo_flush(_ep);
@@ -485,7 +486,7 @@ write_fifo(struct pxa25x_ep *ep, struct pxa25x_request *req)
 {
        unsigned max;
 
-       max = le16_to_cpu(ep->desc->wMaxPacketSize);
+       max = le16_to_cpu(get_unaligned(&ep->desc->wMaxPacketSize));
        do {
                unsigned count;
                int is_last, is_short;
@@ -766,7 +767,7 @@ pxa25x_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
         */
        if (unlikely(ep->bmAttributes == USB_ENDPOINT_XFER_ISOC
                        && req->req.length >
-                       le16_to_cpu(ep->desc->wMaxPacketSize)))
+                       le16_to_cpu(get_unaligned(&ep->desc->wMaxPacketSize))))
                return -EMSGSIZE;
 
        debug_cond(NOISY, "%s queue req %p, len %d buf %p\n",
index 4c00081743679c54132978b1cb0abad9fc5d505b..71cc0f2a0562ad4d75141a9388180a2ffe7da482 100644 (file)
@@ -610,7 +610,9 @@ void udc_connect(void)
 
 #ifdef CONFIG_USB_DEV_PULLUP_GPIO
        /* Turn on the USB connection by enabling the pullup resistor */
-       set_GPIO_mode(CONFIG_USB_DEV_PULLUP_GPIO | GPIO_OUT);
+       writel(readl(GPDR(CONFIG_USB_DEV_PULLUP_GPIO))
+                    | GPIO_bit(CONFIG_USB_DEV_PULLUP_GPIO),
+              GPDR(CONFIG_USB_DEV_PULLUP_GPIO));
        writel(GPIO_bit(CONFIG_USB_DEV_PULLUP_GPIO), GPSR(CONFIG_USB_DEV_PULLUP_GPIO));
 #else
        /* Host port 2 transceiver D+ pull up enable */
index 87a59704db764148d97ca17b4227976fc244ef19..98f2a104b7dc77dda540feebee457473317189a7 100644 (file)
@@ -43,6 +43,7 @@ COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-mpc512x.o
 else
 COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
 endif
+COBJS-$(CONFIG_USB_EHCI_FARADAY) += ehci-faraday.o
 COBJS-$(CONFIG_USB_EHCI_EXYNOS) += ehci-exynos.o
 COBJS-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o
 COBJS-$(CONFIG_USB_EHCI_MXS) += ehci-mxs.o
diff --git a/drivers/usb/host/ehci-faraday.c b/drivers/usb/host/ehci-faraday.c
new file mode 100644 (file)
index 0000000..86add36
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Faraday USB 2.0 EHCI Controller
+ *
+ * (C) Copyright 2010 Faraday Technology
+ * Dante Su <dantesu@faraday-tech.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <usb.h>
+#include <usb/fusbh200.h>
+#include <usb/fotg210.h>
+
+#include "ehci.h"
+
+#ifndef CONFIG_USB_EHCI_BASE_LIST
+#define CONFIG_USB_EHCI_BASE_LIST      { CONFIG_USB_EHCI_BASE }
+#endif
+
+union ehci_faraday_regs {
+       struct fusbh200_regs usb;
+       struct fotg210_regs  otg;
+};
+
+static inline int ehci_is_fotg2xx(union ehci_faraday_regs *regs)
+{
+       return !readl(&regs->usb.easstr);
+}
+
+/*
+ * Create the appropriate control structures to manage
+ * a new EHCI host controller.
+ */
+int ehci_hcd_init(int index, struct ehci_hccr **ret_hccr,
+               struct ehci_hcor **ret_hcor)
+{
+       struct ehci_hccr *hccr;
+       struct ehci_hcor *hcor;
+       union ehci_faraday_regs *regs;
+       uint32_t base_list[] = CONFIG_USB_EHCI_BASE_LIST;
+
+       if (index < 0 || index >= ARRAY_SIZE(base_list))
+               return -1;
+       regs = (void __iomem *)base_list[index];
+       hccr = (struct ehci_hccr *)&regs->usb.hccr;
+       hcor = (struct ehci_hcor *)&regs->usb.hcor;
+
+       if (ehci_is_fotg2xx(regs)) {
+               /* A-device bus reset */
+               /* ... Power off A-device */
+               setbits_le32(&regs->otg.otgcsr, OTGCSR_A_BUSDROP);
+               /* ... Drop vbus and bus traffic */
+               clrbits_le32(&regs->otg.otgcsr, OTGCSR_A_BUSREQ);
+               mdelay(1);
+               /* ... Power on A-device */
+               clrbits_le32(&regs->otg.otgcsr, OTGCSR_A_BUSDROP);
+               /* ... Drive vbus and bus traffic */
+               setbits_le32(&regs->otg.otgcsr, OTGCSR_A_BUSREQ);
+               mdelay(1);
+               /* Disable OTG & DEV interrupts, triggered at level-high */
+               writel(IMR_IRQLH | IMR_OTG | IMR_DEV, &regs->otg.imr);
+               /* Clear all interrupt status */
+               writel(ISR_HOST | ISR_OTG | ISR_DEV, &regs->otg.isr);
+       } else {
+               /* Interrupt=level-high */
+               setbits_le32(&regs->usb.bmcsr, BMCSR_IRQLH);
+               /* VBUS on */
+               clrbits_le32(&regs->usb.bmcsr, BMCSR_VBUS_OFF);
+               /* Disable all interrupts */
+               writel(0x00, &regs->usb.bmier);
+               writel(0x1f, &regs->usb.bmisr);
+       }
+
+       *ret_hccr = hccr;
+       *ret_hcor = hcor;
+
+       return 0;
+}
+
+/*
+ * Destroy the appropriate control structures corresponding
+ * the the EHCI host controller.
+ */
+int ehci_hcd_stop(int index)
+{
+       return 0;
+}
+
+/*
+ * This ehci_set_usbmode() overrides the weak function
+ * in "ehci-hcd.c".
+ */
+void ehci_set_usbmode(int index)
+{
+       /* nothing needs to be done */
+}
+
+/*
+ * This ehci_get_port_speed() overrides the weak function
+ * in "ehci-hcd.c".
+ */
+int ehci_get_port_speed(struct ehci_hcor *hcor, uint32_t reg)
+{
+       int spd, ret = PORTSC_PSPD_HS;
+       union ehci_faraday_regs *regs = (void __iomem *)((ulong)hcor - 0x10);
+
+       if (ehci_is_fotg2xx(regs))
+               spd = OTGCSR_SPD(readl(&regs->otg.otgcsr));
+       else
+               spd = BMCSR_SPD(readl(&regs->usb.bmcsr));
+
+       switch (spd) {
+       case 0:    /* full speed */
+               ret = PORTSC_PSPD_FS;
+               break;
+       case 1:    /* low  speed */
+               ret = PORTSC_PSPD_LS;
+               break;
+       case 2:    /* high speed */
+               ret = PORTSC_PSPD_HS;
+               break;
+       default:
+               printf("ehci-faraday: invalid device speed\n");
+               break;
+       }
+
+       return ret;
+}
+
+/*
+ * This ehci_get_portsc_register() overrides the weak function
+ * in "ehci-hcd.c".
+ */
+uint32_t *ehci_get_portsc_register(struct ehci_hcor *hcor, int port)
+{
+       /* Faraday EHCI has one and only one portsc register */
+       if (port) {
+               /* Printing the message would cause a scan failure! */
+               debug("The request port(%d) is not configured\n", port);
+               return NULL;
+       }
+
+       /* Faraday EHCI PORTSC register offset is 0x20 from hcor */
+       return (uint32_t *)((uint8_t *)hcor + 0x20);
+}
index e0f3e4b6c788bf3e3d78dcf929c652f5e971845c..706cf0cb7dba246c2c567b5da4111590bb9679b9 100644 (file)
@@ -589,10 +589,12 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
                dev->act_len = length - QT_TOKEN_GET_TOTALBYTES(token);
        } else {
                dev->act_len = 0;
+#ifndef CONFIG_USB_EHCI_FARADAY
                debug("dev=%u, usbsts=%#x, p[1]=%#x, p[2]=%#x\n",
                      dev->devnum, ehci_readl(&ctrl->hcor->or_usbsts),
                      ehci_readl(&ctrl->hcor->or_portsc[0]),
                      ehci_readl(&ctrl->hcor->or_portsc[1]));
+#endif
        }
 
        free(qtd);
@@ -603,6 +605,17 @@ fail:
        return -1;
 }
 
+__weak uint32_t *ehci_get_portsc_register(struct ehci_hcor *hcor, int port)
+{
+       if (port < 0 || port >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
+               /* Printing the message would cause a scan failure! */
+               debug("The request port(%u) is not configured\n", port);
+               return NULL;
+       }
+
+       return (uint32_t *)&hcor->or_portsc[port];
+}
+
 int
 ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                 int length, struct devrequest *req)
@@ -616,11 +629,6 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
        int port = le16_to_cpu(req->index) & 0xff;
        struct ehci_ctrl *ctrl = dev->controller;
 
-       if (port > CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
-               printf("The request port(%d) is not configured\n", port - 1);
-               return -1;
-       }
-       status_reg = (uint32_t *)&ctrl->hcor->or_portsc[port - 1];
        srclen = 0;
 
        debug("req=%u (%#x), type=%u (%#x), value=%u, index=%u\n",
@@ -630,6 +638,19 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 
        typeReq = req->request | req->requesttype << 8;
 
+       switch (typeReq) {
+       case USB_REQ_GET_STATUS | ((USB_RT_PORT | USB_DIR_IN) << 8):
+       case USB_REQ_SET_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
+       case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
+               status_reg = ehci_get_portsc_register(ctrl->hcor, port - 1);
+               if (!status_reg)
+                       return -1;
+               break;
+       default:
+               status_reg = NULL;
+               break;
+       }
+
        switch (typeReq) {
        case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
                switch (le16_to_cpu(req->value) >> 8) {
@@ -809,21 +830,23 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                break;
        case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
                reg = ehci_readl(status_reg);
+               reg &= ~EHCI_PS_CLEAR;
                switch (le16_to_cpu(req->value)) {
                case USB_PORT_FEAT_ENABLE:
                        reg &= ~EHCI_PS_PE;
                        break;
                case USB_PORT_FEAT_C_ENABLE:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_PE;
+                       reg |= EHCI_PS_PE;
                        break;
                case USB_PORT_FEAT_POWER:
                        if (HCS_PPC(ehci_readl(&ctrl->hccr->cr_hcsparams)))
-                               reg = reg & ~(EHCI_PS_CLEAR | EHCI_PS_PP);
+                               reg &= ~EHCI_PS_PP;
+                       break;
                case USB_PORT_FEAT_C_CONNECTION:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_CSC;
+                       reg |= EHCI_PS_CSC;
                        break;
                case USB_PORT_FEAT_OVER_CURRENT:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_OCC;
+                       reg |= EHCI_PS_OCC;
                        break;
                case USB_PORT_FEAT_C_RESET:
                        ctrl->portreset &= ~(1 << port);
@@ -903,6 +926,9 @@ int usb_lowlevel_init(int index, void **controller)
        qh_list->qh_overlay.qt_token =
                        cpu_to_hc32(QT_TOKEN_STATUS(QT_TOKEN_STATUS_HALTED));
 
+       flush_dcache_range((uint32_t)qh_list,
+                          ALIGN_END_ADDR(struct QH, qh_list, 1));
+
        /* Set async. queue head pointer. */
        ehci_writel(&ehcic[index].hcor->or_asynclistaddr, (uint32_t)qh_list);
 
@@ -916,6 +942,9 @@ int usb_lowlevel_init(int index, void **controller)
        periodic->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
        periodic->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
 
+       flush_dcache_range((uint32_t)periodic,
+                          ALIGN_END_ADDR(struct QH, periodic, 1));
+
        /*
         * Step 2: Setup frame-list: Every microframe, USB tries the same list.
         *         In particular, device specifications on polling frequency
@@ -933,6 +962,10 @@ int usb_lowlevel_init(int index, void **controller)
                                                | QH_LINK_TYPE_QH;
        }
 
+       flush_dcache_range((uint32_t)ehcic[index].periodic_list,
+                          ALIGN_END_ADDR(uint32_t, ehcic[index].periodic_list,
+                                         1024));
+
        /* Set periodic list base address */
        ehci_writel(&ehcic[index].hcor->or_periodiclistbase,
                (uint32_t)ehcic[index].periodic_list);
@@ -959,10 +992,13 @@ int usb_lowlevel_init(int index, void **controller)
        cmd |= CMD_RUN;
        ehci_writel(&ehcic[index].hcor->or_usbcmd, cmd);
 
+#ifndef CONFIG_USB_EHCI_FARADAY
        /* take control over the ports */
        cmd = ehci_readl(&ehcic[index].hcor->or_configflag);
        cmd |= FLAG_CF;
        ehci_writel(&ehcic[index].hcor->or_configflag, cmd);
+#endif
+
        /* unblock posted write */
        cmd = ehci_readl(&ehcic[index].hcor->or_usbcmd);
        mdelay(5);
@@ -1144,6 +1180,16 @@ create_int_queue(struct usb_device *dev, unsigned long pipe, int queuesize,
                *buf = buffer + i * elementsize;
        }
 
+       flush_dcache_range((uint32_t)buffer,
+                          ALIGN_END_ADDR(char, buffer,
+                                         queuesize * elementsize));
+       flush_dcache_range((uint32_t)result->first,
+                          ALIGN_END_ADDR(struct QH, result->first,
+                                         queuesize));
+       flush_dcache_range((uint32_t)result->tds,
+                          ALIGN_END_ADDR(struct qTD, result->tds,
+                                         queuesize));
+
        if (disable_periodic(ctrl) < 0) {
                debug("FATAL: periodic should never fail, but did");
                goto fail3;
@@ -1154,6 +1200,11 @@ create_int_queue(struct usb_device *dev, unsigned long pipe, int queuesize,
        result->last->qh_link = list->qh_link;
        list->qh_link = (uint32_t)result->first | QH_LINK_TYPE_QH;
 
+       flush_dcache_range((uint32_t)result->last,
+                          ALIGN_END_ADDR(struct QH, result->last, 1));
+       flush_dcache_range((uint32_t)list,
+                          ALIGN_END_ADDR(struct QH, list, 1));
+
        if (enable_periodic(ctrl) < 0) {
                debug("FATAL: periodic should never fail, but did");
                goto fail3;
@@ -1184,6 +1235,8 @@ void *poll_int_queue(struct usb_device *dev, struct int_queue *queue)
                return NULL;
        }
        /* still active */
+       invalidate_dcache_range((uint32_t)cur,
+                               ALIGN_END_ADDR(struct QH, cur, 1));
        if (cur->qh_overlay.qt_token & 0x80) {
                debug("Exit poll_int_queue with no completed intr transfer. "
                      "token is %x\n", cur->qh_overlay.qt_token);
@@ -1290,6 +1343,9 @@ submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                return -EINVAL;
        }
 
+       invalidate_dcache_range((uint32_t)buffer,
+                               ALIGN_END_ADDR(char, buffer, length));
+
        ret = destroy_int_queue(dev, queue);
        if (ret < 0)
                return ret;
index adbed5c90ca54717baa7e42d42a41fdf3599716f..f43c38da6178ebe5d45db800737f2fc9b208b88a 100644 (file)
@@ -21,8 +21,6 @@
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/clock.h>
-#include <asm/arch/mx5x_pins.h>
-#include <asm/arch/iomux.h>
 
 #include "ehci.h"
 
 /* USB_CTRL_1 */
 #define MXC_USB_CTRL_UH1_EXT_CLK_EN    (1 << 25)
 
-/* USB pin configuration */
-#define USB_PAD_CONFIG (PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST | \
-                       PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | \
-                       PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL)
-
-#ifdef CONFIG_MX51
-/*
- * Configure the MX51 USB H1 IOMUX
- */
-void setup_iomux_usb_h1(void)
-{
-       mxc_request_iomux(MX51_PIN_USBH1_STP, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_STP, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_CLK, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_CLK, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DIR, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DIR, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_NXT, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_NXT, USB_PAD_CONFIG);
-
-       mxc_request_iomux(MX51_PIN_USBH1_DATA0, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA0, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA1, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA1, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA2, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA2, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA3, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA3, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA4, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA4, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA5, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA5, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA6, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA6, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_USBH1_DATA7, IOMUX_CONFIG_ALT0);
-       mxc_iomux_set_pad(MX51_PIN_USBH1_DATA7, USB_PAD_CONFIG);
-}
-
-/*
- * Configure the MX51 USB H2 IOMUX
- */
-void setup_iomux_usb_h2(void)
-{
-       mxc_request_iomux(MX51_PIN_EIM_A24, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A24, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_A25, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A25, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_A26, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A26, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_A27, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_A27, USB_PAD_CONFIG);
-
-       mxc_request_iomux(MX51_PIN_EIM_D16, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D16, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D17, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D17, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D18, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D18, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D19, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D19, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D20, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D20, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D21, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D21, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D22, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D22, USB_PAD_CONFIG);
-       mxc_request_iomux(MX51_PIN_EIM_D23, IOMUX_CONFIG_ALT2);
-       mxc_iomux_set_pad(MX51_PIN_EIM_D23, USB_PAD_CONFIG);
-}
-#endif
-
 int mxc_set_usbcontrol(int port, unsigned int flags)
 {
        unsigned int v;
index aa5cf57aedaad332854c6083fa66b80398f429a9..2060a3eb4612b34849a5341f429a0a7325174f99 100644 (file)
@@ -42,7 +42,7 @@ int usb_cpu_init(void)
        while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB)
                ;
 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) || \
-       defined(CONFIG_AT91SAM9X5)
+       defined(CONFIG_AT91SAM9X5) || defined(CONFIG_SAMA5D3)
        /* Enable UPLL */
        writel(readl(&pmc->uckr) | AT91_PMC_UPLLEN | AT91_PMC_BIASEN,
                &pmc->uckr);
@@ -54,7 +54,12 @@ int usb_cpu_init(void)
 #endif
 
        /* Enable USB host clock. */
+#ifdef CONFIG_SAMA5D3
+       writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcer1);
+#else
        writel(1 << ATMEL_ID_UHP, &pmc->pcer);
+#endif
+
 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
        writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scer);
 #else
@@ -69,7 +74,12 @@ int usb_cpu_stop(void)
        at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
 
        /* Disable USB host clock. */
+#ifdef CONFIG_SAMA5D3
+       writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcdr1);
+#else
        writel(1 << ATMEL_ID_UHP, &pmc->pcdr);
+#endif
+
 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
        writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scdr);
 #else
@@ -83,7 +93,7 @@ int usb_cpu_stop(void)
        while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0)
                ;
 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) || \
-       defined(CONFIG_AT91SAM9X5)
+       defined(CONFIG_AT91SAM9X5) || defined(CONFIG_SAMA5D3)
        /* Disable UPLL */
        writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr);
        while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
index c7876ed094b1a8bd02eb552babea20db4fe61487..a395ebcc67e9685a138f8e6b3e1937b891db29a3 100644 (file)
@@ -30,6 +30,7 @@
  * MA 02111-1307 USA
  */
 
+#include <asm/omap_common.h>
 #include <twl4030.h>
 #include <twl6030.h>
 #include "omap3.h"
@@ -135,7 +136,8 @@ int musb_platform_init(void)
 #endif
 
 #ifdef CONFIG_OMAP4430
-               u32 *usbotghs_control = (u32 *)(CTRL_BASE + 0x33C);
+               u32 *usbotghs_control =
+                       (u32 *)((*ctrl)->control_usbotghs_ctrl);
                *usbotghs_control = 0x15;
 #endif
                platform_needs_initialization = 0;
index 54d2e615c8076030a4a6c452edad274c0474fd24..74f1dccbd49531128ed14c3fefcfb3654db80d11 100644 (file)
@@ -54,7 +54,7 @@ static int twl4030_usb_write(u8 address, u8 data)
 {
        int ret;
 
-       ret = twl4030_i2c_write_u8(TWL4030_CHIP_USB, data, address);
+       ret = twl4030_i2c_write_u8(TWL4030_CHIP_USB, address, data);
        if (ret != 0)
                printf("TWL4030:USB:Write[0x%x] Error %d\n", address, ret);
 
@@ -66,7 +66,7 @@ static int twl4030_usb_read(u8 address)
        u8 data;
        int ret;
 
-       ret = twl4030_i2c_read_u8(TWL4030_CHIP_USB, &data, address);
+       ret = twl4030_i2c_read_u8(TWL4030_CHIP_USB, address, &data);
        if (ret == 0)
                ret = data;
        else
@@ -78,40 +78,40 @@ static int twl4030_usb_read(u8 address)
 static void twl4030_usb_ldo_init(void)
 {
        /* Enable writing to power configuration registers */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 0xC0,
-                            TWL4030_PM_MASTER_PROTECT_KEY);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 0x0C,
-                            TWL4030_PM_MASTER_PROTECT_KEY);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                            TWL4030_PM_MASTER_PROTECT_KEY, 0xC0);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                            TWL4030_PM_MASTER_PROTECT_KEY, 0x0C);
 
        /* put VUSB3V1 LDO in active state */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x00,
-                            TWL4030_PM_RECEIVER_VUSB_DEDICATED2);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB_DEDICATED2, 0x00);
 
        /* input to VUSB3V1 LDO is from VBAT, not VBUS */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x14,
-                            TWL4030_PM_RECEIVER_VUSB_DEDICATED1);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB_DEDICATED1, 0x14);
 
        /* turn on 3.1V regulator */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x20,
-                            TWL4030_PM_RECEIVER_VUSB3V1_DEV_GRP);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x00,
-                            TWL4030_PM_RECEIVER_VUSB3V1_TYPE);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB3V1_DEV_GRP, 0x20);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB3V1_TYPE, 0x00);
 
        /* turn on 1.5V regulator */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x20,
-                            TWL4030_PM_RECEIVER_VUSB1V5_DEV_GRP);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x00,
-                            TWL4030_PM_RECEIVER_VUSB1V5_TYPE);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB1V5_DEV_GRP, 0x20);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB1V5_TYPE, 0x00);
 
        /* turn on 1.8V regulator */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x20,
-                            TWL4030_PM_RECEIVER_VUSB1V8_DEV_GRP);
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 0x00,
-                            TWL4030_PM_RECEIVER_VUSB1V8_TYPE);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB1V8_DEV_GRP, 0x20);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER,
+                            TWL4030_PM_RECEIVER_VUSB1V8_TYPE, 0x00);
 
        /* disable access to power configuration registers */
-       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 0x00,
-                            TWL4030_PM_MASTER_PROTECT_KEY);
+       twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
+                            TWL4030_PM_MASTER_PROTECT_KEY, 0x00);
 }
 
 static void twl4030_phy_power(void)
index 53952ab07e4ed613b10650d18dbaa762a7373d7a..68ff34bfd5b24f7fd181fe361cb40d1348446be7 100644 (file)
@@ -49,6 +49,7 @@ COBJS-$(CONFIG_VIDEO_MB862xx) += mb862xx.o videomodes.o
 COBJS-$(CONFIG_VIDEO_MB86R0xGDC) += mb86r0xgdc.o videomodes.o
 COBJS-$(CONFIG_VIDEO_MX3) += mx3fb.o videomodes.o
 COBJS-$(CONFIG_VIDEO_IPUV3) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o
+COBJS-$(CONFIG_VIDEO_MXS) += mxsfb.o videomodes.o
 COBJS-$(CONFIG_VIDEO_OMAP3) += omap3_dss.o
 COBJS-$(CONFIG_VIDEO_SED13806) += sed13806.o
 COBJS-$(CONFIG_VIDEO_SM501) += sm501.o
index 61e1058adcfdcaf3744d0e7f2fd8f374132d5e79..b10f1590ba00ee9505bd09fcbc03d1871d7d2fdb 100644 (file)
 #endif
 #endif
 
+#ifdef CONFIG_VIDEO_MXS
+#define VIDEO_FB_16BPP_WORD_SWAP
+#endif
+
 /*
  * Defines for the MB862xx driver
  */
@@ -568,8 +572,6 @@ static void video_drawchars(int xx, int yy, unsigned char *s, int count)
                                        SWAP32((video_font_draw_table32
                                                [bits & 15][3] & eorx) ^ bgx);
                        }
-                       if (cfb_do_flush_cache)
-                               flush_cache((ulong)dest0, 32);
                        dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
                        s++;
                }
@@ -638,8 +640,6 @@ static void video_invertchar(int xx, int yy)
                for (x = firstx; x < lastx; x++) {
                        u8 *dest = (u8 *)(video_fb_address) + x + y;
                        *dest = ~*dest;
-                       if (cfb_do_flush_cache)
-                               flush_cache((ulong)dest, 4);
                }
        }
 }
@@ -683,6 +683,8 @@ void console_cursor(int state)
                }
                cursor_state = state;
        }
+       if (cfb_do_flush_cache)
+               flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
 }
 #endif
 
@@ -735,8 +737,6 @@ static void console_clear_line(int line, int begin, int end)
                        memsetl(offset + i * VIDEO_LINE_LEN, size, bgx);
        }
 #endif
-       if (cfb_do_flush_cache)
-               flush_cache((ulong)CONSOLE_ROW_FIRST, CONSOLE_SIZE);
 }
 
 static void console_scrollup(void)
@@ -1142,6 +1142,8 @@ void video_putc(const char c)
 #else
        parse_putc(c);
 #endif
+       if (cfb_do_flush_cache)
+               flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
 }
 
 void video_puts(const char *s)
@@ -1795,6 +1797,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
        }
 #endif
 
+       if (cfb_do_flush_cache)
+               flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
        return (0);
 }
 #endif
@@ -2205,6 +2209,9 @@ static int video_init(void)
        console_col = 0;
        console_row = 0;
 
+       if (cfb_do_flush_cache)
+               flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE);
+
        return 0;
 }
 
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
new file mode 100644 (file)
index 0000000..b189419
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Freescale i.MX23/i.MX28 LCDIF driver
+ *
+ * Copyright (C) 2011-2013 Marek Vasut <marex@denx.de>
+ *
+ * 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 <video_fb.h>
+
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+
+#include "videomodes.h"
+
+#define        PS2KHZ(ps)      (1000000000UL / (ps))
+
+static GraphicDevice panel;
+
+/*
+ * DENX M28EVK:
+ * setenv videomode
+ * video=ctfb:x:800,y:480,depth:18,mode:0,pclk:30066,
+ *       le:0,ri:256,up:0,lo:45,hs:1,vs:1,sync:100663296,vmode:0
+ *
+ * Freescale mx23evk/mx28evk with a Seiko 4.3'' WVGA panel:
+ * setenv videomode
+ * video=ctfb:x:800,y:480,depth:24,mode:0,pclk:29851,
+ *      le:89,ri:164,up:23,lo:10,hs:10,vs:10,sync:0,vmode:0
+ */
+
+static void mxs_lcd_init(GraphicDevice *panel,
+                       struct ctfb_res_modes *mode, int bpp)
+{
+       struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE;
+       uint32_t word_len = 0, bus_width = 0;
+       uint8_t valid_data = 0;
+
+       /* Kick in the LCDIF clock */
+       mxs_set_lcdclk(PS2KHZ(mode->pixclock));
+
+       /* Restart the LCDIF block */
+       mxs_reset_block(&regs->hw_lcdif_ctrl_reg);
+
+       switch (bpp) {
+       case 24:
+               word_len = LCDIF_CTRL_WORD_LENGTH_24BIT;
+               bus_width = LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT;
+               valid_data = 0x7;
+               break;
+       case 18:
+               word_len = LCDIF_CTRL_WORD_LENGTH_24BIT;
+               bus_width = LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT;
+               valid_data = 0x7;
+               break;
+       case 16:
+               word_len = LCDIF_CTRL_WORD_LENGTH_16BIT;
+               bus_width = LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT;
+               valid_data = 0xf;
+               break;
+       case 8:
+               word_len = LCDIF_CTRL_WORD_LENGTH_8BIT;
+               bus_width = LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT;
+               valid_data = 0xf;
+               break;
+       }
+
+       writel(bus_width | word_len | LCDIF_CTRL_DOTCLK_MODE |
+               LCDIF_CTRL_BYPASS_COUNT | LCDIF_CTRL_LCDIF_MASTER,
+               &regs->hw_lcdif_ctrl);
+
+       writel(valid_data << LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET,
+               &regs->hw_lcdif_ctrl1);
+       writel((mode->yres << LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET) | mode->xres,
+               &regs->hw_lcdif_transfer_count);
+
+       writel(LCDIF_VDCTRL0_ENABLE_PRESENT | LCDIF_VDCTRL0_ENABLE_POL |
+               LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT |
+               LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT |
+               mode->vsync_len, &regs->hw_lcdif_vdctrl0);
+       writel(mode->upper_margin + mode->lower_margin +
+               mode->vsync_len + mode->yres,
+               &regs->hw_lcdif_vdctrl1);
+       writel((mode->hsync_len << LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET) |
+               (mode->left_margin + mode->right_margin +
+               mode->hsync_len + mode->xres),
+               &regs->hw_lcdif_vdctrl2);
+       writel(((mode->left_margin + mode->hsync_len) <<
+               LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET) |
+               (mode->upper_margin + mode->vsync_len),
+               &regs->hw_lcdif_vdctrl3);
+       writel((0 << LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET) | mode->xres,
+               &regs->hw_lcdif_vdctrl4);
+
+       writel(panel->frameAdrs, &regs->hw_lcdif_cur_buf);
+       writel(panel->frameAdrs, &regs->hw_lcdif_next_buf);
+
+       /* Flush FIFO first */
+       writel(LCDIF_CTRL1_FIFO_CLEAR, &regs->hw_lcdif_ctrl1_set);
+
+       /* Sync signals ON */
+       setbits_le32(&regs->hw_lcdif_vdctrl4, LCDIF_VDCTRL4_SYNC_SIGNALS_ON);
+
+       /* FIFO cleared */
+       writel(LCDIF_CTRL1_FIFO_CLEAR, &regs->hw_lcdif_ctrl1_clr);
+
+       /* RUN! */
+       writel(LCDIF_CTRL_RUN, &regs->hw_lcdif_ctrl_set);
+}
+
+void *video_hw_init(void)
+{
+       int bpp = -1;
+       char *penv;
+       void *fb;
+       struct ctfb_res_modes mode;
+
+       puts("Video: ");
+
+       /* Suck display configuration from "videomode" variable */
+       penv = getenv("videomode");
+       if (!penv) {
+               printf("MXSFB: 'videomode' variable not set!");
+               return NULL;
+       }
+
+       bpp = video_get_params(&mode, penv);
+
+       /* fill in Graphic device struct */
+       sprintf(panel.modeIdent, "%dx%dx%d",
+                       mode.xres, mode.yres, bpp);
+
+       panel.winSizeX = mode.xres;
+       panel.winSizeY = mode.yres;
+       panel.plnSizeX = mode.xres;
+       panel.plnSizeY = mode.yres;
+
+       switch (bpp) {
+       case 24:
+       case 18:
+               panel.gdfBytesPP = 4;
+               panel.gdfIndex = GDF_32BIT_X888RGB;
+               break;
+       case 16:
+               panel.gdfBytesPP = 2;
+               panel.gdfIndex = GDF_16BIT_565RGB;
+               break;
+       case 8:
+               panel.gdfBytesPP = 1;
+               panel.gdfIndex = GDF__8BIT_INDEX;
+               break;
+       default:
+               printf("MXSFB: Invalid BPP specified! (bpp = %i)\n", bpp);
+               return NULL;
+       }
+
+       panel.memSize = mode.xres * mode.yres * panel.gdfBytesPP;
+
+       /* Allocate framebuffer */
+       fb = malloc(panel.memSize);
+       if (!fb) {
+               printf("MXSFB: Error allocating framebuffer!\n");
+               return NULL;
+       }
+
+       /* Wipe framebuffer */
+       memset(fb, 0, panel.memSize);
+
+       panel.frameAdrs = (u32)fb;
+
+       printf("%s\n", panel.modeIdent);
+
+       /* Start framebuffer */
+       mxs_lcd_init(&panel, &mode, bpp);
+
+       return (void *)&panel;
+}
index b40ec3689b1f3b2499eaf67c60a68c50e6b79964..5e4c6853cd59c17901866a5d3ede11b24ff5ba7b 100644 (file)
@@ -248,6 +248,38 @@ vidinfo_t panel_info = {
 };
 #endif /* CONFIG_ACX517AKN */
 
+#ifdef CONFIG_ACX544AKN
+
+# define LCD_BPP       LCD_COLOR16
+
+/* you have to set lccr0 and lccr3 (including pcd) */
+# define REG_LCCR0     0x003008f9
+# define REG_LCCR3     0x04700007 /* 16bpp */
+
+vidinfo_t panel_info = {
+       .vl_col         = 320,
+       .vl_row         = 320,
+       .vl_width       = 320,
+       .vl_height      = 320,
+       .vl_clkp        = CONFIG_SYS_LOW,
+       .vl_oep         = CONFIG_SYS_LOW,
+       .vl_hsp         = CONFIG_SYS_LOW,
+       .vl_vsp         = CONFIG_SYS_LOW,
+       .vl_dp          = CONFIG_SYS_LOW,
+       .vl_bpix        = LCD_BPP,
+       .vl_lbw         = 0,
+       .vl_splt        = 0,
+       .vl_clor        = 1,
+       .vl_tft         = 1,
+       .vl_hpw         = 0x05,
+       .vl_blw         = 0x13,
+       .vl_elw         = 0x08,
+       .vl_vpw         = 0x02,
+       .vl_bfw         = 0x07,
+       .vl_efw         = 0x05,
+};
+#endif /* CONFIG_ACX544AKN */
+
 /*----------------------------------------------------------------------*/
 
 #ifdef CONFIG_LQ038J7DH53
@@ -378,7 +410,7 @@ void lcd_initcolregs (void)
 #endif /* LCD_MONOCHROME */
 
 /*----------------------------------------------------------------------*/
-void lcd_enable (void)
+__weak void lcd_enable(void)
 {
 }
 
index d57578df6c2e0ac5bdd65bbf96b6fe407e1f8efd..b9bbbc63398e9a9c17e9327bbd0d1a00b5ac5515 100644 (file)
@@ -27,7 +27,7 @@ LIB   := $(obj)libwatchdog.o
 
 COBJS-$(CONFIG_AT91SAM9_WATCHDOG) += at91sam9_wdt.o
 COBJS-$(CONFIG_FTWDT010_WATCHDOG) += ftwdt010_wdt.o
-ifneq (,$(filter $(SOC), mx31 mx35 mx5 mx6))
+ifneq (,$(filter $(SOC), mx31 mx35 mx5 mx6 vf610))
 COBJS-y += imx_watchdog.o
 endif
 COBJS-$(CONFIG_TNETV107X_WATCHDOG) += tnetv107x_wdt.o
index e466c904a7866235dae68f5e5c780085501b4e15..215dc220336add24fd14a4cfc7106c81da58a720 100644 (file)
@@ -309,7 +309,8 @@ int idma_init (void)
 
        memaddr = dpalloc (sizeof (pram_idma_t), 64);
 
-       *(volatile ushort *) &immap->im_dprambase[PROFF_IDMA2_BASE] = memaddr;
+       *(volatile u16 *)&immap->im_dprambase16
+               [PROFF_IDMA2_BASE / sizeof(u16)] = memaddr;
        piptr = (volatile pram_idma_t *) ((uint) (immap) + memaddr);
 
        piptr->pi_resv1 = 0;            /* manual says: clear it */
index 3e993cc220f09d97f85538adeee51eded9bf7076..81b7633b59cdc181cf20abd4ffb209d85d0aa37c 100644 (file)
@@ -51,11 +51,11 @@ void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
 {
        assert(rbdd->blksz == (1 << rbdd->log2blksz));
        ext4fs_block_dev_desc = rbdd;
+       get_fs()->dev_desc = rbdd;
        part_info = info;
        part_offset = info->start;
        get_fs()->total_sect = (info->size * info->blksz) >>
                get_fs()->dev_desc->log2blksz;
-       get_fs()->dev_desc = rbdd;
 }
 
 int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
index db49052b385ea0d9c46de954fc3d648869f3f526..6fcba047f968cc7b249cb6ada5eca1c89133696b 100644 (file)
@@ -70,22 +70,22 @@ int nandmtd_WriteChunkToNAND(struct yaffs_dev *dev, int chunkInNAND,
        u8 spareAsBytes[8]; /* OOB */
 
        if (data && !spare)
-               retval = mtd->write(mtd, addr, dev->data_bytes_per_chunk,
+               retval = mtd_write(mtd, addr, dev->data_bytes_per_chunk,
                                &dummy, data);
        else if (spare) {
                if (dev->param.use_nand_ecc) {
                        translate_spare2oob(spare, spareAsBytes);
-                       ops.mode = MTD_OOB_AUTO;
+                       ops.mode = MTD_OPS_AUTO_OOB;
                        ops.ooblen = 8; /* temp hack */
                } else {
-                       ops.mode = MTD_OOB_RAW;
+                       ops.mode = MTD_OPS_RAW;
                        ops.ooblen = YAFFS_BYTES_PER_SPARE;
                }
                ops.len = data ? dev->data_bytes_per_chunk : ops.ooblen;
                ops.datbuf = (u8 *)data;
                ops.ooboffs = 0;
                ops.oobbuf = spareAsBytes;
-               retval = mtd->write_oob(mtd, addr, &ops);
+               retval = mtd_write_oob(mtd, addr, &ops);
        }
 
        if (retval == 0)
@@ -106,21 +106,21 @@ int nandmtd_ReadChunkFromNAND(struct yaffs_dev *dev, int chunkInNAND, u8 *data,
        u8 spareAsBytes[8]; /* OOB */
 
        if (data && !spare)
-               retval = mtd->read(mtd, addr, dev->data_bytes_per_chunk,
+               retval = mtd_read(mtd, addr, dev->data_bytes_per_chunk,
                                &dummy, data);
        else if (spare) {
                if (dev->param.use_nand_ecc) {
-                       ops.mode = MTD_OOB_AUTO;
+                       ops.mode = MTD_OPS_AUTO_OOB;
                        ops.ooblen = 8; /* temp hack */
                } else {
-                       ops.mode = MTD_OOB_RAW;
+                       ops.mode = MTD_OPS_RAW;
                        ops.ooblen = YAFFS_BYTES_PER_SPARE;
                }
                ops.len = data ? dev->data_bytes_per_chunk : ops.ooblen;
                ops.datbuf = data;
                ops.ooboffs = 0;
                ops.oobbuf = spareAsBytes;
-               retval = mtd->read_oob(mtd, addr, &ops);
+               retval = mtd_read_oob(mtd, addr, &ops);
                if (dev->param.use_nand_ecc)
                        translate_oob2spare(spare, spareAsBytes);
        }
@@ -151,7 +151,7 @@ int nandmtd_EraseBlockInNAND(struct yaffs_dev *dev, int blockNumber)
        /* Todo finish off the ei if required */
 
 
-       retval = mtd->erase(mtd, &ei);
+       retval = mtd_erase(mtd, &ei);
 
        if (retval == 0)
                return YAFFS_OK;
index 8135bcc0fe1152a20dd8aa55e08d7154a12e5621..234cb706dfb413a1d213879e006c3ecad23b93ac 100644 (file)
@@ -77,13 +77,13 @@ int nandmtd2_write_chunk_tags(struct yaffs_dev *dev, int nand_chunk,
                yaffs_pack_tags2(&pt, tags, !dev->param.no_tags_ecc);
        }
 
-       ops.mode = MTD_OOB_AUTO;
+       ops.mode = MTD_OPS_AUTO_OOB;
        ops.ooblen = (dev->param.inband_tags) ? 0 : packed_tags_size;
        ops.len = dev->param.total_bytes_per_chunk;
        ops.ooboffs = 0;
        ops.datbuf = (u8 *) data;
        ops.oobbuf = (dev->param.inband_tags) ? NULL : packed_tags_ptr;
-       retval = mtd->write_oob(mtd, addr, &ops);
+       retval = mtd_write_oob(mtd, addr, &ops);
 
        if (retval == 0)
                return YAFFS_OK;
@@ -121,16 +121,16 @@ int nandmtd2_read_chunk_tags(struct yaffs_dev *dev, int nand_chunk,
        }
 
        if (dev->param.inband_tags || (data && !tags))
-               retval = mtd->read(mtd, addr, dev->param.total_bytes_per_chunk,
+               retval = mtd_read(mtd, addr, dev->param.total_bytes_per_chunk,
                                   &dummy, data);
        else if (tags) {
-               ops.mode = MTD_OOB_AUTO;
+               ops.mode = MTD_OPS_AUTO_OOB;
                ops.ooblen = packed_tags_size;
                ops.len = data ? dev->data_bytes_per_chunk : packed_tags_size;
                ops.ooboffs = 0;
                ops.datbuf = data;
                ops.oobbuf = local_spare;
-               retval = mtd->read_oob(mtd, addr, &ops);
+               retval = mtd_read_oob(mtd, addr, &ops);
        }
 
        if (dev->param.inband_tags) {
@@ -179,7 +179,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaffs_dev *dev, int blockNo)
                "nandmtd2_MarkNANDBlockBad %d", blockNo);
 
        retval =
-           mtd->block_markbad(mtd,
+           mtd_block_markbad(mtd,
                               blockNo * dev->param.chunks_per_block *
                               dev->data_bytes_per_chunk);
 
@@ -198,7 +198,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs_dev *dev, int blockNo,
 
        yaffs_trace(YAFFS_TRACE_MTD, "nandmtd2_QueryNANDBlock %d", blockNo);
        retval =
-           mtd->block_isbad(mtd,
+           mtd_block_isbad(mtd,
                             blockNo * dev->param.chunks_per_block *
                             dev->data_bytes_per_chunk);
 
index 7a2bece03215604e65564e2ca3185c9a48824272..6aad5ee868d2796424c417986d9527dc5bf36727 100644 (file)
 #ifndef _ALTERA_H_
 #define _ALTERA_H_
 
-/* Altera Model definitions
- *********************************************************************/
-#define CONFIG_SYS_ACEX1K              CONFIG_SYS_FPGA_DEV( 0x1 )
-#define CONFIG_SYS_CYCLON2             CONFIG_SYS_FPGA_DEV( 0x2 )
-#define CONFIG_SYS_STRATIX_II          CONFIG_SYS_FPGA_DEV( 0x4 )
-
-#define CONFIG_SYS_ALTERA_ACEX1K       (CONFIG_SYS_FPGA_ALTERA | CONFIG_SYS_ACEX1K)
-#define CONFIG_SYS_ALTERA_CYCLON2      (CONFIG_SYS_FPGA_ALTERA | CONFIG_SYS_CYCLON2)
-#define CONFIG_SYS_ALTERA_STRATIX_II   (CONFIG_SYS_FPGA_ALTERA | CONFIG_SYS_STRATIX_II)
-/* Add new models here */
-
-/* Altera Interface definitions
- *********************************************************************/
-#define CONFIG_SYS_ALTERA_IF_PS        CONFIG_SYS_FPGA_IF( 0x1 )       /* passive serial */
-#define CONFIG_SYS_ALTERA_IF_FPP       CONFIG_SYS_FPGA_IF( 0x2 )       /* fast passive parallel */
-/* Add new interfaces here */
-
 typedef enum {                         /* typedef Altera_iface */
        min_altera_iface_type,          /* insert all new types after this */
        passive_serial,                 /* serial data and external clock */
index 5416f468b06c6bb4becd6a1fc1f926df2280bd08..3e9ca1182d7e48e2a6cd63d17f5da44da7b027e7 100644 (file)
@@ -68,9 +68,6 @@ typedef struct global_data {
        unsigned long env_addr; /* Address  of Environment struct */
        unsigned long env_valid;        /* Checksum of Environment valid? */
 
-       /* TODO: is this the same as relocaddr, or something else? */
-       unsigned long dest_addr;        /* Post-relocation address of U-Boot */
-       unsigned long dest_addr_sp;
        unsigned long ram_top;  /* Top address of RAM used by U-Boot */
 
        unsigned long relocaddr;        /* Start address of U-Boot in RAM */
index c711881276bdd8dc4366095364c3d43aae2df771..31c4569c8fbf9eea2ff0731bf090358657a16f0c 100644 (file)
@@ -52,6 +52,8 @@ typedef struct atmel_mci {
        u32     ier;    /* 0x44 */
        u32     idr;    /* 0x48 */
        u32     imr;    /* 0x4c */
+       u32     reserved[43];
+       u32     version;
 } atmel_mci_t;
 
 #endif /* __ASSEMBLY__ */
index 6dc0422bac42e5960e434559c6bd1b0587be8687..ef07a87e8db33b0f9b7cca0657f0319e415b41f6 100644 (file)
@@ -37,6 +37,24 @@ enum bootstage_flags {
        BOOTSTAGEF_ALLOC        = 1 << 1,       /* Allocate an id */
 };
 
+/* bootstate sub-IDs used for kernel and ramdisk ranges */
+enum {
+       BOOTSTAGE_SUB_FORMAT,
+       BOOTSTAGE_SUB_FORMAT_OK,
+       BOOTSTAGE_SUB_NO_UNIT_NAME,
+       BOOTSTAGE_SUB_UNIT_NAME,
+       BOOTSTAGE_SUB_SUBNODE,
+
+       BOOTSTAGE_SUB_CHECK,
+       BOOTSTAGE_SUB_HASH = 5,
+       BOOTSTAGE_SUB_CHECK_ARCH = 5,
+       BOOTSTAGE_SUB_CHECK_ALL,
+       BOOTSTAGE_SUB_GET_DATA,
+       BOOTSTAGE_SUB_CHECK_ALL_OK = 7,
+       BOOTSTAGE_SUB_GET_DATA_OK,
+       BOOTSTAGE_SUB_LOAD,
+};
+
 /*
  * A list of boot stages that we know about. Each of these indicates the
  * state that we are at, and the action that we are about to perform. For
@@ -137,43 +155,24 @@ enum bootstage_id {
        BOOTSTAGE_ID_NET_DONE_ERR,
        BOOTSTAGE_ID_NET_DONE,
 
+       BOOTSTAGE_ID_FIT_FDT_START = 90,
        /*
         * Boot stages related to loading a FIT image. Some of these are a
         * bit wonky.
         */
-       BOOTSTAGE_ID_FIT_FORMAT = 100,
-       BOOTSTAGE_ID_FIT_NO_UNIT_NAME,
-       BOOTSTAGE_ID_FIT_UNIT_NAME,
-       BOOTSTAGE_ID_FIT_CONFIG,
-       BOOTSTAGE_ID_FIT_CHECK_SUBIMAGE,
-       BOOTSTAGE_ID_FIT_CHECK_HASH = 104,
-
-       BOOTSTAGE_ID_FIT_CHECK_ARCH,
-       BOOTSTAGE_ID_FIT_CHECK_KERNEL,
-       BOOTSTAGE_ID_FIT_CHECKED,
-
-       BOOTSTAGE_ID_FIT_KERNEL_INFO_ERR = 107,
-       BOOTSTAGE_ID_FIT_KERNEL_INFO,
+       BOOTSTAGE_ID_FIT_KERNEL_START = 100,
+
+       BOOTSTAGE_ID_FIT_CONFIG = 110,
        BOOTSTAGE_ID_FIT_TYPE,
+       BOOTSTAGE_ID_FIT_KERNEL_INFO,
 
        BOOTSTAGE_ID_FIT_COMPRESSION,
        BOOTSTAGE_ID_FIT_OS,
        BOOTSTAGE_ID_FIT_LOADADDR,
        BOOTSTAGE_ID_OVERWRITTEN,
 
-       BOOTSTAGE_ID_FIT_RD_FORMAT = 120,
-       BOOTSTAGE_ID_FIT_RD_FORMAT_OK,
-       BOOTSTAGE_ID_FIT_RD_NO_UNIT_NAME,
-       BOOTSTAGE_ID_FIT_RD_UNIT_NAME,
-       BOOTSTAGE_ID_FIT_RD_SUBNODE,
-
-       BOOTSTAGE_ID_FIT_RD_CHECK,
-       BOOTSTAGE_ID_FIT_RD_HASH = 125,
-       BOOTSTAGE_ID_FIT_RD_CHECK_ALL,
-       BOOTSTAGE_ID_FIT_RD_GET_DATA,
-       BOOTSTAGE_ID_FIT_RD_CHECK_ALL_OK = 127,
-       BOOTSTAGE_ID_FIT_RD_GET_DATA_OK,
-       BOOTSTAGE_ID_FIT_RD_LOAD,
+       /* Next 10 IDs used by BOOTSTAGE_SUB_... */
+       BOOTSTAGE_ID_FIT_RD_START = 120,        /* Ramdisk stages */
 
        BOOTSTAGE_ID_IDE_FIT_READ = 140,
        BOOTSTAGE_ID_IDE_FIT_READ_OK,
index e682bd8237773ccfb9ac939e530c350ca9b8c402..126891d6587ae9060e506f5992a13029e0233baa 100644 (file)
@@ -310,9 +310,6 @@ int readline_into_buffer(const char *const prompt, char *buffer,
 int    parse_line (char *, char *[]);
 void   init_cmd_timeout(void);
 void   reset_cmd_timeout(void);
-#ifdef CONFIG_MENU
-int    abortboot(int bootdelay);
-#endif
 extern char console_buffer[];
 
 /* arch/$(ARCH)/lib/board.c */
index 7ca28c83694ebf23a6c8b5e735e5031c2340d7c6..6959905efe8f1665561f699b6cd71b925577ab58 100644 (file)
@@ -127,6 +127,7 @@ typedef struct cpm_buf_desc {
 */
 #define PROFF_SCC1     ((uint)0x0000)
 #define PROFF_IIC      ((uint)0x0080)
+#define PROFF_REVNUM   ((uint)0x00b0)
 #define PROFF_SCC2     ((uint)0x0100)
 #define PROFF_SPI      ((uint)0x0180)
 #define PROFF_SCC3     ((uint)0x0200)
index 53a2f054f9488b8e3fc08fcb62f69a8fc282bbe0..d84706969d1b4117705c7bc8752be2976ca413bd 100644 (file)
@@ -40,6 +40,7 @@
 #define CONFIG_CMD_FDOS                /* Floppy DOS support           */
 #define CONFIG_CMD_FLASH       /* flinfo, erase, protect       */
 #define CONFIG_CMD_FPGA                /* FPGA configuration Support   */
+#define CONFIG_CMD_FUSE                /* Device fuse support          */
 #define CONFIG_CMD_GETTIME     /* Get time since boot         */
 #define CONFIG_CMD_HASH                /* calculate hash / digest      */
 #define CONFIG_CMD_HWFLOW      /* RTS/CTS hw flow control      */
index b85244a89ad9cfeaaf7456f8679118b09b9acc06..d506a558c0339b0c391000093fe014caaf95f7a5 100644 (file)
@@ -96,6 +96,7 @@
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 #define CONFIG_PCI_SCAN_SHOW           /* print pci devices @ startup  */
 
index 9a65cbced094cf9cd8a9da7af0767caef90668d1..1e392290d70623d3727275303fb024aa94296abf 100644 (file)
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 99944766ddedc0f19accd4916c7b8f370ea43820..7337f5374ba2f257aede2d19e50c4bf36b8feaf0 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 09aa763c11227c545ce653aed2df1419d14d4ca7..35c37731cbc669d12f456c7882f8fc2ec6831a3f 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_HOST  /* select pci host function     */
 #undef CONFIG_PCI_PNP                  /* do pci plug-and-play         */
                                        /* resource configuration       */
index b09119a2f2452913055a528092186a0eddade3e7..c15bbd856c3fb53bc1352d17728487ae1dba078c 100644 (file)
@@ -36,7 +36,6 @@
 
 /* High Level Configuration Options */
 #define CONFIG_BOOKE
-#define CONFIG_E6500
 #define CONFIG_E500                    /* BOOKE e500 family */
 #define CONFIG_E500MC                  /* BOOKE e500mc family */
 #define CONFIG_SYS_BOOK3E_HV           /* Category E.HV supported */
@@ -527,6 +526,15 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_SF_DEFAULT_SPEED         10000000
 #define CONFIG_SF_DEFAULT_MODE          0
 
+/*
+ * MAPLE
+ */
+#ifdef CONFIG_PHYS_64BIT
+#define CONFIG_SYS_MAPLE_MEM_PHYS      0xFA0000000ull
+#else
+#define CONFIG_SYS_MAPLE_MEM_PHYS      0xA0000000
+#endif
+
 /*
  * General PCI
  * Memory space is mapped 1-1, but I/O space must start from 0.
@@ -612,6 +620,7 @@ unsigned long get_board_ddr_clk(void);
 #endif
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_NET_MULTI
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play */
 #define CONFIG_E1000
@@ -623,7 +632,11 @@ unsigned long get_board_ddr_clk(void);
 #ifdef CONFIG_FMAN_ENET
 #define CONFIG_SYS_FM1_DTSEC5_PHY_ADDR 0x10
 #define CONFIG_SYS_FM1_DTSEC6_PHY_ADDR 0x11
-#define CONFIG_SYS_FM1_10GEC1_PHY_ADDR 4
+
+/*B4860 QDS AMC2PEX-2S default PHY_ADDR */
+#define CONFIG_SYS_FM1_10GEC1_PHY_ADDR 0x7      /*SLOT 1*/
+#define CONFIG_SYS_FM1_10GEC2_PHY_ADDR 0x6      /*SLOT 2*/
+
 
 #define CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR    0x1c
 #define CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR    0x1d
index 431c6869678194aafb5b2fb91678c197339823ad..9d15d0eb880f01641e6d6f0df8b9be1d2553335f 100644 (file)
@@ -73,6 +73,7 @@
 #if defined(CONFIG_PCI)
 #define CONFIG_PCIE1                   /* PCIE controler 1 (slot 1) */
 #define CONFIG_FSL_PCI_INIT            /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET          /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT           /* enable 64-bit PCI resources */
 
index 1e3a5640eb28c47f3f04ea7a199e099010b569fd..7017f8c19b1438f55cd171ace09648563bf127d5 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE  /* select pci host function     */
 #undef CONFIG_PCI_PNP                  /* do pci plug-and-play         */
                                        /* resource configuration       */
index e102c365c46d3ab8d308fac60b0e7444f64d9cad..c7904a1880b5d23b4617c7fe961c11b6cc1c2142 100644 (file)
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                     /* include pci support                  */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_SYS_EARLY_PCI_INIT
 #undef CONFIG_PCI_PNP
 #undef CONFIG_PCI_SCAN_SHOW
index 11cf58b1469221d36b2cffde58c94c4cb1a2e52c..bbd93ac502040b1f95e4daec52249e939c22add0 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index e3e5ebc53c33b37979ff248ebfd9ac1645359f80..36476e0135b6fe3c5c4ed8020ca9cb7d4fd36017 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index c4fff486d88616e88079c6b72af8a195910a29f2..4c12c85c2b2bdb2a026de407dba136aa954099ab 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 9122cbd8779ec5a27020b1a44b6c9c3d55d6c193..96b6c0ab669d8320a7237e1225414c4720e3a499 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_AUTO  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index f778af7e363874e98ad2ba815d163d1ae22e98d1..c4cc5fd7375f92503aea15c7792bb72aec388295 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 35daed05efa502117e289a8d30c10cb3692de149..78c66c76a779e38c1a3d2650c38988174a6e55a8 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_AUTO  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index aa5ce29585469801e51637c8a6cd3c4e829a48d4..3e9c21cc9ddd0d6b646444df2e70ff5ea7968ab0 100644 (file)
 #define CONFIG_CMD_I2C
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
     #define CONFIG_CMD_PCI
 #endif
 
index a3ceed17f1345bc37d3cd16467e57b9365fc0390..6632196ad90c8e8ca03b90314235ea89679ef958 100644 (file)
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                     /* include pci support                  */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index bbe271303a839f6bc15d6bdaa8c6795f8318cacd..4970ea657b7e73e1322e900e101eeefb3748377b 100644 (file)
@@ -357,6 +357,7 @@ int du440_phy_addr(int devnum);
  * PCI stuff
  */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE       0x80000000 /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE*/
index 220372ccd8ff4ee72a0d31d5f8b2d54b99bc0e83..d10f4c18a7c636a12f6edb72aa4dbea94a2871e4 100644 (file)
  * PCI stuff
  */
 #define CONFIG_PCI                                /* include pci support */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                            /* pci plug-and-play */
 #define CONFIG_PCI_HOST         PCI_HOST_AUTO
 #undef  CONFIG_PCI_SCAN_SHOW
index 08ba8404bf8c88efc639edec913c83bc669db71b..b6769ae68dc53201832176e695e1c50311478cdf 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_HOST   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 444413d8d6646545fed0227a42d66cd7d30feba2..d65377f58004aab8e039058a573eee1179bee7cf 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_HOST   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index a62ef6364b211afc8c6b529e118f083cd1ffa4a4..dbad1fd6afab4edd71491118cf1a3ffa4a2d1083 100644 (file)
@@ -93,6 +93,7 @@
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index 791763aaaf4ce9aa45e5342cbe9c527cfcac3092..2b72a33487f391cfed12d8882969e9f3c3e83199 100644 (file)
 #define CONFIG_PCI_PNP         /* Scan PCI busses                      */
 #define CONFIG_CMD_PCI         /* Enable the "pci" command             */
 #define CONFIG_FSL_PCI_INIT    /* Common FreeScale PCI initialization  */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  /* We have PCI-E reset errata           */
 #define CONFIG_SYS_PCI_64BIT   /* PCI resources are 64-bit             */
 #define CONFIG_PCI_SCAN_SHOW   /* Display PCI scan during boot         */
index e0a0d8e46bd54a906df4af8e56f84cdfc680e755..6ce789d7faba2843c74cf6916201ce72d3d40f2b 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function     */
 #undef CONFIG_PCI_PNP                  /* do pci plug-and-play         */
                                        /* resource configuration       */
index 546e28b8fae1f5403f52c4bb59ac399657985158..8d5e8ff653f64f209010f800e6adbbdd00ba7e48 100644 (file)
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI                          /* include pci support     */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                      /* do pci plug-and-play    */
 #define CONFIG_PCI_SCAN_SHOW                /* show pci devices        */
 #define CONFIG_SYS_PCI_TARGBASE      (CONFIG_SYS_PCI_MEMBASE)
index 1bc2c5a0a4abb08bc6f03e8363ba12893f2103c3..536b7556fabb35eded2f7fbf874b8a0e12b9a538 100644 (file)
 
 /* FPGA - Spartan 2 */
 /* experiment
-#define CONFIG_FPGA            CONFIG_SYS_SPARTAN3
+#define CONFIG_FPGA
 #define CONFIG_FPGA_COUNT      1
 #define CONFIG_SYS_FPGA_PROG_FEEDBACK
 #define CONFIG_SYS_FPGA_CHECK_CTRLC
index c296e3cf069ea92551c233ad918a1bca79cda6ec..2496639512126d0c0329245ba5580a02a5b33e84 100644 (file)
@@ -36,6 +36,7 @@
 #define CONFIG_SYS_TEXT_BASE   0xFC000000
 
 #define CONFIG_PCI     1
+#define CONFIG_PCI_INDIRECT_BRIDGE 1
 
 #define        CONFIG_MASK_AER_AO
 #define CONFIG_DISPLAY_AER_FULL
  * FPGA
  */
 #define CONFIG_FPGA_COUNT      1
-#define CONFIG_FPGA            CONFIG_SYS_ALTERA_CYCLON2
+#define CONFIG_FPGA
 #define CONFIG_FPGA_ALTERA
 #define CONFIG_FPGA_CYCLON2
 
index 286f8690a82a4f91ae084c151435c48c47a67a67..d1ef559cf4701e1a47448c6c11b092be667242b4 100644 (file)
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI                          /* include pci support     */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                      /* do pci plug-and-play    */
 #define CONFIG_PCI_SCAN_SHOW                /* show pci devices        */
 #define CONFIG_SYS_PCI_TARGBASE      (CONFIG_SYS_PCI_MEMBASE)
index 979495a72c2bfb9a6e66a5c393672daca9539f2e..0d023ab9fbe29d566d1824f16f7dc81ca7871210 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* configure as pci-host        */
 #define CONFIG_PCI_PNP                 /* pci plug-and-play            */
                                        /* resource configuration       */
index 1391ce517dc1a37e332b47e4c1e48aaf37939650..b3dbd6fae5e2a4cfaa30944715d0585ce4d1620a 100644 (file)
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                     /* include pci support                  */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index c4c41c77deb0d72bc2a052e3eb3c3973cfcdc331..c312b7781dd7ba73196c2e6c309453f74aeb6547 100644 (file)
 /*PCI*/
 #if CONFIG_ADSTYPE >= CONFIG_SYS_PQ2FADS
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP
 #define CONFIG_PCI_BOOTDELAY 0
 #define CONFIG_PCI_SCAN_SHOW
index 0474140fb38b490ad3d3a1d60dac0f71f152203c..c5aa58650ea64f16daf562c4efbe037b5f40213e 100644 (file)
 
 /* PCI */
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP
 #define CONFIG_PCI_BOOTDELAY 0
 #undef CONFIG_PCI_SCAN_SHOW
index 95a1885ace176aab67deaa79d9eea58547ddc3fc..f10555ce01797fa0852c6ab76dfaf236b6303df6 100644 (file)
 #define CONFIG_SYS_SCCR_PCIEXP1CM      1
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCIE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
index c28dfe0068ebec732937e618886746362292d93a..1d753e76b9a966bef01cf54af070f5e5119456f7 100644 (file)
@@ -76,6 +76,7 @@
 #endif
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_FSL_ELBC 1
 
 #define CONFIG_MISC_INIT_R
index 767b9763e41bc2618c42e98ac09078eccf5b08cf..ee806c4403302ec9ea541565510dd52d73d74e90 100644 (file)
 #define CONFIG_SYS_PCIE2_IO_SIZE       0x00800000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCIE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
index 8d5ed0f7aba8bc44d557c309c5071efaddeed63d..ac4c253968d3cc5994324cfcd5798d047acbad66 100644 (file)
 #define CONFIG_SYS_PCI1_IO_SIZE                0x04000000      /* 64M */
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_SKIP_HOST_BRIDGE
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
 
index f592d3a3a46426b756a9692f44add04ba4f83739..7c31f47953bd0c05497df7f37aa8be65cb6b6db8 100644 (file)
 
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
 #define CONFIG_83XX_PCI_STREAMING
index e5529c70070b06662185bff8aed20e3479e8e823..212089c238e991e295fcbcc3c9f6b0287c66f1d9 100644 (file)
 
 /* PCI @ 0x80000000 */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_IBAT1L      (CONFIG_SYS_PCI1_MEM_BASE \
                                | BATL_PP_RW \
                                | BATL_MEMCOHERENCE)
index 2c3f1f62a64f00bfbbf501e4cbb22defb90602a0..1130b59a217ac2f967bbe84a7d6850add5d21101 100644 (file)
@@ -393,6 +393,7 @@ boards, we say we have two, but don't display a message if we find only one. */
  * PCI
  */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_MPC83XX_PCI2
 
index a1fbd5e4a4b4bc8367470b96ddd5e48866c32ac9..a71ac2bd359ee903c51ac6a216e61a314b80e484 100644 (file)
 
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
 #define CONFIG_83XX_PCI_STREAMING
index fc0095281afecc52d85952525c7174ee8c7ccde4..fcca5424e385a0595a4a332b702f4f9965daafb0 100644 (file)
 #define CONFIG_SYS_PCI1_IO_SIZE                0x100000 /* 1M */
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
 
index 82436618bea84d741e69765b4cd3cc07a9e1f304..480468f2d7cdb47ed80240e6548b675d9d790e64 100644 (file)
 #define CONFIG_SYS_PCIE2_IO_SIZE       0x00800000
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #ifndef __ASSEMBLY__
 extern int board_pci_host_broken(void);
 #endif
index 9ad7e3a90ff293b8d651c28dacdf0d07aa8124b4..d5c9d059ebdf9b2ec24c322376995cc14aee6e0e 100644 (file)
 #define CONFIG_SYS_PCIE2_IO_SIZE       0x00800000
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
 
 #undef CONFIG_PCI_SCAN_SHOW    /* show pci devices on startup */
index bcd77b608f3782f1b013a7865398d9a4b76997b9..cc2b7c332b780849667188c9b9e6b3f3529b7e14 100644 (file)
@@ -84,6 +84,7 @@
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           1       /* PCIE controler 3 (ULI bridge) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 
index a0fe15e86e600b1f8f0d796eac23314ebea56589..6cb00ee664689e3b123c289869508e0491acd499 100644 (file)
@@ -52,6 +52,7 @@
 #endif
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
index a6bea153d7ed9ab6656d900ff77a4805d9c9fe09..d0e6ca65bfcd42bffbd1f3c38ea73706cb23c8b6 100644 (file)
@@ -40,6 +40,7 @@
 #define        CONFIG_SYS_TEXT_BASE    0xfff80000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
index d5f3c5f56f293404b4027dd63b661f142afa5ba3..09d0835c619c2e357c0a2b92550d2d731e82f10d 100644 (file)
@@ -44,6 +44,7 @@
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           1       /* PCIE controler 3 (ULI bridge) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 
index 0e22cc7e14df46432e01900d1f64d40089f2f785..d070f6adc3e176844bd2fb292b1ba87df6f86f3b 100644 (file)
@@ -52,6 +52,7 @@
 #define CONFIG_PCIE1           /* PCIE controler 1 (slot 1) */
 #undef CONFIG_PCI2
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 
index 266cb54c923f9cc6d49b16fa553252a3dbfd8ef9..483556b31b1ed448f721fdc7607d48c0b72ec8cb 100644 (file)
@@ -40,6 +40,7 @@
 #define        CONFIG_SYS_TEXT_BASE    0xfff80000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
index 35d15f4271f62f14ca01ea2173e9fb9caf4427ae..525e88fa1b684a4f9458ccc333865fbe163a63af 100644 (file)
@@ -49,6 +49,7 @@
 #define        CONFIG_SYS_TEXT_BASE    0xfff80000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #undef CONFIG_ETHER_ON_FCC             /* cpm FCC ethernet support */
index 5d69fb66d98016e054e465b5f8424a260b71a7b5..f1bfdcbd2cfbcceb6555fca27f4535074a384378 100644 (file)
@@ -42,6 +42,7 @@
 #define CONFIG_PCI1            1       /* PCI controller */
 #define CONFIG_PCIE1           1       /* PCIE controller */
 #define CONFIG_FSL_PCI_INIT    1       /* use common fsl pci init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
index acd3276e9826e30e14767c9f6b7be0ac7ea20907..c54755fab8da4e6826fc37f46e135d1abb17b1e4 100644 (file)
@@ -41,6 +41,7 @@
 #define CONFIG_PCI             1       /* Disable PCI/PCIE */
 #define CONFIG_PCIE1           1       /* PCIE controller */
 #define CONFIG_FSL_PCI_INIT    1       /* use common fsl pci init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_QE                      /* Enable QE */
index d233365b7d0e5dc9cff1162b11474e84c52b759b..25303c4f65df8fdcbafa7abe35c1f2186499378b 100644 (file)
@@ -71,6 +71,7 @@
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           1       /* PCIE controler 3 (ULI bridge) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 
index c61982745fe9d545435d5959d694fa24dbfb4ee9..f791e7682e4a7e9661c70a8dd9267ee210a0afb1 100644 (file)
@@ -51,6 +51,7 @@
 #define CONFIG_PCIE1           1       /* PCIe 1 connected to ULI bridge */
 #define CONFIG_PCIE2           1       /* PCIe 2 connected to slot */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
 
index 264309772a9b8890ae9fde42b5ba8bea69e0555f..4a3ca017e8377f653e5fa8d7d0b55889257d1017 100644 (file)
@@ -510,6 +510,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
  * BAT2                Rapidio Memory
  */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_DBAT2L      (BAT_PHYS_ADDR(CONFIG_SYS_PCIE1_MEM_PHYS_LOW, \
                                               CONFIG_SYS_PCIE1_MEM_PHYS_HIGH) \
                                 | BATL_PP_RW | BATL_CACHEINHIBIT \
index 84a167d2a7196cd08e89af9a0be2b761f41d2346..8b0415158a745f8248f6552bf9c7ebde2cb90c73 100644 (file)
@@ -87,6 +87,7 @@
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index 6850965fb38eb684064f36e04eceb87d127174c8..72714688eba0f00c4b3c5175f27238cd4164935a 100644 (file)
 
 #undef FPGA_DEBUG
 #undef CONFIG_SYS_FPGA_PROG_FEEDBACK
-#define CONFIG_FPGA            CONFIG_SYS_ALTERA_CYCLON2
+#define CONFIG_FPGA
 #define CONFIG_FPGA_ALTERA     1
 #define CONFIG_FPGA_CYCLON2    1
 #define CONFIG_FPGA_COUNT      1
index a99ad3c44b9e5c64534f0720665de5ff119c1164..afd4c0356dd6136c3f52ec36b1a93ab636061ccc 100644 (file)
@@ -42,6 +42,7 @@
 #define CONFIG_SYS_IMMR                0xE0000000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_SKIP_HOST_BRIDGE
 #define CONFIG_HARD_I2C
 #define CONFIG_TSEC_ENET
        ""
 
 #define CONFIG_FPGA_COUNT      1
-#define CONFIG_FPGA            CONFIG_SYS_ALTERA_CYCLON2
+#define CONFIG_FPGA
 #define CONFIG_FPGA_ALTERA
 #define CONFIG_FPGA_CYCLON2
 
index 52d172925b5fc88134d561b66b9c2ea48142a080..21f286e0fb5c5e5050ca2ed2fc4f26ea8a375b3f 100644 (file)
  */
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP
 #define CONFIG_PCI_SCAN_SHOW
 
index bf2f44ec6e9915b4709645086e509f7a9278d20c..5d2ff1480542aa2a2abf4d93edf687cb8375c5a5 100644 (file)
 
 #undef FPGA_DEBUG
 #undef CONFIG_SYS_FPGA_PROG_FEEDBACK
-#define CONFIG_FPGA            CONFIG_SYS_XILINX_SPARTAN2
+#define CONFIG_FPGA
 #define CONFIG_FPGA_XILINX     1
 #define CONFIG_FPGA_SPARTAN2   1
 #define CONFIG_FPGA_COUNT      1
index 47110aff246d63d518d57ae188b83601931469d2..4a934176550fa7b4918ddb8a55713abdfb8d6050 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_AUTO  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 9f754c2a81e56519a0e9b48c91cd07cd22c0cdbb..cd1f4254ad5936ac828e814b8a0b4bb6138fc7e0 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_ADAPTER /* select pci adapter         */
 #undef CONFIG_PCI_PNP                  /* no pci plug-and-play         */
                                        /* resource configuration       */
index 437ee6ee6b934c10e09e4dfd8c86285eaee23cec..51855979050cb7ab5c04024c184e843970770418 100644 (file)
@@ -90,6 +90,7 @@
 #define CONFIG_PCIE1                   /* PCIE controler 1 (slot 1) */
 #define CONFIG_PCIE2                   /* PCIE controler 2 (slot 2) */
 #define CONFIG_FSL_PCI_INIT            /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET          /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT           /* enable 64-bit PCI resources */
 
index 8b13b107e28091ebc1c6230fa8f1695dc44aa6b0..9c27182dc7152b1febb5360e51b70b12849c979b 100644 (file)
 #define CONFIG_SYS_HUSH_PARSER
 
 /* Video */
-#define CONFIG_FSL_DIU_FB
 
 #ifdef CONFIG_FSL_DIU_FB
 #define CONFIG_SYS_DIU_ADDR    (CONFIG_SYS_CCSRBAR + 0x10000)
 #endif
 
 #ifndef CONFIG_FSL_DIU_FB
-#define CONFIG_ATI
 #endif
 
 #ifdef CONFIG_ATI
 #define CONFIG_SYS_PCIE3_IO_SIZE       0x00010000      /* 64k */
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
 #define CONFIG_E1000                   /* Define e1000 pci Ethernet card */
index 878bd5fa5e6e9b7627be2466fefd8b1e560b491b..4943d7c8fe95e8d372c0a3cf06d17d86bc906b8e 100644 (file)
@@ -73,6 +73,7 @@
 #define CONFIG_PCIE2           /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           /* PCIE controler 3 (slot 3) */
 #define CONFIG_FSL_PCI_INIT    /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   /* enable 64-bit PCI resources */
 #define CONFIG_FSL_LAW         /* Use common FSL init code */
index a57d9dd26ec37124a652d4d8133dd07d400e3488..6ce4cbef9c5b4631b14224c8e3272fd51e769bd8 100644 (file)
@@ -94,6 +94,7 @@
 #define CONFIG_PCIE1           1       /* PCIE controler 1 (slot 1) */
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #endif /* #if defined(CONFIG_PCI) */
index c75f86cb8445dd76af3a5b0d5779ac84544cb36d..05a75d8a7633841b2a876c7c7f5e50e2a4e0acac 100644 (file)
@@ -58,6 +58,7 @@
 #define CONFIG_PCIE3           1       /* PCIE controller 3 (slot 3) */
 
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #endif /* #if defined(CONFIG_PCI) */
index a975ee10edb30cd6ac4788953532a8d8aa7a3f22..229117c18d58298bc7db48d38b1e5f645c4fed03 100644 (file)
@@ -73,6 +73,7 @@
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           1       /* PCIE controler 3 (ULI bridge) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 
index bbc53ceafd22ff5093dd5b52089eba5f3f237e4c..9cd3a7cb34d7118233422a6f6425d11457298556 100644 (file)
@@ -560,6 +560,7 @@ unsigned long get_board_sys_clk(unsigned long dummy);
 #endif
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play */
 #define CONFIG_E1000
 
index 119819e3716f48a3bf32d0427e61f32b841822f5..c3cacefed8cf7dc7e4829dd68d42dcf9d3822542 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_ADAPTER /* select pci host function   */
 #undef CONFIG_PCI_PNP                  /* no pci plug-and-play         */
                                        /* resource configuration       */
index 713ea12ee56deeed42442020a21e372cb5b4245a..3757af07a003a4862d1f3d9f1202377b236d93d8 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* configure as pci-host        */
 #define CONFIG_PCI_PNP                 /* pci plug-and-play            */
                                        /* resource configuration       */
index 1ee0c48fa198848edbbb8e141ddd26e7434956f9..1745eb39fc89c92bce69c6dde3a7be17ecf960f6 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_FORCE  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index fbcf8e5e227af8bb2b9151a1ea833ca4719bd43a..faadfe43c155d2d98fe0fe7cba915886b77c3ae7 100644 (file)
 #define CONFIG_CMD_SNTP
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_CMD_PCI
 #endif
 
index c37aafdd47a2c3e19126272965ce2deca8a72c09..f563fbe3357c09b0595556d977d438ae10cbb284 100644 (file)
 #define CONFIG_CMD_SNTP
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_CMD_PCI
 #endif
 
index 8235b857d39f648c3ad2d5cebf6e273ae83864ee..d97acecc441a4777dc0ff9b40fe04a496f7f94f1 100644 (file)
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 992443a8e2f6b104e5fb70ae4bf477c98a9ca495..a4275512816b5aeaf89bf297da46712f4623cfc2 100644 (file)
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
 
 #define CONFIG_PCI             /* include pci support                  */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_AUTO  /* select pci host function      */
 #define CONFIG_PCI_PNP         /* do (not) pci plug-and-play           */
 
index 3837b8f1391a232ba222eaec02e76bf4ebe224e3..40c18274f9d61e6a45c9c9c29879794a06750384 100644 (file)
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP         /* do (not) pci plug-and-play   */
 #define CONFIG_SYS_PCI_CACHE_LINE_SIZE 0       /* to avoid problems with PNP   */
 #define CONFIG_PCI_SCAN_SHOW   /* show pci devices on startup  */
index 93876b13173fd8b3928ec9124ae2029728465d27..e2f96aa4ac018072edf7556ef0cbe29064c88f7d 100644 (file)
  * PCI stuff
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                         /* we need Plug 'n Play         */
 #if 0
 #define CONFIG_PCI_SCAN_SHOW                   /* show PCI auto-scan at boot   */
index 27a12b310be991aa189d057d247b7f39ee7eda89..210bc30ca893580080b38794904f7e171076bdd3 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE  /* select pci host function     */
 #undef CONFIG_PCI_PNP                  /* do pci plug-and-play         */
                                        /* resource configuration       */
index c0ffb33129d6bad831b6cb6a7297e709765f129e..318c4c5d51cf65ff6c5ca8ed88d37c400aa35106 100644 (file)
@@ -52,6 +52,7 @@
 #endif
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_FSL_ELBC                        1
 
 #define CONFIG_MISC_INIT_R
index f54fcb33e57f0aacb490b966f14fc82ce6018163..fa456ed79f98693d75f33d8a6f733970888c946d 100644 (file)
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index 84e4891dc9ac19c226d5cf61138975c2a8f8c7e2..cdc51a501669fc33ad35d6af47fc2dd0ad062552 100644 (file)
@@ -95,6 +95,7 @@
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index be977f1d76ea64946c0c294f4bc1c64b33c34bdd..3b3f9e63026ac355984a989d8fe1ff5d62e1fdfe 100644 (file)
 
 #define        CONFIG_PCI
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_BOARD_EARLY_INIT_F 1    /* Call board_early_init_f      */
 #define CONFIG_PCI_PNP
 #define CONFIG_EEPRO100
index 07384234c95deb2428bd6498927bf1a76b5c1a32..966a6e3da9970b863574f2041748959992ea3bb4 100644 (file)
 
 /* PCI */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_IBAT3L      (CONFIG_SYS_PCI1_MEM_BASE \
                                | BATL_PP_RW \
                                | BATL_MEMCOHERENCE)
index f1032f0f3ffc26387f5fac36b94e27562438823d..8f0c4b624170659cbb192bbc219d39421ed69ee9 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_HOST   /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 462b155a301131193eddbbf85d8dcd41631d7008..710812fc9f3313f9b9dd6a7f655095021b01a447 100644 (file)
 
 
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST                PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                         /* pci plug-and-play            */
 /* resource configuration      */
index f28f3e4f9a2aa32351037f7484ef88742a44befa..f88dfe4cde68319f5eef5728fb3a135b4a1e675b 100644 (file)
 #define PCI_HOST_AUTO          2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST                PCI_HOST_AUTO   /* select pci host function     */
 #define CONFIG_PCI_PNP                         /* pci plug-and-play            */
 /* resource configuration      */
index 5def36ad0c50d17b5024d89a5d7d472a7fd80203..0c78acac80666d7f5fc7f79cc340f2e2c3c5b0ad 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_HOST  /* select pci host function     */
 #undef CONFIG_PCI_PNP                  /* do pci plug-and-play         */
                                        /* resource configuration       */
index ac7e87738817439570b5cc0f9d0bc436f6942af7..7cb10fb01e01da0e0ca35a7c22e4d776d4b2e1d9 100644 (file)
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_SYS_I2C_SLAVE           0x7F
 
+/*
+ * IIM - IC Identification Module
+ */
+#undef CONFIG_FSL_IIM
+
 /*
  * EEPROM configuration for Atmel AT24C01:
  * 8-bit addresses, 30ms write delay, 32-Byte Page Write Mode
index eea44db356045ef6835c4e22db36978dacf0036c..a6e184961fcc953887184c994fd76fb23c48f043 100644 (file)
  */
 #define CONFIG_PCI
 #define CONFIG_FTPCI100
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_FTPCI100_MEM_BASE        0xa0000000
 #define CONFIG_FTPCI100_IO_SIZE         FTPCI100_BASE_IO_SIZE(256) /* 256M */
 #define CONFIG_FTPCI100_MEM_SIZE        FTPCI100_MEM_SIZE(128)  /* 128M */
index 0d53e51b9d5568471eeba37779ede66258e03ce7..d93d5e204f1155aa9b53824e88f74c794c945c1a 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE    0x80000000  /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE */
index ef00306a55ef09d8ecc78a7ca3dcdc4ad7d1bd3d..737e19ee6fec2761dc8fbb738c039655536f2d74 100644 (file)
@@ -17,6 +17,7 @@
 #define __CONFIG_AM335X_EVM_H
 
 #define CONFIG_AM33XX
+#define CONFIG_OMAP
 
 #include <asm/arch/omap.h>
 
                                        + (8 * 1024 * 1024))
 
 #define CONFIG_SYS_LOAD_ADDR           0x81000000 /* Default load address */
-#define CONFIG_SYS_HZ                  1000 /* 1ms clock */
 
 #define CONFIG_MMC
 #define CONFIG_GENERIC_MMC
  /* Platform/Board specific defs */
 #define CONFIG_SYS_TIMERBASE           0x48040000      /* Use Timer2 */
 #define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
-#define CONFIG_SYS_HZ                  1000
+#define CONFIG_SYS_HZ                  1000    /* 1ms clock */
 
 /* NS16550 Configuration */
 #define CONFIG_SYS_NS16550
 #define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SERIAL_MULTI
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
 #define CONFIG_SYS_NS16550_CLK         (48000000)
 #define CONFIG_SYS_NS16550_COM1                0x44e09000      /* Base EVM has UART0 */
 #define CONFIG_SYS_BAUDRATE_TABLE      { 110, 300, 600, 1200, 2400, \
 4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 }
 
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
+
 #define CONFIG_ENV_OVERWRITE           1
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* Defines for SPL */
 #define CONFIG_SPL
 #define CONFIG_SPL_FRAMEWORK
+/*
+ * Place the image at the start of the ROM defined image space.
+ * We limit our size to the ROM-defined downloaded image area, and use the
+ * rest of the space for stack.
+ */
 #define CONFIG_SPL_TEXT_BASE           0x402F0400
-#define CONFIG_SPL_MAX_SIZE            (101 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (0x4030C000 - CONFIG_SPL_TEXT_BASE)
 #define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
 
-#define CONFIG_SPL_BSS_START_ADDR      0x80000000
+#define CONFIG_SPL_OS_BOOT
+
+#define CONFIG_SPL_BSS_START_ADDR      0x80a00000
 #define CONFIG_SPL_BSS_MAX_SIZE                0x80000         /* 512 KB */
 
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300 /* address 0x60000 */
 #define CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS     0x200 /* 256 KB */
 #define CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION   1
 #define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME       "u-boot.img"
+
+#ifdef CONFIG_SPL_OS_BOOT
+/* fat */
+#define CONFIG_SPL_FAT_LOAD_KERNEL_NAME                "uImage"
+#define CONFIG_SPL_FAT_LOAD_ARGS_NAME          "args"
+#define CONFIG_SYS_SPL_ARGS_ADDR               (PHYS_DRAM_1 + 0x100)
+
+/* raw mmc */
+#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR        0x500 /* address 0xa0000 */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR  0x8   /* address 0x1000 */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 8     /* 4KB */
+
+/* nand */
+#define CONFIG_CMD_SPL_NAND_OFS                        0x240000 /* end of u-boot */
+#define CONFIG_SYS_NAND_SPL_KERNEL_OFFS                0x280000
+#define CONFIG_CMD_SPL_WRITE_SIZE              0x1000
+
+/* spl export command */
+#define CONFIG_CMD_SPL
+#endif
+
 #define CONFIG_SPL_MMC_SUPPORT
 #define CONFIG_SPL_FAT_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       14
 
-#define CONFIG_SYS_NAND_ECCSTEPS       4
-#define        CONFIG_SYS_NAND_ECCTOTAL        (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
-
-#define        CONFIG_SYS_NAND_U_BOOT_START    CONFIG_SYS_TEXT_BASE
+#define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
 
  * other needs.
  */
 #define CONFIG_SYS_TEXT_BASE           0x80800000
-#define CONFIG_SYS_SPL_MALLOC_START    0x80208000
+#define CONFIG_SYS_SPL_MALLOC_START    0x80a08000
 #define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
 
 /* Since SPL did pll and ddr initialization for us,
 #define MTDPARTS_DEFAULT               "mtdparts=omap2-nand.0:128k(SPL)," \
                                        "128k(SPL.backup1)," \
                                        "128k(SPL.backup2)," \
-                                       "128k(SPL.backup3),1920k(u-boot)," \
+                                       "128k(SPL.backup3),1792k(u-boot)," \
+                                       "128k(u-boot-spl-os)," \
                                        "128k(u-boot-env),5m(kernel),-(rootfs)"
 #define CONFIG_NAND_OMAP_GPMC
 #define GPMC_NAND_ECC_LP_x16_LAYOUT    1
index b4253996a01b0add87b9eaa5d391e3f0ce7948ee..bd810538750b03df7524f76bcb0c1763e8798689 100644 (file)
  * PCI
  */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_SYS_PCI_MEM_BASE                0xA0000000
 #define CONFIG_SYS_PCI_MEM_PHYS                CONFIG_SYS_PCI_MEM_BASE
 /*
  * IIM - IC Identification Module
  */
-#undef CONFIG_IIM
+#undef CONFIG_FSL_IIM
 
 /*
  * EEPROM configuration for Atmel AT24C32A-10TQ-2.7:
index ebcc69afa3e6c0fa18074e0c4d1c58ca0e1b9bff..43289446b1fd7377c9fe6ac651108fefdcfad19a 100644 (file)
 #define CONFIG_CMD_PING                1
 #define CONFIG_CMD_DHCP                1
 #define CONFIG_CMD_NAND                1
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_FAT
 #define CONFIG_CMD_USB         1
 
 /*
        (ATMEL_BASE_SRAM1 + 0x1000 - GENERATED_GBL_DATA_SIZE)
 #endif
 
+/*
+ * The (arm)linux board id set by generic code depending on configured board
+ * (see boards.cfg for different boards)
+ */
+#ifdef CONFIG_AT91SAM9G20
+       /* the sam9g20 variants have two different board ids */
+# ifdef CONFIG_AT91SAM9G20EK_2MMC
+       /* we may be setup for the 2MMC variant of at91sam9g20ek */
+#  define CONFIG_MACH_TYPE MACH_TYPE_AT91SAM9G20EK_2MMC
+# else
+       /* or the normal at91sam9g20ek */
+#  define CONFIG_MACH_TYPE MACH_TYPE_AT91SAM9G20EK
+# endif
+#else
+       /* otherwise default to good old at91sam9260ek */
+# define CONFIG_MACH_TYPE MACH_TYPE_AT91SAM9260EK
+#endif
+
 /* DataFlash */
 #ifndef CONFIG_AT91SAM9G20EK_2MMC
 #define CONFIG_ATMEL_DATAFLASH_SPI
 #define CONFIG_SYS_NAND_READY_PIN      AT91_PIN_PC13
 #endif
 
+/* MMC */
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_GENERIC_ATMEL_MCI
+#endif
+
+/* FAT */
+#ifdef CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
 /* NOR flash - no real flash on this board */
 #define CONFIG_SYS_NO_FLASH                    1
 
 /* USB */
 #define CONFIG_USB_ATMEL
 #define CONFIG_USB_OHCI_NEW            1
-#define CONFIG_DOS_PARTITION           1
 #define CONFIG_SYS_USB_OHCI_CPU_INIT           1
 #define CONFIG_SYS_USB_OHCI_REGS_BASE          0x00500000      /* AT91SAM9260_UHP_BASE */
 #define CONFIG_SYS_USB_OHCI_SLOT_NAME          "at91sam9260"
 #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS     2
 #define CONFIG_USB_STORAGE             1
-#define CONFIG_CMD_FAT                 1
 
 #define CONFIG_SYS_LOAD_ADDR                   0x22000000      /* load address */
 
                                "mtdparts=atmel_nand:-(root) "          \
                                "rw rootfstype=jffs2"
 
-#else /* CONFIG_SYS_USE_NANDFLASH */
+#elif defined(CONFIG_SYS_USE_NANDFLASH)
 
 /* bootstrap + u-boot + env + linux in nandflash */
 #define CONFIG_ENV_IS_IN_NAND  1
        "512k(dtb),6M(kernel)ro,-(rootfs) "                             \
        "root=/dev/mtdblock7 rw rootfstype=jffs2"
 
+#else  /* CONFIG_SYS_USE_MMC */
+/* bootstrap + u-boot + env + linux in mmc */
+#define CONFIG_ENV_IS_IN_MMC
+/* For FAT system, most cases it should be in the reserved sector */
+#define CONFIG_ENV_OFFSET              0x2000
+#define CONFIG_ENV_SIZE                        0x1000
+#define CONFIG_SYS_MMC_ENV_DEV         0
+
+#define CONFIG_BOOTCOMMAND                                             \
+       "fatload mmc 0:1 0x22000000 uImage; bootm"
+#define CONFIG_BOOTARGS                                                        \
+       "console=ttyS0,115200 earlyprintk "                             \
+       "mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,"          \
+       "256k(env),256k(env_redundant),256k(spare),"                    \
+       "512k(dtb),6M(kernel)ro,-(rootfs) "                             \
+       "root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait"
 #endif
 
 #define CONFIG_SYS_PROMPT              "U-Boot> "
diff --git a/include/configs/at91sam9n12ek.h b/include/configs/at91sam9n12ek.h
new file mode 100644 (file)
index 0000000..8d2673d
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * (C) Copyright 2013 Atmel Corporation.
+ * Josh Wu <josh.wu@atmel.com>
+ *
+ * Configuation settings for the AT91SAM9N12-EK boards.
+ *
+ * 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 __AT91SAM9N12_CONFIG_H_
+#define __AT91SAM9N12_CONFIG_H_
+
+/*
+ * SoC must be defined first, before hardware.h is included.
+ * In this case SoC is defined in boards.cfg.
+ */
+#include <asm/hardware.h>
+
+#define CONFIG_SYS_TEXT_BASE           0x26f00000
+
+#define CONFIG_ARM926EJS
+#define CONFIG_AT91FAMILY
+
+/* ARM asynchronous clock */
+#define CONFIG_SYS_AT91_SLOW_CLOCK     32768           /* slow clock xtal */
+#define CONFIG_SYS_AT91_MAIN_CLOCK     16000000        /* main clock xtal */
+#define CONFIG_SYS_HZ                  1000
+
+/* Misc CPU related */
+#define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_DISPLAY_CPUINFO
+
+#define CONFIG_OF_LIBFDT
+
+/* general purpose I/O */
+#define CONFIG_AT91_GPIO
+
+/* serial console */
+#define CONFIG_ATMEL_USART
+#define CONFIG_USART_BASE              ATMEL_BASE_DBGU
+#define CONFIG_USART_ID                        ATMEL_ID_SYS
+#define CONFIG_BAUDRATE                        115200
+
+/* LCD */
+#define CONFIG_LCD
+#define LCD_BPP                                LCD_COLOR16
+#define LCD_OUTPUT_BPP                 24
+#define CONFIG_LCD_LOGO
+#define CONFIG_LCD_INFO
+#define CONFIG_LCD_INFO_BELOW_LOGO
+#define CONFIG_SYS_WHITE_ON_BLACK
+#define CONFIG_ATMEL_HLCD
+#define CONFIG_ATMEL_LCD_RGB565
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+
+#define CONFIG_BOOTDELAY               3
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_BOOTFILESIZE
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_HOSTNAME
+
+/* NOR flash - no real flash on this board */
+#define CONFIG_SYS_NO_FLASH
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+#undef CONFIG_CMD_FPGA
+
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_SF
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_FAT
+
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_SDRAM_BASE          0x20000000
+#define CONFIG_SYS_SDRAM_SIZE          0x08000000
+
+/*
+ * Initial stack pointer: 4k - GENERATED_GBL_DATA_SIZE in internal SRAM,
+ * leaving the correct space for initial global data structure above
+ * that address while providing maximum stack area below.
+ */
+# define CONFIG_SYS_INIT_SP_ADDR \
+       (ATMEL_BASE_SRAM + 0x1000 - GENERATED_GBL_DATA_SIZE)
+
+/* DataFlash */
+#ifdef CONFIG_CMD_SF
+#define CONFIG_ATMEL_SPI
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_ATMEL
+#define CONFIG_SF_DEFAULT_SPEED                30000000
+#define CONFIG_ENV_SPI_MODE            SPI_MODE_3
+#define CONFIG_SF_DEFAULT_MODE         SPI_MODE_3
+#endif
+
+/* NAND flash */
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_NAND_ATMEL
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           0x40000000
+#define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
+#define CONFIG_SYS_NAND_MASK_CLE       (1 << 22)
+#define CONFIG_SYS_NAND_ENABLE_PIN     AT91_PIO_PORTD, 4
+#define CONFIG_SYS_NAND_READY_PIN      AT91_PIO_PORTD, 5
+
+/* PMECC & PMERRLOC */
+#define CONFIG_ATMEL_NAND_HWECC
+#define CONFIG_ATMEL_NAND_HW_PMECC
+#define CONFIG_PMECC_CAP               2
+#define CONFIG_PMECC_SECTOR_SIZE       512
+#define CONFIG_PMECC_INDEX_TABLE_OFFSET        0x8000
+#endif
+
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_MTD_DEVICE
+#define CONFIG_CMD_MTDPARTS
+#define MTDIDS_DEFAULT                 "nand0=atmel_nand"
+#define MTDPARTS_DEFAULT                                               \
+       "mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,"          \
+       "256k(env),256k(env_redundant),256k(spare),"                    \
+       "512k(dtb),6M(kernel)ro,-(rootfs)"
+
+#define CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "console=console=ttyS0,115200\0"                                \
+       "mtdparts="MTDPARTS_DEFAULT"\0"                                 \
+       "bootargs_nand=rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs rw\0"\
+       "bootargs_mmc=root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait\0"
+
+/* MMC */
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_GENERIC_ATMEL_MCI
+#endif
+
+/* FAT */
+#ifdef CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
+#define CONFIG_SYS_LOAD_ADDR           0x22000000 /* load address */
+
+#define CONFIG_SYS_MEMTEST_START       CONFIG_SYS_SDRAM_BASE
+#define CONFIG_SYS_MEMTEST_END         0x26e00000
+
+#ifdef CONFIG_SYS_USE_SPIFLASH
+
+/* bootstrap + u-boot + env + linux in dataflash on CS0 */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET              0x5000
+#define CONFIG_ENV_SIZE                        0x3000
+#define CONFIG_ENV_SECT_SIZE           0x1000
+#define CONFIG_BOOTCOMMAND                                             \
+       "setenv bootargs ${console} ${mtdparts} ${bootargs_nand};"      \
+       "sf probe 0; sf read 0x22000000 0x100000 0x300000; "            \
+       "bootm 0x22000000"
+
+#elif defined(CONFIG_SYS_USE_NANDFLASH)
+
+/* bootstrap + u-boot + env + linux in nandflash */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              0xc0000
+#define CONFIG_ENV_OFFSET_REDUND       0x100000
+#define CONFIG_ENV_SIZE                        0x20000         /* 1 sector = 128 kB */
+#define CONFIG_BOOTCOMMAND                                             \
+       "setenv bootargs ${console} ${mtdparts} ${bootargs_nand};"      \
+       "nand read 0x21000000 0x180000 0x080000;"                       \
+       "nand read 0x22000000 0x200000 0x400000;"                       \
+       "bootm 0x22000000 - 0x21000000"
+
+#else /* CONFIG_SYS_USE_MMC */
+
+/* bootstrap + u-boot + env + linux in mmc */
+#define CONFIG_ENV_IS_IN_MMC
+/* For FAT system, most cases it should be in the reserved sector */
+#define CONFIG_ENV_OFFSET              0x2000
+#define CONFIG_ENV_SIZE                        0x1000
+#define CONFIG_SYS_MMC_ENV_DEV         0
+#define CONFIG_BOOTCOMMAND                                             \
+       "setenv bootargs ${console} ${mtdparts} ${bootargs_mmc};"       \
+       "fatload mmc 0:1 0x21000000 dtb;"                               \
+       "fatload mmc 0:1 0x22000000 uImage;"                            \
+       "bootm 0x22000000 - 0x21000000"
+
+#endif
+
+#define CONFIG_SYS_PROMPT      "U-Boot> "
+#define CONFIG_SYS_CBSIZE      256
+#define CONFIG_SYS_MAXARGS     16
+#define CONFIG_SYS_PBSIZE      (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) \
+                                       + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_HUSH_PARSER
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN  (4 * 1024 * 1024)
+#define CONFIG_STACKSIZE       (32 * 1024)     /* regular stack */
+
+#endif
index 538a1675286505a4d7844cfb3906fed36f3d525e..57c4b33f1cb09d36ef3857b1b545599d1dd2f587 100644 (file)
 #endif
 
 #define        CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define        CONFIG_PCI_PNP
 #define        CONFIG_SYS_PCI_MSTR_IO_BUS      0x00000000      /* PCI base   */
 
index 506a558f14e5bf0262bb50818837072304d00799..d36984df2d64b4cd0d6372a2e6a0242d9cb6c5ca 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef  CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE        0x80000000 /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE*/
index da67ae3b5a2be7a9f89a64e34b2e77b9b2d4a299..35a473a429d363489302fdd7886b2996fd04b2cb 100644 (file)
 #define PCI_HOST_AUTO   2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_FORCE  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index acb127c1d1227a166da8a01d0d45d922ec7ceabe..92106d762de550a7ef7ab17dbce5e42d31f2f400 100644 (file)
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
diff --git a/include/configs/cgtqmx6eval.h b/include/configs/cgtqmx6eval.h
new file mode 100644 (file)
index 0000000..1363858
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ *
+ * Congatec Conga-QEVAl board configuration file.
+ *
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Based on Freescale i.MX6Q Sabre Lite board configuration file.
+ * Copyright (C) 2013, Adeneo Embedded <www.adeneo-embedded.com>
+ * Leo Sartre, <lsartre@adeneo-embedded.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_CGTQMX6EVAL_H
+#define __CONFIG_CGTQMX6EVAL_H
+
+#define CONFIG_MX6
+
+#include "mx6_common.h"
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_MACH_TYPE       4122
+
+#include <asm/arch/imx-regs.h>
+#include <asm/imx-common/gpio.h>
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (10 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MISC_INIT_R
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE          UART2_BASE
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_BOUNCE_BUFFER
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+/* Miscellaneous commands */
+#define CONFIG_CMD_BMODE
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX             1
+#define CONFIG_BAUDRATE                               115200
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_BOOTDELAY              3
+
+#define CONFIG_LOADADDR                               0x12000000
+#define CONFIG_SYS_TEXT_BASE          0x17800000
+
+#define CONFIG_DEFAULT_FDT_FILE "imx6q-congatec.dtb"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "script=boot.scr\0" \
+       "uimage=uImage\0" \
+       "fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
+       "boot_dir=/boot\0" \
+       "console=ttymxc1\0" \
+       "fdt_high=0xffffffff\0" \
+       "initrd_high=0xffffffff\0" \
+       "fdt_addr=0x11000000\0" \
+       "boot_fdt=try\0" \
+       "mmcdev=1\0" \
+       "mmcpart=1\0" \
+       "mmcroot=/dev/mmcblk0p1 rootwait rw\0" \
+       "mmcargs=setenv bootargs console=${console},${baudrate} " \
+               "root=${mmcroot}\0" \
+       "loadbootscript=" \
+               "ext2load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+       "bootscript=echo Running bootscript from mmc ...; " \
+               "source\0" \
+       "loaduimage=ext2load mmc ${mmcdev}:${mmcpart} ${loadaddr} " \
+               "${boot_dir}/${uimage}\0" \
+       "loadfdt=ext2load mmc ${mmcdev}:${mmcpart} ${fdt_addr} " \
+               "${boot_dir}/${fdt_file}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+          "mmc dev ${mmcdev};" \
+          "mmc dev ${mmcdev}; if mmc rescan; then " \
+                  "if run loadbootscript; then " \
+                          "run bootscript; " \
+                  "else " \
+                          "if run loaduimage; then " \
+                                  "run mmcboot; " \
+                          "else "\
+                                  "echo ERR: Fail to boot from mmc; " \
+                          "fi; " \
+                  "fi; " \
+          "else echo ERR: Fail to boot from mmc; fi"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT             "CGT-QMX6-Quad U-Boot > "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE             256
+
+/* Print Buffer Size */
+#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_SYS_MEMTEST_START       0x10000000
+#define CONFIG_SYS_MEMTEST_END        0x10010000
+#define CONFIG_SYS_MEMTEST_SCRATCH     0x10800000
+
+#define CONFIG_SYS_LOAD_ADDR          CONFIG_LOADADDR
+#define CONFIG_SYS_HZ                 1000
+
+#define CONFIG_CMDLINE_EDITING
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS          1
+#define PHYS_SDRAM                    MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE                               (1u * 1024 * 1024 * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE         PHYS_SDRAM
+#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)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+
+#define CONFIG_ENV_IS_IN_MMC
+
+#define CONFIG_ENV_OFFSET              (6 * 64 * 1024)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+
+#endif                        /* __CONFIG_CGTQMX6EVAL_H */
index 726714dd2118f8c193d8921406c385d3adf15d5d..c6e357a8ceb350412211cefcec17e60e1809f54d 100644 (file)
 #define CONFIG_CMD_CACHE
 #define CONFIG_CMD_EXT2                /* EXT2 Support                 */
 #define CONFIG_CMD_FAT         /* FAT support                  */
-#define CONFIG_CMD_JFFS2       /* JFFS2 Support                */
 #define CONFIG_CMD_MTDPARTS    /* Enable MTD parts commands */
 #define CONFIG_MTD_DEVICE      /* needed for mtdparts commands */
+#define CONFIG_MTD_PARTITIONS
 #define MTDIDS_DEFAULT         "nand0=nand"
 #define MTDPARTS_DEFAULT       "mtdparts=nand:512k(x-loader),"\
-                               "1920k(u-boot),128k(u-boot-env),"\
+                               "1920k(u-boot),256k(u-boot-env),"\
                                "4m(kernel),-(fs)"
 
 #define CONFIG_CMD_I2C         /* I2C serial bus support       */
 
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
-#define CONFIG_JFFS2_NAND
-/* nand device jffs2 lives on */
-#define CONFIG_JFFS2_DEV               "nand0"
-/* start of jffs2 partition */
-#define CONFIG_JFFS2_PART_OFFSET       0x680000
-#define CONFIG_JFFS2_PART_SIZE         0xf980000       /* size of jffs2 */
-                                                       /* partition */
-
 /* Environment information */
 #define CONFIG_BOOTDELAY               10
 #define CONFIG_ZERO_BOOTDELAY_CHECK
        "defaultdisplay=dvi\0" \
        "mmcdev=0\0" \
        "mmcroot=/dev/mmcblk0p2 rw\0" \
-       "mmcrootfstype=ext3 rootwait\0" \
+       "mmcrootfstype=ext4 rootwait\0" \
        "nandroot=/dev/mtdblock4 rw\0" \
-       "nandrootfstype=jffs2\0" \
+       "nandrootfstype=ubifs\0" \
        "mmcargs=setenv bootargs console=${console} " \
                "mpurate=${mpurate} " \
                "vram=${vram} " \
                "bootm ${loadaddr}\0" \
        "nandboot=echo Booting from nand ...; " \
                "run nandargs; " \
-               "nand read ${loadaddr} 280000 400000; " \
+               "nand read ${loadaddr} 2a0000 400000; " \
                "bootm ${loadaddr}\0" \
 
 #define CONFIG_BOOTCOMMAND \
index be04a7548a7971fa40a11fbc95ff0d6f908babf5..2fefdc80db68e7ea5b72d6493c32ef8add701c44 100644 (file)
@@ -90,7 +90,8 @@
 #endif
 
 /* Generic TPM interfaced through LPC bus */
-#define CONFIG_GENERIC_LPC_TPM
+#define CONFIG_TPM
+#define CONFIG_TPM_TIS_LPC
 #define CONFIG_TPM_TIS_BASE_ADDRESS        0xfed40000
 
 /*-----------------------------------------------------------------------
index 5cc9b5ab26e3b0b9f36ccb12ebb48919437cb574..66c7b4f95fb3d4a45215cb3e372be630dde5a0e4 100644 (file)
@@ -38,6 +38,8 @@
 #define CONFIG_PBLRCW_CONFIG $(SRCTREE)/board/freescale/corenet_ds/rcw_p4080ds.cfg
 #elif defined(CONFIG_P5020DS)
 #define CONFIG_PBLRCW_CONFIG $(SRCTREE)/board/freescale/corenet_ds/rcw_p5020ds.cfg
+#elif defined(CONFIG_P5040DS)
+#define CONFIG_PBLRCW_CONFIG $(SRCTREE)/board/freescale/corenet_ds/rcw_p5040ds.cfg
 #endif
 #endif
 
 #endif
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play */
 #define CONFIG_E1000
 
index f21fa648b10ffc02895cc9d4bff6793c3e87021d..eec087c0dc3f5ad0f0e980ea3de8a4f4ace2e728 100644 (file)
  *
  */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define PCI_HOST_ADAPTER       0       /* configure ar pci adapter     */
 #define PCI_HOST_FORCE         1       /* configure as pci host        */
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
index aed5fa6a453e806759cfdf933c9fc525bd5f5bd7..f6a456c18f11f06fcb80864e0bfcafd9d74ab62d 100644 (file)
  *
  */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define PCI_HOST_ADAPTER       0       /* configure ar pci adapter     */
 #define PCI_HOST_FORCE         1       /* configure as pci host        */
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
index f7ac256a0fa5df67d0895be6027bddea37531241..00e92a68503be972fa2fdd5e01a166ae55ac76b7 100644 (file)
@@ -36,6 +36,7 @@
 #define CONFIG_MACH_DAVINCI_DA830_EVM
 #define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
+#define CONFIG_SOC_DA830               /* TI DA830 SoC */
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
 #define CONFIG_SYS_TIMERBASE           DAVINCI_TIMER0_BASE
 #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_CLE_MASK            0x10
-#define CONFIG_SYS_ALE_MASK            0x8
+#define CONFIG_SYS_NAND_MASK_CLE               0x10
+#define CONFIG_SYS_NAND_MASK_ALE               0x8
 #define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
 #endif
 
 #define CONFIG_CMD_SAVEENV
 #endif
 
+/* SD/MMC configuration */
+#ifndef CONFIG_USE_NAND
+#define CONFIG_MMC
+#define CONFIG_DAVINCI_MMC_SD1
+#define CONFIG_GENERIC_MMC
+#define CONFIG_DAVINCI_MMC
+#endif
+
+/*
+ * Enable MMC commands only when
+ * MMC support is present
+ */
+#if defined(CONFIG_MMC) || defined(CONFIG_USB_DA8XX)
+#define CONFIG_DOS_PARTITION   /* include support for FAT/storage */
+#define CONFIG_CMD_FAT         /* include support for FAT cmd */
+#endif
+
+#ifdef CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_EXT2
+#endif
+
 #if !defined(CONFIG_USE_NAND) && \
        !defined(CONFIG_USE_NOR) && \
        !defined(CONFIG_USE_SPIFLASH)
 
 #define CONFIG_USB_STORAGE     /* MSC class support */
 #define CONFIG_CMD_STORAGE     /* inclue support for usb-storage cmd */
-#define CONFIG_CMD_FAT         /* inclue support for FAT/storage */
-#define CONFIG_DOS_PARTITION   /* inclue support for FAT/storage */
 
 #ifdef CONFIG_USB_KEYBOARD     /* HID class support */
 #define CONFIG_SYS_USB_EVENT_POLL
index 583568d309afc90734869bb5e07926be34e07882..c420967411db6ffe8b9284837dff0a9ee45ed870 100644 (file)
 #define        CONFIG_SYS_NAND_PAGE_2K
 #define CONFIG_SYS_NAND_CS             3
 #define CONFIG_SYS_NAND_BASE           DAVINCI_ASYNC_EMIF_DATA_CE3_BASE
-#define CONFIG_SYS_CLE_MASK            0x10
-#define CONFIG_SYS_ALE_MASK            0x8
+#define CONFIG_SYS_NAND_MASK_CLE               0x10
+#define CONFIG_SYS_NAND_MASK_ALE               0x8
 #undef CONFIG_SYS_NAND_HW_ECC
 #define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
 #define CONFIG_SYS_NAND_HW_ECC_OOBFIRST
index 32aa4e50650b1495369371a9f380e96d65a1e5de..c40fbd9f8d330ea7bd285cd6d929b4018f1a9cfd 100644 (file)
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP
 
 #define CONFIG_EEPRO100
index 788227d79d0233f8527b6c245ac92b36e49d8f61..3b74d7c31c118868823bef179c8c94b1532a504e 100644 (file)
 #define CONFIG_CMD_SPL_NAND_OFS (CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\
                                        0x400000)
 #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x280000
+
+#define CONFIG_SPL_FAT_LOAD_KERNEL_NAME                "uImage"
+#define CONFIG_SPL_FAT_LOAD_ARGS_NAME          "args"
+
+#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR        0x500 /* address 0xa0000 */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR  0x8   /* address 0x1000 */
+#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 8     /* 4KB */
+
 #define CONFIG_SYS_SPL_ARGS_ADDR        (PHYS_SDRAM_1 + 0x100)
 
 #endif /* __CONFIG_H */
index 28a306ba8e0769d0606aae6fdf9a97e54958b6bc..0eea28c80a6dd9b8bf08bc487ab93e647a74fd42 100644 (file)
 #ifndef __CONFIG_DRA7XX_EVM_H
 #define __CONFIG_DRA7XX_EVM_H
 
+/* High Level Configuration Options */
+#define CONFIG_DRA7XX          /* in a TI DRA7XX core */
 #define CONFIG_ENV_IS_NOWHERE          /* For now. */
 
 #include <configs/omap5_common.h>
 
-#define CONFIG_DRA7XX          /* in a TI DRA7XX core */
 #define CONFIG_SYS_PROMPT              "DRA752 EVM # "
 
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_SYS_NS16550_COM1                UART1_BASE
+#define CONFIG_BAUDRATE                        115200
+
+#define CONFIG_SYS_OMAP_ABE_SYSCK
 #endif /* __CONFIG_DRA7XX_EVM_H */
index 3238ac7327ae12fc8c33cb5237f6a8fcb37c3c4c..a6a0f8bb58053c0244ca028eb92f32d273b65288 100644 (file)
  * PCI stuff
  */
 #define CONFIG_PCI             1       /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 
 
index d6b655122a584854913acb79e1683d521c54e06e..b05ba08afdad9a81a879db3c076480a14bec7440 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                                 /* include pci support              */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                         /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE    0x80000000  /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE */
index 2d63b670cd7c5011bad815533aef8338629f8c50..97bc9729a1bf39f28b3d7f3d500812163e20aa88 100644 (file)
 #define CONFIG_SYS_NAND_PAGE_2K
 #define CONFIG_SYS_NAND_CS             3
 #define CONFIG_SYS_NAND_BASE           DAVINCI_ASYNC_EMIF_DATA_CE3_BASE
-#define CONFIG_SYS_CLE_MASK            0x10
-#define CONFIG_SYS_ALE_MASK            0x8
+#define CONFIG_SYS_NAND_MASK_CLE               0x10
+#define CONFIG_SYS_NAND_MASK_ALE               0x8
 #undef CONFIG_SYS_NAND_HW_ECC
 #define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
 
index 8d78921f6b560a46c67a348a9b78d8d57df99e6e..7393f289a79b9d0634cdd47a34371f73ceb8fd35 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_PCI_BOOTDELAY   0
index 8a82892f4f970665211dd6803a28c983ae2ecb9b..41d6cf9d15f7fd50ad3f087244bea6f6d23f57e8 100644 (file)
 /* TPM */
 #define CONFIG_TPM
 #define CONFIG_CMD_TPM
-#define CONFIG_INFINEON_TPM_I2C
-#define CONFIG_INFINEON_TPM_I2C_BUS 3
-#define CONFIG_INFINEON_TPM_I2C_ADDR 0x20
+#define CONFIG_TPM_TIS_I2C
+#define CONFIG_TPM_TIS_I2C_BUS_NUMBER  3
+#define CONFIG_TPM_TIS_I2C_SLAVE_ADDR  0x20
 
 /* MMC SPL */
 #define CONFIG_SPL
index 9efbb8e34cc9b252777bdc2529e8a0c51944aa0d..7b8bac48ec7149ea124786d1cc86a1daeaaa6f69 100644 (file)
 
 /* General PCI */
 #define CONFIG_PCI                             /* include pci support        */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef  CONFIG_PCI_PNP                         /* do (not) pci plug-and-play */
 #define CONFIG_PCI_SCAN_SHOW                   /* show pci devices on startup*/
 #define CONFIG_SYS_PCI_TARGBASE                0x80000000      /* PCIaddr mapped to \
diff --git a/include/configs/goflexhome.h b/include/configs/goflexhome.h
new file mode 100644 (file)
index 0000000..e776514
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2013 Suriyan Ramasami <suriyan.r@gmail.com>
+ *
+ * Based on dockstar.h originally written by
+ * Copyright (C) 2010  Eric C. Cooper <ecc@cmu.edu>
+ *
+ * Based on sheevaplug.h originally written by
+ * Prafulla Wadaskar <prafulla@marvell.com>
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _CONFIG_GOFLEXHOME_H
+#define _CONFIG_GOFLEXHOME_H
+
+/*
+ * Version number information
+ */
+#define CONFIG_IDENT_STRING    "\nSeagate GoFlex Home"
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+#define CONFIG_FEROCEON_88FR131        1       /* CPU Core subversion */
+#define CONFIG_KIRKWOOD                1       /* SOC Family Name */
+#define CONFIG_KW88F6281       1       /* SOC Name */
+#define CONFIG_MACH_GOFLEXHOME         /* Machine type */
+#define CONFIG_SKIP_LOWLEVEL_INIT      /* disable board lowlevel_init */
+
+/*
+ * Default GPIO configuration and LED status
+ */
+#define GOFLEXHOME_OE_LOW               (~(0))
+#define GOFLEXHOME_OE_HIGH              (~(0))
+#define GOFLEXHOME_OE_VAL_LOW           (1 << 29)       /* USB_PWEN low */
+#define GOFLEXHOME_OE_VAL_HIGH          (1 << 17)       /* LED pin high */
+
+/* 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)
+
+/*
+ * Commands configuration
+ */
+#define CONFIG_SYS_NO_FLASH            /* Declare no flash (NOR/SPI) */
+#define CONFIG_CONSOLE_MUX
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+
+#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
+#define CONFIG_CMD_IDE
+#define CONFIG_CMD_DATE
+#define CONFIG_CMD_EXT4
+#define CONFIG_SYS_MVFS         /* Picks up Filesystem from mv-common.h */
+
+/*
+ * 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       /* previously defined in mv-common.h */
+#define CONFIG_SYS_PROMPT      "GoFlexHome> "  /* Command Prompt */
+
+/*
+ *  Environment variables configurations
+ */
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_ENV_IS_IN_NAND          1
+#define CONFIG_ENV_SECT_SIZE           0x20000 /* 128K */
+#else
+#define CONFIG_ENV_IS_NOWHERE          1       /* if env in SDRAM */
+#endif
+/*
+ * max 4k env size is enough, but in case of nand
+ * it has to be rounded to sector size
+ */
+#define CONFIG_ENV_SIZE                        0x20000 /* 128k */
+#define CONFIG_ENV_ADDR                        0xC0000
+#define CONFIG_ENV_OFFSET              0xC0000 /* env starts here */
+
+/*
+ * Default environment variables
+ */
+#define CONFIG_BOOTCOMMAND \
+       "setenv bootargs ${console} ${mtdparts} ${bootargs_root}; " \
+       "ubi part root; " \
+       "ubifsmount ubi:root; " \
+       "ubifsload 0x800000 ${kernel}; " \
+       "bootm 0x800000"
+
+#define CONFIG_MTDPARTS \
+       "mtdparts=orion_nand:1m(uboot),6M(uImage),-(root)\0"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "console=console=ttyS0,115200\0" \
+       "mtdids=nand0=orion_nand\0" \
+       "mtdparts="CONFIG_MTDPARTS \
+       "kernel=/boot/uImage\0" \
+       "bootargs_root=ubi.mtd=root root=ubi0:root rootfstype=ubifs ro\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 */
+
+/*
+ *  * SATA Driver configuration
+ *   */
+#ifdef CONFIG_MVSATA_IDE
+#define CONFIG_SYS_ATA_IDE0_OFFSET      MV_SATA_PORT0_OFFSET
+#endif /*CONFIG_MVSATA_IDE*/
+
+/*
+ *  * RTC driver configuration
+ *   */
+#ifdef CONFIG_CMD_DATE
+#define CONFIG_RTC_MV
+#endif /* CONFIG_CMD_DATE */
+
+#endif /* _CONFIG_GOFLEXHOME_H */
index 2fac0efe13051902c9946497bc4678371b963e5a..c2da4cec9a6e61810e8abf6b77e8fbdb7a190ac8 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
diff --git a/include/configs/igep0033.h b/include/configs/igep0033.h
new file mode 100644 (file)
index 0000000..12f28f8
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2013, ISEE 2007 SL - http://www.isee.biz/
+ *
+ * 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 version 2.
+ *
+ * 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.
+ */
+
+#ifndef __CONFIG_IGEP0033_H
+#define __CONFIG_IGEP0033_H
+
+#define CONFIG_AM33XX
+#define CONFIG_OMAP
+
+#include <asm/arch/omap.h>
+
+/* Mach type */
+#define MACH_TYPE_IGEP0033             4521    /* Until the next sync */
+#define CONFIG_MACH_TYPE               MACH_TYPE_IGEP0033
+
+/* Clock defines */
+#define V_OSCK                         24000000  /* Clock output from T2 */
+#define V_SCLK                         (V_OSCK)
+
+/* DMA defines */
+#define CONFIG_DMA_COHERENT
+#define CONFIG_DMA_COHERENT_SIZE       (1 << 20)
+
+#define CONFIG_ENV_SIZE                        (128 << 10)     /* 128 KiB */
+#define CONFIG_SYS_MALLOC_LEN          (1024 << 10)
+#define CONFIG_SYS_LONGHELP            /* undef to save memory */
+#define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
+#define CONFIG_SYS_PROMPT              "U-Boot# "
+#define CONFIG_SYS_NO_FLASH
+
+/* Display cpuinfo */
+#define CONFIG_DISPLAY_CPUINFO
+
+/* Commands to include */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_ASKENV
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ECHO
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_FS_GENERIC
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+
+/*
+ * Because the issues explained in doc/README.memory-test, the "mtest command
+ * is considered deprecated. It should not be enabled in most normal ports of
+ * U-Boot.
+ */
+#undef CONFIG_CMD_MEMTEST
+
+#define CONFIG_BOOTDELAY               1       /* negative for no autoboot */
+#define CONFIG_ENV_VARS_UBOOT_CONFIG
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "loadaddr=0x80200000\0" \
+       "rdaddr=0x81000000\0" \
+       "bootfile=/boot/uImage\0" \
+       "console=ttyO0,115200n8\0" \
+       "optargs=\0" \
+       "mmcdev=0\0" \
+       "mmcroot=/dev/mmcblk0p2 rw\0" \
+       "mmcrootfstype=ext4 rootwait\0" \
+       "ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=${rdaddr},64M\0" \
+       "ramrootfstype=ext2\0" \
+       "mmcargs=setenv bootargs console=${console} " \
+               "${optargs} " \
+               "root=${mmcroot} " \
+               "rootfstype=${mmcrootfstype}\0" \
+       "bootenv=uEnv.txt\0" \
+       "loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \
+       "importbootenv=echo Importing environment from mmc ...; " \
+               "env import -t $loadaddr $filesize\0" \
+       "ramargs=setenv bootargs console=${console} " \
+               "${optargs} " \
+               "root=${ramroot} " \
+               "rootfstype=${ramrootfstype}\0" \
+       "loadramdisk=load mmc ${mmcdev} ${rdaddr} ramdisk.gz\0" \
+       "loaduimagefat=load mmc ${mmcdev} ${loadaddr} ${bootfile}\0" \
+       "loaduimage=load mmc ${mmcdev}:2 ${loadaddr} ${bootfile}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "bootm ${loadaddr}\0" \
+       "ramboot=echo Booting from ramdisk ...; " \
+               "run ramargs; " \
+               "bootm ${loadaddr}\0" \
+
+#define CONFIG_BOOTCOMMAND \
+       "mmc dev ${mmcdev}; if mmc rescan; then " \
+               "echo SD/MMC found on device ${mmcdev};" \
+               "if run loadbootenv; then " \
+                       "echo Loaded environment from ${bootenv};" \
+                       "run importbootenv;" \
+               "fi;" \
+               "if test -n $uenvcmd; then " \
+                       "echo Running uenvcmd ...;" \
+                       "run uenvcmd;" \
+               "fi;" \
+               "if run loaduimage; then " \
+                       "run mmcboot;" \
+               "fi;" \
+       "fi;" \
+
+/* Max number of command args */
+#define CONFIG_SYS_MAXARGS             16
+
+/* Console I/O Buffer Size */
+#define CONFIG_SYS_CBSIZE              512
+
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE \
+                                       + sizeof(CONFIG_SYS_PROMPT) + 16)
+
+/* Boot Argument Buffer Size */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+#define CONFIG_SYS_LOAD_ADDR           0x81000000 /* Default load address */
+#define CONFIG_SYS_HZ                  1000 /* 1ms clock */
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1               /*  1 bank of DRAM */
+#define PHYS_DRAM_1                    0x80000000      /* DRAM Bank #1 */
+#define CONFIG_MAX_RAM_BANK_SIZE       (1024 << 20)    /* 1GB */
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_DRAM_1
+#define CONFIG_SYS_INIT_SP_ADDR         (NON_SECURE_SRAM_END - \
+                                               GENERATED_GBL_DATA_SIZE)
+/* Platform/Board specific defs */
+#define CONFIG_SYS_TIMERBASE           0x48040000      /* Use Timer2 */
+#define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
+#define CONFIG_SYS_HZ                  1000
+
+/* NS16550 Configuration */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE    (-4)
+#define CONFIG_SYS_NS16550_CLK         (48000000)
+#define CONFIG_SYS_NS16550_COM1                0x44e09000      /* UART0 */
+
+#define CONFIG_SERIAL_MULTI
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
+
+#define CONFIG_ENV_OVERWRITE           1
+#define CONFIG_SYS_CONSOLE_INFO_QUIET
+
+/* MMC support */
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_OMAP_HSMMC
+#define CONFIG_DOS_PARTITION
+
+/* GPIO support */
+#define CONFIG_OMAP_GPIO
+
+/* Ethernet support */
+#define CONFIG_DRIVER_TI_CPSW
+#define CONFIG_MII
+#define CONFIG_BOOTP_DEFAULT
+#define CONFIG_BOOTP_DNS
+#define CONFIG_BOOTP_DNS2
+#define CONFIG_BOOTP_SEND_HOSTNAME
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_NET_RETRY_COUNT         10
+#define CONFIG_NET_MULTI
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_ADDR                        0
+#define CONFIG_PHY_SMSC
+
+/* NAND support */
+#define CONFIG_NAND
+#define CONFIG_NAND_OMAP_GPMC
+#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
+#define CONFIG_SYS_NAND_BASE           (0x08000000)    /* phys address CS0 */
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_ONFI_DETECTION 1
+#define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              0x260000 /* environment starts here */
+
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_MTD_DEVICE
+#define CONFIG_RBTREE
+#define CONFIG_LZO
+
+#define MTDIDS_DEFAULT                 "nand0=nand"
+#define MTDPARTS_DEFAULT               "mtdparts=nand:512k(SPL),"\
+                                       "1m(U-Boot),128k(U-Boot Env),"\
+                                       "5m(Kernel),-(File System)"
+
+/* Unsupported features */
+#undef CONFIG_USE_IRQ
+
+/* Defines for SPL */
+#define CONFIG_SPL
+#define CONFIG_SPL_FRAMEWORK
+/*
+ * Place the image at the start of the ROM defined image space.
+ * We limit our size to the ROM-defined downloaded image area, and use the
+ * rest of the space for stack.
+ */
+#define CONFIG_SPL_TEXT_BASE           0x402F0400
+#define CONFIG_SPL_MAX_SIZE            (0x4030C000 - CONFIG_SPL_TEXT_BASE)
+#define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
+
+#define CONFIG_SPL_BSS_START_ADDR      0x80000000
+#define CONFIG_SPL_BSS_MAX_SIZE                0x80000         /* 512 KB */
+
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300 /* address 0x60000 */
+#define CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS     0x200 /* 256 KB */
+#define CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION   1
+#define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME       "u-boot.img"
+#define CONFIG_SPL_MMC_SUPPORT
+#define CONFIG_SPL_FAT_SUPPORT
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBDISK_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_YMODEM_SUPPORT
+#define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/am33xx/u-boot-spl.lds"
+
+#define CONFIG_SPL_BOARD_INIT
+#define CONFIG_SPL_NAND_AM33XX_BCH
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_NAND_BASE
+#define CONFIG_SPL_NAND_DRIVERS
+#define CONFIG_SPL_NAND_ECC
+#define CONFIG_SYS_NAND_5_ADDR_CYCLE
+#define CONFIG_SYS_NAND_PAGE_COUNT     (CONFIG_SYS_NAND_BLOCK_SIZE / \
+                                        CONFIG_SYS_NAND_PAGE_SIZE)
+#define CONFIG_SYS_NAND_PAGE_SIZE      2048
+#define CONFIG_SYS_NAND_OOBSIZE                64
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (128*1024)
+#define CONFIG_SYS_NAND_BAD_BLOCK_POS  NAND_LARGE_BADBLOCK_POS
+#define CONFIG_SYS_NAND_ECCPOS         { 2, 3, 4, 5, 6, 7, 8, 9, \
+                                        10, 11, 12, 13, 14, 15, 16, 17, \
+                                        18, 19, 20, 21, 22, 23, 24, 25, \
+                                        26, 27, 28, 29, 30, 31, 32, 33, \
+                                        34, 35, 36, 37, 38, 39, 40, 41, \
+                                        42, 43, 44, 45, 46, 47, 48, 49, \
+                                        50, 51, 52, 53, 54, 55, 56, 57, }
+
+#define CONFIG_SYS_NAND_ECCSIZE                512
+#define CONFIG_SYS_NAND_ECCBYTES       14
+
+#define CONFIG_SYS_NAND_ECCSTEPS       4
+#define        CONFIG_SYS_NAND_ECCTOTAL        (CONFIG_SYS_NAND_ECCBYTES * \
+                                               CONFIG_SYS_NAND_ECCSTEPS)
+
+#define        CONFIG_SYS_NAND_U_BOOT_START    CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
+
+/*
+ * 1MB into the SDRAM to allow for SPL's bss at the beginning of SDRAM
+ * 64 bytes before this address should be set aside for u-boot.img's
+ * header. That is 0x800FFFC0--0x80100000 should not be used for any
+ * other needs.
+ */
+#define CONFIG_SYS_TEXT_BASE           0x80800000
+#define CONFIG_SYS_SPL_MALLOC_START    0x80208000
+#define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
+
+/*
+ * Since SPL did pll and ddr initialization for us,
+ * we don't need to do it twice.
+ */
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#endif
+
+#endif /* ! __CONFIG_IGEP0033_H */
index c6637002b510c4489ecb655caf2e2541bb1171a1..327a866ea56558edfead3b1877ba9fe980f4d890 100644 (file)
@@ -26,7 +26,6 @@
 /* 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_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
@@ -79,8 +78,6 @@
 /* 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
 
index 33364a843e3e1437e92a2c61af0d273981a8a491..ed96b1b3c44da058d386ec83b1b99cfdf94bed62 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index 3ed8dc7f3ea2a8ce251006ef500b10db9497ef27..c6f712c93786f00bbd3ecf9dd17745ab4c15f7bc 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP         1       /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index d505a41de4510596c8e5c1c13df4d4bcc0f9610a..aec4a584efbc7b18b83019c7978f9dc045ff92b6 100644 (file)
  * PCI stuff
  *----------------------------------------------------------------------*/
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP         1       /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index b919aec359fad9b51618ff5eef4a50ee24612f27..d7c1f8508b0b4b17a1924e4c7f5935f9c3f76c01 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_SYS_PCI_CACHE_LINE_SIZE 0       /* to avoid problems with PNP   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
index e49dc28776124ffeab53f688c93265ca50dc557c..87a5056afd977ff9fe20962e01226ed6ed21f683 100644 (file)
 #define CONFIG_SYS_NS16550_CLK         14745600
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI_PNP
 
 #define CONFIG_EEPRO100
index eec79619c10a2ba2ee68711974995e8652fa9900..20f0a18f86fe0fde7cd7454b9cea072fd7671622 100644 (file)
  * PCI stuff
  */
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 /* Verified: CONFIG_PCI_PNP doesn't work */
 #undef CONFIG_PCI_PNP
 #define CONFIG_PCI_SCAN_SHOW
diff --git a/include/configs/lp8x4x.h b/include/configs/lp8x4x.h
new file mode 100644 (file)
index 0000000..026f321
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * ICP DAS LP-8x4x configuration file
+ *
+ * Copyright (C) 2013 Sergey Yanovich <ynvich@gmail.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
+
+/*
+ * High Level Board Configuration Options
+ */
+#define        CONFIG_CPU_PXA27X                       /* Marvell PXA270 CPU */
+#define        MACH_TYPE_LP8X4X                4539    /* ICP DAS LP-8x4x */
+#define        CONFIG_MACH_TYPE                MACH_TYPE_LP8X4X
+#define        CONFIG_SYS_TEXT_BASE            0x00000000
+
+#define        CONFIG_SYS_MALLOC_LEN           (128*1024)
+#define        CONFIG_ARCH_CPU_INIT
+#define        CONFIG_BOOTCOMMAND              \
+       "bootm 80000;"
+
+#define        CONFIG_BOOTARGS                 \
+       "console=ttySA0,115200 mem=128M root=/dev/mmcblk0p1 rw" \
+       "init=/sbin/init rootfstype=ext3"
+
+#define        CONFIG_TIMESTAMP
+#define        CONFIG_BOOTDELAY                2       /* Autoboot delay */
+#define        CONFIG_CMDLINE_TAG
+#define        CONFIG_SETUP_MEMORY_TAGS
+#define        CONFIG_LZMA                     /* LZMA compression support */
+#undef CONFIG_OF_LIBFDT
+
+/*
+ * Serial Console Configuration
+ */
+#define        CONFIG_PXA_SERIAL
+#define        CONFIG_FFUART                   1
+#define        CONFIG_CONS_INDEX               3
+#define        CONFIG_BAUDRATE                 115200
+
+/*
+ * Bootloader Components Configuration
+ */
+#include <config_cmd_default.h>
+
+#define        CONFIG_CMD_NET
+#define        CONFIG_CMD_ENV
+#undef CONFIG_CMD_IMLS
+#define        CONFIG_CMD_MMC
+#define        CONFIG_CMD_USB
+#undef CONFIG_LCD
+#undef CONFIG_CMD_IDE
+
+/*
+ * Networking Configuration
+ * chip on the ICPDAS LINPAC board
+ */
+#ifdef CONFIG_CMD_NET
+#define        CONFIG_CMD_PING
+#define        CONFIG_CMD_DHCP
+
+#define        CONFIG_DRIVER_DM9000            1
+#define        CONFIG_DM9000_BASE              0x0C000000
+#define        DM9000_IO                       0x0C000000
+#define        DM9000_DATA                     0x0C004000
+#define        DM9000_IO_2                     0x0D000000
+#define        DM9000_DATA_2                   0x0D004000
+#define        CONFIG_NET_RETRY_COUNT          10
+
+#define        CONFIG_BOOTP_BOOTFILESIZE
+#define        CONFIG_BOOTP_BOOTPATH
+#define        CONFIG_BOOTP_GATEWAY
+#define        CONFIG_BOOTP_HOSTNAME
+#endif
+
+/*
+ * MMC Card Configuration
+ */
+#ifdef CONFIG_CMD_MMC
+#define        CONFIG_MMC
+#define        CONFIG_GENERIC_MMC
+#define        CONFIG_PXA_MMC_GENERIC
+#define        CONFIG_CMD_FAT
+#define        CONFIG_CMD_EXT2
+#define        CONFIG_DOS_PARTITION
+#endif
+
+/*
+ * KGDB
+ */
+#ifdef CONFIG_CMD_KGDB
+#define        CONFIG_KGDB_BAUDRATE            230400  /* kgdb serial port speed */
+#define        CONFIG_KGDB_SER_INDEX           2       /* which serial port to use */
+#endif
+
+/*
+ * HUSH Shell Configuration
+ */
+#define        CONFIG_SYS_HUSH_PARSER          1
+
+#undef CONFIG_SYS_LONGHELP
+#ifdef CONFIG_SYS_HUSH_PARSER
+#define        CONFIG_SYS_PROMPT               "$ "
+#else
+#define        CONFIG_SYS_PROMPT               "=> "
+#endif
+#define        CONFIG_SYS_CBSIZE               256
+#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_SYS_DEVICE_NULLDEV       1
+#define        CONFIG_CMDLINE_EDITING          1
+#define        CONFIG_AUTO_COMPLETE            1
+
+/*
+ * Clock Configuration
+ */
+#define        CONFIG_SYS_HZ                   1000            /* Timer @ 3250000 Hz */
+
+/*
+ * DRAM Map
+ */
+#define        CONFIG_NR_DRAM_BANKS            1               /* 1 bank of DRAM */
+#define        PHYS_SDRAM_1                    0xa0000000      /* SDRAM Bank #1 */
+#define        PHYS_SDRAM_1_SIZE               0x08000000      /* 128 MB */
+
+#define        CONFIG_SYS_DRAM_BASE            0xa0000000      /* CS0 */
+#define        CONFIG_SYS_DRAM_SIZE            0x08000000      /* 128 MB DRAM */
+
+#define        CONFIG_SYS_MEMTEST_START        0xa0400000      /* memtest works on */
+#define        CONFIG_SYS_MEMTEST_END          0xa0800000      /* 4 ... 8 MB in DRAM */
+
+#define        CONFIG_SYS_LOAD_ADDR            0xa0008000
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
+/* Use first 64kb bank of the internal SRAM */
+#define        CONFIG_SYS_INIT_SP_ADDR         0x5c010000
+
+/*
+ * NOR FLASH
+ */
+#define        CONFIG_SYS_MONITOR_BASE         0x0
+#define        CONFIG_SYS_MONITOR_LEN          0x40000
+#define        CONFIG_ENV_ADDR                 \
+                       (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
+#define        CONFIG_ENV_SIZE                 0x40000
+#define        CONFIG_ENV_SECT_SIZE            0x40000
+
+#define        PHYS_FLASH_1                    0x00000000      /* Flash Bank #1 */
+#define        PHYS_FLASH_2                    0x02000000      /* Flash Bank #2 */
+
+#define        CONFIG_SYS_FLASH_CFI
+#define        CONFIG_FLASH_CFI_DRIVER         1
+
+#define        CONFIG_SYS_MAX_FLASH_SECT       (4 + 255)
+#define        CONFIG_SYS_MAX_FLASH_BANKS      2
+#define        CONFIG_SYS_FLASH_BANKS_LIST     { PHYS_FLASH_1, PHYS_FLASH_2 }
+
+#define        CONFIG_SYS_FLASH_ERASE_TOUT     (25*CONFIG_SYS_HZ)
+#define        CONFIG_SYS_FLASH_WRITE_TOUT     (25*CONFIG_SYS_HZ)
+
+#define        CONFIG_SYS_FLASH_USE_BUFFER_WRITE       1
+#define        CONFIG_SYS_FLASH_PROTECTION             1
+
+#define        CONFIG_ENV_IS_IN_FLASH          1
+
+/*
+ * GPIO settings
+ */
+#define        CONFIG_SYS_GPSR0_VAL    0x0808c014
+#define        CONFIG_SYS_GPSR1_VAL    0x00cf0002
+#define        CONFIG_SYS_GPSR2_VAL    0x0221c000
+#define        CONFIG_SYS_GPSR3_VAL    0x00020000
+
+#define        CONFIG_SYS_GPCR0_VAL    0x00000000
+#define        CONFIG_SYS_GPCR1_VAL    0x0000ab80
+#define        CONFIG_SYS_GPCR2_VAL    0x00100000
+#define        CONFIG_SYS_GPCR3_VAL    0x0
+
+#define        CONFIG_SYS_GPDR0_VAL    0xc0e9ddf4
+#define        CONFIG_SYS_GPDR1_VAL    0xfcffab83
+#define        CONFIG_SYS_GPDR2_VAL    0x02f1ffff
+#define        CONFIG_SYS_GPDR3_VAL    0x00021b81
+
+#define        CONFIG_SYS_GAFR0_L_VAL  0x80000000
+#define        CONFIG_SYS_GAFR0_U_VAL  0xa5e54018
+#define        CONFIG_SYS_GAFR1_L_VAL  0x999a955a
+#define        CONFIG_SYS_GAFR1_U_VAL  0xaaa5a00a
+#define        CONFIG_SYS_GAFR2_L_VAL  0xaaaaaaaa
+#define        CONFIG_SYS_GAFR2_U_VAL  0x55f0a402
+#define        CONFIG_SYS_GAFR3_L_VAL  0x540a950c
+#define        CONFIG_SYS_GAFR3_U_VAL  0x00001599
+
+#define        CONFIG_SYS_PSSR_VAL     0x32
+
+/*
+ * Clock settings
+ */
+#define        CONFIG_SYS_CKEN         0x005002c0
+#define        CONFIG_SYS_CCCR         0x02000290
+#define        CONFIG_SYS_CLKCFG       0x0000000b
+
+/*
+ * Memory settings
+ */
+#define        CONFIG_SYS_MSC0_VAL     0x2bd8aad2
+#define        CONFIG_SYS_MSC1_VAL     0xb8c9b8dc
+#define        CONFIG_SYS_MSC2_VAL     0xfff9b8c9
+#define        CONFIG_SYS_FLYCNFG_VAL  0x00010001
+#define        CONFIG_SYS_MDREFR_VAL   0x2093e018
+#define        CONFIG_SYS_MDCNFG_VAL   0x890009d1
+#define        CONFIG_SYS_MDMRS_VAL    0x00220022
+#define        CONFIG_SYS_SXCNFG_VAL   0x40044004
+
+/*
+ * PCMCIA and CF Interfaces
+ */
+#define        CONFIG_SYS_MECR_VAL     0x00000001
+#define        CONFIG_SYS_MCMEM0_VAL   0x0000c497
+#define        CONFIG_SYS_MCMEM1_VAL   0x0000c497
+#define        CONFIG_SYS_MCATT0_VAL   0x0000c497
+#define        CONFIG_SYS_MCATT1_VAL   0x0000c497
+#define        CONFIG_SYS_MCIO0_VAL    0x00008407
+#define        CONFIG_SYS_MCIO1_VAL    0x00008407
+
+/*
+ * LCD
+ */
+#ifdef CONFIG_LCD
+#define        CONFIG_VOIPAC_LCD
+#endif
+
+/*
+ * USB
+ */
+#ifdef CONFIG_CMD_USB
+#define        CONFIG_USB_OHCI_NEW
+#define        CONFIG_SYS_USB_OHCI_CPU_INIT
+#define        CONFIG_SYS_USB_OHCI_BOARD_INIT
+#define        CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS      2
+#define        CONFIG_SYS_USB_OHCI_REGS_BASE   0x4C000000
+#define        CONFIG_SYS_USB_OHCI_SLOT_NAME   "lp8x4x"
+#define        CONFIG_USB_STORAGE
+#endif
+
+#endif /* __CONFIG_H */
index 3b4761bd08719919657851195e4067026446446a..f0e568af83457dd43c638fbceb49df554a47cf3c 100644 (file)
 
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 
index 4ce4058c759f331e7a68c6c1b5893d8aec7267ac..5b3fa43eb46cbbc0d85f95c849352f385740da74 100644 (file)
@@ -77,6 +77,7 @@
 #define CONFIG_CMD_SF
 #define CONFIG_CMD_SPI
 #define CONFIG_CMD_USB
+#define        CONFIG_VIDEO
 
 #define CONFIG_REGEX                   /* Enable regular expression support */
 
 #endif
 #endif
 
+/*
+ * LCD
+ */
+#ifdef CONFIG_VIDEO
+#define        CONFIG_CFB_CONSOLE
+#define        CONFIG_VIDEO_MXS
+#define        CONFIG_VIDEO_LOGO
+#define        CONFIG_VIDEO_SW_CURSOR
+#define        CONFIG_VGA_AS_SINGLE_DEVICE
+#define        CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define        CONFIG_SPLASH_SCREEN
+#define        CONFIG_CMD_BMP
+#define        CONFIG_BMP_16BPP
+#define        CONFIG_VIDEO_BMP_RLE8
+#define        CONFIG_VIDEO_BMP_GZIP
+#define        CONFIG_SYS_VIDEO_LOGO_MAX_SIZE  (512 << 10)
+#endif
+
 /*
  * Boot Linux
  */
diff --git a/include/configs/m53evk.h b/include/configs/m53evk.h
new file mode 100644 (file)
index 0000000..8403d51
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * DENX M53 configuration
+ * Copyright (C) 2012-2013 Marek Vasut <marex@denx.de>
+ *
+ * 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 __M53EVK_CONFIG_H__
+#define __M53EVK_CONFIG_H__
+
+#define CONFIG_MX53
+#define CONFIG_MXC_GPIO
+#define CONFIG_SYS_HZ          1000
+
+#include <asm/arch/imx-regs.h>
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_REVISION_TAG
+#define CONFIG_SYS_NO_FLASH
+
+/*
+ * U-Boot Commands
+ */
+#include <config_cmd_default.h>
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_CMD_DATE
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_MMC
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_SATA
+#define CONFIG_CMD_USB
+
+/*
+ * Memory configurations
+ */
+#define CONFIG_NR_DRAM_BANKS           2
+#define PHYS_SDRAM_1                   CSD0_BASE_ADDR
+#define PHYS_SDRAM_1_SIZE              (512 * 1024 * 1024)
+#define PHYS_SDRAM_2                   CSD1_BASE_ADDR
+#define PHYS_SDRAM_2_SIZE              (512 * 1024 * 1024)
+#define PHYS_SDRAM_SIZE                        (PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE)
+#define CONFIG_SYS_MALLOC_LEN          (10 * 1024 * 1024)
+#define CONFIG_SYS_MEMTEST_START       0x70000000
+#define CONFIG_SYS_MEMTEST_END         0xaff00000
+
+#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_SYS_TEXT_BASE           0x71000000
+
+/*
+ * U-Boot general configurations
+ */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_PROMPT      "=> "
+#define CONFIG_SYS_CBSIZE      1024            /* Console I/O buffer size */
+#define CONFIG_SYS_PBSIZE      \
+       (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+                                               /* Print buffer size */
+#define CONFIG_SYS_MAXARGS     32              /* Max number of command args */
+#define CONFIG_SYS_BARGSIZE    CONFIG_SYS_CBSIZE
+                                               /* Boot argument buffer size */
+#define CONFIG_VERSION_VARIABLE                        /* U-BOOT version */
+#define CONFIG_AUTO_COMPLETE                   /* Command auto complete */
+#define CONFIG_CMDLINE_EDITING                 /* Command history etc */
+#define CONFIG_SYS_HUSH_PARSER
+
+/*
+ * Serial Driver
+ */
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE           UART2_BASE
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+
+/*
+ * MMC Driver
+ */
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_ESDHC_NUM       1
+#endif
+
+/*
+ * NAND
+ */
+#define CONFIG_ENV_SIZE                        (16 * 1024)
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           NFC_BASE_ADDR_AXI
+#define CONFIG_NAND_MXC
+#define CONFIG_MXC_NAND_REGS_BASE      NFC_BASE_ADDR_AXI
+#define CONFIG_MXC_NAND_IP_REGS_BASE   NFC_BASE_ADDR
+#define CONFIG_SYS_NAND_LARGEPAGE
+#define CONFIG_MXC_NAND_HWECC
+#define CONFIG_SYS_NAND_USE_FLASH_BBT
+
+/* Environment is in NAND */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_SIZE_REDUND         CONFIG_ENV_SIZE
+#define CONFIG_ENV_SECT_SIZE           (128 * 1024)
+#define CONFIG_ENV_RANGE               (512 * 1024)
+#define CONFIG_ENV_OFFSET              0x100000
+#define CONFIG_ENV_OFFSET_REDUND       \
+               (CONFIG_ENV_OFFSET + CONFIG_ENV_RANGE)
+
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_RBTREE
+#define CONFIG_LZO
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_PARTITIONS
+#define MTDIDS_DEFAULT                 "nand0=mxc-nand"
+#define MTDPARTS_DEFAULT                       \
+       "mtdparts=mxc-nand:"                    \
+               "1m(bootloader)ro,"             \
+               "512k(environment),"            \
+               "512k(redundant-environment),"  \
+               "4m(kernel),"                   \
+               "128k(fdt),"                    \
+               "8m(ramdisk),"                  \
+               "-(filesystem)"
+#else
+#define CONFIG_ENV_IS_NOWHERE
+#endif
+
+/*
+ * Ethernet on SOC (FEC)
+ */
+#ifdef CONFIG_CMD_NET
+#define CONFIG_FEC_MXC
+#define IMX_FEC_BASE                   FEC_BASE_ADDR
+#define CONFIG_FEC_MXC_PHYADDR         0x0
+#define CONFIG_MII
+#define CONFIG_DISCOVER_PHY
+#define CONFIG_FEC_XCV_TYPE            RMII
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+#endif
+
+/*
+ * I2C
+ */
+#ifdef CONFIG_CMD_I2C
+#define CONFIG_HARD_I2C
+#define CONFIG_I2C_MXC
+#define CONFIG_SYS_I2C_BASE            I2C2_BASE_ADDR
+#define CONFIG_SYS_I2C_SPEED           100000
+#endif
+
+/*
+ * RTC
+ */
+#ifdef CONFIG_CMD_DATE
+#define CONFIG_RTC_M41T62
+#define CONFIG_SYS_I2C_RTC_ADDR                0x68
+#define CONFIG_SYS_M41T11_BASE_YEAR    2000
+#endif
+
+/*
+ * USB
+ */
+#ifdef CONFIG_CMD_USB
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_MX5
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_USB_ETHER_SMSC95XX
+#define CONFIG_MXC_USB_PORT            1
+#define CONFIG_MXC_USB_PORTSC          (PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS           0
+#endif
+
+/*
+ * 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
+
+/*
+ * Boot Linux
+ */
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_BOOTDELAY       3
+#define CONFIG_BOOTFILE                "m53evk/uImage"
+#define CONFIG_BOOTARGS                "console=ttymxc1,115200"
+#define CONFIG_LOADADDR                0x70800000
+#define CONFIG_SYS_LOAD_ADDR   CONFIG_LOADADDR
+#define CONFIG_OF_LIBFDT
+
+/*
+ * NAND SPL
+ */
+#define CONFIG_SPL
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TARGET              "u-boot-with-nand-spl.imx"
+#define CONFIG_SPL_BOARD_INIT
+#define CONFIG_SPL_TEXT_BASE           0x70008000
+#define CONFIG_SPL_PAD_TO              0x8000
+#define CONFIG_SPL_STACK               0x70004000
+#define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    CONFIG_SPL_PAD_TO
+#define CONFIG_SYS_NAND_PAGE_SIZE      2048
+#define CONFIG_SYS_NAND_OOBSIZE                64
+#define CONFIG_SYS_NAND_PAGE_COUNT     64
+#define CONFIG_SYS_NAND_SIZE           (256 * 1024 * 1024)
+#define CONFIG_SYS_NAND_BAD_BLOCK_POS  0
+
+#endif /* __M53EVK_CONFIG_H__ */
index 6c1b136659abae34d237de17600e1aac3f95cf4c..f71f28bb873a22da2b0d9f23d67e05f758aa9309 100644 (file)
  * PCI stuff
  *----------------------------------------------------------------------*/
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP         1       /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index af302573e6782db8edeb550a30cc6c1a6664a923..c4f245b985120f65e77a569222c2c178ec71672c 100644 (file)
 /*
  * IIM - IC Identification Module
  */
-#undef CONFIG_IIM
+#undef CONFIG_FSL_IIM
 
 /*
  * EEPROM configuration
index 6e6af62ccad5b7d5ca5a3da7c2ecdd07fa714ade..6f003aa03f9eb5777542398abafa5aa803d77e70 100644 (file)
  * PCI
  */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 /*
  * General PCI
 /*
  * IIM - IC Identification Module
  */
-#undef CONFIG_IIM
+#undef CONFIG_FSL_IIM
 
 /*
  * EEPROM configuration
index aa681f0628d55129f890e4fbb2f9d8d394f34083..3c7a85e359df106f9148e85a52953226d747194a 100644 (file)
 #define CONFIG_SYS_SCCR_PCIEXP1CM      1
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCIE
 
 #define CONFIG_PCI_PNP         /* do pci plug-and-play */
index e5a15a451cc44d3b9b478b30cfe503bc255de12d..3a58afee9a99b3457340259131b2ed1e79ef5754 100644 (file)
@@ -60,6 +60,7 @@
 #define CONFIG_CMD_MMC
 #define CONFIG_CMD_USB
 #define CONFIG_CMD_BOOTZ
+#define CONFIG_VIDEO
 
 /* Memory configurations */
 #define CONFIG_NR_DRAM_BANKS           1               /* 1 bank of DRAM */
 #define CONFIG_USB_STORAGE
 #endif
 
+/* Framebuffer support */
+#ifdef CONFIG_VIDEO
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VIDEO_MXS
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_VIDEO_SW_CURSOR
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_CMD_BMP
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_VIDEO_BMP_GZIP
+#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (512 << 10)
+#endif
+
 /* Boot Linux */
 #define CONFIG_CMDLINE_TAG
 #define CONFIG_SETUP_MEMORY_TAGS
index 3747955bde8127b9acf27327428a01e9ca4691a7..de69182b4f212cb536c400793389989a662a9923 100644 (file)
@@ -63,6 +63,8 @@
 #define CONFIG_CMD_USB
 #define CONFIG_CMD_BOOTZ
 #define CONFIG_CMD_NAND
+#define CONFIG_CMD_NAND_TRIMFFS
+#define CONFIG_VIDEO
 
 /* Memory configurations */
 #define CONFIG_NR_DRAM_BANKS           1               /* 1 bank of DRAM */
 #endif
 #endif
 
+/* Framebuffer support */
+#ifdef CONFIG_VIDEO
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VIDEO_MXS
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_VIDEO_SW_CURSOR
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_CMD_BMP
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_VIDEO_BMP_GZIP
+#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (512 << 10)
+#endif
+
 /* Boot Linux */
 #define CONFIG_CMDLINE_TAG
 #define CONFIG_SETUP_MEMORY_TAGS
index cb3d93890c2e4a7535c4be7ce86eb33c30a50b97..13d1839ebe3ca8aa42151272a711ed9902aa2d90 100644 (file)
@@ -53,6 +53,9 @@
 /*
  * Hardware drivers
  */
+#define CONFIG_FSL_IIM
+#define CONFIG_CMD_FUSE
+
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE   UART1_BASE
 #define CONFIG_MXC_GPIO
 
 #define CONFIG_ETHPRIME                "FEC0"
 
-#define CONFIG_LOADADDR                0x90800000      /* loadaddr env var */
+#define CONFIG_LOADADDR                0x92000000      /* loadaddr env var */
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "script=boot.scr\0" \
        "uimage=uImage\0" \
+       "fdt_file=imx51-babbage.dtb\0" \
+       "fdt_addr=0x91000000\0" \
+       "boot_fdt=try\0" \
+       "ip_dyn=yes\0" \
        "mmcdev=0\0" \
        "mmcpart=2\0" \
-       "mmcroot=/dev/mmcblk0p3 rw\0" \
-       "mmcrootfstype=ext3 rootwait\0" \
+       "mmcroot=/dev/mmcblk0p3 rootwait rw\0" \
        "mmcargs=setenv bootargs console=ttymxc0,${baudrate} " \
-               "root=${mmcroot} " \
-               "rootfstype=${mmcrootfstype}\0" \
+               "root=${mmcroot}\0" \
        "loadbootscript=" \
                "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
        "bootscript=echo Running bootscript from mmc ...; " \
                "source\0" \
        "loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
        "mmcboot=echo Booting from mmc ...; " \
                "run mmcargs; " \
-               "bootm\0" \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0" \
        "netargs=setenv bootargs console=ttymxc0,${baudrate} " \
                "root=/dev/nfs " \
                "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
        "netboot=echo Booting from net ...; " \
                "run netargs; " \
-               "dhcp ${uimage}; bootm\0" \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "${get_cmd} ${uimage}; " \
+               "if test ${boot_fdt} = yes ||  test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo ERROR: Cannot load the DT; " \
+                                       "exit; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0"
 
 #define CONFIG_BOOTCOMMAND \
        "mmc dev ${mmcdev}; if mmc rescan; then " \
index 148f7a200387bdc1677864cabd373c2b4db34ba5..b0a965fbba490bf9da460cb49986350202673e77 100644 (file)
@@ -34,6 +34,7 @@
 #define CONFIG_CMDLINE_TAG                     /* enable passing of ATAGs */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
 
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
@@ -90,6 +91,7 @@
 #include <config_cmd_default.h>
 
 #undef CONFIG_CMD_IMLS
+#define CONFIG_CMD_SETEXPR
 
 #define CONFIG_BOOTDELAY       3
 
 #define CONFIG_SMC911X_16_BIT
 #define CONFIG_SMC911X_BASE CS1_BASE_ADDR
 
-#define CONFIG_LOADADDR                0x70800000      /* loadaddr env var */
+#define CONFIG_LOADADDR                0x72000000      /* loadaddr env var */
 #define CONFIG_SYS_TEXT_BASE    0x77800000
 
+#define CONFIG_DEFAULT_FDT_FILE                "imx53-ard.dtb"
+
 #define CONFIG_EXTRA_ENV_SETTINGS \
        "script=boot.scr\0" \
        "uimage=uImage\0" \
-       "mmcdev=0\0" \
+       "console=ttymxc0\0" \
+       "fdt_high=0xffffffff\0" \
+       "initrd_high=0xffffffff\0" \
+       "fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
+       "fdt_addr=0x71000000\0" \
+       "boot_fdt=try\0" \
+       "ip_dyn=yes\0" \
+       "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
        "mmcpart=2\0" \
-       "mmcroot=/dev/mmcblk0p3 rw\0" \
-       "mmcrootfstype=ext3 rootwait\0" \
-       "mmcargs=setenv bootargs console=ttymxc0,${baudrate} " \
-               "root=${mmcroot} " \
-               "rootfstype=${mmcrootfstype}\0" \
+       "mmcroot=/dev/mmcblk0p3 rootwait rw\0" \
+       "update_sd_firmware_filename=u-boot.imx\0" \
+       "update_sd_firmware=" \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "if mmc dev ${mmcdev}; then "   \
+                       "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+                               "setexpr fw_sz ${filesize} / 0x200; " \
+                               "setexpr fw_sz ${fw_sz} + 1; "  \
+                               "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+                       "fi; "  \
+               "fi\0" \
+       "mmcargs=setenv bootargs console=${console},${baudrate} " \
+               "root=${mmcroot}\0" \
        "loadbootscript=" \
                "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
        "bootscript=echo Running bootscript from mmc ...; " \
                "source\0" \
        "loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
        "mmcboot=echo Booting from mmc ...; " \
                "run mmcargs; " \
-               "bootm\0" \
-       "netargs=setenv bootargs console=ttymxc0,${baudrate} " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0" \
+       "netargs=setenv bootargs console=${console},${baudrate} " \
                "root=/dev/nfs " \
-               "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
-       "netboot=echo Booting from net ...; " \
+       "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+               "netboot=echo Booting from net ...; " \
                "run netargs; " \
-               "dhcp ${uimage}; bootm\0" \
-
-#define CONFIG_BOOTCOMMAND \
-       "mmc dev ${mmcdev}; if mmc rescan; then " \
-               "if run loadbootscript; then " \
-                       "run bootscript; " \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
                "else " \
-                       "if run loaduimage; then " \
-                               "run mmcboot; " \
-                       "else run netboot; " \
-                       "fi; " \
+                       "setenv get_cmd tftp; " \
                "fi; " \
-       "else run netboot; fi"
+               "${get_cmd} ${uimage}; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+          "mmc dev ${mmcdev}; if mmc rescan; then " \
+                  "if run loadbootscript; then " \
+                          "run bootscript; " \
+                  "else " \
+                          "if run loaduimage; then " \
+                                  "run mmcboot; " \
+                          "else run netboot; " \
+                          "fi; " \
+                  "fi; " \
+          "else run netboot; fi"
+
 #define CONFIG_ARP_TIMEOUT     200UL
 
 /* Miscellaneous configurable options */
index a0af3eeb26f2783b64b6eca380e0c6894170be77..822b92679fef801a160c7e812235881332ae8968 100644 (file)
@@ -34,6 +34,7 @@
 #define CONFIG_CMDLINE_TAG                     /* enable passing of ATAGs */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
 
 #define CONFIG_OF_LIBFDT
 
index 9e8331970cf71ba443c0f9a74e6ed49f65060efa..942949d05c6af3e6cbbdd554aaa7f487baecc47e 100644 (file)
@@ -34,6 +34,7 @@
 #define CONFIG_CMDLINE_TAG                     /* enable passing of ATAGs */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
 
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
index b333937827a0a0200403eae7821c744ad7c779af..674bcd3f6ddf585fa51b5f1295b14e2f19994950 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef __MX6_COMMON_H
 #define __MX6_COMMON_H
 
+#define CONFIG_ARM_ERRATA_742230
 #define CONFIG_ARM_ERRATA_743622
 #define CONFIG_ARM_ERRATA_751472
 
index f5f115fa009269a1214cdac20f3053af7729436b..bfaa420ed0179a364fd6eca1f059709c2ae3f874 100644 (file)
@@ -78,6 +78,7 @@
 
 #define CONFIG_CMD_BMODE
 #define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_SETEXPR
 #undef CONFIG_CMD_IMLS
 
 #define CONFIG_BOOTDELAY               1
        "fdt_high=0xffffffff\0"   \
        "initrd_high=0xffffffff\0" \
        "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
-       "mmcpart=" __stringify(CONFIG_SYS_MMC_ENV_PART) "\0" \
+       "mmcpart=1\0" \
        "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+       "update_sd_firmware=" \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "if mmc dev ${mmcdev}; then "   \
+                       "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+                               "setexpr fw_sz ${filesize} / 0x200; " \
+                               "setexpr fw_sz ${fw_sz} + 1; "  \
+                               "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+                       "fi; "  \
+               "fi\0" \
        "mmcargs=setenv bootargs console=${console},${baudrate} " \
                "root=${mmcroot}\0" \
        "loadbootscript=" \
index 1583c11aab8cd0eb77e531cf1baf2e0267f336b8..76f7812069057b1daf69663d36f574ee9377b460 100644 (file)
 #define CONFIG_SYS_FSL_USDHC_NUM       2
 #if defined(CONFIG_ENV_IS_IN_MMC)
 #define CONFIG_SYS_MMC_ENV_DEV         0
-#define CONFIG_SYS_MMC_ENV_PART                1       /* Boot partition 1 */
 #endif
 
+/* I2C Configs */
+#define CONFIG_CMD_I2C
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_MXC
+#define CONFIG_SYS_I2C_SPEED           100000
+
 #endif                         /* __MX6QSABREAUTO_CONFIG_H */
index 6d4b8373520b664d29e35e739ca516f732bf026c..b814418481c0192b8364f392d6a3395b37733b24 100644 (file)
 #define CONFIG_MISC_INIT_R
 #define CONFIG_MXC_GPIO
 
+#define CONFIG_CMD_FUSE
+#ifdef CONFIG_CMD_FUSE
+#define CONFIG_MXC_OCOTP
+#endif
+
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE          UART2_BASE
 
index 3b8d752eed86d20c04da31c82de36c812bc4498c..44f07cbe45a658d87faafedd97fdd7c285aac221 100644 (file)
@@ -29,7 +29,6 @@
 #define CONFIG_SYS_FSL_USDHC_NUM       3
 #if defined(CONFIG_ENV_IS_IN_MMC)
 #define CONFIG_SYS_MMC_ENV_DEV         1       /* SDHC3 */
-#define CONFIG_SYS_MMC_ENV_PART                1       /* Boot partition 1 */
 #endif
 
 #endif                         /* __MX6QSABRESD_CONFIG_H */
diff --git a/include/configs/mx6slevk.h b/include/configs/mx6slevk.h
new file mode 100644 (file)
index 0000000..19dcdd6
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the Freescale i.MX6SL EVK 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.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/arch/imx-regs.h>
+#include <asm/sizes.h>
+
+#define CONFIG_MX6
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define MACH_TYPE_MX6SLEVK             4307
+#define CONFIG_MACH_TYPE               MACH_TYPE_MX6SLEVK
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (3 * SZ_1M)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE           UART1_IPS_BASE_ADDR
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_BOOTDELAY               3
+
+#define CONFIG_LOADADDR                        0x82000000
+#define CONFIG_SYS_TEXT_BASE           0x87800000
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "script=boot.scr\0" \
+       "uimage=uImage\0" \
+       "console=ttymxc0\0" \
+       "fdt_high=0xffffffff\0" \
+       "initrd_high=0xffffffff\0" \
+       "fdt_file=imx6sl-evk.dtb\0" \
+       "fdt_addr=0x81000000\0" \
+       "boot_fdt=try\0" \
+       "ip_dyn=yes\0" \
+       "mmcdev=0\0" \
+       "mmcpart=2\0" \
+       "mmcroot=/dev/mmcblk0p3 rootwait rw\0" \
+       "mmcargs=setenv bootargs console=${console},${baudrate} " \
+               "root=${mmcroot}\0" \
+       "loadbootscript=" \
+               "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+       "bootscript=echo Running bootscript from mmc ...; " \
+               "source\0" \
+       "loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0" \
+       "netargs=setenv bootargs console=${console},${baudrate} " \
+               "root=/dev/nfs " \
+       "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+               "netboot=echo Booting from net ...; " \
+               "run netargs; " \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "${get_cmd} ${uimage}; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+                               "bootm ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootm; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootm; " \
+               "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+          "mmc dev ${mmcdev};" \
+          "mmc dev ${mmcdev}; if mmc rescan; then " \
+                  "if run loadbootscript; then " \
+                          "run bootscript; " \
+                  "else " \
+                          "if run loaduimage; then " \
+                                  "run mmcboot; " \
+                          "else run netboot; " \
+                          "fi; " \
+                  "fi; " \
+          "else run netboot; fi"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT              "=> "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE              256
+
+/* Print Buffer Size */
+#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_SYS_MEMTEST_START       0x80000000
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + SZ_512M)
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+#define CONFIG_SYS_HZ                  1000
+
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_STACKSIZE               SZ_128K
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM                     MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE                        SZ_1G
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#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)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_ENV_OFFSET              (6 * SZ_64K)
+#define CONFIG_ENV_SIZE                        SZ_8K
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_SYS_MMC_ENV_DEV         0
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+
+#endif                         /* __CONFIG_H */
index 93e7fe4e62868b0c82c519cf32ede0d41259c63b..aea91bcb0191eea4b4102c24620dca9848646857 100644 (file)
 #define CONFIG_MISC_INIT_R
 #define CONFIG_MXC_GPIO
 
+#define CONFIG_CMD_FUSE
+#ifdef CONFIG_CMD_FUSE
+#define CONFIG_MXC_OCOTP
+#endif
+
 #define CONFIG_MXC_UART
 #define CONFIG_MXC_UART_BASE          UART2_BASE
 
index d0fe9dadfbe47c06ab50a92033f3b34238145d89..3e64c7405bfda9c096fd2c96eab9131d9ad4d8ac 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE    0x80000000  /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE */
diff --git a/include/configs/omap2420h4.h b/include/configs/omap2420h4.h
deleted file mode 100644 (file)
index 04e8d3a..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * (C) Copyright 2004
- * Texas Instruments.
- * Richard Woodruff <r-woodruff2@ti.com>
- * Kshitij Gupta <kshitij@ti.com>
- *
- * Configuration settings for the 242x TI H4 board.
- *
- * 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 __CONFIG_H
-#define __CONFIG_H
-
-/*
- * High Level Configuration Options
- */
-#define CONFIG_ARM1136           1    /* This is an arm1136 CPU core */
-#define CONFIG_OMAP              1    /* in a TI OMAP core */
-#define CONFIG_OMAP2420                 1    /* which is in a 2420 */
-#define CONFIG_OMAP2420H4        1    /* and on a H4 board */
-/*#define CONFIG_APTIX           1    #* define if on APTIX test chip */
-/*#define CONFIG_VIRTIO          1    #* Using Virtio simulator */
-
-#define CONFIG_STANDALONE_LOAD_ADDR    0x80300000
-
-/* Clock config to target*/
-#define PRCM_CONFIG_II 1
-/* #define PRCM_CONFIG_III             1 */
-
-#include <asm/arch/omap2420.h>        /* get chip and board defs */
-
-/* On H4, NOR and NAND flash are mutual exclusive.
-   Define this if you want to use NAND
- */
-/*#define CONFIG_SYS_NAND_BOOT */
-
-#ifdef CONFIG_APTIX
-#define V_SCLK                   1500000
-#else
-#define V_SCLK                   12000000
-#endif
-
-/* input clock of PLL */
-/* the OMAP2420 H4 has 12MHz, 13MHz, or 19.2Mhz crystal input */
-#define CONFIG_SYS_CLK_FREQ      V_SCLK
-
-#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
-
-/*
- * Size of malloc() pool
- */
-#define CONFIG_ENV_SIZE             SZ_128K     /* Total Size of Environment Sector */
-#define CONFIG_SYS_MALLOC_LEN           (CONFIG_ENV_SIZE + SZ_128K)
-
-/*
- * Hardware drivers
- */
-
-/*
- * SMC91c96 Etherent
- */
-#define CONFIG_LAN91C96
-#define CONFIG_LAN91C96_BASE     (H4_CS1_BASE+0x300)
-#define CONFIG_LAN91C96_EXT_PHY
-
-/*
- * NS16550 Configuration
- */
-#ifdef CONFIG_APTIX
-#define V_NS16550_CLK            (6000000)   /* 6MHz in current MaxSet */
-#else
-#define V_NS16550_CLK            (48000000)  /* 48MHz (APLL96/2) */
-#endif
-
-#define CONFIG_SYS_NS16550
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE     (-4)
-#define CONFIG_SYS_NS16550_CLK          V_NS16550_CLK   /* 3MHz (1.5MHz*2) */
-#define CONFIG_SYS_NS16550_COM1         OMAP2420_UART1
-
-/*
- * select serial console configuration
- */
-#define CONFIG_SERIAL1           1    /* UART1 on H4 */
-
-  /*
-   * I2C configuration
-   */
-#define CONFIG_HARD_I2C
-#define CONFIG_SYS_I2C_SPEED          100000
-#define CONFIG_SYS_I2C_SLAVE          1
-#define CONFIG_DRIVER_OMAP24XX_I2C
-
-/* allow to overwrite serial and ethaddr */
-#define CONFIG_ENV_OVERWRITE
-#define CONFIG_CONS_INDEX        1
-#define CONFIG_BAUDRATE          115200
-
-/*
- * Command line configuration.
- */
-#include <config_cmd_default.h>
-
-#ifdef CONFIG_SYS_NAND_BOOT
-    #define CONFIG_CMD_DHCP
-    #define CONFIG_CMD_I2C
-    #define CONFIG_CMD_NAND
-    #define CONFIG_CMD_JFFS2
-#else
-    #define CONFIG_CMD_DHCP
-    #define CONFIG_CMD_I2C
-    #define CONFIG_CMD_JFFS2
-
-    #undef CONFIG_CMD_SOURCE
-#endif
-
-
-/*
- * BOOTP options
- */
-#define CONFIG_BOOTP_SUBNETMASK
-#define CONFIG_BOOTP_GATEWAY
-#define CONFIG_BOOTP_HOSTNAME
-#define CONFIG_BOOTP_BOOTPATH
-
-#define CONFIG_BOOTDELAY         3
-
-#ifdef NFS_BOOT_DEFAULTS
-#define CONFIG_BOOTARGS                 "mem=32M console=ttyS0,115200n8 noinitrd root=/dev/nfs rw nfsroot=128.247.77.158:/home/a0384864/wtbu/rootfs ip=dhcp"
-#else
-#define CONFIG_BOOTARGS          "root=/dev/ram0 rw mem=32M console=ttyS0,115200n8 initrd=0x80600000,8M ramdisk_size=8192"
-#endif
-
-#define CONFIG_NETMASK           255.255.254.0
-#define CONFIG_IPADDR            128.247.77.90
-#define CONFIG_SERVERIP          128.247.77.158
-#define CONFIG_BOOTFILE          "uImage"
-
-/*
- * Miscellaneous configurable options
- */
-#define CONFIG_SYS_LONGHELP             /* undef to save memory */
-#ifdef CONFIG_APTIX
-# define CONFIG_SYS_PROMPT             "OMAP2420 Aptix # "
-#else
-# define CONFIG_SYS_PROMPT             "OMAP242x H4 # "
-#endif
-#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        (OMAP2420_SDRC_CS0)  /* memtest works on */
-#define CONFIG_SYS_MEMTEST_END          (OMAP2420_SDRC_CS0+SZ_31M)
-
-#define CONFIG_SYS_LOAD_ADDR            (OMAP2420_SDRC_CS0) /* default load address */
-
-/* The 2420 has 12 GP timers, they can be driven by the SysClk (12/13/19.2) or by
- * 32KHz clk, or from external sig. This rate is divided by a local divisor.
- */
-#ifdef CONFIG_APTIX
-#define V_PTV                  3
-#else
-#define V_PTV                  7       /* use with 12MHz/128 */
-#endif
-
-#define CONFIG_SYS_TIMERBASE           OMAP2420_GPT2
-#define CONFIG_SYS_PTV                 V_PTV   /* 2^(PTV+1) */
-#define CONFIG_SYS_HZ                  1000
-
-/*-----------------------------------------------------------------------
- * Physical Memory Map
- */
-#define CONFIG_NR_DRAM_BANKS     2                 /* CS1 may or may not be populated */
-#define PHYS_SDRAM_1             OMAP2420_SDRC_CS0
-#define PHYS_SDRAM_1_SIZE        SZ_32M            /* at least 32 meg */
-#define PHYS_SDRAM_2             OMAP2420_SDRC_CS1
-
-#define PHYS_FLASH_SECT_SIZE     SZ_128K
-#define PHYS_FLASH_1             H4_CS0_BASE      /* Flash Bank #1 */
-#define PHYS_FLASH_SIZE_1        SZ_32M
-#define PHYS_FLASH_2             (H4_CS0_BASE+SZ_32M) /* same cs, 2 chips in series */
-#define PHYS_FLASH_SIZE_2        SZ_32M
-
-#define PHYS_SRAM              0x4020F800
-/*-----------------------------------------------------------------------
- * FLASH and environment organization
- */
-#define CONFIG_SYS_FLASH_BASE           PHYS_FLASH_1
-#define CONFIG_SYS_MAX_FLASH_BANKS      2           /* max number of memory banks */
-#define CONFIG_SYS_MAX_FLASH_SECT       (259)       /* max number of sectors on one chip */
-#define CONFIG_SYS_MONITOR_BASE        CONFIG_SYS_FLASH_BASE /* Monitor at beginning of flash */
-#define CONFIG_SYS_MONITOR_LEN         SZ_128K      /* Reserve 1 sector */
-#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE + PHYS_FLASH_SIZE_1 }
-
-#ifdef CONFIG_SYS_NAND_BOOT
-#define CONFIG_ENV_IS_IN_NAND  1
-#define CONFIG_ENV_OFFSET      0x80000 /* environment starts here  */
-#else
-#define CONFIG_ENV_ADDR             (CONFIG_SYS_FLASH_BASE + SZ_256K)
-#define        CONFIG_ENV_IS_IN_FLASH      1
-#define CONFIG_ENV_SECT_SIZE   PHYS_FLASH_SECT_SIZE
-#define CONFIG_ENV_OFFSET      ( CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN ) /* Environment after Monitor */
-#endif
-
-/*-----------------------------------------------------------------------
- * CFI FLASH driver setup
- */
-#define CONFIG_SYS_FLASH_CFI           1       /* Flash memory is CFI compliant */
-#define CONFIG_FLASH_CFI_DRIVER        1       /* Use drivers/mtd/cfi_flash.c */
-#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE 1    /* Use buffered writes (~10x faster) */
-#define CONFIG_SYS_FLASH_PROTECTION    1       /* Use hardware sector protection */
-
-/* timeout values are in ticks */
-#define CONFIG_SYS_FLASH_ERASE_TOUT     (100*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
-#define CONFIG_SYS_FLASH_WRITE_TOUT     (100*CONFIG_SYS_HZ) /* Timeout for Flash Write */
-
-#define CONFIG_SYS_JFFS2_MEM_NAND
-
-/*
- * JFFS2 partitions
- */
-/* No command line, one static partition, whole device */
-#undef CONFIG_CMD_MTDPARTS
-#define CONFIG_JFFS2_DEV               "nor1"
-#define CONFIG_JFFS2_PART_SIZE         0xFFFFFFFF
-#define CONFIG_JFFS2_PART_OFFSET       0x00000000
-
-/* mtdparts command line support */
-/* Note: fake mtd_id used, no linux mtd map file */
-/*
-#define CONFIG_CMD_MTDPARTS
-#define MTDIDS_DEFAULT         "nor1=omap2420-1"
-#define MTDPARTS_DEFAULT       "mtdparts=omap2420-1:-(jffs2)"
-*/
-
-#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
-#define CONFIG_SYS_INIT_SP_ADDR        PHYS_SRAM
-
-#endif                                                 /* __CONFIG_H */
index 376a3d031edc78fa7c12ce1ca77c3e1f0c8866f2..f9adc0170003381988e828242d0d420bbee98e3d 100644 (file)
 #endif /* (CONFIG_CMD_NET) */
 
 #define CONFIG_FPGA_COUNT      1
-#define CONFIG_FPGA          CONFIG_SYS_ALTERA_CYCLON2
+#define CONFIG_FPGA
 #define CONFIG_FPGA_ALTERA
 #define CONFIG_FPGA_CYCLON2
 #define CONFIG_SYS_FPGA_PROG_FEEDBACK
index 1fd3097d757d7c271ca5cd526e23d090058cbedc..3e5d36b21e0d552b031df9dd8ad1906d6036eeba 100644 (file)
 #define CONFIG_DISPLAY_CPUINFO         1
 #define CONFIG_DISPLAY_BOARDINFO       1
 
-/* Clock Defines */
-#define V_OSCK                 38400000        /* Clock output from T2 */
-#define V_SCLK                   V_OSCK
-
 #define CONFIG_MISC_INIT_R
 
 #define CONFIG_OF_LIBFDT               1
 #define CONFIG_BAUDRATE                        115200
 #define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600,\
                                        115200}
+
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
+
 /* I2C  */
 #define CONFIG_HARD_I2C                        1
 #define CONFIG_SYS_I2C_SPEED           100000
                "if test $board_name = sdp4430; then " \
                        "setenv fdtfile omap4-sdp.dtb; fi; " \
                "if test $board_name = panda; then " \
-                       "setenv fdtfile omap4-panda-es.dtb; fi\0" \
+                       "setenv fdtfile omap4-panda.dtb; fi;" \
+               "if test $board_name = panda-es; then " \
+                       "setenv fdtfile omap4-panda-es.dtb; fi; \0" \
        "loadfdt=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}\0" \
 
 #define CONFIG_BOOTCOMMAND \
index eacb5f5c3b7c4722b294193fee4a14a5f9bfc7a4..abf586b872a5b50133dc8a5a66c029785119c2b4 100644 (file)
@@ -66,4 +66,6 @@
 
 #define CONFIG_SYS_PROMPT              "Panda # "
 
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+
 #endif /* __CONFIG_PANDA_H */
index c21c387cba87d953f410713a22f5e74b6b5edf50..ddf2ad4fc2918307fe6489ef8788a36c057abc1d 100644 (file)
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
 
-/* Clock Defines */
-#define V_OSCK                 19200000        /* Clock output from T2 */
-#define V_SCLK V_OSCK
-
 #define CONFIG_MISC_INIT_R
 
 #define CONFIG_OF_LIBFDT
 #define CONFIG_SYS_NS16550_SERIAL
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
 #define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
-#define CONFIG_CONS_INDEX              3
-#define CONFIG_SYS_NS16550_COM3                UART3_BASE
 
-#define CONFIG_BAUDRATE                        115200
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
 
 /* I2C  */
 #define CONFIG_HARD_I2C
        "usbtty=cdc_acm\0" \
        "vram=16M\0" \
        "partitions=" PARTS_DEFAULT "\0" \
+       "optargs=\0" \
        "mmcdev=0\0" \
        "mmcroot=/dev/mmcblk0p2 rw\0" \
        "mmcrootfstype=ext4 rootwait\0" \
        "mmcargs=setenv bootargs console=${console} " \
+               "${optargs} " \
                "vram=${vram} " \
                "root=${mmcroot} " \
                "rootfstype=${mmcrootfstype}\0" \
 #define CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
 #endif
 
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_PALMAS_POWER
+#endif
+
 /* Defines for SPL */
 #define CONFIG_SPL
 #define CONFIG_SPL_FRAMEWORK
index 550cabd77cd0b04bd2aad2a559f8394095a67cc9..dea05bc911cf6970ebd8197921e72625dbed0f37 100644 (file)
 
 #include <configs/omap5_common.h>
 
-/* TWL6035 */
-#ifndef CONFIG_SPL_BUILD
-#define CONFIG_TWL6035_POWER
-#endif
+#define CONFIG_CONS_INDEX              3
+#define CONFIG_SYS_NS16550_COM3                UART3_BASE
+#define CONFIG_BAUDRATE                        115200
 
 /* MMC ENV related defines */
 #define CONFIG_ENV_IS_IN_MMC
@@ -56,4 +55,5 @@
 
 #define CONFIG_SYS_PROMPT              "OMAP5430 EVM # "
 
+#define CONFIG_OMAP_PLATFORM_RESET_TIME_MAX_USEC       16296
 #endif /* __CONFIG_OMAP5_EVM_H */
index 7ed634b701f29541e860ba8459c70b69d418fca9..2fa537291b2bb0aceb3032f30740215e211df0b0 100644 (file)
 #define CONFIG_PCIE1   /* PCIE controler 1 (slot 1) */
 #define CONFIG_PCIE2   /* PCIE controler 2 (slot 2) */
 #define CONFIG_FSL_PCI_INIT    /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_FSL_PCIE_RESET  /* need PCIe reset errata */
 #define CONFIG_SYS_PCI_64BIT   /* enable 64-bit PCI resources */
 
index d7b1ca203a693445970217ee41656e557f3e220e..a19de079b6e2c6d439ee363914b96006695af15b 100644 (file)
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI                                 /* include pci support              */
+#define        CONFIG_PCI_INDIRECT_BRIDGE 1    /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                         /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE    0x80000000  /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE */
index d0ea74e0b48dfcf06cd36283f4289b60c6f72678..2ecd1050cf688d8e865995a812c1df67f14e7288 100644 (file)
@@ -20,6 +20,7 @@
 #define __CONFIG_PCM051_H
 
 #define CONFIG_AM33XX
+#define CONFIG_OMAP
 
 #include <asm/arch/omap.h>
 
                                        + (8 * 1024 * 1024))
 
 #define CONFIG_SYS_LOAD_ADDR           0x80007fc0 /* Default load address */
-#define CONFIG_SYS_HZ                  1000 /* 1ms clock */
 
 #define CONFIG_MMC
 #define CONFIG_GENERIC_MMC
  /* Platform/Board specific defs */
 #define CONFIG_SYS_TIMERBASE           0x48040000      /* Use Timer2 */
 #define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
-#define CONFIG_SYS_HZ                  1000
+#define CONFIG_SYS_HZ                  1000    /* 1ms clock */
 
 #define CONFIG_CONS_INDEX              1
 /* NS16550 Configuration */
 #define CONFIG_SYS_NS16550
 #define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SERIAL_MULTI
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
 #define CONFIG_SYS_NS16550_CLK         (48000000)
 #define CONFIG_SYS_NS16550_COM1                0x44e09000      /* Base EVM has UART0 */
 #define CONFIG_SYS_BAUDRATE_TABLE      { 110, 300, 600, 1200, 2400, \
 4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 }
 
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
+
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* Defines for SPL */
 #define CONFIG_SPL
 #define CONFIG_SPL_FRAMEWORK
+/*
+ * Place the image at the start of the ROM defined image space.
+ * We limit our size to the ROM-defined downloaded image area, and use the
+ * rest of the space for stack.
+ */
 #define CONFIG_SPL_TEXT_BASE           0x402F0400
-#define CONFIG_SPL_MAX_SIZE            (101 * 1024)
+#define CONFIG_SPL_MAX_SIZE            (0x4030C000 - CONFIG_SPL_TEXT_BASE)
 #define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
 
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
index 351ff5a22bf0d137f2e0e85500476feef452f949..1897619058ecb8106655154c5a9ae9ad1bb4a40a 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef  CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE        0x80000000 /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE*/
index 306abcc8e1a4697266b38ef58ef58472901a628f..db95cb0c47050930ee513dbad1113c43cff3a8fb 100644 (file)
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_SYS_I2C_SLAVE           0x7F
 
+/*
+ * IIM - IC Identification Module
+ */
+#undef CONFIG_FSL_IIM
+
 /*
  * EEPROM configuration
  */
 #define CONFIG_CMD_PING
 #define CONFIG_CMD_REGINFO
 
+#undef CONFIG_CMD_FUSE
+
 #ifdef CONFIG_VIDEO
 #define CONFIG_CMD_BMP
 #endif
index b60a9ade15a130e9975cb1b957327a358779fbac..6f6ddfa20e0f03b81c70aad143b7542be6f92771 100644 (file)
 
 #define CONFIG_BOOTCOMMAND             "run flashboot"
 #define CONFIG_ROOTPATH                        "/ronetix/rootfs"
-#define CONFIG_AUTOBOOT_PROMPT         "autoboot in %d seconds\n"
+#define CONFIG_AUTOBOOT_PROMPT         "autoboot in %d seconds\n", bootdelay
 
 #define CONFIG_CON_ROT                 "fbcon=rotate:3 "
 #define CONFIG_BOOTARGS                        "root=/dev/mtdblock4 rootfstype=jffs2 "\
index 5cd660927a81626919fe19cf86a8d9f6fac48003..3f9fdd444dcbb88f8b7816729645072085fa5027 100644 (file)
  */
 
 #define        CONFIG_PCI
+#define        CONFIG_PCI_INDIRECT_BRIDGE
 #define        CONFIG_PCI_PNP
 #undef CONFIG_PCI_SCAN_SHOW
 
 #define CONFIG_SYS_FLASH_ERASE_TOUT    250000
 #define CONFIG_SYS_FLASH_WRITE_TOUT    5000
 #define CONFIG_SYS_MAX_FLASH_BANKS     1
-#define CONFIG_SYS_MAX_FLASH_SECT      19
+#define CONFIG_SYS_MAX_FLASH_SECT      128
 
 
 /*
index c18b35b0578a64e09aa43a66d86371d84779b18b..216c6cb70b92d1496f582baba0521e90c3709076 100644 (file)
@@ -61,6 +61,7 @@
 #define CONFIG_BCM2835_GPIO
 /* LCD */
 #define CONFIG_LCD
+#define CONFIG_LCD_DT_SIMPLEFB
 #define LCD_BPP                                LCD_COLOR16
 /*
  * Prevent allocation of RAM for FB; the real FB address is queried
 
 /* Device tree support for bootm/bootz */
 #define CONFIG_OF_LIBFDT
+#define CONFIG_OF_BOARD_SETUP
 /* ATAGs support for bootm/bootz */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_CMDLINE_TAG
diff --git a/include/configs/sama5d3xek.h b/include/configs/sama5d3xek.h
new file mode 100644 (file)
index 0000000..c13e983
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Configuation settings for the SAMA5D3xEK board.
+ *
+ * Copyright (C) 2012 - 2013 Atmel
+ *
+ * based on at91sam9m10g45ek.h by:
+ * Stelian Pop <stelian@popies.net>
+ * Lead Tech Design <www.leadtechdesign.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 __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/hardware.h>
+
+#define CONFIG_SYS_TEXT_BASE           0x26f00000
+
+/* ARM asynchronous clock */
+#define CONFIG_SYS_AT91_SLOW_CLOCK      32768
+#define CONFIG_SYS_AT91_MAIN_CLOCK      12000000 /* from 12 MHz crystal */
+#define CONFIG_SYS_HZ                  1000
+
+#define CONFIG_AT91FAMILY
+#define CONFIG_ARCH_CPU_INIT
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_DISPLAY_CPUINFO
+
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_OF_LIBFDT               /* Device Tree support */
+
+/* general purpose I/O */
+#define CONFIG_AT91_GPIO
+
+/* serial console */
+#define CONFIG_ATMEL_USART
+#define CONFIG_USART_BASE              ATMEL_BASE_DBGU
+#define        CONFIG_USART_ID                 ATMEL_ID_DBGU
+
+/*
+ * This needs to be defined for the OHCI code to work but it is defined as
+ * ATMEL_ID_UHPHS in the CPU specific header files.
+ */
+#define ATMEL_ID_UHP                   ATMEL_ID_UHPHS
+
+/*
+ * Specify the clock enable bit in the PMC_SCER register.
+ */
+#define ATMEL_PMC_UHP                  AT91SAM926x_PMC_UHP
+
+/* LCD */
+#define CONFIG_LCD
+#define LCD_BPP                                LCD_COLOR16
+#define LCD_OUTPUT_BPP                  24
+#define CONFIG_LCD_LOGO
+#undef LCD_TEST_PATTERN
+#define CONFIG_LCD_INFO
+#define CONFIG_LCD_INFO_BELOW_LOGO
+#define CONFIG_SYS_WHITE_ON_BLACK
+#define CONFIG_ATMEL_HLCD
+#define CONFIG_ATMEL_LCD_RGB565
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+
+/* board specific (not enough SRAM) */
+#define CONFIG_SAMA5D3_LCD_BASE                0x23E00000
+
+#define CONFIG_BOOTDELAY               3
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_BOOTFILESIZE
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_HOSTNAME
+
+/* No NOR flash */
+#define CONFIG_SYS_NO_FLASH
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+#undef CONFIG_CMD_FPGA
+#undef CONFIG_CMD_IMI
+#undef CONFIG_CMD_LOADS
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+
+/* SDRAM */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_SIZE          0x20000000
+
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_SDRAM_BASE + 4 * 1024 - GENERATED_GBL_DATA_SIZE)
+
+/* SerialFlash */
+#define CONFIG_CMD_SF
+
+#ifdef CONFIG_CMD_SF
+#define CONFIG_ATMEL_SPI
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_ATMEL
+#define CONFIG_SF_DEFAULT_SPEED                30000000
+#endif
+
+/* NAND flash */
+#define CONFIG_CMD_NAND
+
+#ifdef CONFIG_CMD_NAND
+#define CONFIG_NAND_MAX_CHIPS          1
+#define CONFIG_NAND_ATMEL
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+/* our ALE is AD21 */
+#define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
+/* our CLE is AD22 */
+#define CONFIG_SYS_NAND_MASK_CLE       (1 << 22)
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+/* PMECC & PMERRLOC */
+#define CONFIG_ATMEL_NAND_HWECC
+#define CONFIG_ATMEL_NAND_HW_PMECC
+#define CONFIG_PMECC_CAP               4
+#define CONFIG_PMECC_SECTOR_SIZE       512
+#define CONFIG_PMECC_INDEX_TABLE_OFFSET        ATMEL_PMECC_INDEX_OFFSET_512
+#define CONFIG_CMD_NAND_TRIMFFS
+#endif
+
+/* Ethernet Hardware */
+#define CONFIG_MACB
+#define CONFIG_RMII
+#define CONFIG_NET_MULTI
+#define CONFIG_NET_RETRY_COUNT         20
+#define CONFIG_MACB_SEARCH_PHY
+
+/* MMC */
+#define CONFIG_CMD_MMC
+
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_GENERIC_ATMEL_MCI
+#define ATMEL_BASE_MMCI                        ATMEL_BASE_MCI0
+#endif
+
+/* USB */
+#define CONFIG_CMD_USB
+
+#ifdef CONFIG_CMD_USB
+#define CONFIG_USB_ATMEL
+#define CONFIG_USB_OHCI_NEW
+#define CONFIG_SYS_USB_OHCI_CPU_INIT
+#define CONFIG_SYS_USB_OHCI_REGS_BASE          ATMEL_BASE_OHCI
+#define CONFIG_SYS_USB_OHCI_SLOT_NAME          "sama5d3"
+#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS     3
+#define CONFIG_DOS_PARTITION
+#define CONFIG_USB_STORAGE
+#endif
+
+#if defined(CONFIG_CMD_USB) || defined(CONFIG_CMD_MMC)
+#define CONFIG_CMD_FAT
+#endif
+
+#define CONFIG_SYS_LOAD_ADDR                   0x22000000 /* load address */
+
+#ifdef CONFIG_SYS_USE_SERIALFLASH
+/* bootstrap + u-boot + env + linux in serial flash */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET       0x5000
+#define CONFIG_ENV_SIZE         0x3000
+#define CONFIG_ENV_SECT_SIZE    0x1000
+#define CONFIG_BOOTCOMMAND      "sf probe 0; " \
+                               "sf read 0x22000000 0x42000 0x300000; " \
+                               "bootm 0x22000000"
+#elif CONFIG_SYS_USE_NANDFLASH
+/* bootstrap + u-boot + env in nandflash */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              0xc0000
+#define CONFIG_ENV_OFFSET_REDUND       0x100000
+#define CONFIG_ENV_SIZE                        0x20000
+#define CONFIG_BOOTCOMMAND     "nand read 0x21000000 0x180000 0x80000;" \
+                               "nand read 0x22000000 0x200000 0x600000;" \
+                               "bootm 0x22000000 - 0x21000000"
+#elif CONFIG_SYS_USE_MMC
+/* bootstrap + u-boot + env in sd card */
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_ENV_OFFSET      0x2000
+#define CONFIG_ENV_SIZE                0x1000
+#define CONFIG_BOOTCOMMAND     "fatload mmc 0:1 0x21000000 dtb; " \
+                               "fatload mmc 0:1 0x22000000 uImage; " \
+                               "bootm 0x22000000 - 0x21000000"
+#define CONFIG_SYS_MMC_ENV_DEV 0
+#else
+#define CONIG_ENV_IS_NOWHERE
+#endif
+
+#ifdef CONFIG_SYS_USE_MMC
+#define CONFIG_BOOTARGS                                                        \
+       "console=ttyS0,115200 earlyprintk "                             \
+       "root=/dev/mmcblk0p2 rw rootwait"
+#else
+#define CONFIG_BOOTARGS                                                        \
+       "console=ttyS0,115200 earlyprintk "                             \
+       "mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,"          \
+       "256K(env),256k(evn_redundent),256k(spare),"                    \
+       "512k(dtb),6M(kernel)ro,-(rootfs) "                             \
+       "rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
+#endif
+
+#define CONFIG_BAUDRATE                        115200
+
+#define CONFIG_SYS_PROMPT              "U-Boot> "
+#define CONFIG_SYS_CBSIZE              256
+#define CONFIG_SYS_MAXARGS             16
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_HUSH_PARSER
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (1024 * 1024)
+
+#endif
index 5abcda3c36550323ce13854317170ab26cd013a1..6e53bc2ee2eb420d8ee6b5793ad8efb843842d8a 100644 (file)
 #define PCI_HOST_AUTO          2       /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_FORCE  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 478d0d8f9d300e0950a0656e7d5242e75bc12213..fdc1b95e230034d6c680b101c2cbcf77a6b10717 100644 (file)
 
 /* PCI @ 0x80000000 */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_IBAT1L      (CONFIG_SYS_PCI1_MEM_BASE \
                                | BATL_PP_RW \
                                | BATL_MEMCOHERENCE)
index 2209ddf8238db9010cc54111d2e9da177e8c6246..148ade35685934e108c9506e85eecc69a04de246 100644 (file)
@@ -33,6 +33,7 @@
  * Top level Makefile configuration choices
  */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_PCI1
 #endif
 
index 9040ec609587674ebbccc4748087d5bdbfff9d2b..0e2d17deb508b21b19c6ff875e1b144a1421d5af 100644 (file)
@@ -64,6 +64,7 @@
 #define CONFIG_PCIE1           1       /* PCIE controler 1 (slot 1) */
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
 
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
index fb74608bb9ce89ac26cf2b434b53ef98a94f426d..9dec21de6ea136b56d0d93250a34b9995f28365f 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_FORCE  /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index dd5d7cd260222d8f6c6428b2822f2e82f98c085b..11fce53c025977ee060c2d8d35115e4165395f16 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_SYS_PCI_CACHE_LINE_SIZE 0       /* to avoid problems with PNP   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
index 25f15f2c3543b256a4ed1c831e29ffac1744614e..7a0b4819316d4668d48921acdf3577237296c3ae 100644 (file)
@@ -48,6 +48,7 @@
 #define        CONFIG_SYS_TEXT_BASE    0xfff80000
 
 #define CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 
 #define CONFIG_TSEC_ENET               /* tsec ethernet support        */
 
index c1a90a70471edf90cd82fd52451f97ba2074e98c..96d7128d0afe68ef0e56df31be243b56f7839402 100644 (file)
@@ -46,6 +46,7 @@
 #define        CONFIG_SYS_TEXT_BASE    0xFFF80000
 
 #define CONFIG_PCI                     /* PCI ethernet support */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support*/
 #undef CONFIG_ETHER_ON_FCC             /* cpm FCC ethernet support */
 #define CONFIG_ENV_OVERWRITE
index 2a731a637ba6ed32895ecef899abcec80e0e913b..ff2189c2fbc4416a29947a81ffe48ff57e6aac4b 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index b5462b7ad505eea2f0629cef8aa78fee5ae579bc..aa90249f0f9e9a04277fc230bcb7ba9d1b32c590 100644 (file)
 #ifdef CONFIG_RAMBOOT_PBL
 #define CONFIG_RAMBOOT_TEXT_BASE       CONFIG_SYS_TEXT_BASE
 #define CONFIG_RESET_VECTOR_ADDRESS    0xfffffffc
+#define CONFIG_PBLPBI_CONFIG $(SRCTREE)/board/freescale/t4qds/t4_pbi.cfg
+#define CONFIG_PBLRCW_CONFIG $(SRCTREE)/board/freescale/t4qds/t4_rcw.cfg
 #endif
 
 #define CONFIG_CMD_REGINFO
 
 /* High Level Configuration Options */
 #define CONFIG_BOOKE
-#define CONFIG_E6500
 #define CONFIG_E500                    /* BOOKE e500 family */
 #define CONFIG_E500MC                  /* BOOKE e500mc family */
 #define CONFIG_SYS_BOOK3E_HV           /* Category E.HV supported */
@@ -656,6 +657,7 @@ unsigned long get_board_ddr_clk(void);
 #endif
 
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_NET_MULTI
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play */
 #define CONFIG_E1000
index a3738b7b1d2dcafb9db2c96b566eb51ad9abed15..a43c3da4a07af826aa13b3feea256582276ef806 100644 (file)
@@ -171,6 +171,7 @@ unsigned char spi_read(void);
 #define PCI_HOST_AUTO    2             /* detected via arbiter enable */
 
 #define CONFIG_PCI                     /* include pci support         */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST        PCI_HOST_FORCE  /* select pci host function    */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play        */
                                        /* resource configuration      */
index 3046081c52efc5fd5e637f00b4cc1e946028c405..c9f1a9fa24446dc55229c7e98a59153b52129a2d 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
 #define CONFIG_EEPRO100       1                /* include PCI EEPRO100         */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
index bf186995ed4417b8f0c186e64645845ae23f8cca..6ed2fde3f365a830f04d0cd1b7201e9825a67c73 100644 (file)
 /* overrides for SPL build here */
 #ifdef CONFIG_SPL_BUILD
 
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
 /* remove devicetree support */
 #ifdef CONFIG_OF_CONTROL
 #undef CONFIG_OF_CONTROL
index c2986d83092d7c47888f4ea11476193ce1280f1b..721b29cd95c20b7f0b81ba632b9334d78abb7495 100644 (file)
@@ -74,8 +74,6 @@
 #define CONFIG_SYS_SPL_MALLOC_START    0x80090000
 #define CONFIG_SPL_STACK               0x800ffffc
 
-#define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/tegra114/u-boot-spl.lds"
-
 /* Total I2C ports on Tegra114 */
 #define TEGRA_I2C_NUM_CONTROLLERS      5
 
index 395a657584f2dc8b5736c2a08a51befb88146bc1..d5abecb46f1844a54856a9022aba9d900eb87e97 100644 (file)
@@ -88,8 +88,6 @@
 #define CONFIG_SYS_SPL_MALLOC_START    0x00090000
 #define CONFIG_SPL_STACK               0x000ffffc
 
-#define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/tegra20/u-boot-spl.lds"
-
 /* Align LCD to 1MB boundary */
 #define CONFIG_LCD_ALIGNMENT   MMU_SECTION_SIZE
 
index f6c07c6ecc755fdecfcb97b8c7afa95305fe4fea..ed36e11da647057c89366c4201b265bf3611193b 100644 (file)
@@ -87,8 +87,6 @@
 #define CONFIG_SYS_SPL_MALLOC_START    0x80090000
 #define CONFIG_SPL_STACK               0x800ffffc
 
-#define CONFIG_SPL_LDSCRIPT            "$(CPUDIR)/tegra30/u-boot-spl.lds"
-
 /* Total I2C ports on Tegra30 */
 #define TEGRA_I2C_NUM_CONTROLLERS      5
 
index 16547e33146934655e3b8de43c624140341364e0..eac5ad02434af3cc99b5cabff17bb22284a20aad 100644 (file)
@@ -19,6 +19,7 @@
 #define CONFIG_TI81XX
 #define CONFIG_TI814X
 #define CONFIG_SYS_NO_FLASH
+#define CONFIG_OMAP
 
 #include <asm/arch/omap.h>
 
 
 #define CONFIG_BAUDRATE                        115200
 
+/* CPU */
+#define CONFIG_ARCH_CPU_INIT
+
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_CONS_INDEX              1
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 /* Unsupported features */
 #undef CONFIG_USE_IRQ
 
+/* Ethernet */
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_MII
+#define CONFIG_DRIVER_TI_CPSW
+#define CONFIG_MII
+#define CONFIG_BOOTP_DEFAULT
+#define CONFIG_BOOTP_DNS
+#define CONFIG_BOOTP_DNS2
+#define CONFIG_BOOTP_SEND_HOSTNAME
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_NET_RETRY_COUNT         10
+#define CONFIG_NET_MULTI
+#define CONFIG_PHY_GIGE
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_ADDR                        1
+#define CONFIG_PHY_ET1011C
+#define CONFIG_PHY_ET1011C_TX_CLK_FIX
+
 #endif /* ! __CONFIG_TI814X_EVM_H */
diff --git a/include/configs/titanium.h b/include/configs/titanium.h
new file mode 100644 (file)
index 0000000..41e4513
--- /dev/null
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2013 Stefan Roese <sr@denx.de>
+ *
+ * Configuration settings for the ProjectionDesign / Barco
+ * Titanium board.
+ *
+ * Based on mx6qsabrelite.h which is:
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/arch/imx-regs.h>
+#include <asm/imx-common/gpio.h>
+
+#define CONFIG_MX6
+#define CONFIG_MX6Q
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define MACH_TYPE_TITANIUM             3769
+#define CONFIG_MACH_TYPE               MACH_TYPE_TITANIUM
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (2 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MISC_INIT_R
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE           UART1_BASE
+
+/* I2C Configs */
+#define CONFIG_CMD_I2C
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_MXC
+#define CONFIG_SYS_I2C_SPEED           100000
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_USDHC_NUM       1
+
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_BOUNCE_BUFFER
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NET
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE                   ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE            RGMII
+#define CONFIG_FEC_MXC_PHYADDR         4
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+#define CONFIG_PHY_MICREL_KSZ9021
+
+/* USB Configs */
+#define CONFIG_CMD_USB
+#define CONFIG_CMD_FAT
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_MX6
+#define CONFIG_USB_STORAGE
+#define CONFIG_MXC_USB_PORT    1
+#define CONFIG_MXC_USB_PORTSC  (PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS   0
+
+/* Miscellaneous commands */
+#define CONFIG_CMD_BMODE
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_BOOTDELAY               3
+
+#define CONFIG_LOADADDR                        0x12000000
+#define CONFIG_SYS_TEXT_BASE           0x17800000
+
+#define CONFIG_SYS_MEMTEST_START       0x10000000
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + (500 << 20))
+
+#define CONFIG_HOSTNAME                        titanium
+#define CONFIG_UBI_PART                        ubi
+#define CONFIG_UBIFS_VOLUME            rootfs0
+
+#define MTDIDS_DEFAULT         "nand0=gpmi-nand"
+#define MTDPARTS_DEFAULT       "mtdparts=gpmi-nand:16M(uboot),512k(env1)," \
+                               "512k(env2),-(ubi)"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "kernel=" __stringify(CONFIG_HOSTNAME) "/uImage\0"              \
+       "kernel_fs=/boot/uImage\0"                                      \
+       "kernel_addr=11000000\0"                                        \
+       "dtb=" __stringify(CONFIG_HOSTNAME) "/"                         \
+               __stringify(CONFIG_HOSTNAME) ".dtb\0"                   \
+       "dtb_fs=/boot/" __stringify(CONFIG_HOSTNAME) ".dtb\0"           \
+       "dtb_addr=12800000\0"                                           \
+       "script=boot.scr\0" \
+       "uimage=uImage\0" \
+       "console=ttymxc0\0" \
+       "baudrate=115200\0" \
+       "fdt_high=0xffffffff\0"   \
+       "initrd_high=0xffffffff\0" \
+       "mmcdev=0\0" \
+       "mmcpart=1\0" \
+       "uimage=uImage\0" \
+       "loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr}" \
+               " ${script}\0" \
+       "bootscript=echo Running bootscript from mmc ...; source\0" \
+       "loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
+       "mmcroot=/dev/mmcblk0p2\0" \
+       "mmcargs=setenv bootargs console=${console},${baudrate} " \
+               "root=${mmcroot} rootwait rw\0" \
+       "bootmmc=run mmcargs; fatload mmc ${mmcdev}:${mmcpart} ${loadaddr}" \
+               " ${uimage}; bootm\0" \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addcon=setenv bootargs ${bootargs} console=ttymxc0,"           \
+               "${baudrate}\0"                                         \
+       "addmtd=setenv bootargs ${bootargs} ${mtdparts}\0"              \
+       "rootpath=/opt/eldk-5.3/armv7a/rootfs-minimal-mtdutils\0"       \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ubifs=" __stringify(CONFIG_HOSTNAME) "/ubifs.img\0"            \
+       "part=" __stringify(CONFIG_UBI_PART) "\0"                       \
+       "boot_vol=0\0"                                                  \
+       "vol=" __stringify(CONFIG_UBIFS_VOLUME) "\0"                    \
+       "load_ubifs=tftp ${kernel_addr} ${ubifs}\0"                     \
+       "update_ubifs=ubi part ${part};ubi write ${kernel_addr} ${vol}" \
+               " ${filesize}\0"                                        \
+       "upd_ubifs=run load_ubifs update_ubifs\0"                       \
+       "init_ubi=nand erase.part ubi;ubi part ${part};"                \
+               "ubi create ${vol} c800000\0"                           \
+       "mtdids=" MTDIDS_DEFAULT "\0"                                   \
+       "mtdparts=" MTDPARTS_DEFAULT "\0"                               \
+       "nand_ubifs=run ubifs_mount ubifs_load ubifsargs addip"         \
+               " addcon addmtd;"                                       \
+               "bootm ${kernel_addr} - ${dtb_addr}\0"                  \
+       "ubifsargs=set bootargs ubi.mtd=ubi "                           \
+               "root=ubi:rootfs${boot_vol} rootfstype=ubifs\0"         \
+       "ubifs_mount=ubi part ubi;ubifsmount ubi:rootfs${boot_vol}\0"   \
+       "ubifs_load=ubifsload ${kernel_addr} ${kernel_fs};"             \
+               "ubifsload ${dtb_addr} ${dtb_fs};\0"                    \
+       "nand_ubifs=run ubifs_mount ubifs_load ubifsargs addip addcon " \
+               "addmtd;bootm ${kernel_addr} - ${dtb_addr}\0"           \
+       "load_kernel=tftp ${kernel_addr} ${kernel}\0"                   \
+       "load_dtb=tftp ${dtb_addr} ${dtb}\0"                            \
+       "net_nfs=run load_dtb load_kernel; "                            \
+               "run nfsargs addip addcon addmtd;"                      \
+               "bootm ${kernel_addr} - ${dtb_addr}\0"                  \
+       "delenv=env default -a -f; saveenv; reset\0"
+
+#define CONFIG_BOOTCOMMAND             "run nand_ubifs"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT              "Titanium > "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_CONSOLE_INFO_QUIET  /* don't print console @ startup */
+
+#define CONFIG_SYS_CBSIZE              256
+
+/* Print Buffer Size */
+#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_SYS_LOAD_ADDR           CONFIG_LOADADDR
+#define CONFIG_SYS_HZ                  1000
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM                     MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE                        (512 << 20)
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#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)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+/* Enable NAND support */
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_NAND_TRIMFFS
+#define CONFIG_CMD_TIME
+
+#ifdef CONFIG_CMD_NAND
+
+/* NAND stuff */
+#define CONFIG_NAND_MXS
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           0x40000000
+#define CONFIG_SYS_NAND_5_ADDR_CYCLE
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* DMA stuff, needed for GPMI/MXS NAND support */
+#define CONFIG_APBH_DMA
+#define CONFIG_APBH_DMA_BURST
+#define CONFIG_APBH_DMA_BURST8
+
+/* Environment in NAND */
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              (16 << 20)
+#define CONFIG_ENV_SECT_SIZE           (128 << 10)
+#define CONFIG_ENV_SIZE                        CONFIG_ENV_SECT_SIZE
+#define CONFIG_ENV_OFFSET_REDUND       (CONFIG_ENV_OFFSET + (512 << 10))
+#define CONFIG_ENV_SIZE_REDUND         CONFIG_ENV_SIZE
+
+#else /* CONFIG_CMD_NAND */
+
+/* Environment in MMC */
+#define CONFIG_ENV_SIZE                        (8 << 10)
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_ENV_OFFSET              (6 * 64 * 1024)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+
+#endif /* CONFIG_CMD_NAND */
+
+/* UBI/UBIFS config options */
+#define CONFIG_LZO
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_RBTREE
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+
+#endif                        /* __CONFIG_H */
index d6371fce4d044418f12e3377c0c0d5c8bdb2227d..cabc06e5ba6e919442b7b13687320415b82853cb 100644 (file)
@@ -82,8 +82,8 @@
 #define CONFIG_SYS_NAND_CS             2
 #define CONFIG_SYS_NAND_USE_FLASH_BBT
 #define CONFIG_SYS_NAND_BASE           TNETV107X_ASYNC_EMIF_DATA_CE0_BASE
-#define CONFIG_SYS_CLE_MASK            0x10
-#define CONFIG_SYS_ALE_MASK            0x8
+#define CONFIG_SYS_NAND_MASK_CLE               0x10
+#define CONFIG_SYS_NAND_MASK_ALE               0x8
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
 #define CONFIG_MTD_PARTITIONS
 #define CONFIG_CMD_MTDPARTS
index 66568c8d004b63bc52d4df7dadae752184585238..60d1503bc3190bdda62ab8f8a1cccefd270cd9d0 100644 (file)
@@ -139,6 +139,7 @@ protect on ${u-boot_startaddr} ${u-boot_endaddr}"
  *-----------------------------------------------------------------------
  */
 #define CONFIG_PCI                             /* include pci support          */
+#define        CONFIG_PCI_INDIRECT_BRIDGE 1    /* indirect PCI bridge support */
 #undef CONFIG_PCI_PNP
 #define CONFIG_PCI_SCAN_SHOW
 #define CONFIG_EEPRO100
index d3b8379186390058a2a60caddb49ed4d9afda08b..7b1130a48e2d52fb709a3e76a182690f5963dc9b 100644 (file)
@@ -43,6 +43,7 @@
 #endif
 
 #define CONFIG_PCI             1
+#define CONFIG_PCI_INDIRECT_BRIDGE 1
 #define CONFIG_FSL_ELBC                1
 
 #define CONFIG_BOARD_EARLY_INIT_F      1
diff --git a/include/configs/vexpress_ca15_tc2.h b/include/configs/vexpress_ca15_tc2.h
new file mode 100644 (file)
index 0000000..9e230ad
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * (C) Copyright 2013 Linaro
+ * Andre Przywara, <andre.przywara@linaro.org>
+ *
+ * Configuration for Versatile Express. Parts were derived from other ARM
+ *   configurations.
+ *
+ * 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 __VEXPRESS_CA15X2_TC2_h
+#define __VEXPRESS_CA15X2_TC2_h
+
+#define CONFIG_VEXPRESS_EXTENDED_MEMORY_MAP
+#include "vexpress_common.h"
+#define CONFIG_BOOTP_VCI_STRING     "U-boot.armv7.vexpress_ca15x2_tc2"
+
+#define CONFIG_SYS_CLK_FREQ 24000000
+
+#endif
diff --git a/include/configs/vexpress_ca5x2.h b/include/configs/vexpress_ca5x2.h
new file mode 100644 (file)
index 0000000..9331134
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * (C) Copyright 2011 Linaro
+ * Ryan Harkin, <ryan.harkin@linaro.org>
+ *
+ * Configuration for Versatile Express. Parts were derived from other ARM
+ *   configurations.
+ *
+ * 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 __VEXPRESS_CA5X2_h
+#define __VEXPRESS_CA5X2_h
+
+#define CONFIG_VEXPRESS_EXTENDED_MEMORY_MAP
+#include "vexpress_common.h"
+#define CONFIG_BOOTP_VCI_STRING     "U-boot.armv7.vexpress_ca5x2"
+
+#endif /* __VEXPRESS_CA5X2_h */
diff --git a/include/configs/vexpress_ca9x4.h b/include/configs/vexpress_ca9x4.h
new file mode 100644 (file)
index 0000000..c3b6986
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * (C) Copyright 2011 Linaro
+ * Ryan Harkin, <ryan.harkin@linaro.org>
+ *
+ * Configuration for Versatile Express. Parts were derived from other ARM
+ *   configurations.
+ *
+ * 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 __VEXPRESS_CA9X4_H
+#define __VEXPRESS_CA9X4_H
+
+#define CONFIG_VEXPRESS_ORIGINAL_MEMORY_MAP
+#include "vexpress_common.h"
+#define CONFIG_BOOTP_VCI_STRING     "U-boot.armv7.vexpress_ca9x4"
+
+#endif /* VEXPRESS_CA9X4_H */
similarity index 56%
rename from include/configs/ca9x4_ct_vxp.h
rename to include/configs/vexpress_common.h
index a7cd1d45ad1051074ddd1fac153a4bac71244bb7..3c5683aaaab1aa35866b87540bc942c42c8cb8ca 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * (C) Copyright 2011 ARM Limited
  * (C) Copyright 2010 Linaro
  * Matt Waddel, <matt.waddel@linaro.org>
  *
  * MA 02111-1307 USA
  */
 
-#ifndef __CONFIG_H
-#define __CONFIG_H
+#ifndef __VEXPRESS_COMMON_H
+#define __VEXPRESS_COMMON_H
+
+/*
+ * Definitions copied from linux kernel:
+ * arch/arm/mach-vexpress/include/mach/motherboard.h
+ */
+#ifdef CONFIG_VEXPRESS_ORIGINAL_MEMORY_MAP
+/* CS register bases for the original memory map. */
+#define V2M_PA_CS0             0x40000000
+#define V2M_PA_CS1             0x44000000
+#define V2M_PA_CS2             0x48000000
+#define V2M_PA_CS3             0x4c000000
+#define V2M_PA_CS7             0x10000000
+
+#define V2M_PERIPH_OFFSET(x)   (x << 12)
+#define V2M_SYSREGS            (V2M_PA_CS7 + V2M_PERIPH_OFFSET(0))
+#define V2M_SYSCTL             (V2M_PA_CS7 + V2M_PERIPH_OFFSET(1))
+#define V2M_SERIAL_BUS_PCI     (V2M_PA_CS7 + V2M_PERIPH_OFFSET(2))
+
+#define V2M_BASE               0x60000000
+#define CONFIG_SYS_TEXT_BASE   0x60800000
+#elif defined(CONFIG_VEXPRESS_EXTENDED_MEMORY_MAP)
+/* CS register bases for the extended memory map. */
+#define V2M_PA_CS0             0x08000000
+#define V2M_PA_CS1             0x0c000000
+#define V2M_PA_CS2             0x14000000
+#define V2M_PA_CS3             0x18000000
+#define V2M_PA_CS7             0x1c000000
+
+#define V2M_PERIPH_OFFSET(x)   (x << 16)
+#define V2M_SYSREGS            (V2M_PA_CS7 + V2M_PERIPH_OFFSET(1))
+#define V2M_SYSCTL             (V2M_PA_CS7 + V2M_PERIPH_OFFSET(2))
+#define V2M_SERIAL_BUS_PCI     (V2M_PA_CS7 + V2M_PERIPH_OFFSET(3))
+
+#define V2M_BASE               0x80000000
+#define CONFIG_SYS_TEXT_BASE   0x80800000
+#endif
+
+/*
+ * Physical addresses, offset from V2M_PA_CS0-3
+ */
+#define V2M_NOR0               (V2M_PA_CS0)
+#define V2M_NOR1               (V2M_PA_CS1)
+#define V2M_SRAM               (V2M_PA_CS2)
+#define V2M_VIDEO_SRAM         (V2M_PA_CS3 + 0x00000000)
+#define V2M_LAN9118            (V2M_PA_CS3 + 0x02000000)
+#define V2M_ISP1761            (V2M_PA_CS3 + 0x03000000)
+
+/* Common peripherals relative to CS7. */
+#define V2M_AACI               (V2M_PA_CS7 + V2M_PERIPH_OFFSET(4))
+#define V2M_MMCI               (V2M_PA_CS7 + V2M_PERIPH_OFFSET(5))
+#define V2M_KMI0               (V2M_PA_CS7 + V2M_PERIPH_OFFSET(6))
+#define V2M_KMI1               (V2M_PA_CS7 + V2M_PERIPH_OFFSET(7))
+
+#define V2M_UART0              (V2M_PA_CS7 + V2M_PERIPH_OFFSET(9))
+#define V2M_UART1              (V2M_PA_CS7 + V2M_PERIPH_OFFSET(10))
+#define V2M_UART2              (V2M_PA_CS7 + V2M_PERIPH_OFFSET(11))
+#define V2M_UART3              (V2M_PA_CS7 + V2M_PERIPH_OFFSET(12))
+
+#define V2M_WDT                        (V2M_PA_CS7 + V2M_PERIPH_OFFSET(15))
+
+#define V2M_TIMER01            (V2M_PA_CS7 + V2M_PERIPH_OFFSET(17))
+#define V2M_TIMER23            (V2M_PA_CS7 + V2M_PERIPH_OFFSET(18))
+
+#define V2M_SERIAL_BUS_DVI     (V2M_PA_CS7 + V2M_PERIPH_OFFSET(22))
+#define V2M_RTC                        (V2M_PA_CS7 + V2M_PERIPH_OFFSET(23))
+
+#define V2M_CF                 (V2M_PA_CS7 + V2M_PERIPH_OFFSET(26))
+
+#define V2M_CLCD               (V2M_PA_CS7 + V2M_PERIPH_OFFSET(31))
+#define V2M_SIZE_CS7           V2M_PERIPH_OFFSET(32)
+
+/* System register offsets. */
+#define V2M_SYS_CFGDATA                (V2M_SYSREGS + 0x0a0)
+#define V2M_SYS_CFGCTRL                (V2M_SYSREGS + 0x0a4)
+#define V2M_SYS_CFGSTAT                (V2M_SYSREGS + 0x0a8)
+
+/*
+ * Configuration
+ */
+#define SYS_CFG_START          (1 << 31)
+#define SYS_CFG_WRITE          (1 << 30)
+#define SYS_CFG_OSC            (1 << 20)
+#define SYS_CFG_VOLT           (2 << 20)
+#define SYS_CFG_AMP            (3 << 20)
+#define SYS_CFG_TEMP           (4 << 20)
+#define SYS_CFG_RESET          (5 << 20)
+#define SYS_CFG_SCC            (6 << 20)
+#define SYS_CFG_MUXFPGA                (7 << 20)
+#define SYS_CFG_SHUTDOWN       (8 << 20)
+#define SYS_CFG_REBOOT         (9 << 20)
+#define SYS_CFG_DVIMODE                (11 << 20)
+#define SYS_CFG_POWER          (12 << 20)
+#define SYS_CFG_SITE_MB                (0 << 16)
+#define SYS_CFG_SITE_DB1       (1 << 16)
+#define SYS_CFG_SITE_DB2       (2 << 16)
+#define SYS_CFG_STACK(n)       ((n) << 12)
+
+#define SYS_CFG_ERR            (1 << 1)
+#define SYS_CFG_COMPLETE       (1 << 0)
 
 /* Board info register */
-#define SYS_ID                         0x10000000
+#define SYS_ID                         V2M_SYSREGS
 #define CONFIG_REVISION_TAG            1
-#define CONFIG_SYS_TEXT_BASE           0x60800000
 
-#define CONFIG_SYS_MEMTEST_START       0x60000000
+#define CONFIG_SYS_MEMTEST_START       V2M_BASE
 #define CONFIG_SYS_MEMTEST_END         0x20000000
 #define CONFIG_SYS_HZ                  1000
 
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 128 * 1024)
 
-#define SCTL_BASE                      0x10001000
+#define SCTL_BASE                      V2M_SYSCTL
 #define VEXPRESS_FLASHPROG_FLVPPEN     (1 << 0)
 
 /* SMSC9115 Ethernet from SMSC9118 family */
 #define CONFIG_SMC911X                 1
 #define CONFIG_SMC911X_32_BIT          1
-#define CONFIG_SMC911X_BASE            0x4E000000
+#define CONFIG_SMC911X_BASE            V2M_LAN9118
 
 /* PL011 Serial Configuration */
 #define CONFIG_PL011_SERIAL
 #define CONFIG_CONS_INDEX              0
 
 #define CONFIG_BAUDRATE                        38400
-#define CONFIG_SYS_SERIAL0             0x10009000
-#define CONFIG_SYS_SERIAL1             0x1000A000
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+#define CONFIG_SYS_SERIAL0             V2M_UART0
+#define CONFIG_SYS_SERIAL1             V2M_UART1
 
 /* Command line configuration */
 #define CONFIG_CMD_BDI
 #define CONFIG_CMD_PING
 #define CONFIG_CMD_SAVEENV
 #define CONFIG_CMD_RUN
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_SUPPORT_RAW_INITRD
 
 #define CONFIG_CMD_FAT
 #define CONFIG_DOS_PARTITION           1
 #define CONFIG_CMD_MMC
 #define CONFIG_GENERIC_MMC
 #define CONFIG_ARM_PL180_MMCI
-#define CONFIG_ARM_PL180_MMCI_BASE     0x10005000
+#define CONFIG_ARM_PL180_MMCI_BASE     V2M_MMCI
 #define CONFIG_SYS_MMC_MAX_BLK_COUNT   127
 #define CONFIG_ARM_PL180_MMCI_CLOCK_FREQ 6250000
 
 #define CONFIG_BOOTP_HOSTNAME
 #define CONFIG_BOOTP_PXE
 #define CONFIG_BOOTP_PXE_CLIENTARCH    0x100
-#define CONFIG_BOOTP_VCI_STRING                "U-boot.armv7.ca9x4_ct_vxp"
 
 /* Miscellaneous configurable options */
 #undef CONFIG_SYS_CLKS_IN_HZ
-#define CONFIG_SYS_LOAD_ADDR           0x60008000      /* load address */
-#define LINUX_BOOT_PARAM_ADDR          0x60000200
+#define CONFIG_SYS_LOAD_ADDR           (V2M_BASE + 0x8000)
+#define LINUX_BOOT_PARAM_ADDR          (V2M_BASE + 0x2000)
 #define CONFIG_BOOTDELAY               2
 
 /* Physical Memory Map */
 #define CONFIG_NR_DRAM_BANKS           2
-#define PHYS_SDRAM_1                   0x60000000      /* SDRAM Bank #1 */
-#define PHYS_SDRAM_2                   0x80000000      /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1                   (V2M_BASE)      /* SDRAM Bank #1 */
+#define PHYS_SDRAM_2                   (((unsigned int)V2M_BASE) + \
+                                       ((unsigned int)0x20000000))
 #define PHYS_SDRAM_1_SIZE              0x20000000      /* 512 MB */
 #define PHYS_SDRAM_2_SIZE              0x20000000      /* 512 MB */
 
 
 /* Basic environment settings */
 #define CONFIG_BOOTCOMMAND             "run bootflash;"
-#define CONFIG_EXTRA_ENV_SETTINGS \
+#ifdef CONFIG_VEXPRESS_ORIGINAL_MEMORY_MAP
+#define CONFIG_PLATFORM_ENV_SETTINGS \
                "loadaddr=0x80008000\0" \
                "ramdisk_addr_r=0x61000000\0" \
                "kernel_addr=0x44100000\0" \
                "ramdisk_addr=0x44800000\0" \
                "maxramdisk=0x1800000\0" \
                "pxefile_addr_r=0x88000000\0" \
-               "kernel_addr_r=0x80008000\0" \
+               "kernel_addr_r=0x80008000\0"
+#elif defined(CONFIG_VEXPRESS_EXTENDED_MEMORY_MAP)
+#define CONFIG_PLATFORM_ENV_SETTINGS \
+               "loadaddr=0xa0008000\0" \
+               "ramdisk_addr_r=0x81000000\0" \
+               "kernel_addr=0x0c100000\0" \
+               "ramdisk_addr=0x0c800000\0" \
+               "maxramdisk=0x1800000\0" \
+               "pxefile_addr_r=0xa8000000\0" \
+               "kernel_addr_r=0xa0008000\0"
+#endif
+#define CONFIG_EXTRA_ENV_SETTINGS \
+               CONFIG_PLATFORM_ENV_SETTINGS \
                "console=ttyAMA0,38400n8\0" \
                "dram=1024M\0" \
                "root=/dev/sda1 rw\0" \
 #define CONFIG_FLASH_CFI_DRIVER                1
 #define CONFIG_SYS_FLASH_SIZE          0x04000000
 #define CONFIG_SYS_MAX_FLASH_BANKS     2
-#define CONFIG_SYS_FLASH_BASE0         0x40000000
-#define CONFIG_SYS_FLASH_BASE1         0x44000000
+#define CONFIG_SYS_FLASH_BASE0         V2M_NOR0
+#define CONFIG_SYS_FLASH_BASE1         V2M_NOR1
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE0
 
 /* Timeout values in ticks */
 #define CONFIG_SYS_PROMPT              "VExpress# "
 #define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
                                        sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_HUSH_PARSER
+
 #define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE /* Boot args buffer */
 #define CONFIG_CMD_SOURCE
 #define CONFIG_SYS_LONGHELP
 #define CONFIG_CMDLINE_EDITING         1
 #define CONFIG_SYS_MAXARGS             16      /* max command args */
 
-#endif
+#endif /* VEXPRESS_COMMON_H */
diff --git a/include/configs/vf610twr.h b/include/configs/vf610twr.h
new file mode 100644 (file)
index 0000000..77fe893
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the Freescale Vybrid vf610twr 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/arch/imx-regs.h>
+#include <config_cmd_default.h>
+
+#define CONFIG_VF610
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_MACH_TYPE               4146
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+/* Enable passing of ATAGs */
+#define CONFIG_CMDLINE_TAG
+
+#define CONFIG_CMD_FUSE
+#ifdef CONFIG_CMD_FUSE
+#define CONFIG_MXC_OCOTP
+#endif
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_FSL_LPUART
+#define LPUART_BASE                    UART1_BASE
+
+/* Allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SYS_UART_PORT           (1)
+#define CONFIG_BAUDRATE                        115200
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_ESDHC_NUM       1
+
+#define CONFIG_SYS_FSL_ERRATUM_ESDHC111
+
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NET
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE                   ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE            RMII
+#define CONFIG_FEC_MXC_PHYADDR          0
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+
+#define CONFIG_BOOTDELAY               3
+
+#define CONFIG_SYS_TEXT_BASE           0x3f008000
+
+/* 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              "Vybrid U-Boot > "
+#undef CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE              256     /* Console I/O 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
+
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START       0x80010000
+#define CONFIG_SYS_MEMTEST_END         0x87C00000
+
+#define CONFIG_SYS_LOAD_ADDR           0x80010000
+
+#define CONFIG_SYS_HZ                  1000
+
+/*
+ * Stack sizes
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE               (128 * 1024)    /* regular stack */
+
+/* Physical memory map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM                     (0x80000000)
+#define PHYS_SDRAM_SIZE                        (128 * 1024 * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#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)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_IS_IN_MMC
+
+#define CONFIG_ENV_OFFSET              (12 * 64 * 1024)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#endif
index 61e02e6077aaee1a67ba3ca626848f4ebf366801..f97de5490bb6b4e74d0e089b210d5144aa413e96 100644 (file)
 
 /* PCI @ 0x80000000 */
 #ifdef CONFIG_PCI
+#define CONFIG_PCI_INDIRECT_BRIDGE
 #define CONFIG_SYS_IBAT1L      (CONFIG_SYS_PCI1_MEM_BASE | BATL_PP_RW | \
                                 BATL_MEMCOHERENCE)
 #define CONFIG_SYS_IBAT1U      (CONFIG_SYS_PCI1_MEM_BASE | BATU_BL_256M | \
index d10f74843d26c01665a7f19a84a8e4628d94e1e0..219f276a4c57e37d2b874b56072f46ed0edc186e 100644 (file)
 #define PCI_HOST_AUTO  2               /* detected via arbiter enable  */
 
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function     */
 #define CONFIG_PCI_PNP                 /* do pci plug-and-play         */
                                        /* resource configuration       */
index 120e3f6ffd00a1531dba7c9a115be46fac884f80..5593f1c533a69090ec5be75600ea491920ec498f 100644 (file)
 #define CONFIG_REVISION_TAG
 
 /* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN          (3 * SZ_1M)
+#define CONFIG_SYS_MALLOC_LEN          (10 * SZ_1M)
 
 #define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_LATE_INIT
 #define CONFIG_MXC_GPIO
 
 #define CONFIG_MXC_UART
@@ -47,6 +48,9 @@
 
 #undef CONFIG_CMD_IMLS
 
+#define CONFIG_CMD_BMODE
+#define CONFIG_CMD_SETEXPR
+
 #define CONFIG_BOOTDELAY               5
 
 #define CONFIG_SYS_MEMTEST_START       0x10000000
@@ -57,6 +61,7 @@
 /* MMC Configuration */
 #define CONFIG_FSL_ESDHC
 #define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_USDHC_NUM       2
 #define CONFIG_SYS_FSL_ESDHC_ADDR      0
 
 #define CONFIG_MMC
 #define CONFIG_PHYLIB
 #define CONFIG_PHY_ATHEROS
 
+/* Framebuffer */
+#define CONFIG_VIDEO
+#define CONFIG_VIDEO_IPUV3
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SCREEN_ALIGN
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_VIDEO_BMP_LOGO
+#define CONFIG_IPUV3_CLK 260000000
+
 #if defined(CONFIG_MX6DL)
 #define CONFIG_DEFAULT_FDT_FILE                "imx6dl-wandboard.dtb"
 #elif defined(CONFIG_MX6S)
        "fdt_addr=0x11000000\0" \
        "boot_fdt=try\0" \
        "ip_dyn=yes\0" \
-       "mmcdev=0\0" \
+       "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
        "mmcpart=2\0" \
        "mmcroot=/dev/mmcblk0p3 rootwait rw\0" \
+       "update_sd_firmware_filename=u-boot.imx\0" \
+       "update_sd_firmware=" \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "if mmc dev ${mmcdev}; then "   \
+                       "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+                               "setexpr fw_sz ${filesize} / 0x200; " \
+                               "setexpr fw_sz ${fw_sz} + 1; "  \
+                               "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+                       "fi; "  \
+               "fi\0" \
        "mmcargs=setenv bootargs console=${console},${baudrate} " \
                "root=${mmcroot}\0" \
        "loadbootscript=" \
index 506d646fec98696e4665bdf59439be87b22e793a..1f48cc57724ef71822bee78103b76627de98037c 100644 (file)
@@ -167,6 +167,7 @@ extern void out32(unsigned int, unsigned long);
  */
 /* General PCI */
 #define CONFIG_PCI                             /* include pci support */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP                         /* do pci plug-and-play */
 #define CONFIG_PCI_SCAN_SHOW                   /* show pci devices on startup */
 #define CONFIG_SYS_PCI_TARGBASE        0x80000000      /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE */
index 1851a00c16202485c01c972213267851493d5da7..f28f443fe926d4afa34d31c143ac96b8ad76b84a 100644 (file)
@@ -49,6 +49,7 @@
 #define CONFIG_PCIE1           1       /* PCIE controler 1 */
 #define CONFIG_PCIE2           1       /* PCIE controler 2 */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
 
index ff99481b2f8d8c48ff562c66da67b2c1acc985f3..3034a3c9a9f1c72d06695c7174ba3019a50bb8fe 100644 (file)
@@ -48,6 +48,7 @@
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup */
 #define CONFIG_PCI1            1       /* PCI controller 1 */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
 
index 46f1c903f1356e617ee2572fc219b6d2eb18ba14..43359a2eefc68b95d90ddd1bbda75104c50b142c 100644 (file)
@@ -49,6 +49,7 @@
 #define CONFIG_PCIE1           1       /* PCIE controler 1 */
 #define CONFIG_PCIE2           1       /* PCIE controler 2 */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
index 2acf6c80a5eee260f9e75691b04e0284d8513c16..a1710853548087913a825982ec2306500ed4d442 100644 (file)
@@ -48,6 +48,7 @@
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup */
 #define CONFIG_PCIE1           1       /* PCIE controler 1 (PEX8112 or XMC) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_PCI_INDIRECT_BRIDGE 1   /* indirect PCI bridge support */
 #define CONFIG_SYS_PCI_64BIT   1       /* enable 64-bit PCI resources */
 #define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code */
index 0cbef6f85f77eb47e8827213076e30ca2ebbb5e5..cde0df1a08f9bab9b560e7ab8fe7358db42c818c 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #undef  CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
 #define CONFIG_SYS_PCI_TARGBASE        0x80000000 /* PCIaddr mapped to CONFIG_SYS_PCI_MEMBASE*/
index fb684b5e106f039865475937ce1dfd444509af20..3282d378d7de0a837ecfdb0b486455fd4e15dc01 100644 (file)
  */
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
 #define CONFIG_PCI_PNP         1       /* do pci plug-and-play         */
 #define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup  */
 #define CONFIG_PCI_CONFIG_HOST_BRIDGE
index 2989e723e04c6f5633aa80d978570a553096e06b..38f04f642b93197c3135cd094b714907e516c8a6 100644 (file)
 #define CONFIG_ZYNQ_SERIAL_BAUDRATE0   CONFIG_BAUDRATE
 #define CONFIG_ZYNQ_SERIAL_CLOCK0      50000000
 
-/* SCU timer address is hardcoded */
-#define CONFIG_SCUTIMER_BASEADDR       0xF8F00600
-
 /* Ethernet driver */
 #define CONFIG_NET_MULTI
 #define CONFIG_ZYNQ_GEM
-#define CONFIG_ZYNQ_GEM_BASEADDR0      0xE000B000
+#define CONFIG_ZYNQ_GEM0
+#define CONFIG_ZYNQ_GEM_PHY_ADDR0      7
+
+#define CONFIG_ZYNQ_SDHCI
+#define CONFIG_ZYNQ_SDHCI0
+
+/* MMC */
+#if defined(CONFIG_ZYNQ_SDHCI0) || defined(CONFIG_ZYNQ_SDHCI1)
+# define CONFIG_MMC
+# define CONFIG_GENERIC_MMC
+# define CONFIG_SDHCI
+# define CONFIG_ZYNQ_SDHCI
+# define CONFIG_CMD_MMC
+# define CONFIG_CMD_FAT
+# define CONFIG_SUPPORT_VFAT
+# define CONFIG_CMD_EXT2
+# define CONFIG_DOS_PARTITION
+#endif
+
+#define CONFIG_ZYNQ_I2C0
+
+/* I2C */
+#if defined(CONFIG_ZYNQ_I2C0) || defined(CONFIG_ZYNQ_I2C1)
+# define CONFIG_CMD_I2C
+# define CONFIG_ZYNQ_I2C
+# define CONFIG_HARD_I2C
+# define CONFIG_SYS_I2C_SPEED          100000
+# define CONFIG_SYS_I2C_SLAVE          1
+#endif
 
 #if defined(CONFIG_ZYNQ_DCC)
 # define CONFIG_ARM_DCC
 # define CONFIG_CPU_V6 /* Required by CONFIG_ARM_DCC */
 #endif
 
+/* Enable the PL to be downloaded */
+#define CONFIG_FPGA
+#define CONFIG_FPGA_XILINX
+#define CONFIG_FPGA_ZYNQPL
+#define CONFIG_CMD_FPGA
+
 #define CONFIG_BOOTP_SERVERIP
 #define CONFIG_BOOTP_BOOTPATH
 #define CONFIG_BOOTP_GATEWAY
index 4e8032ba6cdfd4632ff5bec1a25b793c7defe4ce..1ece6122f5dfa1e0db21b2e4809267b780db1678 100644 (file)
@@ -93,6 +93,7 @@ enum fdt_compat_id {
        COMPAT_GENERIC_SPI_FLASH,       /* Generic SPI Flash chip */
        COMPAT_MAXIM_98095_CODEC,       /* MAX98095 Codec */
        COMPAT_INFINEON_SLB9635_TPM,    /* Infineon SLB9635 TPM */
+       COMPAT_INFINEON_SLB9645_TPM,    /* Infineon SLB9645 TPM */
 
        COMPAT_COUNT,
 };
index 30a4e6a2e8540558d87ed60d22183763a34b2795..38e9018c939b4872b16e69493ffc00f1d1b85da3 100644 (file)
 #define CONFIG_MAX_FPGA_DEVICES                5
 #endif
 
-/* CONFIG_FPGA bit assignments */
-#define CONFIG_SYS_FPGA_MAN(x)         (x)
-#define CONFIG_SYS_FPGA_DEV(x)         ((x) << 8 )
-#define CONFIG_SYS_FPGA_IF(x)          ((x) << 16 )
-
-/* FPGA Manufacturer bits in CONFIG_FPGA */
-#define CONFIG_SYS_FPGA_XILINX         CONFIG_SYS_FPGA_MAN( 0x1 )
-#define CONFIG_SYS_FPGA_ALTERA         CONFIG_SYS_FPGA_MAN( 0x2 )
-
-
 /* fpga_xxxx function return value definitions */
 #define FPGA_SUCCESS           0
 #define FPGA_FAIL              -1
@@ -68,7 +58,10 @@ extern void fpga_init(void);
 extern int fpga_add(fpga_type devtype, void *desc);
 extern int fpga_count(void);
 extern int fpga_load(int devnum, const void *buf, size_t bsize);
+extern int fpga_loadbitstream(int devnum, char *fpgadata, size_t size);
 extern int fpga_dump(int devnum, const void *buf, size_t bsize);
 extern int fpga_info(int devnum);
+extern const fpga_desc *const fpga_validate(int devnum, const void *buf,
+                                           size_t bsize, char *fn);
 
 #endif /* _FPGA_H_ */
similarity index 55%
rename from include/twl6035.h
rename to include/fuse.h
index ce74348d443727159d81617d59d7a1b3f994e3e6..b964137409181406027073bf71cf4b83c0e4c83e 100644 (file)
@@ -1,6 +1,10 @@
 /*
- * (C) Copyright 2012
- * Texas Instruments, <www.ti.com>
+ * (C) Copyright 2009-2013 ADVANSEE
+ * Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
+ *
+ * Based on the mpc512x iim code:
+ * Copyright 2008 Silicon Turnkey Express, Inc.
+ * Martha Marx <mmarx@silicontkx.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  * 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
+#ifndef _FUSE_H_
+#define _FUSE_H_
 
-/* Bit field definitions for LDOx_CTRL */
-#define LDO_ON                 (1 << 4)
-#define LDO_MODE_SLEEP         (1 << 2)
-#define LDO_MODE_ACTIVE                (1 << 0)
+/*
+ * Read/Sense/Program/Override interface:
+ *   bank:    Fuse bank
+ *   word:    Fuse word within the bank
+ *   val:     Value to read/write
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+int fuse_read(u32 bank, u32 word, u32 *val);
+int fuse_sense(u32 bank, u32 word, u32 *val);
+int fuse_prog(u32 bank, u32 word, u32 val);
+int fuse_override(u32 bank, u32 word, u32 val);
 
-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);
-int twl6035_mmc1_poweron_ldo(void);
+#endif /* _FUSE_H_ */
index b8cc5236a819b2ad6b89bab1e16ae7c1b2e6133f..8ccc00b76a13c71a46a380459c9220fc3f9aeb89 100644 (file)
@@ -402,6 +402,13 @@ void genimg_print_size(uint32_t size);
 #endif
 void genimg_print_time(time_t timestamp);
 
+/* What to do with a image load address ('load = <> 'in the FIT) */
+enum fit_load_op {
+       FIT_LOAD_IGNORED,       /* Ignore load address */
+       FIT_LOAD_OPTIONAL,      /* Can be provided, but optional */
+       FIT_LOAD_REQUIRED,      /* Must be provided */
+};
+
 #ifndef USE_HOSTCC
 /* Image format types, returned by _get_format() routine */
 #define IMAGE_FORMAT_INVALID   0x00
@@ -415,8 +422,71 @@ ulong genimg_get_image(ulong img_addr);
 int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                uint8_t arch, ulong *rd_start, ulong *rd_end);
 
-int boot_get_fdt(int flag, int argc, char * const argv[],
-               bootm_headers_t *images, char **of_flat_tree, ulong *of_size);
+/**
+ * fit_image_load() - load an image from a FIT
+ *
+ * This deals with all aspects of loading an image from a FIT, including
+ * selecting the right image based on configuration, verifying it, printing
+ * out progress messages, checking the type/arch/os and optionally copying it
+ * to the right load address.
+ *
+ * @param images       Boot images structure
+ * @param prop_name    Property name to look up (FIT_..._PROP)
+ * @param addr         Address of FIT in memory
+ * @param fit_unamep   On entry this is the requested image name
+ *                     (e.g. "kernel@1") or NULL to use the default. On exit
+ *                     points to the selected image name
+ * @param fit_uname_config     Requested configuration name, or NULL for the
+ *                     default
+ * @param arch         Expected architecture (IH_ARCH_...)
+ * @param image_type   Required image type (IH_TYPE_...). If this is
+ *                     IH_TYPE_KERNEL then we allow IH_TYPE_KERNEL_NOLOAD
+ *                     also.
+ * @param bootstage_id ID of starting bootstage to use for progress updates.
+ *                     This will be added to the BOOTSTAGE_SUB values when
+ *                     calling bootstage_mark()
+ * @param load_op      Decribes what to do with the load address
+ * @param datap                Returns address of loaded image
+ * @param lenp         Returns length of loaded image
+ */
+int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
+                  const char **fit_unamep, const char *fit_uname_config,
+                  int arch, int image_type, int bootstage_id,
+                  enum fit_load_op load_op, ulong *datap, ulong *lenp);
+
+/**
+ * fit_get_node_from_config() - Look up an image a FIT by type
+ *
+ * This looks in the selected conf@ node (images->fit_uname_cfg) for a
+ * particular image type (e.g. "kernel") and then finds the image that is
+ * referred to.
+ *
+ * For example, for something like:
+ *
+ * images {
+ *     kernel@1 {
+ *             ...
+ *     };
+ * };
+ * configurations {
+ *     conf@1 {
+ *             kernel = "kernel@1";
+ *     };
+ * };
+ *
+ * the function will return the node offset of the kernel@1 node, assuming
+ * that conf@1 is the chosen configuration.
+ *
+ * @param images       Boot images structure
+ * @param prop_name    Property name to look up (FIT_..._PROP)
+ * @param addr         Address of FIT in memory
+ */
+int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
+                       ulong addr);
+
+int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
+                bootm_headers_t *images,
+                char **of_flat_tree, ulong *of_size);
 void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
 int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
 
@@ -697,6 +767,7 @@ int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
 int fit_add_verification_data(void *fit);
 
 int fit_image_verify(const void *fit, int noffset);
+int fit_config_verify(const void *fit, int conf_noffset);
 int fit_all_image_verify(const void *fit);
 int fit_image_check_os(const void *fit, int noffset, uint8_t os);
 int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
@@ -706,9 +777,6 @@ int fit_check_format(const void *fit);
 
 int fit_conf_find_compat(const void *fit, const void *fdt);
 int fit_conf_get_node(const void *fit, const char *conf_uname);
-int fit_conf_get_kernel_node(const void *fit, int noffset);
-int fit_conf_get_ramdisk_node(const void *fit, int noffset);
-int fit_conf_get_fdt_node(const void *fit, int noffset);
 
 /**
  * fit_conf_get_prop_node() - Get node refered to by a configuration
@@ -732,12 +800,35 @@ int fit_check_ramdisk(const void *fit, int os_noffset,
 int calculate_hash(const void *data, int data_len, const char *algo,
                        uint8_t *value, int *value_len);
 
-#ifndef USE_HOSTCC
+/*
+ * At present we only support verification on the device
+ */
+#if defined(CONFIG_FIT_SIGNATURE)
+# ifdef USE_HOSTCC
+#  define IMAGE_ENABLE_VERIFY  0
+#else
+#  define IMAGE_ENABLE_VERIFY  1
+# endif
+#else
+# define IMAGE_ENABLE_VERIFY   0
+#endif
+
+#ifdef USE_HOSTCC
+# define gd_fdt_blob()         NULL
+#else
+# define gd_fdt_blob()         (gd->fdt_blob)
+#endif
+
+#ifdef CONFIG_FIT_BEST_MATCH
+#define IMAGE_ENABLE_BEST_MATCH        1
+#else
+#define IMAGE_ENABLE_BEST_MATCH        0
+#endif
+
 static inline int fit_image_check_target_arch(const void *fdt, int node)
 {
        return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
 }
-#endif /* USE_HOSTCC */
 
 #ifdef CONFIG_FIT_VERBOSE
 #define fit_unsupported(msg)   printf("! %s:%d " \
index 6a2cf93db123a43728c82d67ffe0dc3e7742d617..49871da22d97213b10d31aa0f27af9e421022251 100644 (file)
@@ -278,9 +278,6 @@ typedef struct {
        char            *desc;  /* description string */
 } Lattice_desc;                        /* end, typedef Altera_desc */
 
-/* Lattice Model Type */
-#define CONFIG_SYS_XP2         CONFIG_SYS_FPGA_DEV(0x1)
-
 /* Board specific implementation specific function types */
 typedef void (*Lattice_jtag_init)(void);
 typedef void (*Lattice_jtag_set_tdi)(int v);
index c6e7fc5216330c6797e7c28a640a67322766a446..30225edf563fb1212db8e3868e4ef626921affaf 100644 (file)
@@ -324,6 +324,9 @@ void lcd_show_board_info(void);
 /* Return the size of the LCD frame buffer, and the line length */
 int lcd_get_size(int *line_length);
 
+int lcd_dt_simplefb_add_node(void *blob);
+int lcd_dt_simplefb_enable_existing_node(void *blob);
+
 /************************************************************************/
 /* ** BITMAP DISPLAY SUPPORT                                           */
 /************************************************************************/
diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
new file mode 100644 (file)
index 0000000..a61d956
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ * Based on bitrev from the Linux kernel, by Akinobu Mita
+ */
+
+#ifndef _LINUX_BITREV_H
+#define _LINUX_BITREV_H
+
+#include <linux/types.h>
+
+extern u8 const byte_rev_table[256];
+
+static inline u8 bitrev8(u8 byte)
+{
+       return byte_rev_table[byte];
+}
+
+u16 bitrev16(u16 in);
+u32 bitrev32(u32 in);
+
+#endif /* _LINUX_BITREV_H */
index 8cbcdae1143fa28ef406ce7dc795c8c0b6f8f7b8..71292b1a86bc91629acd1c61bf9e4d83e97a65a3 100644 (file)
@@ -81,32 +81,53 @@ struct nand_bbt_descr {
 #define NAND_BBT_LASTBLOCK     0x00000010
 /* The bbt is at the given page, else we must scan for the bbt */
 #define NAND_BBT_ABSPAGE       0x00000020
-/* The bbt is at the given page, else we must scan for the bbt */
-#define NAND_BBT_SEARCH                0x00000040
 /* bbt is stored per chip on multichip devices */
 #define NAND_BBT_PERCHIP       0x00000080
 /* bbt has a version counter at offset veroffs */
 #define NAND_BBT_VERSION       0x00000100
 /* Create a bbt if none exists */
 #define NAND_BBT_CREATE                0x00000200
+/*
+ * Create an empty BBT with no vendor information. Vendor's information may be
+ * unavailable, for example, if the NAND controller has a different data and OOB
+ * layout or if this information is already purged. Must be used in conjunction
+ * with NAND_BBT_CREATE.
+ */
+#define NAND_BBT_CREATE_EMPTY  0x00000400
 /* Search good / bad pattern through all pages of a block */
-#define NAND_BBT_SCANALLPAGES  0x00000400
+#define NAND_BBT_SCANALLPAGES  0x00000800
 /* Scan block empty during good / bad block scan */
-#define NAND_BBT_SCANEMPTY     0x00000800
+#define NAND_BBT_SCANEMPTY     0x00001000
 /* Write bbt if neccecary */
-#define NAND_BBT_WRITE         0x00001000
+#define NAND_BBT_WRITE         0x00002000
 /* Read and write back block contents when writing bbt */
-#define NAND_BBT_SAVECONTENT   0x00002000
+#define NAND_BBT_SAVECONTENT   0x00004000
 /* Search good / bad pattern on the first and the second page */
-#define NAND_BBT_SCAN2NDPAGE   0x00004000
+#define NAND_BBT_SCAN2NDPAGE   0x00008000
 /* Search good / bad pattern on the last page of the eraseblock */
-#define NAND_BBT_SCANLASTPAGE  0x00008000
-/* Chip stores bad block marker on BOTH 1st and 6th bytes of OOB */
-#define NAND_BBT_SCANBYTE1AND6 0x00100000
-/* The nand_bbt_descr was created dynamicaly and must be freed */
-#define NAND_BBT_DYNAMICSTRUCT 0x00200000
-/* The bad block table does not OOB for marker */
-#define NAND_BBT_NO_OOB                0x00400000
+#define NAND_BBT_SCANLASTPAGE  0x00010000
+/*
+ * Use a flash based bad block table. By default, OOB identifier is saved in
+ * OOB area. This option is passed to the default bad block table function.
+ */
+#define NAND_BBT_USE_FLASH     0x00020000
+/*
+ * Do not store flash based bad block table marker in the OOB area; store it
+ * in-band.
+ */
+#define NAND_BBT_NO_OOB                0x00040000
+/*
+ * Do not write new bad block markers to OOB; useful, e.g., when ECC covers
+ * entire spare area. Must be used with NAND_BBT_USE_FLASH.
+ */
+#define NAND_BBT_NO_OOB_BBM    0x00080000
+
+/*
+ * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr
+ * was allocated dynamicaly and must be freed in nand_release(). Has no meaning
+ * in nand_chip.bbt_options.
+ */
+#define NAND_BBT_DYNAMICSTRUCT 0x80000000
 
 /* The maximum number of blocks to scan for a bbt */
 #define NAND_BBT_SCAN_MAXBLOCKS        4
diff --git a/include/linux/mtd/docg4.h b/include/linux/mtd/docg4.h
new file mode 100644 (file)
index 0000000..982f5ad
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ */
+
+#ifndef __DOCG4_H__
+#define __DOCG4_H__
+
+#include <common.h>
+#include <linux/mtd/nand.h>
+
+extern int docg4_nand_init(struct mtd_info *mtd,
+                          struct nand_chip *nand, int devnum);
+
+/* SPL-related definitions */
+#define DOCG4_IPL_LOAD_BLOCK_COUNT 2  /* number of blocks that IPL loads */
+#define DOCG4_BLOCK_CAPACITY_SPL 0x10000 /* reliable mode; redundant pages */
+
+#define DOC_IOSPACE_DATA               0x0800
+
+/* register offsets */
+#define DOC_CHIPID                     0x1000
+#define DOC_DEVICESELECT               0x100a
+#define DOC_ASICMODE                   0x100c
+#define DOC_DATAEND                    0x101e
+#define DOC_NOP                                0x103e
+
+#define DOC_FLASHSEQUENCE              0x1032
+#define DOC_FLASHCOMMAND               0x1034
+#define DOC_FLASHADDRESS               0x1036
+#define DOC_FLASHCONTROL               0x1038
+#define DOC_ECCCONF0                   0x1040
+#define DOC_ECCCONF1                   0x1042
+#define DOC_HAMMINGPARITY              0x1046
+#define DOC_BCH_SYNDROM(idx)           (0x1048 + idx)
+
+#define DOC_ASICMODECONFIRM            0x1072
+#define DOC_CHIPID_INV                 0x1074
+#define DOC_POWERMODE                  0x107c
+
+#define DOCG4_MYSTERY_REG              0x1050
+
+/* apparently used only to write oob bytes 6 and 7 */
+#define DOCG4_OOB_6_7                  0x1052
+
+/* DOC_FLASHSEQUENCE register commands */
+#define DOC_SEQ_RESET                  0x00
+#define DOCG4_SEQ_PAGE_READ            0x03
+#define DOCG4_SEQ_FLUSH                        0x29
+#define DOCG4_SEQ_PAGEWRITE            0x16
+#define DOCG4_SEQ_PAGEPROG             0x1e
+#define DOCG4_SEQ_BLOCKERASE           0x24
+
+/* DOC_FLASHCOMMAND register commands */
+#define DOCG4_CMD_PAGE_READ             0x00
+#define DOC_CMD_ERASECYCLE2            0xd0
+#define DOCG4_CMD_FLUSH                 0x70
+#define DOCG4_CMD_READ2                 0x30
+#define DOC_CMD_PROG_BLOCK_ADDR                0x60
+#define DOCG4_CMD_PAGEWRITE            0x80
+#define DOC_CMD_PROG_CYCLE2            0x10
+#define DOC_CMD_RESET                  0xff
+
+/* DOC_POWERMODE register bits */
+#define DOC_POWERDOWN_READY            0x80
+
+/* DOC_FLASHCONTROL register bits */
+#define DOC_CTRL_CE                    0x10
+#define DOC_CTRL_UNKNOWN               0x40
+#define DOC_CTRL_FLASHREADY            0x01
+
+/* DOC_ECCCONF0 register bits */
+#define DOC_ECCCONF0_READ_MODE         0x8000
+#define DOC_ECCCONF0_UNKNOWN           0x2000
+#define DOC_ECCCONF0_ECC_ENABLE                0x1000
+#define DOC_ECCCONF0_DATA_BYTES_MASK   0x07ff
+
+/* DOC_ECCCONF1 register bits */
+#define DOC_ECCCONF1_BCH_SYNDROM_ERR   0x80
+#define DOC_ECCCONF1_ECC_ENABLE         0x07
+#define DOC_ECCCONF1_PAGE_IS_WRITTEN   0x20
+
+/* DOC_ASICMODE register bits */
+#define DOC_ASICMODE_RESET             0x00
+#define DOC_ASICMODE_NORMAL            0x01
+#define DOC_ASICMODE_POWERDOWN         0x02
+#define DOC_ASICMODE_MDWREN            0x04
+#define DOC_ASICMODE_BDETCT_RESET      0x08
+#define DOC_ASICMODE_RSTIN_RESET       0x10
+#define DOC_ASICMODE_RAM_WE            0x20
+
+/* good status values read after read/write/erase operations */
+#define DOCG4_PROGSTATUS_GOOD          0x51
+#define DOCG4_PROGSTATUS_GOOD_2        0xe0
+
+/*
+ * On read operations (page and oob-only), the first byte read from I/O reg is a
+ * status.  On error, it reads 0x73; otherwise, it reads either 0x71 (first read
+ * after reset only) or 0x51, so bit 1 is presumed to be an error indicator.
+ */
+#define DOCG4_READ_ERROR           0x02 /* bit 1 indicates read error */
+
+/* anatomy of the device */
+#define DOCG4_CHIP_SIZE        0x8000000
+#define DOCG4_PAGE_SIZE        0x200
+#define DOCG4_PAGES_PER_BLOCK  0x200
+#define DOCG4_BLOCK_SIZE       (DOCG4_PAGES_PER_BLOCK * DOCG4_PAGE_SIZE)
+#define DOCG4_NUMBLOCKS        (DOCG4_CHIP_SIZE / DOCG4_BLOCK_SIZE)
+#define DOCG4_OOB_SIZE         0x10
+#define DOCG4_CHIP_SHIFT       27    /* log_2(DOCG4_CHIP_SIZE) */
+#define DOCG4_PAGE_SHIFT       9     /* log_2(DOCG4_PAGE_SIZE) */
+#define DOCG4_ERASE_SHIFT      18    /* log_2(DOCG4_BLOCK_SIZE) */
+
+/* all but the last byte is included in ecc calculation */
+#define DOCG4_BCH_SIZE         (DOCG4_PAGE_SIZE + DOCG4_OOB_SIZE - 1)
+
+#define DOCG4_USERDATA_LEN     520 /* 512 byte page plus 8 oob avail to user */
+
+/* expected values from the ID registers */
+#define DOCG4_IDREG1_VALUE     0x0400
+#define DOCG4_IDREG2_VALUE     0xfbff
+
+/* primitive polynomial used to build the Galois field used by hw ecc gen */
+#define DOCG4_PRIMITIVE_POLY   0x4443
+
+#define DOCG4_M                14  /* Galois field is of order 2^14 */
+#define DOCG4_T                4   /* BCH alg corrects up to 4 bit errors */
+
+#define DOCG4_FACTORY_BBT_PAGE 16 /* page where read-only factory bbt lives */
+
+#endif /* __DOCG4_H__ */
index 141c96024c57c5246f967f8e045c2a6abab6c3f9..6f44abdc16102d345e97845f17bc624e5c37eb44 100644 (file)
@@ -9,7 +9,8 @@
 
 #include <linux/types.h>
 #include <div64.h>
-#include <linux/mtd/mtd-abi.h>
+#include <mtd/mtd-abi.h>
+#include <asm/errno.h>
 
 #define MTD_CHAR_MAJOR 90
 #define MTD_BLOCK_MAJOR 31
@@ -65,22 +66,6 @@ struct mtd_erase_region_info {
        unsigned long *lockmap;         /* If keeping bitmap of locks */
 };
 
-/*
- * oob operation modes
- *
- * MTD_OOB_PLACE:      oob data are placed at the given offset
- * MTD_OOB_AUTO:       oob data are automatically placed at the free areas
- *                     which are defined by the ecclayout
- * MTD_OOB_RAW:                mode to read raw data+oob in one chunk. The oob data
- *                     is inserted into the data. Thats a raw image of the
- *                     flash contents.
- */
-typedef enum {
-       MTD_OOB_PLACE,
-       MTD_OOB_AUTO,
-       MTD_OOB_RAW,
-} mtd_oob_mode_t;
-
 /**
  * struct mtd_oob_ops - oob operation operands
  * @mode:      operation mode
@@ -92,7 +77,7 @@ typedef enum {
  * @ooblen:    number of oob bytes to write/read
  * @oobretlen: number of oob bytes written/read
  * @ooboffs:   offset of oob data in the oob area (only relevant when
- *             mode = MTD_OOB_PLACE)
+ *             mode = MTD_OPS_PLACE_OOB or MTD_OPS_RAW)
  * @datbuf:    data buffer - if NULL only oob data are read/written
  * @oobbuf:    oob data buffer
  *
@@ -101,7 +86,7 @@ typedef enum {
  * OOB area.
  */
 struct mtd_oob_ops {
-       mtd_oob_mode_t  mode;
+       unsigned int    mode;
        size_t          len;
        size_t          retlen;
        size_t          ooblen;
@@ -133,13 +118,25 @@ struct mtd_info {
        u_int32_t oobsize;   /* Amount of OOB data per block (e.g. 16) */
        u_int32_t oobavail;  /* Available OOB bytes per block */
 
+       /*
+        * read ops return -EUCLEAN if max number of bitflips corrected on any
+        * one region comprising an ecc step equals or exceeds this value.
+        * Settable by driver, else defaults to ecc_strength.  User can override
+        * in sysfs.  N.B. The meaning of the -EUCLEAN return code has changed;
+        * see Documentation/ABI/testing/sysfs-class-mtd for more detail.
+        */
+       unsigned int bitflip_threshold;
+
        /* Kernel-only stuff starts here. */
        const char *name;
        int index;
 
-       /* ecc layout structure pointer - read only ! */
+       /* ECC layout structure pointer - read only! */
        struct nand_ecclayout *ecclayout;
 
+       /* max number of correctible bit errors per ecc step */
+       unsigned int ecc_strength;
+
        /* Data for variable erase regions. If numeraseregions is zero,
         * it means that the whole device has erasesize as given above.
         */
@@ -147,25 +144,17 @@ struct mtd_info {
        struct mtd_erase_region_info *eraseregions;
 
        /*
-        * Erase is an asynchronous operation.  Device drivers are supposed
-        * to call instr->callback() whenever the operation completes, even
-        * if it completes with a failure.
-        * Callers are supposed to pass a callback function and wait for it
-        * to be called before writing to the block.
+        * Do not call via these pointers, use corresponding mtd_*()
+        * wrappers instead.
         */
-       int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
-
-       /* This stuff for eXecute-In-Place */
-       /* phys is optional and may be set to NULL */
-       int (*point) (struct mtd_info *mtd, loff_t from, size_t len,
+       int (*_erase) (struct mtd_info *mtd, struct erase_info *instr);
+       int (*_point) (struct mtd_info *mtd, loff_t from, size_t len,
                        size_t *retlen, void **virt, phys_addr_t *phys);
-
-       /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
-       void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
-
-
-       int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
-       int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
+       void (*_unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
+       int (*_read) (struct mtd_info *mtd, loff_t from, size_t len,
+                    size_t *retlen, u_char *buf);
+       int (*_write) (struct mtd_info *mtd, loff_t to, size_t len,
+                     size_t *retlen, const u_char *buf);
 
        /* In blackbox flight recorder like scenarios we want to make successful
           writes in interrupt context. panic_write() is only intended to be
@@ -174,24 +163,35 @@ struct mtd_info {
           longer, this function can break locks and delay to ensure the write
           succeeds (but not sleep). */
 
-       int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
+       int (*_panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
 
-       int (*read_oob) (struct mtd_info *mtd, loff_t from,
+       int (*_read_oob) (struct mtd_info *mtd, loff_t from,
                         struct mtd_oob_ops *ops);
-       int (*write_oob) (struct mtd_info *mtd, loff_t to,
+       int (*_write_oob) (struct mtd_info *mtd, loff_t to,
                         struct mtd_oob_ops *ops);
-
+       int (*_get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
+                                  size_t len);
+       int (*_read_fact_prot_reg) (struct mtd_info *mtd, loff_t from,
+                                  size_t len, size_t *retlen, u_char *buf);
+       int (*_get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
+                                  size_t len);
+       int (*_read_user_prot_reg) (struct mtd_info *mtd, loff_t from,
+                                  size_t len, size_t *retlen, u_char *buf);
+       int (*_write_user_prot_reg) (struct mtd_info *mtd, loff_t to, size_t len,
+                                   size_t *retlen, u_char *buf);
+       int (*_lock_user_prot_reg) (struct mtd_info *mtd, loff_t from,
+                                  size_t len);
+       void (*_sync) (struct mtd_info *mtd);
+       int (*_lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
+       int (*_unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
+       int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs);
+       int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
        /*
-        * Methods to access the protection register area, present in some
-        * flash devices. The user data is one time programmable but the
-        * factory data is read only.
+        * If the driver is something smart, like UBI, it may need to maintain
+        * its own reference counting. The below functions are only for driver.
         */
-       int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
-       int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
-       int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
-       int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
-       int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
-       int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
+       int (*_get_device) (struct mtd_info *mtd);
+       void (*_put_device) (struct mtd_info *mtd);
 
 /* XXX U-BOOT XXX */
 #if 0
@@ -201,18 +201,6 @@ struct mtd_info {
        */
        int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
 #endif
-
-       /* Sync */
-       void (*sync) (struct mtd_info *mtd);
-
-       /* Chip-supported device locking */
-       int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
-       int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
-
-       /* Bad block management functions */
-       int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
-       int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
-
 /* XXX U-BOOT XXX */
 #if 0
        struct notifier_block reboot_notifier;  /* default mode before reboot */
@@ -227,15 +215,59 @@ struct mtd_info {
 
        struct module *owner;
        int usecount;
-
-       /* If the driver is something smart, like UBI, it may need to maintain
-        * its own reference counting. The below functions are only for driver.
-        * The driver may register its callbacks. These callbacks are not
-        * supposed to be called by MTD users */
-       int (*get_device) (struct mtd_info *mtd);
-       void (*put_device) (struct mtd_info *mtd);
 };
 
+int mtd_erase(struct mtd_info *mtd, struct erase_info *instr);
+int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
+            u_char *buf);
+int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
+             const u_char *buf);
+int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
+                   const u_char *buf);
+
+int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops);
+
+static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to,
+                               struct mtd_oob_ops *ops)
+{
+       ops->retlen = ops->oobretlen = 0;
+       if (!mtd->_write_oob)
+               return -EOPNOTSUPP;
+       if (!(mtd->flags & MTD_WRITEABLE))
+               return -EROFS;
+       return mtd->_write_oob(mtd, to, ops);
+}
+
+int mtd_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
+                          size_t len);
+int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
+                          size_t *retlen, u_char *buf);
+int mtd_get_user_prot_info(struct mtd_info *mtd, struct otp_info *buf,
+                          size_t len);
+int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
+                          size_t *retlen, u_char *buf);
+int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
+                           size_t *retlen, u_char *buf);
+int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len);
+
+/* XXX U-BOOT XXX */
+#if 0
+int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
+              unsigned long count, loff_t to, size_t *retlen);
+#endif
+
+static inline void mtd_sync(struct mtd_info *mtd)
+{
+       if (mtd->_sync)
+               mtd->_sync(mtd);
+}
+
+int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
+int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
+int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len);
+int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs);
+int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs);
+
 static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
 {
        do_div(sz, mtd->erasesize);
@@ -247,6 +279,16 @@ static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd)
        return do_div(sz, mtd->erasesize);
 }
 
+static inline int mtd_has_oob(const struct mtd_info *mtd)
+{
+       return mtd->_read_oob && mtd->_write_oob;
+}
+
+static inline int mtd_can_have_bb(const struct mtd_info *mtd)
+{
+       return !!mtd->_block_isbad;
+}
+
        /* Kernel-side ioctl definitions */
 
 extern int add_mtd_device(struct mtd_info *mtd);
@@ -269,12 +311,6 @@ struct mtd_notifier {
 
 extern void register_mtd_user (struct mtd_notifier *new);
 extern int unregister_mtd_user (struct mtd_notifier *old);
-
-int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
-                      unsigned long count, loff_t to, size_t *retlen);
-
-int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
-                     unsigned long count, loff_t from, size_t *retlen);
 #endif
 
 #ifdef CONFIG_MTD_PARTITIONS
@@ -296,17 +332,34 @@ static inline void mtd_erase_callback(struct erase_info *instr)
 #define MTD_DEBUG_LEVEL3       (3)     /* Noisy   */
 
 #ifdef CONFIG_MTD_DEBUG
+#define pr_debug(args...)      MTDDEBUG(MTD_DEBUG_LEVEL0, args)
 #define MTDDEBUG(n, args...)                           \
        do {                                            \
                if (n <= CONFIG_MTD_DEBUG_VERBOSE)      \
                        printk(KERN_INFO args);         \
        } while(0)
 #else /* CONFIG_MTD_DEBUG */
+#define pr_debug(args...)
 #define MTDDEBUG(n, args...)                           \
        do {                                            \
                if (0)                                  \
                        printk(KERN_INFO args);         \
        } while(0)
 #endif /* CONFIG_MTD_DEBUG */
+#define pr_info(args...)       MTDDEBUG(MTD_DEBUG_LEVEL0, args)
+#define pr_warn(args...)       MTDDEBUG(MTD_DEBUG_LEVEL0, args)
+#define pr_err(args...)                MTDDEBUG(MTD_DEBUG_LEVEL0, args)
+
+static inline int mtd_is_bitflip(int err) {
+       return err == -EUCLEAN;
+}
+
+static inline int mtd_is_eccerr(int err) {
+       return err == -EBADMSG;
+}
+
+static inline int mtd_is_bitflip_or_eccerr(int err) {
+       return mtd_is_bitflip(err) || mtd_is_eccerr(err);
+}
 
 #endif /* __MTD_MTD_H__ */
index 98bf255bb28526f5703f55fd9615e1ab9c595144..2055584374d6277629ee3ec16b8c9a812af65483 100644 (file)
@@ -46,7 +46,7 @@ extern void nand_wait_ready(struct mtd_info *mtd);
  * is supported now. If you add a chip with bigger oobsize/page
  * adjust this accordingly.
  */
-#define NAND_MAX_OOBSIZE       576
+#define NAND_MAX_OOBSIZE       640
 #define NAND_MAX_PAGESIZE      8192
 
 /*
@@ -82,6 +82,8 @@ extern void nand_wait_ready(struct mtd_info *mtd);
 #define NAND_CMD_READID                0x90
 #define NAND_CMD_ERASE2                0xd0
 #define NAND_CMD_PARAM         0xec
+#define NAND_CMD_GET_FEATURES  0xee
+#define NAND_CMD_SET_FEATURES  0xef
 #define NAND_CMD_RESET         0xff
 
 #define NAND_CMD_LOCK          0x2a
@@ -142,7 +144,7 @@ typedef enum {
 #define NAND_ECC_READ          0
 /* Reset Hardware ECC for write */
 #define NAND_ECC_WRITE         1
-/* Enable Hardware ECC before syndrom is read back from flash */
+/* Enable Hardware ECC before syndrome is read back from flash */
 #define NAND_ECC_READSYN       2
 
 /* Bit mask for flags passed to do_nand_read_ecc */
@@ -153,9 +155,7 @@ typedef enum {
  * Option constants for bizarre disfunctionality and real
  * features.
  */
-/* Chip can not auto increment pages */
-#define NAND_NO_AUTOINCR       0x00000001
-/* Buswitdh is 16 bit */
+/* Buswidth is 16 bit */
 #define NAND_BUSWIDTH_16       0x00000002
 /* Device supports partial programming without padding */
 #define NAND_NO_PADDING                0x00000004
@@ -179,12 +179,6 @@ typedef enum {
  * This happens with the Renesas AG-AND chips, possibly others.
  */
 #define BBT_AUTO_REFRESH       0x00000080
-/*
- * Chip does not require ready check on read. true
- * for all large page devices, as they do not support
- * autoincrement.
- */
-#define NAND_NO_READRDY                0x00000100
 /* Chip does not allow subpage writes */
 #define NAND_NO_SUBPAGE_WRITE  0x00000200
 
@@ -202,34 +196,21 @@ typedef enum {
        (NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK)
 
 /* Macros to identify the above */
-#define NAND_CANAUTOINCR(chip) (!(chip->options & NAND_NO_AUTOINCR))
 #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
 #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
 #define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK))
 #define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))
 
 /* Non chip related options */
-/*
- * Use a flash based bad block table. OOB identifier is saved in OOB area.
- * This option is passed to the default bad block table function.
- */
-#define NAND_USE_FLASH_BBT     0x00010000
 /* This option skips the bbt scan during initialization. */
-#define NAND_SKIP_BBTSCAN      0x00020000
+#define NAND_SKIP_BBTSCAN      0x00010000
 /*
  * This option is defined if the board driver allocates its own buffers
  * (e.g. because it needs them DMA-coherent).
  */
-#define NAND_OWN_BUFFERS       0x00040000
+#define NAND_OWN_BUFFERS       0x00020000
 /* Chip may not exist, so silence any errors in scan */
-#define NAND_SCAN_SILENT_NODEV 0x00080000
-/*
- * If passed additionally to NAND_USE_FLASH_BBT then BBT code will not touch
- * the OOB area.
- */
-#define NAND_USE_FLASH_BBT_NO_OOB      0x00800000
-/* Create an empty BBT with no vendor information if the BBT is available */
-#define NAND_CREATE_EMPTY_BBT          0x01000000
+#define NAND_SCAN_SILENT_NODEV 0x00040000
 
 /* Options set by nand scan */
 /* bbt has already been read */
@@ -244,6 +225,21 @@ typedef enum {
 /* Keep gcc happy */
 struct nand_chip;
 
+/* ONFI timing mode, used in both asynchronous and synchronous mode */
+#define ONFI_TIMING_MODE_0             (1 << 0)
+#define ONFI_TIMING_MODE_1             (1 << 1)
+#define ONFI_TIMING_MODE_2             (1 << 2)
+#define ONFI_TIMING_MODE_3             (1 << 3)
+#define ONFI_TIMING_MODE_4             (1 << 4)
+#define ONFI_TIMING_MODE_5             (1 << 5)
+#define ONFI_TIMING_MODE_UNKNOWN       (1 << 6)
+
+/* ONFI feature address */
+#define ONFI_FEATURE_ADDR_TIMING_MODE  0x1
+
+/* ONFI subfeature parameters length */
+#define ONFI_SUBFEATURE_PARAM_LEN      4
+
 struct nand_onfi_params {
        /* rev info and features block */
        /* 'O' 'N' 'F' 'I'  */
@@ -326,27 +322,32 @@ struct nand_hw_control {
 };
 
 /**
- * struct nand_ecc_ctrl - Control structure for ecc
- * @mode:      ecc mode
- * @steps:     number of ecc steps per page
- * @size:      data bytes per ecc step
- * @bytes:     ecc bytes per step
- * @total:     total number of ecc bytes per page
- * @prepad:    padding information for syndrome based ecc generators
- * @postpad:   padding information for syndrome based ecc generators
+ * struct nand_ecc_ctrl - Control structure for ECC
+ * @mode:      ECC mode
+ * @steps:     number of ECC steps per page
+ * @size:      data bytes per ECC step
+ * @bytes:     ECC bytes per step
+ * @strength:  max number of correctible bits per ECC step
+ * @total:     total number of ECC bytes per page
+ * @prepad:    padding information for syndrome based ECC generators
+ * @postpad:   padding information for syndrome based ECC generators
  * @layout:    ECC layout control struct pointer
- * @priv:      pointer to private ecc control data
- * @hwctl:     function to control hardware ecc generator. Must only
+ * @priv:      pointer to private ECC control data
+ * @hwctl:     function to control hardware ECC generator. Must only
  *             be provided if an hardware ECC is available
- * @calculate: function for ecc calculation or readback from ecc hardware
- * @correct:   function for ecc correction, matching to ecc generator (sw/hw)
+ * @calculate: function for ECC calculation or readback from ECC hardware
+ * @correct:   function for ECC correction, matching to ECC generator (sw/hw)
  * @read_page_raw:     function to read a raw page without ECC
  * @write_page_raw:    function to write a raw page without ECC
- * @read_page: function to read a page according to the ecc generator
- *             requirements.
- * @read_subpage:      function to read parts of the page covered by ECC.
- * @write_page:        function to write a page according to the ecc generator
+ * @read_page: function to read a page according to the ECC generator
+ *             requirements; returns maximum number of bitflips corrected in
+ *             any single ECC step, 0 if bitflips uncorrectable, -EIO hw error
+ * @read_subpage:      function to read parts of the page covered by ECC;
+ *                     returns same as read_page()
+ * @write_page:        function to write a page according to the ECC generator
  *             requirements.
+ * @write_oob_raw:     function to write chip OOB data without ECC
+ * @read_oob_raw:      function to read chip OOB data without ECC
  * @read_oob:  function to read chip OOB data
  * @write_oob: function to write chip OOB data
  */
@@ -356,6 +357,7 @@ struct nand_ecc_ctrl {
        int size;
        int bytes;
        int total;
+       int strength;
        int prepad;
        int postpad;
        struct nand_ecclayout   *layout;
@@ -366,25 +368,28 @@ struct nand_ecc_ctrl {
        int (*correct)(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,
                        uint8_t *calc_ecc);
        int (*read_page_raw)(struct mtd_info *mtd, struct nand_chip *chip,
-                       uint8_t *buf, int page);
-       void (*write_page_raw)(struct mtd_info *mtd, struct nand_chip *chip,
-                       const uint8_t *buf);
+                       uint8_t *buf, int oob_required, int page);
+       int (*write_page_raw)(struct mtd_info *mtd, struct nand_chip *chip,
+                       const uint8_t *buf, int oob_required);
        int (*read_page)(struct mtd_info *mtd, struct nand_chip *chip,
-                       uint8_t *buf, int page);
+                       uint8_t *buf, int oob_required, int page);
        int (*read_subpage)(struct mtd_info *mtd, struct nand_chip *chip,
                        uint32_t offs, uint32_t len, uint8_t *buf);
-       void (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
-                       const uint8_t *buf);
-       int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page,
-                       int sndcmd);
+       int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
+                       const uint8_t *buf, int oob_required);
+       int (*write_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip,
+                       int page);
+       int (*read_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip,
+                       int page);
+       int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page);
        int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip,
                        int page);
 };
 
 /**
  * struct nand_buffers - buffer structure for read/write
- * @ecccalc:   buffer for calculated ecc
- * @ecccode:   buffer for ecc read from flash
+ * @ecccalc:   buffer for calculated ECC
+ * @ecccode:   buffer for ECC read from flash
  * @databuf:   buffer for data - dynamically sized
  *
  * Do not change the order of buffers. databuf and oobrbuf must be in
@@ -418,7 +423,7 @@ struct nand_buffers {
  *                     mtd->oobsize, mtd->writesize and so on.
  *                     @id_data contains the 8 bytes values of NAND_CMD_READID.
  *                     Return with the bus width.
- * @dev_ready:         [BOARDSPECIFIC] hardwarespecific function for accesing
+ * @dev_ready:         [BOARDSPECIFIC] hardwarespecific function for accessing
  *                     device ready/busy line. If set to NULL no access to
  *                     ready/busy is available and the ready/busy information
  *                     is read from the chip status register.
@@ -426,17 +431,17 @@ struct nand_buffers {
  *                     commands to the chip.
  * @waitfunc:          [REPLACEABLE] hardwarespecific function for wait on
  *                     ready.
- * @ecc:               [BOARDSPECIFIC] ecc control ctructure
+ * @ecc:               [BOARDSPECIFIC] ECC control structure
  * @buffers:           buffer structure for read/write
  * @hwcontrol:         platform-specific hardware control structure
- * @ops:               oob operation operands
  * @erase_cmd:         [INTERN] erase command write function, selectable due
  *                     to AND support.
  * @scan_bbt:          [REPLACEABLE] function to scan bad block table
  * @chip_delay:                [BOARDSPECIFIC] chip dependent delay for transferring
  *                     data from array to read regs (tR).
  * @state:             [INTERN] the current state of the NAND device
- * @oob_poi:           poison value buffer
+ * @oob_poi:           "poison value buffer," used for laying out OOB data
+ *                     before writing
  * @page_shift:                [INTERN] number of address bits in a page (column
  *                     address bits).
  * @phys_erase_shift:  [INTERN] number of address bits in a physical eraseblock
@@ -445,10 +450,14 @@ struct nand_buffers {
  * @options:           [BOARDSPECIFIC] various chip options. They can partly
  *                     be set to inform nand_scan about special functionality.
  *                     See the defines for further explanation.
+ * @bbt_options:       [INTERN] bad block specific options. All options used
+ *                     here must come from bbm.h. By default, these options
+ *                     will be copied to the appropriate nand_bbt_descr's.
  * @badblockpos:       [INTERN] position of the bad block marker in the oob
  *                     area.
- * @badblockbits:      [INTERN] number of bits to left-shift the bad block
- *                     number
+ * @badblockbits:      [INTERN] minimum number of set bits in a good block's
+ *                     bad block marker position; i.e., BBM == 11110111b is
+ *                     not bad when badblockbits == 7
  * @cellinfo:          [INTERN] MLC/multichip data from chip ident
  * @numchips:          [INTERN] number of physical chips
  * @chipsize:          [INTERN] the size of one chip for multichip arrays
@@ -460,7 +469,9 @@ struct nand_buffers {
  *                     non 0 if ONFI supported.
  * @onfi_params:       [INTERN] holds the ONFI page parameter when ONFI is
  *                     supported, 0 otherwise.
- * @ecclayout:         [REPLACEABLE] the default ecc placement scheme
+ * @onfi_set_features  [REPLACEABLE] set the features for ONFI nand
+ * @onfi_get_features  [REPLACEABLE] get the features for ONFI nand
+ * @ecclayout:         [REPLACEABLE] the default ECC placement scheme
  * @bbt:               [INTERN] bad block table pointer
  * @bbt_td:            [REPLACEABLE] bad block table descriptor for flash
  *                     lookup.
@@ -468,9 +479,9 @@ struct nand_buffers {
  * @badblock_pattern:  [REPLACEABLE] bad block scan pattern used for initial
  *                     bad block scan.
  * @controller:                [REPLACEABLE] a pointer to a hardware controller
- *                     structure which is shared among multiple independend
+ *                     structure which is shared among multiple independent
  *                     devices.
- * @priv:              [OPTIONAL] pointer to private chip date
+ * @priv:              [OPTIONAL] pointer to private chip data
  * @errstat:           [OPTIONAL] hardware specific function to perform
  *                     additional error status checks (determine if errors are
  *                     correctable).
@@ -501,10 +512,16 @@ struct nand_chip {
        int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state,
                        int status, int page);
        int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
-                       const uint8_t *buf, int page, int cached, int raw);
+                       const uint8_t *buf, int oob_required, int page,
+                       int cached, int raw);
+       int (*onfi_set_features)(struct mtd_info *mtd, struct nand_chip *chip,
+                       int feature_addr, uint8_t *subfeature_para);
+       int (*onfi_get_features)(struct mtd_info *mtd, struct nand_chip *chip,
+                       int feature_addr, uint8_t *subfeature_para);
 
        int chip_delay;
        unsigned int options;
+       unsigned int bbt_options;
 
        int page_shift;
        int phys_erase_shift;
@@ -534,8 +551,6 @@ struct nand_chip {
        struct nand_buffers *buffers;
        struct nand_hw_control hwcontrol;
 
-       struct mtd_oob_ops ops;
-
        uint8_t *bbt;
        struct nand_bbt_descr *bbt_td;
        struct nand_bbt_descr *bbt_md;
@@ -557,6 +572,8 @@ struct nand_chip {
 #define NAND_MFR_HYNIX         0xad
 #define NAND_MFR_MICRON                0x2c
 #define NAND_MFR_AMD           0x01
+#define NAND_MFR_MACRONIX      0xc2
+#define NAND_MFR_EON           0x92
 
 /**
  * struct nand_flash_dev - NAND Flash Device ID Structure
@@ -615,9 +632,9 @@ extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len,
  * @partitions:                mtd partition list
  * @chip_delay:                R/B delay value in us
  * @options:           Option flags, e.g. 16bit buswidth
- * @ecclayout:         ecc layout info structure
+ * @bbt_options:       BBT option flags, e.g. NAND_BBT_USE_FLASH
+ * @ecclayout:         ECC layout info structure
  * @part_probe_types:  NULL-terminated array of probe types
- * @priv:              hardware controller specific settings
  */
 struct platform_nand_chip {
        int nr_chips;
@@ -627,8 +644,8 @@ struct platform_nand_chip {
        struct nand_ecclayout *ecclayout;
        int chip_delay;
        unsigned int options;
+       unsigned int bbt_options;
        const char **part_probe_types;
-       void *priv;
 };
 
 /* Keep gcc happy */
@@ -650,6 +667,7 @@ struct platform_nand_ctrl {
        int (*dev_ready)(struct mtd_info *mtd);
        void (*select_chip)(struct mtd_info *mtd, int chip);
        void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);
+       unsigned char (*read_byte)(struct mtd_info *mtd);
        void *priv;
 };
 
@@ -679,4 +697,23 @@ void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len);
 void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len);
 uint8_t nand_read_byte(struct mtd_info *mtd);
 
+/* return the supported asynchronous timing mode. */
+
+#ifdef CONFIG_SYS_NAND_ONFI_DETECTION
+static inline int onfi_get_async_timing_mode(struct nand_chip *chip)
+{
+       if (!chip->onfi_version)
+               return ONFI_TIMING_MODE_UNKNOWN;
+       return le16_to_cpu(chip->onfi_params.async_timing_mode);
+}
+
+/* return the supported synchronous timing mode. */
+static inline int onfi_get_sync_timing_mode(struct nand_chip *chip)
+{
+       if (!chip->onfi_version)
+               return ONFI_TIMING_MODE_UNKNOWN;
+       return le16_to_cpu(chip->onfi_params.src_sync_timing_mode);
+}
+#endif
+
 #endif /* __LINUX_MTD_NAND_H */
index e9b134d1428f43786bce85d8f7dc4a6fc72d1907..8e44855712c33be990b02ff0db8f70f67110d08d 100644 (file)
@@ -85,6 +85,9 @@ extern int memcmp(const void *,const void *,__kernel_size_t);
 #ifndef __HAVE_ARCH_MEMCHR
 extern void * memchr(const void *,int,__kernel_size_t);
 #endif
+#ifndef __HAVE_ARCH_MEMCHR_INV
+void *memchr_inv(const void *, int, size_t);
+#endif
 
 #ifdef __cplusplus
 }
index d1d732c2838d3a48788c16fe87bd9552a8558ab8..bd48704c870daee4eb860586bade83995abd720c 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <linux/types.h>       /* __u8 etc */
 #include <asm/byteorder.h>     /* le16_to_cpu */
+#include <asm/unaligned.h>     /* get_unaligned() */
 
 /*-------------------------------------------------------------------------*/
 
@@ -596,7 +597,7 @@ static inline int usb_endpoint_is_isoc_out(
  */
 static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
 {
-       return __le16_to_cpu(epd->wMaxPacketSize);
+       return __le16_to_cpu(get_unaligned(&epd->wMaxPacketSize));
 }
 
 static inline int usb_endpoint_interrupt_type(
index 966b5e00cac20a3cd36a60917ff226980908ffee..b644b91773f21e7576d253ec8d16786cf432670d 100644 (file)
@@ -129,12 +129,16 @@ typedef union {
 } cfiword_t;
 
 /* CFI standard query structure */
+/* The offsets and sizes of this packed structure members correspond
+ * to the actual layout in CFI Flash chips. Some 16- and 32-bit members
+ * are unaligned and must be accessed with explicit unaligned access macros.
+ */
 struct cfi_qry {
        u8      qry[3];
-       u16     p_id;
-       u16     p_adr;
-       u16     a_id;
-       u16     a_adr;
+       u16     p_id;                   /* unaligned */
+       u16     p_adr;                  /* unaligned */
+       u16     a_id;                   /* unaligned */
+       u16     a_adr;                  /* unaligned */
        u8      vcc_min;
        u8      vcc_max;
        u8      vpp_min;
@@ -148,10 +152,10 @@ struct cfi_qry {
        u8      block_erase_timeout_max;
        u8      chip_erase_timeout_max;
        u8      dev_size;
-       u16     interface_desc;
-       u16     max_buf_write_size;
+       u16     interface_desc;         /* aligned */
+       u16     max_buf_write_size;     /* aligned */
        u8      num_erase_regions;
-       u32     erase_region_info[NUM_ERASE_REGIONS];
+       u32     erase_region_info[NUM_ERASE_REGIONS];   /* unaligned */
 } __attribute__((packed));
 
 struct cfi_pri_hdr {
similarity index 65%
rename from include/linux/mtd/mtd-abi.h
rename to include/mtd/mtd-abi.h
index 8bdd23112b4f2cfd5c40079e8301c7ba2ba0966e..d51c1abd186328d9f862aba4febeabcc8fdf4eb1 100644 (file)
@@ -24,6 +24,25 @@ struct mtd_oob_buf {
        unsigned char __user *ptr;
 };
 
+/*
+ * MTD operation modes
+ *
+ * @MTD_OPS_PLACE_OOB: OOB data are placed at the given offset (default)
+ * @MTD_OPS_AUTO_OOB:  OOB data are automatically placed at the free areas
+ *                     which are defined by the internal ecclayout
+ * @MTD_OPS_RAW:       data are transferred as-is, with no error correction;
+ *                     this mode implies %MTD_OPS_PLACE_OOB
+ *
+ * These modes can be passed to ioctl(MEMWRITE) and are also used internally.
+ * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs.
+ * %MTD_FILE_MODE_RAW.
+ */
+enum {
+       MTD_OPS_PLACE_OOB = 0,
+       MTD_OPS_AUTO_OOB = 1,
+       MTD_OPS_RAW = 2,
+};
+
 #define MTD_ABSENT             0
 #define MTD_RAM                        1
 #define MTD_ROM                        2
@@ -82,24 +101,42 @@ struct otp_info {
        uint32_t locked;
 };
 
+/* Get basic MTD characteristics info (better to use sysfs) */
 #define MEMGETINFO             _IOR('M', 1, struct mtd_info_user)
+/* Erase segment of MTD */
 #define MEMERASE               _IOW('M', 2, struct erase_info_user)
+/* Write out-of-band data from MTD */
 #define MEMWRITEOOB            _IOWR('M', 3, struct mtd_oob_buf)
+/* Read out-of-band data from MTD */
 #define MEMREADOOB             _IOWR('M', 4, struct mtd_oob_buf)
+/* Lock a chip (for MTD that supports it) */
 #define MEMLOCK                        _IOW('M', 5, struct erase_info_user)
+/* Unlock a chip (for MTD that supports it) */
 #define MEMUNLOCK              _IOW('M', 6, struct erase_info_user)
+/* Get the number of different erase regions */
 #define MEMGETREGIONCOUNT      _IOR('M', 7, int)
+/* Get information about the erase region for a specific index */
 #define MEMGETREGIONINFO       _IOWR('M', 8, struct region_info_user)
+/* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */
 #define MEMSETOOBSEL           _IOW('M', 9, struct nand_oobinfo)
 #define MEMGETOOBSEL           _IOR('M', 10, struct nand_oobinfo)
+/* Check if an eraseblock is bad */
 #define MEMGETBADBLOCK         _IOW('M', 11, loff_t)
+/* Mark an eraseblock as bad */
 #define MEMSETBADBLOCK         _IOW('M', 12, loff_t)
+/* Set OTP (One-Time Programmable) mode (factory vs. user) */
 #define OTPSELECT              _IOR('M', 13, int)
+/* Get number of OTP (One-Time Programmable) regions */
 #define OTPGETREGIONCOUNT      _IOW('M', 14, int)
+/* Get all OTP (One-Time Programmable) info about MTD */
 #define OTPGETREGIONINFO       _IOW('M', 15, struct otp_info)
+/* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */
 #define OTPLOCK                        _IOR('M', 16, struct otp_info)
+/* Get ECC layout (deprecated) */
 #define ECCGETLAYOUT           _IOR('M', 17, struct nand_ecclayout)
+/* Get statistics about corrected/uncorrected errors */
 #define ECCGETSTATS            _IOR('M', 18, struct mtd_ecc_stats)
+/* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */
 #define MTDFILEMODE            _IO('M', 19)
 
 /*
@@ -146,7 +183,21 @@ struct mtd_ecc_stats {
 };
 
 /*
- * Read/write file modes for access to MTD
+ * MTD file modes - for read/write access to MTD
+ *
+ * @MTD_FILE_MODE_NORMAL:      OTP disabled, ECC enabled
+ * @MTD_FILE_MODE_OTP_FACTORY: OTP enabled in factory mode
+ * @MTD_FILE_MODE_OTP_USER:    OTP enabled in user mode
+ * @MTD_FILE_MODE_RAW:         OTP disabled, ECC disabled
+ *
+ * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained
+ * separately for each open file descriptor.
+ *
+ * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW -
+ * raw access to the flash, without error correction or autoplacement schemes.
+ * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode
+ * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is
+ * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)).
  */
 enum mtd_file_modes {
        MTD_MODE_NORMAL = MTD_OTP_OFF,
index f0f3bf94b555d4c6055d65cdc81d30c264cdd9a9..26190e4137da9ac05c896506f909d230f5f4537d 100644 (file)
@@ -31,7 +31,8 @@
  * at the same time, so do it here.  When all drivers are
  * converted, this will go away.
  */
-#if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_ATMEL)
+#if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_ATMEL)\
+       || defined(CONFIG_NAND_FSL_IFC)
 #define CONFIG_SYS_NAND_SELF_INIT
 #endif
 
@@ -55,17 +56,17 @@ extern nand_info_t nand_info[];
 
 static inline int nand_read(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf)
 {
-       return info->read(info, ofs, *len, (size_t *)len, buf);
+       return mtd_read(info, ofs, *len, (size_t *)len, buf);
 }
 
 static inline int nand_write(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf)
 {
-       return info->write(info, ofs, *len, (size_t *)len, buf);
+       return mtd_write(info, ofs, *len, (size_t *)len, buf);
 }
 
 static inline int nand_block_isbad(nand_info_t *info, loff_t ofs)
 {
-       return info->block_isbad(info, ofs);
+       return mtd_block_isbad(info, ofs);
 }
 
 static inline int nand_erase(nand_info_t *info, loff_t off, size_t size)
@@ -77,7 +78,7 @@ static inline int nand_erase(nand_info_t *info, loff_t off, size_t size)
        instr.len = size;
        instr.callback = 0;
 
-       return info->erase(info, &instr);
+       return mtd_erase(info, &instr);
 }
 
 
index 970d4d1fab13df2c093062e1cf015625bb5db558..23fb947292ccf3e1e1b805e86c11ac75106f3107 100644 (file)
@@ -695,6 +695,9 @@ extern void copy_filename(char *dst, const char *src, int size);
 /* get a random source port */
 extern unsigned int random_port(void);
 
+/* Update U-Boot over TFTP */
+extern int update_tftp(ulong addr);
+
 /**********************************************************************/
 
 #endif /* __NET_H__ */
index 3bcb337ee2c5c1e97e10f62563a8daa2fbeff15c..df454b50c3bc4fdcff762313e4b958a165e342f7 100644 (file)
@@ -103,7 +103,7 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr,
                                                        int txpp, int rxpp);
 int xilinx_ll_temac_eth_init(bd_t *bis, unsigned long base_addr, int flags,
                                                unsigned long ctrl_addr);
-int zynq_gem_initialize(bd_t *bis, int base_addr);
+int zynq_gem_initialize(bd_t *bis, int base_addr, int phy_addr, u32 emio);
 /*
  * As long as the Xilinx xps_ll_temac ethernet driver has not its own interface
  * exported by a public hader file, we need a global definition at this point.
diff --git a/include/palmas.h b/include/palmas.h
new file mode 100644 (file)
index 0000000..aff48b5
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * (C) Copyright 2012-2013
+ * 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
+ */
+#ifndef PALMAS_H
+#define PALMAS_H
+
+#include <common.h>
+#include <i2c.h>
+
+/* I2C chip addresses, TW6035/37 */
+#define TWL603X_CHIP_P1                0x48    /* Page 1 */
+#define TWL603X_CHIP_P2                0x49    /* Page 2 */
+#define TWL603X_CHIP_P3                0x4a    /* Page 3 */
+
+/* TPS659038/39 */
+#define TPS65903X_CHIP_P1      0x58    /* Page 1 */
+
+/* Page 1 registers (0x1XY translates to page 1, reg addr 0xXY): */
+
+/* LDO1 control/voltage */
+#define LDO1_CTRL              0x50
+#define LDO1_VOLTAGE           0x51
+
+/* LDO9 control/voltage */
+#define LDO9_CTRL              0x60
+#define LDO9_VOLTAGE           0x61
+
+/* LDOUSB control/voltage */
+#define LDOUSB_CTRL            0x64
+#define LDOUSB_VOLTAGE         0x65
+
+/* Control of 32 kHz audio clock */
+#define CLK32KGAUDIO_CTRL      0xd5
+
+/* SYSEN2_CTRL for VCC_3v3_AUX supply on the sEVM */
+#define SYSEN2_CTRL            0xd9
+
+/*
+ * Bit field definitions for LDOx_CTRL, SYSENx_CTRL
+ * and some other xxx_CTRL resources:
+ */
+#define LDO9_BYP_EN            (1 << 6)        /* LDO9 only! */
+#define RSC_STAT_ON            (1 << 4)        /* RO status bit! */
+#define RSC_MODE_SLEEP         (1 << 2)
+#define RSC_MODE_ACTIVE                (1 << 0)
+
+/* Some LDO voltage values */
+#define LDO_VOLT_OFF           0
+#define LDO_VOLT_1V8           0x13
+#define LDO_VOLT_3V0           0x2b
+#define LDO_VOLT_3V3           0x31
+/* Request bypass, LDO9 only */
+#define LDO9_BYPASS            0x3f
+
+/* SMPS7_CTRL */
+#define SMPS7_CTRL             0x30
+
+/* SMPS9_CTRL */
+#define SMPS9_CTRL             0x38
+#define SMPS9_VOLTAGE          0x3b
+
+/* Bit field definitions for SMPSx_CTRL */
+#define SMPS_MODE_ACT_AUTO     1
+#define SMPS_MODE_ACT_ECO      2
+#define SMPS_MODE_ACT_FPWM     3
+#define SMPS_MODE_SLP_AUTO     (1 << 2)
+#define SMPS_MODE_SLP_ECO      (2 << 2)
+#define SMPS_MODE_SLP_FPWM     (3 << 2)
+
+/*
+ * Some popular SMPS voltages, all with RANGE=1; note
+ * that RANGE cannot be changed on the fly
+ */
+#define SMPS_VOLT_OFF          0
+#define SMPS_VOLT_1V2          0x90
+#define SMPS_VOLT_1V8          0xae
+#define SMPS_VOLT_2V1          0xbd
+#define SMPS_VOLT_3V0          0xea
+#define SMPS_VOLT_3V3          0xf9
+
+/* Backup Battery & VRTC Control */
+#define BB_VRTC_CTRL           0xa8
+/* Bit definitions for BB_VRTC_CTRL */
+#define VRTC_EN_SLP            (1 << 6)
+#define VRTC_EN_OFF            (1 << 5)
+#define VRTC_PWEN              (1 << 4)
+#define BB_LOW_ICHRG           (1 << 3)
+#define BB_HIGH_ICHRG          (0 << 3)
+#define BB_VSEL_3V0            (0 << 1)
+#define BB_VSEL_2V5            (1 << 1)
+#define BB_VSEL_3V15           (2 << 1)
+#define BB_VSEL_VBAT           (3 << 1)
+#define BB_CHRG_EN             (1 << 0)
+
+/*
+ * Functions to read and write from TPS659038/TWL6035/TWL6037
+ * or other Palmas family of TI PMICs
+ */
+static inline int palmas_i2c_write_u8(u8 chip_no, u8 reg, u8 val)
+{
+       return i2c_write(chip_no, reg, 1, &val, 1);
+}
+
+static inline int palmas_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
+{
+       return i2c_read(chip_no, reg, 1, val, 1);
+}
+
+void palmas_init_settings(void);
+int palmas_mmc1_poweron_ldo(void);
+int twl603x_mmc1_set_ldo9(u8 vsel);
+int twl603x_audio_power(u8 on);
+int twl603x_enable_bb_charge(u8 bb_fields);
+
+#endif /* PALMAS_H */
index 15f583f069d4ca1c45f09893542af487cb37f998..f9c51482550d7cd6980d16d0e2659c287ec799d5 100644 (file)
@@ -569,7 +569,9 @@ extern __inline__ void pci_set_ops(struct pci_controller *hose,
        hose->write_dword = write_dword;
 }
 
+#ifdef CONFIG_PCI_INDIRECT_BRIDGE
 extern void pci_setup_indirect(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data);
+#endif
 
 extern phys_addr_t pci_hose_bus_to_phys(struct pci_controller* hose,
                                        pci_addr_t addr, unsigned long flags);
index 44d5eaf547630429e83a56bb757d78bd81d0af5d..75bf3b4728d62f8c8308b3fa642306d80145471f 100644 (file)
@@ -225,6 +225,7 @@ int gen10g_discover_mmds(struct phy_device *phydev);
 int phy_atheros_init(void);
 int phy_broadcom_init(void);
 int phy_davicom_init(void);
+int phy_et1011c_init(void);
 int phy_lxt_init(void);
 int phy_marvell_init(void);
 int phy_micrel_init(void);
index b40be8039c05b83ac1ec33bee525b5b2c2068c75..4bc1dd13bbc0126e6e684bc3d84fe4255fba4452 100644 (file)
@@ -44,7 +44,6 @@ struct spl_image_info {
 #define SPL_COPY_PAYLOAD_ONLY  1
 
 extern struct spl_image_info spl_image;
-extern u32 *boot_params_ptr;
 
 /* SPL common functions */
 void preloader_console_init(void);
index 5aa184183e7cffef60942464290c73c9ecd7d41b..569ad2773fb02d0a1c2874f52ea9cbda5129e8a9 100644 (file)
  *   examples are TWL4030_PM_RECEIVER_VMMC1_DEV_GRP and
  *   TWL4030_LED_LEDEN.
  */
-static inline int twl4030_i2c_write_u8(u8 chip_no, u8 val, u8 reg)
+static inline int twl4030_i2c_write_u8(u8 chip_no, u8 reg, u8 val)
 {
        return i2c_write(chip_no, reg, 1, &val, 1);
 }
 
-static inline int twl4030_i2c_read_u8(u8 chip_no, u8 *val, u8 reg)
+static inline int twl4030_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
 {
        return i2c_read(chip_no, reg, 1, val, 1);
 }
index a9fcadbfef7e348e64eb33907e17a758d994c3a4..029b21f7108d369f7f04cd392430ddea70e7cf2c 100644 (file)
@@ -21,6 +21,9 @@
  * MA 02111-1307 USA
  */
 
+#ifndef TWL6030_H
+#define TWL6030_H
+
 #include <common.h>
 #include <i2c.h>
 
 #define GPCH0_LSB      0x57
 #define GPCH0_MSB      0x58
 
+/* Functions to read and write from TWL6030 */
+static inline int twl6030_i2c_write_u8(u8 chip_no, u8 reg, u8 val)
+{
+       return i2c_write(chip_no, reg, 1, &val, 1);
+}
+
+static inline int twl6030_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
+{
+       return i2c_read(chip_no, reg, 1, val, 1);
+}
+
 void twl6030_init_battery_charging(void);
 void twl6030_usb_device_settings(void);
 void twl6030_start_usb_charging(void);
@@ -133,3 +147,5 @@ void twl6030_stop_usb_charging(void);
 int twl6030_get_battery_voltage(void);
 int twl6030_get_battery_current(void);
 void twl6030_power_mmc_init(void);
+
+#endif /* TWL6030_H */
index a1438d6f94f2b5a074de26bfb1b1c3011e3b33a7..29b136dfba64203bbc0553389788faf3aefff011 100644 (file)
@@ -277,10 +277,4 @@ struct usb_ehci {
 /* Board-specific initialization */
 int board_ehci_hcd_init(int port);
 
-/* CPU-specific abstracted-out IOMUX init */
-#ifdef CONFIG_MX51
-void setup_iomux_usb_h1(void);
-void setup_iomux_usb_h2(void);
-#endif
-
 #endif /* _EHCI_FSL_H */
diff --git a/include/usb/fotg210.h b/include/usb/fotg210.h
new file mode 100644 (file)
index 0000000..2d2d243
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * Faraday USB 2.0 OTG Controller
+ *
+ * (C) Copyright 2010 Faraday Technology
+ * Dante Su <dantesu@faraday-tech.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ */
+
+#ifndef _FOTG210_H
+#define _FOTG210_H
+
+struct fotg210_regs {
+       /* USB Host Controller */
+       struct {
+               uint32_t data[4];
+       } hccr;                 /* 0x00 - 0x0f: hccr */
+       struct {
+               uint32_t data[9];
+       } hcor;                 /* 0x10 - 0x33: hcor */
+       uint32_t rsvd1[3];
+       uint32_t miscr; /* 0x40: Miscellaneous Register */
+       uint32_t rsvd2[15];
+       /* USB OTG Controller */
+       uint32_t otgcsr;/* 0x80: OTG Control Status Register */
+       uint32_t otgisr;/* 0x84: OTG Interrupt Status Register */
+       uint32_t otgier;/* 0x88: OTG Interrupt Enable Register */
+       uint32_t rsvd3[13];
+       uint32_t isr;   /* 0xC0: Global Interrupt Status Register */
+       uint32_t imr;   /* 0xC4: Global Interrupt Mask Register */
+       uint32_t rsvd4[14];
+       /* USB Device Controller */
+       uint32_t dev_ctrl;/* 0x100: Device Control Register */
+       uint32_t dev_addr;/* 0x104: Device Address Register */
+       uint32_t dev_test;/* 0x108: Device Test Register */
+       uint32_t sof_fnr; /* 0x10c: SOF Frame Number Register */
+       uint32_t sof_mtr; /* 0x110: SOF Mask Timer Register */
+       uint32_t phy_tmsr;/* 0x114: PHY Test Mode Selector Register */
+       uint32_t rsvd5[2];
+       uint32_t cxfifo;/* 0x120: CX FIFO Register */
+       uint32_t idle;  /* 0x124: IDLE Counter Register */
+       uint32_t rsvd6[2];
+       uint32_t gimr;  /* 0x130: Group Interrupt Mask Register */
+       uint32_t gimr0; /* 0x134: Group Interrupt Mask Register 0 */
+       uint32_t gimr1; /* 0x138: Group Interrupt Mask Register 1 */
+       uint32_t gimr2; /* 0x13c: Group Interrupt Mask Register 2 */
+       uint32_t gisr;  /* 0x140: Group Interrupt Status Register */
+       uint32_t gisr0; /* 0x144: Group Interrupt Status Register 0 */
+       uint32_t gisr1; /* 0x148: Group Interrupt Status Register 1 */
+       uint32_t gisr2; /* 0x14c: Group Interrupt Status Register 2 */
+       uint32_t rxzlp; /* 0x150: Receive Zero-Length-Packet Register */
+       uint32_t txzlp; /* 0x154: Transfer Zero-Length-Packet Register */
+       uint32_t isoeasr;/* 0x158: ISOC Error/Abort Status Register */
+       uint32_t rsvd7[1];
+       uint32_t iep[8]; /* 0x160 - 0x17f: IN Endpoint Register */
+       uint32_t oep[8]; /* 0x180 - 0x19f: OUT Endpoint Register */
+       uint32_t epmap14;/* 0x1a0: Endpoint Map Register (EP1 ~ 4) */
+       uint32_t epmap58;/* 0x1a4: Endpoint Map Register (EP5 ~ 8) */
+       uint32_t fifomap;/* 0x1a8: FIFO Map Register */
+       uint32_t fifocfg; /* 0x1ac: FIFO Configuration Register */
+       uint32_t fifocsr[4];/* 0x1b0 - 0x1bf: FIFO Control Status Register */
+       uint32_t dma_fifo; /* 0x1c0: DMA Target FIFO Register */
+       uint32_t rsvd8[1];
+       uint32_t dma_ctrl; /* 0x1c8: DMA Control Register */
+       uint32_t dma_addr; /* 0x1cc: DMA Address Register */
+       uint32_t ep0_data; /* 0x1d0: EP0 Setup Packet PIO Register */
+};
+
+/* Miscellaneous Register */
+#define MISCR_SUSPEND  (1 << 6) /* Put transceiver in suspend mode */
+#define MISCR_EOF2(x)  (((x) & 0x3) << 4) /* EOF 2 Timing */
+#define MISCR_EOF1(x)  (((x) & 0x3) << 2) /* EOF 1 Timing */
+#define MISCR_ASST(x)  (((x) & 0x3) << 0) /* Async. Sched. Sleep Timer */
+
+/* OTG Control Status Register */
+#define OTGCSR_SPD_HIGH     (2 << 22) /* Speed of the attached device (host) */
+#define OTGCSR_SPD_LOW      (1 << 22)
+#define OTGCSR_SPD_FULL     (0 << 22)
+#define OTGCSR_SPD_MASK     (3 << 22)
+#define OTGCSR_SPD_SHIFT    22
+#define OTGCSR_SPD(x)       (((x) >> 22) & 0x03)
+#define OTGCSR_DEV_A        (0 << 21) /* Acts as A-device */
+#define OTGCSR_DEV_B        (1 << 21) /* Acts as B-device */
+#define OTGCSR_ROLE_H       (0 << 20) /* Acts as Host */
+#define OTGCSR_ROLE_D       (1 << 20) /* Acts as Device */
+#define OTGCSR_A_VBUS_VLD   (1 << 19) /* A-device VBUS Valid */
+#define OTGCSR_A_SESS_VLD   (1 << 18) /* A-device Session Valid */
+#define OTGCSR_B_SESS_VLD   (1 << 17) /* B-device Session Valid */
+#define OTGCSR_B_SESS_END   (1 << 16) /* B-device Session End */
+#define OTGCSR_HFT_LONG     (1 << 11) /* HDISCON noise filter = 270 us*/
+#define OTGCSR_HFT          (0 << 11) /* HDISCON noise filter = 135 us*/
+#define OTGCSR_VFT_LONG     (1 << 10) /* VBUS noise filter = 472 us*/
+#define OTGCSR_VFT          (0 << 10) /* VBUS noise filter = 135 us*/
+#define OTGCSR_IDFT_LONG    (1 << 9)  /* ID noise filter = 4 ms*/
+#define OTGCSR_IDFT         (0 << 9)  /* ID noise filter = 3 ms*/
+#define OTGCSR_A_SRPR_VBUS  (0 << 8)  /* A-device: SRP responds to VBUS */
+#define OTGCSR_A_SRPR_DATA  (1 << 8)  /* A-device: SRP responds to DATA-LINE */
+#define OTGCSR_A_SRP_EN     (1 << 7)  /* A-device SRP detection enabled */
+#define OTGCSR_A_HNP        (1 << 6)  /* Set role=A-device with HNP enabled */
+#define OTGCSR_A_BUSDROP    (1 << 5)  /* A-device drop bus (power-down) */
+#define OTGCSR_A_BUSREQ     (1 << 4)  /* A-device request bus */
+#define OTGCSR_B_VBUS_DISC  (1 << 2)  /* B-device discharges VBUS */
+#define OTGCSR_B_HNP        (1 << 1)  /* B-device enable HNP */
+#define OTGCSR_B_BUSREQ     (1 << 0)  /* B-device request bus */
+
+/* OTG Interrupt Status Register */
+#define OTGISR_APRM         (1 << 12) /* Mini-A plug removed */
+#define OTGISR_BPRM         (1 << 11) /* Mini-B plug removed */
+#define OTGISR_OVD          (1 << 10) /* over-current detected */
+#define OTGISR_IDCHG        (1 << 9)  /* ID(A/B) changed */
+#define OTGISR_RLCHG        (1 << 8)  /* Role(Host/Device) changed */
+#define OTGISR_BSESSEND     (1 << 6)  /* B-device Session End */
+#define OTGISR_AVBUSERR     (1 << 5)  /* A-device VBUS Error */
+#define OTGISR_ASRP         (1 << 4)  /* A-device SRP detected */
+#define OTGISR_BSRP         (1 << 0)  /* B-device SRP complete */
+
+/* OTG Interrupt Enable Register */
+#define OTGIER_APRM         (1 << 12) /* Mini-A plug removed */
+#define OTGIER_BPRM         (1 << 11) /* Mini-B plug removed */
+#define OTGIER_OVD          (1 << 10) /* over-current detected */
+#define OTGIER_IDCHG        (1 << 9)  /* ID(A/B) changed */
+#define OTGIER_RLCHG        (1 << 8)  /* Role(Host/Device) changed */
+#define OTGIER_BSESSEND     (1 << 6)  /* B-device Session End */
+#define OTGIER_AVBUSERR     (1 << 5)  /* A-device VBUS Error */
+#define OTGIER_ASRP         (1 << 4)  /* A-device SRP detected */
+#define OTGIER_BSRP         (1 << 0)  /* B-device SRP complete */
+
+/* Global Interrupt Status Register (W1C) */
+#define ISR_HOST            (1 << 2)  /* USB Host interrupt */
+#define ISR_OTG             (1 << 1)  /* USB OTG interrupt */
+#define ISR_DEV             (1 << 0)  /* USB Device interrupt */
+#define ISR_MASK            0x07
+
+/* Global Interrupt Mask Register */
+#define IMR_IRQLH           (1 << 3)  /* Interrupt triggered at level-high */
+#define IMR_IRQLL           (0 << 3)  /* Interrupt triggered at level-low */
+#define IMR_HOST            (1 << 2)  /* USB Host interrupt */
+#define IMR_OTG             (1 << 1)  /* USB OTG interrupt */
+#define IMR_DEV             (1 << 0)  /* USB Device interrupt */
+#define IMR_MASK            0x0f
+
+/* Device Control Register */
+#define DEVCTRL_FS_FORCED   (1 << 9)  /* Forced to be Full-Speed Mode */
+#define DEVCTRL_HS          (1 << 6)  /* High Speed Mode */
+#define DEVCTRL_FS          (0 << 6)  /* Full Speed Mode */
+#define DEVCTRL_EN          (1 << 5)  /* Chip Enable */
+#define DEVCTRL_RESET       (1 << 4)  /* Chip Software Reset */
+#define DEVCTRL_SUSPEND     (1 << 3)  /* Enter Suspend Mode */
+#define DEVCTRL_GIRQ_EN     (1 << 2)  /* Global Interrupt Enabled */
+#define DEVCTRL_HALFSPD     (1 << 1)  /* Half speed mode for FPGA test */
+#define DEVCTRL_RWAKEUP     (1 << 0)  /* Enable remote wake-up */
+
+/* Device Address Register */
+#define DEVADDR_CONF        (1 << 7)  /* SET_CONFIGURATION has been executed */
+#define DEVADDR_ADDR(x)     ((x) & 0x7f)
+#define DEVADDR_ADDR_MASK   0x7f
+
+/* Device Test Register */
+#define DEVTEST_NOSOF       (1 << 6)  /* Do not generate SOF */
+#define DEVTEST_TST_MODE    (1 << 5)  /* Enter Test Mode */
+#define DEVTEST_TST_NOTS    (1 << 4)  /* Do not toggle sequence */
+#define DEVTEST_TST_NOCRC   (1 << 3)  /* Do not append CRC */
+#define DEVTEST_TST_CLREA   (1 << 2)  /* Clear External Side Address */
+#define DEVTEST_TST_CXLP    (1 << 1)  /* EP0 loopback test */
+#define DEVTEST_TST_CLRFF   (1 << 0)  /* Clear FIFO */
+
+/* SOF Frame Number Register */
+#define SOFFNR_UFN(x)       (((x) >> 11) & 0x7) /* SOF Micro-Frame Number */
+#define SOFFNR_FNR(x)       ((x) & 0x7ff) /* SOF Frame Number */
+
+/* SOF Mask Timer Register */
+#define SOFMTR_TMR(x)       ((x) & 0xffff)
+
+/* PHY Test Mode Selector Register */
+#define PHYTMSR_TST_PKT     (1 << 4) /* Packet send test */
+#define PHYTMSR_TST_SE0NAK  (1 << 3) /* High-Speed quiescent state */
+#define PHYTMSR_TST_KSTA    (1 << 2) /* High-Speed K state */
+#define PHYTMSR_TST_JSTA    (1 << 1) /* High-Speed J state */
+#define PHYTMSR_UNPLUG      (1 << 0) /* Enable soft-detachment */
+
+/* CX FIFO Register */
+#define CXFIFO_BYTES(x)     (((x) >> 24) & 0x7f) /* CX/EP0 FIFO byte count */
+#define CXFIFO_FIFOE(x)     (1 << (((x) & 0x03) + 8)) /* EPx FIFO empty */
+#define CXFIFO_FIFOE_FIFO0  (1 << 8)
+#define CXFIFO_FIFOE_FIFO1  (1 << 9)
+#define CXFIFO_FIFOE_FIFO2  (1 << 10)
+#define CXFIFO_FIFOE_FIFO3  (1 << 11)
+#define CXFIFO_FIFOE_MASK   (0x0f << 8)
+#define CXFIFO_CXFIFOE      (1 << 5) /* CX FIFO empty */
+#define CXFIFO_CXFIFOF      (1 << 4) /* CX FIFO full */
+#define CXFIFO_CXFIFOCLR    (1 << 3) /* CX FIFO clear */
+#define CXFIFO_CXSTALL      (1 << 2) /* CX Stall */
+#define CXFIFO_TSTPKTFIN    (1 << 1) /* Test packet data transfer finished */
+#define CXFIFO_CXFIN        (1 << 0) /* CX data transfer finished */
+
+/* IDLE Counter Register */
+#define IDLE_MS(x)          ((x) & 0x07) /* PHY suspend delay = x ms */
+
+/* Group Interrupt Mask(Disable) Register */
+#define GIMR_GRP2           (1 << 2) /* Disable interrupt group 2 */
+#define GIMR_GRP1           (1 << 1) /* Disable interrupt group 1 */
+#define GIMR_GRP0           (1 << 0) /* Disable interrupt group 0 */
+#define GIMR_MASK           0x07
+
+/* Group Interrupt Mask(Disable) Register 0 (CX) */
+#define GIMR0_CXABORT       (1 << 5) /* CX command abort interrupt */
+#define GIMR0_CXERR         (1 << 4) /* CX command error interrupt */
+#define GIMR0_CXEND         (1 << 3) /* CX command end interrupt */
+#define GIMR0_CXOUT         (1 << 2) /* EP0-OUT packet interrupt */
+#define GIMR0_CXIN          (1 << 1) /* EP0-IN packet interrupt */
+#define GIMR0_CXSETUP       (1 << 0) /* EP0-SETUP packet interrupt */
+#define GIMR0_MASK          0x3f
+
+/* Group Interrupt Mask(Disable) Register 1 (FIFO) */
+#define GIMR1_FIFO_IN(x)    (1 << (((x) & 3) + 16))    /* FIFOx IN */
+#define GIMR1_FIFO_TX(x)    GIMR1_FIFO_IN(x)
+#define GIMR1_FIFO_OUT(x)   (1 << (((x) & 3) * 2))     /* FIFOx OUT */
+#define GIMR1_FIFO_SPK(x)   (1 << (((x) & 3) * 2 + 1)) /* FIFOx SHORT PACKET */
+#define GIMR1_FIFO_RX(x)    (GIMR1_FIFO_OUT(x) | GIMR1_FIFO_SPK(x))
+#define GIMR1_MASK          0xf00ff
+
+/* Group Interrupt Mask(Disable) Register 2 (Device) */
+#define GIMR2_WAKEUP        (1 << 10) /* Device waked up */
+#define GIMR2_IDLE          (1 << 9)  /* Device idle */
+#define GIMR2_DMAERR        (1 << 8)  /* DMA error */
+#define GIMR2_DMAFIN        (1 << 7)  /* DMA finished */
+#define GIMR2_ZLPRX         (1 << 6)  /* Zero-Length-Packet Rx Interrupt */
+#define GIMR2_ZLPTX         (1 << 5)  /* Zero-Length-Packet Tx Interrupt */
+#define GIMR2_ISOCABT       (1 << 4)  /* ISOC Abort Interrupt */
+#define GIMR2_ISOCERR       (1 << 3)  /* ISOC Error Interrupt */
+#define GIMR2_RESUME        (1 << 2)  /* Resume state change Interrupt */
+#define GIMR2_SUSPEND       (1 << 1)  /* Suspend state change Interrupt */
+#define GIMR2_RESET         (1 << 0)  /* Reset Interrupt */
+#define GIMR2_MASK          0x7ff
+
+/* Group Interrupt Status Register */
+#define GISR_GRP2           (1 << 2) /* Interrupt group 2 */
+#define GISR_GRP1           (1 << 1) /* Interrupt group 1 */
+#define GISR_GRP0           (1 << 0) /* Interrupt group 0 */
+
+/* Group Interrupt Status Register 0 (CX) */
+#define GISR0_CXABORT       (1 << 5) /* CX command abort interrupt */
+#define GISR0_CXERR         (1 << 4) /* CX command error interrupt */
+#define GISR0_CXEND         (1 << 3) /* CX command end interrupt */
+#define GISR0_CXOUT         (1 << 2) /* EP0-OUT packet interrupt */
+#define GISR0_CXIN          (1 << 1) /* EP0-IN packet interrupt */
+#define GISR0_CXSETUP       (1 << 0) /* EP0-SETUP packet interrupt */
+
+/* Group Interrupt Status Register 1 (FIFO) */
+#define GISR1_IN_FIFO(x)    (1 << (((x) & 0x03) + 16))    /* FIFOx IN */
+#define GISR1_OUT_FIFO(x)   (1 << (((x) & 0x03) * 2))     /* FIFOx OUT */
+#define GISR1_SPK_FIFO(x)   (1 << (((x) & 0x03) * 2 + 1)) /* FIFOx SPK */
+#define GISR1_RX_FIFO(x)    (3 << (((x) & 0x03) * 2))     /* FIFOx OUT/SPK */
+
+/* Group Interrupt Status Register 2 (Device) */
+#define GISR2_WAKEUP        (1 << 10) /* Device waked up */
+#define GISR2_IDLE          (1 << 9)  /* Device idle */
+#define GISR2_DMAERR        (1 << 8)  /* DMA error */
+#define GISR2_DMAFIN        (1 << 7)  /* DMA finished */
+#define GISR2_ZLPRX         (1 << 6)  /* Zero-Length-Packet Rx Interrupt */
+#define GISR2_ZLPTX         (1 << 5)  /* Zero-Length-Packet Tx Interrupt */
+#define GISR2_ISOCABT       (1 << 4)  /* ISOC Abort Interrupt */
+#define GISR2_ISOCERR       (1 << 3)  /* ISOC Error Interrupt */
+#define GISR2_RESUME        (1 << 2)  /* Resume state change Interrupt */
+#define GISR2_SUSPEND       (1 << 1)  /* Suspend state change Interrupt */
+#define GISR2_RESET         (1 << 0)  /* Reset Interrupt */
+
+/* Receive Zero-Length-Packet Register */
+#define RXZLP_EP(x)         (1 << ((x) - 1)) /* EPx ZLP rx interrupt */
+
+/* Transfer Zero-Length-Packet Register */
+#define TXZLP_EP(x)         (1 << ((x) - 1)) /* EPx ZLP tx interrupt */
+
+/* ISOC Error/Abort Status Register */
+#define ISOEASR_EP(x)       (0x10001 << ((x) - 1)) /* EPx ISOC Error/Abort */
+
+/* IN Endpoint Register */
+#define IEP_SENDZLP         (1 << 15)     /* Send Zero-Length-Packet */
+#define IEP_TNRHB(x)        (((x) & 0x03) << 13) \
+       /* Transaction Number for High-Bandwidth EP(ISOC) */
+#define IEP_RESET           (1 << 12)     /* Reset Toggle Sequence */
+#define IEP_STALL           (1 << 11)     /* Stall */
+#define IEP_MAXPS(x)        ((x) & 0x7ff) /* Max. packet size */
+
+/* OUT Endpoint Register */
+#define OEP_RESET           (1 << 12)     /* Reset Toggle Sequence */
+#define OEP_STALL           (1 << 11)     /* Stall */
+#define OEP_MAXPS(x)        ((x) & 0x7ff) /* Max. packet size */
+
+/* Endpoint Map Register (EP1 ~ EP4) */
+#define EPMAP14_SET_IN(ep, fifo) \
+       ((fifo) & 3) << (((ep) - 1) << 3 + 0)
+#define EPMAP14_SET_OUT(ep, fifo) \
+       ((fifo) & 3) << (((ep) - 1) << 3 + 4)
+#define EPMAP14_SET(ep, in, out) \
+       do { \
+               EPMAP14_SET_IN(ep, in); \
+               EPMAP14_SET_OUT(ep, out); \
+       } while (0)
+
+#define EPMAP14_DEFAULT     0x33221100 /* EP1->FIFO0, EP2->FIFO1... */
+
+/* Endpoint Map Register (EP5 ~ EP8) */
+#define EPMAP58_SET_IN(ep, fifo) \
+       ((fifo) & 3) << (((ep) - 5) << 3 + 0)
+#define EPMAP58_SET_OUT(ep, fifo) \
+       ((fifo) & 3) << (((ep) - 5) << 3 + 4)
+#define EPMAP58_SET(ep, in, out) \
+       do { \
+               EPMAP58_SET_IN(ep, in); \
+               EPMAP58_SET_OUT(ep, out); \
+       } while (0)
+
+#define EPMAP58_DEFAULT     0x00000000 /* All EPx->FIFO0 */
+
+/* FIFO Map Register */
+#define FIFOMAP_BIDIR       (2 << 4)
+#define FIFOMAP_IN          (1 << 4)
+#define FIFOMAP_OUT         (0 << 4)
+#define FIFOMAP_DIR_MASK    0x30
+#define FIFOMAP_EP(x)       ((x) & 0x0f)
+#define FIFOMAP_EP_MASK     0x0f
+#define FIFOMAP_CFG_MASK    0x3f
+#define FIFOMAP_DEFAULT     0x04030201 /* FIFO0->EP1, FIFO1->EP2... */
+#define FIFOMAP(fifo, cfg)  (((cfg) & 0x3f) << (((fifo) & 3) << 3))
+
+/* FIFO Configuration Register */
+#define FIFOCFG_EN          (1 << 5)
+#define FIFOCFG_BLKSZ_1024  (1 << 4)
+#define FIFOCFG_BLKSZ_512   (0 << 4)
+#define FIFOCFG_3BLK        (2 << 2)
+#define FIFOCFG_2BLK        (1 << 2)
+#define FIFOCFG_1BLK        (0 << 2)
+#define FIFOCFG_NBLK_MASK   3
+#define FIFOCFG_NBLK_SHIFT  2
+#define FIFOCFG_INTR        (3 << 0)
+#define FIFOCFG_BULK        (2 << 0)
+#define FIFOCFG_ISOC        (1 << 0)
+#define FIFOCFG_RSVD        (0 << 0)  /* Reserved */
+#define FIFOCFG_TYPE_MASK   3
+#define FIFOCFG_TYPE_SHIFT  0
+#define FIFOCFG_CFG_MASK    0x3f
+#define FIFOCFG(fifo, cfg)  (((cfg) & 0x3f) << (((fifo) & 3) << 3))
+
+/* FIFO Control Status Register */
+#define FIFOCSR_RESET       (1 << 12) /* FIFO Reset */
+#define FIFOCSR_BYTES(x)    ((x) & 0x7ff) /* Length(bytes) for OUT-EP/FIFO */
+
+/* DMA Target FIFO Register */
+#define DMAFIFO_CX          (1 << 4) /* DMA FIFO = CX FIFO */
+#define DMAFIFO_FIFO(x)     (1 << ((x) & 0x3)) /* DMA FIFO = FIFOx */
+
+/* DMA Control Register */
+#define DMACTRL_LEN(x)      (((x) & 0x1ffff) << 8) /* DMA length (Bytes) */
+#define DMACTRL_LEN_SHIFT   8
+#define DMACTRL_CLRFF       (1 << 4) /* Clear FIFO upon DMA abort */
+#define DMACTRL_ABORT       (1 << 3) /* DMA abort */
+#define DMACTRL_IO2IO       (1 << 2) /* IO to IO */
+#define DMACTRL_FIFO2MEM    (0 << 1) /* FIFO to Memory */
+#define DMACTRL_MEM2FIFO    (1 << 1) /* Memory to FIFO */
+#define DMACTRL_START       (1 << 0) /* DMA start */
+
+#endif
diff --git a/include/usb/fusbh200.h b/include/usb/fusbh200.h
new file mode 100644 (file)
index 0000000..8a9c488
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Faraday USB 2.0 EHCI Controller
+ *
+ * (C) Copyright 2010 Faraday Technology
+ * Dante Su <dantesu@faraday-tech.com>
+ *
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ */
+
+#ifndef _FUSBH200_H
+#define _FUSBH200_H
+
+struct fusbh200_regs {
+       struct {
+               uint32_t data[4];
+       } hccr;                 /* 0x00 - 0x0f: hccr */
+       struct {
+               uint32_t data[9];
+       } hcor;                 /* 0x10 - 0x33: hcor */
+       uint32_t easstr;/* 0x34: EOF&Async. Sched. Sleep Timer Register */
+       uint32_t rsvd[2];
+       uint32_t bmcsr; /* 0x40: Bus Monitor Control Status Register */
+       uint32_t bmisr; /* 0x44: Bus Monitor Interrupt Status Register */
+       uint32_t bmier; /* 0x48: Bus Monitor Interrupt Enable Register */
+};
+
+/* EOF & Async. Schedule Sleep Timer Register */
+#define EASSTR_RUNNING  (1 << 6) /* Put transceiver in running/resume mode */
+#define EASSTR_SUSPEND  (0 << 6) /* Put transceiver in suspend mode */
+#define EASSTR_EOF2(x)  (((x) & 0x3) << 4) /* EOF 2 Timing */
+#define EASSTR_EOF1(x)  (((x) & 0x3) << 2) /* EOF 1 Timing */
+#define EASSTR_ASST(x)  (((x) & 0x3) << 0) /* Async. Sched. Sleep Timer */
+
+/* Bus Monitor Control Status Register */
+#define BMCSR_SPD_HIGH  (2 << 9) /* Speed of the attached device */
+#define BMCSR_SPD_LOW   (1 << 9)
+#define BMCSR_SPD_FULL  (0 << 9)
+#define BMCSR_SPD_MASK  (3 << 9)
+#define BMCSR_SPD_SHIFT 9
+#define BMCSR_SPD(x)    ((x >> 9) & 0x03)
+#define BMCSR_VBUS      (1 << 8) /* VBUS Valid */
+#define BMCSR_VBUS_OFF  (1 << 4) /* VBUS Off */
+#define BMCSR_VBUS_ON   (0 << 4) /* VBUS On */
+#define BMCSR_IRQLH     (1 << 3) /* IRQ triggered at level-high */
+#define BMCSR_IRQLL     (0 << 3) /* IRQ triggered at level-low */
+#define BMCSR_HALFSPD   (1 << 2) /* Half speed mode for FPGA test */
+#define BMCSR_HFT_LONG  (1 << 1) /* HDISCON noise filter = 270 us*/
+#define BMCSR_HFT       (0 << 1) /* HDISCON noise filter = 135 us*/
+#define BMCSR_VFT_LONG  (1 << 1) /* VBUS noise filter = 472 us*/
+#define BMCSR_VFT       (0 << 1) /* VBUS noise filter = 135 us*/
+
+/* Bus Monitor Interrupt Status Register */
+/* Bus Monitor Interrupt Enable Register */
+#define BMISR_DMAERR    (1 << 4) /* DMA error */
+#define BMISR_DMA       (1 << 3) /* DMA complete */
+#define BMISR_DEVRM     (1 << 2) /* device removed */
+#define BMISR_OVD       (1 << 1) /* over-current detected */
+#define BMISR_VBUSERR   (1 << 0) /* VBUS error */
+
+#endif
index 5f25b7a8a96be3a231f4c99b7fd714569f1149ec..9a64771c6051ca59ed377e685693cc86c7357c8b 100644 (file)
 #ifndef _XILINX_H_
 #define _XILINX_H_
 
-/* Xilinx Model definitions
- *********************************************************************/
-#define CONFIG_SYS_SPARTAN2                    CONFIG_SYS_FPGA_DEV( 0x1 )
-#define CONFIG_SYS_VIRTEX_E                    CONFIG_SYS_FPGA_DEV( 0x2 )
-#define CONFIG_SYS_VIRTEX2                     CONFIG_SYS_FPGA_DEV( 0x4 )
-#define CONFIG_SYS_SPARTAN3                    CONFIG_SYS_FPGA_DEV( 0x8 )
-#define CONFIG_SYS_XILINX_SPARTAN2     (CONFIG_SYS_FPGA_XILINX | CONFIG_SYS_SPARTAN2)
-#define CONFIG_SYS_XILINX_VIRTEX_E     (CONFIG_SYS_FPGA_XILINX | CONFIG_SYS_VIRTEX_E)
-#define CONFIG_SYS_XILINX_VIRTEX2      (CONFIG_SYS_FPGA_XILINX | CONFIG_SYS_VIRTEX2)
-#define CONFIG_SYS_XILINX_SPARTAN3     (CONFIG_SYS_FPGA_XILINX | CONFIG_SYS_SPARTAN3)
-/* XXX - Add new models here */
-
-
-/* Xilinx Interface definitions
- *********************************************************************/
-#define CONFIG_SYS_XILINX_IF_SS        CONFIG_SYS_FPGA_IF( 0x1 )       /* slave serial         */
-#define CONFIG_SYS_XILINX_IF_MS        CONFIG_SYS_FPGA_IF( 0x2 )       /* master serial        */
-#define CONFIG_SYS_XILINX_IF_SP        CONFIG_SYS_FPGA_IF( 0x4 )       /* slave parallel       */
-#define CONFIG_SYS_XILINX_IF_JTAG      CONFIG_SYS_FPGA_IF( 0x8 )       /* jtag                 */
-#define CONFIG_SYS_XILINX_IF_MSM       CONFIG_SYS_FPGA_IF( 0x10 )      /* master selectmap     */
-#define CONFIG_SYS_XILINX_IF_SSM       CONFIG_SYS_FPGA_IF( 0x20 )      /* slave selectmap      */
-
 /* Xilinx types
  *********************************************************************/
 typedef enum {                 /* typedef Xilinx_iface */
@@ -59,6 +37,7 @@ typedef enum {                        /* typedef Xilinx_iface */
        jtag_mode,              /* jtag/tap serial (not used ) */
        master_selectmap,       /* master SelectMap (virtex2)           */
        slave_selectmap,        /* slave SelectMap (virtex2)            */
+       devcfg,                 /* devcfg interface (zynq) */
        max_xilinx_iface_type   /* insert all new types before this */
 } Xilinx_iface;                        /* end, typedef Xilinx_iface */
 
@@ -68,6 +47,7 @@ typedef enum {                        /* typedef Xilinx_Family */
        Xilinx_VirtexE,         /* Virtex-E Family */
        Xilinx_Virtex2,         /* Virtex2 Family */
        Xilinx_Spartan3,        /* Spartan-III Family */
+       xilinx_zynq,            /* Zynq Family */
        max_xilinx_type         /* insert all new types before this */
 } Xilinx_Family;               /* end, typedef Xilinx_Family */
 
@@ -77,6 +57,7 @@ typedef struct {              /* typedef Xilinx_desc */
        size_t size;            /* bytes of data part can accept */
        void *iface_fns;        /* interface function table */
        int cookie;             /* implementation specific cookie */
+       char *name;             /* device name in bitstream */
 } Xilinx_desc;                 /* end, typedef Xilinx_desc */
 
 /* Generic Xilinx Functions
diff --git a/include/zynqpl.h b/include/zynqpl.h
new file mode 100644 (file)
index 0000000..0247ef6
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * (C) Copyright 2012-2013, Xilinx, Michal Simek
+ *
+ * (C) Copyright 2012
+ * Joe Hershberger <joe.hershberger@ni.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 _ZYNQPL_H_
+#define _ZYNQPL_H_
+
+#include <xilinx.h>
+
+extern int zynq_load(Xilinx_desc *desc, const void *image, size_t size);
+extern int zynq_dump(Xilinx_desc *desc, const void *buf, size_t bsize);
+extern int zynq_info(Xilinx_desc *desc);
+
+#define XILINX_ZYNQ_7010       0x2
+#define XILINX_ZYNQ_7020       0x7
+#define XILINX_ZYNQ_7030       0xc
+#define XILINX_ZYNQ_7045       0x11
+
+/* Device Image Sizes */
+#define XILINX_XC7Z010_SIZE    16669920/8
+#define XILINX_XC7Z020_SIZE    32364512/8
+#define XILINX_XC7Z030_SIZE    47839328/8
+#define XILINX_XC7Z045_SIZE    106571232/8
+
+/* Descriptor Macros */
+#define XILINX_XC7Z010_DESC(cookie) \
+{ xilinx_zynq, devcfg, XILINX_XC7Z010_SIZE, NULL, cookie, "7z010" }
+
+#define XILINX_XC7Z020_DESC(cookie) \
+{ xilinx_zynq, devcfg, XILINX_XC7Z020_SIZE, NULL, cookie, "7z020" }
+
+#define XILINX_XC7Z030_DESC(cookie) \
+{ xilinx_zynq, devcfg, XILINX_XC7Z030_SIZE, NULL, cookie, "7z030" }
+
+#define XILINX_XC7Z045_DESC(cookie) \
+{ xilinx_zynq, devcfg, XILINX_XC7Z045_SIZE, NULL, cookie, "7z045" }
+
+#endif /* _ZYNQPL_H_ */
index 8f81862b720b8ef44c79549869cd34b5c793f913..5d586098dd5e850d7a7060d2c61119b42e2ec08e 100644 (file)
@@ -55,6 +55,7 @@ COBJS-$(CONFIG_SHA256) += sha256.o
 COBJS-y        += strmhz.o
 COBJS-$(CONFIG_TPM) += tpm.o
 COBJS-$(CONFIG_RBTREE) += rbtree.o
+COBJS-$(CONFIG_BITREVERSE) += bitrev.o
 endif
 
 ifdef CONFIG_SPL_BUILD
diff --git a/lib/bitrev.c b/lib/bitrev.c
new file mode 100644 (file)
index 0000000..160021a
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ * Based on bitrev from the Linux kernel, by Akinobu Mita
+ */
+
+
+#include <linux/types.h>
+#include <linux/bitrev.h>
+
+const u8 byte_rev_table[256] = {
+       0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+       0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+       0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+       0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+       0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+       0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+       0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+       0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+       0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+       0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+       0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+       0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+       0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+       0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+       0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+       0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+       0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+       0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+       0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+       0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+       0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+       0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+       0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+       0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+       0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+       0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+       0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+       0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+       0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+       0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+       0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+       0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+u16 bitrev16(u16 x)
+{
+       return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
+}
+
+/**
+ * bitrev32 - reverse the order of bits in a u32 value
+ * @x: value to be bit-reversed
+ */
+u32 bitrev32(u32 x)
+{
+       return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16);
+}
index ac1fe0be20dc2915038b67318f15d88746e354e1..005ad3d535fbdc32211bd93757858bfce26c411d 100644 (file)
@@ -66,6 +66,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(GENERIC_SPI_FLASH, "spi-flash"),
        COMPAT(MAXIM_98095_CODEC, "maxim,max98095-codec"),
        COMPAT(INFINEON_SLB9635_TPM, "infineon,slb9635-tpm"),
+       COMPAT(INFINEON_SLB9645_TPM, "infineon,slb9645-tpm"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
index 09dfae03c247554deb48c29ce98693ffd9c25f9d..3a82efab6194ce394ebc57e225a17062f7e17757 100644 (file)
@@ -617,3 +617,62 @@ void *memchr(const void *s, int c, size_t n)
 }
 
 #endif
+#ifndef __HAVE_ARCH_MEMCHR_INV
+static void *check_bytes8(const u8 *start, u8 value, unsigned int bytes)
+{
+       while (bytes) {
+               if (*start != value)
+                       return (void *)start;
+               start++;
+               bytes--;
+       }
+       return NULL;
+}
+/**
+ * memchr_inv - Find an unmatching character in an area of memory.
+ * @start: The memory area
+ * @c: Find a character other than c
+ * @bytes: The size of the area.
+ *
+ * returns the address of the first character other than @c, or %NULL
+ * if the whole buffer contains just @c.
+ */
+void *memchr_inv(const void *start, int c, size_t bytes)
+{
+       u8 value = c;
+       u64 value64;
+       unsigned int words, prefix;
+
+       if (bytes <= 16)
+               return check_bytes8(start, value, bytes);
+
+       value64 = value;
+       value64 |= value64 << 8;
+       value64 |= value64 << 16;
+       value64 |= value64 << 32;
+
+       prefix = (unsigned long)start % 8;
+       if (prefix) {
+               u8 *r;
+
+               prefix = 8 - prefix;
+               r = check_bytes8(start, value, prefix);
+               if (r)
+                       return r;
+               start += prefix;
+               bytes -= prefix;
+       }
+
+       words = bytes / 8;
+
+       while (words) {
+               if (*(u64 *)start != value64)
+                       return check_bytes8(start, value, 8);
+               start += 8;
+               words--;
+       }
+
+       return check_bytes8(start, value, bytes % 8);
+}
+#endif
+
index b5a8de7835f6da4a5324815fea8831e553f21ecf..d8fe948ff0a77ac3c10083fccd3a6133a6c03c6e 100644 (file)
@@ -88,6 +88,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(C
 LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
 endif
 
+ifneq (,$(CONFIG_MX23)$(filter $(SOC), mx25 mx27 mx5 mx6 mx31 mx35))
+LIBS-y += arch/$(ARCH)/imx-common/libimx-common.o
+endif
+
 ifneq ($(CONFIG_TEGRA),)
 LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
 LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
diff --git a/test/image/test-fit.py b/test/image/test-fit.py
new file mode 100755 (executable)
index 0000000..c4e8211
--- /dev/null
@@ -0,0 +1,422 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2013, Google Inc.
+#
+# Sanity check of the FIT handling in U-Boot
+#
+# 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
+#
+# To run this:
+#
+# make O=sandbox sandbox_config
+# make O=sandbox
+# ./test/image/test-fit.py -u sandbox/u-boot
+
+import doctest
+from optparse import OptionParser
+import os
+import shutil
+import struct
+import sys
+import tempfile
+
+# The 'command' library in patman is convenient for running commands
+base_path = os.path.dirname(sys.argv[0])
+patman = os.path.join(base_path, '../../tools/patman')
+sys.path.append(patman)
+
+import command
+
+# Define a base ITS which we can adjust using % and a dictionary
+base_its = '''
+/dts-v1/;
+
+/ {
+        description = "Chrome OS kernel image with one or more FDT blobs";
+        #address-cells = <1>;
+
+        images {
+                kernel@1 {
+                        data = /incbin/("%(kernel)s");
+                        type = "kernel";
+                        arch = "sandbox";
+                        os = "linux";
+                        compression = "none";
+                        load = <0x40000>;
+                        entry = <0x8>;
+                };
+                fdt@1 {
+                        description = "snow";
+                        data = /incbin/("u-boot.dtb");
+                        type = "flat_dt";
+                        arch = "sandbox";
+                        %(fdt_load)s
+                        compression = "none";
+                        signature@1 {
+                                algo = "sha1,rsa2048";
+                                key-name-hint = "dev";
+                        };
+                };
+                ramdisk@1 {
+                        description = "snow";
+                        data = /incbin/("%(ramdisk)s");
+                        type = "ramdisk";
+                        arch = "sandbox";
+                        os = "linux";
+                        %(ramdisk_load)s
+                        compression = "none";
+                };
+        };
+        configurations {
+                default = "conf@1";
+                conf@1 {
+                        kernel = "kernel@1";
+                        fdt = "fdt@1";
+                        %(ramdisk_config)s
+                };
+        };
+};
+'''
+
+# Define a base FDT - currently we don't use anything in this
+base_fdt = '''
+/dts-v1/;
+
+/ {
+        model = "Sandbox Verified Boot Test";
+        compatible = "sandbox";
+
+};
+'''
+
+# This is the U-Boot script that is run for each test. First load the fit,
+# then do the 'bootm' command, then save out memory from the places where
+# we expect 'bootm' to write things. Then quit.
+base_script = '''
+sb load host 0 %(fit_addr)x %(fit)s
+fdt addr %(fit_addr)x
+bootm start %(fit_addr)x
+bootm loados
+sb save host 0 %(kernel_out)s %(kernel_addr)x %(kernel_size)x
+sb save host 0 %(fdt_out)s %(fdt_addr)x %(fdt_size)x
+sb save host 0 %(ramdisk_out)s %(ramdisk_addr)x %(ramdisk_size)x
+reset
+'''
+
+def make_fname(leaf):
+    """Make a temporary filename
+
+    Args:
+        leaf: Leaf name of file to create (within temporary directory)
+    Return:
+        Temporary filename
+    """
+    global base_dir
+
+    return os.path.join(base_dir, leaf)
+
+def filesize(fname):
+    """Get the size of a file
+
+    Args:
+        fname: Filename to check
+    Return:
+        Size of file in bytes
+    """
+    return os.stat(fname).st_size
+
+def read_file(fname):
+    """Read the contents of a file
+
+    Args:
+        fname: Filename to read
+    Returns:
+        Contents of file as a string
+    """
+    with open(fname, 'r') as fd:
+        return fd.read()
+
+def make_dtb():
+    """Make a sample .dts file and compile it to a .dtb
+
+    Returns:
+        Filename of .dtb file created
+    """
+    src = make_fname('u-boot.dts')
+    dtb = make_fname('u-boot.dtb')
+    with open(src, 'w') as fd:
+        print >>fd, base_fdt
+    command.Output('dtc', src, '-O', 'dtb', '-o', dtb)
+    return dtb
+
+def make_its(params):
+    """Make a sample .its file with parameters embedded
+
+    Args:
+        params: Dictionary containing parameters to embed in the %() strings
+    Returns:
+        Filename of .its file created
+    """
+    its = make_fname('test.its')
+    with open(its, 'w') as fd:
+        print >>fd, base_its % params
+    return its
+
+def make_fit(mkimage, params):
+    """Make a sample .fit file ready for loading
+
+    This creates a .its script with the selected parameters and uses mkimage to
+    turn this into a .fit image.
+
+    Args:
+        mkimage: Filename of 'mkimage' utility
+        params: Dictionary containing parameters to embed in the %() strings
+    Return:
+        Filename of .fit file created
+    """
+    fit = make_fname('test.fit')
+    its = make_its(params)
+    command.Output(mkimage, '-f', its, fit)
+    with open(make_fname('u-boot.dts'), 'w') as fd:
+        print >>fd, base_fdt
+    return fit
+
+def make_kernel():
+    """Make a sample kernel with test data
+
+    Returns:
+        Filename of kernel created
+    """
+    fname = make_fname('test-kernel.bin')
+    data = ''
+    for i in range(100):
+        data += 'this kernel %d is unlikely to boot\n' % i
+    with open(fname, 'w') as fd:
+        print >>fd, data
+    return fname
+
+def make_ramdisk():
+    """Make a sample ramdisk with test data
+
+    Returns:
+        Filename of ramdisk created
+    """
+    fname = make_fname('test-ramdisk.bin')
+    data = ''
+    for i in range(100):
+        data += 'ramdisk %d was seldom used in the middle ages\n' % i
+    with open(fname, 'w') as fd:
+        print >>fd, data
+    return fname
+
+def find_matching(text, match):
+    """Find a match in a line of text, and return the unmatched line portion
+
+    This is used to extract a part of a line from some text. The match string
+    is used to locate the line - we use the first line that contains that
+    match text.
+
+    Once we find a match, we discard the match string itself from the line,
+    and return what remains.
+
+    TODO: If this function becomes more generally useful, we could change it
+    to use regex and return groups.
+
+    Args:
+        text: Text to check (each line separated by \n)
+        match: String to search for
+    Return:
+        String containing unmatched portion of line
+    Exceptions:
+        ValueError: If match is not found
+
+    >>> find_matching('first line:10\\nsecond_line:20', 'first line:')
+    '10'
+    >>> find_matching('first line:10\\nsecond_line:20', 'second linex')
+    Traceback (most recent call last):
+      ...
+    ValueError: Test aborted
+    >>> find_matching('first line:10\\nsecond_line:20', 'second_line:')
+    '20'
+    """
+    for line in text.splitlines():
+        pos = line.find(match)
+        if pos != -1:
+            return line[:pos] + line[pos + len(match):]
+
+    print "Expected '%s' but not found in output:"
+    print text
+    raise ValueError('Test aborted')
+
+def set_test(name):
+    """Set the name of the current test and print a message
+
+    Args:
+        name: Name of test
+    """
+    global test_name
+
+    test_name = name
+    print name
+
+def fail(msg):
+    """Raise an error with a helpful failure message
+
+    Args:
+        msg: Message to display
+    """
+    raise ValueError("Test '%s' failed: %s" % (test_name, msg))
+
+def run_fit_test(mkimage, u_boot):
+    """Basic sanity check of FIT loading in U-Boot
+
+    TODO: Almost everything:
+       - hash algorithms - invalid hash/contents should be detected
+       - signature algorithms - invalid sig/contents should be detected
+       - compression
+       - checking that errors are detected like:
+            - image overwriting
+            - missing images
+            - invalid configurations
+            - incorrect os/arch/type fields
+            - empty data
+            - images too large/small
+            - invalid FDT (e.g. putting a random binary in instead)
+       - default configuration selection
+       - bootm command line parameters should have desired effect
+       - run code coverage to make sure we are testing all the code
+    """
+    global test_name
+
+    # Set up invariant files
+    control_dtb = make_dtb()
+    kernel = make_kernel()
+    ramdisk = make_ramdisk()
+    kernel_out = make_fname('kernel-out.bin')
+    fdt_out = make_fname('fdt-out.dtb')
+    ramdisk_out = make_fname('ramdisk-out.bin')
+
+    # Set up basic parameters with default values
+    params = {
+        'fit_addr' : 0x1000,
+
+        'kernel' : kernel,
+        'kernel_out' : kernel_out,
+        'kernel_addr' : 0x40000,
+        'kernel_size' : filesize(kernel),
+
+        'fdt_out' : fdt_out,
+        'fdt_addr' : 0x80000,
+        'fdt_size' : filesize(control_dtb),
+        'fdt_load' : '',
+
+        'ramdisk' : ramdisk,
+        'ramdisk_out' : ramdisk_out,
+        'ramdisk_addr' : 0xc0000,
+        'ramdisk_size' : filesize(ramdisk),
+        'ramdisk_load' : '',
+        'ramdisk_config' : '',
+    }
+
+    # Make a basic FIT and a script to load it
+    fit = make_fit(mkimage, params)
+    params['fit'] = fit
+    cmd = base_script % params
+
+    # First check that we can load a kernel
+    # We could perhaps reduce duplication with some loss of readability
+    set_test('Kernel load')
+    stdout = command.Output(u_boot, '-d', control_dtb, '-c', cmd)
+    if read_file(kernel) != read_file(kernel_out):
+        fail('Kernel not loaded')
+    if read_file(control_dtb) == read_file(fdt_out):
+        fail('FDT loaded but should be ignored')
+    if read_file(ramdisk) == read_file(ramdisk_out):
+        fail('Ramdisk loaded but should not be')
+
+    # Find out the offset in the FIT where U-Boot has found the FDT
+    line = find_matching(stdout, 'Booting using the fdt blob at ')
+    fit_offset = int(line, 16) - params['fit_addr']
+    fdt_magic = struct.pack('>L', 0xd00dfeed)
+    data = read_file(fit)
+
+    # Now find where it actually is in the FIT (skip the first word)
+    real_fit_offset = data.find(fdt_magic, 4)
+    if fit_offset != real_fit_offset:
+        fail('U-Boot loaded FDT from offset %#x, FDT is actually at %#x' %
+                (fit_offset, real_fit_offset))
+
+    # Now a kernel and an FDT
+    set_test('Kernel + FDT load')
+    params['fdt_load'] = 'load = <%#x>;' % params['fdt_addr']
+    fit = make_fit(mkimage, params)
+    stdout = command.Output(u_boot, '-d', control_dtb, '-c', cmd)
+    if read_file(kernel) != read_file(kernel_out):
+        fail('Kernel not loaded')
+    if read_file(control_dtb) != read_file(fdt_out):
+        fail('FDT not loaded')
+    if read_file(ramdisk) == read_file(ramdisk_out):
+        fail('Ramdisk loaded but should not be')
+
+    # Try a ramdisk
+    set_test('Kernel + FDT + Ramdisk load')
+    params['ramdisk_config'] = 'ramdisk = "ramdisk@1";'
+    params['ramdisk_load'] = 'load = <%#x>;' % params['ramdisk_addr']
+    fit = make_fit(mkimage, params)
+    stdout = command.Output(u_boot, '-d', control_dtb, '-c', cmd)
+    if read_file(ramdisk) != read_file(ramdisk_out):
+        fail('Ramdisk not loaded')
+
+def run_tests():
+    """Parse options, run the FIT tests and print the result"""
+    global base_path, base_dir
+
+    # Work in a temporary directory
+    base_dir = tempfile.mkdtemp()
+    parser = OptionParser()
+    parser.add_option('-u', '--u-boot',
+            default=os.path.join(base_path, 'u-boot'),
+            help='Select U-Boot sandbox binary')
+    parser.add_option('-k', '--keep', action='store_true',
+            help="Don't delete temporary directory even when tests pass")
+    parser.add_option('-t', '--selftest', action='store_true',
+            help='Run internal self tests')
+    (options, args) = parser.parse_args()
+
+    # Find the path to U-Boot, and assume mkimage is in its tools/mkimage dir
+    base_path = os.path.dirname(options.u_boot)
+    mkimage = os.path.join(base_path, 'tools/mkimage')
+
+    # There are a few doctests - handle these here
+    if options.selftest:
+        doctest.testmod()
+        return
+
+    title = 'FIT Tests'
+    print title, '\n', '=' * len(title)
+
+    run_fit_test(mkimage, options.u_boot)
+
+    print '\nTests passed'
+    print 'Caveat: this is only a sanity check - test coverage is poor'
+
+    # Remove the tempoerary directory unless we are asked to keep it
+    if options.keep:
+        print "Output files are in '%s'" % base_dir
+    else:
+        shutil.rmtree(base_dir)
+
+run_tests()
index 26eb50082f7b3998864b65a1a03ce638c8db20f0..4630f03dc53a93792d4c1e1f7f2c1fa60f6f20d2 100644 (file)
@@ -130,28 +130,21 @@ LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_DATA_H)
 LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H)
 LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_DATA_H)
 
+# Generic logo
 ifeq ($(LOGO_BMP),)
 LOGO_BMP= logos/denx.bmp
+
+# Use board logo and fallback to vendor
+ifneq ($(wildcard logos/$(BOARD).bmp),)
+LOGO_BMP= logos/$(BOARD).bmp
+else
+ifneq ($(wildcard logos/$(VENDOR).bmp),)
+LOGO_BMP= logos/$(VENDOR).bmp
 endif
-ifeq ($(VENDOR),atmel)
-LOGO_BMP= logos/atmel.bmp
-endif
-ifeq ($(VENDOR),esd)
-LOGO_BMP= logos/esd.bmp
-endif
-ifeq ($(VENDOR),freescale)
-LOGO_BMP= logos/freescale.bmp
-endif
-ifeq ($(VENDOR),ronetix)
-LOGO_BMP= logos/ronetix.bmp
-endif
-ifeq ($(VENDOR),syteco)
-LOGO_BMP= logos/syteco.bmp
-endif
-ifeq ($(VENDOR),intercontrol)
-LOGO_BMP= logos/intercontrol.bmp
 endif
 
+endif # !LOGO_BMP
+
 # now $(obj) is defined
 HOSTSRCS += $(addprefix $(SRCTREE)/,$(EXT_OBJ_FILES-y:.o=.c))
 HOSTSRCS += $(addprefix $(SRCTREE)/tools/,$(OBJ_FILES-y:.o=.c))
index 9f23901872c9b7aa85d5d993016ba7094b016401..896e2bc985f4a24a00f5d27d1a9bb0dc230258cf 100755 (executable)
@@ -273,6 +273,7 @@ our $logFunctions = qr{(?x:
        WARN(?:_RATELIMIT|_ONCE|)|
        panic|
        debug|
+       printf|
        MODULE_[A-Z_]+
 )};
 
index fa308c94b0e3f31cff28b45e61faef9264353af8..5e8e4701d33a620af019c5c86ae8b52b3ef9eb09 100644 (file)
@@ -37,6 +37,7 @@
  */
 static table_entry_t imximage_cmds[] = {
        {CMD_BOOT_FROM,         "BOOT_FROM",            "boot command",   },
+       {CMD_BOOT_OFFSET,       "BOOT_OFFSET",          "Boot offset",    },
        {CMD_DATA,              "DATA",                 "Reg Write Data", },
        {CMD_IMAGE_VERSION,     "IMAGE_VERSION",        "image version",  },
        {-1,                    "",                     "",               },
@@ -352,6 +353,11 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
                if (unlikely(cmd_ver_first != 1))
                        cmd_ver_first = 0;
                break;
+       case CMD_BOOT_OFFSET:
+               imxhdr->flash_offset = get_cfg_value(token, name, lineno);
+               if (unlikely(cmd_ver_first != 1))
+                       cmd_ver_first = 0;
+               break;
        case CMD_DATA:
                value = get_cfg_value(token, name, lineno);
                (*set_dcd_val)(imxhdr, name, lineno, fld, value, dcd_len);
@@ -518,11 +524,14 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
 
        /*
         * ROM bug alert
-        * mx53 only loads 512 byte multiples.
-        * The remaining fraction of a block bytes would
-        * not be loaded.
+        *
+        * MX53 only loads 512 byte multiples in case of SD boot.
+        * MX53 only loads NAND page multiples in case of NAND boot and
+        * supports up to 4096 byte large pages, thus align to 4096.
+        *
+        * The remaining fraction of a block bytes would not be loaded!
         */
-       *header_size_ptr = ROUND(sbuf->st_size + imxhdr->flash_offset, 512);
+       *header_size_ptr = ROUND(sbuf->st_size + imxhdr->flash_offset, 4096);
 }
 
 int imximage_check_params(struct mkimage_params *params)
index 42b60906fd3adfef0e82caa38f0e77b01bc76af5..5c929e4987e671751853973c72542770172ad6e1 100644 (file)
 
 #define HEADER_OFFSET  0x400
 
+/*
+ * NOTE: This file must be kept in sync with arch/arm/include/asm/\
+ *       imx-common/imximage.cfg because tools/imximage.c can not
+ *       cross-include headers from arch/arm/ and vice-versa.
+ */
 #define CMD_DATA_STR   "DATA"
 #define FLASH_OFFSET_UNDEFINED 0xFFFFFFFF
 #define FLASH_OFFSET_STANDARD  0x400
@@ -52,6 +57,7 @@ enum imximage_cmd {
        CMD_INVALID,
        CMD_IMAGE_VERSION,
        CMD_BOOT_FROM,
+       CMD_BOOT_OFFSET,
        CMD_DATA
 };
 
@@ -151,13 +157,14 @@ typedef struct {
        dcd_v2_t dcd_table;
 } imx_header_v2_t;
 
+/* The header must be aligned to 4k on MX53 for NAND boot */
 struct imx_header {
        union {
                imx_header_v1_t hdr_v1;
                imx_header_v2_t hdr_v2;
        } header;
        uint32_t flash_offset;
-};
+} __attribute__((aligned(4096)));
 
 typedef void (*set_dcd_val_t)(struct imx_header *imxhdr,
                                        char *name, int lineno,
diff --git a/tools/logos/wandboard.bmp b/tools/logos/wandboard.bmp
new file mode 100644 (file)
index 0000000..7f288a8
Binary files /dev/null and b/tools/logos/wandboard.bmp differ
index e07a6157ebca0052d66b7713686e46df8d7ea655..03c6c8f5237d741cbc17793ace87fee2a855c946 100644 (file)
 
 #define ARRAY_SIZE(x)          (sizeof(x) / sizeof((x)[0]))
 
+static inline void *map_sysmem(ulong paddr, unsigned long len)
+{
+       return (void *)(uintptr_t)paddr;
+}
+
+static inline ulong map_to_sysmem(void *ptr)
+{
+       return (ulong)(uintptr_t)ptr;
+}
+
 #define MKIMAGE_TMPFILE_SUFFIX         ".tmp"
 #define MKIMAGE_MAX_TMPFILE_LEN                256
 #define MKIMAGE_DEFAULT_DTC_OPTIONS    "-I dts -O dtb -p 500"
 #define MKIMAGE_MAX_DTC_CMDLINE_LEN    512
 #define MKIMAGE_DTC                    "dtc"   /* assume dtc is in $PATH */
 
+#define IH_ARCH_DEFAULT                IH_ARCH_INVALID
+
 /*
  * This structure defines all such variables those are initialized by
  * mkimage main core and need to be referred by image type specific
index 6c05aa479d4360c0c14cd0f989c250ecf119126d..d92c39fec667448e0963c14dccbd72e8e5b572ce 100644 (file)
@@ -551,7 +551,7 @@ static int mx28_create_sd_image(int infd, int outfd)
 
        fsize = lseek(infd, 0, SEEK_END);
        lseek(infd, 0, SEEK_SET);
-       size = fsize + 512;
+       size = fsize + 4 * 512;
 
        buf = malloc(size);
        if (!buf) {
@@ -559,7 +559,7 @@ static int mx28_create_sd_image(int infd, int outfd)
                goto err0;
        }
 
-       ret = read(infd, (uint8_t *)buf + 512, fsize);
+       ret = read(infd, (uint8_t *)buf + 4 * 512, fsize);
        if (ret != fsize) {
                ret = -1;
                goto err1;
@@ -574,8 +574,8 @@ static int mx28_create_sd_image(int infd, int outfd)
        cb->drv_info[0].chip_num = 0x0;
        cb->drv_info[0].drive_type = 0x0;
        cb->drv_info[0].tag = 0x1;
-       cb->drv_info[0].first_sector_number = sd_sector + 1;
-       cb->drv_info[0].sector_count = (size - 1) / 512;
+       cb->drv_info[0].first_sector_number = sd_sector + 4;
+       cb->drv_info[0].sector_count = (size - 4) / 512;
 
        wr_size = write(outfd, buf, size);
        if (wr_size != size) {